From 53337bad0623a5f32c87d760bc03efb3cfe4eab6 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Thu, 21 Nov 2024 20:06:15 +0300 Subject: feat/frontend: remove map select from upload run dialog (#239) --- frontend/src/components/UploadRunDialog.tsx | 113 +++++++++++++--------------- 1 file changed, 52 insertions(+), 61 deletions(-) (limited to 'frontend/src/components') diff --git a/frontend/src/components/UploadRunDialog.tsx b/frontend/src/components/UploadRunDialog.tsx index 118b589..c02fdb8 100644 --- a/frontend/src/components/UploadRunDialog.tsx +++ b/frontend/src/components/UploadRunDialog.tsx @@ -4,12 +4,12 @@ import { ScoreboardTempUpdate, SourceDemoParser, NetMessages } from '@nekz/sdp'; import '@css/UploadRunDialog.css'; import { Game } from '@customTypes/Game'; -import { Map } from '@customTypes/Map'; import { API } from '@api/Api'; import { useNavigate } from 'react-router-dom'; import useMessage from '@hooks/UseMessage'; import useConfirm from '@hooks/UseConfirm'; import useMessageLoad from "@hooks/UseMessageLoad"; +import { MapNames } from '@customTypes/MapNames'; interface UploadRunDialogProps { token?: string; @@ -27,19 +27,11 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, const navigate = useNavigate(); const [uploadRunContent, setUploadRunContent] = React.useState({ - map_id: 0, host_demo: null, partner_demo: null, }); - const [currentMap, setCurrentMap] = React.useState(""); - - const _set_current_map = (game_name: string) => { - setCurrentMap(game_name); - } - const [selectedGameID, setSelectedGameID] = React.useState(0); - const [selectedGameMaps, setSelectedGameMaps] = React.useState([]); const [selectedGameName, setSelectedGameName] = React.useState(""); // dropdowns @@ -50,6 +42,7 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, const [dragHightlight, setDragHighlight] = React.useState(false); const [dragHightlightPartner, setDragHighlightPartner] = React.useState(false); + const fileInputRef = React.useRef(null); const fileInputRefPartner = React.useRef(null); @@ -102,14 +95,6 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, const _handle_game_select = async (game_id: string, game_name: string) => { setLoading(true); - const gameMaps = await API.get_game_maps(game_id); - setSelectedGameMaps(gameMaps); - setUploadRunContent({ - map_id: gameMaps.find((map) => !map.is_disabled)!.id, //gameMaps[0].id, - host_demo: null, - partner_demo: null, - }); - _set_current_map(gameMaps.find((map) => !map.is_disabled)!.name); setSelectedGameID(parseInt(game_id) - 1); setSelectedGameName(game_name); setLoading(false); @@ -158,6 +143,20 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, await message("Error", "Error while processing demo: Unable to get scoreboard result. Either there is a demo that is corrupt or haven't been recorded in challenge mode.") return } + + if (!demo.mapName || !MapNames[demo.mapName]) { + await message("Error", "Error while processing demo: Invalid map name.") + return + } + + if (selectedGameID === 0 && MapNames[demo.mapName] > 60) { + await message("Error", "Error while processing demo: Invalid cooperative demo in singleplayer submission.") + return + } else if (selectedGameID === 1 && MapNames[demo.mapName] <= 60) { + await message("Error", "Error while processing demo: Invalid singleplayer demo in cooperative submission.") + return + } + const { portalScore, timeScore } = scoreboard.userMessage?.as() ?? {}; const userConfirmed = await confirm("Upload Record", `Map Name: ${demo.mapName}\nPortal Count: ${portalScore}\nTicks: ${timeScore}\n\nAre you sure you want to upload this demo?`); @@ -167,10 +166,14 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, } messageLoad("Uploading..."); - const [success, response] = await API.post_record(token, uploadRunContent); + const [success, response] = await API.post_record(token, uploadRunContent, MapNames[demo.mapName]); messageLoadClose(); await message("Upload Record", response); if (success) { + setUploadRunContent({ + host_demo: null, + partner_demo: null, + }); onClose(success); navigate("/profile"); } @@ -179,7 +182,6 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, React.useEffect(() => { if (open) { - setDragHighlightPartner(false); setDragHighlight(false); _handle_game_select("1", "Portal 2 - Singleplayer"); // a different approach?. @@ -203,37 +205,20 @@ const UploadRunDialog: React.FC = ({ token, open, onClose,
{selectedGameName}
-
+
{games.map((game) => (
{ _handle_game_select(game.id.toString(), game.name); _handle_dropdowns(1) }} key={game.id}>{game.name}
))}
- {!loading && ( - <> -
-

Select Map

-
_handle_dropdowns(2)} style={{ display: "flex", alignItems: "center", cursor: "pointer", justifyContent: "space-between", margin: "10px 0px" }}> - {currentMap} - -
-
- - - - )} -
+ { !loading && ( <> - -
-

Host Demo

+ +
+

Host Demo

{ _handle_file_click(true) }} onDragOver={(e) => { _handle_drag_over(e, true) }} onDrop={(e) => { _handle_drop(e, true) }} onDragLeave={(e) => { _handle_drag_leave(e, true) }} className={`upload-run-drag-area ${dragHightlight ? "upload-run-drag-area-highlight" : ""} ${uploadRunContent.host_demo ? "upload-run-drag-area-hidden" : ""}`}> _handle_file_change(e.target.files, true)} /> {!uploadRunContent.host_demo ? @@ -252,38 +237,44 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, games[selectedGameID].is_coop && ( <> -
-

Partner Demo

-
{ _handle_file_click(false) }} onDragOver={(e) => { _handle_drag_over(e, false) }} onDrop={(e) => { _handle_drop(e, false) }} onDragLeave={(e) => { _handle_drag_leave(e, false) }} className={`upload-run-drag-area ${dragHightlightPartner ? "upload-run-drag-area-highlight-partner" : ""} ${uploadRunContent.partner_demo ? "upload-run-drag-area-hidden" : ""}`}> - _handle_file_change(e.target.files, false)} /> {!uploadRunContent.partner_demo ? -
- Drag and drop +
+

Partner Demo

+
{ _handle_file_click(false) }} onDragOver={(e) => { _handle_drag_over(e, false) }} onDrop={(e) => { _handle_drop(e, false) }} onDragLeave={(e) => { _handle_drag_leave(e, false) }} className={`upload-run-drag-area ${dragHightlightPartner ? "upload-run-drag-area-highlight-partner" : ""} ${uploadRunContent.partner_demo ? "upload-run-drag-area-hidden" : ""}`}> + _handle_file_change(e.target.files, false)} /> {!uploadRunContent.partner_demo ?
- Or click here
- + Drag and drop +
+ Or click here
+ +
-
- : null} + : null} - {uploadRunContent.partner_demo?.name} + {uploadRunContent.partner_demo?.name} +
-
) } -
-
+
+
+ +
-
- ) }
-
- - -
+
+ + +
-- cgit v1.2.3 From 9c3e5686f36bc4ba76d510f27adc89f378a3a658 Mon Sep 17 00:00:00 2001 From: Wolfboy248 <121288977+Wolfboy248@users.noreply.github.com> Date: Tue, 10 Dec 2024 07:16:37 +0100 Subject: fix/frontend: map pagination fix (#246) --- frontend/src/api/Api.ts | 2 +- frontend/src/api/Maps.ts | 4 ++-- frontend/src/components/Leaderboards.tsx | 21 +++++++++++++++++---- frontend/src/pages/Maps.tsx | 4 ++-- 4 files changed, 22 insertions(+), 9 deletions(-) (limited to 'frontend/src/components') diff --git a/frontend/src/api/Api.ts b/frontend/src/api/Api.ts index 4a3f907..862e688 100644 --- a/frontend/src/api/Api.ts +++ b/frontend/src/api/Api.ts @@ -29,7 +29,7 @@ export const API = { get_unofficial_rankings: () => get_unofficial_rankings(), // Maps get_map_summary: (map_id: string) => get_map_summary(map_id), - get_map_leaderboard: (map_id: string) => get_map_leaderboard(map_id), + get_map_leaderboard: (map_id: string, page: string) => get_map_leaderboard(map_id, page), get_map_discussions: (map_id: string) => get_map_discussions(map_id), get_map_discussion: (map_id: string, discussion_id: number) => get_map_discussion(map_id, discussion_id), diff --git a/frontend/src/api/Maps.ts b/frontend/src/api/Maps.ts index 3832a2e..aa967ce 100644 --- a/frontend/src/api/Maps.ts +++ b/frontend/src/api/Maps.ts @@ -8,8 +8,8 @@ export const get_map_summary = async (map_id: string): Promise => { return response.data.data; }; -export const get_map_leaderboard = async (map_id: string): Promise => { - const response = await axios.get(url(`maps/${map_id}/leaderboards`)); +export const get_map_leaderboard = async (map_id: string, page: string): Promise => { + const response = await axios.get(url(`maps/${map_id}/leaderboards?page=${page}`)); if (!response.data.success) { return undefined; } diff --git a/frontend/src/components/Leaderboards.tsx b/frontend/src/components/Leaderboards.tsx index 4a8b463..fb614fa 100644 --- a/frontend/src/components/Leaderboards.tsx +++ b/frontend/src/components/Leaderboards.tsx @@ -1,20 +1,33 @@ import React from 'react'; -import { Link } from 'react-router-dom'; +import { Link, useNavigate } from 'react-router-dom'; import { DownloadIcon, ThreedotIcon } from '@images/Images'; import { MapLeaderboard } from '@customTypes/Map'; import { ticks_to_time, time_ago } from '@utils/Time'; +import { API } from "@api/Api"; import useMessage from "@hooks/UseMessage"; import "@css/Maps.css" interface LeaderboardsProps { - data?: MapLeaderboard; + mapID: string; } -const Leaderboards: React.FC = ({ data }) => { +const Leaderboards: React.FC = ({ mapID }) => { + const navigate = useNavigate(); + const [data, setData] = React.useState(undefined); + const [pageNumber, setPageNumber] = React.useState(1); + + const _fetch_map_leaderboards = async () => { + const mapLeaderboards = await API.get_map_leaderboard(mapID, pageNumber.toString()); + setData(mapLeaderboards); + }; const { message, MessageDialogComponent } = useMessage(); - const [pageNumber, setPageNumber] = React.useState(1); + + React.useEffect(() => { + _fetch_map_leaderboards(); + console.log(data); + }, [pageNumber, navigate]) if (!data) { return ( diff --git a/frontend/src/pages/Maps.tsx b/frontend/src/pages/Maps.tsx index f1daa36..f73e8d2 100644 --- a/frontend/src/pages/Maps.tsx +++ b/frontend/src/pages/Maps.tsx @@ -35,7 +35,7 @@ const Maps: React.FC = ({ token, isModerator }) => { }; const _fetch_map_leaderboards = async () => { - const mapLeaderboards = await API.get_map_leaderboard(mapID); + const mapLeaderboards = await API.get_map_leaderboard(mapID, "1"); setMapLeaderboardData(mapLeaderboards); }; @@ -94,7 +94,7 @@ const Maps: React.FC = ({ token, isModerator }) => { {navState === 0 && } - {navState === 1 && } + {navState === 1 && } {navState === 2 && _fetch_map_discussions()} />} -- cgit v1.2.3 From 6a163167c81689f07e76e7ff9ab7449f88ca0ea4 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:38:58 +0000 Subject: feat/frontend: adjust difficulty to 1-10 scale (#268) --- frontend/src/components/Summary.tsx | 21 ++++++++++----------- frontend/src/pages/Maplist.tsx | 2 +- 2 files changed, 11 insertions(+), 12 deletions(-) (limited to 'frontend/src/components') diff --git a/frontend/src/components/Summary.tsx b/frontend/src/components/Summary.tsx index 4bcaa6a..2fec182 100644 --- a/frontend/src/components/Summary.tsx +++ b/frontend/src/components/Summary.tsx @@ -140,18 +140,17 @@ const Summary: React.FC = ({ selectedRun, setSelectedRun, data })
Difficulty - {data.summary.routes[selectedRun].rating === 0 && (N/A)} - {data.summary.routes[selectedRun].rating === 1 && (Very easy)} - {data.summary.routes[selectedRun].rating === 2 && (Easy)} - {data.summary.routes[selectedRun].rating === 3 && (Medium)} - {data.summary.routes[selectedRun].rating === 4 && (Hard)} - {data.summary.routes[selectedRun].rating === 5 && (Very hard)} + {data.summary.routes[selectedRun].rating <= 2 && (Very easy)} + {data.summary.routes[selectedRun].rating <= 4 && (Easy)} + {data.summary.routes[selectedRun].rating <= 6 && (Medium)} + {data.summary.routes[selectedRun].rating <= 8 && (Hard)} + {data.summary.routes[selectedRun].rating <= 10 && (Very hard)}
- {data.summary.routes[selectedRun].rating === 1 ? (
) : (
)} - {data.summary.routes[selectedRun].rating === 2 ? (
) : (
)} - {data.summary.routes[selectedRun].rating === 3 ? (
) : (
)} - {data.summary.routes[selectedRun].rating === 4 ? (
) : (
)} - {data.summary.routes[selectedRun].rating === 5 ? (
) : (
)} + {data.summary.routes[selectedRun].rating <= 2 ? (
) : (
)} + {data.summary.routes[selectedRun].rating <= 4 ? (
) : (
)} + {data.summary.routes[selectedRun].rating <= 6 ? (
) : (
)} + {data.summary.routes[selectedRun].rating <= 8 ? (
) : (
)} + {data.summary.routes[selectedRun].rating <= 10 ? (
) : (
)}
diff --git a/frontend/src/pages/Maplist.tsx b/frontend/src/pages/Maplist.tsx index 04938cf..76f9a52 100644 --- a/frontend/src/pages/Maplist.tsx +++ b/frontend/src/pages/Maplist.tsx @@ -165,7 +165,7 @@ const Maplist: React.FC = () => {
{/* Difficulty: */} -
+
-- cgit v1.2.3 From 1dd2591557d255b4262867a0aa92b492ea65e336 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:49:14 +0000 Subject: fix/frontend: broken summary difficulty (#270) --- frontend/src/components/Summary.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'frontend/src/components') diff --git a/frontend/src/components/Summary.tsx b/frontend/src/components/Summary.tsx index 2fec182..1df6a78 100644 --- a/frontend/src/components/Summary.tsx +++ b/frontend/src/components/Summary.tsx @@ -141,16 +141,16 @@ const Summary: React.FC = ({ selectedRun, setSelectedRun, data })
Difficulty {data.summary.routes[selectedRun].rating <= 2 && (Very easy)} - {data.summary.routes[selectedRun].rating <= 4 && (Easy)} - {data.summary.routes[selectedRun].rating <= 6 && (Medium)} - {data.summary.routes[selectedRun].rating <= 8 && (Hard)} - {data.summary.routes[selectedRun].rating <= 10 && (Very hard)} + {data.summary.routes[selectedRun].rating > 2 && data.summary.routes[selectedRun].rating <= 4 && (Easy)} + {data.summary.routes[selectedRun].rating > 4 && data.summary.routes[selectedRun].rating <= 6 && (Medium)} + {data.summary.routes[selectedRun].rating > 6 && data.summary.routes[selectedRun].rating <= 8 && (Hard)} + {data.summary.routes[selectedRun].rating > 8 && data.summary.routes[selectedRun].rating <= 10 && (Very hard)}
{data.summary.routes[selectedRun].rating <= 2 ? (
) : (
)} - {data.summary.routes[selectedRun].rating <= 4 ? (
) : (
)} - {data.summary.routes[selectedRun].rating <= 6 ? (
) : (
)} - {data.summary.routes[selectedRun].rating <= 8 ? (
) : (
)} - {data.summary.routes[selectedRun].rating <= 10 ? (
) : (
)} + {data.summary.routes[selectedRun].rating > 2 && data.summary.routes[selectedRun].rating <= 4 ? (
) : (
)} + {data.summary.routes[selectedRun].rating > 4 && data.summary.routes[selectedRun].rating <= 6 ? (
) : (
)} + {data.summary.routes[selectedRun].rating > 6 && data.summary.routes[selectedRun].rating <= 8 ? (
) : (
)} + {data.summary.routes[selectedRun].rating > 8 && data.summary.routes[selectedRun].rating <= 10 ? (
) : (
)}
-- cgit v1.2.3 From ae32e264b668a46e138a64a2d8a8d4c662e990ea Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:57:50 +0000 Subject: fix/frontend: broken summary difficulty v2 (#272) --- frontend/src/components/Summary.tsx | 17 ++++++++++++++++- frontend/src/types/Map.ts | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) (limited to 'frontend/src/components') diff --git a/frontend/src/components/Summary.tsx b/frontend/src/components/Summary.tsx index 1df6a78..7da2f1e 100644 --- a/frontend/src/components/Summary.tsx +++ b/frontend/src/components/Summary.tsx @@ -139,6 +139,21 @@ const Summary: React.FC = ({ selectedRun, setSelectedRun, data })
+ Difficulty + {data.map.difficulty <= 2 && (Very easy)} + {data.map.difficulty > 2 && data.map.difficulty <= 4 && (Easy)} + {data.map.difficulty > 4 && data.map.difficulty <= 6 && (Medium)} + {data.map.difficulty > 6 && data.map.difficulty <= 8 && (Hard)} + {data.map.difficulty > 8 && data.map.difficulty <= 10 && (Very hard)} +
+ {data.map.difficulty <= 2 ? (
) : (
)} + {data.map.difficulty > 2 && data.map.difficulty <= 4 ? (
) : (
)} + {data.map.difficulty > 4 && data.map.difficulty <= 6 ? (
) : (
)} + {data.map.difficulty > 6 && data.map.difficulty <= 8 ? (
) : (
)} + {data.map.difficulty > 8 && data.map.difficulty <= 10 ? (
) : (
)} +
+
+ {/*
Difficulty {data.summary.routes[selectedRun].rating <= 2 && (Very easy)} {data.summary.routes[selectedRun].rating > 2 && data.summary.routes[selectedRun].rating <= 4 && (Easy)} @@ -152,7 +167,7 @@ const Summary: React.FC = ({ selectedRun, setSelectedRun, data }) {data.summary.routes[selectedRun].rating > 6 && data.summary.routes[selectedRun].rating <= 8 ? (
) : (
)} {data.summary.routes[selectedRun].rating > 8 && data.summary.routes[selectedRun].rating <= 10 ? (
) : (
)}
- + */}
Completion Count
{data.summary.routes[selectedRun].completion_count}
diff --git a/frontend/src/types/Map.ts b/frontend/src/types/Map.ts index 89c66d5..4f8eabf 100644 --- a/frontend/src/types/Map.ts +++ b/frontend/src/types/Map.ts @@ -79,6 +79,7 @@ interface MapSummaryMap { map_name: string; is_coop: boolean; is_disabled: boolean; + difficulty: number; }; interface MapSummaryDetails { -- cgit v1.2.3