import { useState, useEffect, useCallback } from 'react' import { listCollections, createCollection, getCollection } from '../api.js' const VIS_LABELS = { 0: 'Private', 1: 'Public', 2: 'Users only', 3: 'Public' } export default function CollectionsView({ archiveId }) { const [collections, setCollections] = useState([]) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const [selectedColl, setSelectedColl] = useState(null) const [collDetail, setCollDetail] = useState(null) const [detailLoading, setDetailLoading] = useState(false) // Create form const [newName, setNewName] = useState('') const [newSlug, setNewSlug] = useState('') const [newVis, setNewVis] = useState(2) const [creating, setCreating] = useState(false) const [createError, setCreateError] = useState(null) const refresh = useCallback(async () => { if (!archiveId) return setLoading(true) setError(null) try { const cols = await listCollections(archiveId) setCollections(cols) } catch (e) { setError(e.message) } finally { setLoading(false) } }, [archiveId]) useEffect(() => { refresh() }, [refresh]) useEffect(() => { if (!selectedColl) { setCollDetail(null); return } setDetailLoading(true) getCollection(archiveId, selectedColl.collection_uid) .then(d => setCollDetail(d)) .catch(e => setError(e.message)) .finally(() => setDetailLoading(false)) }, [selectedColl, archiveId]) async function handleCreate(e) { e.preventDefault() const name = newName.trim() const slug = newSlug.trim() if (!name || !slug) return setCreating(true) setCreateError(null) try { await createCollection(archiveId, name, slug, newVis) setNewName('') setNewSlug('') setNewVis(2) await refresh() } catch (err) { setCreateError(err.message) } finally { setCreating(false) } } if (!archiveId) return
Select an archive.
return (

Collections

{loading &&
Loading…
} {error &&
{error}
}
{collections.map(c => (
setSelectedColl(c)} > {c.name} {VIS_LABELS[c.default_visibility_bits] ?? c.default_visibility_bits}
))} {collections.length === 0 && !loading && (
No collections yet.
)}
{selectedColl && (

{selectedColl.name}

Default visibility: {VIS_LABELS[selectedColl.default_visibility_bits] ?? selectedColl.default_visibility_bits}
{detailLoading ? (
Loading entries…
) : collDetail ? ( collDetail.entries.length === 0 ? (
No entries visible to you in this collection.
) : (
    {collDetail.entries.map(entry => (
  • {entry.title || entry.entry_uid} {entry.source_kind}
  • ))}
) ) : null}
)}
Create collection
{createError &&
{createError}
}
) }