import { useState, useMemo } from 'react' import { useNavigate } from 'react-router-dom' import { AdminTable, type Column } from '../../components/admin/AdminTable' import { DeleteConfirmModal } from '../../components/admin/DeleteConfirmModal' import { useGenlockes } from '../../hooks/useGenlockes' import { useDeleteGenlocke } from '../../hooks/useAdmin' import type { GenlockeListItem } from '../../types/game' export function AdminGenlockes() { const { data: genlockes = [], isLoading } = useGenlockes() const deleteGenlocke = useDeleteGenlocke() const navigate = useNavigate() const [deleting, setDeleting] = useState(null) const [statusFilter, setStatusFilter] = useState('') const [ownerFilter, setOwnerFilter] = useState('') const filtered = useMemo(() => { let result = genlockes if (statusFilter) result = result.filter((g) => g.status === statusFilter) if (ownerFilter) { if (ownerFilter === '__none__') { result = result.filter((g) => !g.owner) } else { result = result.filter((g) => g.owner?.id === ownerFilter) } } return result }, [genlockes, statusFilter, ownerFilter]) const genlockeOwners = useMemo(() => { const owners = new Map() let hasUnowned = false for (const g of genlockes) { if (g.owner) { owners.set(g.owner.id, g.owner.displayName ?? g.owner.id) } else { hasUnowned = true } } const sorted = [...owners.entries()].sort((a, b) => a[1].localeCompare(b[1])) return { owners: sorted, hasUnowned } }, [genlockes]) const columns: Column[] = [ { header: 'Name', accessor: (g) => g.name, sortKey: (g) => g.name }, { header: 'Owner', accessor: (g) => ( {g.owner?.displayName ?? g.owner?.id ?? 'No owner'} ), sortKey: (g) => g.owner?.displayName ?? g.owner?.id ?? '', }, { header: 'Status', accessor: (g) => ( {g.status} ), sortKey: (g) => g.status, }, { header: 'Legs', accessor: (g) => `${g.completedLegs} / ${g.totalLegs}`, sortKey: (g) => g.totalLegs, }, { header: 'Created', accessor: (g) => new Date(g.createdAt).toLocaleDateString(), sortKey: (g) => g.createdAt, }, ] return (

Genlockes

{(statusFilter || ownerFilter) && ( )} {filtered.length} genlockes
g.id} onRowClick={(g) => navigate(`/admin/genlockes/${g.id}`)} /> {deleting && ( deleteGenlocke.mutate(deleting.id, { onSuccess: () => setDeleting(null), }) } onCancel={() => setDeleting(null)} isDeleting={deleteGenlocke.isPending} /> )}
) }