diff options
| author | Wolfboy248 <georgejvindkarlsen@gmail.com> | 2024-09-16 18:13:12 +0200 |
|---|---|---|
| committer | Wolfboy248 <georgejvindkarlsen@gmail.com> | 2024-09-16 18:13:12 +0200 |
| commit | fa0856cedd846d82bcbd3f54dd491419b2c41910 (patch) | |
| tree | a093b40012ed563d446b3d44f3227175ad9e4c87 /frontend/src | |
| parent | refactor: unofficial rankings implementation (diff) | |
| download | lphub-fa0856cedd846d82bcbd3f54dd491419b2c41910.tar.gz lphub-fa0856cedd846d82bcbd3f54dd491419b2c41910.tar.bz2 lphub-fa0856cedd846d82bcbd3f54dd491419b2c41910.zip | |
refactor: rankings page
Diffstat (limited to 'frontend/src')
| -rw-r--r-- | frontend/src/components/RankingEntry.tsx | 50 | ||||
| -rw-r--r-- | frontend/src/pages/Rankings.tsx | 65 | ||||
| -rw-r--r-- | frontend/src/types/Ranking.tsx | 18 |
3 files changed, 111 insertions, 22 deletions
diff --git a/frontend/src/components/RankingEntry.tsx b/frontend/src/components/RankingEntry.tsx index 023a896..58a6aa6 100644 --- a/frontend/src/components/RankingEntry.tsx +++ b/frontend/src/components/RankingEntry.tsx | |||
| @@ -1,24 +1,46 @@ | |||
| 1 | import React from 'react'; | 1 | import React from 'react'; |
| 2 | import { Link } from "react-router-dom"; | 2 | import { Link } from "react-router-dom"; |
| 3 | import { RankingType } from '../types/Ranking'; | 3 | import { RankingType, SteamRanking, SteamRankingType } from '../types/Ranking'; |
| 4 | |||
| 5 | enum RankingCategories { | ||
| 6 | rankings_overall, | ||
| 7 | rankings_multiplayer, | ||
| 8 | rankings_singleplayer | ||
| 9 | } | ||
| 4 | 10 | ||
| 5 | interface RankingEntryProps { | 11 | interface RankingEntryProps { |
| 6 | curRankingData: RankingType; | 12 | curRankingData: RankingType | SteamRankingType; |
| 13 | currentLeaderboardType: RankingCategories | ||
| 7 | }; | 14 | }; |
| 8 | 15 | ||
| 9 | const RankingEntry: React.FC<RankingEntryProps> = (curRankingData) => { | 16 | const RankingEntry: React.FC<RankingEntryProps> = (prop) => { |
| 10 | return ( | 17 | if ("placement" in prop.curRankingData) { |
| 11 | <div className='leaderboard-entry'> | 18 | return ( |
| 12 | <span>{curRankingData.curRankingData.placement}</span> | 19 | <div className='leaderboard-entry'> |
| 13 | <div> | 20 | <span>{prop.curRankingData.placement}</span> |
| 14 | <Link to={`/users/${curRankingData.curRankingData.user.steam_id}`}> | 21 | <div> |
| 15 | <img src={curRankingData.curRankingData.user.avatar_link}></img> | 22 | <Link to={`/users/${prop.curRankingData.user.steam_id}`}> |
| 16 | <span>{curRankingData.curRankingData.user.user_name}</span> | 23 | <img src={prop.curRankingData.user.avatar_link}></img> |
| 17 | </Link> | 24 | <span>{prop.curRankingData.user.user_name}</span> |
| 25 | </Link> | ||
| 26 | </div> | ||
| 27 | <span>{prop.curRankingData.total_score}</span> | ||
| 28 | </div> | ||
| 29 | ) | ||
| 30 | } else { | ||
| 31 | return ( | ||
| 32 | <div className='leaderboard-entry'> | ||
| 33 | <span>{prop.currentLeaderboardType == RankingCategories.rankings_singleplayer ? prop.curRankingData.sp_rank : prop.currentLeaderboardType == RankingCategories.rankings_multiplayer ? prop.curRankingData.mp_rank : prop.curRankingData.overall_rank}</span> | ||
| 34 | <div> | ||
| 35 | <Link to={`/users/${prop.curRankingData.steam_id}`}> | ||
| 36 | <img src={prop.curRankingData.avatar_link}></img> | ||
| 37 | <span>{prop.curRankingData.user_name}</span> | ||
| 38 | </Link> | ||
| 39 | </div> | ||
| 40 | <span>{prop.curRankingData.overall_score}</span> | ||
| 18 | </div> | 41 | </div> |
| 19 | <span>{curRankingData.curRankingData.total_score}</span> | 42 | ) |
| 20 | </div> | 43 | } |
| 21 | ) | ||
| 22 | } | 44 | } |
| 23 | 45 | ||
| 24 | export default RankingEntry; | 46 | export default RankingEntry; |
diff --git a/frontend/src/pages/Rankings.tsx b/frontend/src/pages/Rankings.tsx index 377222f..6dbf3d3 100644 --- a/frontend/src/pages/Rankings.tsx +++ b/frontend/src/pages/Rankings.tsx | |||
| @@ -1,29 +1,68 @@ | |||
| 1 | import React, { useEffect } from "react"; | 1 | import React, { useEffect } from "react"; |
| 2 | 2 | ||
| 3 | import RankingEntry from "../components/RankingEntry"; | 3 | import RankingEntry from "../components/RankingEntry"; |
| 4 | import { Ranking, RankingType } from "../types/Ranking"; | 4 | import { Ranking, SteamRanking, RankingType, SteamRankingType } from "../types/Ranking"; |
| 5 | import { API } from "../api/Api"; | 5 | import { API } from "../api/Api"; |
| 6 | 6 | ||
| 7 | import "../css/Rankings.css"; | 7 | import "../css/Rankings.css"; |
| 8 | 8 | ||
| 9 | const Rankings: React.FC = () => { | 9 | const Rankings: React.FC = () => { |
| 10 | const [leaderboardData, setLeaderboardData] = React.useState<Ranking>(); | 10 | const [leaderboardData, setLeaderboardData] = React.useState<Ranking | SteamRanking>(); |
| 11 | const [currentLeaderboardCat, setCurrentLeaderboardCat] = React.useState<RankingCategories>(); | 11 | const [currentLeaderboard, setCurrentLeaderboard] = React.useState<RankingType[] | SteamRankingType[]>(); |
| 12 | const [currentLeaderboard, setCurrentLeaderboard] = React.useState<RankingType[]>(); | 12 | enum LeaderboardTypes { |
| 13 | const [load, setLoad] = React.useState<boolean>(false); | 13 | official, |
| 14 | unofficial | ||
| 15 | } | ||
| 14 | 16 | ||
| 15 | enum RankingCategories { | 17 | enum RankingCategories { |
| 16 | rankings_overall, | 18 | rankings_overall, |
| 17 | rankings_multiplayer, | 19 | rankings_multiplayer, |
| 18 | rankings_singleplayer | 20 | rankings_singleplayer |
| 19 | } | 21 | } |
| 22 | const [currentLeaderboardType, setCurrentLeaderboardType] = React.useState<RankingCategories>(RankingCategories.rankings_singleplayer); | ||
| 23 | const [load, setLoad] = React.useState<boolean>(false); | ||
| 24 | |||
| 25 | interface ResponseSTUPID { | ||
| 26 | success: boolean; | ||
| 27 | message: string; | ||
| 28 | data: SteamRanking; | ||
| 29 | } | ||
| 20 | 30 | ||
| 21 | const _fetch_rankings = async () => { | 31 | const _fetch_rankings = async () => { |
| 22 | const rankings = await API.get_rankings(); | 32 | const rankings = await API.get_rankings(); |
| 23 | setLeaderboardData(rankings); | 33 | setLeaderboardData(rankings); |
| 34 | if (currentLeaderboardType == RankingCategories.rankings_singleplayer) { | ||
| 35 | setCurrentLeaderboard(rankings.rankings_singleplayer) | ||
| 36 | } else if (currentLeaderboardType == RankingCategories.rankings_multiplayer) { | ||
| 37 | setCurrentLeaderboard(rankings.rankings_multiplayer) | ||
| 38 | } else { | ||
| 39 | setCurrentLeaderboard(rankings.rankings_overall) | ||
| 40 | } | ||
| 24 | setLoad(true); | 41 | setLoad(true); |
| 25 | } | 42 | } |
| 26 | 43 | ||
| 44 | const __dev_fetch_unofficial_rankings = async () => { | ||
| 45 | try { | ||
| 46 | const response = await fetch("/response.json"); | ||
| 47 | const result: ResponseSTUPID = await response.json(); | ||
| 48 | |||
| 49 | if (result.success) { | ||
| 50 | const unofficialRanking: SteamRanking = result.data; | ||
| 51 | setLeaderboardData(unofficialRanking); | ||
| 52 | if (currentLeaderboardType == RankingCategories.rankings_singleplayer) { | ||
| 53 | // console.log(_sort_rankings_steam(unofficialRanking.rankings_singleplayer)) | ||
| 54 | setCurrentLeaderboard(unofficialRanking.rankings_singleplayer) | ||
| 55 | } else if (currentLeaderboardType == RankingCategories.rankings_multiplayer) { | ||
| 56 | setCurrentLeaderboard(unofficialRanking.rankings_multiplayer) | ||
| 57 | } else { | ||
| 58 | setCurrentLeaderboard(unofficialRanking.rankings_overall) | ||
| 59 | } | ||
| 60 | } | ||
| 61 | } catch (e) { | ||
| 62 | console.log(e) | ||
| 63 | } | ||
| 64 | } | ||
| 65 | |||
| 27 | const _set_current_leaderboard = (ranking_cat: RankingCategories) => { | 66 | const _set_current_leaderboard = (ranking_cat: RankingCategories) => { |
| 28 | if (ranking_cat == RankingCategories.rankings_singleplayer) { | 67 | if (ranking_cat == RankingCategories.rankings_singleplayer) { |
| 29 | setCurrentLeaderboard(leaderboardData!.rankings_singleplayer); | 68 | setCurrentLeaderboard(leaderboardData!.rankings_singleplayer); |
| @@ -32,6 +71,16 @@ const Rankings: React.FC = () => { | |||
| 32 | } else { | 71 | } else { |
| 33 | setCurrentLeaderboard(leaderboardData!.rankings_overall); | 72 | setCurrentLeaderboard(leaderboardData!.rankings_overall); |
| 34 | } | 73 | } |
| 74 | |||
| 75 | setCurrentLeaderboardType(ranking_cat); | ||
| 76 | } | ||
| 77 | |||
| 78 | const _set_leaderboard_type = (leaderboard_type: LeaderboardTypes) => { | ||
| 79 | if (leaderboard_type == LeaderboardTypes.official) { | ||
| 80 | _fetch_rankings(); | ||
| 81 | } else { | ||
| 82 | |||
| 83 | } | ||
| 35 | } | 84 | } |
| 36 | 85 | ||
| 37 | useEffect(() => { | 86 | useEffect(() => { |
| @@ -45,10 +94,10 @@ const Rankings: React.FC = () => { | |||
| 45 | <main> | 94 | <main> |
| 46 | <section className="nav-container nav-1"> | 95 | <section className="nav-container nav-1"> |
| 47 | <div> | 96 | <div> |
| 48 | <button className="nav-1-btn"> | 97 | <button onClick={() => _fetch_rankings()} className="nav-1-btn"> |
| 49 | <span>Official (LPHUB)</span> | 98 | <span>Official (LPHUB)</span> |
| 50 | </button> | 99 | </button> |
| 51 | <button className="nav-1-btn"> | 100 | <button onClick={() => __dev_fetch_unofficial_rankings()} className="nav-1-btn"> |
| 52 | <span>Unofficial (Steam)</span> | 101 | <span>Unofficial (Steam)</span> |
| 53 | </button> | 102 | </button> |
| 54 | </div> | 103 | </div> |
| @@ -79,7 +128,7 @@ const Rankings: React.FC = () => { | |||
| 79 | <div className="splitter"></div> | 128 | <div className="splitter"></div> |
| 80 | 129 | ||
| 81 | {currentLeaderboard?.map((curRankingData, i) => { | 130 | {currentLeaderboard?.map((curRankingData, i) => { |
| 82 | return <RankingEntry curRankingData={curRankingData} key={i}></RankingEntry> | 131 | return <RankingEntry currentLeaderboardType={currentLeaderboardType} curRankingData={curRankingData} key={i}></RankingEntry> |
| 83 | }) | 132 | }) |
| 84 | } | 133 | } |
| 85 | </div> | 134 | </div> |
diff --git a/frontend/src/types/Ranking.tsx b/frontend/src/types/Ranking.tsx index ad4d8ae..b3b26c6 100644 --- a/frontend/src/types/Ranking.tsx +++ b/frontend/src/types/Ranking.tsx | |||
| @@ -6,8 +6,26 @@ export interface RankingType { | |||
| 6 | total_score: number; | 6 | total_score: number; |
| 7 | } | 7 | } |
| 8 | 8 | ||
| 9 | export interface SteamRankingType { | ||
| 10 | user_name: string; | ||
| 11 | avatar_link: string; | ||
| 12 | steam_id: string; | ||
| 13 | sp_score: number; | ||
| 14 | mp_score: number; | ||
| 15 | overall_score: number; | ||
| 16 | sp_rank: number; | ||
| 17 | mp_rank: number; | ||
| 18 | overall_rank: number; | ||
| 19 | } | ||
| 20 | |||
| 9 | export interface Ranking { | 21 | export interface Ranking { |
| 10 | rankings_overall: RankingType[]; | 22 | rankings_overall: RankingType[]; |
| 11 | rankings_singleplayer: RankingType[]; | 23 | rankings_singleplayer: RankingType[]; |
| 12 | rankings_multiplayer: RankingType[]; | 24 | rankings_multiplayer: RankingType[]; |
| 25 | } | ||
| 26 | |||
| 27 | export interface SteamRanking { | ||
| 28 | rankings_overall: SteamRankingType[]; | ||
| 29 | rankings_singleplayer: SteamRankingType[]; | ||
| 30 | rankings_multiplayer: SteamRankingType[]; | ||
| 13 | } \ No newline at end of file | 31 | } \ No newline at end of file |