import { FormEvent, useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useRecoilState } from "recoil"; import { requestAuthToken } from "~/api"; import { useT } from "~/i18n"; import { sessionAtom } from "~/state/appState"; export default function Login() { const t = useT(); const navigate = useNavigate(); const [session, setSession] = useRecoilState(sessionAtom); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(""); useEffect(() => { document.title = t("login.title"); }, [t]); useEffect(() => { if (!session) return; navigate("/"); }, [session, navigate]); const submit = async (event: FormEvent) => { event.preventDefault(); if (!username.trim() || !password.trim()) { setError(t("errors.requiredUsernamePassword")); return; } const normalizedUsername = username.trim().toLowerCase(); try { const auth = await requestAuthToken(normalizedUsername, password); setSession({ username: auth.username, displayName: auth.displayName, isAdmin: auth.isAdmin, token: auth.accessToken, }); localStorage.setItem("session-username", auth.username); localStorage.setItem("session-display-name", auth.displayName); localStorage.setItem("session-is-admin", auth.isAdmin ? "true" : "false"); localStorage.setItem("session-token", auth.accessToken); setError(""); navigate("/"); } catch { setError(t("errors.invalidUsernameOrPassword")); } }; return (

{t("login.heading")}

{t("login.subheading")}

{error &&

{error}

}
); }