'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Button from '../ui/Button'; import Input from '../ui/Input'; import { createScheduleRaceFormPresenter } from '@/lib/presenters/factories'; import type { ScheduleRaceFormData, ScheduledRaceViewModel, LeagueOptionViewModel, } from '@/lib/presenters/ScheduleRaceFormPresenter'; interface ScheduleRaceFormProps { preSelectedLeagueId?: string; onSuccess?: (race: ScheduledRaceViewModel) => void; onCancel?: () => void; } export default function ScheduleRaceForm({ preSelectedLeagueId, onSuccess, onCancel }: ScheduleRaceFormProps) { const router = useRouter(); 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 () => { const allLeagues = await loadScheduleRaceFormLeagues(); setLeagues(allLeagues); }; void loadLeagues(); }, []); 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 { const createdRace = await scheduleRaceFromForm(formData); 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 && ( )}
); }