// components/live/LiveTrackMap.tsx 'use client'; import { useEffect, useState } from 'react'; import { getTrackMapUrl, cleanTrackName, cleanTrackConfig } from '@/lib/trackUtils'; interface Car { carID: number; driver_name: string; car_model: string; normalizedSplinePos: number; position: number; lap_time?: number; best_lap_time?: number; } interface LiveTrackMapProps { track: string; trackConfig: string; cars: Car[]; } export default function LiveTrackMap({ track, trackConfig, cars }: LiveTrackMapProps) { const [imageError, setImageError] = useState(false); // Get cleaned track map URL const trackMapUrl = getTrackMapUrl(track, trackConfig); const displayTrackName = cleanTrackName(track); const displayTrackConfig = cleanTrackConfig(trackConfig); // Calculate position on track (circular approximation) const getCarPosition = (normalizedPos: number) => { // normalizedPos is 0.0 to 1.0 around the track // We'll place cars in a circular path for now const angle = normalizedPos * Math.PI * 2 - Math.PI / 2; // Start at top // Position relative to center (percentage) const centerX = 50; const centerY = 50; const radius = 40; // 40% from center const x = centerX + Math.cos(angle) * radius; const y = centerY + Math.sin(angle) * radius; return { x, y }; }; // Get color based on position const getPositionColor = (position: number) => { if (position === 1) return '#ffffff'; // P1 - White if (position === 2) return '#d1d5db'; // P2 - Light gray if (position === 3) return '#9ca3af'; // P3 - Gray return '#6b7280'; // Others - Dark gray }; return (
{/* Track Map Background */} {!imageError ? ( {`${track} setImageError(true)} /> ) : (
Track map not available
)} {/* Grid overlay for reference */}
{/* Car Positions */}
{cars.map((car) => { const pos = getCarPosition(car.normalizedSplinePos); const color = getPositionColor(car.position); return (
{/* Car dot */}
{/* Position number */}
P{car.position}
{/* Driver name on hover */}
{car.driver_name}
); })}
{/* Track info overlay */}
TRACK
{track}
{trackConfig && trackConfig !== 'default' && (
{trackConfig}
)}
{/* Live indicator */}
LIVE
); }