import { useState } from 'react' import { useParams, useNavigate, Link } from 'react-router-dom' import { AdminTable, type Column } from '../../components/admin/AdminTable' import { RouteFormModal } from '../../components/admin/RouteFormModal' import { DeleteConfirmModal } from '../../components/admin/DeleteConfirmModal' import { useGame } from '../../hooks/useGames' import { useCreateRoute, useUpdateRoute, useDeleteRoute, useReorderRoutes, } from '../../hooks/useAdmin' import type { Route as GameRoute, CreateRouteInput, UpdateRouteInput } from '../../types' export function AdminGameDetail() { const { gameId } = useParams<{ gameId: string }>() const navigate = useNavigate() const id = Number(gameId) const { data: game, isLoading } = useGame(id) const createRoute = useCreateRoute(id) const updateRoute = useUpdateRoute(id) const deleteRoute = useDeleteRoute(id) const reorderRoutes = useReorderRoutes(id) const [showCreate, setShowCreate] = useState(false) const [editing, setEditing] = useState(null) const [deleting, setDeleting] = useState(null) if (isLoading) return
Loading...
if (!game) return
Game not found
const routes = game.routes ?? [] const moveRoute = (route: GameRoute, direction: 'up' | 'down') => { const idx = routes.findIndex((r) => r.id === route.id) if (direction === 'up' && idx <= 0) return if (direction === 'down' && idx >= routes.length - 1) return const swapIdx = direction === 'up' ? idx - 1 : idx + 1 const newRoutes = routes.map((r, i) => { if (i === idx) return { id: r.id, order: routes[swapIdx].order } if (i === swapIdx) return { id: r.id, order: routes[idx].order } return { id: r.id, order: r.order } }) reorderRoutes.mutate(newRoutes) } const columns: Column[] = [ { header: 'Order', accessor: (r) => r.order, className: 'w-16' }, { header: 'Name', accessor: (r) => r.name }, { header: 'Actions', className: 'w-48', accessor: (r) => { const idx = routes.findIndex((rt) => rt.id === r.id) return (
e.stopPropagation()}>
) }, }, ] return (

{game.name}

{game.region} · Gen {game.generation} {game.releaseYear ? ` \u00b7 ${game.releaseYear}` : ''}

Routes ({routes.length})

navigate(`/admin/games/${id}/routes/${r.id}`)} keyFn={(r) => r.id} /> {showCreate && ( 0 ? Math.max(...routes.map((r) => r.order)) + 1 : 1} onSubmit={(data) => createRoute.mutate(data as CreateRouteInput, { onSuccess: () => setShowCreate(false), }) } onClose={() => setShowCreate(false)} isSubmitting={createRoute.isPending} /> )} {editing && ( updateRoute.mutate( { routeId: editing.id, data: data as UpdateRouteInput }, { onSuccess: () => setEditing(null) }, ) } onClose={() => setEditing(null)} isSubmitting={updateRoute.isPending} /> )} {deleting && ( deleteRoute.mutate(deleting.id, { onSuccess: () => setDeleting(null), }) } onCancel={() => setDeleting(null)} isDeleting={deleteRoute.isPending} /> )}
) }