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" && (