"use client"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardHeader, CardTitle, CardFooter } from "@/components/ui/card"; interface TournamentFormData { name: string; description: string; date: string; endDate: string; type: string; category: string; maxTeams: number; price: number; siteId: string; } interface Site { id: string; name: string; } interface TournamentFormProps { initialData?: Partial; onSubmit: (data: TournamentFormData) => Promise; onCancel: () => void; isLoading?: boolean; mode?: "create" | "edit"; } const tournamentTypes = [ { value: "SINGLE_ELIMINATION", label: "Eliminacion Directa" }, { value: "DOUBLE_ELIMINATION", label: "Doble Eliminacion" }, { value: "ROUND_ROBIN", label: "Round Robin" }, { value: "LEAGUE", label: "Liga" }, ]; const categories = [ { value: "", label: "Sin categoria" }, { value: "1ra", label: "1ra Categoria" }, { value: "2da", label: "2da Categoria" }, { value: "3ra", label: "3ra Categoria" }, { value: "4ta", label: "4ta Categoria" }, { value: "5ta", label: "5ta Categoria" }, { value: "Mixto", label: "Mixto" }, { value: "Femenil", label: "Femenil" }, { value: "Varonil", label: "Varonil" }, { value: "Open", label: "Open" }, ]; export function TournamentForm({ initialData, onSubmit, onCancel, isLoading = false, mode = "create", }: TournamentFormProps) { const [sites, setSites] = useState([]); const [loadingSites, setLoadingSites] = useState(true); const [formData, setFormData] = useState({ name: initialData?.name || "", description: initialData?.description || "", date: initialData?.date || "", endDate: initialData?.endDate || "", type: initialData?.type || "SINGLE_ELIMINATION", category: initialData?.category || "", maxTeams: initialData?.maxTeams || 16, price: initialData?.price || 0, siteId: initialData?.siteId || "", }); const [errors, setErrors] = useState>({}); // Fetch sites useEffect(() => { async function fetchSites() { try { const response = await fetch("/api/sites"); if (response.ok) { const data = await response.json(); setSites(data); // Set default site if not set if (!formData.siteId && data.length > 0) { setFormData(prev => ({ ...prev, siteId: data[0].id })); } } } catch (error) { console.error("Error fetching sites:", error); } finally { setLoadingSites(false); } } fetchSites(); }, []); const handleChange = ( e: React.ChangeEvent ) => { const { name, value, type } = e.target; setFormData((prev) => ({ ...prev, [name]: type === "number" ? parseFloat(value) || 0 : value, })); // Clear error when field is modified if (errors[name]) { setErrors((prev) => { const newErrors = { ...prev }; delete newErrors[name]; return newErrors; }); } }; const validate = (): boolean => { const newErrors: Record = {}; if (!formData.name.trim()) { newErrors.name = "El nombre es requerido"; } if (!formData.date) { newErrors.date = "La fecha de inicio es requerida"; } if (!formData.siteId) { newErrors.siteId = "Selecciona una sede"; } if (formData.maxTeams < 2) { newErrors.maxTeams = "Minimo 2 equipos"; } if (formData.price < 0) { newErrors.price = "El precio no puede ser negativo"; } if (formData.endDate && new Date(formData.endDate) < new Date(formData.date)) { newErrors.endDate = "La fecha de fin debe ser posterior a la de inicio"; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validate()) return; await onSubmit(formData); }; return (
{mode === "create" ? "Nuevo Torneo" : "Editar Torneo"} {/* Name */}
{errors.name && (

{errors.name}

)}
{/* Description */}