'use client'; import { useState, useEffect } from 'react'; import { useRouter, useParams } from 'next/navigation'; import Button from '@/components/ui/Button'; import Card from '@/components/ui/Card'; import FeatureLimitationTooltip from '@/components/alpha/FeatureLimitationTooltip'; import { Race } from '@/domain/entities/Race'; import { League } from '@/domain/entities/League'; import { getRaceRepository, getLeagueRepository } from '@/lib/di-container'; import CompanionStatus from '@/components/alpha/CompanionStatus'; import CompanionInstructions from '@/components/alpha/CompanionInstructions'; export default function RaceDetailPage() { const router = useRouter(); const params = useParams(); const raceId = params.id as string; const [race, setRace] = useState(null); const [league, setLeague] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [cancelling, setCancelling] = useState(false); const loadRaceData = async () => { try { const raceRepo = getRaceRepository(); const leagueRepo = getLeagueRepository(); const raceData = await raceRepo.findById(raceId); if (!raceData) { setError('Race not found'); setLoading(false); return; } setRace(raceData); // Load league data const leagueData = await leagueRepo.findById(raceData.leagueId); setLeague(leagueData); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load race'); } finally { setLoading(false); } }; useEffect(() => { loadRaceData(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [raceId]); const handleCancelRace = async () => { if (!race || race.status !== 'scheduled') return; const confirmed = window.confirm( 'Are you sure you want to cancel this race? This action cannot be undone.' ); if (!confirmed) return; setCancelling(true); try { const raceRepo = getRaceRepository(); const cancelledRace = race.cancel(); await raceRepo.update(cancelledRace); setRace(cancelledRace); } catch (err) { alert(err instanceof Error ? err.message : 'Failed to cancel race'); } finally { setCancelling(false); } }; const formatDate = (date: Date) => { return new Date(date).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', }); }; const formatTime = (date: Date) => { return new Date(date).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', timeZoneName: 'short', }); }; const formatDateTime = (date: Date) => { return new Date(date).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit', timeZoneName: 'short', }); }; const statusColors = { scheduled: 'bg-primary-blue/20 text-primary-blue border-primary-blue/30', completed: 'bg-green-500/20 text-green-400 border-green-500/30', cancelled: 'bg-gray-500/20 text-gray-400 border-gray-500/30', }; if (loading) { return (
Loading race details...
); } if (error || !race) { return (
{error || 'Race not found'}
); } return (
{/* Breadcrumb */}
{/* Companion Status */}
{/* Race Header */}

{race.track}

{league && (

{league.name}

)}
{race.status.charAt(0).toUpperCase() + race.status.slice(1)}
{/* Companion Instructions for Scheduled Races */} {race.status === 'scheduled' && (
)}
{/* Race Details */}

Race Details

{/* Date & Time */}

{formatDateTime(race.scheduledAt)}

{formatDate(race.scheduledAt)} {formatTime(race.scheduledAt)}
{/* Track */}

{race.track}

{/* Car */}

{race.car}

{/* Session Type */}

{race.sessionType}

{/* League */}
{league ? ( ) : (

ID: {race.leagueId.slice(0, 8)}...

)}
{/* Actions */}

Actions

{race.status === 'completed' && ( )} {race.status === 'scheduled' && ( )}
); }