Merge branch 'dev' into album-cover

This commit is contained in:
Abhinav 2023-07-11 12:17:33 +05:30
commit d809c82b3b
24 changed files with 256 additions and 126 deletions

View file

@ -235,12 +235,11 @@
"MAP": "", "MAP": "",
"MAP_SETTINGS": "", "MAP_SETTINGS": "",
"ENABLE_MAPS": "", "ENABLE_MAPS": "",
"ENABLE_MAP": "",
"DISABLE_MAPS": "", "DISABLE_MAPS": "",
"ENABLE_MAP_DESCRIPTION_1": "", "ENABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_2": "", "DISABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_3": "", "DISABLE_MAP": "",
"DISABLE_MAP_DESCRIPTION_1": "",
"DISABLE_MAP_DESCRIPTION_2": "",
"DETAILS": "", "DETAILS": "",
"VIEW_EXIF": "", "VIEW_EXIF": "",
"NO_EXIF": "", "NO_EXIF": "",

View file

@ -235,12 +235,11 @@
"MAP": "", "MAP": "",
"MAP_SETTINGS": "", "MAP_SETTINGS": "",
"ENABLE_MAPS": "", "ENABLE_MAPS": "",
"ENABLE_MAP": "",
"DISABLE_MAPS": "", "DISABLE_MAPS": "",
"ENABLE_MAP_DESCRIPTION_1": "", "ENABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_2": "", "DISABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_3": "", "DISABLE_MAP": "",
"DISABLE_MAP_DESCRIPTION_1": "",
"DISABLE_MAP_DESCRIPTION_2": "",
"DETAILS": "Detalles", "DETAILS": "Detalles",
"VIEW_EXIF": "Ver todos los datos de EXIF", "VIEW_EXIF": "Ver todos los datos de EXIF",
"NO_EXIF": "No hay datos EXIF", "NO_EXIF": "No hay datos EXIF",

View file

@ -235,12 +235,11 @@
"MAP": "", "MAP": "",
"MAP_SETTINGS": "", "MAP_SETTINGS": "",
"ENABLE_MAPS": "", "ENABLE_MAPS": "",
"ENABLE_MAP": "",
"DISABLE_MAPS": "", "DISABLE_MAPS": "",
"ENABLE_MAP_DESCRIPTION_1": "", "ENABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_2": "", "DISABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_3": "", "DISABLE_MAP": "",
"DISABLE_MAP_DESCRIPTION_1": "",
"DISABLE_MAP_DESCRIPTION_2": "",
"DETAILS": "", "DETAILS": "",
"VIEW_EXIF": "", "VIEW_EXIF": "",
"NO_EXIF": "", "NO_EXIF": "",

View file

@ -235,12 +235,11 @@
"MAP": "", "MAP": "",
"MAP_SETTINGS": "", "MAP_SETTINGS": "",
"ENABLE_MAPS": "", "ENABLE_MAPS": "",
"ENABLE_MAP": "",
"DISABLE_MAPS": "", "DISABLE_MAPS": "",
"ENABLE_MAP_DESCRIPTION_1": "", "ENABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_2": "", "DISABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_3": "", "DISABLE_MAP": "",
"DISABLE_MAP_DESCRIPTION_1": "",
"DISABLE_MAP_DESCRIPTION_2": "",
"DETAILS": "", "DETAILS": "",
"VIEW_EXIF": "", "VIEW_EXIF": "",
"NO_EXIF": "", "NO_EXIF": "",

View file

@ -235,12 +235,11 @@
"MAP": "", "MAP": "",
"MAP_SETTINGS": "", "MAP_SETTINGS": "",
"ENABLE_MAPS": "", "ENABLE_MAPS": "",
"ENABLE_MAP": "",
"DISABLE_MAPS": "", "DISABLE_MAPS": "",
"ENABLE_MAP_DESCRIPTION_1": "", "ENABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_2": "", "DISABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_3": "", "DISABLE_MAP": "",
"DISABLE_MAP_DESCRIPTION_1": "",
"DISABLE_MAP_DESCRIPTION_2": "",
"DETAILS": "Détails", "DETAILS": "Détails",
"VIEW_EXIF": "Visualiser toutes les données EXIF", "VIEW_EXIF": "Visualiser toutes les données EXIF",
"NO_EXIF": "Aucune donnée EXIF", "NO_EXIF": "Aucune donnée EXIF",

View file

