aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--frontend/src/components/Leaderboards.tsx4
-rw-r--r--frontend/src/components/MessageDialogLoad.tsx29
-rw-r--r--frontend/src/components/UploadRunDialog.tsx13
-rw-r--r--frontend/src/css/Dialog.css14
-rw-r--r--frontend/src/css/UploadRunDialog.css6
-rw-r--r--frontend/src/hooks/UseMessage.tsx6
-rw-r--r--frontend/src/hooks/UseMessageLoad.tsx35
-rw-r--r--frontend/src/pages/Profile.tsx6
8 files changed, 100 insertions, 13 deletions
diff --git a/frontend/src/components/Leaderboards.tsx b/frontend/src/components/Leaderboards.tsx
index b9e071c..4a107ad 100644
--- a/frontend/src/components/Leaderboards.tsx
+++ b/frontend/src/components/Leaderboards.tsx
@@ -34,9 +34,7 @@ const Leaderboards: React.FC<LeaderboardsProps> = ({ data }) => {
34 34
35 return ( 35 return (
36 <div> 36 <div>
37 <div style={{position: "absolute", width: "100%", height: "100%", top: "0px", left: "-350px"}}> 37 {MessageDialogComponent}
38 {MessageDialogComponent}
39 </div>
40 <section id='section6' className='summary2'> 38 <section id='section6' className='summary2'>
41 39
42 <div id='leaderboard-top' 40 <div id='leaderboard-top'
diff --git a/frontend/src/components/MessageDialogLoad.tsx b/frontend/src/components/MessageDialogLoad.tsx
new file mode 100644
index 0000000..381a4a4
--- /dev/null
+++ b/frontend/src/components/MessageDialogLoad.tsx
@@ -0,0 +1,29 @@
1import React from 'react';
2
3import "../css/Dialog.css"
4
5interface MessageDialogLoadProps {
6 title: string;
7 onClose: () => void;
8};
9
10const MessageDialogLoad: React.FC<MessageDialogLoadProps> = ({ title, onClose }) => {
11 return (
12 <div className='dimmer'>
13 <div className='dialog'>
14 <div className='dialog-element dialog-header'>
15 <span>{title}</span>
16 </div>
17 <div className='dialog-element dialog-description'>
18 <div style={{display: "flex", justifyContent: "center"}}>
19 <span className="loader"></span>
20 </div>
21 </div>
22 <div className='dialog-element dialog-btns-container'>
23 </div>
24 </div>
25 </div>
26 )
27}
28
29export default MessageDialogLoad;
diff --git a/frontend/src/components/UploadRunDialog.tsx b/frontend/src/components/UploadRunDialog.tsx
index 212a792..22b895c 100644
--- a/frontend/src/components/UploadRunDialog.tsx
+++ b/frontend/src/components/UploadRunDialog.tsx
@@ -9,6 +9,7 @@ import { API } from '../api/Api';
9import { useNavigate } from 'react-router-dom'; 9import { useNavigate } from 'react-router-dom';
10import useMessage from '../hooks/UseMessage'; 10import useMessage from '../hooks/UseMessage';
11import useConfirm from '../hooks/UseConfirm'; 11import useConfirm from '../hooks/UseConfirm';
12import useMessageLoad from "../hooks/UseMessageLoad";
12 13
13interface UploadRunDialogProps { 14interface UploadRunDialogProps {
14 token?: string; 15 token?: string;
@@ -21,6 +22,7 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ token, open, onClose,
21 22
22 const { message, MessageDialogComponent } = useMessage(); 23 const { message, MessageDialogComponent } = useMessage();
23 const { confirm, ConfirmDialogComponent } = useConfirm(); 24 const { confirm, ConfirmDialogComponent } = useConfirm();
25 const { messageLoad, messageLoadClose, MessageDialogLoadComponent } = useMessageLoad();
24 26
25 const navigate = useNavigate(); 27 const navigate = useNavigate();
26 28
@@ -164,7 +166,9 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ token, open, onClose,
164 return; 166 return;
165 } 167 }
166 168
169 messageLoad("Uploading...");
167 const [ success, response ] = await API.post_record(token, uploadRunContent); 170 const [ success, response ] = await API.post_record(token, uploadRunContent);
171 messageLoadClose();
168 await message("Upload Record", response); 172 await message("Upload Record", response);
169 onClose(success); 173 onClose(success);
170 navigate("/profile"); 174 navigate("/profile");
@@ -185,6 +189,7 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ token, open, onClose,
185 <> 189 <>
186 <div id="upload-run-block" /> 190 <div id="upload-run-block" />
187 {MessageDialogComponent} 191 {MessageDialogComponent}
192 {MessageDialogLoadComponent}
188 {ConfirmDialogComponent} 193 {ConfirmDialogComponent}
189 194
190 <div id='upload-run-menu'> 195 <div id='upload-run-menu'>
@@ -234,7 +239,7 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ token, open, onClose,
234 </div> 239 </div>
235 : null} 240 : null}
236 241
237 <span>{uploadRunContent.host_demo?.name}</span> 242 <span className="upload-run-demo-name">{uploadRunContent.host_demo?.name}</span>
238 </div> 243 </div>
239 { 244 {
240 games[selectedGameID].is_coop && 245 games[selectedGameID].is_coop &&
@@ -246,13 +251,13 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ token, open, onClose,
246 <div> 251 <div>
247 <span>Drag and drop</span> 252 <span>Drag and drop</span>
248 <div> 253 <div>
249 <span>Or click here</span><br/> 254 <span style={{fontFamily: "BarlowSemiCondensed-Regular"}}>Or click here</span><br/>
250 <button>Upload</button> 255 <button style={{borderRadius: "24px", padding: "5px 8px", margin: "5px 0px"}}>Upload</button>
251 </div> 256 </div>
252 </div> 257 </div>
253 : null} 258 : null}
254 259
255 <span>{uploadRunContent.partner_demo?.name}</span> 260 <span className="upload-run-demo-name">{uploadRunContent.partner_demo?.name}</span>
256 </div> 261 </div>
257 </> 262 </>
258 ) 263 )
diff --git a/frontend/src/css/Dialog.css b/frontend/src/css/Dialog.css
index 47f070b..fc557d2 100644
--- a/frontend/src/css/Dialog.css
+++ b/frontend/src/css/Dialog.css
@@ -1,11 +1,21 @@
1.dimmer { 1.dimmer {
2 position: fixed; 2 position: fixed;
3 width: 100%; 3 /* WHAT A SCHTUPID ACTION */
4 width: 200%;
4 height: 100%; 5 height: 100%;
5 background-color: rgba(0, 0, 0, 0.5); 6 background-color: rgba(0, 0, 0, 0.5);
6 z-index: 4; 7 z-index: 4;
7} 8}
8 9
10.dialog-container {
11 position: absolute;
12 top: 0px;
13 left: -350px;
14 width: 100%;
15 height: 100%;
16 z-index: 10000;
17}
18
9.dialog { 19.dialog {
10 position: fixed; 20 position: fixed;
11 z-index: 4; 21 z-index: 4;
@@ -82,4 +92,4 @@
82 transform: translate(-50%, calc(-50%)); 92 transform: translate(-50%, calc(-50%));
83 opacity: 1; 93 opacity: 1;
84 } 94 }
85} \ No newline at end of file 95}
diff --git a/frontend/src/css/UploadRunDialog.css b/frontend/src/css/UploadRunDialog.css
index 737409e..f6e910b 100644
--- a/frontend/src/css/UploadRunDialog.css
+++ b/frontend/src/css/UploadRunDialog.css
@@ -74,6 +74,12 @@ div#upload-run{
74 display: none; 74 display: none;
75} 75}
76 76
77.upload-run-demo-name {
78 text-overflow: ellipsis;
79 overflow: hidden;
80 width: 380px;
81}
82
77@keyframes dropdown-in { 83@keyframes dropdown-in {
78 0% { 84 0% {
79 opacity: 0; 85 opacity: 0;
diff --git a/frontend/src/hooks/UseMessage.tsx b/frontend/src/hooks/UseMessage.tsx
index 9bfb713..13d8e4f 100644
--- a/frontend/src/hooks/UseMessage.tsx
+++ b/frontend/src/hooks/UseMessage.tsx
@@ -26,13 +26,11 @@ const useMessage = () => {
26 }; 26 };
27 27
28 const MessageDialogComponent = isOpen && ( 28 const MessageDialogComponent = isOpen && (
29 <div className="dialog-container">
29 <MessageDialog title={title} subtitle={subtitle} onClose={handleClose}></MessageDialog> 30 <MessageDialog title={title} subtitle={subtitle} onClose={handleClose}></MessageDialog>
31 </div>
30 ); 32 );
31 33
32 const getDialogComponent = () => {
33 return MessageDialogComponent;
34 };
35
36 return { message, MessageDialogComponent }; 34 return { message, MessageDialogComponent };
37} 35}
38 36
diff --git a/frontend/src/hooks/UseMessageLoad.tsx b/frontend/src/hooks/UseMessageLoad.tsx
new file mode 100644
index 0000000..defd2b3
--- /dev/null
+++ b/frontend/src/hooks/UseMessageLoad.tsx
@@ -0,0 +1,35 @@
1import React, { useState } from 'react';
2import MessageDialogLoad from "../components/MessageDialogLoad";
3
4const useMessageLoad = () => {
5 const [isOpen, setIsOpen] = useState(false);
6
7 const [title, setTitle] = useState<string>("");
8 const [resolvePromise, setResolvePromise] = useState<(() => void) | null>(null);
9
10 const messageLoad = (title: string) => {
11 setIsOpen(true);
12 setTitle(title);
13 return new Promise((resolve) => {
14 setResolvePromise(() => resolve);
15 });
16 };
17
18 const messageLoadClose = () => {
19 setIsOpen(false);
20 if (resolvePromise) {
21 resolvePromise();
22 setResolvePromise(null);
23 }
24 };
25
26 const MessageDialogLoadComponent = isOpen && (
27 <div className="dialog-container">
28 <MessageDialogLoad title={title} onClose={messageLoadClose}></MessageDialogLoad>
29 </div>
30 );
31
32 return { messageLoad, messageLoadClose, MessageDialogLoadComponent };
33}
34
35export default useMessageLoad;
diff --git a/frontend/src/pages/Profile.tsx b/frontend/src/pages/Profile.tsx
index 3dba3ae..3f26bf8 100644
--- a/frontend/src/pages/Profile.tsx
+++ b/frontend/src/pages/Profile.tsx
@@ -10,6 +10,7 @@ import "../css/Profile.css";
10import { API } from '../api/Api'; 10import { API } from '../api/Api';
11import useConfirm from '../hooks/UseConfirm'; 11import useConfirm from '../hooks/UseConfirm';
12import useMessage from '../hooks/UseMessage'; 12import useMessage from '../hooks/UseMessage';
13import useMessageLoad from "../hooks/UseMessageLoad";
13 14
14interface ProfileProps { 15interface ProfileProps {
15 profile?: UserProfile; 16 profile?: UserProfile;
@@ -21,6 +22,7 @@ interface ProfileProps {
21const Profile: React.FC<ProfileProps> = ({ profile, token, gameData, onDeleteRecord }) => { 22const Profile: React.FC<ProfileProps> = ({ profile, token, gameData, onDeleteRecord }) => {
22 const { confirm, ConfirmDialogComponent } = useConfirm(); 23 const { confirm, ConfirmDialogComponent } = useConfirm();
23 const { message, MessageDialogComponent } = useMessage(); 24 const { message, MessageDialogComponent } = useMessage();
25 const { messageLoad, messageLoadClose, MessageDialogLoadComponent } = useMessageLoad();
24 const [navState, setNavState] = React.useState(0); 26 const [navState, setNavState] = React.useState(0);
25 const [pageNumber, setPageNumber] = React.useState(1); 27 const [pageNumber, setPageNumber] = React.useState(1);
26 const [pageMax, setPageMax] = React.useState(0); 28 const [pageMax, setPageMax] = React.useState(0);
@@ -69,7 +71,10 @@ const Profile: React.FC<ProfileProps> = ({ profile, token, gameData, onDeleteRec
69 return; 71 return;
70 } 72 }
71 73
74 messageLoad("Deleting...");
75
72 const api_success = await API.delete_map_record(token!, map_id, record_id); 76 const api_success = await API.delete_map_record(token!, map_id, record_id);
77 messageLoadClose();
73 if (api_success) { 78 if (api_success) {
74 await message("Delete Record", "Successfully deleted record."); 79 await message("Delete Record", "Successfully deleted record.");
75 onDeleteRecord(); 80 onDeleteRecord();
@@ -105,6 +110,7 @@ const Profile: React.FC<ProfileProps> = ({ profile, token, gameData, onDeleteRec
105 return ( 110 return (
106 <div> 111 <div>
107 {MessageDialogComponent} 112 {MessageDialogComponent}
113 {MessageDialogLoadComponent}
108 {ConfirmDialogComponent} 114 {ConfirmDialogComponent}
109 115
110 <main> 116 <main>