"use client"; import * as React from "react"; import { useAdminQuery } from "@/components/admin/use-query"; import type { AchievementsResponse } from "@/components/admin/types"; import { PageHeader, RefreshButton, Panel, ErrorState, TableSkeleton, StatGrid, StatTile } from "@/components/admin/primitives"; import { ProgressionTable, type ProgressionItem } from "@/components/admin/progression-table"; import { int, num, sc } from "@/components/admin/format"; import { cn } from "@/lib/utils"; export default function AdminAchievementsPage() { const q = useAdminQuery("/api/admin/achievements"); const d = q.data; const items = React.useMemo(() => { if (!d) return []; const u = new Map(d.unlocks.map((r) => [r.achievement_key, num(r.n)])); return d.achievements.map((a) => { const unlocks = u.get(a.key) ?? 0; return { key: a.key, name: a.name, description: a.description, target: num(a.target), rewardCredits: a.rewardCredits, rewardXp: a.rewardXp, enabled: a.enabled, metric: a.metric, tag: a.category, stats: [ { label: "Unlocks", value: int(unlocks) }, { label: "SC paid", value: sc(unlocks * a.rewardCredits) }, ], }; }); }, [d]); const totals = d ? { total: d.achievements.length, enabled: d.achievements.filter((a) => a.enabled).length, unlocks: d.unlocks.reduce((a, r) => a + num(r.n), 0), paid: d.achievements.reduce((a, r) => a + r.rewardCredits * num(d.unlocks.find((x) => x.achievement_key === r.key)?.n ?? 0), 0) } : null; return ( <> void q.refresh()} loading={q.refreshing} />} /> {totals ? ( ) : null} {q.error && !d ? (
void q.refresh()} />
) : !d ? ( ) : ( void q.refresh()} statHeaders={["Unlocks", "SC paid"]} /> )}
); }