import React, { useEffect, useRef, useState } from "react"; import { Alert, Box, Button, 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"; import AuthPageFrame from "../layout/AuthPageFrame"; 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 [submitError, setSubmitError] = useState(null); const emailRef = useRef(null); const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; useEffect(() => { const params = new URLSearchParams(window.location.search); setEmail(params.get("email") || ""); }, []); return ( { e.preventDefault(); const trimmed = email.trim(); if (!trimmed) { setEmailError(t("emailRequired")); emailRef.current?.focus(); return; } if (!EMAIL_PATTERN.test(trimmed)) { setEmailError(t("invalidEmail")); emailRef.current?.focus(); return; } setEmailError(undefined); setSubmitError(null); setSubmitted(false); setLoading(true); api .post("/auth/request-password-reset", { email: email.trim() }) .then(() => { setSubmitted(true); toast(t("passwordResetRequestSent"), "success"); }) .catch((error: any) => { setSubmitError(getApiErrorMessage(error, t("passwordResetRequestFailed"))); }) .finally(() => setLoading(false)); }} sx={{ display: "flex", flexDirection: "column", gap: 1.5 }} > {submitted ? {t("passwordResetRequestSent")} : null} {submitError ? {submitError} : null} { setEmail(e.target.value); setEmailError(undefined); }} autoComplete="email" autoFocus inputRef={emailRef} error={Boolean(emailError)} helperText={emailError} fullWidth /> button": { maxWidth: "100%", whiteSpace: "normal", overflowWrap: "anywhere" } }}> {loading ? {t("passwordResetRequestSending")} : null} ); }