import { useLoaderData } from "@remix-run/react"; import { Button, Container, Heading, Input, 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 { FormEvent, 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 { can_manage: true, members: etData.results } as { can_manage: boolean; members: { [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)); } async function addMember() { const addResp = await fetch("/api/events-team/team-members/user", { body: JSON.stringify({ id: addingMemberId, name: addingMemberName, roblox_username: addingMemberRoblox, }), headers: { "content-type": "application/json", }, method: "POST", }); if (!addResp.ok) { toast({ description: "Failed to add member, try again later", status: "error", title: "Oops", }); return; } toast({ description: `Member ${addingMemberName} was added to the roster`, status: "success", title: "Member Added", }); location.reload(); } const data = useLoaderData(); const [realtimePoints, setRealtimePoints] = useState(0); const [currentModalMember, setModalMember] = useState(""); const [currentDelMember, setDelMember] = useState({ id: "", name: "" }); const [memberData, setMemberData] = useState(data.members); const [addingMemberId, setAddingMemberId] = useState(""); const [addingMemberName, setAddingMemberName] = useState(""); const [addingMemberRoblox, setAddingMemberRoblox] = useState(""); const { isOpen, onClose, onOpen } = useDisclosure(); const { isOpen: isDelConfirmOpen, onClose: closeDelConfirm, onOpen: openDelConfirm, } = useDisclosure(); const { isOpen: isAddMemberOpen, onClose: closeAddMember, onOpen: openAddMember, } = useDisclosure(); const isManagement = data.can_manage; 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); onClose(); } return ( { setRealtimePoints(0); onClose(); }} > Modify Points setRealtimePoints(parseInt(n))} mt="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? Add Member User ID { const { data, }: { data?: string } & FormEvent = e; if (data?.match(/\D/)) e.preventDefault(); }} onChange={(e) => setAddingMemberId(e.target.value)} mb="16px" type="number" /> Name setAddingMemberName(e.target.value)} mb="16px" /> Roblox Username (optional) { const { data, }: { data?: string } & FormEvent = e; if (!data) return; if ( data.match(/\W/) || data.length > 20 || (data.match(/_/g)?.length || 0) > 1 || data.startsWith("_") ) e.preventDefault(); }} onChange={(e) => setAddingMemberRoblox(e.target.value)} /> Events Team Members Click/tap on a user's points count to change their points, their user id to see and manage strikes. {memberData.map((member) => ( ))}
Discord ID Name Roblox ID Points Remove
{isManagement ? ( location.assign(`/et-members/strikes/${member.id}`) } > {member.id} ) : ( member.id )} {member.name} {member.roblox_id} {isManagement ? ( { setModalMember(member.id); onOpen(); }} > {member.points} ) : ( member.points )} {isManagement ? ( { setDelMember({ id: member.id, name: member.name }); openDelConfirm(); }} > Remove ) : null}
{isManagement ? ( Add Member ) : null}
); }