import { Box, Button, Card, CardBody, CardFooter, CardHeader, Heading, Input, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Stack, StackDivider, Text, useDisclosure, useToast, } from "@chakra-ui/react"; import { useState } from "react"; export default function (props: GameAppealProps) { const [loading, setLoading] = useState(false); const [percentage, setPercentage] = useState(0); const toast = useToast(); async function performAction(action: "accept" | "deny"): Promise { setLoading(true); const actionResponse = await fetch( `/api/game-appeals/${props.id}/${action}`, { body: JSON.stringify({ statsReduction: isNaN(percentage) ? 0 : percentage, }), headers: { "content-type": "application/json", }, method: "POST", }, ); toast( actionResponse.ok ? { duration: 5000, status: "success", title: `Appeal ${action === "accept" ? "accepted" : "denied"}`, } : { description: `${ ((await actionResponse.json()) as { error: string }).error }`, duration: 10000, status: "error", title: "An error occurred...", }, ); setLoading(false); document .getElementById(`gma_${props.roblox_id}${props.created_at}`) ?.remove(); } const { isOpen, onClose, onOpen } = useDisclosure(); return ( Game Ban Appeal for {props.roblox_username} ID: {props.roblox_id} }> Response: Explanation of Ban {props.whatHappened} Response: Reasoning for Unban {props.reasonForUnban} How much should this player's stats be reduced by? { const value = (e.target as EventTarget & { value: string }) .value; return !value.match(/\D/); }} onChange={(e) => setPercentage(parseInt(e.target.value))} placeholder="Number between 0 and 100" /> ); }