'use client';
import React from 'react';
import { Breadcrumbs } from '@/ui/Breadcrumbs';
import { RaceStewardingStats } from '@/ui/RaceStewardingStats';
import { StewardingTabs } from '@/ui/StewardingTabs';
import { ProtestCard } from '@/ui/ProtestCardWrapper';
import { RacePenaltyRow } from '@/ui/RacePenaltyRowWrapper';
import { Card } from '@/ui/Card';
import { Box } from '@/ui/Box';
import { Stack } from '@/ui/Stack';
import { Text } from '@/ui/Text';
import { Heading } from '@/ui/Heading';
import { Button } from '@/ui/Button';
import { Container } from '@/ui/Container';
import { Icon } from '@/ui/Icon';
import { Surface } from '@/ui/Surface';
import {
AlertTriangle,
ArrowLeft,
CheckCircle,
Flag,
Gavel,
Scale,
} from 'lucide-react';
import type { RaceStewardingViewData } from '@/lib/view-data/races/RaceStewardingViewData';
export type StewardingTab = 'pending' | 'resolved' | 'penalties';
interface RaceStewardingTemplateProps {
viewData: RaceStewardingViewData;
isLoading: boolean;
error?: Error | null;
// Actions
onBack: () => void;
onReviewProtest: (protestId: string) => void;
// User state
isAdmin: boolean;
// UI State
activeTab: StewardingTab;
setActiveTab: (tab: StewardingTab) => void;
}
export function RaceStewardingTemplate({
viewData,
isLoading,
onBack,
onReviewProtest,
isAdmin,
activeTab,
setActiveTab,
}: RaceStewardingTemplateProps) {
const formatDate = (date: string) => {
return new Date(date).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
});
};
if (isLoading) {
return (
Loading stewarding data...
);
}
if (!viewData?.race) {
return (
Race not found
The race you're looking for doesn't exist.
);
}
const breadcrumbItems = [
{ label: 'Races', href: '/races' },
{ label: viewData.race.track, href: `/races/${viewData.race.id}` },
{ label: 'Stewarding' },
];
return (
{/* Navigation */}
}
>
Back to Race
{/* Header */}
Stewarding
{viewData.race.track} • {formatDate(viewData.race.scheduledAt)}
{/* Stats */}
{/* Tab Navigation */}
{/* Content */}
{activeTab === 'pending' && (
{viewData.pendingProtests.length === 0 ? (
All Clear!
No pending protests to review
) : (
viewData.pendingProtests.map((protest) => (
))
)}
)}
{activeTab === 'resolved' && (
{viewData.resolvedProtests.length === 0 ? (
No Resolved Protests
Resolved protests will appear here
) : (
viewData.resolvedProtests.map((protest) => (
))
)}
)}
{activeTab === 'penalties' && (
{viewData.penalties.length === 0 ? (
No Penalties
Penalties issued for this race will appear here
) : (
viewData.penalties.map((penalty) => (
))
)}
)}
);
}