diff --git a/src/app/leaderboards/components/LeaderboardRow.tsx b/src/app/leaderboards/components/LeaderboardRow.tsx index 06d8598..884bc1b 100644 --- a/src/app/leaderboards/components/LeaderboardRow.tsx +++ b/src/app/leaderboards/components/LeaderboardRow.tsx @@ -1,71 +1,88 @@ -import { Trophy } from "lucide-react"; +import { LeaderboardRank } from "@/modules/leaderboard/types"; +import { LinkIcon, Trophy } from "lucide-react"; +import Link from "next/link"; -interface LeaderboardRowProps { - rank: number; - username: string; - pb: string; - runsCount: number; - category: string; +const LeaderboardRow = ({ + index = 0, + run, +}: { index?: number; -} - -const LeaderboardRow = ({ rank, username, pb, runsCount, category, index = 0 }: LeaderboardRowProps) => { + run: LeaderboardRank; +}) => { const getRankStyle = (rank: number) => { - if (rank === 1) return "rank-gold"; - if (rank === 2) return "rank-silver"; - if (rank === 3) return "rank-bronze"; + if (run.rank === 1) return "rank-gold"; + if (run.rank === 2) return "rank-silver"; + if (run.rank === 3) return "rank-bronze"; return "bg-secondary text-muted-foreground"; }; const getRankGlow = (rank: number) => { - if (rank === 1) return "glow-gold"; - if (rank === 2) return "glow-silver"; - if (rank === 3) return "glow-bronze"; + if (run.rank === 1) return "glow-gold"; + if (run.rank === 2) return "glow-silver"; + if (run.rank === 3) return "glow-bronze"; return ""; }; - const isTopThree = rank <= 3; + const isTopThree = run.rank <= 3; return ( - {/* Rank */} - -
- {rank <= 3 ? : rank} + +
+ {isTopThree ? : run.rank}
{/* Username */} - +
-
- {username.charAt(0).toUpperCase()} -
- - {username} + + {run.username}
- {/* PB */} - - {pb} - - - {/* Runs */} - - {runsCount} + {/* Time */} + + + {run.pb} + {/* Category */} - {category} + {run.category} + + {/* Assisted */} + + + {run.assisted ? "Assisted" : "Unassisted"} + + + + {/* Runs */} + {run.runsCount} + + {/* Problem */} + + + {run.problem} + + ); }; diff --git a/src/app/leaderboards/page.tsx b/src/app/leaderboards/page.tsx index 360b4d2..0a9c3fe 100644 --- a/src/app/leaderboards/page.tsx +++ b/src/app/leaderboards/page.tsx @@ -114,16 +114,28 @@ export default function Leaderboards() { - Rank - Runner - PB - Runs - Category + +

Rank

+
+ +

Runner

+
+ +

Time

+
+ +

Category

+
+ +

Assisted

+
+ Runs + Problem
{data.map((entry, i) => ( - + ))}
diff --git a/src/modules/leaderboard/actions.ts b/src/modules/leaderboard/actions.ts index 34f7f0a..c62bab4 100644 --- a/src/modules/leaderboard/actions.ts +++ b/src/modules/leaderboard/actions.ts @@ -1,154 +1,194 @@ "use server"; import * as Core from "./core"; -import { Leaderboard } from "./types"; +import { LeaderboardRank } from "./types"; // updated interface -export async function getGlobalLeaderboard(): Promise { +export async function getGlobalLeaderboard(): Promise { return [ { rank: 1, username: "speedmaster_x", pb: "2:34.21", runsCount: 2341, - category: "Any%", + problem: "Fix broken login flow", + category: "any%", + assisted: false, }, { rank: 2, username: "algo_ninja", pb: "2:38.54", runsCount: 1876, - category: "Any%", + problem: "Refactor legacy API endpoints", + category: "any%", + assisted: false, }, { rank: 3, username: "clockwork", pb: "2:41.02", runsCount: 3102, - category: "Any%", + problem: "Optimize image upload pipeline", + category: "any%", + assisted: false, }, { rank: 4, username: "fastfingers99", pb: "2:45.33", runsCount: 987, - category: "Any%", + problem: "Build a mini chat server", + category: "any%", + assisted: false, }, { rank: 5, username: "recursion_queen", pb: "2:47.89", runsCount: 1543, - category: "Any%", + problem: "Fix CSS layout bug in dashboard", + category: "any%", + assisted: false, }, { rank: 6, username: "bitshifter", pb: "2:52.11", runsCount: 2109, - category: "Any%", + problem: "Implement JWT authentication", + category: "any%", + assisted: false, }, { rank: 7, username: "nullpointer", pb: "2:54.67", runsCount: 876, - category: "Any%", + problem: "Create REST endpoint for user data", + category: "any%", + assisted: false, }, { rank: 8, username: "stackattack", pb: "2:58.23", runsCount: 1234, - category: "Any%", + problem: "Fix off-by-one bug in sorting function", + category: "any%", + assisted: false, }, { rank: 9, username: "looplegend", pb: "3:01.45", runsCount: 654, - category: "Any%", + problem: "Optimize SQL query for reports", + category: "any%", + assisted: false, }, { rank: 10, username: "coderunner", pb: "3:05.78", runsCount: 1098, - category: "Any%", + problem: "Add file upload validation", + category: "any%", + assisted: false, }, ]; } -export async function getWeeklyLeaderboard(): Promise { +export async function getWeeklyLeaderboard(): Promise { return [ { rank: 1, username: "weekly_warrior", pb: "2:51.33", runsCount: 156, - category: "Any%", + problem: "Build notifications API", + category: "any%", + assisted: false, }, { rank: 2, username: "speedmaster_x", pb: "2:53.12", runsCount: 89, - category: "Any%", + problem: "Build notifications API", + category: "any%", + assisted: false, }, { rank: 3, username: "newbie_grinder", pb: "2:58.67", runsCount: 234, - category: "Any%", + problem: "Build notifications API", + category: "any%", + assisted: false, }, { rank: 4, username: "algo_ninja", pb: "3:02.45", runsCount: 67, - category: "Any%", + problem: "Build notifications API", + category: "any%", + assisted: false, }, { rank: 5, username: "fresh_runner", pb: "3:05.89", runsCount: 45, - category: "Any%", + problem: "Build notifications API", + category: "any%", + assisted: false, }, { rank: 6, username: "practice_makes", pb: "3:08.12", runsCount: 112, - category: "Any%", + problem: "Build notifications API", + category: "any%", + assisted: false, }, { rank: 7, username: "splitmaster", pb: "3:12.34", runsCount: 78, - category: "Any%", + problem: "Build notifications API", + category: "any%", + assisted: false, }, { rank: 8, username: "grindtime", pb: "3:15.56", runsCount: 92, - category: "Any%", + problem: "Build notifications API", + category: "any%", + assisted: false, }, { rank: 9, username: "pb_hunter", pb: "3:18.90", runsCount: 56, - category: "Any%", + problem: "Build notifications API", + category: "any%", + assisted: false, }, { rank: 10, username: "reset_king", pb: "3:22.11", runsCount: 187, - category: "Any%", + problem: "Build notifications API", + category: "any%", + assisted: false, }, ]; } diff --git a/src/modules/leaderboard/types.ts b/src/modules/leaderboard/types.ts index 4f25bf1..0f1cc51 100644 --- a/src/modules/leaderboard/types.ts +++ b/src/modules/leaderboard/types.ts @@ -5,5 +5,7 @@ export interface LeaderboardRank { username: string; pb: string; runsCount: number; - category: string; + problem: string; + category: "any%" | "100%"; + assisted: boolean; }