import React, { useEffect, useState } from "react"; import { Box, Button, Checkbox, FormControlLabel, Paper, Tab, Tabs, TextField, Typography } from "@mui/material"; import { useLocation, useNavigate } from "react-router-dom"; import { api } from "../api"; import { setAuthToken, setRememberMePref, getRememberMePref } from "../auth"; import GoogleAuthCard from "../components/GoogleAuthCard"; import { useToast } from "../toast"; import { useI18n } from "../i18n/I18nProvider"; type AuthConfig = { requireAuth: boolean; googleEnabled: boolean; localEnabled: boolean; allowRegistration: boolean; }; export default function LoginPage() { const { toast } = useToast(); const { t } = useI18n(); const navigate = useNavigate(); const location = useLocation() as any; const [tab, setTab] = useState(0); const [cfg, setCfg] = useState(null); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [loading, setLoading] = useState(false); const [rememberMe, setRememberMe] = useState(() => getRememberMePref()); const [requestingReset, setRequestingReset] = useState(false); const nextPath = (location?.state?.from as string | undefined) ?? "/jobs"; useEffect(() => { api .get("/auth/config") .then((r) => setCfg(r.data)) .catch(() => setCfg(null)); }, []); async function submit(mode: "login" | "register") { setLoading(true); try { const url = mode === "register" ? "/auth/register" : "/auth/login"; const res = await api.post<{ accessToken: string; tokenType: string }>(url, { email, password }); setRememberMePref(rememberMe); setAuthToken(res.data.accessToken, { remember: rememberMe }); toast(t("signedIn"), "success"); navigate(nextPath, { replace: true }); } catch (e: any) { const msg = e?.response?.data || e?.message || t("loginFailed"); toast(String(msg), "error"); } finally { setLoading(false); } } async function requestPasswordReset() { if (!email.trim()) { toast(t("loginResetEmailRequired"), "error"); return; } setRequestingReset(true); try { await api.post("/auth/request-password-reset", { email: email.trim() }); toast(t("loginResetRequested"), "success"); } catch (e: any) { const msg = e?.response?.data || e?.message || t("loginResetRequestFailed"); toast(String(msg), "error"); } finally { setRequestingReset(false); } } const allowReg = cfg?.allowRegistration ?? false; return ( {t("signInTitle")} {cfg?.requireAuth ? t("authRequired") : t("authOptional")} setTab(v)} sx={{ mb: 2 }}> {tab === 0 && ( { e.preventDefault(); void submit("login"); }} sx={{ display: "flex", flexDirection: "column", gap: 1.5 }}> setEmail(e.target.value)} autoComplete="email" fullWidth /> setPassword(e.target.value)} autoComplete={allowReg ? "new-password" : "current-password"} type="password" fullWidth /> setRememberMe(e.target.checked)} />} label={t("rememberMe")} /> {allowReg && ( )} )} {tab === 1 && { navigate(nextPath, { replace: true }); }} />} ); }