From aed510afd500f8731b53485163b265d4d044773c Mon Sep 17 00:00:00 2001 From: jessy-david-dev Date: Fri, 10 Apr 2026 17:30:13 +0200 Subject: [PATCH] feat(leaderboard): add global rankings screen with solo/multi/all filters --- app/api/leaderboard/route.ts | 40 +++++++++ app/components/HomeScreen.tsx | 6 +- app/components/LeaderboardScreen.tsx | 99 +++++++++++++++++++++ app/components/ScreenRouter.tsx | 6 ++ app/favicon.ico | Bin 25931 -> 35758 bytes app/globals.css | 128 +++++++++++++++++++++++++++ lib/types.ts | 2 +- 7 files changed, 279 insertions(+), 2 deletions(-) create mode 100644 app/api/leaderboard/route.ts create mode 100644 app/components/LeaderboardScreen.tsx diff --git a/app/api/leaderboard/route.ts b/app/api/leaderboard/route.ts new file mode 100644 index 0000000..31a5c89 --- /dev/null +++ b/app/api/leaderboard/route.ts @@ -0,0 +1,40 @@ +import { NextResponse } from "next/server"; +import { prisma } from "../../../lib/prisma"; + +export async function GET() { + const users = await prisma.user.findMany({ + include: { games: true }, + }); + + const rows = users + .map((u) => { + const all = u.games; + const solo = all.filter((g) => g.mode === "solo"); + const multi = all.filter((g) => g.mode === "multi"); + const wins = all.filter((g) => g.won); + const wonGames = all.filter((g) => g.won && g.clicks > 0); + const avgClicks = wonGames.length + ? Math.round(wonGames.reduce((s, g) => s + g.clicks, 0) / wonGames.length) + : null; + const bestTime = wins.length + ? Math.min(...wins.map((g) => g.timeSeconds)) + : null; + + return { + id: u.id, + name: u.name, + totalGames: all.length, + wins: wins.length, + soloGames: solo.length, + soloWins: solo.filter((g) => g.won).length, + multiGames: multi.length, + multiWins: multi.filter((g) => g.won).length, + avgClicks, + bestTime, + }; + }) + .filter((r) => r.totalGames > 0) + .sort((a, b) => b.wins - a.wins || b.totalGames - a.totalGames); + + return NextResponse.json(rows); +} diff --git a/app/components/HomeScreen.tsx b/app/components/HomeScreen.tsx index c035543..7122d79 100644 --- a/app/components/HomeScreen.tsx +++ b/app/components/HomeScreen.tsx @@ -17,16 +17,20 @@ type HomeScreenProps = { session: Session | null; onShowAuth: () => void; onShowProfile: () => void; + onShowLeaderboard: () => void; }; export function HomeScreen({ playerName, setPlayerName, joinCode, setJoinCode, error, setError, loading, onCreateRoom, onJoinRoom, onSolo, - session, onShowAuth, onShowProfile, + session, onShowAuth, onShowProfile, onShowLeaderboard, }: HomeScreenProps) { return (
+ {session?.user ? ( +

Classement

+
+ +
+ {(["all", "solo", "multi"] as Mode[]).map((m) => ( + + ))} +
+ + {loading ? ( +
+ ) : sorted.length === 0 ? ( +

Aucune partie jouée pour le moment.

+ ) : ( +
+ {sorted.map((row, i) => { + const games = mode === "solo" ? row.soloGames : mode === "multi" ? row.multiGames : row.totalGames; + const wins = mode === "solo" ? row.soloWins : mode === "multi" ? row.multiWins : row.wins; + + return ( +
+ {MEDALS[i] ?? `#${i + 1}`} + {row.name} +
+ {wins}victoires + {games}parties + {row.avgClicks != null && ( + {row.avgClicks}moy. clics + )} + {row.bestTime != null && ( + {fmt(row.bestTime)}meilleur temps + )} +
+
+ ); + })} +
+ )} +
+ ); +} diff --git a/app/components/ScreenRouter.tsx b/app/components/ScreenRouter.tsx index 8f17b29..31003e6 100644 --- a/app/components/ScreenRouter.tsx +++ b/app/components/ScreenRouter.tsx @@ -13,6 +13,7 @@ import { SoloScreen } from "./SoloScreen"; import { GameScreen } from "./GameScreen"; import { AuthModal } from "./AuthModal"; import { ProfileScreen } from "./ProfileScreen"; +import { LeaderboardScreen } from "./LeaderboardScreen"; type Props = { screen: Screen; @@ -41,6 +42,10 @@ export function ScreenRouter({ setScreen("home")} /> ); + if (screen === "leaderboard") return ( + setScreen("home")} /> + ); + if (screen === "home") return ( <> setShowAuth(true)} onShowProfile={() => setScreen("profile")} + onShowLeaderboard={() => setScreen("leaderboard")} /> {showAuth && setShowAuth(false)} onSuccess={() => setShowAuth(false)} />} diff --git a/app/favicon.ico b/app/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..8476065165b11f0b41d58ceffdc9b18ee6282ab3 100644 GIT binary patch literal 35758 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 LwzsUcco_Q+iJ-_6 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/app/globals.css b/app/globals.css index e12e2f3..bb42f73 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1323,6 +1323,9 @@ body { position: absolute; top: 16px; right: 16px; + display: flex; + align-items: center; + gap: 8px; } .btn-account { @@ -1545,3 +1548,128 @@ body { } .game-path-sep { margin: 0 2px; } .game-path-end { color: var(--green); font-weight: 600; } + +/* ================================ + Leaderboard + ================================ */ + +.leaderboard-screen { + max-width: 640px; + margin: 0 auto; + padding: 24px 16px 48px; +} + +.leaderboard-header { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 24px; +} + +.leaderboard-title { + font-size: 24px; + font-weight: 800; +} + +.leaderboard-tabs { + display: flex; + gap: 8px; + margin-bottom: 20px; +} + +.leaderboard-tab { + flex: 1; + padding: 8px; + border-radius: var(--radius); + border: 1px solid var(--border); + background: var(--bg-2); + color: var(--text-muted); + font-size: 13px; + font-weight: 600; + cursor: pointer; + transition: background var(--transition), color var(--transition); +} + +.leaderboard-tab.active { + background: var(--accent); + color: #fff; + border-color: var(--accent); +} + +.leaderboard-loading { + display: flex; + justify-content: center; + padding: 48px; +} + +.leaderboard-empty { + text-align: center; + color: var(--text-muted); + padding: 48px 0; +} + +.leaderboard-list { + display: flex; + flex-direction: column; + gap: 10px; +} + +.leaderboard-row { + display: flex; + align-items: center; + gap: 12px; + padding: 14px 16px; + background: var(--bg-2); + border-radius: var(--radius); + border: 1px solid var(--border); +} + +.leaderboard-row.top { + border-color: var(--accent); + background: color-mix(in srgb, var(--accent) 8%, var(--bg-2)); +} + +.lb-rank { + font-size: 22px; + width: 32px; + text-align: center; + flex-shrink: 0; +} + +.lb-name { + font-weight: 700; + font-size: 15px; + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.lb-stats { + display: flex; + gap: 16px; + flex-shrink: 0; +} + +.lb-stat { + display: flex; + flex-direction: column; + align-items: center; + gap: 1px; +} + +.lb-stat-val { + font-size: 15px; + font-weight: 800; + font-variant-numeric: tabular-nums; + color: var(--text); +} + +.lb-stat-label { + font-size: 9px; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--text-muted); +} diff --git a/lib/types.ts b/lib/types.ts index 8c61e43..9cca4a5 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -1,4 +1,4 @@ -export type Screen = "home" | "lobby" | "game" | "solo" | "profile"; +export type Screen = "home" | "lobby" | "game" | "solo" | "profile" | "leaderboard"; export type WikiArticle = { title: string;