"use client"; import { useState } from "react"; import { addFeedbackBonusPoints, markFeedbackAsRead, } from "@/actions/admin/feedback"; import { Button } from "@/components/ui"; import Avatar from "@/components/ui/Avatar"; interface Feedback { id: string; rating: number; comment: string | null; isRead: boolean; createdAt: string; event: { id: string; name: string; date: string; type: string; }; user: { id: string; username: string; email: string; avatar: string | null; score: number; }; } interface EventStatistics { eventId: string; eventName: string; eventDate: string | null; eventType: string | null; averageRating: number; feedbackCount: number; } interface FeedbackManagementProps { initialFeedbacks: Feedback[]; initialStatistics: EventStatistics[]; } export default function FeedbackManagement({ initialFeedbacks, initialStatistics, }: FeedbackManagementProps) { const [feedbacks, setFeedbacks] = useState(initialFeedbacks); const [statistics, setStatistics] = useState(initialStatistics); const [error, setError] = useState(""); const [selectedEvent, setSelectedEvent] = useState(null); const [addingPoints, setAddingPoints] = useState>( {} ); const [markingRead, setMarkingRead] = useState>({}); const fetchFeedbacks = async () => { try { const response = await fetch("/api/admin/feedback"); if (!response.ok) { setError("Erreur lors du chargement des feedbacks"); return; } const data = await response.json(); setFeedbacks(data.feedbacks || []); setStatistics(data.statistics || []); } catch { setError("Erreur lors du chargement des feedbacks"); } }; const getEventTypeLabel = (type: string) => { 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 renderStars = (rating: number) => { return (
{[1, 2, 3, 4, 5].map((star) => ( ))} ({rating}/5)
); }; const handleAddPoints = async (userId: string, points: number) => { const key = `${userId}-${points}`; setAddingPoints((prev) => ({ ...prev, [key]: true })); setError(""); try { const result = await addFeedbackBonusPoints(userId, points); if (result.success) { // Rafraîchir les données pour voir les nouveaux scores await fetchFeedbacks(); // Rafraîchir le score dans le header si l'utilisateur est connecté window.dispatchEvent(new Event("refreshUserScore")); } else { setError(result.error || "Erreur lors de l'ajout des points"); } } catch { setError("Erreur lors de l'ajout des points"); } finally { setAddingPoints((prev) => ({ ...prev, [key]: false })); } }; const handleMarkAsRead = async (feedbackId: string, isRead: boolean) => { setMarkingRead((prev) => ({ ...prev, [feedbackId]: true })); setError(""); try { const result = await markFeedbackAsRead(feedbackId, isRead); if (result.success) { // Rafraîchir les données pour voir le nouveau statut await fetchFeedbacks(); } else { setError(result.error || "Erreur lors de la mise à jour"); } } catch { setError("Erreur lors de la mise à jour"); } finally { setMarkingRead((prev) => ({ ...prev, [feedbackId]: false })); } }; const filteredFeedbacks = (selectedEvent ? feedbacks.filter((f) => f.event.id === selectedEvent) : feedbacks ).sort((a, b) => { // Trier : non lus en premier, puis par date décroissante if (a.isRead !== b.isRead) { return a.isRead ? 1 : -1; } return ( new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() ); }); return (
{/* Statistiques par événement */} {statistics.length > 0 && (

Statistiques par événement

{statistics.map((stat) => (
setSelectedEvent( selectedEvent === stat.eventId ? null : stat.eventId ) } >

{stat.eventName}

{stat.eventType && getEventTypeLabel(stat.eventType)}
{renderStars(Math.round(stat.averageRating))}
Moyenne: {stat.averageRating.toFixed(2)}/5
{stat.feedbackCount} feedback {stat.feedbackCount > 1 ? "s" : ""}
))}
{selectedEvent && ( )}
)} {/* Liste des feedbacks */}

{selectedEvent ? `Feedbacks pour: ${ statistics.find((s) => s.eventId === selectedEvent)?.eventName }` : "Tous les feedbacks"}

{error && (
{error}
)} {filteredFeedbacks.length === 0 ? (

Aucun feedback pour le moment

) : (
{filteredFeedbacks.map((feedback) => (
{/* En-tête utilisateur avec avatar */}

{feedback.user.username}

{feedback.user.score.toLocaleString("fr-FR")} pts
{feedback.user.email}
{feedback.event.name}
{!feedback.isRead && ( Non lu )}
{new Date(feedback.createdAt).toLocaleDateString( "fr-FR", { day: "numeric", month: "long", year: "numeric", hour: "2-digit", minute: "2-digit", } )}
{renderStars(feedback.rating)}
{feedback.comment && (

{feedback.comment}

)} {/* Boutons pour ajouter des points bonus */}
Points bonus:
))}
)}
); }