import { Box, Button, Card, CardBody, CardFooter, Container, Flex, Heading, Link, Stack, StackDivider, Text, useToast, VStack, } from "@chakra-ui/react"; import { useLoaderData } from "@remix-run/react"; import { type ReactNode } from "react"; export async function loader({ context }: { context: RequestContext }) { const now = new Date(); const monthEventList = await context.env.D1.prepare( "SELECT approved, created_by, day, id, month, pending, type, year FROM events WHERE month = ? AND year = ?;", ) .bind(now.getUTCMonth() + 1, now.getUTCFullYear()) .all(); if (monthEventList.error) throw new Response(null, { status: 500, }); return { can_approve: Boolean( [1 << 4, 1 << 12].find((p) => context.data.user.permissions & p), ), events: monthEventList.results, }; } export default function () { const { can_approve, events, }: { can_approve: boolean; events: { [k: string]: any }[]; } = useLoaderData(); const eventCards: ReactNode[] = []; const toast = useToast(); async function decide(approved: boolean, eventId: string) { const decisionResp = await fetch( `/api/events-team/events/${eventId}/decision`, { body: JSON.stringify({ approved }), headers: { "content-type": "application/json", }, method: "POST", }, ); if (!decisionResp.ok) { let errorMsg = "Unknown error"; try { errorMsg = ((await decisionResp.json()) as { error: string }).error; } catch {} toast({ description: errorMsg, status: "error", title: "Oops!", }); return; } toast({ description: `Event ${approved ? "approved" : "rejected"}`, title: "Success", }); } for (const event of events) { eventCards.push( } spacing="4"> Date {event.year}-{event.month}-{event.day} Event Type {event.type.toUpperCase()} Host {event.created_by} {can_approve && event.pending ? ( <> ) : null} Status:{" "} {event.pending ? "Pending" : event.approved ? "Approved" : "Denied"} , ); } return ( {eventCards} Book an Event
Events Team Member Management
); }