import React, { useEffect, useState } from "react"; import { Alert, Box, Button, Paper, TextField, Typography } from "@mui/material"; import { useNavigate } from "react-router-dom"; import { api, getApiErrorMessage } from "../api"; import { useToast } from "../toast"; import { useI18n } from "../i18n/I18nProvider"; export default function ForgotPasswordPage() { const { toast } = useToast(); const { t } = useI18n(); const navigate = useNavigate(); const [email, setEmail] = useState(""); const [loading, setLoading] = useState(false); const [submitted, setSubmitted] = useState(false); const [emailError, setEmailError] = useState(undefined); const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; useEffect(() => { const params = new URLSearchParams(window.location.search); setEmail(params.get("email") || ""); }, []); return ( {t("forgotPasswordTitle")} {t("forgotPasswordBody")} { e.preventDefault(); const trimmed = email.trim(); if (!trimmed) { setEmailError(t("emailRequired")); return; } if (!EMAIL_PATTERN.test(trimmed)) { setEmailError(t("invalidEmail")); return; } setEmailError(undefined); setLoading(true); api .post("/auth/request-password-reset", { email: email.trim() }) .then(() => { setSubmitted(true); toast(t("passwordResetRequestSent"), "success"); }) .catch((error: any) => { toast(getApiErrorMessage(error, t("passwordResetRequestFailed")), "error"); }) .finally(() => setLoading(false)); }} sx={{ display: "flex", flexDirection: "column", gap: 1.5 }} > {submitted ? {t("passwordResetRequestSent")} : null} { setEmail(e.target.value); setEmailError(undefined); }} autoComplete="email" autoFocus error={Boolean(emailError)} helperText={emailError} fullWidth /> ); }