import { teamColor } from '../../utils' import type { LiveStintData } from '../../types' import type { LiveTimingRow } from '../../lib/live' import { driverCode, positionDelta, positionDeltaClass, tyreClass, tyreLabel, } from '../../lib/live' import type { GapHistoryMap } from '../../lib/gapHistory' import { GapSparkline } from './GapSparkline' import { StintHistory } from './StintHistory' interface Props { rows: LiveTimingRow[] stints?: Record history?: GapHistoryMap battleNumbers?: Set pinned?: string[] onTogglePin?: (racingNumber: string) => void } function posClass(pos: number): string { if (pos === 1) return 'pos-p1' if (pos === 2) return 'pos-p2' if (pos === 3) return 'pos-p3' return 'pos-n' } export function TimingTower({ rows, stints, history, battleNumbers, pinned, onTogglePin, }: Props) { if (rows.length === 0) { return (
Live timing is connected, but no driver timing rows have arrived yet.
) } return (
{rows.map((row) => { const driver = row.Driver const delta = positionDelta(driver) const deltaClass = positionDeltaClass(driver) const isPinned = pinned?.includes(row.RacingNumber) ?? false const inBattle = battleNumbers?.has(row.RacingNumber) ?? false return ( onTogglePin(row.RacingNumber) : undefined} title={onTogglePin ? (isPinned ? 'Click to unpin' : 'Click to pin (max 3)') : undefined} > ) })}
Pos Δ Driver Tyre Last Lap Gap Trend Best Stints Laps
{row.Position} {delta}
{driverCode(row)} {row.RacingNumber} {isPinned && } {driver.InPit && PIT} {driver.PitOut && !driver.InPit && OUT} {driver.Retired && RET} {driver.KnockedOut && KO} {driver.Cutoff && !driver.KnockedOut && CUT} {driver.OnFlyingLap && FL}
{tyreLabel(row.Tyre)} {driver.LastLapTime || '-'} {driver.GapToLeader || driver.Interval || '-'} {driver.BestLapTime || '-'} {driver.NumberOfLaps || '-'}
) }