diff --git a/CLAUDE.md b/CLAUDE.md index 6a24a9f..e37f89d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -179,7 +179,7 @@ Deuxième volet de l'audit (revue complète de tout le code applicatif, pas seul | `/` | Redirige vers `/leaderboard` si connecté, sinon `/login` | | `/login` | Email + mot de passe | | `/signup` | Email + mot de passe + pseudo + photo (recadrée) ; gère l'attente de confirmation email | -| `/leaderboard` | « L'Agora » — podium top 3 + liste, Realtime, contrôles de points pour les juges, date/décompte du Tribunal en en-tête (`src/lib/tribunal-date.ts`, partagé avec `/calendrier`). Joue le rôle de page d'accueil (`/` y redirige) : une rangée de raccourcis (`quick-links.tsx`, icônes réutilisées du menu du header) vers les pages d'activité — jeux, Mur, Urne, Crieur — juste au-dessus du classement | +| `/leaderboard` | « L'Agora » — podium top 3 + liste, Realtime, contrôles de points pour les juges, date/décompte du Tribunal en en-tête (`src/lib/tribunal-date.ts`, partagé avec `/calendrier`). Joue le rôle de page d'accueil (`/` y redirige) : une rangée de raccourcis (`quick-links.tsx`, icônes réutilisées du menu du header) vers les pages d'activité — jeux, Mur, Urne, Crieur — juste au-dessus du classement, avec une pastille façon iOS sur le raccourci du Mur (nombre de publications du jour, via `wall_notes_for_date()` — pas de lecture directe de `wall_notes`, dont la RLS ne laisserait voir que ses propres notes) | | `/icare` | « Le Vol d'Icare » — Flappy Bird grec, record personnel all-time, scores figés au Tribunal, points attribués automatiquement | | `/corne` | « La Corne d'Abondance » — jeu de fusion façon Watermelon Game (avatars aléatoires, physique `matter-js`), même mécanique de gloires que Le Vol d'Icare | | `/char` | « Le Jeu de l'Agora » — format paysage (projeté) : Le Char (2 colonnes de 3, boutons de duel), Le Gardien du Silence (tirage aléatoire, minuteur discret) et La Roulette (tirage au sort animé) | diff --git a/src/app/leaderboard/page.tsx b/src/app/leaderboard/page.tsx index 9dd2d02..d09e68d 100644 --- a/src/app/leaderboard/page.tsx +++ b/src/app/leaderboard/page.tsx @@ -15,12 +15,17 @@ export default async function LeaderboardPage() { redirect("/login"); } - const [{ data: profiles, error }, { data: settings }] = await Promise.all([ + const [{ data: profiles, error }, { data: settings }, { data: wallNotesToday }] = await Promise.all([ supabase .from("profiles") .select("id, pseudo, avatar_url, points, previous_rank, role") .order("points", { ascending: false }), supabase.from("settings").select("tribunal_date").eq("id", true).single(), + // wall_notes_for_date() (jamais une lecture directe de wall_notes, dont + // la RLS ne laisserait voir que ses propres notes) : seul moyen de + // connaître le nombre total de publications du jour sans exposer qui a + // publié quoi — sert juste de compteur pour la pastille du raccourci. + supabase.rpc("wall_notes_for_date"), ]); const isJudge = profiles?.find((p) => p.id === user.id)?.role === "judge"; @@ -37,7 +42,7 @@ export default async function LeaderboardPage() { {tribunalDate &&

{formatTribunalDateTime(tribunalDate)}

} - + {error && (

diff --git a/src/app/leaderboard/quick-links.tsx b/src/app/leaderboard/quick-links.tsx index fd4963e..54c4250 100644 --- a/src/app/leaderboard/quick-links.tsx +++ b/src/app/leaderboard/quick-links.tsx @@ -15,19 +15,33 @@ const LINKS = [ { href: "/journal", label: "Le Crieur", icon: IconScroll }, ] as const; -export function QuickLinks() { +export function QuickLinks({ wallNoteCount }: { wallNoteCount: number }) { return (

); }