import { useCallback, useEffect, useMemo, useState } from 'react'; import { api, formatCredits, centsJson, toCentsBigInt } from '../api'; import ImageField from './ImageField'; const emptyCase = { name: '', price: 100, imageUrl: '', active: true }; export default function AdminCases() { const [cases, setCases] = useState([]); const [error, setError] = useState(''); const [query, setQuery] = useState(''); const [caseForm, setCaseForm] = useState(emptyCase); const [editingId, setEditingId] = useState(null); const [edit, setEdit] = useState(null); const load = useCallback(async () => { const data = await api.adminCases(); setCases(data.cases); }, []); useEffect(() => { load().catch((err) => setError(err.message)); }, [load]); const filtered = useMemo(() => { const q = query.trim().toLowerCase(); if (!q) return cases; return cases.filter((c) => c.name.toLowerCase().includes(q)); }, [cases, query]); const startEdit = (c) => { setEditingId(c.id); setEdit({ name: c.name, price: c.price, imageUrl: c.imageUrl || '', active: c.active, }); }; return (

Cases

{cases.length} crates · create, enable, price & art

setQuery(e.target.value)} />
{error &&
{error}
}

Create case

{ e.preventDefault(); setError(''); try { await api.createCase({ ...caseForm, price: centsJson(toCentsBigInt(caseForm.price)) }); setCaseForm(emptyCase); await load(); } catch (err) { setError(err.message); } }} >
{filtered.map((c) => (
{editingId === c.id && edit ? (
{ e.preventDefault(); setError(''); try { await api.updateCase(editingId, { name: edit.name, price: centsJson(toCentsBigInt(edit.price)), imageUrl: edit.imageUrl, active: edit.active, }); setEditingId(null); setEdit(null); await load(); } catch (err) { setError(err.message); } }} >

Edit #{c.id}

) : ( <>
{c.imageUrl ? (
) : (
)}
{c.name}
{formatCredits(c.price)} cr · {c.items.length} drops ·{' '} {c.active ? 'active' : 'inactive'}
)}
))}
); }