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)))
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().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}
);
}