'use client'; import { LeaderboardDriver, LeaderboardTrack, PointsEntry, ResultValue } from '@/lib/schemas/leaderboard'; interface ResultInputProps { value: ResultValue; pointsTable: PointsEntry[]; onChange: (value: ResultValue) => void; } function ResultInput({ value, pointsTable, onChange }: ResultInputProps) { const knownPoints = Array.from(new Set(pointsTable.map((e) => e.points))).sort((a, b) => b - a); const handleChange = (raw: string) => { if (raw === 'DNF') return onChange('DNF'); if (raw === 'DNS') return onChange('DNS'); onChange(parseInt(raw) || 0); }; return ( ); } interface TracksEditorProps { tracks: LeaderboardTrack[]; drivers: LeaderboardDriver[]; pointsTable: PointsEntry[]; onChange: (tracks: LeaderboardTrack[]) => void; } export function TracksEditor({ tracks, drivers, pointsTable, onChange }: TracksEditorProps) { const updateTrack = (index: number, patch: Partial) => { onChange(tracks.map((t, i) => (i === index ? { ...t, ...patch } : t))); }; const updateResult = (trackIndex: number, driverIndex: number, value: ResultValue) => { const newResults = [...tracks[trackIndex].results]; newResults[driverIndex] = value; updateTrack(trackIndex, { results: newResults }); }; const removeTrack = (index: number) => { onChange(tracks.filter((_, i) => i !== index)); }; const addTrack = () => { onChange([ ...tracks, { name: `Race ${tracks.length + 1}`, results: drivers.map(() => 'DNS' as const), fastestLapInitials: '' } ]); }; return (
{tracks.map((track, ti) => (
updateTrack(ti, { name: e.target.value })} className="flex-1 rounded bg-gray-600 px-2 py-1 text-sm font-semibold text-white" placeholder="Track name" />
{drivers.length === 0 ? (

Add drivers first to enter results.

) : (
{drivers.map((driver, di) => (
{driver.name}
updateResult(ti, di, v)} />
))}
)}
))}
); }