import { useState, useEffect } from 'react'; import { Link, useNavigate, useSearchParams } from 'react-router-dom'; import PasswordStrength from '../components/PasswordStrength.jsx'; import AuthBgCol from '../components/AuthBgCol.jsx'; import PasswordInput from '../components/PasswordInput.jsx'; export default function ResetPassword() { const [params] = useSearchParams(); const navigate = useNavigate(); const token = params.get('token') || ''; const [password, setPassword] = useState(''); const [password2, setPassword2] = useState(''); const [status, setStatus] = useState(null); // null | 'done' | 'error' const [errMsg, setErrMsg] = useState(''); const [busy, setBusy] = useState(false); const [appInfo, setAppInfo] = useState({ appName: 'Crowdlending Tracker', iconUrl: null }); useEffect(() => { fetch('/api/app-info') .then(r => r.json()) .then(d => setAppInfo(d)) .catch(() => {}); }, []); const submit = async (e) => { e.preventDefault(); if (password !== password2) { setErrMsg('Les mots de passe ne correspondent pas.'); setStatus('error'); return; } setErrMsg(''); setBusy(true); try { const res = await fetch('/api/auth/reset-password', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token, password }), }); const data = await res.json(); if (!res.ok) { setErrMsg(data.error || 'Une erreur est survenue.'); setStatus('error'); } else { setStatus('done'); setTimeout(() => navigate('/login'), 3000); } } catch { setErrMsg('Impossible de joindre le serveur.'); setStatus('error'); } finally { setBusy(false); } }; return (
{/* ── Colonne droite — formulaire ──────────────────────── */}
{/* Logo + nom */}
{appInfo.iconUrl && ( {appInfo.appName} )} {appInfo.appName}
{!token ? ( /* ── Lien invalide ── */

Lien de réinitialisation invalide ou manquant.

Faire une nouvelle demande
) : status === 'done' ? ( /* ── Succès ── */

Mot de passe mis à jour

Redirection vers la connexion dans quelques secondes…

Se connecter
) : ( /* ── Formulaire ── */ <>

Nouveau mot de passe

Choisissez un mot de passe d'au moins 8 caractères.

{status === 'error' && (
{errMsg}
)}
{ setPassword(e.target.value); setStatus(null); }} style={{ width: '100%' }} />
{ setPassword2(e.target.value); setStatus(null); }} style={{ width: '100%' }} />

Retour à la connexion

)}
); }