import { useState, useMemo } from 'react' import { AdminTable, type Column } from '../../components/admin/AdminTable' import { GameFormModal } from '../../components/admin/GameFormModal' import { useGames } from '../../hooks/useGames' import { useCreateGame, useUpdateGame, useDeleteGame, } from '../../hooks/useAdmin' import { exportGames } from '../../api/admin' import { downloadJson } from '../../utils/download' import type { Game, CreateGameInput, UpdateGameInput } from '../../types' export function AdminGames() { const { data: games = [], isLoading } = useGames() const createGame = useCreateGame() const updateGame = useUpdateGame() const deleteGame = useDeleteGame() const [showCreate, setShowCreate] = useState(false) const [editing, setEditing] = useState(null) const [regionFilter, setRegionFilter] = useState('') const [genFilter, setGenFilter] = useState('') const regions = useMemo( () => [...new Set(games.map((g) => g.region))].sort(), [games] ) const generations = useMemo( () => [...new Set(games.map((g) => g.generation))].sort((a, b) => a - b), [games] ) const filteredGames = useMemo(() => { let result = games if (regionFilter) result = result.filter((g) => g.region === regionFilter) if (genFilter) result = result.filter((g) => g.generation === Number(genFilter)) return result }, [games, regionFilter, genFilter]) const columns: Column[] = [ { header: 'Name', accessor: (g) => g.name }, { header: 'Slug', accessor: (g) => g.slug }, { header: 'Region', accessor: (g) => g.region, sortKey: (g) => g.region }, { header: 'Gen', accessor: (g) => g.generation, sortKey: (g) => g.generation, }, { header: 'Year', accessor: (g) => g.releaseYear ?? '-', sortKey: (g) => g.releaseYear ?? 0, }, ] return (

Games

{(regionFilter || genFilter) && ( )} {filteredGames.length} games
setEditing(g)} keyFn={(g) => g.id} /> {showCreate && ( createGame.mutate(data as CreateGameInput, { onSuccess: () => setShowCreate(false), }) } onClose={() => setShowCreate(false)} isSubmitting={createGame.isPending} /> )} {editing && ( updateGame.mutate( { id: editing.id, data: data as UpdateGameInput }, { onSuccess: () => setEditing(null) } ) } onClose={() => setEditing(null)} isSubmitting={updateGame.isPending} onDelete={() => deleteGame.mutate(editing.id, { onSuccess: () => setEditing(null), }) } isDeleting={deleteGame.isPending} detailUrl={`/admin/games/${editing.id}`} /> )}
) }