@ -235,12 +235,11 @@
"MAP": "", "MAP": "",
"MAP_SETTINGS": "", "MAP_SETTINGS": "",
"ENABLE_MAPS": "", "ENABLE_MAPS": "",
"ENABLE_MAP": "",
"DISABLE_MAPS": "", "DISABLE_MAPS": "",
"ENABLE_MAP_DESCRIPTION_1": "", "ENABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_2": "", "DISABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_3": "", "DISABLE_MAP": "",
"DISABLE_MAP_DESCRIPTION_1": "",
"DISABLE_MAP_DESCRIPTION_2": "",
"DETAILS": "", "DETAILS": "",
"VIEW_EXIF": "", "VIEW_EXIF": "",
"NO_EXIF": "", "NO_EXIF": "",

View file

@ -235,12 +235,11 @@
"MAP": "", "MAP": "",
"MAP_SETTINGS": "", "MAP_SETTINGS": "",
"ENABLE_MAPS": "", "ENABLE_MAPS": "",
"ENABLE_MAP": "",
"DISABLE_MAPS": "", "DISABLE_MAPS": "",
"ENABLE_MAP_DESCRIPTION_1": "", "ENABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_2": "", "DISABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_3": "", "DISABLE_MAP": "",
"DISABLE_MAP_DESCRIPTION_1": "",
"DISABLE_MAP_DESCRIPTION_2": "",
"DETAILS": "Details", "DETAILS": "Details",
"VIEW_EXIF": "Bekijk alle EXIF gegevens", "VIEW_EXIF": "Bekijk alle EXIF gegevens",
"NO_EXIF": "Geen EXIF gegevens", "NO_EXIF": "Geen EXIF gegevens",

View file

@ -235,12 +235,11 @@
"MAP": "", "MAP": "",
"MAP_SETTINGS": "", "MAP_SETTINGS": "",
"ENABLE_MAPS": "", "ENABLE_MAPS": "",
"ENABLE_MAP": "",
"DISABLE_MAPS": "", "DISABLE_MAPS": "",
"ENABLE_MAP_DESCRIPTION_1": "", "ENABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_2": "", "DISABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_3": "", "DISABLE_MAP": "",
"DISABLE_MAP_DESCRIPTION_1": "",
"DISABLE_MAP_DESCRIPTION_2": "",
"DETAILS": "", "DETAILS": "",
"VIEW_EXIF": "", "VIEW_EXIF": "",
"NO_EXIF": "", "NO_EXIF": "",

View file

@ -235,12 +235,11 @@
"MAP": "", "MAP": "",
"MAP_SETTINGS": "", "MAP_SETTINGS": "",
"ENABLE_MAPS": "", "ENABLE_MAPS": "",
"ENABLE_MAP": "",
"DISABLE_MAPS": "", "DISABLE_MAPS": "",
"ENABLE_MAP_DESCRIPTION_1": "", "ENABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_2": "", "DISABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_3": "", "DISABLE_MAP": "",
"DISABLE_MAP_DESCRIPTION_1": "",
"DISABLE_MAP_DESCRIPTION_2": "",
"DETAILS": "", "DETAILS": "",
"VIEW_EXIF": "", "VIEW_EXIF": "",
"NO_EXIF": "", "NO_EXIF": "",

View file

@ -235,12 +235,11 @@
"MAP": "", "MAP": "",
"MAP_SETTINGS": "", "MAP_SETTINGS": "",
"ENABLE_MAPS": "", "ENABLE_MAPS": "",
"ENABLE_MAP": "",
"DISABLE_MAPS": "", "DISABLE_MAPS": "",
"ENABLE_MAP_DESCRIPTION_1": "", "ENABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_2": "", "DISABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_3": "", "DISABLE_MAP": "",
"DISABLE_MAP_DESCRIPTION_1": "",
"DISABLE_MAP_DESCRIPTION_2": "",
"DETAILS": "", "DETAILS": "",
"VIEW_EXIF": "", "VIEW_EXIF": "",
"NO_EXIF": "", "NO_EXIF": "",

View file

@ -235,12 +235,11 @@
"MAP": "", "MAP": "",
"MAP_SETTINGS": "", "MAP_SETTINGS": "",
"ENABLE_MAPS": "", "ENABLE_MAPS": "",
"ENABLE_MAP": "",
"DISABLE_MAPS": "", "DISABLE_MAPS": "",
"ENABLE_MAP_DESCRIPTION_1": "", "ENABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_2": "", "DISABLE_MAP_DESCRIPTION": "",
"ENABLE_MAP_DESCRIPTION_3": "", "DISABLE_MAP": "",
"DISABLE_MAP_DESCRIPTION_1": "",
"DISABLE_MAP_DESCRIPTION_2": "",
"DETAILS": "详情", "DETAILS": "详情",
"VIEW_EXIF": "查看所有 EXIF 数据", "VIEW_EXIF": "查看所有 EXIF 数据",
"NO_EXIF": "无 EXIF 数据", "NO_EXIF": "无 EXIF 数据",

