diff --git a/web/apps/photos/src/services/collectionService.ts b/web/apps/photos/src/services/collectionService.ts index f89eabc9b9..9fc069b901 100644 --- a/web/apps/photos/src/services/collectionService.ts +++ b/web/apps/photos/src/services/collectionService.ts @@ -29,7 +29,7 @@ import { CollectionSummaryOrder, CollectionsSortBy, } from "@/new/photos/services/collection/ui"; -import { groupFilesBasedOnCollectionID } from "@/new/photos/services/file"; +import { groupFilesByCollectionID } from "@/new/photos/services/file"; import { getLocalFiles, sortFiles } from "@/new/photos/services/files"; import { updateMagicMetadata } from "@/new/photos/services/magic-metadata"; import type { FamilyData } from "@/new/photos/services/user"; @@ -586,7 +586,7 @@ export const removeUserFiles = async ( const toRemoveFilesCopiesInOtherCollections = allFiles.filter((f) => { return toRemoveFilesIds.has(f.id); }); - const groupiedFiles = groupFilesBasedOnCollectionID( + const groupedFiles = groupFilesByCollectionID( toRemoveFilesCopiesInOtherCollections, ); @@ -594,7 +594,7 @@ export const removeUserFiles = async ( const collectionsMap = new Map(collections.map((c) => [c.id, c])); const user: User = getData(LS_KEYS.USER); - for (const [targetCollectionID, files] of groupiedFiles.entries()) { + for (const [targetCollectionID, files] of groupedFiles.entries()) { const targetCollection = collectionsMap.get(targetCollectionID); if ( !isValidMoveTarget(sourceCollectionID, targetCollection, user) @@ -1070,8 +1070,8 @@ export async function moveToHiddenCollection(files: EnteFile[]) { if (!hiddenCollection) { hiddenCollection = await createHiddenCollection(); } - const groupiedFiles = groupFilesBasedOnCollectionID(files); - for (const [collectionID, files] of groupiedFiles.entries()) { + const groupedFiles = groupFilesByCollectionID(files); + for (const [collectionID, files] of groupedFiles.entries()) { if (collectionID === hiddenCollection.id) { continue; } @@ -1088,8 +1088,8 @@ export async function unhideToCollection( files: EnteFile[], ) { try { - const groupiedFiles = groupFilesBasedOnCollectionID(files); - for (const [collectionID, files] of groupiedFiles.entries()) { + const groupedFiles = groupFilesByCollectionID(files); + for (const [collectionID, files] of groupedFiles.entries()) { if (collectionID === collection.id) { continue; } diff --git a/web/apps/photos/src/services/watch.ts b/web/apps/photos/src/services/watch.ts index 9f727f9b90..2baa0a8f05 100644 --- a/web/apps/photos/src/services/watch.ts +++ b/web/apps/photos/src/services/watch.ts @@ -13,7 +13,7 @@ import type { } from "@/base/types/ipc"; import type { Collection } from "@/media/collection"; import { EncryptedEnteFile } from "@/media/file"; -import { groupFilesBasedOnCollectionID } from "@/new/photos/services/file"; +import { groupFilesByCollectionID } from "@/new/photos/services/file"; import { getLocalFiles } from "@/new/photos/services/files"; import { UPLOAD_RESULT } from "@/new/photos/services/upload/types"; import { ensureString } from "@/utils/ensure"; @@ -496,7 +496,7 @@ class FolderWatcher { return false; }); - const filesByCollectionID = groupFilesBasedOnCollectionID(filesToTrash); + const filesByCollectionID = groupFilesByCollectionID(filesToTrash); for (const [id, files] of filesByCollectionID.entries()) { await removeFromCollection(id, files); } diff --git a/web/apps/photos/tests/upload.test.ts b/web/apps/photos/tests/upload.test.ts index a80a3fdae7..139756112f 100644 --- a/web/apps/photos/tests/upload.test.ts +++ b/web/apps/photos/tests/upload.test.ts @@ -1,5 +1,5 @@ import { FileType } from "@/media/file-type"; -import { groupFilesBasedOnCollectionID } from "@/new/photos/services/file"; +import { groupFilesByCollectionID } from "@/new/photos/services/file"; import { getLocalFiles } from "@/new/photos/services/files"; import { getLocalCollections } from "services/collectionService"; import { parseDateFromDigitGroups } from "services/upload/date"; @@ -153,7 +153,7 @@ async function totalCollectionCountCheck(expectedState) { async function collectionWiseFileCount(expectedState) { const files = await getLocalFiles(); const collections = await getLocalCollections(); - const collectionToFilesMap = groupFilesBasedOnCollectionID(files); + const collectionToFilesMap = groupFilesByCollectionID(files); const collectionIDToNameMap = new Map( collections.map((collection) => [collection.id, collection.name]), ); diff --git a/web/packages/new/photos/components/gallery/reducer.ts b/web/packages/new/photos/components/gallery/reducer.ts index 2832845253..c6507a3750 100644 --- a/web/packages/new/photos/components/gallery/reducer.ts +++ b/web/packages/new/photos/components/gallery/reducer.ts @@ -28,7 +28,7 @@ import type { } from "../../services/collection/ui"; import { getLatestVersionFiles, - groupFilesBasedOnCollectionID, + groupFilesByCollectionID, } from "../../services/file"; import { sortFiles } from "../../services/files"; import { @@ -108,8 +108,8 @@ export interface GalleryState { /*--< Derived UI state >--*/ /** - * A map of massaged collections suitable for being directly consumed by the - * UI (indexed by the collection IDs). + * A map of collections massage to a form suitable for being directly + * consumed by the UI, indexed by the collection IDs. */ collectionSummaries: Map; /** @@ -520,8 +520,8 @@ const createCollectionSummaries = ( user: User, collections: Collection[], files: EnteFile[], -): CollectionSummaries => { - const collectionSummaries: CollectionSummaries = new Map(); +) => { + const collectionSummaries = new Map(); const collectionLatestFiles = getCollectionLatestFiles(files); const collectionCoverFiles = getCollectionCoverFiles(files, collections); const collectionFilesCount = getCollectionsFileCount(files); @@ -607,8 +607,9 @@ const createCollectionSummaries = ( return collectionSummaries; }; -export type CollectionToFileMap = Map; +type CollectionToFileMap = Map; +// TODO: This seems to rely on some sort order. Document. const getCollectionLatestFiles = (files: EnteFile[]): CollectionToFileMap => { const latestFiles = new Map(); @@ -624,7 +625,7 @@ const getCollectionCoverFiles = ( files: EnteFile[], collections: Collection[], ): CollectionToFileMap => { - const collectionIDToFileMap = groupFilesBasedOnCollectionID(files); + const collectionIDToFileMap = groupFilesByCollectionID(files); const coverFiles = new Map(); @@ -820,7 +821,7 @@ function getAllSectionSummary( } function getCollectionsFileCount(files: EnteFile[]): Map { - const collectionIDToFileMap = groupFilesBasedOnCollectionID(files); + const collectionIDToFileMap = groupFilesByCollectionID(files); const collectionFilesCount = new Map(); for (const [id, files] of collectionIDToFileMap) { collectionFilesCount.set(id, files.length); diff --git a/web/packages/new/photos/services/file.ts b/web/packages/new/photos/services/file.ts index 7eefd61d59..e522bb3d34 100644 --- a/web/packages/new/photos/services/file.ts +++ b/web/packages/new/photos/services/file.ts @@ -1,19 +1,18 @@ import type { EnteFile } from "@/media/file"; -/** Segment the given {@link files} into lists indexed by their collection ID */ -export const groupFilesBasedOnCollectionID = (files: EnteFile[]) => { - const result = new Map(); - for (const file of files) { +/** + * Segment the given {@link files} into lists indexed by their collection ID. + * + * Order is preserved. + */ +export const groupFilesByCollectionID = (files: EnteFile[]) => + files.reduce((result, file) => { const id = file.collectionID; - if (!result.has(id)) result.set(id, []); - // See: [Note: strict mode migration] - // - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - result.get(id).push(file); - } - return result; -}; + let cfs = result.get(id); + if (!cfs) result.set(id, (cfs = [])); + cfs.push(file); + return result; + }, new Map()); export function getLatestVersionFiles(files: EnteFile[]) { const latestVersionFiles = new Map();