"use client"; import { useState, useEffect } from "react"; interface Event { id: string; date: string; name: string; description: string; type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION"; status: "UPCOMING" | "LIVE" | "PAST"; createdAt: string; updatedAt: string; } interface EventFormData { date: string; name: string; description: string; type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION"; status: "UPCOMING" | "LIVE" | "PAST"; } const eventTypes: Event["type"][] = [ "SUMMIT", "LAUNCH", "FESTIVAL", "COMPETITION", ]; const eventStatuses: Event["status"][] = ["UPCOMING", "LIVE", "PAST"]; const getEventTypeLabel = (type: Event["type"]) => { switch (type) { case "SUMMIT": return "Sommet"; case "LAUNCH": return "Lancement"; case "FESTIVAL": return "Festival"; case "COMPETITION": return "Compétition"; 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: "SUMMIT", status: "UPCOMING", }); 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: "SUMMIT", status: "UPCOMING", }); }; const handleEdit = (event: Event) => { setEditingEvent(event); setIsCreating(false); setFormData({ date: event.date, name: event.name, description: event.description, type: event.type, status: event.status, }); }; const handleSave = async () => { setSaving(true); try { let response; if (isCreating) { response = await fetch("/api/admin/events", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(formData), }); } else if (editingEvent) { response = await fetch(`/api/admin/events/${editingEvent.id}`, { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify(formData), }); } if (response?.ok) { await fetchEvents(); setEditingEvent(null); setIsCreating(false); setFormData({ date: "", name: "", description: "", type: "SUMMIT", status: "UPCOMING", }); } else { const error = await response?.json(); alert(error.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; } try { const response = await fetch(`/api/admin/events/${eventId}`, { method: "DELETE", }); if (response.ok) { await fetchEvents(); } else { const error = await response.json(); alert(error.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: "SUMMIT", status: "UPCOMING", }); }; 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="w-full px-3 py-2 bg-black/60 border border-pixel-gold/30 rounded text-white text-sm" />
setFormData({ ...formData, name: e.target.value }) } placeholder="Nom de l'événement" className="w-full px-3 py-2 bg-black/60 border border-pixel-gold/30 rounded text-white text-sm" />