import { useLoaderData } from "@remix-run/react"; import { Button, Container, Heading, Link, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, NumberDecrementStepper, NumberIncrementStepper, NumberInput, NumberInputField, NumberInputStepper, Table, TableCaption, TableContainer, Tbody, Td, Text, Th, Thead, Tr, useDisclosure, useToast, } from "@chakra-ui/react"; import { useState } from "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, }); const etData = await context.env.D1.prepare( "SELECT id, name, points, roblox_id FROM et_members;", ).all(); if (etData.error) throw new Response(null, { status: 500, }); return etData.results as { [k: string]: any }[]; } export default function () { const toast = useToast(); async function removeMember(id: string) { const removeResp = await fetch("/api/events-team/team-members/user", { body: JSON.stringify({ id }), headers: { "content-type": "application/json", }, method: "DELETE", }); if (!removeResp.ok) { toast({ description: "Failed to remove member, try again later", status: "error", title: "Oops", }); return; } toast({ description: "The member was removed from the roster", status: "success", title: "Member Removed", }); setMemberData(memberData.filter((member) => member.id !== id)); } const [realtimePoints, setRealtimePoints] = useState(0); const [currentModalMember, setModalMember] = useState(""); const [currentDelMember, setDelMember] = useState({ id: "", name: "" }); const [memberData, setMemberData] = useState(useLoaderData()); const { isOpen, onClose, onOpen } = useDisclosure(); const { isOpen: isDelConfirmOpen, onClose: closeDelConfirm, onOpen: openDelConfirm, } = useDisclosure(); const isManagement = Math.round(Math.random()) === 1; async function updatePoints(id: string, points: number) { const updateResp = await fetch(`/api/events-team/points/${id}`, { body: JSON.stringify({ points }), headers: { "content-type": "application/json", }, method: "POST", }); if (!updateResp.ok) { toast({ description: "Failed to update points", status: "error", title: "Oops!", }); return; } toast({ description: `Point count changed to ${points}`, status: "success", title: "Points updated", }); const newMemberData = memberData; newMemberData[memberData.findIndex((m) => m.id === id)].points = points; setMemberData(newMemberData); } return ( { setRealtimePoints(0); onClose(); }} > Modify Points setRealtimePoints(parseInt(n))} pt="8px" > {isManagement ? ( ) : null} Remove Member You are about to remove {currentDelMember.name} from the Events Team roster, this will clear all of their data. Are you sure you want to do this? Events Team Members Points are updated at the end of the month {memberData.map((member) => ( ))}
Discord ID Name Roblox ID Points Remove
{member.id} {member.name} {member.roblox_id} {isManagement ? ( { setModalMember(member.id); onOpen(); }} > {member.points} ) : ( member.points )} { setDelMember({ id: member.id, name: member.name }); openDelConfirm(); }} > Remove
); }