import { useState } from 'react' import { useParams, Link } from 'react-router-dom' import { useRun } from '../hooks/useRuns' import { useGameRoutes } from '../hooks/useGames' import { useUpdateEncounter } from '../hooks/useEncounters' import { StatCard, PokemonCard, RuleBadges, StatusChangeModal } from '../components' import type { RunStatus, EncounterDetail } from '../types' const statusStyles: Record = { active: 'bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-300', completed: 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300', failed: 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-300', } export function RunDashboard() { const { runId } = useParams<{ runId: string }>() const runIdNum = Number(runId) const { data: run, isLoading, error } = useRun(runIdNum) const { data: routes } = useGameRoutes(run?.gameId ?? null) const updateEncounter = useUpdateEncounter(runIdNum) const [selectedEncounter, setSelectedEncounter] = useState(null) if (isLoading) { return (
) } if (error || !run) { return (
Failed to load run. It may not exist.
Back to runs
) } const alive = run.encounters.filter( (e) => e.status === 'caught' && e.faintLevel === null, ) const dead = run.encounters.filter( (e) => e.status === 'caught' && e.faintLevel !== null, ) const visitedRoutes = new Set(run.encounters.map((e) => e.routeId)).size const totalRoutes = routes?.length return (
{/* Header */}
← All Runs

{run.name}

{run.game.name} · {run.game.region} · Started{' '} {new Date(run.startedAt).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric', })}

{run.status}
{/* Stats */}
{/* Rules */}

Active Rules

{/* Active Team */}

Active Team

{alive.length === 0 ? (

No pokemon caught yet

) : (
{alive.map((enc) => ( setSelectedEncounter(enc)} /> ))}
)}
{/* Graveyard */} {dead.length > 0 && (

Graveyard

{dead.map((enc) => ( setSelectedEncounter(enc)} /> ))}
)} {/* Quick Actions */}
Log Encounter
{/* Status Change Modal */} {selectedEncounter && ( { updateEncounter.mutate(data, { onSuccess: () => setSelectedEncounter(null), }) }} onClose={() => setSelectedEncounter(null)} isPending={updateEncounter.isPending} /> )}
) }