88 lines
1.9 KiB
TypeScript
88 lines
1.9 KiB
TypeScript
import {
|
|
Button,
|
|
Input,
|
|
Modal,
|
|
ModalBody,
|
|
ModalCloseButton,
|
|
ModalContent,
|
|
ModalFooter,
|
|
ModalHeader,
|
|
ModalOverlay,
|
|
Text,
|
|
useToast,
|
|
} from "@chakra-ui/react";
|
|
import { useState } from "react";
|
|
|
|
export default function (props: { isOpen: boolean; onClose: () => void }) {
|
|
const [userID, setUserID] = useState("");
|
|
const [loading, setLoading] = useState(false);
|
|
const toast = useToast();
|
|
|
|
async function submitBan() {
|
|
const submitResp = await fetch(`/api/appeals/${userID}/ban`, {
|
|
body: "{}",
|
|
headers: {
|
|
"content-type": "application/json",
|
|
},
|
|
method: "POST",
|
|
});
|
|
|
|
if (!submitResp.ok) {
|
|
let error;
|
|
|
|
try {
|
|
error = ((await submitResp.json()) as { error: string }).error;
|
|
} catch {
|
|
error = "Unknown error";
|
|
}
|
|
|
|
toast({
|
|
description: error,
|
|
isClosable: true,
|
|
status: "error",
|
|
title: "Oops",
|
|
});
|
|
|
|
return;
|
|
}
|
|
|
|
toast({
|
|
description: "User has been banned from appeals",
|
|
isClosable: true,
|
|
status: "success",
|
|
title: "Success",
|
|
});
|
|
|
|
props.onClose();
|
|
}
|
|
|
|
return (
|
|
<Modal isCentered isOpen={props.isOpen} onClose={props.onClose}>
|
|
<ModalOverlay />
|
|
<ModalContent>
|
|
<ModalHeader>New Appeal Ban</ModalHeader>
|
|
<ModalCloseButton />
|
|
<ModalBody>
|
|
<Text>User ID</Text>
|
|
<Input
|
|
onChange={(e) => setUserID(e.target.value)}
|
|
placeholder="1234567890987654321"
|
|
/>
|
|
</ModalBody>
|
|
<ModalFooter>
|
|
<Button onClick={props.onClose}>Cancel</Button>
|
|
<Button
|
|
colorScheme="blue"
|
|
isLoading={loading}
|
|
loadingText="Submitting..."
|
|
ml="8px"
|
|
onClick={async () => await submitBan()}
|
|
>
|
|
Submit
|
|
</Button>
|
|
</ModalFooter>
|
|
</ModalContent>
|
|
</Modal>
|
|
);
|
|
}
|