From 897f99d13d3a2f77d637c5f8327171851047cab4 Mon Sep 17 00:00:00 2001 From: rustyrory Date: Sun, 5 Apr 2026 21:34:46 +0200 Subject: [PATCH 1/5] feat(dashboard): Fixes #138 - Dashboard membres et teams --- .github/workflows/ticket.yml | 9 +- .../frontend/src/app/admin/page.tsx | 109 +++++++++++++++--- .../[seasonId]/teams/[teamId]/page.tsx | 100 ++++++++++++++-- .../admin/seasons/[seasonId]/teams/page.tsx | 6 +- .../frontend/src/app/verify-email/page.tsx | 5 +- .../src/components/auth/register-form.tsx | 3 +- .../dashboard/admin/app-sidebar.tsx | 13 +-- saintBarthVolleyApp/frontend/src/lib/auth.ts | 14 ++- 8 files changed, 212 insertions(+), 47 deletions(-) diff --git a/.github/workflows/ticket.yml b/.github/workflows/ticket.yml index 9ad0225..a000a98 100644 --- a/.github/workflows/ticket.yml +++ b/.github/workflows/ticket.yml @@ -24,14 +24,15 @@ jobs: exit 0 fi - # Regex pour le commit / titre PR : type(nom): Fixes # - message - if [[ "$PR_TITLE" =~ ^(feat|feature|fix|docs|chore|refactor|test|hotfix)\([a-zA-Z0-9_-]+\):\ Fixes\ \#[0-9]+\ -\ .+ ]]; then + # Regex pour le titre PR : type(nom): Fixes # - message + TITLE_REGEX='^(feat|feature|fix|docs|chore|refactor|test|hotfix)\([a-zA-Z0-9_-]+\): Fixes #[0-9]+ - .+' + if [[ "$PR_TITLE" =~ $TITLE_REGEX ]]; then echo "✅ Titre de PR valide avec référence au ticket" exit 0 fi - # Regex pour le nom de branche : feature/123-description, fix/123-description, hotfix/123-description - if [[ "$BRANCH_NAME" =~ ^(feature|fix|hotfix)/[0-9]+-.+ ]]; then + # Regex pour le nom de branche : feat/123-description, feature/123-description, fix/123-description, hotfix/123-description + if [[ "$BRANCH_NAME" =~ ^(feat|feature|fix|hotfix)/[0-9]+-.+ ]]; then echo "✅ Nom de branche valide avec référence au ticket" exit 0 fi diff --git a/saintBarthVolleyApp/frontend/src/app/admin/page.tsx b/saintBarthVolleyApp/frontend/src/app/admin/page.tsx index ea56971..fb898eb 100644 --- a/saintBarthVolleyApp/frontend/src/app/admin/page.tsx +++ b/saintBarthVolleyApp/frontend/src/app/admin/page.tsx @@ -19,6 +19,14 @@ interface Stats { activePartners: number; } +interface ScrapingResult { + matchesCreated: number; + matchesUpdated: number; + standings: number; + errors: string[]; + logs: string[]; +} + interface QuickLink { label: string; href: string; @@ -46,11 +54,6 @@ const QUICK_LINKS: QuickLink[] = [ href: "/admin/partners", description: "Gérer les sponsors et partenaires", }, - { - label: "Matches & scraping", - href: "/admin/matches", - description: "Voir les matches et lancer le scraping FFVB", - }, { label: "Infos du club", href: "/admin/club", @@ -62,27 +65,101 @@ export default function AdminDashboardPage() { const [stats, setStats] = React.useState(null); const [loading, setLoading] = React.useState(true); + const [scraping, setScraping] = React.useState(false); + const [scrapingResult, setScrapingResult] = + React.useState(null); + const [scrapingError, setScrapingError] = React.useState(null); + const [showLogs, setShowLogs] = React.useState(false); + React.useEffect(() => { - apiFetch("/api/stats") + apiFetch("/api/stats") .then(setStats) .catch(console.error) .finally(() => setLoading(false)); }, []); + const handleScraping = async () => { + if ( + !confirm("Lancer le scraping FFVB ? Cela peut prendre plusieurs minutes.") + ) + return; + setScraping(true); + setScrapingResult(null); + setScrapingError(null); + try { + const result = await apiFetch("/api/scraping/run", { + method: "POST", + }); + setScrapingResult(result); + // Refresh stats after scraping + const updated = await apiFetch("/api/stats").catch(() => null); + if (updated) setStats(updated); + } catch (err) { + setScrapingError( + err instanceof Error ? err.message : "Erreur lors du scraping", + ); + } finally { + setScraping(false); + } + }; + return (
-
-

