"use client"; import { useState, useTransition } from "react"; import { validateChallenge, rejectChallenge, updateChallenge, deleteChallenge, adminCancelChallenge, reactivateChallenge, adminAcceptChallenge, } from "@/actions/admin/challenges"; import { Button, Card, Input, Textarea, Alert, Modal, CloseButton, } 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; } interface ChallengeManagementProps { initialChallenges: Challenge[]; } export default function ChallengeManagement({ initialChallenges }: ChallengeManagementProps) { const [challenges, setChallenges] = useState(initialChallenges); 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); 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); } }; 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(); // Rafraîchir le badge des défis window.dispatchEvent(new Event("refreshChallenges")); 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(); // Rafraîchir le badge des défis window.dispatchEvent(new Event("refreshChallenges")); 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(); // Rafraîchir le badge des défis window.dispatchEvent(new Event("refreshChallenges")); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de la suppression"); setTimeout(() => setErrorMessage(null), 5000); } }); }; const handleCancel = async (challengeId: string) => { if (!confirm("Êtes-vous sûr de vouloir annuler ce défi ?")) { return; } startTransition(async () => { const result = await adminCancelChallenge(challengeId); if (result.success) { setSuccessMessage("Défi annulé avec succès"); fetchChallenges(); // Rafraîchir le badge des défis window.dispatchEvent(new Event("refreshChallenges")); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de l'annulation"); setTimeout(() => setErrorMessage(null), 5000); } }); }; const handleReactivate = async (challengeId: string) => { if (!confirm("Êtes-vous sûr de vouloir réactiver ce défi ?")) { return; } startTransition(async () => { const result = await reactivateChallenge(challengeId); if (result.success) { setSuccessMessage("Défi réactivé avec succès"); fetchChallenges(); // Rafraîchir le badge des défis window.dispatchEvent(new Event("refreshChallenges")); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de la réactivation"); setTimeout(() => setErrorMessage(null), 5000); } }); }; const handleAdminAccept = async (challengeId: string) => { if ( !confirm( "Êtes-vous sûr de vouloir accepter ce défi à la place de l'utilisateur ?" ) ) { return; } startTransition(async () => { const result = await adminAcceptChallenge(challengeId); if (result.success) { setSuccessMessage("Défi accepté avec succès"); fetchChallenges(); // Rafraîchir le badge des défis window.dispatchEvent(new Event("refreshChallenges")); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de l'acceptation"); setTimeout(() => setErrorMessage(null), 5000); } }); }; if (challenges.length === 0) { return
Aucun défi
; } const acceptedChallenges = challenges.filter((c) => c.status === "ACCEPTED"); const pendingChallenges = challenges.filter((c) => c.status === "PENDING"); const cancelledChallenges = challenges.filter( (c) => c.status === "CANCELLED" ); const completedChallenges = challenges.filter( (c) => c.status === "COMPLETED" ); const rejectedChallenges = challenges.filter((c) => c.status === "REJECTED"); return (
{successMessage && ( {successMessage} )} {errorMessage && ( {errorMessage} )}
{acceptedChallenges.length > 0 && ( {acceptedChallenges.length} défi {acceptedChallenges.length > 1 ? "s" : ""} en attente de désignation du gagnant )} {pendingChallenges.length > 0 && ( 0 ? "ml-2" : ""}> • {pendingChallenges.length} défi {pendingChallenges.length > 1 ? "s" : ""} en attente d'acceptation )} {cancelledChallenges.length > 0 && ( • {cancelledChallenges.length} défi {cancelledChallenges.length > 1 ? "s" : ""} annulé {cancelledChallenges.length > 1 ? "s" : ""} )} {completedChallenges.length > 0 && ( • {completedChallenges.length} défi {completedChallenges.length > 1 ? "s" : ""} complété {completedChallenges.length > 1 ? "s" : ""} )} {rejectedChallenges.length > 0 && ( • {rejectedChallenges.length} défi {rejectedChallenges.length > 1 ? "s" : ""} rejeté {rejectedChallenges.length > 1 ? "s" : ""} )}
{challenges.map((challenge) => (

{challenge.title}

{challenge.description}

{challenge.challenger.username} VS {challenge.challenged.username}
Récompense:{" "} {challenge.pointsReward} points
{challenge.status === "PENDING" ? "En attente d'acceptation" : challenge.status === "ACCEPTED" ? "En cours - En attente de désignation du gagnant" : challenge.status === "COMPLETED" ? "Complété" : challenge.status === "CANCELLED" ? "Annulé" : challenge.status === "REJECTED" ? "Rejeté" : challenge.status}
{challenge.acceptedAt && (
Accepté le:{" "} {new Date(challenge.acceptedAt).toLocaleDateString("fr-FR")}
)}
{challenge.status === "PENDING" && ( )} {challenge.status === "ACCEPTED" && ( )} {challenge.status !== "CANCELLED" && challenge.status !== "COMPLETED" && ( )} {challenge.status === "CANCELLED" && ( )}
))} {/* Modal de validation */} {selectedChallenge && ( { setSelectedChallenge(null); setWinnerId(""); setAdminComment(""); }} size="lg" >

Désigner le gagnant

{ setSelectedChallenge(null); setWinnerId(""); setAdminComment(""); }} size="lg" />

{selectedChallenge.title}

{selectedChallenge.description}

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