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:
@@ -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'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'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>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user