diff --git a/app/routes/hammer.tsx b/app/routes/hammer.tsx index 4af651b..2be9663 100644 --- a/app/routes/hammer.tsx +++ b/app/routes/hammer.tsx @@ -4,6 +4,7 @@ import { Card, CardBody, CardHeader, + Center, Container, Heading, HStack, @@ -13,8 +14,9 @@ import { Stack, StackDivider, Text, + useToast, } from "@chakra-ui/react"; -import { type FormEvent, useState } from "react"; +import { type FormEvent, type ReactElement, useState } from "react"; export async function loader({ context }: { context: RequestContext }) { const { current_user: currentUser } = context.data; @@ -42,27 +44,56 @@ export default function () { const [status, setStatus] = useState(""); const [visible, setVisible] = useState(false); const [avatarUrl, setAvatarUrl] = useState(""); - const [history, setHistory] = useState([]); + const [history, setHistory] = useState([] as ReactElement[]); + const [hasResults, setHasResults] = useState(true); + const [loading, setLoading] = useState(false); + const toast = useToast(); async function getHistory() { - const username = (document.getElementById("username") as HTMLInputElement) - .value; - - if (username.length < 4) return alert("Username is too short!"); + 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) - return alert( - `ERROR: ${((await historyResp.json()) as { error: string }).error}`, - ); + if (!historyResp.ok) { + setLoading(false); + return toast({ + title: "Failed To Fetch User", + description: `${ + ((await historyResp.json()) as { error: string }).error + }`, + status: "error", + }); + } const history: { [k: string]: any }[] = await historyResp.json(); - if (!history.length) return alert("No history for this user."); + 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 = []; + setUid(history[history.length - 1].entity.properties.target.integerValue); + setStatus(history[history.length - 1].entity.properties.action.stringValue); + for (const entry of history) { const url = entry.entity.properties.evidence.stringValue; const isUrl = () => { @@ -75,41 +106,55 @@ export default function () { }; cardList.push( - - - {new Date().toLocaleString()} - - - } spacing="4"> - - ACTION - - {entry.entity.properties.action.stringValue} - - - - EVIDENCE - - {isUrl() ? ( - - {url} - - ) : ( - url - )} - - - - - , + + + + {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} + { @@ -117,9 +162,14 @@ export default function () { if (data?.match(/\W/)) e.preventDefault(); }} + onChange={(e) => setUsername(e.target.value)} placeholder="Roblox username" /> -