diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/BinFileBrowser.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/BinFileBrowser.tsx index b79496bc54..11c478e86b 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/BinFileBrowser.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/BinFileBrowser.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useMemo, useState } from "react" import { BucketType, FileSystemItem, useDrive } from "../../../Contexts/DriveContext" -import { IFilesBrowserModuleProps } from "./types" +import { IBulkOperations, IFilesBrowserModuleProps } from "./types" import FilesTableView from "./views/FilesTable.view" import DragAndDrop from "../../../Contexts/DnDContext" import { t } from "@lingui/macro" @@ -118,7 +118,7 @@ const BinFileBrowser: React.FC = ({ controls = false } }, [deleteFile, refreshContents]) - const recoverFile = async (cid: string) => { + const recoverFile = useCallback(async (cid: string) => { const itemToRestore = pathContents.find((i) => i.cid === cid) if (!itemToRestore) throw new Error("Not found") try { @@ -153,7 +153,19 @@ const BinFileBrowser: React.FC = ({ controls = false } }) return Promise.reject() } - } + }, [addToastMessage, moveCSFObject, pathContents, refreshContents]) + + const recoverFiles = useCallback(async (cids: string[]) => { + return Promise.all( + cids.map((cid: string) => + recoverFile(cid) + )) + }, [recoverFile]) + + const bulkOperations: IBulkOperations = useMemo(() => ({ + [CONTENT_TYPES.Directory]: [], + [CONTENT_TYPES.File]: ["recover", "delete"] + }), []) const itemOperations: IFilesTableBrowserProps["itemOperations"] = useMemo(() => ({ [CONTENT_TYPES.File]: ["recover", "delete"], @@ -166,6 +178,7 @@ const BinFileBrowser: React.FC = ({ controls = false } crumbs={undefined} recoverFile={recoverFile} deleteFiles={deleteFiles} + recoverFiles={recoverFiles} currentPath={currentPath} moduleRootPath={ROUTE_LINKS.Bin("/")} refreshContents={refreshContents} @@ -176,6 +189,7 @@ const BinFileBrowser: React.FC = ({ controls = false } controls={controls} bucketType={bucketType} itemOperations={itemOperations} + bulkOperations={bulkOperations} /> ) diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/types.ts b/packages/files-ui/src/Components/Modules/FileBrowsers/types.ts index 06d4f9cadc..1bbe867a16 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/types.ts +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/types.ts @@ -34,6 +34,7 @@ export interface IFilesTableBrowserProps downloadFile?: (cid: string) => Promise deleteFiles?: (cid: string[]) => Promise recoverFile?: (cid: string) => Promise + recoverFiles?: (cid: string[]) => Promise viewFolder?: (cid: string) => void allowDropUpload?: boolean diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesTable.view.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesTable.view.tsx index 056d2a33e1..2a8e1dcfac 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesTable.view.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesTable.view.tsx @@ -286,6 +286,7 @@ const FilesTableView = ({ downloadFile, deleteFiles, recoverFile, + recoverFiles, viewFolder, currentPath, refreshContents, @@ -444,6 +445,7 @@ const FilesTableView = ({ const [isMoveFileModalOpen, setIsMoveFileModalOpen] = useState(false) const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false) const [isDeletingFiles, setIsDeletingFiles] = useState(false) + const [isRecoveringFiles, setIsRecoveringFiles] = useState(false) const [fileInfoPath, setFileInfoPath] = useState( undefined ) @@ -461,7 +463,8 @@ const FilesTableView = ({ "move", "preview", "rename", - "share" + "share", + "recover" ] for (let i = 0; i < selectedCids.length; i++) { const contentType = items.find((item) => item.cid === selectedCids[i]) @@ -520,6 +523,18 @@ const FilesTableView = ({ }) }, [deleteFiles, selectedCids]) + const handleRecoverFiles = useCallback(() => { + if (!recoverFiles) return + + setIsRecoveringFiles(true) + recoverFiles(selectedCids) + .catch(console.error) + .finally(() => { + setIsRecoveringFiles(false) + setSelectedCids([]) + }) + }, [recoverFiles, selectedCids]) + const getItemOperations = useCallback( (contentType: string) => { const result = Object.keys(itemOperations).reduce( @@ -695,6 +710,15 @@ const FilesTableView = ({ Move selected )} + {validBulkOps.indexOf("recover") >= 0 && ( + + )} {validBulkOps.indexOf("delete") >= 0 && (