'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import Button from '../ui/Button'; import Input from '../ui/Input'; import { useAllLeagues } from "@/lib/hooks/league/useAllLeagues"; 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 { data: leagues = [], isLoading, error } = useAllLeagues(); const [formData, setFormData] = useState({ leagueId: preSelectedLeagueId || '', track: '', car: '', sessionType: 'race', scheduledDate: '', scheduledTime: '', }); const [validationErrors, setValidationErrors] = useState>({}); 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; } 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) { // Error handling is now done through the component state console.error('Failed to create race:', err); } }; 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.message}
)} {/* 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 && ( )}
); }