diff --git a/web/apps/photos/src/components/pages/gallery/SelectedFileOptions.tsx b/web/apps/photos/src/components/pages/gallery/SelectedFileOptions.tsx
index 01d1cf7e87..ce84d37824 100644
--- a/web/apps/photos/src/components/pages/gallery/SelectedFileOptions.tsx
+++ b/web/apps/photos/src/components/pages/gallery/SelectedFileOptions.tsx
@@ -15,6 +15,7 @@ import RestoreIcon from "@mui/icons-material/Restore";
import UnArchiveIcon from "@mui/icons-material/Unarchive";
import VisibilityOffOutlined from "@mui/icons-material/VisibilityOffOutlined";
import VisibilityOutlined from "@mui/icons-material/VisibilityOutlined";
+import FavoriteBorderIcon from "@mui/icons-material/FavoriteBorderRounded";
import { Box, IconButton, Stack, Tooltip } from "@mui/material";
import { t } from "i18next";
import { AppContext } from "pages/_app";
@@ -28,6 +29,7 @@ import {
import { FILE_OPS_TYPE } from "utils/file";
import { formatNumber } from "utils/number/format";
import { getTrashFilesMessage } from "utils/ui";
+import Favorite from "@mui/icons-material/FavoriteRounded";
interface Props {
handleCollectionOps: (
@@ -332,6 +334,15 @@ const SelectedFileOptions = ({
+ {!isFavoriteCollection && (
+
+
+
+
+
+ )}
) => {
+ const favItemIds = await getFavItemIds(files);
+ setFavItemIds(favItemIds);
+ };
+
if (!collectionSummaries || !filteredData) {
return ;
}
diff --git a/web/apps/photos/src/services/collectionService.ts b/web/apps/photos/src/services/collectionService.ts
index d89801435e..289d8be917 100644
--- a/web/apps/photos/src/services/collectionService.ts
+++ b/web/apps/photos/src/services/collectionService.ts
@@ -486,12 +486,16 @@ export const createFavoritesCollection = () => {
};
export const addToFavorites = async (file: EnteFile) => {
+ await addMultipleToFavorites([file]);
+}
+
+export const addMultipleToFavorites = async (files: EnteFile[]) => {
try {
let favCollection = await getFavCollection();
if (!favCollection) {
favCollection = await createFavoritesCollection();
}
- await addToCollection(favCollection, [file]);
+ await addToCollection(favCollection, files);
} catch (e) {
log.error("failed to add to favorite", e);
}
diff --git a/web/apps/photos/src/utils/file/index.ts b/web/apps/photos/src/utils/file/index.ts
index 19ebcf4c75..71f39954c1 100644
--- a/web/apps/photos/src/utils/file/index.ts
+++ b/web/apps/photos/src/utils/file/index.ts
@@ -24,7 +24,7 @@ import { LS_KEYS, getData } from "@ente/shared/storage/localStorage";
import type { User } from "@ente/shared/user/types";
import { downloadUsingAnchor } from "@ente/shared/utils";
import { t } from "i18next";
-import { moveToHiddenCollection } from "services/collectionService";
+import { addMultipleToFavorites, addToFavorites, moveToHiddenCollection } from "services/collectionService";
import {
deleteFromTrash,
trashFiles,
@@ -46,6 +46,7 @@ export enum FILE_OPS_TYPE {
HIDE,
TRASH,
DELETE_PERMANENTLY,
+ SET_FAVORITE
}
export async function downloadFile(file: EnteFile) {
@@ -598,6 +599,7 @@ export const handleFileOps = async (
| ((prev: { files: EnteFile[] }) => { files: EnteFile[] }),
) => void,
setFilesDownloadProgressAttributesCreator: SetFilesDownloadProgressAttributesCreator,
+ updateFavItemIds: (ids: Set) => void,
) => {
switch (ops) {
case FILE_OPS_TYPE.TRASH:
@@ -629,6 +631,10 @@ export const handleFileOps = async (
case FILE_OPS_TYPE.UNARCHIVE:
await changeFilesVisibility(files, ItemVisibility.visible);
break;
+ case FILE_OPS_TYPE.SET_FAVORITE:
+ await setBulkFavorite(files);
+ updateFavItemIds(new Set(files.map(f=>f.id)))
+ break;
}
};
@@ -681,3 +687,11 @@ const fixTimeHelper = async (
) => {
setFixCreationTimeAttributes({ files: selectedFiles });
};
+
+const setBulkFavorite = async (files: EnteFile []) => {
+ try {
+ await addMultipleToFavorites(files);
+ } catch (e) {
+ log.error("Could not add to favorites", e);
+ }
+}