diff options
Diffstat (limited to 'frontend')
| -rw-r--r-- | frontend/src/components/Leaderboards.tsx | 4 | ||||
| -rw-r--r-- | frontend/src/components/MessageDialogLoad.tsx | 29 | ||||
| -rw-r--r-- | frontend/src/components/UploadRunDialog.tsx | 13 | ||||
| -rw-r--r-- | frontend/src/css/Dialog.css | 14 | ||||
| -rw-r--r-- | frontend/src/css/UploadRunDialog.css | 6 | ||||
| -rw-r--r-- | frontend/src/hooks/UseMessage.tsx | 6 | ||||
| -rw-r--r-- | frontend/src/hooks/UseMessageLoad.tsx | 35 | ||||
| -rw-r--r-- | frontend/src/pages/Profile.tsx | 6 |
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 @@ | |||
| 1 | import React from 'react'; | ||
| 2 | |||
| 3 | import "../css/Dialog.css" | ||
| 4 | |||
| 5 | interface MessageDialogLoadProps { | ||
| 6 | title: string; | ||
| 7 | onClose: () => void; | ||
| 8 | }; | ||
| 9 | |||
| 10 | const 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 | |||
| 29 | export 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'; | |||
| 9 | import { useNavigate } from 'react-router-dom'; | 9 | import { useNavigate } from 'react-router-dom'; |
| 10 | import useMessage from '../hooks/UseMessage'; | 10 | import useMessage from '../hooks/UseMessage'; |
| 11 | import useConfirm from '../hooks/UseConfirm'; | 11 | import useConfirm from '../hooks/UseConfirm'; |
| 12 | import useMessageLoad from "../hooks/UseMessageLoad"; | ||
| 12 | 13 | ||
| 13 | interface UploadRunDialogProps { | 14 | interface 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 @@ | |||
| 1 | import React, { useState } from 'react'; | ||
| 2 | import MessageDialogLoad from "../components/MessageDialogLoad"; | ||
| 3 | |||
| 4 | const 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 | |||
| 35 | export 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"; | |||
| 10 | import { API } from '../api/Api'; | 10 | import { API } from '../api/Api'; |
| 11 | import useConfirm from '../hooks/UseConfirm'; | 11 | import useConfirm from '../hooks/UseConfirm'; |
| 12 | import useMessage from '../hooks/UseMessage'; | 12 | import useMessage from '../hooks/UseMessage'; |
| 13 | import useMessageLoad from "../hooks/UseMessageLoad"; | ||
| 13 | 14 | ||
| 14 | interface ProfileProps { | 15 | interface ProfileProps { |
| 15 | profile?: UserProfile; | 16 | profile?: UserProfile; |
| @@ -21,6 +22,7 @@ interface ProfileProps { | |||
| 21 | const Profile: React.FC<ProfileProps> = ({ profile, token, gameData, onDeleteRecord }) => { | 22 | const 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> |