import { Alert, AlertIcon, Box, Button, Card, CardBody, CardHeader, Center, Container, Heading, HStack, Image, Input, Link, Stack, StackDivider, Text, useToast, } from "@chakra-ui/react"; import { type FormEvent, type ReactElement, useState } from "react"; export async function loader({ context }: { context: RequestContext }) { const { current_user: currentUser } = context.data; if (!currentUser) throw new Response(null, { status: 401, }); if ( !(currentUser.permissions & (1 << 5)) && !(currentUser.permissions & (1 << 8)) ) throw new Response(null, { status: 403, }); return null; } export function meta() { return [{ title: "Hammer - Car Crushers" }]; } export default function () { const [username, setUsername] = useState(""); const [uid, setUid] = useState(""); const [status, setStatus] = useState(""); const [visible, setVisible] = useState(false); const [avatarUrl, setAvatarUrl] = useState(""); const [history, setHistory] = useState([] as ReactElement[]); const [hasResults, setHasResults] = useState(true); const [loading, setLoading] = useState(false); const toast = useToast(); async function getHistory() { setVisible(false); setLoading(true); setHistory([]); if (username.length < 4) { setLoading(false); return toast({ title: "Validation Error", description: `Username is too short`, status: "error", }); } const historyResp = await fetch(`/api/game-bans/${username}/history`); if (!historyResp.ok) { setLoading(false); return toast({ title: "Failed To Fetch User", description: `${ ((await historyResp.json()) as { error: string }).error }`, status: "error", }); } const { history, user, }: { history: { [k: string]: any }[]; user: { avatar: string | null; id: number; name: string }; } = await historyResp.json(); if (!history.length) { setLoading(false); setHasResults(false); return toast({ title: "Nothing Found", description: "This user doesn't have any moderation history.", status: "info", }); } setHasResults(true); const cardList = []; setAvatarUrl(user.avatar ?? "https://i.hep.gg/floppa"); setUid(user.id.toString()); setStatus(history[history.length - 1].entity.properties.action.stringValue); for (const entry of history) { const url = entry.entity.properties.evidence.stringValue; const isUrl = () => { try { new URL(url).href; return true; } catch { return false; } }; cardList.push( {new Date( parseInt(entry.entry.properties.executed_at.integerValue), ).toLocaleString()} } spacing="4"> ACTION {entry.entity.properties.action.stringValue} EVIDENCE {isUrl() ? ( {url} ) : ( url )} , ); } setHistory(cardList); setLoading(false); setVisible(true); } return ( User Lookup Look up a user's punishment history here. {!hasResults ? ( No information was found for this user. Perhaps you misspelt their name? ) : null} { const { data }: { data?: string } & FormEvent = e; if (data?.match(/\W/)) e.preventDefault(); }} onChange={(e) => setUsername(e.target.value)} placeholder="Roblox username" />
} spacing="6"> USERNAME {username} USER ID {uid} MODERATION STATUS {status}
{history}
); }