'use client'; import { useState, FormEvent } from 'react'; import { useRouter } from 'next/navigation'; import Input from '../ui/Input'; import Button from '../ui/Button'; import { useCreateLeague } from '@/hooks/league/useCreateLeague'; import { useAuth } from '@/lib/auth/AuthContext'; import { useInject } from '@/lib/di/hooks/useInject'; import { DRIVER_SERVICE_TOKEN } from '@/lib/di/tokens'; interface FormErrors { name?: string; description?: string; pointsSystem?: string; sessionDuration?: string; submit?: string; } export default function CreateLeagueForm() { const router = useRouter(); const [errors, setErrors] = useState({}); const [formData, setFormData] = useState({ name: '', description: '', pointsSystem: 'f1-2024' as 'f1-2024' | 'indycar', sessionDuration: 60 }); const validateForm = (): boolean => { const newErrors: FormErrors = {}; if (!formData.name.trim()) { newErrors.name = 'Name is required'; } else if (formData.name.length > 100) { newErrors.name = 'Name must be 100 characters or less'; } if (!formData.description.trim()) { newErrors.description = 'Description is required'; } else if (formData.description.length > 500) { newErrors.description = 'Description must be 500 characters or less'; } if (formData.sessionDuration < 1 || formData.sessionDuration > 240) { newErrors.sessionDuration = 'Session duration must be between 1 and 240 minutes'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const { session } = useAuth(); const driverService = useInject(DRIVER_SERVICE_TOKEN); const createLeagueMutation = useCreateLeague(); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); if (createLeagueMutation.isPending) return; if (!validateForm()) return; if (!session?.user.userId) { setErrors({ submit: 'You must be logged in to create a league' }); return; } try { // Get current driver const currentDriver = await driverService.getDriverProfile(session.user.userId); if (!currentDriver) { setErrors({ submit: 'No driver profile found. Please create a profile first.' }); return; } // Create league using the league service const input = { name: formData.name.trim(), description: formData.description.trim(), visibility: 'public' as const, ownerId: session.user.userId, }; const result = await createLeagueMutation.mutateAsync(input); router.push(`/leagues/${result.leagueId}`); router.refresh(); } catch (error) { setErrors({ submit: error instanceof Error ? error.message : 'Failed to create league' }); } }; return ( <>
setFormData({ ...formData, name: e.target.value })} error={!!errors.name} errorMessage={errors.name} placeholder="European GT Championship" maxLength={100} disabled={createLeagueMutation.isPending} />

{formData.name.length}/100