import { useCallback, useEffect, useState } from 'react'; import { useAtelierClient } from '../lib/api'; import type { CollectionDetail, CollectionSummary } from '../lib/api'; export const useCollectionsManager = (openId?: string) => { const client = useAtelierClient(); const [collections, setCollections] = useState([]); const [detail, setDetail] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [draftName, setDraftName] = 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]); // The detail view is driven by the URL, so opening one is a navigation and this only follows it. useEffect(() => { if (!openId) { setDetail(null); return; } let cancelled = false; client .getCollection(openId) .then((data) => !cancelled && setDetail(data)) .catch((err: Error) => !cancelled && setError(err.message)); return () => { cancelled = true; }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [openId]); const create = async () => { const name = draftName.trim(); if (!name) return; try { await client.createCollection(name); setDraftName(''); await refresh(); } catch (err) { setError(err instanceof Error ? err.message : String(err)); } }; const remove = async (id: string) => { try { await client.deleteCollection(id); await refresh(); } catch (err) { setError(err instanceof Error ? err.message : String(err)); } }; const removeImage = async (collectionId: string, generationId: string) => { const { images } = await client.removeFromCollection(collectionId, generationId); setDetail((current) => (current ? { ...current, images } : current)); void refresh(); }; return { collections, detail, loading, error, draftName, setDraftName, create, remove, removeImage, refresh }; }; export type CollectionsManager = ReturnType;