import type { Selection } from './useSelection'; import { Archive, ArchiveRestore, Heart, Plus, Trash2, Undo2, X } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useAlbums } from './usePhotosData'; import { useAssetActions } from './useAssetActions'; // The bar that replaces the header once anything is selected — Immich does the same, and it keeps the // destructive buttons off screen entirely until they have something to act on. type SelectionBarProps = { selection: Selection; /** Trash swaps the whole action set: restore and delete-forever, not favorite and archive. */ inTrash?: boolean; /** When viewing one album, offer "remove from album" alongside the library-wide actions. */ albumId?: string; /** Currently in the archive view, so the archive button should read "unarchive". */ archived?: boolean; }; export const SelectionBar = ({ selection, inTrash = false, albumId, archived = false }: SelectionBarProps) => { const { ids, count, clear, selectAll } = selection; const { setFavorite, setArchived, trash, restore, deleteForever, addToAlbum, removeFromAlbum, createAlbum } = useAssetActions(); const { data: albums } = useAlbums(); const run = (action: () => void) => { action(); clear(); }; return (
{count} selected
{inTrash ? ( <> ) : ( <> { const albumName = window.prompt('New album name'); if (albumName) run(() => createAlbum.mutate({ albumName, assetIds: ids })); }} > New album {albums && albums.length > 0 && } {albums?.map((album) => ( run(() => addToAlbum.mutate({ albumId: album.id, ids }))} > {album.albumName} ))} {albumId && ( )} )}
); };