Dashboard

- {stats?.activeSeason && ( -

- Saison active :{" "} - - {stats.activeSeason} - -

- )} +
+
+

Dashboard

+ {stats?.activeSeason && ( +

+ Saison active :{" "} + + {stats.activeSeason} + +

+ )} +
+ +
+ {/* Résultat scraping */} + {scrapingResult && ( +
+
Scraping terminé
+
+ {scrapingResult.matchesCreated} match(es) créé(s) + {scrapingResult.matchesUpdated} mis à jour + {scrapingResult.standings} classement(s) +
+ {scrapingResult.errors.filter(Boolean).length > 0 && ( +
+ Erreurs : {scrapingResult.errors.join(", ")} +
+ )} + + {showLogs && ( +
+              {scrapingResult.logs.join("\n")}
+            
+ )} +
+ )} + {scrapingError && ( +
+ {scrapingError} +
+ )} + {/* Accès rapides */} diff --git a/saintBarthVolleyApp/frontend/src/app/admin/seasons/[seasonId]/teams/[teamId]/page.tsx b/saintBarthVolleyApp/frontend/src/app/admin/seasons/[seasonId]/teams/[teamId]/page.tsx index 9da0486..d40b1d3 100644 --- a/saintBarthVolleyApp/frontend/src/app/admin/seasons/[seasonId]/teams/[teamId]/page.tsx +++ b/saintBarthVolleyApp/frontend/src/app/admin/seasons/[seasonId]/teams/[teamId]/page.tsx @@ -48,6 +48,16 @@ interface Standing { setsAgainst: number; } +interface Match { + _id: string; + opponentName: string; + date: string; + homeAway: "home" | "away"; + status: "scheduled" | "played"; + scoreFor?: number; + scoreAgainst?: number; +} + interface TeamRole { _id: string; // subdoc ObjectId teamId: string; @@ -123,6 +133,7 @@ export default function TeamDetailPage() { const [team, setTeam] = React.useState(null); const [form, setForm] = React.useState(null); const [standings, setStandings] = React.useState([]); + const [matches, setMatches] = React.useState([]); const [allClubMembers, setAllClubMembers] = React.useState([]); const [loading, setLoading] = React.useState(true); const [saving, setSaving] = React.useState(false); @@ -167,25 +178,27 @@ export default function TeamDetailPage() { // ── Load ────────────────────────────────────────────────────────────────── const refreshMembers = React.useCallback(async () => { - const data: Member[] = await apiFetch("/api/members"); + const data = await apiFetch("/api/members"); setAllClubMembers(data); }, []); React.useEffect(() => { if (!id) return; Promise.all([ - apiFetch(`/api/teams/${id}`), - apiFetch(`/api/standings?teamId=${id}`), - apiFetch("/api/members"), + apiFetch(`/api/teams/${id}`), + apiFetch(`/api/standings?teamId=${id}`), + apiFetch("/api/members"), + apiFetch(`/api/matches?teamId=${id}`), ]) - .then(([teamData, standingsData, membersData]) => { + .then(([teamData, standingsData, membersData, matchesData]) => { setTeam(teamData); setForm({ ...teamData, trainingSchedule: teamData.trainingSchedule ?? [], }); setStandings(standingsData); - setAllClubMembers(membersData as Member[]); + setAllClubMembers(membersData); + setMatches(matchesData); }) .catch(() => alert("Erreur lors du chargement")) .finally(() => setLoading(false)); @@ -196,7 +209,7 @@ export default function TeamDetailPage() { if (!form) return; setSaving(true); try { - const updated = await apiFetch(`/api/teams/${form._id}`, { + const updated = await apiFetch(`/api/teams/${form._id}`, { method: "PUT", body: JSON.stringify(form), }); @@ -482,6 +495,79 @@ export default function TeamDetailPage() { )} + {/* ── Matches ── */} + {matches.length > 0 && ( +
+

+ Matches + + ({matches.length}) + +

+
+ + + + + + + + + + + + {[...matches] + .sort( + (a, b) => + new Date(a.date).getTime() - new Date(b.date).getTime(), + ) + .map((m) => ( + + + + + + + + ))} + +
DateAdversaireD/EStatutScore
+ {new Date(m.date).toLocaleString("fr-FR", { + day: "2-digit", + month: "2-digit", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + })} + {m.opponentName} + + {m.homeAway === "home" ? "Dom." : "Ext."} + + + + {m.status === "played" ? "Joué" : "Prévu"} + + + {m.status === "played" + ? `${m.scoreFor} - ${m.scoreAgainst}` + : "-"} +
+
+
+ )} + {/* ── Joueurs & Staff ── */}
diff --git a/saintBarthVolleyApp/frontend/src/app/admin/seasons/[seasonId]/teams/page.tsx b/saintBarthVolleyApp/frontend/src/app/admin/seasons/[seasonId]/teams/page.tsx index 072d2b2..6fe1ee6 100644 --- a/saintBarthVolleyApp/frontend/src/app/admin/seasons/[seasonId]/teams/page.tsx +++ b/saintBarthVolleyApp/frontend/src/app/admin/seasons/[seasonId]/teams/page.tsx @@ -28,7 +28,7 @@ export default function SeasonTeamsPage() { if (!seasonId || Array.isArray(seasonId)) return; setLoading(true); try { - const data: Team[] = await apiFetch(`/api/teams?seasonId=${seasonId}`); + const data = await apiFetch(`/api/teams?seasonId=${seasonId}`); setTeams(data); } catch (err) { console.error(err); @@ -60,7 +60,7 @@ export default function SeasonTeamsPage() { try { if (team._id) { // Mise à jour - const updated = await apiFetch(`/api/teams/${team._id}`, { + const updated = await apiFetch(`/api/teams/${team._id}`, { method: "PUT", body: JSON.stringify(team), }); @@ -69,7 +69,7 @@ export default function SeasonTeamsPage() { ); } else { // Création - const created = await apiFetch(`/api/teams`, { + const created = await apiFetch(`/api/teams`, { method: "POST", body: JSON.stringify(team), }); diff --git a/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx b/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx index 76ab452..07a67f7 100644 --- a/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx +++ b/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx @@ -5,6 +5,7 @@ import { useEffect, useState } from "react"; import { useSearchParams, useRouter } from "next/navigation"; import { apiFetch } from "@/lib/api"; +import type { ApiMessage } from "@/lib/auth"; import { Card, CardContent, @@ -34,7 +35,9 @@ export default function VerifyEmailPage() { const verify = async () => { try { - const res = await apiFetch(`/api/auth/verify-email?token=${token}`); + const res = await apiFetch( + `/api/auth/verify-email?token=${token}`, + ); setStatus("success"); setMessage(res.message); } catch (err: any) { diff --git a/saintBarthVolleyApp/frontend/src/components/auth/register-form.tsx b/saintBarthVolleyApp/frontend/src/components/auth/register-form.tsx index d4a5d5e..bc34cfc 100644 --- a/saintBarthVolleyApp/frontend/src/components/auth/register-form.tsx +++ b/saintBarthVolleyApp/frontend/src/components/auth/register-form.tsx @@ -14,6 +14,7 @@ import { } from "@/components/ui/card"; import Link from "next/link"; import { apiFetch } from "@/lib/api"; +import type { ApiMessage } from "@/lib/auth"; export function RegisterForm() { const [form, setForm] = useState({ @@ -56,7 +57,7 @@ export function RegisterForm() { } try { - const data = await apiFetch("/api/auth/register", { + const data = await apiFetch("/api/auth/register", { method: "POST", body: JSON.stringify({ firstName: form.firstName, diff --git a/saintBarthVolleyApp/frontend/src/components/dashboard/admin/app-sidebar.tsx b/saintBarthVolleyApp/frontend/src/components/dashboard/admin/app-sidebar.tsx index e5a544a..b322351 100644 --- a/saintBarthVolleyApp/frontend/src/components/dashboard/admin/app-sidebar.tsx +++ b/saintBarthVolleyApp/frontend/src/components/dashboard/admin/app-sidebar.tsx @@ -8,7 +8,6 @@ import { IconNews, IconCalendar, IconUsersGroup, - IconBallVolleyball, IconStar, IconSettings, IconHelp, @@ -29,13 +28,13 @@ import { } from "@/components/ui/sidebar"; import Link from "next/link"; import { apiFetch } from "@/lib/api"; +import type { AuthUser } from "@/lib/auth"; const navMain = [ { title: "Dashboard", url: "/admin", icon: IconDashboard }, { title: "Club", url: "/admin/club", icon: IconBuildingCommunity }, { title: "Saisons & Équipes", url: "/admin/seasons", icon: IconCalendar }, { title: "Membres", url: "/admin/members", icon: IconUsersGroup }, - { title: "Matches", url: "/admin/matches", icon: IconBallVolleyball }, { title: "Actualités", url: "/admin/news", icon: IconNews }, { title: "Partenaires", url: "/admin/partners", icon: IconStar }, { title: "Utilisateurs", url: "/admin/users", icon: IconUsers }, @@ -46,18 +45,12 @@ const navSecondary = [ { title: "Aide", url: "/admin/help", icon: IconHelp }, ]; -interface AuthUser { - firstName: string; - lastName: string; - email: string; -} - export function AppSidebar({ ...props }: React.ComponentProps) { const [user, setUser] = React.useState(null); React.useEffect(() => { - apiFetch("/api/auth/me") - .then((data: AuthUser) => setUser(data)) + apiFetch("/api/auth/me") + .then(setUser) .catch(() => setUser(null)); }, []); diff --git a/saintBarthVolleyApp/frontend/src/lib/auth.ts b/saintBarthVolleyApp/frontend/src/lib/auth.ts index 2adbe53..7a64de3 100644 --- a/saintBarthVolleyApp/frontend/src/lib/auth.ts +++ b/saintBarthVolleyApp/frontend/src/lib/auth.ts @@ -1,5 +1,9 @@ import { apiFetch } from "./api"; +export interface ApiMessage { + message: string; +} + export interface AuthUser { _id: string; email: string; @@ -23,29 +27,29 @@ export const authApi = { firstName: string; lastName: string; }) => - apiFetch("/api/auth/register", { + apiFetch("/api/auth/register", { method: "POST", body: JSON.stringify(body), }), - logout: () => apiFetch("/api/auth/logout", { method: "POST" }), + logout: () => apiFetch("/api/auth/logout", { method: "POST" }), me: () => apiFetch("/api/auth/me"), resendVerification: (email: string) => - apiFetch("/api/auth/resend-verification", { + apiFetch("/api/auth/resend-verification", { method: "POST", body: JSON.stringify({ email }), }), forgotPassword: (email: string) => - apiFetch("/api/auth/forgot-password", { + apiFetch("/api/auth/forgot-password", { method: "POST", body: JSON.stringify({ email }), }), resetPassword: (token: string, password: string) => - apiFetch("/api/auth/reset-password", { + apiFetch("/api/auth/reset-password", { method: "POST", body: JSON.stringify({ token, password }), }), From 7a9dbca840582c6e9312c514f19c91b9016e8c5f Mon Sep 17 00:00:00 2001 From: rustyrory Date: Sun, 5 Apr 2026 21:42:28 +0200 Subject: [PATCH 2/5] feat(dashboard): Fixes #138 - Dashboard membres et teams --- .../frontend/src/app/reset-password/page.tsx | 14 +++++++++++--- .../frontend/src/app/verify-email/page.tsx | 13 ++++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/saintBarthVolleyApp/frontend/src/app/reset-password/page.tsx b/saintBarthVolleyApp/frontend/src/app/reset-password/page.tsx index 7c35ba7..cfd3499 100644 --- a/saintBarthVolleyApp/frontend/src/app/reset-password/page.tsx +++ b/saintBarthVolleyApp/frontend/src/app/reset-password/page.tsx @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ "use client"; -import { useState } from "react"; +import { Suspense, useState } from "react"; import { useSearchParams, useRouter } from "next/navigation"; import { authApi } from "@/lib/auth"; import { Button } from "@/components/ui/button"; @@ -15,7 +15,7 @@ import { import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; -export default function ResetPasswordPage() { +function ResetPasswordForm() { const searchParams = useSearchParams(); const router = useRouter(); @@ -59,7 +59,7 @@ export default function ResetPasswordPage() {
- Mot de passe mis à jour ✅ + Mot de passe mis à jour {message} @@ -117,3 +117,11 @@ export default function ResetPasswordPage() {
); } + +export default function ResetPasswordPage() { + return ( + Chargement...
}> + + + ); +} diff --git a/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx b/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx index 07a67f7..2eca35e 100644 --- a/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx +++ b/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx @@ -1,8 +1,7 @@ -/* eslint-disable react-hooks/set-state-in-effect */ /* eslint-disable @typescript-eslint/no-explicit-any */ "use client"; -import { useEffect, useState } from "react"; +import { Suspense, useEffect, useState } from "react"; import { useSearchParams, useRouter } from "next/navigation"; import { apiFetch } from "@/lib/api"; import type { ApiMessage } from "@/lib/auth"; @@ -15,7 +14,7 @@ import { } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; -export default function VerifyEmailPage() { +function VerifyEmailContent() { const searchParams = useSearchParams(); const router = useRouter(); @@ -77,3 +76,11 @@ export default function VerifyEmailPage() {
); } + +export default function VerifyEmailPage() { + return ( + Chargement...
}> + + + ); +} From f57588a2f1ad5921a6005412922a689ca017e01f Mon Sep 17 00:00:00 2001 From: rustyrory Date: Sun, 5 Apr 2026 21:45:11 +0200 Subject: [PATCH 3/5] feat(dashboard): Fixes #138 - Dashboard membres et teams --- .../frontend/src/app/admin/partners/page.tsx | 2 ++ .../admin/seasons/[seasonId]/teams/[teamId]/page.tsx | 11 +++++++++-- .../frontend/src/app/verify-email/page.tsx | 11 +++++------ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/saintBarthVolleyApp/frontend/src/app/admin/partners/page.tsx b/saintBarthVolleyApp/frontend/src/app/admin/partners/page.tsx index 1a74d7f..ac860bb 100644 --- a/saintBarthVolleyApp/frontend/src/app/admin/partners/page.tsx +++ b/saintBarthVolleyApp/frontend/src/app/admin/partners/page.tsx @@ -150,6 +150,7 @@ export default function PartnersPage() { >
{p.logo ? ( + // eslint-disable-next-line @next/next/no-img-element {p.name} {editing.logo && ( + // eslint-disable-next-line @next/next/no-img-element Aperçu logo ); @@ -1000,8 +1004,11 @@ export default function TeamDetailPage() { return (
{rolePhoto ? ( - diff --git a/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx b/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx index 2eca35e..490273d 100644 --- a/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx +++ b/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx @@ -26,13 +26,12 @@ function VerifyEmailContent() { useEffect(() => { const token = searchParams.get("token"); - if (!token) { - setStatus("error"); - setMessage("Token manquant"); - return; - } - const verify = async () => { + if (!token) { + setStatus("error"); + setMessage("Token manquant"); + return; + } try { const res = await apiFetch( `/api/auth/verify-email?token=${token}`, From a232f524bdd87ebab084cfb7840543600b5d6d16 Mon Sep 17 00:00:00 2001 From: rustyrory Date: Sun, 5 Apr 2026 21:49:09 +0200 Subject: [PATCH 4/5] feat(dashboard): Fixes #138 - Dashboard membres et teams --- .gitattributes | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..0b1d554 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,8 @@ +* text=auto eol=lf +*.js text eol=lf +*.ts text eol=lf +*.tsx text eol=lf +*.json text eol=lf +*.md text eol=lf +*.yml text eol=lf +*.yaml text eol=lf From 1d6c7be2c56cbb2c05ac5502f478f25d099247d8 Mon Sep 17 00:00:00 2001 From: rustyrory Date: Sun, 5 Apr 2026 21:52:45 +0200 Subject: [PATCH 5/5] feat(dashboard): Fixes #138 - Dashboard membres et teams --- saintBarthVolleyApp/backend/server.js | 5 +++-- saintBarthVolleyApp/frontend/.lintstagedrc.js | 6 +++--- saintBarthVolleyApp/frontend/middleware.ts | 2 +- .../frontend/src/app/reset-password/page.tsx | 8 +++++++- .../frontend/src/app/verify-email/page.tsx | 8 +++++++- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/saintBarthVolleyApp/backend/server.js b/saintBarthVolleyApp/backend/server.js index 487fd14..915dff9 100644 --- a/saintBarthVolleyApp/backend/server.js +++ b/saintBarthVolleyApp/backend/server.js @@ -9,7 +9,8 @@ const PORT = process.env.PORT || 5000; const MONGO_URI = process.env.MONGO_URI || 'mongodb://127.0.0.1:27017/saintbarthvolley'; // Connexion MongoDB -mongoose.connect(MONGO_URI) +mongoose + .connect(MONGO_URI) .then(() => { console.log('MongoDB connected'); @@ -18,4 +19,4 @@ mongoose.connect(MONGO_URI) console.log(`Server launched on http://localhost:${PORT}`); }); }) - .catch(err => console.error('Error MongoDB:', err)); \ No newline at end of file + .catch((err) => console.error('Error MongoDB:', err)); diff --git a/saintBarthVolleyApp/frontend/.lintstagedrc.js b/saintBarthVolleyApp/frontend/.lintstagedrc.js index 8b3f16e..786ad8f 100644 --- a/saintBarthVolleyApp/frontend/.lintstagedrc.js +++ b/saintBarthVolleyApp/frontend/.lintstagedrc.js @@ -1,10 +1,10 @@ // const path = require('path') - + // const buildEslintCommand = (filenames) => // `eslint --fix ${filenames // .map((f) => `"${path.relative(process.cwd(), f)}"`) // .join(' ')}` - + // module.exports = { // '*.{js,jsx,ts,tsx}': [buildEslintCommand], -// } \ No newline at end of file +// } diff --git a/saintBarthVolleyApp/frontend/middleware.ts b/saintBarthVolleyApp/frontend/middleware.ts index d512e33..3a7dd7f 100644 --- a/saintBarthVolleyApp/frontend/middleware.ts +++ b/saintBarthVolleyApp/frontend/middleware.ts @@ -17,4 +17,4 @@ export function middleware(req: NextRequest) { export const config = { matcher: ["/admin/:path*"], -}; \ No newline at end of file +}; diff --git a/saintBarthVolleyApp/frontend/src/app/reset-password/page.tsx b/saintBarthVolleyApp/frontend/src/app/reset-password/page.tsx index cfd3499..ca1f5fe 100644 --- a/saintBarthVolleyApp/frontend/src/app/reset-password/page.tsx +++ b/saintBarthVolleyApp/frontend/src/app/reset-password/page.tsx @@ -120,7 +120,13 @@ function ResetPasswordForm() { export default function ResetPasswordPage() { return ( - Chargement...
}> + + Chargement... +
+ } + > ); diff --git a/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx b/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx index 490273d..18d4f81 100644 --- a/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx +++ b/saintBarthVolleyApp/frontend/src/app/verify-email/page.tsx @@ -78,7 +78,13 @@ function VerifyEmailContent() { export default function VerifyEmailPage() { return ( - Chargement...}> + + Chargement... + + } + > );