diff --git a/web/packages/gallery/components/viewer/FileViewer.tsx b/web/packages/gallery/components/viewer/FileViewer.tsx index 12f4d6e590..405e54c024 100644 --- a/web/packages/gallery/components/viewer/FileViewer.tsx +++ b/web/packages/gallery/components/viewer/FileViewer.tsx @@ -620,9 +620,6 @@ export const FileViewer: React.FC = ({ const handleShortcutsClose = useCallback(() => setOpenShortcuts(false), []); - // TODO: Unused translation t("convert") - can be removed post the upcoming - // streaming changes as they'll provides the equiv. - const shouldIgnoreKeyboardEvent = useCallback(() => { // Don't handle keydowns if any of the modals are open. return ( diff --git a/web/packages/media/file-metadata.ts b/web/packages/media/file-metadata.ts index 542303d7ec..e75e6be8e2 100644 --- a/web/packages/media/file-metadata.ts +++ b/web/packages/media/file-metadata.ts @@ -320,7 +320,7 @@ export interface PublicMagicMetadata { */ editedTime?: number; /** - * Modified name of the {@link EnteFile}. + * Modified file name of the {@link EnteFile}. * * This field stores edits to the {@link title} {@link FileMetadata} field. */ diff --git a/web/packages/new/photos/services/file.ts b/web/packages/new/photos/services/file.ts index e9c3b2cbbb..957bd0a44e 100644 --- a/web/packages/new/photos/services/file.ts +++ b/web/packages/new/photos/services/file.ts @@ -4,6 +4,7 @@ import type { EnteFile, EnteFile2 } from "ente-media/file"; import type { FilePrivateMagicMetadataData, ItemVisibility, + PublicMagicMetadata, } from "ente-media/file-metadata"; import { createMagicMetadata, @@ -51,6 +52,10 @@ export const performInBatches = ( * * Remote only, does not modify local state. * + * The visibility of an {@link EnteFile} is stored in its private magic + * metadata, so this function in effect updates the private magic metadata of + * the given files on remote. + * * @param files The list of files whose visibility we want to change. All the * files will get their visibility updated to the new, provided, value. * @@ -146,3 +151,79 @@ const putFilesMagicMetadata = async ( body: JSON.stringify(updateRequest), }), ); + +/** + * Update the file name of the provided file on remote. + * + * Remote only, does not modify local state. + * + * The file name of an {@link EnteFile} is stored in its public magic metadata, + * so this function in effect updates the public magic metadata of the given + * file on remote. + * + * @param file The file whose file name we want to change. + * + * @param newFileName The new file name of the file. + */ +export const updateFileFileName = (file: EnteFile2, newFileName: string) => + updateFilesPublicMagicMetadata([file], { editedName: newFileName }); + +/** + * Update the caption associated with the provided file on remote. + * + * Remote only, does not modify local state. + * + * The caption of an {@link EnteFile} is stored in its public magic metadata, so + * this function in effect updates the public magic metadata of the given file + * on remote. + * + * @param file The file whose file name we want to change. + * + * @param caption The caption associated with the file. + * + * Fields in magic metadata cannot be removed after being added, so to reset the + * caption to the default (no value) state pass a blank string. + */ +export const updateFileCaption = (file: EnteFile2, caption: string) => + updateFilesPublicMagicMetadata([file], { caption }); + +/** + * Update the private magic metadata of a list of files on remote. + * + * Remote only, does not modify local state. + * + * This is a variant of {@link updateFilePrivateMagicMetadata} that works with + * the {@link pubMagicMetadata} of the given files. + */ +const updateFilesPublicMagicMetadata = async ( + files: EnteFile2[], + updates: PublicMagicMetadata, +) => + putFilesPublicMagicMetadata({ + metadataList: await Promise.all( + files.map(async ({ id, key, pubMagicMetadata }) => ({ + id, + magicMetadata: await encryptMagicMetadata( + createMagicMetadata( + { ...pubMagicMetadata?.data, ...updates }, + pubMagicMetadata?.version, + ), + key, + ), + })), + ), + }); + +/** + * Update the public magic metadata of a list of files on remote. + */ +const putFilesPublicMagicMetadata = async ( + updateRequest: UpdateMultipleMagicMetadataRequest, +) => + ensureOk( + await fetch(await apiURL("/files/public-magic-metadata"), { + method: "PUT", + headers: await authenticatedRequestHeaders(), + body: JSON.stringify(updateRequest), + }), + );