aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--frontend/src/components/UploadRunDialog.tsx77
-rw-r--r--frontend/src/css/UploadRunDialog.css78
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
87button, 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
98button: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