"use client"; import { useEffect, useState, useTransition } from "react"; import { validateChallenge, rejectChallenge, updateChallenge, deleteChallenge, } from "@/actions/admin/challenges"; import { Button, Card, Input, Textarea, Alert } from "@/components/ui"; import { Avatar } from "@/components/ui"; interface Challenge { id: string; challenger: { id: string; username: string; avatar: string | null; }; challenged: { id: string; username: string; avatar: string | null; }; title: string; description: string; pointsReward: number; status: string; adminComment: string | null; createdAt: string; acceptedAt: string | null; } export default function ChallengeManagement() { const [challenges, setChallenges] = useState([]); const [loading, setLoading] = useState(true); const [selectedChallenge, setSelectedChallenge] = useState( null ); const [editingChallenge, setEditingChallenge] = useState( null ); const [winnerId, setWinnerId] = useState(""); const [adminComment, setAdminComment] = useState(""); const [editTitle, setEditTitle] = useState(""); const [editDescription, setEditDescription] = useState(""); const [editPointsReward, setEditPointsReward] = useState(0); const [isPending, startTransition] = useTransition(); const [successMessage, setSuccessMessage] = useState(null); const [errorMessage, setErrorMessage] = useState(null); useEffect(() => { fetchChallenges(); }, []); const fetchChallenges = async () => { try { const response = await fetch("/api/admin/challenges"); if (response.ok) { const data = await response.json(); setChallenges(data); } } catch (error) { console.error("Error fetching challenges:", error); } finally { setLoading(false); } }; const handleValidate = async () => { if (!selectedChallenge || !winnerId) { setErrorMessage("Veuillez sélectionner un gagnant"); setTimeout(() => setErrorMessage(null), 5000); return; } startTransition(async () => { const result = await validateChallenge( selectedChallenge.id, winnerId, adminComment || undefined ); if (result.success) { setSuccessMessage( "Défi validé avec succès ! Les points ont été attribués." ); setSelectedChallenge(null); setWinnerId(""); setAdminComment(""); fetchChallenges(); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de la validation"); setTimeout(() => setErrorMessage(null), 5000); } }); }; const handleReject = async () => { if (!selectedChallenge) return; if (!confirm("Êtes-vous sûr de vouloir rejeter ce défi ?")) { return; } startTransition(async () => { const result = await rejectChallenge( selectedChallenge.id, adminComment || undefined ); if (result.success) { setSuccessMessage("Défi rejeté"); setSelectedChallenge(null); setAdminComment(""); fetchChallenges(); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors du rejet"); setTimeout(() => setErrorMessage(null), 5000); } }); }; const handleEdit = (challenge: Challenge) => { setEditingChallenge(challenge); setEditTitle(challenge.title); setEditDescription(challenge.description); setEditPointsReward(challenge.pointsReward); }; const handleUpdate = async () => { if (!editingChallenge) return; startTransition(async () => { const result = await updateChallenge(editingChallenge.id, { title: editTitle, description: editDescription, pointsReward: editPointsReward, }); if (result.success) { setSuccessMessage("Défi mis à jour avec succès"); setEditingChallenge(null); setEditTitle(""); setEditDescription(""); setEditPointsReward(0); fetchChallenges(); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de la mise à jour"); setTimeout(() => setErrorMessage(null), 5000); } }); }; const handleDelete = async (challengeId: string) => { if ( !confirm( "Êtes-vous sûr de vouloir supprimer ce défi ? Cette action est irréversible." ) ) { return; } startTransition(async () => { const result = await deleteChallenge(challengeId); if (result.success) { setSuccessMessage("Défi supprimé avec succès"); fetchChallenges(); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de la suppression"); setTimeout(() => setErrorMessage(null), 5000); } }); }; if (loading) { return (
Chargement...
); } if (challenges.length === 0) { return (
Aucun défi en attente
); } const acceptedChallenges = challenges.filter((c) => c.status === "ACCEPTED"); const pendingChallenges = challenges.filter((c) => c.status === "PENDING"); return (
{successMessage && ( {successMessage} )} {errorMessage && ( {errorMessage} )}
{acceptedChallenges.length} défi {acceptedChallenges.length > 1 ? "s" : ""} en attente de validation {pendingChallenges.length > 0 && ( • {pendingChallenges.length} défi {pendingChallenges.length > 1 ? "s" : ""} en attente d'acceptation )}
{challenges.map((challenge) => (

{challenge.title}

{challenge.description}

{challenge.challenger.username} VS {challenge.challenged.username}
Récompense:{" "} {challenge.pointsReward} points
{challenge.status === "ACCEPTED" ? "Accepté" : "En attente d'acceptation"}
{challenge.acceptedAt && (
Accepté le:{" "} {new Date(challenge.acceptedAt).toLocaleDateString("fr-FR")}
)}
{challenge.status === "ACCEPTED" && ( )}
))} {/* Modal de validation */} {selectedChallenge && (
{ setSelectedChallenge(null); setWinnerId(""); setAdminComment(""); }} > e.stopPropagation()} >

Valider/Rejeter le défi

{selectedChallenge.title}

{selectedChallenge.description}

{selectedChallenge.challenger.username}
VS
{selectedChallenge.challenged.username}