import { Container, Heading, Table, TableCaption, TableContainer, Tbody, Td, Th, Thead, Tr, } from "@chakra-ui/react"; import { useLoaderData } from "@remix-run/react"; export async function loader({ context }: { context: RequestContext }) { const { current_user: user } = context.data; if (!user) throw new Response(null, { status: 401, }); if (![1 << 4, 1 << 12].find((p) => user.permissions & p)) throw new Response(null, { status: 403, }); const now = new Date(); let month = now.getUTCMonth(); let year = now.getUTCFullYear(); if (month === 0) { year--; month = 12; } const eventMemberQuery = await context.env.D1.prepare( "SELECT id, name, roblox_id FROM et_members;", ).all(); const eventsQuery = await context.env.D1.prepare( "SELECT approved, answered_at, created_by, performed_at, reached_minimum_player_count, type FROM events WHERE month = ? AND year = ?;", ) .bind(month, year) .all(); const memberMap = Object.fromEntries( eventMemberQuery.results.map((entry) => { return [ entry.id, { name: entry.name, points: 0, roblox_id: entry.roblox_id }, ]; }), ); for (const event of eventsQuery.results as { approved: number; answered_at: number; created_by: string; performed_at: number; reached_minimum_player_count: number; type: string; }[]) { if (!memberMap[event.created_by] || !event.approved) continue; if (event.performed_at) memberMap[event.created_by].points += 10; else memberMap[event.created_by].points -= 10; if (event.type === "gamenight" && event.reached_minimum_player_count) memberMap[event.created_by].points += 10; } for (const member of memberMap) if (member.points < 30) member.points -= 30; return memberMap; } export default function () { const data = useLoaderData() as { [k: string]: { name: string; points: number; roblox_id?: number }; }; const now = new Date(); let month = now.getUTCMonth(); let year = now.getUTCFullYear(); if (month === 0) { month = 12; year--; } return ( Report for {month}/{year} Total points earned for the previous month {Object.entries(data).map(([key, value]) => ( ))}
ID Name Points Roblox ID
{key} {value.name} {value.points} {value.roblox_id}
); }