From ba3b2c17b95589f01c918b21953d33e1a1f8df56 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Wed, 17 Dec 2025 08:14:58 +0100 Subject: [PATCH] Add admin challenge acceptance functionality: Implement adminAcceptChallenge method in ChallengeService, allowing admins to accept pending challenges. Update ChallengeManagement component to include a button for accepting challenges, enhancing admin capabilities and user feedback handling. --- actions/admin/challenges.ts | 34 ++++++++++++++++++++++++ components/admin/ChallengeManagement.tsx | 34 ++++++++++++++++++++++++ services/challenges/challenge.service.ts | 28 +++++++++++++++++++ 3 files changed, 96 insertions(+) diff --git a/actions/admin/challenges.ts b/actions/admin/challenges.ts index dcf32c5..5bc663f 100644 --- a/actions/admin/challenges.ts +++ b/actions/admin/challenges.ts @@ -234,3 +234,37 @@ export async function reactivateChallenge(challengeId: string) { }; } } + +export async function adminAcceptChallenge(challengeId: string) { + try { + await checkAdminAccess(); + + const challenge = await challengeService.adminAcceptChallenge(challengeId); + + revalidatePath("/admin"); + revalidatePath("/challenges"); + + return { + success: true, + message: "Défi accepté avec succès", + data: challenge, + }; + } catch (error) { + console.error("Admin accept challenge error:", error); + + if (error instanceof ValidationError) { + return { success: false, error: error.message }; + } + if (error instanceof NotFoundError) { + return { success: false, error: error.message }; + } + if (error instanceof Error && error.message.includes("Accès refusé")) { + return { success: false, error: error.message }; + } + + return { + success: false, + error: "Une erreur est survenue lors de l'acceptation du défi", + }; + } +} diff --git a/components/admin/ChallengeManagement.tsx b/components/admin/ChallengeManagement.tsx index 4a2fb1b..60afd60 100644 --- a/components/admin/ChallengeManagement.tsx +++ b/components/admin/ChallengeManagement.tsx @@ -8,6 +8,7 @@ import { deleteChallenge, adminCancelChallenge, reactivateChallenge, + adminAcceptChallenge, } from "@/actions/admin/challenges"; import { Button, @@ -226,6 +227,29 @@ export default function ChallengeManagement() { }); }; + 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(); + setTimeout(() => setSuccessMessage(null), 5000); + } else { + setErrorMessage(result.error || "Erreur lors de l'acceptation"); + setTimeout(() => setErrorMessage(null), 5000); + } + }); + }; + if (loading) { return (
Chargement...
@@ -376,6 +400,16 @@ export default function ChallengeManagement() { > Modifier + {challenge.status === "PENDING" && ( + + )} {challenge.status === "ACCEPTED" && (