'use client'; import { useState, useEffect } from 'react'; import { useRouter, useParams } from 'next/navigation'; import { ArrowLeft, Zap, Trophy, Users, Clock, Calendar } from 'lucide-react'; import Button from '@/components/ui/Button'; import Card from '@/components/ui/Card'; import Breadcrumbs from '@/components/layout/Breadcrumbs'; import ResultsTable from '@/components/races/ResultsTable'; import ImportResultsForm from '@/components/races/ImportResultsForm'; import QuickPenaltyModal from '@/components/leagues/QuickPenaltyModal'; import { raceResultsService } from '@/lib/services/races/RaceResultsService'; import { useEffectiveDriverId } from '@/lib/currentDriver'; import { isLeagueAdminOrHigherRole } from '@/lib/leagueRoles'; import type { RaceResultsDetailViewModel } from '@/lib/view-models'; export default function RaceResultsPage() { const router = useRouter(); const params = useParams(); const raceId = params.id as string; const currentDriverId = useEffectiveDriverId(); const [raceData, setRaceData] = useState(null); const [raceSOF, setRaceSOF] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [importing, setImporting] = useState(false); const [importSuccess, setImportSuccess] = useState(false); const [isAdmin, setIsAdmin] = useState(false); const [showQuickPenaltyModal, setShowQuickPenaltyModal] = useState(false); const [preSelectedDriver, setPreSelectedDriver] = useState<{ id: string; name: string } | undefined>(undefined); const loadData = async () => { try { const raceData = await raceResultsService.getResultsDetail(raceId, currentDriverId); setRaceData(raceData); setError(null); try { const sofData = await raceResultsService.getWithSOF(raceId); setRaceSOF(sofData.strengthOfField); } catch (sofErr) { console.error('Failed to load SOF:', sofErr); } } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load race data'); setRaceData(null); } finally { setLoading(false); } }; useEffect(() => { loadData(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [raceId]); useEffect(() => { if (raceData?.league?.id && currentDriverId) { const checkAdmin = async () => { // For now, assume admin check - this might need to be updated based on API setIsAdmin(true); // TODO: Implement proper admin check via API }; checkAdmin(); } }, [raceData?.league?.id, currentDriverId]); const handleImportSuccess = async (importedResults: any[]) => { setImporting(true); setError(null); try { await raceResultsService.importRaceResults(raceId, { resultsFileContent: JSON.stringify(importedResults), // Assuming the API expects JSON string }); setImportSuccess(true); await loadData(); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to import results'); } finally { setImporting(false); } }; const handleImportError = (errorMessage: string) => { setError(errorMessage); }; const handlePenaltyClick = (driver: { id: string; name: string }) => { setPreSelectedDriver(driver); setShowQuickPenaltyModal(true); }; const handleCloseQuickPenaltyModal = () => { setShowQuickPenaltyModal(false); setPreSelectedDriver(undefined); }; if (loading) { return (
Loading results...
); } if (error && !raceData) { return (
{error || 'Race not found'}
{showQuickPenaltyModal && ( )}
); } const hasResults = raceData?.results.length ?? 0 > 0; const breadcrumbItems = [ { label: 'Races', href: '/races' }, ...(raceData?.league ? [{ label: raceData.league.name, href: `/leagues/${raceData.league.id}` }] : []), ...(raceData?.race ? [{ label: raceData.race.track, href: `/races/${raceData.race.id}` }] : []), { label: 'Results' }, ]; return (
Final Results
{raceSOF && ( SOF {raceSOF} )}

{raceData?.race?.track ?? 'Race'} Results

{raceData?.race && ( <> {new Date(raceData.race.scheduledAt).toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric', })} {raceData.stats.totalDrivers} drivers classified )} {raceData?.league && {raceData.league.name}}
{importSuccess && (
Success! Results imported and standings updated.
)} {error && (
Error: {error}
)} {hasResults && raceData ? ( ) : ( <>

Import Results

No results imported. Upload CSV to test the standings system.

{importing ? (
Importing results and updating standings...
) : ( )} )}
); }