aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/pages/Rankings.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/pages/Rankings.tsx')
-rw-r--r--frontend/src/pages/Rankings.tsx92
1 files changed, 92 insertions, 0 deletions
diff --git a/frontend/src/pages/Rankings.tsx b/frontend/src/pages/Rankings.tsx
new file mode 100644
index 0000000..377222f
--- /dev/null
+++ b/frontend/src/pages/Rankings.tsx
@@ -0,0 +1,92 @@
1import React, { useEffect } from "react";
2
3import RankingEntry from "../components/RankingEntry";
4import { Ranking, RankingType } from "../types/Ranking";
5import { API } from "../api/Api";
6
7import "../css/Rankings.css";
8
9const Rankings: React.FC = () => {
10 const [leaderboardData, setLeaderboardData] = React.useState<Ranking>();
11 const [currentLeaderboardCat, setCurrentLeaderboardCat] = React.useState<RankingCategories>();
12 const [currentLeaderboard, setCurrentLeaderboard] = React.useState<RankingType[]>();
13 const [load, setLoad] = React.useState<boolean>(false);
14
15 enum RankingCategories {
16 rankings_overall,
17 rankings_multiplayer,
18 rankings_singleplayer
19 }
20
21 const _fetch_rankings = async () => {
22 const rankings = await API.get_rankings();
23 setLeaderboardData(rankings);
24 setLoad(true);
25 }
26
27 const _set_current_leaderboard = (ranking_cat: RankingCategories) => {
28 if (ranking_cat == RankingCategories.rankings_singleplayer) {
29 setCurrentLeaderboard(leaderboardData!.rankings_singleplayer);
30 } else if (ranking_cat == RankingCategories.rankings_multiplayer) {
31 setCurrentLeaderboard(leaderboardData!.rankings_multiplayer);
32 } else {
33 setCurrentLeaderboard(leaderboardData!.rankings_overall);
34 }
35 }
36
37 useEffect(() => {
38 _fetch_rankings();
39 if (load) {
40 _set_current_leaderboard(RankingCategories.rankings_singleplayer);
41 }
42 }, [load])
43
44 return (
45 <main>
46 <section className="nav-container nav-1">
47 <div>
48 <button className="nav-1-btn">
49 <span>Official (LPHUB)</span>
50 </button>
51 <button className="nav-1-btn">
52 <span>Unofficial (Steam)</span>
53 </button>
54 </div>
55 </section>
56 <section className="nav-container nav-2">
57 <div>
58 <button onClick={() => _set_current_leaderboard(RankingCategories.rankings_singleplayer)} className="nav-2-btn">
59 <span>Singleplayer</span>
60 </button>
61 <button onClick={() => _set_current_leaderboard(RankingCategories.rankings_multiplayer)} className="nav-2-btn">
62 <span>Cooperative</span>
63 </button>
64 <button onClick={() => _set_current_leaderboard(RankingCategories.rankings_overall)} className="nav-2-btn">
65 <span>Overall</span>
66 </button>
67 </div>
68 </section>
69
70 {load ?
71 <section className="rankings-leaderboard">
72 <div className="ranks-container">
73 <div className="leaderboard-entry header">
74 <span>Rank</span>
75 <span>Player</span>
76 <span>Portals</span>
77 </div>
78
79 <div className="splitter"></div>
80
81 {currentLeaderboard?.map((curRankingData, i) => {
82 return <RankingEntry curRankingData={curRankingData} key={i}></RankingEntry>
83 })
84 }
85 </div>
86 </section>
87 : null}
88 </main>
89 )
90}
91
92export default Rankings;