import { RaceDetailsHeader } from '@/components/races/RaceDetailsHeader'; import { RaceResultsTable } from '@/components/races/RaceResultsTable'; import type { RaceResultsViewData } from '@/lib/view-data/RaceResultsViewData'; import { Box } from '@/ui/Box'; import { Container } from '@/ui/Container'; import { Grid } from '@/ui/Grid'; import { GridItem } from '@/ui/GridItem'; import { Icon } from '@/ui/Icon'; import { Stack } from '@/ui/Stack'; import { Text } from '@/ui/Text'; import { AlertTriangle, Trophy, Zap, type LucideIcon } from 'lucide-react'; export interface RaceResultsTemplateProps { viewData: RaceResultsViewData; isAdmin: boolean; isLoading: boolean; error?: Error | null; // Actions onBack: () => void; onImportResults: (results: unknown[]) => void; onPenaltyClick: (driver: { id: string; name: string }) => void; // UI State importing: boolean; importSuccess: boolean; importError: string | null; showImportForm: boolean; setShowImportForm: (show: boolean) => void; } export function RaceResultsTemplate({ viewData, isLoading, error, onBack, importSuccess, importError, }: RaceResultsTemplateProps) { const formatTime = (ms: number) => { const minutes = Math.floor(ms / 60000); const seconds = Math.floor((ms % 60000) / 1000); const milliseconds = Math.floor((ms % 1000) / 10); return `${minutes}:${seconds.toString().padStart(2, '0')}.${milliseconds.toString().padStart(2, '0')}`; }; if (isLoading) { return ( Loading results... ); } if (error && !viewData.raceTrack) { return ( {error?.message || 'Race not found'} Back to Schedule ); } return ( {importSuccess && ( Success! Results imported and standings updated. )} {importError && ( Error: {importError} )} Final Standings } fastestLapTime={viewData.fastestLapTime} penalties={viewData.penalties as unknown as never[]} /> Session Stats {viewData.penalties.length > 0 && ( Penalties {viewData.penalties.map((penalty, index) => ( {penalty.driverName || 'Unknown Driver'} {penalty.reason || penalty.type} ))} )} ); } function StatItem({ label, value, icon, color = 'text-white' }: { label: string, value: string | number, icon?: LucideIcon, color?: string }) { return ( {icon && } {label} {value} ); }