From e642478a2bb33adc4ebcf83ca68be3740f971bfe Mon Sep 17 00:00:00 2001 From: automaton365-sys Date: Tue, 3 Mar 2026 10:39:58 +0000 Subject: [PATCH] feat(leaderboard): add deterministic sorting, tie-aware ranks, and responsive layout --- src/app/leaderboard/page.tsx | 49 ++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/src/app/leaderboard/page.tsx b/src/app/leaderboard/page.tsx index e8e77c0..bf81a30 100644 --- a/src/app/leaderboard/page.tsx +++ b/src/app/leaderboard/page.tsx @@ -1,7 +1,26 @@ import { mockLeaderboard } from "@/data/mock-leaderboard"; export default function LeaderboardPage() { - const sorted = [...mockLeaderboard].sort((a, b) => b.earned - a.earned); + const sorted = [...mockLeaderboard].sort((a, b) => { + if (b.earned !== a.earned) return b.earned - a.earned; + if (b.bounties !== a.bounties) return b.bounties - a.bounties; + return a.name.localeCompare(b.name); + }); + + const getRank = (index: number) => { + if (index === 0) return 1; + const current = sorted[index]; + const prev = sorted[index - 1]; + + if ( + current.earned === prev.earned && + current.bounties === prev.bounties + ) { + return getRank(index - 1); + } + + return index + 1; + }; return (
@@ -13,24 +32,38 @@ export default function LeaderboardPage() {
-
+
Rank
Developer
Bounties
Total Earned
+ +
+ Top Developers +
+ {sorted.map((dev, index) => (
-
#{index + 1}
-
-
{dev.name}
+
#{getRank(index)}
+ +
+
{dev.name}
Reputation {dev.reputation}
-
{dev.bounties}
-
${dev.earned.toLocaleString()}
+ +
+ Bounties: + {dev.bounties} +
+ +
+ Earned: + ${dev.earned.toLocaleString()} +
))}