diff --git a/components/AppealBans.tsx b/components/AppealBans.tsx new file mode 100644 index 0000000..1e1d9a1 --- /dev/null +++ b/components/AppealBans.tsx @@ -0,0 +1,109 @@ +import { + Link, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, + Table, + TableContainer, + Tbody, + Td, + Th, + Thead, + Tr, + useDisclosure, + useToast, +} from "@chakra-ui/react"; +import { useEffect, useState } from "react"; +import NewAppealBan from "./NewAppealBan.js"; + +export default function (props: { isOpen: boolean; onClose: () => void }) { + const [entries, setEntries] = useState( + [] as { created_at: number; created_by: string; user: string }[], + ); + const toast = useToast(); + const { isOpen, onClose, onOpen } = useDisclosure(); + + async function removeBan(user: string) { + const removeResp = await fetch(`/api/appeals/${user}/ban`, { + method: "DELETE", + }); + + if (!removeResp.ok) { + let error; + + try { + error = ((await removeResp.json()) as { error: string }).error; + } catch { + error = "Unknown error"; + } + + toast({ + description: error, + isClosable: true, + status: "error", + title: "Failed to remove member", + }); + + return; + } + + toast({ + description: `User ${user} removed`, + isClosable: true, + status: "success", + title: "Success", + }); + + setEntries([...entries].filter((entry) => entry.user !== user)); + } + + useEffect(() => {}, []); + + return ( + <> + + + + Appeal Bans + + + + + + + + + + + + + + {entries.map((entry) => ( + + + + + + + ))} + +
UserModeratorTimeRemove
{entry.user}{entry.created_by}{new Date(entry.created_at).toUTCString()} + await removeBan(entry.user)}> + Remove + +
+
+
+ + Click here to ban someone + +
+
+ + + ); +}