import { FormEvent, useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useRecoilState } from "recoil"; import { requestAuthToken } from "~/api"; import { normalizeLanguage, useLanguage, useT } from "~/i18n"; import { sessionAtom } from "~/state/appState"; export default function Login() { const t = useT(); const { setLanguage } = useLanguage(); 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, preferredLanguage: auth.preferredLanguage, roles: auth.roles, token: auth.accessToken, }); const preferredLanguage = normalizeLanguage(auth.preferredLanguage); setLanguage(preferredLanguage); localStorage.setItem("session-username", auth.username); localStorage.setItem("session-display-name", auth.displayName); localStorage.setItem("session-preferred-language", preferredLanguage); localStorage.setItem("session-roles", auth.roles.join(",")); localStorage.setItem("session-token", auth.accessToken); setError(""); navigate("/"); } catch { setError(t("errors.invalidUsernameOrPassword")); } }; return (

{t("login.heading")}

{t("login.subheading")}

{error &&

{error}

}
); }