"use client"; import { useState, useEffect, useTransition } from "react"; import { calculateEventStatus } from "@/lib/eventStatus"; import { createEvent, updateEvent, deleteEvent } from "@/actions/admin/events"; import { Input, Textarea, Button, Card, Badge, Modal, CloseButton, Avatar, } from "@/components/ui"; import { updateUser } from "@/actions/admin/users"; interface Event { id: string; date: string; name: string; description: string; type: "ATELIER" | "KATA" | "PRESENTATION" | "LEARNING_HOUR"; status: "UPCOMING" | "LIVE" | "PAST"; room?: string | null; time?: string | null; maxPlaces?: number | null; createdAt: string; updatedAt: string; registrationsCount?: number; } interface EventRegistration { id: string; userId: string; eventId: string; createdAt: string; user: { id: string; username: string; avatar: string | null; score: number; level: number; hp: number; maxHp: number; xp: number; maxXp: number; }; } interface EventFormData { date: string; name: string; description: string; type: "ATELIER" | "KATA" | "PRESENTATION" | "LEARNING_HOUR"; room?: string; time?: string; maxPlaces?: number; } const eventTypes: Event["type"][] = [ "ATELIER", "KATA", "PRESENTATION", "LEARNING_HOUR", ]; const getEventTypeLabel = (type: Event["type"]) => { switch (type) { case "ATELIER": return "Atelier"; case "KATA": return "Kata"; case "PRESENTATION": return "Présentation"; case "LEARNING_HOUR": return "Learning Hour"; default: return type; } }; const getStatusLabel = (status: Event["status"]) => { switch (status) { case "UPCOMING": return "À venir"; case "LIVE": return "En cours"; case "PAST": return "Passé"; default: return status; } }; export default function EventManagement() { const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); const [editingEvent, setEditingEvent] = useState(null); const [isCreating, setIsCreating] = useState(false); const [saving, setSaving] = useState(false); const [viewingRegistrations, setViewingRegistrations] = useState(null); const [registrations, setRegistrations] = useState([]); const [loadingRegistrations, setLoadingRegistrations] = useState(false); const [editingScores, setEditingScores] = useState>( {} ); const [savingScore, setSavingScore] = useState(null); const [formData, setFormData] = useState({ date: "", name: "", description: "", type: "ATELIER", room: "", time: "", maxPlaces: undefined, }); useEffect(() => { fetchEvents(); }, []); const fetchEvents = async () => { try { const response = await fetch("/api/admin/events"); if (response.ok) { const data = await response.json(); setEvents(data); } } catch (error) { console.error("Error fetching events:", error); } finally { setLoading(false); } }; const handleCreate = () => { setIsCreating(true); setEditingEvent(null); setFormData({ date: "", name: "", description: "", type: "ATELIER", room: "", time: "", maxPlaces: undefined, }); }; const handleEdit = (event: Event) => { setEditingEvent(event); setIsCreating(false); setFormData({ date: event.date, name: event.name, description: event.description, type: event.type, room: event.room || "", time: event.time || "", maxPlaces: event.maxPlaces || undefined, }); }; const [, startTransition] = useTransition(); const handleSave = async () => { setSaving(true); startTransition(async () => { try { let result; if (isCreating) { result = await createEvent(formData); } else if (editingEvent) { result = await updateEvent(editingEvent.id, formData); } if (result?.success) { await fetchEvents(); setEditingEvent(null); setIsCreating(false); setFormData({ date: "", name: "", description: "", type: "ATELIER", room: "", time: "", maxPlaces: undefined, }); } else { alert(result?.error || "Erreur lors de la sauvegarde"); } } catch (error) { console.error("Error saving event:", error); alert("Erreur lors de la sauvegarde"); } finally { setSaving(false); } }); }; const handleDelete = async (eventId: string) => { if (!confirm("Êtes-vous sûr de vouloir supprimer cet événement ?")) { return; } startTransition(async () => { try { const result = await deleteEvent(eventId); if (result.success) { await fetchEvents(); } else { alert(result.error || "Erreur lors de la suppression"); } } catch (error) { console.error("Error deleting event:", error); alert("Erreur lors de la suppression"); } }); }; const handleCancel = () => { setEditingEvent(null); setIsCreating(false); setFormData({ date: "", name: "", description: "", type: "ATELIER", room: "", time: "", maxPlaces: undefined, }); }; const handleViewRegistrations = async (event: Event) => { setViewingRegistrations(event); setLoadingRegistrations(true); try { const response = await fetch( `/api/admin/events/${event.id}/registrations` ); if (response.ok) { const data = await response.json(); setRegistrations(data); // Initialiser les scores d'édition avec les scores actuels const scoresMap: Record = {}; data.forEach((reg: EventRegistration) => { scoresMap[reg.user.id] = reg.user.score; }); setEditingScores(scoresMap); } else { alert("Erreur lors de la récupération des inscrits"); } } catch (error) { console.error("Error fetching registrations:", error); alert("Erreur lors de la récupération des inscrits"); } finally { setLoadingRegistrations(false); } }; const handleCloseRegistrations = () => { setViewingRegistrations(null); setRegistrations([]); setEditingScores({}); }; const handleScoreChange = (userId: string, newScore: number) => { setEditingScores({ ...editingScores, [userId]: newScore, }); }; const handleSaveScore = async (userId: string) => { const newScore = editingScores[userId]; if (newScore === undefined) return; setSavingScore(userId); startTransition(async () => { try { const result = await updateUser(userId, { score: newScore }); if (result.success) { // Mettre à jour le score dans la liste locale setRegistrations((prev) => prev.map((reg) => reg.user.id === userId ? { ...reg, user: { ...reg.user, score: newScore } } : reg ) ); } else { alert(result.error || "Erreur lors de la mise à jour du score"); } } catch (error) { console.error("Error updating score:", error); alert("Erreur lors de la mise à jour du score"); } finally { setSavingScore(null); } }); }; if (loading) { return
Chargement...
; } return (

Événements ({events.length})

{!isCreating && !editingEvent && ( )}
{/* Modal de création/édition */} {(isCreating || editingEvent) && (

{isCreating ? "Créer un événement" : "Modifier l'événement"}

setFormData({ ...formData, date: e.target.value }) } className="text-xs sm:text-sm px-3 py-2" /> setFormData({ ...formData, name: e.target.value }) } placeholder="Nom de l'événement" className="text-xs sm:text-sm px-3 py-2" />