aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/components/UploadRunDialog.tsx
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2024-10-16 21:13:54 +0300
committerArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2024-10-16 21:13:54 +0300
commit92447e02e5fc3977c9cfbca7a8de4132cbb4f13b (patch)
tree43a0ecda9c2eaeaf5af39df97ab4ad5083459c2b /frontend/src/components/UploadRunDialog.tsx
parentrefactor: upload run dialog (diff)
downloadlphub-92447e02e5fc3977c9cfbca7a8de4132cbb4f13b.tar.gz
lphub-92447e02e5fc3977c9cfbca7a8de4132cbb4f13b.tar.bz2
lphub-92447e02e5fc3977c9cfbca7a8de4132cbb4f13b.zip
refactor: upload run logic improvement
Diffstat (limited to 'frontend/src/components/UploadRunDialog.tsx')
-rw-r--r--frontend/src/components/UploadRunDialog.tsx70
1 files changed, 61 insertions, 9 deletions
diff --git a/frontend/src/components/UploadRunDialog.tsx b/frontend/src/components/UploadRunDialog.tsx
index fb146ba..08d4108 100644
--- a/frontend/src/components/UploadRunDialog.tsx
+++ b/frontend/src/components/UploadRunDialog.tsx
@@ -3,25 +3,26 @@ import { UploadRunContent } from '../types/Content';
3 3
4import '../css/UploadRunDialog.css'; 4import '../css/UploadRunDialog.css';
5import { Game } from '../types/Game'; 5import { Game } from '../types/Game';
6import Games from '../pages/Games';
7import { Map } from '../types/Map'; 6import { Map } from '../types/Map';
8import { API } from '../api/Api'; 7import { API } from '../api/Api';
8import { useNavigate } from 'react-router-dom';
9 9
10interface UploadRunDialogProps { 10interface UploadRunDialogProps {
11 token?: string;
11 open: boolean; 12 open: boolean;
12 onClose: () => void; 13 onClose: () => void;
13 mapID?: number;
14 games: Game[]; 14 games: Game[];
15} 15}
16 16
17const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ open, onClose, mapID, games }) => { 17const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ token, open, onClose, games }) => {
18
19 const navigate = useNavigate();
18 20
19 const [uploadRunContent, setUploadRunContent] = React.useState<UploadRunContent>({ 21 const [uploadRunContent, setUploadRunContent] = React.useState<UploadRunContent>({
20 map_id: 0, 22 map_id: 0,
21 host_demo: null, 23 host_demo: null,
22 partner_demo: null, 24 partner_demo: null,
23 partner_id: undefined, 25 partner_id: undefined,
24 is_partner_orange: undefined,
25 }); 26 });
26 27
27 const [currentMap, setCurrentMap] = React.useState<string>(""); 28 const [currentMap, setCurrentMap] = React.useState<string>("");
@@ -56,8 +57,10 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ open, onClose, mapID,
56 const gameMaps = await API.get_game_maps(game_id); 57 const gameMaps = await API.get_game_maps(game_id);
57 setSelectedGameMaps(gameMaps); 58 setSelectedGameMaps(gameMaps);
58 setUploadRunContent({ 59 setUploadRunContent({
59 ...uploadRunContent,
60 map_id: gameMaps[0].id, 60 map_id: gameMaps[0].id,
61 host_demo: null,
62 partner_demo: null,
63 partner_id: undefined,
61 }); 64 });
62 _set_current_map(gameMaps[0].name); 65 _set_current_map(gameMaps[0].name);
63 setSelectedGameID(parseInt(game_id) - 1); 66 setSelectedGameID(parseInt(game_id) - 1);
@@ -65,6 +68,50 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ open, onClose, mapID,
65 setLoading(false); 68 setLoading(false);
66 }; 69 };
67 70
71 const _handle_file_change = async (e: React.ChangeEvent<HTMLInputElement>, host: boolean) => {
72 if (e.target.files) {
73 if (host) {
74 setUploadRunContent({
75 ...uploadRunContent,
76 host_demo: e.target.files[0],
77 });
78 } else {
79 setUploadRunContent({
80 ...uploadRunContent,
81 partner_demo: e.target.files[0],
82 });
83 }
84 }
85 };
86
87 const _upload_run = async () => {
88 if (token) {
89 if (games[selectedGameID].is_coop) {
90 if (uploadRunContent.host_demo === null) {
91 alert("You must select a host demo to upload.")
92 return
93 } else if (uploadRunContent.partner_demo === null) {
94 alert("You must select a partner demo to upload.")
95 return
96 } else if (uploadRunContent.partner_id === undefined) {
97 alert("You must specify your partner.")
98 return
99 }
100 } else {
101 if (uploadRunContent.host_demo === null) {
102 alert("You must select a demo to upload.")
103 return
104 }
105 }
106 if (window.confirm("Are you sure you want to submit this run to LPHUB?")) {
107 const message = await API.post_record(token, uploadRunContent);
108 alert(message);
109 navigate(0);
110 onClose();
111 }
112 }
113 };
114
68 React.useEffect(() => { 115 React.useEffect(() => {
69 if (open) { 116 if (open) {
70 _handle_game_select("1", "Portal 2 - Singleplayer"); // a different approach?. 117 _handle_game_select("1", "Portal 2 - Singleplayer"); // a different approach?.
@@ -105,23 +152,28 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ open, onClose, mapID,
105 <div> 152 <div>
106 <div id='dropdown2' className={dropdown2Vis ? "upload-run-dropdown" : "upload-run-dropdown hidden"}> 153 <div id='dropdown2' className={dropdown2Vis ? "upload-run-dropdown" : "upload-run-dropdown hidden"}>
107 {selectedGameMaps && selectedGameMaps.map((gameMap) => ( 154 {selectedGameMaps && selectedGameMaps.map((gameMap) => (
108 <div onClick={() => { setUploadRunContent({...uploadRunContent, map_id: parseInt(gameMap.name)}); _set_current_map(gameMap.name); _handle_dropdowns(2); }} key={gameMap.id}>{gameMap.name}</div> 155 <div onClick={() => { setUploadRunContent({...uploadRunContent, map_id: gameMap.id}); _set_current_map(gameMap.name); _handle_dropdowns(2); }} key={gameMap.id}>{gameMap.name}</div>
109 ))} 156 ))}
110 </div> 157 </div>
111 </div> 158 </div>
112 <span>Host Demo</span> 159 <span>Host Demo</span>
113 <input type="file" name="host_demo" id="host_demo" accept=".dem" /> 160 <input type="file" name="host_demo" id="host_demo" accept=".dem" onChange={(e) => _handle_file_change(e, true)} />
114 { 161 {
115 games[selectedGameID].is_coop && 162 games[selectedGameID].is_coop &&
116 ( 163 (
117 <> 164 <>
118 <span>Partner Demo</span> 165 <span>Partner Demo</span>
119 <input type="file" name="partner_demo" id="partner_demo" accept=".dem" /> 166 <input type="file" name="partner_demo" id="partner_demo" accept=".dem" onChange={(e) => _handle_file_change(e, false)} />
167 <span>Partner ID</span>
168 <input type="text" name="partner_id" id="partner_id" onChange={(e) => setUploadRunContent({
169 ...uploadRunContent,
170 partner_id: e.target.value,
171 })} />
120 </> 172 </>
121 ) 173 )
122 } 174 }
123 <div className='upload-run-buttons-container'> 175 <div className='upload-run-buttons-container'>
124 <button onClick={() => onClose()}>Submit</button> 176 <button onClick={_upload_run}>Submit</button>
125 <button onClick={() => onClose()}>Cancel</button> 177 <button onClick={() => onClose()}>Cancel</button>
126 </div> 178 </div>
127 </div> 179 </div>