'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Button from '../ui/Button'; import Input from '../ui/Input'; import { useServices } from '@/lib/services/ServiceProvider'; import type { LeagueSummaryViewModel } from '@/lib/view-models/LeagueSummaryViewModel'; interface ScheduleRaceFormData { leagueId: string; track: string; car: string; sessionType: 'practice' | 'qualifying' | 'race'; scheduledDate: string; scheduledTime: string; } interface ScheduledRaceViewModel { id: string; track: string; car: string; scheduledAt: string; } interface ScheduleRaceFormProps { preSelectedLeagueId?: string; onSuccess?: (race: ScheduledRaceViewModel) => void; onCancel?: () => void; } export default function ScheduleRaceForm({ preSelectedLeagueId, onSuccess, onCancel }: ScheduleRaceFormProps) { const router = useRouter(); const { leagueService, raceService } = useServices(); const [leagues, setLeagues] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [formData, setFormData] = useState({ leagueId: preSelectedLeagueId || '', track: '', car: '', sessionType: 'race', scheduledDate: '', scheduledTime: '', }); const [validationErrors, setValidationErrors] = useState>({}); useEffect(() => { const loadLeagues = async () => { try { const allLeagues = await leagueService.getAllLeagues(); setLeagues(allLeagues); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load leagues'); } }; void loadLeagues(); }, [leagueService]); const validateForm = (): boolean => { const errors: Record = {}; if (!formData.leagueId) { errors.leagueId = 'League is required'; } if (!formData.track.trim()) { errors.track = 'Track is required'; } if (!formData.car.trim()) { errors.car = 'Car is required'; } if (!formData.scheduledDate) { errors.scheduledDate = 'Date is required'; } if (!formData.scheduledTime) { errors.scheduledTime = 'Time is required'; } // Validate future date if (formData.scheduledDate && formData.scheduledTime) { const scheduledDateTime = new Date(`${formData.scheduledDate}T${formData.scheduledTime}`); const now = new Date(); if (scheduledDateTime <= now) { errors.scheduledDate = 'Date must be in the future'; } } setValidationErrors(errors); return Object.keys(errors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } setLoading(true); setError(null); try { // Create race using the race service // Note: This assumes the race service has a create method // If not available, we'll need to implement it or use an alternative approach const raceData = { leagueId: formData.leagueId, track: formData.track, car: formData.car, sessionType: formData.sessionType, scheduledAt: new Date(`${formData.scheduledDate}T${formData.scheduledTime}`).toISOString(), }; // For now, we'll simulate race creation since the race service may not have create method // In a real implementation, this would call raceService.createRace(raceData) const createdRace: ScheduledRaceViewModel = { id: `race-${Date.now()}`, track: formData.track, car: formData.car, scheduledAt: new Date(`${formData.scheduledDate}T${formData.scheduledTime}`).toISOString(), }; if (onSuccess) { onSuccess(createdRace); } else { router.push(`/races/${createdRace.id}`); } } catch (err) { setError(err instanceof Error ? err.message : 'Failed to create race'); } finally { setLoading(false); } }; const handleChange = (field: string, value: string) => { setFormData(prev => ({ ...prev, [field]: value })); // Clear validation error for this field if (validationErrors[field]) { setValidationErrors(prev => { const newErrors = { ...prev }; delete newErrors[field]; return newErrors; }); } }; return ( <>
{error && (
{error}
)} {/* Companion App Notice */}

Companion automation available in production. For alpha, races are created manually.

{/* League Selection */}
{validationErrors.leagueId && (

{validationErrors.leagueId}

)}
{/* Track */}
handleChange('track', e.target.value)} placeholder="e.g., Spa-Francorchamps" className={validationErrors.track ? 'border-red-500' : ''} /> {validationErrors.track && (

{validationErrors.track}

)}

Enter the iRacing track name

{/* Car */}
handleChange('car', e.target.value)} placeholder="e.g., Porsche 911 GT3 R" className={validationErrors.car ? 'border-red-500' : ''} /> {validationErrors.car && (

{validationErrors.car}

)}

Enter the iRacing car name

{/* Session Type */}
{/* Date and Time */}
handleChange('scheduledDate', e.target.value)} className={validationErrors.scheduledDate ? 'border-red-500' : ''} /> {validationErrors.scheduledDate && (

{validationErrors.scheduledDate}

)}
handleChange('scheduledTime', e.target.value)} className={validationErrors.scheduledTime ? 'border-red-500' : ''} /> {validationErrors.scheduledTime && (

{validationErrors.scheduledTime}

)}
{/* Actions */}
{onCancel && ( )}
); }