From 56accdac0550009f2e0cdc52c2b7874e4dedf69e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Poncin?= Date: Mon, 24 Aug 2026 18:44:05 +0200 Subject: [PATCH 01/11] feat: challenge validation gform in challenge page --- .../components/challenge/challengeList.tsx | 100 +++++++++++------- 1 file changed, 64 insertions(+), 36 deletions(-) diff --git a/frontend/src/components/challenge/challengeList.tsx b/frontend/src/components/challenge/challengeList.tsx index 938277f..b9c40ea 100644 --- a/frontend/src/components/challenge/challengeList.tsx +++ b/frontend/src/components/challenge/challengeList.tsx @@ -1,29 +1,29 @@ -import { useCallback, useEffect, useMemo, useState } from "react"; -import Swal from "sweetalert2"; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import Swal from 'sweetalert2'; -import { type Challenge } from "../../interfaces/challenge.interface"; -import { type Faction } from "../../interfaces/faction.interface"; -import { getAllChallenges, getFactionsPoints } from "../../services/requests/challenge.service"; -import { checkChallengeStatus } from "../../services/requests/event.service"; -import { getAllFactionsUser } from "../../services/requests/faction.service"; -import { Card, CardContent, CardHeader, CardTitle } from "../ui/card"; +import { type Challenge } from '../../interfaces/challenge.interface'; +import { type Faction } from '../../interfaces/faction.interface'; +import { getAllChallenges, getFactionsPoints } from '../../services/requests/challenge.service'; +import { checkChallengeStatus } from '../../services/requests/event.service'; +import { getAllFactionsUser } from '../../services/requests/faction.service'; +import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; export const UserChallengeList = () => { const [availableChallenges, setAvailableChallenges] = useState([]); const [factions, setFactions] = useState([]); const [factionPoints, setFactionPoints] = useState<{ [key: number]: number }>({}); - const [selectedCategory, setSelectedCategory] = useState("Tous"); - const [sortOrder, setSortOrder] = useState<"asc" | "desc">("asc"); + const [selectedCategory, setSelectedCategory] = useState('Tous'); + const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc'); const [isChallOpen, setIsChallOpen] = useState(false); const [loading, setLoading] = useState(true); const fetchChallenges = useCallback(async () => { try { const challenges = await getAllChallenges(); - const challengesFiltered = challenges.filter((c: Challenge) => c.category !== "Free"); + const challengesFiltered = challenges.filter((c: Challenge) => c.category !== 'Free'); setAvailableChallenges(challengesFiltered); } catch (err) { - console.error("Erreur lors du chargement des challenges", err); + console.error('Erreur lors du chargement des challenges', err); } }, []); @@ -32,7 +32,7 @@ export const UserChallengeList = () => { const data = await getAllFactionsUser(); setFactions(data); } catch (err) { - console.error("Erreur lors du chargement des factions", err); + console.error('Erreur lors du chargement des factions', err); } }, []); @@ -44,11 +44,11 @@ export const UserChallengeList = () => { fetchedFactions.map(async (faction: Faction) => { const res = await getFactionsPoints(faction.factionId); points[faction.factionId] = Number(res); - }) + }), ); setFactionPoints(points); } catch (err) { - console.error("Erreur lors du chargement des points des factions", err); + console.error('Erreur lors du chargement des points des factions', err); } }, []); @@ -64,11 +64,11 @@ export const UserChallengeList = () => { const status = await checkChallengeStatus(); setIsChallOpen(status); } catch (error) { - console.error("Erreur lors de la récupération des données :", error); + console.error('Erreur lors de la récupération des données :', error); await Swal.fire({ - icon: "error", - title: "Oups...", - text: "Une erreur est survenue lors de la récupération des données.", + icon: 'error', + title: 'Oups...', + text: 'Une erreur est survenue lors de la récupération des données.', }); } finally { setLoading(false); @@ -78,20 +78,18 @@ export const UserChallengeList = () => { }, [fetchInitialData]); const dynamicCategories = useMemo(() => { - const uniqueCategories = new Set(availableChallenges.map(c => c.category)); - return ["Tous", ...Array.from(uniqueCategories)]; + const uniqueCategories = new Set(availableChallenges.map((c) => c.category)); + return ['Tous', ...Array.from(uniqueCategories)]; }, [availableChallenges]); const filteredAndSortedChallenges = useMemo(() => { let challenges = [...availableChallenges]; - if (selectedCategory !== "Tous") { - challenges = challenges.filter(c => c.category === selectedCategory); + if (selectedCategory !== 'Tous') { + challenges = challenges.filter((c) => c.category === selectedCategory); } - challenges.sort((a, b) => - sortOrder === "asc" ? a.points - b.points : b.points - a.points - ); + challenges.sort((a, b) => (sortOrder === 'asc' ? a.points - b.points : b.points - a.points)); return challenges; }, [availableChallenges, selectedCategory, sortOrder]); @@ -122,6 +120,33 @@ export const UserChallengeList = () => { + {/* Formulaire de validation de challenge */} + + + + + Valider un challenge + + + + {!isChallOpen ? ( +

+ 🚫 Ce formulaire n'est pas encore disponible. +

+ ) : ( +
+ +
+ )} +
+
+ {/* Challenges disponibles */} @@ -150,10 +175,11 @@ export const UserChallengeList = () => { id="categorySelect" value={selectedCategory} onChange={(e) => setSelectedCategory(e.target.value)} - className="border border-gray-300 rounded px-3 py-1" - > + className="border border-gray-300 rounded px-3 py-1"> {dynamicCategories.map((cat) => ( - + ))} @@ -165,9 +191,8 @@ export const UserChallengeList = () => { @@ -179,13 +204,16 @@ export const UserChallengeList = () => { {filteredAndSortedChallenges.map((challenge) => (
  • + className="bg-gray-100 py-4 px-6 rounded-xl border border-gray-300 shadow-sm hover:bg-gray-200 transition">

    {challenge.title}

    {challenge.description}

    -

    Catégorie : {challenge.category}

    -

    Points : {challenge.points}

    +

    + Catégorie : {challenge.category} +

    +

    + Points : {challenge.points} +

  • ))} From ecd33544c73404389099e300b4eb90bede3448aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Poncin?= Date: Mon, 24 Aug 2026 19:30:36 +0200 Subject: [PATCH 02/11] fix: gform link --- frontend/src/components/challenge/challengeList.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/challenge/challengeList.tsx b/frontend/src/components/challenge/challengeList.tsx index b9c40ea..9deba70 100644 --- a/frontend/src/components/challenge/challengeList.tsx +++ b/frontend/src/components/challenge/challengeList.tsx @@ -124,9 +124,7 @@ export const UserChallengeList = () => { - - Valider un challenge - + Valider un Défi {!isChallOpen ? ( @@ -136,7 +134,7 @@ export const UserChallengeList = () => { ) : (