"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 } from "@/components/ui"; 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 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 [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, }); }; if (loading) { return
Chargement...
; } return (

Événements ({events.length})

{!isCreating && !editingEvent && ( )}
{(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" />