diff --git a/apps/photos/src/components/Collections/AllCollections/collectionCard.tsx b/apps/photos/src/components/Collections/AllCollections/collectionCard.tsx index 8064f7fbe..68ecf589b 100644 --- a/apps/photos/src/components/Collections/AllCollections/collectionCard.tsx +++ b/apps/photos/src/components/Collections/AllCollections/collectionCard.tsx @@ -19,7 +19,7 @@ export default function AllCollectionCard({ return ( onCollectionClick(collectionSummary.id)} isScrolling={isScrolling}> diff --git a/apps/photos/src/components/Collections/CollectionCard.tsx b/apps/photos/src/components/Collections/CollectionCard.tsx index e68e89637..1e7e25b6e 100644 --- a/apps/photos/src/components/Collections/CollectionCard.tsx +++ b/apps/photos/src/components/Collections/CollectionCard.tsx @@ -8,13 +8,13 @@ import { LoadingThumbnail } from 'components/PlaceholderThumbnails'; export default function CollectionCard(props: { children?: any; - latestFile: EnteFile; + coverFile: EnteFile; onClick: () => void; collectionTile: any; isScrolling?: boolean; }) { const { - latestFile: file, + coverFile: file, onClick, children, collectionTile: CustomCollectionTile, diff --git a/apps/photos/src/components/Collections/CollectionListBar/CollectionCard.tsx b/apps/photos/src/components/Collections/CollectionListBar/CollectionCard.tsx index 1c15f2593..679b2014e 100644 --- a/apps/photos/src/components/Collections/CollectionListBar/CollectionCard.tsx +++ b/apps/photos/src/components/Collections/CollectionListBar/CollectionCard.tsx @@ -30,7 +30,7 @@ const CollectionListBarCard = (props: Iprops) => { { onCollectionClick(collectionSummary.id); }}> diff --git a/apps/photos/src/components/Collections/CollectionListBar/index.tsx b/apps/photos/src/components/Collections/CollectionListBar/index.tsx index ed2e4f245..028ce5925 100644 --- a/apps/photos/src/components/Collections/CollectionListBar/index.tsx +++ b/apps/photos/src/components/Collections/CollectionListBar/index.tsx @@ -76,7 +76,7 @@ const CollectionCardContainer = React.memo( ); const getItemKey = (index: number, data: ItemData) => { - return `${data.collectionSummaries[index].id}-${data.collectionSummaries[index].latestFile?.id}`; + return `${data.collectionSummaries[index].id}-${data.collectionSummaries[index].coverFile?.id}`; }; const CollectionListBar = (props: IProps) => { diff --git a/apps/photos/src/components/Collections/CollectionSelector/AddCollectionButton.tsx b/apps/photos/src/components/Collections/CollectionSelector/AddCollectionButton.tsx index c449550f4..d1b0c3b5f 100644 --- a/apps/photos/src/components/Collections/CollectionSelector/AddCollectionButton.tsx +++ b/apps/photos/src/components/Collections/CollectionSelector/AddCollectionButton.tsx @@ -22,7 +22,7 @@ export default function AddCollectionButton({ showNextModal }: Iprops) { showNextModal()} - latestFile={null}> + coverFile={null}> {t('CREATE_COLLECTION')} diff --git a/apps/photos/src/components/Collections/CollectionSelector/CollectionCard.tsx b/apps/photos/src/components/Collections/CollectionSelector/CollectionCard.tsx index 31b301e50..dbb29b3de 100644 --- a/apps/photos/src/components/Collections/CollectionSelector/CollectionCard.tsx +++ b/apps/photos/src/components/Collections/CollectionSelector/CollectionCard.tsx @@ -16,7 +16,7 @@ export default function CollectionSelectorCard({ return ( onCollectionClick(collectionSummary.id)}> {collectionSummary.name} diff --git a/apps/photos/src/components/Search/SearchBar/searchInput/optionWithInfo.tsx b/apps/photos/src/components/Search/SearchBar/searchInput/optionWithInfo.tsx index 600027887..79d365363 100644 --- a/apps/photos/src/components/Search/SearchBar/searchInput/optionWithInfo.tsx +++ b/apps/photos/src/components/Search/SearchBar/searchInput/optionWithInfo.tsx @@ -40,7 +40,7 @@ const LabelWithInfo = ({ data }: { data: SearchOption }) => { {data.previewFiles.map((file) => ( null} collectionTile={ResultPreviewTile} /> diff --git a/apps/photos/src/services/collectionService.ts b/apps/photos/src/services/collectionService.ts index e622d5ea4..d0ad7cb13 100644 --- a/apps/photos/src/services/collectionService.ts +++ b/apps/photos/src/services/collectionService.ts @@ -15,7 +15,7 @@ import { } from 'utils/file'; import { Collection, - CollectionLatestFiles, + CollectionToFileMap, AddToCollectionRequest, MoveToCollectionRequest, EncryptedFileKey, @@ -297,10 +297,9 @@ export const getCollection = async ( }; export const getCollectionLatestFiles = ( - user: User, files: EnteFile[], archivedCollections: Set -): CollectionLatestFiles => { +): CollectionToFileMap => { const latestFiles = new Map(); files.forEach((file) => { @@ -310,7 +309,6 @@ export const getCollectionLatestFiles = ( if ( !latestFiles.has(ALL_SECTION) && !isArchivedFile(file) && - file.ownerID === user.id && !archivedCollections.has(file.collectionID) ) { latestFiles.set(ALL_SECTION, file); @@ -319,6 +317,54 @@ export const getCollectionLatestFiles = ( return latestFiles; }; +export const getCollectionCoverFiles = ( + files: EnteFile[], + archivedCollections: Set, + collections: Collection[] +): CollectionToFileMap => { + const collectionIDToFileMap = groupFilesBasedOnCollectionID(files); + + const coverFiles = new Map(); + + collections.forEach((collection) => { + const collectionFiles = collectionIDToFileMap.get(collection.id); + if (!collectionFiles || collectionFiles.length === 0) { + return; + } + if (typeof collection.pubMagicMetadata?.data?.coverID !== 'undefined') { + const coverFile = collectionFiles.find( + (file) => file.id === collection.pubMagicMetadata?.data?.coverID + ); + if (coverFile) { + coverFiles.set(collection.id, coverFile); + return; + } + } + if (collection.pubMagicMetadata?.data?.asc) { + coverFiles.set( + collection.id, + collectionFiles[collectionFiles.length - 1] + ); + } else { + coverFiles.set(collection.id, collectionFiles[0]); + } + }); + + for (const file of files) { + if (coverFiles.has(ALL_SECTION)) { + break; + } + if ( + !isArchivedFile(file) && + !archivedCollections.has(file.collectionID) + ) { + coverFiles.set(ALL_SECTION, file); + } + } + + return coverFiles; +}; + export const getFavItemIds = async ( files: EnteFile[] ): Promise> => { @@ -1068,10 +1114,14 @@ export async function getCollectionSummaries( ): Promise { const collectionSummaries: CollectionSummaries = new Map(); const collectionLatestFiles = getCollectionLatestFiles( - user, files, archivedCollections ); + const collectionCoverFiles = getCollectionCoverFiles( + files, + archivedCollections, + collections + ); const collectionFilesCount = getCollectionsFileCount( files, trashedFiles, @@ -1109,6 +1159,7 @@ export async function getCollectionSummaries( id: collection.id, name: collection.name, latestFile: collectionLatestFiles.get(collection.id), + coverFile: collectionCoverFiles.get(collection.id), fileCount: collectionFilesCount.get(collection.id) ?? 0, updationTime: collection.updationTime, type: type, @@ -1140,7 +1191,11 @@ export async function getCollectionSummaries( collectionSummaries.set( ALL_SECTION, - getAllCollectionSummaries(collectionFilesCount, collectionLatestFiles) + getAllCollectionSummaries( + collectionFilesCount, + collectionCoverFiles, + collectionLatestFiles + ) ); collectionSummaries.set( ARCHIVE_SECTION, @@ -1200,12 +1255,14 @@ function getCollectionsFileCount( function getAllCollectionSummaries( collectionFilesCount: CollectionFilesCount, - collectionsLatestFile: CollectionLatestFiles + collectionCoverFiles: CollectionToFileMap, + collectionsLatestFile: CollectionToFileMap ): CollectionSummary { return { id: ALL_SECTION, name: t('ALL_SECTION_NAME'), type: CollectionSummaryType.all, + coverFile: collectionCoverFiles.get(ALL_SECTION), latestFile: collectionsLatestFile.get(ALL_SECTION), fileCount: collectionFilesCount.get(ALL_SECTION) || 0, updationTime: collectionsLatestFile.get(ALL_SECTION)?.updationTime, @@ -1219,6 +1276,7 @@ function getDummyUncategorizedCollectionSummaries(): CollectionSummary { name: t('UNCATEGORIZED'), type: CollectionSummaryType.uncategorized, latestFile: null, + coverFile: null, fileCount: 0, updationTime: 0, order: 1, @@ -1227,12 +1285,13 @@ function getDummyUncategorizedCollectionSummaries(): CollectionSummary { function getHiddenCollectionSummaries( collectionFilesCount: CollectionFilesCount, - collectionsLatestFile: CollectionLatestFiles + collectionsLatestFile: CollectionToFileMap ): CollectionSummary { return { id: HIDDEN_SECTION, name: t('HIDDEN'), type: CollectionSummaryType.hidden, + coverFile: null, latestFile: collectionsLatestFile.get(HIDDEN_SECTION), fileCount: collectionFilesCount.get(HIDDEN_SECTION) ?? 0, updationTime: collectionsLatestFile.get(HIDDEN_SECTION)?.updationTime, @@ -1241,12 +1300,13 @@ function getHiddenCollectionSummaries( } function getArchivedCollectionSummaries( collectionFilesCount: CollectionFilesCount, - collectionsLatestFile: CollectionLatestFiles + collectionsLatestFile: CollectionToFileMap ): CollectionSummary { return { id: ARCHIVE_SECTION, name: t('ARCHIVE_SECTION_NAME'), type: CollectionSummaryType.archive, + coverFile: null, latestFile: collectionsLatestFile.get(ARCHIVE_SECTION), fileCount: collectionFilesCount.get(ARCHIVE_SECTION) ?? 0, updationTime: collectionsLatestFile.get(ARCHIVE_SECTION)?.updationTime, @@ -1256,12 +1316,13 @@ function getArchivedCollectionSummaries( function getTrashedCollectionSummaries( collectionFilesCount: CollectionFilesCount, - collectionsLatestFile: CollectionLatestFiles + collectionsLatestFile: CollectionToFileMap ): CollectionSummary { return { id: TRASH_SECTION, name: t('TRASH'), type: CollectionSummaryType.trash, + coverFile: null, latestFile: collectionsLatestFile.get(TRASH_SECTION), fileCount: collectionFilesCount.get(TRASH_SECTION) ?? 0, updationTime: collectionsLatestFile.get(TRASH_SECTION)?.updationTime, diff --git a/apps/photos/src/types/collection/index.ts b/apps/photos/src/types/collection/index.ts index e645ee2c0..4a2b1c544 100644 --- a/apps/photos/src/types/collection/index.ts +++ b/apps/photos/src/types/collection/index.ts @@ -111,7 +111,7 @@ export interface collectionAttributes { pathDecryptionNonce?: string; } -export type CollectionLatestFiles = Map; +export type CollectionToFileMap = Map; export interface RemoveFromCollectionRequest { collectionID: number; @@ -145,6 +145,7 @@ export interface CollectionSummary { id: number; name: string; type: CollectionSummaryType; + coverFile: EnteFile; latestFile: EnteFile; fileCount: number; updationTime: number;