'use client'; import Breadcrumbs from '@/components/layout/Breadcrumbs'; import QuickPenaltyModal from '@/components/leagues/QuickPenaltyModal'; import ImportResultsForm from '@/components/races/ImportResultsForm'; import RaceResultsHeader from '@/components/races/RaceResultsHeader'; import ResultsTable from '@/components/races/ResultsTable'; import Button from '@/components/ui/Button'; import Card from '@/components/ui/Card'; import { useEffectiveDriverId } from '@/hooks/useEffectiveDriverId'; import { useRaceResultsDetail, useRaceWithSOF } from '@/hooks/useRaceService'; import { useLeagueMembership } from '@/hooks/useLeagueMembershipService'; import { LeagueRoleUtility } from '@/lib/utilities/LeagueRoleUtility'; import type { RaceResultsDetailViewModel } from '@/lib/view-models/RaceResultsDetailViewModel'; import { ArrowLeft, Calendar, Trophy, Users, Zap } from 'lucide-react'; import { useParams, useRouter } from 'next/navigation'; import { useState } from 'react'; export default function RaceResultsPage() { const router = useRouter(); const params = useParams(); const raceId = params.id as string; const currentDriverId = useEffectiveDriverId(); const { data: raceData, isLoading: loading, error } = useRaceResultsDetail(raceId, currentDriverId); const { data: sofData } = useRaceWithSOF(raceId); const { data: membership } = useLeagueMembership(raceData?.league?.id || '', currentDriverId); const [importing, setImporting] = useState(false); const [importSuccess, setImportSuccess] = useState(false); const [showQuickPenaltyModal, setShowQuickPenaltyModal] = useState(false); const [preSelectedDriver, setPreSelectedDriver] = useState<{ id: string; name: string } | undefined>(undefined); const [importError, setImportError] = useState(null); const raceSOF = sofData?.strengthOfField || null; const isAdmin = membership ? LeagueRoleUtility.isLeagueAdminOrHigherRole(membership.role) : false; const handleImportSuccess = async (importedResults: any[]) => { setImporting(true); setImportError(null); try { // TODO: Implement race results service // await raceResultsService.importRaceResults(raceId, { // resultsFileContent: JSON.stringify(importedResults), // Assuming the API expects JSON string // }); setImportSuccess(true); // await loadData(); } catch (err) { setImportError(err instanceof Error ? err.message : 'Failed to import results'); } finally { setImporting(false); } }; const handleImportError = (errorMessage: string) => { setImportError(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?.message || 'Race not found'}
); } 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 (
{importSuccess && (
Success! Results imported and standings updated.
)} {importError && (
Error: {importError}
)} {hasResults && raceData ? ( ) : ( <>

Import Results

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

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