diff --git a/resources/scripts/api/server/files/deleteFile.ts b/resources/scripts/api/server/files/deleteFile.ts new file mode 100644 index 000000000..cb8a59e02 --- /dev/null +++ b/resources/scripts/api/server/files/deleteFile.ts @@ -0,0 +1,9 @@ +import http from '@/api/http'; + +export default (uuid: string, location: string): Promise => { + return new Promise((resolve, reject) => { + http.post(`/api/client/servers/${uuid}/files/delete`, { location }) + .then(() => resolve()) + .catch(reject); + }); +}; diff --git a/resources/scripts/components/server/files/CopyFileModal.tsx b/resources/scripts/components/server/files/CopyFileModal.tsx deleted file mode 100644 index 3f721e904..000000000 --- a/resources/scripts/components/server/files/CopyFileModal.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React, { useEffect } from 'react'; -import { FileObject } from '@/api/server/files/loadDirectory'; -import SpinnerOverlay from '@/components/elements/SpinnerOverlay'; -import { ServerContext } from '@/state/server'; -import copyFile from '@/api/server/files/copyFile'; -import { join } from 'path'; -import { httpErrorToHuman } from '@/api/http'; - -// This component copies the given file on mount, so only mount it when -// you actually want to copy the file... -export default ({ file, onCopyComplete }: { file: FileObject; onCopyComplete: () => void }) => { - const uuid = ServerContext.useStoreState(state => state.server.data!.uuid); - const directory = ServerContext.useStoreState(state => state.files.directory); - const getDirectoryContents = ServerContext.useStoreActions(actions => actions.files.getDirectoryContents); - - useEffect(() => { - copyFile(uuid, join(directory, file.name)) - .then(() => getDirectoryContents(directory)) - .catch(error => { - console.error('Error while attempting to copy file.', error); - alert(httpErrorToHuman(error)); - }); - }, []); - - return ( - - ); -}; diff --git a/resources/scripts/components/server/files/FileDropdownMenu.tsx b/resources/scripts/components/server/files/FileDropdownMenu.tsx index dde1daff8..a39751625 100644 --- a/resources/scripts/components/server/files/FileDropdownMenu.tsx +++ b/resources/scripts/components/server/files/FileDropdownMenu.tsx @@ -10,16 +10,25 @@ import { faLevelUpAlt } from '@fortawesome/free-solid-svg-icons/faLevelUpAlt'; import RenameFileModal from '@/components/server/files/RenameFileModal'; import { ServerContext } from '@/state/server'; import CopyFileModal from '@/components/server/files/CopyFileModal'; +import { join } from 'path'; +import deleteFile from '@/api/server/files/deleteFile'; +import SpinnerOverlay from '@/components/elements/SpinnerOverlay'; +import copyFile from '@/api/server/files/copyFile'; +import { httpErrorToHuman } from '@/api/http'; -type ModalType = 'rename' | 'move' | 'copy' | 'download' | 'delete'; +type ModalType = 'rename' | 'move'; export default ({ uuid }: { uuid: string }) => { const menu = createRef(); const [ visible, setVisible ] = useState(false); + const [ showSpinner, setShowSpinner ] = useState(false); const [ modal, setModal ] = useState(null); const [ posX, setPosX ] = useState(0); + const server = ServerContext.useStoreState(state => state.server.data!); const file = ServerContext.useStoreState(state => state.files.contents.find(file => file.uuid === uuid)); + const directory = ServerContext.useStoreState(state => state.files.directory); + const { removeFile, getDirectoryContents } = ServerContext.useStoreActions(actions => actions.files); if (!file) { return null; } @@ -38,6 +47,27 @@ export default ({ uuid }: { uuid: string }) => { } }; + const doDeletion = () => { + setShowSpinner(true); + deleteFile(server.uuid, join(directory, file.name)) + .then(() => removeFile(uuid)) + .catch(error => { + console.error('Error while attempting to delete a file.', error); + setShowSpinner(false); + }); + }; + + const doCopy = () => { + setShowSpinner(true); + copyFile(server.uuid, join(directory, file.name)) + .then(() => getDirectoryContents(directory)) + .catch(error => { + console.error('Error while attempting to copy file.', error); + alert(httpErrorToHuman(error)); + setShowSpinner(false); + }); + }; + useEffect(() => { visible ? document.addEventListener('click', windowListener) @@ -69,13 +99,13 @@ export default ({ uuid }: { uuid: string }) => { }} > + {visible && + + setModal(null)}/> + + + } - {visible && - - setModal(null)}/> - {modal === 'copy' && setModal(null)}/>} - - }
{ Move
setModal('copy')} + onClick={() => doCopy()} className={'hover:text-neutral-700 p-2 flex items-center hover:bg-neutral-100 rounded'} > @@ -103,7 +133,10 @@ export default ({ uuid }: { uuid: string }) => { Download
-
+
doDeletion()} + className={'hover:text-red-700 p-2 flex items-center hover:bg-red-100 rounded'} + > Delete