diff --git a/app/admin/claims/page.tsx b/app/admin/claims/page.tsx new file mode 100644 index 0000000..6b786e4 --- /dev/null +++ b/app/admin/claims/page.tsx @@ -0,0 +1,82 @@ +'use client'; + +import { useEffect, useMemo, useState } from 'react'; +import AdminGuard from '@/components/admin-guard'; +import { claimsApi, type AdminClaim } from '@/lib/api'; + +export default function AdminClaimsPage() { + return ( + + + + ); +} + +function ClaimsView() { + const [claims, setClaims] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + claimsApi.list().then((c) => setClaims(c)).finally(() => setLoading(false)); + }, []); + + const totals = useMemo(() => { + const byItem: Record = {}; + for (const c of claims) { + const k = c.itemId; + if (!byItem[k]) byItem[k] = { reserved: 0, total: c.itemQuantity }; + byItem[k].reserved += c.quantity; + } + return byItem; + }, [claims]); + + if (loading) { + return
Carregando…
; + } + + return ( +
+
+

Reservas

+
{claims.length} no total
+
+ + {claims.length === 0 ? ( +
Nenhuma reserva ainda.
+ ) : ( +
+ + + + + + + + + + + + {claims.map((c) => { + const t = totals[c.itemId]; + return ( + + + + + + + + ); + })} + +
ItemQtdConvidadoNotaQuando
+
{c.itemName}
+
+ {c.wishlistName} · {t.reserved}/{t.total} reservados +
+
{c.quantity}{c.guestName}{c.note ?? '—'}{new Date(c.claimedAt).toLocaleString('pt-BR')}
+
+ )} +
+ ); +} diff --git a/app/admin/page.tsx b/app/admin/page.tsx index ef21595..03ab387 100644 --- a/app/admin/page.tsx +++ b/app/admin/page.tsx @@ -142,6 +142,12 @@ function AdminPageContent() { subtitle="Manage your wishlists and items" actions={ <> + + Reservas + (response); + return data.claims; + }, +}; + // Wishlist types export interface Wishlist { id: string;