import { type Accessor, createEffect, type Setter } from "solid-js"; import { ClearSVG } from "./SVG"; import "./SignIn.css"; import { LoadingSpinner } from "./LoadingScreen"; import { toast } from "../utils"; interface SignInProps { showSignIn: Accessor; setShowSignIn: Setter; } export function SignIn(props: SignInProps) { let dialogElement!: HTMLDialogElement; let formElement!: HTMLFormElement; let usernameInput!: HTMLInputElement; let passwordInput!: HTMLInputElement; let loadingElement!: HTMLDivElement; let submitButton!: HTMLButtonElement; createEffect(() => { if (props.showSignIn()) { dialogElement.showModal(); } }); function handleClose() { dialogElement.close(); usernameInput.value = ""; passwordInput.value = ""; props.setShowSignIn(false); } async function doSignIn(e: Event) { e.preventDefault(); usernameInput.setCustomValidity(""); if (!formElement.reportValidity()) return; if (usernameInput.value.includes(":")) { usernameInput.setCustomValidity('Username can\'t contain a colon ":"'); usernameInput.reportValidity(); return; } loadingElement.style.display = "block"; submitButton.disabled = true; try { const response = await fetch("/login", { method: "POST", body: `${usernameInput.value}:${passwordInput.value}`, }); if (response.status === 200) { toast("Login successful", "success"); handleClose(); } else if (response.status === 401) { toast("Login failed: wrong credentials", "error"); } else { toast(`Login failed: unknown error, code: ${response.status}`, "error", await (await response.blob()).text()); } } finally { loadingElement.style.display = "none"; submitButton.disabled = false; } } return ( e.target.nodeName === "DIALOG" && handleClose()}>

{}} /> {}} />
); }