update handling of deleted or restored trash items

This commit is contained in:
Abhinav 2022-12-23 16:52:49 +05:30
parent c2063b64e4
commit 19c36861ae

View file

@ -14,7 +14,7 @@ import { getCollection } from './collectionService';
import { EnteFile } from 'types/file'; import { EnteFile } from 'types/file';
import HTTPService from './HTTPService'; import HTTPService from './HTTPService';
import { EncryptedTrashItem, Trash, TrashItem } from 'types/trash'; import { EncryptedTrashItem, Trash } from 'types/trash';
const TRASH = 'file-trash'; const TRASH = 'file-trash';
const TRASH_TIME = 'trash-time'; const TRASH_TIME = 'trash-time';
@ -99,6 +99,7 @@ export const updateTrash = async (
'X-Auth-Token': token, 'X-Auth-Token': token,
} }
); );
// #Perf: This can be optimized by running the decryption in parallel
for (const trashItem of resp.data.diff as EncryptedTrashItem[]) { for (const trashItem of resp.data.diff as EncryptedTrashItem[]) {
const collectionID = trashItem.file.collectionID; const collectionID = trashItem.file.collectionID;
let collection = collections.get(collectionID); let collection = collections.get(collectionID);
@ -109,21 +110,22 @@ export const updateTrash = async (
...collections.values(), ...collections.values(),
]); ]);
} }
let decryptedFile: EnteFile;
if (!trashItem.isDeleted && !trashItem.isRestored) { if (!trashItem.isDeleted && !trashItem.isRestored) {
decryptedFile = await decryptFile( const decryptedFile = await decryptFile(
trashItem.file, trashItem.file,
collection.key collection.key
); );
}
updatedTrash.push({ ...trashItem, file: decryptedFile }); updatedTrash.push({ ...trashItem, file: decryptedFile });
} else {
updatedTrash = updatedTrash.filter(
(item) => item.file.id !== trashItem.file.id
);
}
} }
if (resp.data.diff.length) { if (resp.data.diff.length) {
time = resp.data.diff.slice(-1)[0].updatedAt; time = resp.data.diff.slice(-1)[0].updatedAt;
} }
updatedTrash = removeDuplicates(updatedTrash);
updatedTrash = removeRestoredOrDeletedTrashItems(updatedTrash);
setFiles( setFiles(
preservePhotoswipeProps( preservePhotoswipeProps(
@ -146,28 +148,6 @@ export const updateTrash = async (
return currentTrash; return currentTrash;
}; };
function removeDuplicates(trash: Trash) {
const latestVersionTrashItems = new Map<number, TrashItem>();
trash.forEach(({ file, updatedAt, ...rest }) => {
if (
!latestVersionTrashItems.has(file.id) ||
latestVersionTrashItems.get(file.id).updatedAt < updatedAt
) {
latestVersionTrashItems.set(file.id, { file, updatedAt, ...rest });
}
});
trash = [];
// eslint-disable-next-line @typescript-eslint/no-unused-vars
for (const [_, trashedFile] of latestVersionTrashItems) {
trash.push(trashedFile);
}
return trash;
}
function removeRestoredOrDeletedTrashItems(trash: Trash) {
return trash.filter((item) => !item.isDeleted && !item.isRestored);
}
export function getTrashedFiles(trash: Trash) { export function getTrashedFiles(trash: Trash) {
return mergeMetadata( return mergeMetadata(
trash.map((trashedFile) => ({ trash.map((trashedFile) => ({