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;
+}