import { useState } from 'react' import { useQuery } from '@tanstack/react-query' import { useNavigate } from '@tanstack/react-router' import { fetchRaceHub } from '../api' import { RaceHubHeader } from '../components/RaceHubHeader' import { DatasetStrip } from '../components/DatasetStrip' import { ClassificationTable } from '../components/ClassificationTable' import { StartingGridTable } from '../components/StartingGridTable' interface Props { sessionKey: number } export function RaceHubPage({ sessionKey }: Props) { const navigate = useNavigate() const [inputVal, setInputVal] = useState(sessionKey > 0 ? String(sessionKey) : '') const { data, isLoading, isError, error } = useQuery({ queryKey: ['race-hub', sessionKey], queryFn: () => fetchRaceHub(sessionKey), enabled: sessionKey > 0, staleTime: 30_000, }) function handleLoad(e: React.FormEvent) { e.preventDefault() const key = parseInt(inputVal, 10) if (key > 0) { navigate({ to: '/race-hub', search: { session_key: key } }) } } return (
{/* Session key input */}
setInputVal(e.target.value)} /> {sessionKey > 0 && ( key {sessionKey} )}
{/* Prompt when no key entered */} {sessionKey === 0 && (
Enter a session key to load Race Hub data
Example: 9472 (Monaco GP 2025 Race)
Ingest data first with{' '} box-box --ingest-session <key>
)} {/* Loading */} {sessionKey > 0 && isLoading && (
loading session {sessionKey}…
)} {/* Error */} {isError && (
{error instanceof Error ? error.message : 'Failed to load race hub data'}
)} {/* Data */} {data && ( <>
Final Classification {data.results.length > 0 && ( {data.results.length} drivers )}
Starting Grid {data.starting_grid.length > 0 && ( {data.starting_grid.length} positions )}
)}
) }