'use client'; import { PenaltyFAB } from '@/ui/PenaltyFAB'; import { QuickPenaltyModal } from '@/components/leagues/QuickPenaltyModal'; import { ReviewProtestModal } from '@/components/leagues/ReviewProtestModal'; import { StewardingStats } from '@/components/leagues/StewardingStats'; import { Button } from '@/ui/Button'; import { Card } from '@/ui/Card'; import { useLeagueStewardingMutations } from "@/hooks/league/useLeagueStewardingMutations"; import { AlertCircle, AlertTriangle, Calendar, ChevronRight, Flag, Gavel, MapPin, Video } from 'lucide-react'; import Link from 'next/link'; import { useMemo, useState } from 'react'; import { PendingProtestsList } from '@/ui/PendingProtestsList'; import { PenaltyHistoryList } from '@/components/leagues/PenaltyHistoryList'; interface StewardingData { totalPending: number; totalResolved: number; totalPenalties: number; racesWithData: Array<{ race: { id: string; track: string; scheduledAt: Date; car?: string }; pendingProtests: any[]; resolvedProtests: any[]; penalties: any[]; }>; allDrivers: any[]; driverMap: Record; } interface StewardingTemplateProps { data: StewardingData; leagueId: string; currentDriverId: string; onRefetch: () => void; } export function StewardingTemplate({ data, leagueId, currentDriverId, onRefetch }: StewardingTemplateProps) { const [activeTab, setActiveTab] = useState<'pending' | 'history'>('pending'); const [selectedProtest, setSelectedProtest] = useState(null); const [showQuickPenaltyModal, setShowQuickPenaltyModal] = useState(false); // Mutations using domain hook const { acceptProtestMutation, rejectProtestMutation } = useLeagueStewardingMutations(onRefetch); // Flatten protests for the specialized list components const allPendingProtests = useMemo(() => { return data.racesWithData.flatMap(r => r.pendingProtests); }, [data]); const allResolvedProtests = useMemo(() => { return data.racesWithData.flatMap(r => r.resolvedProtests); }, [data]); const racesMap = useMemo(() => { const map: Record = {}; data.racesWithData.forEach(r => { map[r.race.id] = r.race; }); return map; }, [data]); const handleAcceptProtest = async ( protestId: string, penaltyType: string, penaltyValue: number, stewardNotes: string ) => { // Find the protest to get details for penalty let foundProtest: any | undefined; data.racesWithData.forEach(raceData => { const p = raceData.pendingProtests.find(pr => pr.id === protestId) || raceData.resolvedProtests.find(pr => pr.id === protestId); if (p) foundProtest = { ...p, raceId: raceData.race.id }; }); if (foundProtest) { acceptProtestMutation.mutate({ protestId, penaltyType, penaltyValue, stewardNotes, raceId: foundProtest.raceId, accusedDriverId: foundProtest.accusedDriverId, reason: foundProtest.incident.description, }); } }; const handleRejectProtest = async (protestId: string, stewardNotes: string) => { rejectProtestMutation.mutate({ protestId, stewardNotes, }); }; return (

Stewarding

Quick overview of protests and penalties across all races

{/* Stats summary */} {/* Tab navigation */}
{/* Content */} {activeTab === 'pending' ? ( ) : ( )}
{activeTab === 'history' && ( setShowQuickPenaltyModal(true)} /> )} {selectedProtest && ( setSelectedProtest(null)} onAccept={handleAcceptProtest} onReject={handleRejectProtest} /> )} {showQuickPenaltyModal && ( setShowQuickPenaltyModal(false)} adminId={currentDriverId || ''} races={data.racesWithData.map(r => ({ id: r.race.id, track: r.race.track, scheduledAt: r.race.scheduledAt }))} /> )}
); }