183 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import * as React from "react";
 | |
| import { BrowserRouter as Router, Link, Route, Routes } from "react-router-dom";
 | |
| import Appbar from "./components/AsuraBar";
 | |
| import ErrorSnackbar from "./components/ErrorSnackbar";
 | |
| import LoginPage from "./LoginPage";
 | |
| import { Button, TextField, Stack, InputLabel, Select, Container, Slider, Paper, Box, Grid, Typography } from '@mui/material';
 | |
| import DateTimePicker from '@mui/lab/DateTimePicker';
 | |
| import AdapterDateFns from '@mui/lab/AdapterDateFns';
 | |
| import LocalizationProvider from '@mui/lab/LocalizationProvider';
 | |
| import { setDate } from "date-fns";
 | |
| 
 | |
| function postTournament(tournamentName, tournamentDescription, tournamentStartDate, tournamentEndDate, tournamentMaxTeams, tournamentPrize) {
 | |
|   if (!tournamentName || tournamentName === "") {
 | |
|     showError("Tournament name cannot be empty");
 | |
|     return;
 | |
|   }
 | |
|   if (!tournamentDescription || tournamentDescription === "") {
 | |
|     showError("Tournament description cannot be empty");
 | |
|     return;
 | |
|   }
 | |
|   if (!tournamentStartDate || tournamentStartDate === "" || tournamentStartDate === 0) {
 | |
|     showError("Tournament start date cannot be empty");
 | |
|     return;
 | |
|   }
 | |
|   if (!tournamentEndDate || tournamentEndDate === "" || tournamentEndDate === 0) {
 | |
|     showError("Tournament end date cannot be empty");
 | |
|     return;
 | |
|   }
 | |
|   if (!tournamentMaxTeams || isNaN(tournamentMaxTeams) || tournamentMaxTeams < 4) {
 | |
|     showError("Tournament max teams cannot be empty");
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   if (tournamentStartDate > tournamentEndDate) {
 | |
|     showError("Tournament start date cannot be after end date");
 | |
|     return;
 | |
|   }
 | |
|   let today = new Date();
 | |
|   if (tournamentStartDate < today || tournamentEndDate < today) {
 | |
|     showError("Tournament start and end date must be after today");
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   let formData = new FormData();
 | |
|   formData.append("name", tournamentName);
 | |
|   formData.append("description", tournamentDescription);
 | |
|   formData.append("startDate", tournamentStartDate);
 | |
|   formData.append("endDate", tournamentEndDate);
 | |
|   formData.append("teamLimit", tournamentMaxTeams);
 | |
|   formData.append("prize", tournamentPrize)
 | |
|   let body = new URLSearchParams(formData);
 | |
| 
 | |
|   fetch(process.env.REACT_APP_API_URL + `/tournament/create`, {
 | |
|     method: "POST",
 | |
|     body: body
 | |
|   })
 | |
|     .then(response => response.json())
 | |
|     .then(data => {
 | |
|       if (data.status === "OK") {
 | |
|         alert("Tournament created successfully");
 | |
|         let tournamentId = data.data.tournamentId;
 | |
|         if (tournamentId) {
 | |
|           window.location.href = "/tournament/" + tournamentId;
 | |
|         }
 | |
|       } else {
 | |
|         showError(data.data)
 | |
|       }
 | |
|     })
 | |
|     .catch(error => showError(error));
 | |
| 
 | |
| }
 | |
| 
 | |
| function TournamentForm(props) {
 | |
|   const [maxTeamsExponent, setMaxTeamsExponent] = React.useState(2);
 | |
|   function sliderUpdate(event) {
 | |
|     setMaxTeamsExponent(event.target.value);
 | |
|   }
 | |
| 
 | |
|   const [startTime, setStartTime] = React.useState(new Date());
 | |
|   const [endTime, setEndTime] = React.useState(new Date());
 | |
| 
 | |
|   function submitTournament(event) {
 | |
|     event.preventDefault();
 | |
|     let maxTeams = Math.pow(2, maxTeamsExponent);
 | |
|     let tournamentStart = new Date(startTime.setSeconds(0, 0, 0)).valueOf() - new Date().getTimezoneOffset() * 60*1000;
 | |
|     let tournamentEnd = new Date(endTime.setSeconds(0, 0, 0)).valueOf() - new Date().getTimezoneOffset() * 60*1000;
 | |
|     postTournament(
 | |
|       document.getElementById("nameInput").value,
 | |
|       document.getElementById("descriptionInput").value,
 | |
|       tournamentStart,
 | |
|       tournamentEnd,
 | |
|       maxTeams,
 | |
|       document.getElementById("prizeInput").value
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   const marks = [
 | |
|     {  value: 2,  label: "4",},
 | |
|     {  value: 3,  label: "8",},
 | |
|     {  value: 4,  label: "16",},
 | |
|     {  value: 5,  label: "32",},
 | |
|     {  value: 6,  label: "64",}
 | |
|   ];
 | |
| 
 | |
|   return (
 | |
|     <>
 | |
|     <form>
 | |
|     <Stack sx={{minHeight: "30vh", margin: "10px auto"}} direction="column" justifyContent="center" spacing={3} align="center">
 | |
|         {/* <InputLabel htmlFor="nameInput">Tournament Name: </InputLabel> */}
 | |
|         <TextField type="text" id="nameInput" label="Tournament Name" placeholder="Tournament Name" InputLabelProps={{shrink: true}}/>
 | |
|         {/* <InputLabel htmlFor="descriptionInput">Description: </InputLabel */}
 | |
|         <TextField type="text" multiline={true} id="descriptionInput" label="Description" placeholder="Description" InputLabelProps={{shrink: true}}/>        
 | |
|         <TextField type="text" id="prizeInput" label="Prize" placeholder="Prize" InputLabelProps={{shrink: true}}/>     
 | |
|         <Box flexGrow={1}>
 | |
|         <Grid container spacing={2} justifyContent="center">
 | |
|           <Grid item xs={6}>
 | |
|           <LocalizationProvider dateAdapter={AdapterDateFns}>
 | |
|             <DateTimePicker label={"Start Time"} inputVariant="outlined" ampm={false} mask="____-__-__ __:__" format="yyyy-MM-dd HH:mm" inputFormat="yyyy-MM-dd HH:mm" value={startTime}
 | |
|               onChange={setStartTime}
 | |
|               renderInput={(params) => <TextField id="startDatePicker" {...params} sx={{margin: "0 2.5%"}} />}
 | |
|             />
 | |
|             </LocalizationProvider>
 | |
|           </Grid>
 | |
|           <Grid item xs={6}>
 | |
|           <LocalizationProvider dateAdapter={AdapterDateFns}>
 | |
|             <DateTimePicker label={"End Time"} inputVariant="outlined" ampm={false} mask="____-__-__ __:__" format="yyyy-MM-dd HH:mm" inputFormat="yyyy-MM-dd HH:mm" value={endTime}
 | |
|               onChange={setEndTime}
 | |
|               renderInput={(params) => <TextField id="endDatePicker" {...params} sx={{margin: "0 2.5%"}} />}
 | |
|             />
 | |
|           </LocalizationProvider>
 | |
|           </Grid>
 | |
|           {/* <TextField type="datetime-local" id="startDatePicker" label="Start Time" InputLabelProps={{shrink: true}} sx={{width: "48%", marginRight: "2%"}} />
 | |
|           <TextField type="datetime-local" id="endDatePicker" label="End Time" InputLabelProps={{shrink: true}} sx={{width: "48%", marginLeft: "2%"}} /> */}
 | |
|         </Grid>
 | |
|         </Box>
 | |
|         <InputLabel id="max-teams-label">Maximum number of teams</InputLabel>
 | |
|         
 | |
|         <Box sx={{flexGrow: 1}}>
 | |
|           <Grid container spacing={2} justifyContent="center">
 | |
|             <Grid item xs={8}>
 | |
|               <Container>
 | |
|                 <Slider aria-label="Teams" valueLabelDisplay="off" step={1} marks={marks} min={2} max={6} onChange={sliderUpdate} id="max-teams-slider" name="max-teams-slider" >
 | |
|                 </Slider>
 | |
|               </Container>
 | |
|             </Grid>
 | |
|           </Grid>
 | |
|         </Box>
 | |
| 
 | |
|         {/* go brrrr */}
 | |
|         <br /><br />
 | |
|         
 | |
|         <Button type="submit" variant="contained" onClick={submitTournament} color="primary">Create Tournament!</Button>
 | |
|       </Stack>
 | |
|       </form>
 | |
|     </>
 | |
|   );
 | |
| }
 | |
| 
 | |
| let showError = (message) => {};
 | |
| 
 | |
| export default function TournamentCreator(props) {
 | |
|   const [openError, setOpenError] = React.useState(false);
 | |
|   const [errorMessage, setErrorMessage] = React.useState("");
 | |
|   showError = (message) => {
 | |
|     setOpenError(false);
 | |
|     setErrorMessage(message);
 | |
|     setOpenError(true);
 | |
|   }
 | |
| 
 | |
|   if (!props.user.isLoggedIn) { return <LoginPage user={props.user} />; }
 | |
| 
 | |
|   return (
 | |
|     <>
 | |
|       <Appbar user={props.user} pageTitle="New tournament" /> 
 | |
|       <Paper sx={{minHeight: "30vh", width: "90vw", margin: "20px auto", padding: "20px 20px"}} component={Container} direction="column" align="center">
 | |
|       <TournamentForm />
 | |
|       </Paper>
 | |
|       
 | |
|       <ErrorSnackbar message={errorMessage} open={openError} setOpen={setOpenError} />
 | |
|     </>
 | |
|   );
 | |
| }
 |