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}
);
}