();
+ const navigate = useNavigate();
+
+ const [email, setEmail] = useState('');
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState('');
+ const [password, setPassword] = useState('');
+ const [confirmPassword, setConfirmPassword] = useState('');
+ const [showPassword, setShowPassword] = useState(false);
+ const [submitting, setSubmitting] = useState(false);
+ const [submitError, setSubmitError] = useState('');
+ const [success, setSuccess] = useState(false);
+
+ useEffect(() => {
+ if (!token) return;
+ (async () => {
+ try {
+ const data = await api.validateResetToken(token);
+ setEmail(data.email || '');
+ } catch (err: any) {
+ setError(err.message || 'Invalid or expired reset link');
+ } finally {
+ setLoading(false);
+ }
+ })();
+ }, [token]);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+ setSubmitError('');
+
+ if (password.length < 8) {
+ setSubmitError('Password must be at least 8 characters');
+ return;
+ }
+ if (password !== confirmPassword) {
+ setSubmitError('Passwords do not match');
+ return;
+ }
+
+ setSubmitting(true);
+ try {
+ await api.resetPassword(token!, password);
+ setSuccess(true);
+ } catch (err: any) {
+ setSubmitError(err.message || 'Failed to reset password');
+ } finally {
+ setSubmitting(false);
+ }
+ };
+
+ if (loading) {
+ return (
+
+
+
+ );
+ }
+
+ if (error) {
+ return (
+
+
+
+
+
+
Invalid Reset Link
+
{error}
+
+ ← Back to login
+
+
+
+ );
+ }
+
+ if (success) {
+ return (
+
+
+
+
+
+
Password Reset
+
Your password has been successfully reset. You can now sign in with your new password.
+
+
+
+ );
+ }
+
+ return (
+
+
+ {/* Logo */}
+
+
+
+
+
Reset Password
+
Choose a new password for your account
+
+
+ {/* Card */}
+
+ {email && (
+
+
+ Resetting password for {email}
+
+
+ )}
+
+
+
+
+
+ ← Back to login
+
+
+
+
+
+ );
+}