From db3fcdf61a6201fb0048ef2a8a826c29b2305cb2 Mon Sep 17 00:00:00 2001 From: priyanshuuu777 Date: Wed, 19 Aug 2026 10:56:47 +0530 Subject: [PATCH 1/2] feat: add album detail share action --- frontend/src/pages/Album/AlbumDetail.tsx | 44 ++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/Album/AlbumDetail.tsx b/frontend/src/pages/Album/AlbumDetail.tsx index c65e1e856..0d778ec3c 100644 --- a/frontend/src/pages/Album/AlbumDetail.tsx +++ b/frontend/src/pages/Album/AlbumDetail.tsx @@ -2,17 +2,24 @@ import { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { useParams, useNavigate, useLocation } from 'react-router'; import { Button } from '@/components/ui/button'; -import { ArrowLeft, Plus, Trash2 } from 'lucide-react'; +import { ArrowLeft, Plus, Share2, Trash2 } from 'lucide-react'; import { ImageCard } from '@/components/Media/ImageCard'; import { MediaView } from '@/components/Media/MediaView'; import { AddImagesToAlbumDialog } from '@/components/Albums/AddImagesToAlbumDialog'; -import { usePictoQuery, usePictoMutation } from '@/hooks/useQueryExtension'; +import { ShareAlbumDialog } from '@/components/Albums/ShareAlbumDialog'; +import { + usePictoQuery, + usePictoMutation, + type BackendRes, +} from '@/hooks/useQueryExtension'; import { getAlbumById, getAlbumImages, + getShares, removeMultipleImagesFromAlbum, fetchAllImages, } from '@/api/api-functions'; +import { Share } from '@/types/Share'; import { setSelectedAlbum, setAlbumImages, @@ -52,6 +59,7 @@ export const AlbumDetail = () => { const isImageViewOpen = useSelector(selectIsImageViewOpen); const [isAddImagesDialogOpen, setIsAddImagesDialogOpen] = useState(false); + const [isShareDialogOpen, setIsShareDialogOpen] = useState(false); const [selectedImages, setSelectedImages] = useState>(new Set()); const [isSelectionMode, setIsSelectionMode] = useState(false); @@ -88,6 +96,21 @@ export const AlbumDetail = () => { // carries their details. const isLoadingContent = isLoadingImages || isLoadingAllImages; + // Shares are held in memory on the backend, so this is the source of truth + // for whether this album is currently being served on the local network. + const { successData: allShares, refetch: refetchShares } = usePictoQuery< + BackendRes, + unknown, + Share[] + >({ + queryKey: ['shares'], + queryFn: () => getShares(), + }); + + const albumShares = (allShares ?? []).filter( + (share) => share.album_id === albumId, + ); + const removeImagesMutation = usePictoMutation({ mutationFn: ({ albumId, @@ -286,6 +309,14 @@ export const AlbumDetail = () => { Select Images )} +