View file

@ -13,7 +13,7 @@ import PushPinOutlined from '@mui/icons-material/PushPinOutlined';
import { UnPinIcon } from 'components/icons/UnPinIcon'; import { UnPinIcon } from 'components/icons/UnPinIcon';
interface Iprops { interface Iprops {
IsArchived: boolean; isArchived: boolean;
isPinned: boolean; isPinned: boolean;
handleCollectionAction: ( handleCollectionAction: (
action: CollectionActions, action: CollectionActions,
@ -22,7 +22,7 @@ interface Iprops {
} }
export function AlbumCollectionOption({ export function AlbumCollectionOption({
IsArchived, isArchived,
isPinned, isPinned,
handleCollectionAction, handleCollectionAction,
}: Iprops) { }: Iprops) {
@ -63,7 +63,7 @@ export function AlbumCollectionOption({
{t('PIN_ALBUM')} {t('PIN_ALBUM')}
</OverflowMenuOption> </OverflowMenuOption>
)} )}
{IsArchived ? ( {isArchived ? (
<OverflowMenuOption <OverflowMenuOption
onClick={handleCollectionAction( onClick={handleCollectionAction(
CollectionActions.UNARCHIVE CollectionActions.UNARCHIVE

View file

@ -3,16 +3,38 @@ import React from 'react';
import LogoutIcon from '@mui/icons-material/Logout'; import LogoutIcon from '@mui/icons-material/Logout';
import { CollectionActions } from '.'; import { CollectionActions } from '.';
import { t } from 'i18next'; import { t } from 'i18next';
import Unarchive from '@mui/icons-material/Unarchive';
import ArchiveOutlined from '@mui/icons-material/ArchiveOutlined';
interface Iprops { interface Iprops {
isArchived: boolean;
handleCollectionAction: ( handleCollectionAction: (
action: CollectionActions, action: CollectionActions,
loader?: boolean loader?: boolean
) => (...args: any[]) => Promise<void>; ) => (...args: any[]) => Promise<void>;
} }
export function SharedCollectionOption({ handleCollectionAction }: Iprops) { export function SharedCollectionOption({
isArchived,
handleCollectionAction,
}: Iprops) {
return ( return (
<>
{isArchived ? (
<OverflowMenuOption
onClick={handleCollectionAction(
CollectionActions.UNARCHIVE
)}
startIcon={<Unarchive />}>
{t('UNARCHIVE_COLLECTION')}
</OverflowMenuOption>
) : (
<OverflowMenuOption
onClick={handleCollectionAction(CollectionActions.ARCHIVE)}
startIcon={<ArchiveOutlined />}>
{t('ARCHIVE_COLLECTION')}
</OverflowMenuOption>
)}
<OverflowMenuOption <OverflowMenuOption
startIcon={<LogoutIcon />} startIcon={<LogoutIcon />}
onClick={handleCollectionAction( onClick={handleCollectionAction(
@ -21,5 +43,6 @@ export function SharedCollectionOption({ handleCollectionAction }: Iprops) {
)}> )}>
{t('LEAVE_ALBUM')} {t('LEAVE_ALBUM')}
</OverflowMenuOption> </OverflowMenuOption>
</>
); );
} }

View file

@ -11,7 +11,7 @@ import {
} from 'utils/collection'; } from 'utils/collection';
import { SetCollectionNamerAttributes } from '../CollectionNamer'; import { SetCollectionNamerAttributes } from '../CollectionNamer';
import { Collection } from 'types/collection'; import { Collection } from 'types/collection';
import { IsArchived, isPinnedCollection } from 'utils/magicMetadata'; import { isArchivedCollection, isPinnedCollection } from 'utils/magicMetadata';
import { GalleryContext } from 'pages/gallery'; import { GalleryContext } from 'pages/gallery';
import { logError } from 'utils/sentry'; import { logError } from 'utils/sentry';
import { VISIBILITY_STATE } from 'types/magicMetadata'; import { VISIBILITY_STATE } from 'types/magicMetadata';
@ -343,11 +343,12 @@ const CollectionOptions = (props: CollectionOptionsProps) => {
collectionSummaryType === collectionSummaryType ===
CollectionSummaryType.incomingShareCollaborator ? ( CollectionSummaryType.incomingShareCollaborator ? (
<SharedCollectionOption <SharedCollectionOption
isArchived={isArchivedCollection(activeCollection)}
handleCollectionAction={handleCollectionAction} handleCollectionAction={handleCollectionAction}
/> />
) : ( ) : (
<AlbumCollectionOption <AlbumCollectionOption
IsArchived={IsArchived(activeCollection)} isArchived={isArchivedCollection(activeCollection)}
isPinned={isPinnedCollection(activeCollection)} isPinned={isPinnedCollection(activeCollection)}
handleCollectionAction={handleCollectionAction} handleCollectionAction={handleCollectionAction}
/> />

View file

@ -37,6 +37,7 @@ import {
getMapDisableConfirmationDialog, getMapDisableConfirmationDialog,
getMapEnableConfirmationDialog, getMapEnableConfirmationDialog,
} from 'utils/ui'; } from 'utils/ui';
import { PublicCollectionGalleryContext } from 'utils/publicCollectionGallery';
export const FileInfoSidebar = styled((props: DialogProps) => ( export const FileInfoSidebar = styled((props: DialogProps) => (
<EnteDrawer {...props} anchor="right" /> <EnteDrawer {...props} anchor="right" />
@ -97,6 +98,9 @@ export function FileInfo({
}: Iprops) { }: Iprops) {
const appContext = useContext(AppContext); const appContext = useContext(AppContext);
const galleryContext = useContext(GalleryContext); const galleryContext = useContext(GalleryContext);
const publicCollectionGalleryContext = useContext(
PublicCollectionGalleryContext
);
const [parsedExifData, setParsedExifData] = useState<Record<string, any>>(); const [parsedExifData, setParsedExifData] = useState<Record<string, any>>();
const [showExif, setShowExif] = useState(false); const [showExif, setShowExif] = useState(false);
@ -235,7 +239,8 @@ export function FileInfo({
icon={<LocationOnOutlined />} icon={<LocationOnOutlined />}
title={t('LOCATION')} title={t('LOCATION')}
caption={ caption={
!appContext.mapEnabled ? ( !appContext.mapEnabled ||
publicCollectionGalleryContext.accessedThroughSharedURL ? (
<Link <Link
href={getOpenStreetMapLink(location)} href={getOpenStreetMapLink(location)}
target="_blank" target="_blank"
@ -264,6 +269,7 @@ export function FileInfo({
/> />
} }
/> />
{!publicCollectionGalleryContext.accessedThroughSharedURL && (
<MapBox <MapBox
location={location} location={location}
mapEnabled={appContext.mapEnabled} mapEnabled={appContext.mapEnabled}
@ -271,6 +277,7 @@ export function FileInfo({
openEnableMapConfirmationDialog openEnableMapConfirmationDialog
} }
/> />
)}
</> </>
)} )}
<InfoItem <InfoItem

View file

@ -18,21 +18,17 @@ export function FamilySubscriptionCardContent({ userDetails }: Iprops) {
return userDetails.usage; return userDetails.usage;
} }
}, [userDetails]); }, [userDetails]);
const totalStorage =
userDetails.familyData.storage + (userDetails.storageBonus ?? 0);
return ( return (
<> <>
<StorageSection <StorageSection storage={totalStorage} usage={totalUsage} />
storage={userDetails.familyData.storage}
usage={totalUsage}
/>
<FamilyUsageSection <FamilyUsageSection
userUsage={userDetails.usage} userUsage={userDetails.usage}
fileCount={userDetails.fileCount} fileCount={userDetails.fileCount}
totalUsage={totalUsage} totalUsage={totalUsage}
totalStorage={ totalStorage={totalStorage}
userDetails.familyData.storage +
(userDetails.storageBonus ?? 0)
}
/> />
</> </>
); );

View file

@ -8,19 +8,15 @@ interface Iprops {
} }
export function IndividualSubscriptionCardContent({ userDetails }: Iprops) { export function IndividualSubscriptionCardContent({ userDetails }: Iprops) {
const totalStorage =
userDetails.subscription.storage + (userDetails.storageBonus ?? 0);
return ( return (
<> <>
<StorageSection <StorageSection storage={totalStorage} usage={userDetails.usage} />
storage={userDetails.subscription.storage}
usage={userDetails.usage}
/>
<IndividualUsageSection <IndividualUsageSection
usage={userDetails.usage} usage={userDetails.usage}
fileCount={userDetails.fileCount} fileCount={userDetails.fileCount}
storage={ storage={totalStorage}
userDetails.subscription.storage +
(userDetails.storageBonus ?? 0)
}
/> />
</> </>
); );

View file

@ -20,8 +20,7 @@ import {
import { FILE_TYPE } from 'constants/file'; import { FILE_TYPE } from 'constants/file';
import AlbumOutlined from '@mui/icons-material/AlbumOutlined'; import AlbumOutlined from '@mui/icons-material/AlbumOutlined';
import Avatar from './Avatar'; import Avatar from './Avatar';
import { User } from 'types/user'; import { shouldShowAvatar } from 'utils/file';
import { getData, LS_KEYS } from 'utils/storage/localStorage';
interface IProps { interface IProps {
file: EnteFile; file: EnteFile;
@ -217,7 +216,7 @@ const Cont = styled('div')<{ disabled: boolean }>`
`; `;
export default function PreviewCard(props: IProps) { export default function PreviewCard(props: IProps) {
const { thumbs } = useContext(GalleryContext); const { thumbs, user } = useContext(GalleryContext);
const { const {
file, file,
@ -334,8 +333,6 @@ export default function PreviewCard(props: IProps) {
} }
}; };
const user: User = getData(LS_KEYS.USER);
return ( return (
<Cont <Cont
key={`thumb-${file.id}-${props.showPlaceholder}`} key={`thumb-${file.id}-${props.showPlaceholder}`}
@ -371,9 +368,7 @@ export default function PreviewCard(props: IProps) {
) )
)} )}
<SelectedOverlay selected={selected} /> <SelectedOverlay selected={selected} />
{(file.ownerID !== user.id || {shouldShowAvatar(file, user) && (
(file.ownerID === user.id &&
file.pubMagicMetadata?.data?.uploaderName)) && (
<AvatarOverlay> <AvatarOverlay>
<Avatar file={file} /> <Avatar file={file} />
</AvatarOverlay> </AvatarOverlay>

View file

@ -119,7 +119,7 @@ import ExportModal from 'components/ExportModal';
import GalleryEmptyState from 'components/GalleryEmptyState'; import GalleryEmptyState from 'components/GalleryEmptyState';
import AuthenticateUserModal from 'components/AuthenticateUserModal'; import AuthenticateUserModal from 'components/AuthenticateUserModal';
import useMemoSingleThreaded from 'hooks/useMemoSingleThreaded'; import useMemoSingleThreaded from 'hooks/useMemoSingleThreaded';
import { IsArchived } from 'utils/magicMetadata'; import { isArchivedFile } from 'utils/magicMetadata';
import { isSameDayAnyYear, isInsideLocationTag } from 'utils/search'; import { isSameDayAnyYear, isInsideLocationTag } from 'utils/search';
import { getSessionExpiredMessage } from 'utils/ui'; import { getSessionExpiredMessage } from 'utils/ui';
import { syncEntities } from 'services/entityService'; import { syncEntities } from 'services/entityService';
@ -497,7 +497,7 @@ export default function Gallery() {
} }
// Archived files can only be seen in archive section or their respective collection // Archived files can only be seen in archive section or their respective collection
if (IsArchived(item)) { if (isArchivedFile(item)) {
if ( if (
activeCollection === ARCHIVE_SECTION || activeCollection === ARCHIVE_SECTION ||
activeCollection === item.collectionID activeCollection === item.collectionID

View file

@ -30,6 +30,7 @@ import {
CollectionMagicMetadataProps, CollectionMagicMetadataProps,
CollectionPublicMagicMetadata, CollectionPublicMagicMetadata,
RemoveFromCollectionRequest, RemoveFromCollectionRequest,
CollectionShareeMagicMetadata,
} from 'types/collection'; } from 'types/collection';
import { import {
COLLECTION_LIST_SORT_BY, COLLECTION_LIST_SORT_BY,
@ -44,7 +45,8 @@ import {
} from 'constants/collection'; } from 'constants/collection';
import { SUB_TYPE, UpdateMagicMetadataRequest } from 'types/magicMetadata'; import { SUB_TYPE, UpdateMagicMetadataRequest } from 'types/magicMetadata';
import { import {
IsArchived, isArchivedCollection,
isArchivedFile,
isPinnedCollection, isPinnedCollection,
updateMagicMetadata, updateMagicMetadata,
} from 'utils/magicMetadata'; } from 'utils/magicMetadata';
@ -144,12 +146,25 @@ const getCollectionWithSecrets = async (
}; };
} }
let collectionShareeMagicMetadata: CollectionShareeMagicMetadata;
if (collection.sharedMagicMetadata?.data) {
collectionShareeMagicMetadata = {
...collection.sharedMagicMetadata,
data: await cryptoWorker.decryptMetadata(
collection.sharedMagicMetadata.data,
collection.sharedMagicMetadata.header,
collectionKey
),
};
}
return { return {
...collection, ...collection,
name: collectionName, name: collectionName,
key: collectionKey, key: collectionKey,
magicMetadata: collectionMagicMetadata, magicMetadata: collectionMagicMetadata,
pubMagicMetadata: collectionPublicMagicMetadata, pubMagicMetadata: collectionPublicMagicMetadata,
sharedMagicMetadata: collectionShareeMagicMetadata,
}; };
}; };
@ -293,7 +308,7 @@ export const getCollectionLatestFiles = (
} }
if ( if (
!latestFiles.has(ALL_SECTION) && !latestFiles.has(ALL_SECTION) &&
!IsArchived(file) && !isArchivedFile(file) &&
!archivedCollections.has(file.collectionID) !archivedCollections.has(file.collectionID)
) { ) {
latestFiles.set(ALL_SECTION, file); latestFiles.set(ALL_SECTION, file);
@ -339,7 +354,10 @@ export const getCollectionCoverFiles = (
if (coverFiles.has(ALL_SECTION)) { if (coverFiles.has(ALL_SECTION)) {
break; break;
} }
if (!IsArchived(file) && !archivedCollections.has(file.collectionID)) { if (
!isArchivedFile(file) &&
!archivedCollections.has(file.collectionID)
) {
coverFiles.set(ALL_SECTION, file); coverFiles.set(ALL_SECTION, file);
} }
} }
@ -407,6 +425,7 @@ const createCollection = async (
isDeleted: false, isDeleted: false,
magicMetadata: encryptedMagicMetadata, magicMetadata: encryptedMagicMetadata,
pubMagicMetadata: null, pubMagicMetadata: null,
sharedMagicMetadata: null,
}; };
const createdCollection = await postCollection(newCollection, token); const createdCollection = await postCollection(newCollection, token);
const decryptedCreatedCollection = await getCollectionWithSecrets( const decryptedCreatedCollection = await getCollectionWithSecrets(
@ -786,6 +805,50 @@ export const updateCollectionMagicMetadata = async (
return updatedCollection; return updatedCollection;
}; };
export const updateSharedCollectionMagicMetadata = async (
collection: Collection,
updatedMagicMetadata: CollectionMagicMetadata
) => {
const token = getToken();
if (!token) {
return;
}
const cryptoWorker = await ComlinkCryptoWorker.getInstance();
const { file: encryptedMagicMetadata } = await cryptoWorker.encryptMetadata(
updatedMagicMetadata.data,
collection.key
);
const reqBody: UpdateMagicMetadataRequest = {
id: collection.id,
magicMetadata: {
version: updatedMagicMetadata.version,
count: updatedMagicMetadata.count,
data: encryptedMagicMetadata.encryptedData,
header: encryptedMagicMetadata.decryptionHeader,
},
};
await HTTPService.put(
`${ENDPOINT}/collections/sharee-magic-metadata`,
reqBody,
null,
{
'X-Auth-Token': token,
}
);
const updatedCollection: Collection = {
...collection,
magicMetadata: {
...updatedMagicMetadata,
version: updatedMagicMetadata.version + 1,
},
};
return updatedCollection;
};
export const updatePublicCollectionMagicMetadata = async ( export const updatePublicCollectionMagicMetadata = async (
collection: Collection, collection: Collection,
updatedPublicMagicMetadata: CollectionPublicMagicMetadata updatedPublicMagicMetadata: CollectionPublicMagicMetadata
@ -1082,7 +1145,7 @@ export async function getCollectionSummaries(
type = CollectionSummaryType.outgoingShare; type = CollectionSummaryType.outgoingShare;
} else if (isSharedOnlyViaLink(collection)) { } else if (isSharedOnlyViaLink(collection)) {
type = CollectionSummaryType.sharedOnlyViaLink; type = CollectionSummaryType.sharedOnlyViaLink;
} else if (IsArchived(collection)) { } else if (isArchivedCollection(collection)) {
type = CollectionSummaryType.archived; type = CollectionSummaryType.archived;
} else if (isHiddenCollection(collection)) { } else if (isHiddenCollection(collection)) {
type = CollectionSummaryType.hidden; type = CollectionSummaryType.hidden;
@ -1177,7 +1240,7 @@ function getCollectionsFileCount(
for (const file of files) { for (const file of files) {
if (isSharedFile(user, file)) { if (isSharedFile(user, file)) {
continue; continue;
} else if (IsArchived(file)) { } else if (isArchivedFile(file)) {
uniqueArchivedFileIDs.add(file.id); uniqueArchivedFileIDs.add(file.id);
} else if (!archivedCollections.has(file.collectionID)) { } else if (!archivedCollections.has(file.collectionID)) {
uniqueAllSectionFileIDs.add(file.id); uniqueAllSectionFileIDs.add(file.id);

View file

@ -37,6 +37,7 @@ export interface EncryptedCollection {
isDeleted: boolean; isDeleted: boolean;
magicMetadata: EncryptedMagicMetadata; magicMetadata: EncryptedMagicMetadata;
pubMagicMetadata: EncryptedMagicMetadata; pubMagicMetadata: EncryptedMagicMetadata;
sharedMagicMetadata: EncryptedMagicMetadata;
} }
export interface Collection export interface Collection
@ -48,11 +49,13 @@ export interface Collection
| 'nameDecryptionNonce' | 'nameDecryptionNonce'
| 'magicMetadata' | 'magicMetadata'
| 'pubMagicMetadata' | 'pubMagicMetadata'
| 'sharedMagicMetadata'
> { > {
key: string; key: string;
name: string; name: string;
magicMetadata: CollectionMagicMetadata; magicMetadata: CollectionMagicMetadata;
pubMagicMetadata: CollectionPublicMagicMetadata; pubMagicMetadata: CollectionPublicMagicMetadata;
sharedMagicMetadata: CollectionShareeMagicMetadata;
} }
export interface PublicURL { export interface PublicURL {
@ -124,6 +127,12 @@ export interface CollectionMagicMetadataProps {
export type CollectionMagicMetadata = export type CollectionMagicMetadata =
MagicMetadataCore<CollectionMagicMetadataProps>; MagicMetadataCore<CollectionMagicMetadataProps>;
export interface CollectionShareeMetadataProps {
visibility?: VISIBILITY_STATE;
}
export type CollectionShareeMagicMetadata =
MagicMetadataCore<CollectionShareeMetadataProps>;
export interface CollectionPublicMagicMetadataProps { export interface CollectionPublicMagicMetadataProps {
asc?: boolean; asc?: boolean;
coverID?: number; coverID?: number;

View file

@ -8,6 +8,7 @@ import {
unhideToCollection, unhideToCollection,
updateCollectionMagicMetadata, updateCollectionMagicMetadata,
updatePublicCollectionMagicMetadata, updatePublicCollectionMagicMetadata,
updateSharedCollectionMagicMetadata,
} from 'services/collectionService'; } from 'services/collectionService';
import { downloadFiles } from 'utils/file'; import { downloadFiles } from 'utils/file';
import { getLocalFiles, getLocalHiddenFiles } from 'services/fileService'; import { getLocalFiles, getLocalHiddenFiles } from 'services/fileService';
@ -34,7 +35,7 @@ import {
} from 'constants/collection'; } from 'constants/collection';
import { getUnixTimeInMicroSecondsWithDelta } from 'utils/time'; import { getUnixTimeInMicroSecondsWithDelta } from 'utils/time';
import { SUB_TYPE, VISIBILITY_STATE } from 'types/magicMetadata'; import { SUB_TYPE, VISIBILITY_STATE } from 'types/magicMetadata';
import { IsArchived, updateMagicMetadata } from 'utils/magicMetadata'; import { isArchivedCollection, updateMagicMetadata } from 'utils/magicMetadata';
import { getAlbumsURL } from 'utils/common/apiUtil'; import { getAlbumsURL } from 'utils/common/apiUtil';
import bs58 from 'bs58'; import bs58 from 'bs58';
import { t } from 'i18next'; import { t } from 'i18next';
@ -166,12 +167,29 @@ export const changeCollectionVisibility = async (
visibility, visibility,
}; };
const user: User = getData(LS_KEYS.USER);
if (collection.owner.id === user.id) {
const updatedMagicMetadata = await updateMagicMetadata( const updatedMagicMetadata = await updateMagicMetadata(
updatedMagicMetadataProps, updatedMagicMetadataProps,
collection.magicMetadata, collection.magicMetadata,
collection.key collection.key
); );
await updateCollectionMagicMetadata(collection, updatedMagicMetadata);
await updateCollectionMagicMetadata(
collection,
updatedMagicMetadata
);
} else {
const updatedMagicMetadata = await updateMagicMetadata(
updatedMagicMetadataProps,
collection.sharedMagicMetadata,
collection.key
);
await updateSharedCollectionMagicMetadata(
collection,
updatedMagicMetadata
);
}
} catch (e) { } catch (e) {
logError(e, 'change collection visibility failed'); logError(e, 'change collection visibility failed');
throw e; throw e;
@ -247,7 +265,9 @@ export const changeCollectionSubType = async (
export const getArchivedCollections = (collections: Collection[]) => { export const getArchivedCollections = (collections: Collection[]) => {
return new Set<number>( return new Set<number>(
collections.filter(IsArchived).map((collection) => collection.id) collections
.filter(isArchivedCollection)
.map((collection) => collection.id)
); );
}; };

View file

@ -28,7 +28,7 @@ import PublicCollectionDownloadManager from 'services/publicCollectionDownloadMa
import heicConversionService from 'services/heicConversionService'; import heicConversionService from 'services/heicConversionService';
import * as ffmpegService from 'services/ffmpeg/ffmpegService'; import * as ffmpegService from 'services/ffmpeg/ffmpegService';
import { VISIBILITY_STATE } from 'types/magicMetadata'; import { VISIBILITY_STATE } from 'types/magicMetadata';
import { IsArchived, updateMagicMetadata } from 'utils/magicMetadata'; import { isArchivedFile, updateMagicMetadata } from 'utils/magicMetadata';
import { addLocalLog, addLogLine } from 'utils/logging'; import { addLocalLog, addLogLine } from 'utils/logging';
import { CustomError } from 'utils/error'; import { CustomError } from 'utils/error';
@ -576,7 +576,7 @@ export const isImageOrVideo = (fileType: FILE_TYPE) =>
[FILE_TYPE.IMAGE, FILE_TYPE.VIDEO].includes(fileType); [FILE_TYPE.IMAGE, FILE_TYPE.VIDEO].includes(fileType);
export const getArchivedFiles = (files: EnteFile[]) => { export const getArchivedFiles = (files: EnteFile[]) => {
return files.filter(IsArchived).map((file) => file.id); return files.filter(isArchivedFile).map((file) => file.id);
}; };
export const createTypedObjectURL = async (blob: Blob, fileName: string) => { export const createTypedObjectURL = async (blob: Blob, fileName: string) => {
@ -672,3 +672,22 @@ export function constructFileToCollectionMap(files: EnteFile[]) {
}); });
return fileToCollectionsMap; return fileToCollectionsMap;
} }
export const shouldShowAvatar = (file: EnteFile, user: User) => {
if (!file || !user) {
return false;
}
// is Shared file
else if (file.ownerID !== user.id) {
return true;
}
// is public collected file
else if (
file.ownerID === user.id &&
file.pubMagicMetadata?.data?.uploaderName
) {
return true;
} else {
return false;
}
};

View file

@ -3,19 +3,31 @@ import { EnteFile } from 'types/file';
import { MagicMetadataCore, VISIBILITY_STATE } from 'types/magicMetadata'; import { MagicMetadataCore, VISIBILITY_STATE } from 'types/magicMetadata';
import ComlinkCryptoWorker from 'utils/comlink/ComlinkCryptoWorker'; import ComlinkCryptoWorker from 'utils/comlink/ComlinkCryptoWorker';
export function IsArchived(item: Collection | EnteFile) { export function isArchivedFile(item: EnteFile): boolean {
if ( if (!item || !item.magicMetadata || !item.magicMetadata.data) {
!item ||
!item.magicMetadata ||
!item.magicMetadata.data ||
typeof item.magicMetadata.data === 'string' ||
typeof item.magicMetadata.data.visibility === 'undefined'
) {
return false; return false;
} }
return item.magicMetadata.data.visibility === VISIBILITY_STATE.ARCHIVED; return item.magicMetadata.data.visibility === VISIBILITY_STATE.ARCHIVED;
} }
export function isArchivedCollection(item: Collection): boolean {
if (!item) {
return false;
}
if (item.magicMetadata && item.magicMetadata.data) {
return item.magicMetadata.data.visibility === VISIBILITY_STATE.ARCHIVED;
}
if (item.sharedMagicMetadata && item.sharedMagicMetadata.data) {
return (
item.sharedMagicMetadata.data.visibility ===
VISIBILITY_STATE.ARCHIVED
);
}
return false;
}
export function isPinnedCollection(item: Collection) { export function isPinnedCollection(item: Collection) {
if ( if (
!item || !item ||