import { useState } from 'react'; import { useSearchParams, Link, useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { authApi } from '../api/auth'; import LanguageSwitcher from '../components/LanguageSwitcher'; export default function ResetPassword() { const { t } = useTranslation(); const navigate = useNavigate(); const [searchParams] = useSearchParams(); const token = searchParams.get('token'); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [status, setStatus] = useState<'form' | 'loading' | 'success' | 'error'>('form'); const [error, setError] = useState(''); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); if (!token) { setError(t('resetPassword.invalidToken', 'Invalid or missing reset token')); return; } if (password.length < 8) { setError(t('auth.passwordTooShort', 'Password must be at least 8 characters')); return; } if (password !== confirmPassword) { setError(t('auth.passwordMismatch', 'Passwords do not match')); return; } setStatus('loading'); try { await authApi.resetPassword(token, password); setStatus('success'); setTimeout(() => navigate('/login', { replace: true }), 2000); } catch (err: unknown) { setStatus('error'); const error = err as { response?: { data?: { detail?: string } } }; setError(error.response?.data?.detail || t('common.error')); } }; if (!token) { return (
!

{t('resetPassword.invalidToken', 'Invalid reset link')}

{t( 'resetPassword.tokenExpiredOrInvalid', 'This password reset link is invalid or has expired.', )}

{t('auth.backToLogin', 'Back to login')}
); } return (
{status === 'success' ? (

{t('resetPassword.success', 'Password changed!')}

{t('resetPassword.redirectingToLogin', 'Redirecting to login...')}

) : ( <>

{t('resetPassword.title', 'Set new password')}

{t('resetPassword.enterNewPassword', 'Enter your new password below.')}

setPassword(e.target.value)} placeholder="••••••••" className="input" autoComplete="new-password" disabled={status === 'loading'} />
setConfirmPassword(e.target.value)} placeholder="••••••••" className="input" autoComplete="new-password" disabled={status === 'loading'} />
{error && (
{error}
)}
{t('auth.backToLogin', 'Back to login')}
)}
); }