diff --git a/app/api/leaderboard/route.ts b/app/api/leaderboard/route.ts index 892ff40..188b7de 100644 --- a/app/api/leaderboard/route.ts +++ b/app/api/leaderboard/route.ts @@ -20,6 +20,8 @@ export async function GET() { const all = u.games; const solo = all.filter((g) => g.mode === "solo"); const multi = all.filter((g) => g.mode === "multi"); + const daily = all.filter((g) => g.mode === "daily"); + const blitz = all.filter((g) => g.mode === "blitz"); const wins = all.filter((g) => g.won); const wonGames = wins.filter((g) => g.clicks > 0); const avgClicks = wonGames.length @@ -31,15 +33,36 @@ export async function GET() { ? Math.min(...wins.map((g) => g.timeSeconds)) : null; + const soloWins = solo.filter((g) => g.won); + const dailyWins = daily.filter((g) => g.won); + const blitzWins = blitz.filter((g) => g.won); + + const soloAvgClicks = soloWins.filter((g) => g.clicks > 0).length + ? Math.round(soloWins.reduce((s, g) => s + g.clicks, 0) / soloWins.filter((g) => g.clicks > 0).length) + : null; + const dailyAvgClicks = dailyWins.filter((g) => g.clicks > 0).length + ? Math.round(dailyWins.reduce((s, g) => s + g.clicks, 0) / dailyWins.filter((g) => g.clicks > 0).length) + : null; + const blitzBestTime = blitzWins.length + ? Math.min(...blitzWins.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, + soloWins: soloWins.length, + soloAvgClicks, multiGames: multi.length, multiWins: multi.filter((g) => g.won).length, + dailyGames: daily.length, + dailyWins: dailyWins.length, + dailyAvgClicks, + blitzGames: blitz.length, + blitzWins: blitzWins.length, + blitzBestTime, avgClicks, bestTime, }; diff --git a/app/components/LeaderboardScreen.tsx b/app/components/LeaderboardScreen.tsx index 8567b3e..d0eada0 100644 --- a/app/components/LeaderboardScreen.tsx +++ b/app/components/LeaderboardScreen.tsx @@ -10,13 +10,20 @@ type LeaderboardRow = { wins: number; soloGames: number; soloWins: number; + soloAvgClicks: number | null; multiGames: number; multiWins: number; + dailyGames: number; + dailyWins: number; + dailyAvgClicks: number | null; + blitzGames: number; + blitzWins: number; + blitzBestTime: number | null; avgClicks: number | null; bestTime: number | null; }; -type Mode = "all" | "solo" | "multi"; +type Mode = "all" | "solo" | "multi" | "daily" | "blitz"; function fmt(s: number): string { const m = Math.floor(s / 60); @@ -56,13 +63,21 @@ export function LeaderboardScreen({ onBack }: { onBack: () => void }) { ? r.soloGames > 0 : mode === "multi" ? r.multiGames > 0 - : true, + : mode === "daily" + ? r.dailyGames > 0 + : mode === "blitz" + ? r.blitzGames > 0 + : true, ) .sort((a, b) => { if (mode === "solo") return b.soloWins - a.soloWins || b.soloGames - a.soloGames; if (mode === "multi") return b.multiWins - a.multiWins || b.multiGames - a.multiGames; + if (mode === "daily") + return b.dailyWins - a.dailyWins || b.dailyGames - a.dailyGames; + if (mode === "blitz") + return b.blitzWins - a.blitzWins || b.blitzGames - a.blitzGames; return b.wins - a.wins || b.totalGames - a.totalGames; }); @@ -80,14 +95,14 @@ export function LeaderboardScreen({ onBack }: { onBack: () => void }) { {/* Tabs */} -