Skip to content
Permalink
84e7df6c30
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
162 lines (147 sloc) 4.24 KB
import {
Button,
Container,
Heading,
HStack,
Input,
Radio,
RadioGroup,
Textarea,
useToast,
} from "@chakra-ui/react";
import { useEffect, useState } from "react";
import Success from "../../components/Success.js";
import { useLoaderData } from "@remix-run/react";
export async function loader({ context }: { context: RequestContext }) {
if (!context.data.current_user)
throw new Response(null, {
status: 401,
});
if (
![1 << 3, 1 << 4, 1 << 12].find(
(p) => context.data.current_user.permissions & p,
)
)
throw new Response(null, {
status: 403,
});
return null;
}
export default function () {
useLoaderData<typeof loader>();
const toast = useToast();
const currentDate = new Date();
const currentMonth = currentDate.getUTCMonth() + 1;
const currentYear = currentDate.getUTCFullYear();
const [datePickerMax, setDatePickerMax] = useState("");
const [datePickerMin, setDatePickerMin] = useState("");
const [eventDay, setEventDay] = useState("0");
const [eventDetails, setEventDetails] = useState("");
const [eventType, setEventType] = useState("");
const [riddleAnswer, setRiddleAnswer] = useState("");
const [submitSuccess, setSubmitSuccess] = useState(false);
useEffect(() => {
setDatePickerMin(
`${currentYear}-${currentMonth.toString().padStart(2, "0")}-${currentDate.getUTCDate().toString().padStart(2, "0")}`,
);
currentDate.setUTCDate(0);
setDatePickerMax(
`${currentYear}-${currentMonth.toString().padStart(2, "0")}-${new Date(currentYear, currentMonth, 0).getUTCDate()}`,
);
}, []);
async function submit() {
let eventResp: Response;
try {
eventResp = await fetch("/api/events-team/events/new", {
body: JSON.stringify({
answer: riddleAnswer || undefined,
day: parseInt(eventDay),
details: eventDetails,
type: eventType,
}),
headers: {
"content-type": "application/json",
},
method: "POST",
});
} catch {
toast({
description: "Please check your internet and try again",
isClosable: true,
status: "error",
title: "Unknown error",
});
return;
}
if (!eventResp.ok) {
let errorMessage = "Unknown error";
try {
errorMessage = ((await eventResp.json()) as { error: string }).error;
} catch {}
toast({
description: errorMessage,
isClosable: true,
status: "error",
title: "Oops!",
});
return;
}
setSubmitSuccess(true);
await new Promise((r) => setTimeout(r, 7500));
location.assign("/events-team");
}
return submitSuccess ? (
<Success
heading="Event Booked"
message="You will be notified when it is approved"
/>
) : (
<Container maxW="container.md">
<Heading pb="32px">Book an Event</Heading>
<Heading mb="8px" size="md">
Event Type
</Heading>
<RadioGroup onChange={setEventType} value={eventType}>
<HStack>
<Radio value="fotd">FoTD</Radio>
<Radio value="gamenight">Gamenight</Radio>
<Radio value="qotd">QoTD</Radio>
<Radio value="rotw">RoTW</Radio>
</HStack>
</RadioGroup>
<br />
<Heading pb="8px" pt="16px" size="md">
Event Date
</Heading>
<input
max={datePickerMax}
min={datePickerMin}
onChange={(e) => setEventDay(e.target.value.split("-")[2])}
type="date"
/>
<Heading mb="8px" pt="16px" size="md">
Event Details
</Heading>
<Textarea
onChange={(e) => setEventDetails(e.target.value)}
placeholder="For gamenights, provide information about the game and the link. For all other events, type out the fact/question/riddle."
/>
<Heading
display={eventType === "rotw" ? undefined : "none"}
mb="8px"
pt="16px"
size="md"
>
Riddle Answer
</Heading>
<Input
display={eventType === "rotw" ? undefined : "none"}
onChange={(e) => setRiddleAnswer(e.target.value)}
placeholder="Riddle answer"
/>
<Button mt="16px" onClick={async () => await submit()}>
Book
</Button>
</Container>
);
}