"use client"; import { useState, useEffect, useCallback } from "react"; import { useRouter } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { TournamentCard } from "@/components/tournaments/tournament-card"; import { TournamentForm } from "@/components/tournaments/tournament-form"; import { cn } from "@/lib/utils"; interface Tournament { id: string; name: string; description: string | null; type: string; status: string; startDate: string; endDate: string | null; maxPlayers: number | null; entryFee: number | string; settings: { tournamentFormat?: string; category?: string | null; } | null; site: { id: string; name: string; }; _count: { inscriptions: number; matches: number; }; } const statusFilters = [ { value: "", label: "Todos" }, { value: "DRAFT", label: "Borrador" }, { value: "REGISTRATION_OPEN", label: "Inscripciones Abiertas" }, { value: "IN_PROGRESS", label: "En Progreso" }, { value: "COMPLETED", label: "Finalizados" }, { value: "CANCELLED", label: "Cancelados" }, ]; export default function TournamentsPage() { const router = useRouter(); const [tournaments, setTournaments] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [searchQuery, setSearchQuery] = useState(""); const [statusFilter, setStatusFilter] = useState(""); const [showForm, setShowForm] = useState(false); const [formLoading, setFormLoading] = useState(false); const fetchTournaments = useCallback(async () => { setLoading(true); setError(null); try { const params = new URLSearchParams(); if (statusFilter) { params.append("status", statusFilter); } const response = await fetch(`/api/tournaments?${params.toString()}`); if (!response.ok) { throw new Error("Error al cargar torneos"); } const data = await response.json(); setTournaments(data); } catch (err) { setError(err instanceof Error ? err.message : "Error desconocido"); } finally { setLoading(false); } }, [statusFilter]); useEffect(() => { fetchTournaments(); }, [fetchTournaments]); // Filter tournaments by search query (client-side) const filteredTournaments = tournaments.filter((tournament) => { if (!searchQuery) return true; const query = searchQuery.toLowerCase(); return ( tournament.name.toLowerCase().includes(query) || tournament.description?.toLowerCase().includes(query) || tournament.site.name.toLowerCase().includes(query) ); }); const handleCreateTournament = async (data: { name: string; description: string; date: string; endDate: string; type: string; category: string; maxTeams: number; price: number; siteId: string; }) => { setFormLoading(true); try { const response = await fetch("/api/tournaments", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ...data, date: new Date(data.date).toISOString(), endDate: data.endDate ? new Date(data.endDate).toISOString() : undefined, }), }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || "Error al crear torneo"); } const newTournament = await response.json(); setShowForm(false); router.push(`/tournaments/${newTournament.id}`); } catch (err) { throw err; } finally { setFormLoading(false); } }; const handleTournamentClick = (tournamentId: string) => { router.push(`/tournaments/${tournamentId}`); }; return (
{/* Header */}

Torneos

Gestiona torneos y competiciones de tu club

{/* Filters */}
{/* Search */}
setSearchQuery(e.target.value)} className="w-full" />
{/* Status Filter */}
{statusFilters.map((filter) => ( ))}
{/* Create Form Modal */} {showForm && (
setShowForm(false)} isLoading={formLoading} mode="create" />
)} {/* Loading State */} {loading && (

Cargando torneos...

)} {/* Error State */} {error && !loading && (

{error}

)} {/* Empty State */} {!loading && !error && filteredTournaments.length === 0 && (

No hay torneos

{searchQuery || statusFilter ? "Intenta con otros filtros" : "Crea tu primer torneo para comenzar"}

{!searchQuery && !statusFilter && ( )}
)} {/* Tournaments Grid */} {!loading && !error && filteredTournaments.length > 0 && (
{filteredTournaments.map((tournament) => ( handleTournamentClick(tournament.id)} /> ))}
)} {/* Results count */} {!loading && !error && filteredTournaments.length > 0 && (
Mostrando {filteredTournaments.length} de {tournaments.length} torneos
)}
); }