diff --git a/src/app/leaderboards/page.tsx b/src/app/leaderboards/page.tsx index fd28720..74f43d1 100644 --- a/src/app/leaderboards/page.tsx +++ b/src/app/leaderboards/page.tsx @@ -25,158 +25,19 @@ import { import LeaderboardRow from "@/app/leaderboards/components/LeaderboardRow"; import StatCard from "@/components/app/StatCard"; - -const globalLeaderboard = [ - { - rank: 1, - username: "speedmaster_x", - pb: "2:34.21", - runsCount: 2341, - category: "Any%", - }, - { - rank: 2, - username: "algo_ninja", - pb: "2:38.54", - runsCount: 1876, - category: "Any%", - }, - { - rank: 3, - username: "clockwork", - pb: "2:41.02", - runsCount: 3102, - category: "Any%", - }, - { - rank: 4, - username: "fastfingers99", - pb: "2:45.33", - runsCount: 987, - category: "Any%", - }, - { - rank: 5, - username: "recursion_queen", - pb: "2:47.89", - runsCount: 1543, - category: "Any%", - }, - { - rank: 6, - username: "bitshifter", - pb: "2:52.11", - runsCount: 2109, - category: "Any%", - }, - { - rank: 7, - username: "nullpointer", - pb: "2:54.67", - runsCount: 876, - category: "Any%", - }, - { - rank: 8, - username: "stackattack", - pb: "2:58.23", - runsCount: 1234, - category: "Any%", - }, - { - rank: 9, - username: "looplegend", - pb: "3:01.45", - runsCount: 654, - category: "Any%", - }, - { - rank: 10, - username: "coderunner", - pb: "3:05.78", - runsCount: 1098, - category: "Any%", - }, -]; -const weeklyLeaderboard = [ - { - rank: 1, - username: "weekly_warrior", - pb: "2:51.33", - runsCount: 156, - category: "Any%", - }, - { - rank: 2, - username: "speedmaster_x", - pb: "2:53.12", - runsCount: 89, - category: "Any%", - }, - { - rank: 3, - username: "newbie_grinder", - pb: "2:58.67", - runsCount: 234, - category: "Any%", - }, - { - rank: 4, - username: "algo_ninja", - pb: "3:02.45", - runsCount: 67, - category: "Any%", - }, - { - rank: 5, - username: "fresh_runner", - pb: "3:05.89", - runsCount: 45, - category: "Any%", - }, - { - rank: 6, - username: "practice_makes", - pb: "3:08.12", - runsCount: 112, - category: "Any%", - }, - { - rank: 7, - username: "splitmaster", - pb: "3:12.34", - runsCount: 78, - category: "Any%", - }, - { - rank: 8, - username: "grindtime", - pb: "3:15.56", - runsCount: 92, - category: "Any%", - }, - { - rank: 9, - username: "pb_hunter", - pb: "3:18.90", - runsCount: 56, - category: "Any%", - }, - { - rank: 10, - username: "reset_king", - pb: "3:22.11", - runsCount: 187, - category: "Any%", - }, -]; +import useAction from "@/hook/use-action"; +import { + getGlobalLeaderboard, + getWeeklyLeaderboard, +} from "@/modules/leaderboard/actions"; export default function Leaderboards() { + const [global, globalLoaded, globalError] = useAction(getGlobalLeaderboard); + const [weekly, weeklyLoaded, weeklyError] = useAction(getWeeklyLeaderboard); + const [activeTab, setActiveTab] = useState<"global" | "weekly">("global"); - const categories = ["Any%", "100%", "Easy Only", "No DP", "Blind"]; - - const data = activeTab === "global" ? globalLeaderboard : weeklyLeaderboard; + const data = (activeTab === "global" ? global : weekly) || []; return (
diff --git a/src/hook/use-action.ts b/src/hook/use-action.ts new file mode 100644 index 0000000..0f7468a --- /dev/null +++ b/src/hook/use-action.ts @@ -0,0 +1,19 @@ +import { useEffect, useState } from "react"; + +export default function useAction( + action: () => Promise, + dependencies = [], +): [T | null, boolean, Error | null] { + const [value, setValue] = useState(null); + const [loaded, setLoaded] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + action() + .then(setValue) + .catch(setError) + .finally(() => setLoaded(true)); + }, dependencies); + + return [value, loaded, error]; +} diff --git a/src/modules/leaderboard/actions.ts b/src/modules/leaderboard/actions.ts index f1179b4..34f7f0a 100644 --- a/src/modules/leaderboard/actions.ts +++ b/src/modules/leaderboard/actions.ts @@ -1,5 +1,154 @@ "use server"; import * as Core from "./core"; +import { Leaderboard } from "./types"; -export function getGlobalLeaderboard() {} +export async function getGlobalLeaderboard(): Promise { + return [ + { + rank: 1, + username: "speedmaster_x", + pb: "2:34.21", + runsCount: 2341, + category: "Any%", + }, + { + rank: 2, + username: "algo_ninja", + pb: "2:38.54", + runsCount: 1876, + category: "Any%", + }, + { + rank: 3, + username: "clockwork", + pb: "2:41.02", + runsCount: 3102, + category: "Any%", + }, + { + rank: 4, + username: "fastfingers99", + pb: "2:45.33", + runsCount: 987, + category: "Any%", + }, + { + rank: 5, + username: "recursion_queen", + pb: "2:47.89", + runsCount: 1543, + category: "Any%", + }, + { + rank: 6, + username: "bitshifter", + pb: "2:52.11", + runsCount: 2109, + category: "Any%", + }, + { + rank: 7, + username: "nullpointer", + pb: "2:54.67", + runsCount: 876, + category: "Any%", + }, + { + rank: 8, + username: "stackattack", + pb: "2:58.23", + runsCount: 1234, + category: "Any%", + }, + { + rank: 9, + username: "looplegend", + pb: "3:01.45", + runsCount: 654, + category: "Any%", + }, + { + rank: 10, + username: "coderunner", + pb: "3:05.78", + runsCount: 1098, + category: "Any%", + }, + ]; +} + +export async function getWeeklyLeaderboard(): Promise { + return [ + { + rank: 1, + username: "weekly_warrior", + pb: "2:51.33", + runsCount: 156, + category: "Any%", + }, + { + rank: 2, + username: "speedmaster_x", + pb: "2:53.12", + runsCount: 89, + category: "Any%", + }, + { + rank: 3, + username: "newbie_grinder", + pb: "2:58.67", + runsCount: 234, + category: "Any%", + }, + { + rank: 4, + username: "algo_ninja", + pb: "3:02.45", + runsCount: 67, + category: "Any%", + }, + { + rank: 5, + username: "fresh_runner", + pb: "3:05.89", + runsCount: 45, + category: "Any%", + }, + { + rank: 6, + username: "practice_makes", + pb: "3:08.12", + runsCount: 112, + category: "Any%", + }, + { + rank: 7, + username: "splitmaster", + pb: "3:12.34", + runsCount: 78, + category: "Any%", + }, + { + rank: 8, + username: "grindtime", + pb: "3:15.56", + runsCount: 92, + category: "Any%", + }, + { + rank: 9, + username: "pb_hunter", + pb: "3:18.90", + runsCount: 56, + category: "Any%", + }, + { + rank: 10, + username: "reset_king", + pb: "3:22.11", + runsCount: 187, + category: "Any%", + }, + ]; +} diff --git a/src/modules/leaderboard/types.ts b/src/modules/leaderboard/types.ts index e69de29..4f25bf1 100644 --- a/src/modules/leaderboard/types.ts +++ b/src/modules/leaderboard/types.ts @@ -0,0 +1,9 @@ +export type Leaderboard = LeaderboardRank[]; + +export interface LeaderboardRank { + rank: number; + username: string; + pb: string; + runsCount: number; + category: string; +}