import { useCallback, useEffect, useMemo, useState } from 'react'; import { useAtelierClient } from '../lib/api'; import type { CollectionSummary } from '../lib/api'; /** * The collection LIST — no detail view any more. * * A selected collection is rendered by the Gallery panel, which reads the same `?collection=` param. * This hook stopped fetching the detail when that moved: two panels both holding a copy of one * collection's images is two things to keep in step, and the narrow list has no use for them. */ export const useCollectionsManager = () => { const client = useAtelierClient(); const [collections, setCollections] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [query, setQuery] = useState(''); const refresh = useCallback(async () => { try { setCollections(await client.listCollections()); setError(null); } catch (err) { setError(err instanceof Error ? err.message : String(err)); } finally { setLoading(false); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { void refresh(); }, [refresh]); // Filtering happens here rather than server-side: the list is small enough that a round trip per // keystroke would be slower than the filter, and a search that cannot go stale needs no refresh. const visible = useMemo(() => { const needle = query.trim().toLowerCase(); if (!needle) return collections; return collections.filter((collection) => collection.name.toLowerCase().includes(needle)); }, [collections, query]); const guard = async (action: () => Promise) => { try { await action(); setError(null); await refresh(); return true; } catch (err) { setError(err instanceof Error ? err.message : String(err)); return false; } }; return { collections: visible, total: collections.length, loading, error, query, setQuery, refresh, create: (name: string) => guard(() => client.createCollection(name.trim())), rename: (id: string, name: string) => guard(() => client.renameCollection(id, name.trim())), remove: (id: string, deleteImages: boolean) => guard(() => client.deleteCollection(id, deleteImages)), }; }; export type CollectionsManager = ReturnType;