diff --git a/web/apps/photos/src/pages/gallery.tsx b/web/apps/photos/src/pages/gallery.tsx index 18ed122d7c..f7b1e1035b 100644 --- a/web/apps/photos/src/pages/gallery.tsx +++ b/web/apps/photos/src/pages/gallery.tsx @@ -294,13 +294,6 @@ export default function Gallery() { setFilesDownloadProgressAttributesList, ] = useState([]); - // tempDeletedFileIds and tempHiddenFileIds are used to keep track of files - // that are deleted/hidden in the current session but not yet synced with - // the server. - const [tempDeletedFileIds, setTempDeletedFileIds] = useState( - new Set(), - ); - const [openCollectionSelector, setOpenCollectionSelector] = useState(false); const [collectionSelectorAttributes, setCollectionSelectorAttributes] = useState(); @@ -323,6 +316,7 @@ export default function Gallery() { const fileToCollectionsMap = state.fileCollectionIDs; const collectionSummaries = state.collectionSummaries; const hiddenCollectionSummaries = state.hiddenCollectionSummaries; + const tempDeletedFileIDs = state.tempDeletedFileIDs; const tempHiddenFileIDs = state.tempHiddenFileIDs; const barMode = state.barMode ?? "albums"; const activeCollectionID = state.activeCollectionID; @@ -517,7 +511,7 @@ export default function Gallery() { } else if (barMode == "people") { let filteredPeople = peopleState?.people ?? []; let filteredVisiblePeople = peopleState?.visiblePeople ?? []; - if (tempDeletedFileIds?.size ?? tempHiddenFileIDs?.size) { + if (tempDeletedFileIDs?.size ?? tempHiddenFileIDs?.size) { // Prune the in-memory temp updates from the actual state to // obtain the UI state. Kept inside an preflight check to so // that the common path remains fast. @@ -527,7 +521,7 @@ export default function Gallery() { ...p, fileIDs: p.fileIDs.filter( (id) => - !tempDeletedFileIds?.has(id) && + !tempDeletedFileIDs?.has(id) && !tempHiddenFileIDs?.has(id), ), })) @@ -565,13 +559,13 @@ export default function Gallery() { } else if (activeCollectionID === TRASH_SECTION) { filteredFiles = uniqueFilesByID([ ...trashedFiles, - ...files.filter((file) => tempDeletedFileIds?.has(file.id)), + ...files.filter((file) => tempDeletedFileIDs?.has(file.id)), ]); } else { const baseFiles = barMode == "hidden-albums" ? hiddenFiles : files; filteredFiles = uniqueFilesByID( baseFiles.filter((item) => { - if (tempDeletedFileIds?.has(item.id)) { + if (tempDeletedFileIDs?.has(item.id)) { return false; } @@ -646,7 +640,7 @@ export default function Gallery() { files, trashedFiles, hiddenFiles, - tempDeletedFileIds, + tempDeletedFileIDs, tempHiddenFileIDs, hiddenFileIDs, selectedSearchOption, @@ -804,7 +798,7 @@ export default function Gallery() { log.error("syncWithRemote failed", e); } } finally { - setTempDeletedFileIds(new Set()); + dispatch({ type: "clearTempDeleted" }); dispatch({ type: "clearTempHidden" }); !silent && finishLoading(); } @@ -919,9 +913,9 @@ export default function Gallery() { await handleFileOps( ops, toProcessFiles, - setTempDeletedFileIds, - (files: EnteFile[]) => - dispatch({ type: "markTempHidden", files }), + (files) => dispatch({ type: "markTempDeleted", files }), + () => dispatch({ type: "clearTempDeleted" }), + (files) => dispatch({ type: "markTempHidden", files }), () => dispatch({ type: "clearTempHidden" }), setFixCreationTimeAttributes, setFilesDownloadProgressAttributesCreator, diff --git a/web/apps/photos/src/utils/file/index.ts b/web/apps/photos/src/utils/file/index.ts index 85280dce1e..c9f2280c7c 100644 --- a/web/apps/photos/src/utils/file/index.ts +++ b/web/apps/photos/src/utils/file/index.ts @@ -539,9 +539,8 @@ export const shouldShowAvatar = (file: EnteFile, user: User) => { export const handleFileOps = async ( ops: FILE_OPS_TYPE, files: EnteFile[], - setTempDeletedFileIds: ( - tempDeletedFileIds: Set | ((prev: Set) => Set), - ) => void, + markTempDeleted: (tempDeletedFiles: EnteFile[]) => void, + clearTempDeleted: () => void, markTempHidden: (tempHiddenFiles: EnteFile[]) => void, clearTempHidden: () => void, setFixCreationTimeAttributes: ( @@ -555,10 +554,22 @@ export const handleFileOps = async ( ) => { switch (ops) { case FILE_OPS_TYPE.TRASH: - await deleteFileHelper(files, false, setTempDeletedFileIds); + try { + markTempDeleted(files); + await trashFiles(files); + } catch (e) { + clearTempDeleted(); + throw e; + } break; case FILE_OPS_TYPE.DELETE_PERMANENTLY: - await deleteFileHelper(files, true, setTempDeletedFileIds); + try { + markTempDeleted(files); + await deleteFromTrash(files.map((file) => file.id)); + } catch (e) { + clearTempDeleted(); + throw e; + } break; case FILE_OPS_TYPE.HIDE: try { @@ -595,29 +606,6 @@ export const handleFileOps = async ( } }; -const deleteFileHelper = async ( - selectedFiles: EnteFile[], - permanent: boolean, - setTempDeletedFileIds: ( - tempDeletedFileIds: Set | ((prev: Set) => Set), - ) => void, -) => { - try { - setTempDeletedFileIds((deletedFileIds) => { - selectedFiles.forEach((file) => deletedFileIds.add(file.id)); - return new Set(deletedFileIds); - }); - if (permanent) { - await deleteFromTrash(selectedFiles.map((file) => file.id)); - } else { - await trashFiles(selectedFiles); - } - } catch (e) { - setTempDeletedFileIds(new Set()); - throw e; - } -}; - const fixTimeHelper = async ( selectedFiles: EnteFile[], setFixCreationTimeAttributes: (fixCreationTimeAttributes: {