diff options
| author | Wolfboy248 <georgejvindkarlsen@gmail.com> | 2024-10-10 21:06:19 +0200 |
|---|---|---|
| committer | Wolfboy248 <georgejvindkarlsen@gmail.com> | 2024-10-10 21:06:19 +0200 |
| commit | 5b1cdb6741677dbbc7be9e11703cbb8f54aad74b (patch) | |
| tree | 61e1903952cdb7ed9184c70684e1d13ae32137d8 | |
| parent | refactor: so much shit (diff) | |
| download | lphub-5b1cdb6741677dbbc7be9e11703cbb8f54aad74b.tar.gz lphub-5b1cdb6741677dbbc7be9e11703cbb8f54aad74b.tar.bz2 lphub-5b1cdb6741677dbbc7be9e11703cbb8f54aad74b.zip | |
refactor: upload run dialog
| -rw-r--r-- | frontend/src/components/UploadRunDialog.tsx | 77 | ||||
| -rw-r--r-- | frontend/src/css/UploadRunDialog.css | 78 |
2 files changed, 131 insertions, 24 deletions
diff --git a/frontend/src/components/UploadRunDialog.tsx b/frontend/src/components/UploadRunDialog.tsx index aa7ab5a..fb146ba 100644 --- a/frontend/src/components/UploadRunDialog.tsx +++ b/frontend/src/components/UploadRunDialog.tsx | |||
| @@ -24,12 +24,34 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ open, onClose, mapID, | |||
| 24 | is_partner_orange: undefined, | 24 | is_partner_orange: undefined, |
| 25 | }); | 25 | }); |
| 26 | 26 | ||
| 27 | const [currentMap, setCurrentMap] = React.useState<string>(""); | ||
| 28 | |||
| 29 | const _set_current_map = (game_name: string) => { | ||
| 30 | setCurrentMap(game_name); | ||
| 31 | } | ||
| 32 | |||
| 27 | const [selectedGameID, setSelectedGameID] = React.useState<number>(0); | 33 | const [selectedGameID, setSelectedGameID] = React.useState<number>(0); |
| 28 | const [selectedGameMaps, setSelectedGameMaps] = React.useState<Map[]>([]); | 34 | const [selectedGameMaps, setSelectedGameMaps] = React.useState<Map[]>([]); |
| 35 | const [selectedGameName, setSelectedGameName] = React.useState<string>(""); | ||
| 36 | |||
| 37 | // dropdowns | ||
| 38 | const [dropdown1Vis, setDropdown1Vis] = React.useState<boolean>(false); | ||
| 39 | const [dropdown2Vis, setDropdown2Vis] = React.useState<boolean>(false); | ||
| 29 | 40 | ||
| 30 | const [loading, setLoading] = React.useState<boolean>(false); | 41 | const [loading, setLoading] = React.useState<boolean>(false); |
| 31 | 42 | ||
| 32 | const _handle_game_select = async (game_id: string) => { | 43 | const _handle_dropdowns = (dropdown: number) => { |
| 44 | setDropdown1Vis(false); | ||
| 45 | setDropdown2Vis(false); | ||
| 46 | if (dropdown == 1) { | ||
| 47 | setDropdown1Vis(!dropdown1Vis); | ||
| 48 | } else if (dropdown == 2) { | ||
| 49 | setDropdown2Vis(!dropdown2Vis); | ||
| 50 | document.querySelector("#dropdown2")?.scrollTo(0, 0); | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 54 | const _handle_game_select = async (game_id: string, game_name: string) => { | ||
| 33 | setLoading(true); | 55 | setLoading(true); |
| 34 | const gameMaps = await API.get_game_maps(game_id); | 56 | const gameMaps = await API.get_game_maps(game_id); |
| 35 | setSelectedGameMaps(gameMaps); | 57 | setSelectedGameMaps(gameMaps); |
| @@ -37,13 +59,15 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ open, onClose, mapID, | |||
| 37 | ...uploadRunContent, | 59 | ...uploadRunContent, |
| 38 | map_id: gameMaps[0].id, | 60 | map_id: gameMaps[0].id, |
| 39 | }); | 61 | }); |
| 62 | _set_current_map(gameMaps[0].name); | ||
| 40 | setSelectedGameID(parseInt(game_id) - 1); | 63 | setSelectedGameID(parseInt(game_id) - 1); |
| 64 | setSelectedGameName(game_name); | ||
| 41 | setLoading(false); | 65 | setLoading(false); |
| 42 | }; | 66 | }; |
| 43 | 67 | ||
| 44 | React.useEffect(() => { | 68 | React.useEffect(() => { |
| 45 | if (open) { | 69 | if (open) { |
| 46 | _handle_game_select("1"); // a different approach?. | 70 | _handle_game_select("1", "Portal 2 - Singleplayer"); // a different approach?. |
| 47 | } | 71 | } |
| 48 | }, [open]); | 72 | }, [open]); |
| 49 | 73 | ||
| @@ -54,25 +78,37 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ open, onClose, mapID, | |||
| 54 | <div id='upload-run-menu'> | 78 | <div id='upload-run-menu'> |
| 55 | <div id='upload-run-menu-add'> | 79 | <div id='upload-run-menu-add'> |
| 56 | <div id='upload-run-route-category'> | 80 | <div id='upload-run-route-category'> |
| 57 | <span>Select Game</span> | 81 | <div style={{padding: "15px 0px"}} className='upload-run-dropdown-container'> |
| 58 | <select onChange={(e) => _handle_game_select(e.target.value)}> | 82 | <h1 style={{paddingBottom: "14px"}}>Select Game</h1> |
| 59 | {games.map((game) => ( | 83 | <div onClick={() => _handle_dropdowns(1)} style={{display: "flex", alignItems: "center", cursor: "pointer", justifyContent: "space-between"}}> |
| 60 | <option key={game.id} value={game.id}>{game.name}</option> | 84 | <div className='dropdown-cur'>{selectedGameName}</div> |
| 61 | ))} | 85 | <i style={{rotate: "-90deg", transform: "translate(-5px, 10px)"}} className="triangle"></i> |
| 62 | </select> | 86 | </div> |
| 87 | <div className={dropdown1Vis ? "upload-run-dropdown" : "upload-run-dropdown hidden"}> | ||
| 88 | {games.map((game) => ( | ||
| 89 | <div onClick={() => {_handle_game_select(game.id.toString(), game.name); _handle_dropdowns(1)}} key={game.id}>{game.name}</div> | ||
| 90 | ))} | ||
| 91 | </div> | ||
| 92 | </div> | ||
| 63 | { | 93 | { |
| 64 | !loading && | 94 | !loading && |
| 65 | ( | 95 | ( |
| 66 | <> | 96 | <> |
| 67 | <span>Select Map</span> | 97 | <div className='upload-run-map-container' style={{paddingBottom: "10px"}}> |
| 68 | <select onChange={(e) => setUploadRunContent({ | 98 | <div style={{padding: "15px 0px"}}> |
| 69 | ...uploadRunContent, | 99 | <h1 style={{paddingBottom: "14px"}}>Select Map</h1> |
| 70 | map_id: parseInt(e.target.value), | 100 | <div onClick={() => _handle_dropdowns(2)} style={{display: "flex", alignItems: "center", cursor: "pointer", justifyContent: "space-between"}}> |
| 71 | })}> | 101 | <span style={{userSelect: "none"}}>{currentMap}</span> |
| 72 | {selectedGameMaps && selectedGameMaps.map((gameMap) => ( | 102 | <i style={{rotate: "-90deg", transform: "translate(-5px, 10px)"}} className="triangle"></i> |
| 73 | <option key={gameMap.id} value={gameMap.id}>{gameMap.name}</option> | 103 | </div> |
| 74 | ))} | 104 | </div> |
| 75 | </select> | 105 | <div> |
| 106 | <div id='dropdown2' className={dropdown2Vis ? "upload-run-dropdown" : "upload-run-dropdown hidden"}> | ||
| 107 | {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> | ||
| 109 | ))} | ||
| 110 | </div> | ||
| 111 | </div> | ||
| 76 | <span>Host Demo</span> | 112 | <span>Host Demo</span> |
| 77 | <input type="file" name="host_demo" id="host_demo" accept=".dem" /> | 113 | <input type="file" name="host_demo" id="host_demo" accept=".dem" /> |
| 78 | { | 114 | { |
| @@ -84,8 +120,11 @@ const UploadRunDialog: React.FC<UploadRunDialogProps> = ({ open, onClose, mapID, | |||
| 84 | </> | 120 | </> |
| 85 | ) | 121 | ) |
| 86 | } | 122 | } |
| 87 | <button onClick={() => onClose()}>Submit</button> | 123 | <div className='upload-run-buttons-container'> |
| 88 | <button onClick={() => onClose()}>Cancel</button> | 124 | <button onClick={() => onClose()}>Submit</button> |
| 125 | <button onClick={() => onClose()}>Cancel</button> | ||
| 126 | </div> | ||
| 127 | </div> | ||
| 89 | </> | 128 | </> |
| 90 | ) | 129 | ) |
| 91 | } | 130 | } |
diff --git a/frontend/src/css/UploadRunDialog.css b/frontend/src/css/UploadRunDialog.css index 60f0a28..e85f206 100644 --- a/frontend/src/css/UploadRunDialog.css +++ b/frontend/src/css/UploadRunDialog.css | |||
| @@ -8,13 +8,13 @@ div#upload-run{ | |||
| 8 | transform: translateY(-68%); | 8 | transform: translateY(-68%); |
| 9 | } | 9 | } |
| 10 | 10 | ||
| 11 | |||
| 12 | #upload-run-menu{ | 11 | #upload-run-menu{ |
| 13 | position: absolute; | 12 | position: absolute; |
| 14 | left: calc(50% + 160px); top: 130px; | 13 | left: calc(50% + 160px); top: 130px; |
| 15 | transform: translateX(-50%); | 14 | transform: translateX(-50%); |
| 16 | background-color: #2b2e46; | 15 | background-color: #2b2e46; |
| 17 | z-index: 2; color: white; | 16 | z-index: 2; color: white; |
| 17 | font-family: BarlowSemicondensed-SemiBold; | ||
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | #upload-run-menu-add, | 20 | #upload-run-menu-add, |
| @@ -23,16 +23,13 @@ div#upload-run{ | |||
| 23 | outline: 8px solid #2b2e46; | 23 | outline: 8px solid #2b2e46; |
| 24 | border-radius: 20px; | 24 | border-radius: 20px; |
| 25 | font-size: 40px; | 25 | font-size: 40px; |
| 26 | display: grid; | ||
| 27 | grid-template-columns: 20% 20% 20% 20% 20%; | ||
| 28 | } | 26 | } |
| 29 | 27 | ||
| 30 | #upload-run-menu-add>div, | 28 | #upload-run-menu-add>div, |
| 31 | #upload-run-menu-edit>div{ | 29 | #upload-run-menu-edit>div{ |
| 32 | display: grid; | 30 | display: grid; |
| 33 | margin: 20px; | ||
| 34 | width: 200px; | ||
| 35 | font-size: 20px; | 31 | font-size: 20px; |
| 32 | padding: 0px 15px; | ||
| 36 | } | 33 | } |
| 37 | 34 | ||
| 38 | #upload-run-block{ | 35 | #upload-run-block{ |
| @@ -45,3 +42,74 @@ div#upload-run{ | |||
| 45 | z-index: 2; | 42 | z-index: 2; |
| 46 | cursor: no-drop; | 43 | cursor: no-drop; |
| 47 | } | 44 | } |
| 45 | |||
| 46 | .upload-run-dropdown-container .dropdown-cur { | ||
| 47 | user-select: none; | ||
| 48 | cursor: pointer; | ||
| 49 | } | ||
| 50 | |||
| 51 | .upload-run-dropdown { | ||
| 52 | position: absolute; | ||
| 53 | user-select: none; | ||
| 54 | cursor: pointer; | ||
| 55 | z-index: 1000; | ||
| 56 | background-color: #222538; | ||
| 57 | border-radius: 10px; | ||
| 58 | overflow: hidden; | ||
| 59 | animation: dropdown-in 0.2s ease; | ||
| 60 | max-height: 300px; | ||
| 61 | overflow-y: scroll; | ||
| 62 | width: calc(100% - 30px); | ||
| 63 | } | ||
| 64 | |||
| 65 | .upload-run-dropdown div { | ||
| 66 | padding: 8px; | ||
| 67 | } | ||
| 68 | |||
| 69 | .upload-run-dropdown div:hover { | ||
| 70 | background-color: #414669; | ||
| 71 | } | ||
| 72 | |||
| 73 | .upload-run-dropdown.hidden { | ||
| 74 | display: none; | ||
| 75 | } | ||
| 76 | |||
| 77 | @keyframes dropdown-in { | ||
| 78 | 0% { | ||
| 79 | opacity: 0; | ||
| 80 | } | ||
| 81 | |||
| 82 | 100% { | ||
| 83 | opacity: 1; | ||
| 84 | } | ||
| 85 | } | ||
| 86 | |||
| 87 | button, input { | ||
| 88 | background-color: #2b2e46; | ||
| 89 | border: none; | ||
| 90 | font-family: BarlowSemiCondensed-Regular; | ||
| 91 | color: #CDCFDF; | ||
| 92 | font-size: 18px; | ||
| 93 | cursor: pointer; | ||
| 94 | padding: 5px 0px; | ||
| 95 | transition: all 0.2s ease; | ||
| 96 | } | ||
| 97 | |||
| 98 | button:hover { | ||
| 99 | background-color: #222538; | ||
| 100 | border-radius: 32px; | ||
| 101 | } | ||
| 102 | |||
| 103 | .upload-run-map-container { | ||
| 104 | display: flex; | ||
| 105 | flex-direction: column; | ||
| 106 | } | ||
| 107 | |||
| 108 | .upload-run-buttons-container { | ||
| 109 | display: flex; | ||
| 110 | margin-top: 10px; | ||
| 111 | } | ||
| 112 | .upload-run-buttons-container button { | ||
| 113 | width: 100%; | ||
| 114 | } | ||
| 115 | |||