import React, { useState, useRef } from 'react'; import { Link } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { Turnstile } from '@marsidev/react-turnstile'; import api from '../../api'; const ForgotPasswordPage = () => { const { t } = useTranslation(); const [email, setEmail] = useState(''); const [error, setError] = useState(''); const [message, setMessage] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const [emailTouched, setEmailTouched] = useState(false); const [emailValid, setEmailValid] = useState(null); const [captchaToken, setCaptchaToken] = useState(null); const turnstileRef = useRef(null); const validateEmail = (email: string) => Boolean(String(email).toLowerCase().match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)); const handleEmailChange = (e: React.ChangeEvent) => { const val = e.target.value; setEmail(val); if (emailTouched) { setEmailValid(val === '' ? null : validateEmail(val)); } }; const handleEmailBlur = () => { setEmailTouched(true); setEmailValid(email === '' ? null : validateEmail(email)); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setEmailTouched(true); const isEmailValid = validateEmail(email); setEmailValid(isEmailValid); if (!isEmailValid) { setError('Please enter a valid email address.'); return; } setIsSubmitting(true); setError(''); setMessage(''); let currentToken = captchaToken; if (!currentToken && turnstileRef.current) { try { currentToken = await turnstileRef.current.getResponsePromise(2000); } catch (err) { try { turnstileRef.current.reset(); currentToken = await turnstileRef.current.getResponsePromise(4000); } catch (resetErr) { console.error('Turnstile verification failed:', resetErr); } } } if (!currentToken) { setError('Please complete the security check.'); setIsSubmitting(false); return; } try { await api.post('/auth/forgot-password', { email, captchaToken: currentToken }); setMessage('If an account exists with that email, a reset link has been sent.'); } catch (err: any) { setError(err.response?.data?.error || 'Something went wrong. Please try again.'); if (turnstileRef.current) { try { turnstileRef.current.reset(); setCaptchaToken(null); } catch (_) {} } } finally { setIsSubmitting(false); } }; const emailIsInvalid = emailTouched && emailValid === false; const emailIsValid = emailTouched && emailValid === true; return ( <>

Reset your password

Enter your email and we'll send you a link to reset your password.

{error &&
{error}
} {message &&
{message}
}
{emailIsInvalid && ( )} {emailIsValid && ( )}
{emailIsInvalid && (

Please enter a valid email address

)}
setCaptchaToken(token)} onExpire={() => setCaptchaToken(null)} onError={() => setCaptchaToken(null)} options={{ theme: 'light', appearance: 'interaction-only' } as any} />
Remembered your password? Sign in
); }; export default ForgotPasswordPage;