import React, { useEffect, useState } from 'react'; import tw from 'twin.macro'; import Button from '@/components/elements/Button'; import Fade from '@/components/elements/Fade'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faFileArchive, faLevelUpAlt, faTrashAlt } from '@fortawesome/free-solid-svg-icons'; import SpinnerOverlay from '@/components/elements/SpinnerOverlay'; import useFileManagerSwr from '@/plugins/useFileManagerSwr'; import useFlash from '@/plugins/useFlash'; import { compressFiles, deleteFiles } from '@/api/server/files'; import { ServerContext } from '@/state/server'; import ConfirmationModal from '@/components/elements/ConfirmationModal'; import RenameFileModal from '@/components/server/files/RenameFileModal'; const MassActionsBar = () => { const uuid = ServerContext.useStoreState(state => state.server.data!.uuid); const { mutate } = useFileManagerSwr(); const { clearFlashes, clearAndAddHttpError } = useFlash(); const [ loading, setLoading ] = useState(false); const [ loadingMessage, setLoadingMessage ] = useState(''); const [ showConfirm, setShowConfirm ] = useState(false); const [ showMove, setShowMove ] = useState(false); const directory = ServerContext.useStoreState(state => state.files.directory); const selectedFiles = ServerContext.useStoreState(state => state.files.selectedFiles); const setSelectedFiles = ServerContext.useStoreActions(actions => actions.files.setSelectedFiles); useEffect(() => { if (!loading) setLoadingMessage(''); }, [ loading ]); const onClickCompress = () => { setLoading(true); clearFlashes('files'); setLoadingMessage('Archiving files...'); compressFiles(uuid, directory, selectedFiles) .then(() => mutate()) .then(() => setSelectedFiles([])) .catch(error => clearAndAddHttpError({ key: 'files', error })) .then(() => setLoading(false)); }; const onClickConfirmDeletion = () => { setLoading(true); setShowConfirm(false); clearFlashes('files'); setLoadingMessage('Deleting files...'); deleteFiles(uuid, directory, selectedFiles) .then(async () => { await mutate(files => files!.filter(f => selectedFiles.indexOf(f.name) < 0), false); setSelectedFiles([]); }) .catch(async (error) => { await mutate(); clearAndAddHttpError({ key: 'files', error }); }) .then(() => setLoading(false)); }; return ( 0} unmountOnExit>
{loadingMessage} setShowConfirm(false)} > Are you sure you want to delete {selectedFiles.length} file(s)?
Deleting the file(s) listed below is a permanent operation, you cannot undo this action.
{selectedFiles.slice(0, 15).map(file => (
  • {file}
  • )) } {selectedFiles.length > 15 &&
  • + {selectedFiles.length - 15} other(s)
  • }
    {showMove && setShowMove(false)} /> }
    ); }; export default MassActionsBar;