Refactor challenge management functions and improve code formatting: Standardize import statements, enhance error handling messages, and apply consistent formatting across challenge validation, rejection, update, and deletion functions for better readability and maintainability.

This commit is contained in:
Julien Froidefond
2025-12-15 21:20:13 +01:00
parent e4b0907801
commit 321da3176e
4 changed files with 164 additions and 103 deletions

View File

@@ -1,7 +1,12 @@
"use client";
import { useEffect, useState, useTransition } from "react";
import { validateChallenge, rejectChallenge, updateChallenge, deleteChallenge } from "@/actions/admin/challenges";
import {
validateChallenge,
rejectChallenge,
updateChallenge,
deleteChallenge,
} from "@/actions/admin/challenges";
import { Button, Card, Input, Textarea, Alert } from "@/components/ui";
import { Avatar } from "@/components/ui";
@@ -29,8 +34,12 @@ interface Challenge {
export default function ChallengeManagement() {
const [challenges, setChallenges] = useState<Challenge[]>([]);
const [loading, setLoading] = useState(true);
const [selectedChallenge, setSelectedChallenge] = useState<Challenge | null>(null);
const [editingChallenge, setEditingChallenge] = useState<Challenge | null>(null);
const [selectedChallenge, setSelectedChallenge] = useState<Challenge | null>(
null
);
const [editingChallenge, setEditingChallenge] = useState<Challenge | null>(
null
);
const [winnerId, setWinnerId] = useState<string>("");
const [adminComment, setAdminComment] = useState("");
const [editTitle, setEditTitle] = useState("");
@@ -73,7 +82,9 @@ export default function ChallengeManagement() {
);
if (result.success) {
setSuccessMessage("Défi validé avec succès ! Les points ont été attribués.");
setSuccessMessage(
"Défi validé avec succès ! Les points ont été attribués."
);
setSelectedChallenge(null);
setWinnerId("");
setAdminComment("");
@@ -145,7 +156,11 @@ export default function ChallengeManagement() {
};
const handleDelete = async (challengeId: string) => {
if (!confirm("Êtes-vous sûr de vouloir supprimer ce défi ? Cette action est irréversible.")) {
if (
!confirm(
"Êtes-vous sûr de vouloir supprimer ce défi ? Cette action est irréversible."
)
) {
return;
}
@@ -193,10 +208,12 @@ export default function ChallengeManagement() {
</Alert>
)}
<div className="text-sm text-gray-400 mb-4">
{acceptedChallenges.length} défi{acceptedChallenges.length > 1 ? "s" : ""} en attente de validation
{acceptedChallenges.length} défi
{acceptedChallenges.length > 1 ? "s" : ""} en attente de validation
{pendingChallenges.length > 0 && (
<span className="ml-2">
{pendingChallenges.length} défi{pendingChallenges.length > 1 ? "s" : ""} en attente d&apos;acceptation
{pendingChallenges.length} défi
{pendingChallenges.length > 1 ? "s" : ""} en attente d'acceptation
</span>
)}
</div>
@@ -233,20 +250,28 @@ export default function ChallengeManagement() {
</div>
<div className="text-sm text-gray-400">
Récompense: <span className="text-pixel-gold font-bold">{challenge.pointsReward} points</span>
Récompense:{" "}
<span className="text-pixel-gold font-bold">
{challenge.pointsReward} points
</span>
</div>
<div className="text-xs mt-2">
<span className={`px-2 py-1 rounded ${
challenge.status === "ACCEPTED"
? "bg-green-500/20 text-green-400"
: "bg-yellow-500/20 text-yellow-400"
}`}>
{challenge.status === "ACCEPTED" ? "Accepté" : "En attente d&apos;acceptation"}
<span
className={`px-2 py-1 rounded ${
challenge.status === "ACCEPTED"
? "bg-green-500/20 text-green-400"
: "bg-yellow-500/20 text-yellow-400"
}`}
>
{challenge.status === "ACCEPTED"
? "Accepté"
: "En attente d'acceptation"}
</span>
</div>
{challenge.acceptedAt && (
<div className="text-xs text-gray-500 mt-2">
Accepté le: {new Date(challenge.acceptedAt).toLocaleDateString("fr-FR")}
Accepté le:{" "}
{new Date(challenge.acceptedAt).toLocaleDateString("fr-FR")}
</div>
)}
</div>
@@ -466,7 +491,9 @@ export default function ChallengeManagement() {
type="number"
min="1"
value={editPointsReward}
onChange={(e) => setEditPointsReward(parseInt(e.target.value) || 0)}
onChange={(e) =>
setEditPointsReward(parseInt(e.target.value) || 0)
}
required
placeholder="100"
/>
@@ -475,7 +502,12 @@ export default function ChallengeManagement() {
<Button
onClick={handleUpdate}
variant="primary"
disabled={isPending || !editTitle || !editDescription || editPointsReward <= 0}
disabled={
isPending ||
!editTitle ||
!editDescription ||
editPointsReward <= 0
}
className="flex-1"
>
{isPending ? "Mise à jour..." : "Enregistrer"}
@@ -501,4 +533,3 @@ export default function ChallengeManagement() {
</div>
);
}