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/App.tsx | 6 -- frontend/src/api/Api.ts | 2 +- frontend/src/api/Maps.ts | 10 +-- frontend/src/components/UploadRunDialog.tsx | 113 ++++++++++++------------- frontend/src/types/Content.ts | 1 - frontend/src/types/MapNames.ts | 127 ++++++++++++++++++++++++++++ 6 files changed, 185 insertions(+), 74 deletions(-) create mode 100644 frontend/src/types/MapNames.ts diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index e4bde75..a02779b 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -66,12 +66,6 @@ const App: React.FC = () => { _fetch_games(); }, []); - if (!games) { - return ( - <> - ) - }; - return ( <> { diff --git a/frontend/src/api/Api.ts b/frontend/src/api/Api.ts index 2e55ab4..4a3f907 100644 --- a/frontend/src/api/Api.ts +++ b/frontend/src/api/Api.ts @@ -35,7 +35,7 @@ export const API = { post_map_discussion: (token: string, map_id: string, content: MapDiscussionContent) => post_map_discussion(token, map_id, content), post_map_discussion_comment: (token: string, map_id: string, discussion_id: number, comment: string) => post_map_discussion_comment(token, map_id, discussion_id, comment), - post_record: (token: string, run: UploadRunContent) => post_record(token, run), + post_record: (token: string, run: UploadRunContent, map_id: number) => post_record(token, run, map_id), delete_map_discussion: (token: string, map_id: string, discussion_id: number) => delete_map_discussion(token, map_id, discussion_id), diff --git a/frontend/src/api/Maps.ts b/frontend/src/api/Maps.ts index 89657b5..3832a2e 100644 --- a/frontend/src/api/Maps.ts +++ b/frontend/src/api/Maps.ts @@ -73,9 +73,9 @@ export const delete_map_discussion = async (token: string, map_id: string, discu return response.data.success; }; -export const post_record = async (token: string, run: UploadRunContent): Promise<[boolean, string]> => { +export const post_record = async (token: string, run: UploadRunContent, map_id: number): Promise<[boolean, string]> => { if (run.partner_demo) { - const response = await axios.postForm(url(`maps/${run.map_id}/record`), { + const response = await axios.postForm(url(`maps/${map_id}/record`), { "host_demo": run.host_demo, "partner_demo": run.partner_demo, }, { @@ -83,16 +83,16 @@ export const post_record = async (token: string, run: UploadRunContent): Promise "Authorization": token, } }); - return [ response.data.success, response.data.message ]; + return [response.data.success, response.data.message]; } else { - const response = await axios.postForm(url(`maps/${run.map_id}/record`), { + const response = await axios.postForm(url(`maps/${map_id}/record`), { "host_demo": run.host_demo, }, { headers: { "Authorization": token, } }); - return [ response.data.success, response.data.message ]; + return [response.data.success, response.data.message]; } } 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} +
-
) } -
-
+
+
+ +
-
- ) }
-
- - -
+
+ + +
diff --git a/frontend/src/types/Content.ts b/frontend/src/types/Content.ts index 42a6917..775fab4 100644 --- a/frontend/src/types/Content.ts +++ b/frontend/src/types/Content.ts @@ -18,7 +18,6 @@ export interface MapDiscussionCommentContent { }; export interface UploadRunContent { - map_id: number; host_demo: File | null; partner_demo: File | null; }; diff --git a/frontend/src/types/MapNames.ts b/frontend/src/types/MapNames.ts new file mode 100644 index 0000000..b6313e7 --- /dev/null +++ b/frontend/src/types/MapNames.ts @@ -0,0 +1,127 @@ +export const MapNames: { [key: string]: number } = { + "sp_a1_intro1": 1, + "sp_a1_intro2": 2, + "sp_a1_intro3": 3, + "sp_a1_intro4": 4, + "sp_a1_intro5": 5, + "sp_a1_intro6": 6, + "sp_a1_intro7": 7, + "sp_a1_wakeup": 8, + "sp_a2_intro": 9, + + "sp_a2_laser_intro": 10, + "sp_a2_laser_stairs": 11, + "sp_a2_dual_lasers": 12, + "sp_a2_laser_over_goo": 13, + "sp_a2_catapult_intro": 14, + "sp_a2_trust_fling": 15, + "sp_a2_pit_flings": 16, + "sp_a2_fizzler_intro": 17, + + "sp_a2_sphere_peek": 18, + "sp_a2_ricochet": 19, + "sp_a2_bridge_intro": 20, + "sp_a2_bridge_the_gap": 21, + "sp_a2_turret_intro": 22, + "sp_a2_laser_relays": 23, + "sp_a2_turret_blocker": 24, + "sp_a2_laser_vs_turret": 25, + "sp_a2_pull_the_rug": 26, + + "sp_a2_column_blocker": 27, + "sp_a2_laser_chaining": 28, + "sp_a2_triple_laser": 29, + "sp_a2_bts1": 30, + "sp_a2_bts2": 31, + + "sp_a2_bts3": 32, + "sp_a2_bts4": 33, + "sp_a2_bts5": 34, + "sp_a2_core": 35, + + "sp_a3_01": 36, + "sp_a3_03": 37, + "sp_a3_jump_intro": 38, + "sp_a3_bomb_flings": 39, + "sp_a3_crazy_box": 40, + "sp_a3_transition01": 41, + + "sp_a3_speed_ramp": 42, + "sp_a3_speed_flings": 43, + "sp_a3_portal_intro": 44, + "sp_a3_end": 45, + + "sp_a4_intro": 46, + "sp_a4_tb_intro": 47, + "sp_a4_tb_trust_drop": 48, + "sp_a4_tb_wall_button": 49, + "sp_a4_tb_polarity": 50, + "sp_a4_tb_catch": 51, + "sp_a4_stop_the_box": 52, + "sp_a4_laser_catapult": 53, + "sp_a4_laser_platform": 54, + "sp_a4_speed_tb_catch": 55, + "sp_a4_jump_polarity": 56, + + "sp_a4_finale1": 57, + "sp_a4_finale2": 58, + "sp_a4_finale3": 59, + "sp_a4_finale4": 60, + + "mp_coop_start": 61, + "mp_coop_lobby_3": 62, + + "mp_coop_doors": 63, + "mp_coop_race_2": 64, + "mp_coop_laser_2": 65, + "mp_coop_rat_maze": 66, + "mp_coop_laser_crusher": 67, + "mp_coop_teambts": 68, + + "mp_coop_fling_3": 69, + "mp_coop_infinifling_train": 70, + "mp_coop_come_along": 71, + "mp_coop_fling_1": 72, + "mp_coop_catapult_1": 73, + "mp_coop_multifling_1": 74, + "mp_coop_fling_crushers": 75, + "mp_coop_fan": 76, + + "mp_coop_wall_intro": 77, + "mp_coop_wall_2": 78, + "mp_coop_catapult_wall_intro": 79, + "mp_coop_wall_block": 80, + "mp_coop_catapult_2": 81, + "mp_coop_turret_walls": 82, + "mp_coop_turret_ball": 83, + "mp_coop_wall_5": 84, + + "mp_coop_tbeam_redirect": 85, + "mp_coop_tbeam_drill": 86, + "mp_coop_tbeam_catch_grind_1": 87, + "mp_coop_tbeam_laser_1": 88, + "mp_coop_tbeam_polarity": 89, + "mp_coop_tbeam_polarity2": 90, + "mp_coop_tbeam_polarity3": 91, + "mp_coop_tbeam_maze": 92, + "mp_coop_tbeam_end": 93, + + "mp_coop_paint_come_along": 94, + "mp_coop_paint_redirect": 95, + "mp_coop_paint_bridge": 96, + "mp_coop_paint_walljumps": 97, + "mp_coop_paint_speed_fling": 98, + "mp_coop_paint_red_racer": 99, + "mp_coop_paint_speed_catch": 100, + "mp_coop_paint_longjump_intro": 101, + + "mp_coop_separation_1": 102, + "mp_coop_tripleaxis": 103, + "mp_coop_catapult_catch": 104, + "mp_coop_2paints_1bridge": 105, + "mp_coop_paint_conversion": 106, + "mp_coop_bridge_catch": 107, + "mp_coop_laser_tbeam": 108, + "mp_coop_paint_rat_maze": 109, + "mp_coop_paint_crazy_box": 110, +}; -- cgit v1.2.3