'use client'; import React, { useState, useEffect } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import Link from 'next/link'; import './reset-password.scss'; const ResetPasswordPage = () => { const router = useRouter(); const searchParams = useSearchParams(); const token = searchParams?.get('token'); const [newPassword, setNewPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); const [tokenValid, setTokenValid] = useState(true); const [showPassword, setShowPassword] = useState({ new: false, confirm: false }); const [passwordStrength, setPasswordStrength] = useState(0); useEffect(() => { const verifyToken = async () => { if (!token) { setTokenValid(false); setError('No reset token provided'); return; } try { const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/auth/verify-reset-token`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token }) }); const data = await response.json(); if (!data.success) { setTokenValid(false); setError('This password reset link is invalid or has expired'); } } catch (err) { setTokenValid(false); setError('Error verifying reset token'); } }; verifyToken(); }, [token]); const checkPasswordStrength = (password: string) => { let strength = 0; if (password.length >= 8) strength += 1; if (/[A-Z]/.test(password)) strength += 1; if (/[0-9]/.test(password)) strength += 1; if (/[^A-Za-z0-9]/.test(password)) strength += 1; setPasswordStrength(strength); }; const handleNewPasswordChange = (e: React.ChangeEvent) => { const password = e.target.value; setNewPassword(password); checkPasswordStrength(password); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); if (newPassword !== confirmPassword) { setError("Passwords don't match"); return; } if (newPassword.length < 8) { setError("Password must be at least 8 characters long"); return; } setLoading(true); try { const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/auth/reset-password`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token, newPassword }) }); const data = await response.json(); if (data.success) { setSuccess(true); setTimeout(() => router.push('/login'), 3000); } else { throw new Error(data.message || 'Failed to reset password'); } } catch (err: any) { setError(err.message || 'Error resetting password'); } finally { setLoading(false); } }; const getStrengthColor = () => { switch (passwordStrength) { case 0: return 'bg-danger'; case 1: return 'bg-warning'; case 2: return 'bg-info'; case 3: return 'bg-primary'; case 4: return 'bg-success'; default: return 'bg-danger'; } }; const getStrengthText = () => { switch (passwordStrength) { case 0: return 'Very Weak'; case 1: return 'Weak'; case 2: return 'Medium'; case 3: return 'Strong'; case 4: return 'Very Strong'; default: return 'Very Weak'; } }; if (!tokenValid) { return (

Invalid or Expired Link

{error || 'The password reset link is invalid or has expired.'}

Back to Login
); } return (
{success ? (

Password Reset Success

Your password has been successfully reset. You'll be redirected to the login page shortly.

Go to Login
) : ( <>

Reset Your Password

{error && (
{error}
)}
Password Strength: = 3 ? 'success' : passwordStrength === 2 ? 'info' : 'danger'}`}> {getStrengthText()}
Password requirements:
  • = 8 ? 'text-success' : ''}> = 8 ? 'bi-check-circle-fill' : 'bi-circle'} me-1`}> At least 8 characters
  • One uppercase letter
  • One number
  • One special character
setConfirmPassword(e.target.value)} required />
{confirmPassword && confirmPassword !== newPassword && (
Passwords don't match
)}
)}
); }; export default ResetPasswordPage;