// src/pages/ForgotPassword/VerifyOtp.tsx import { useState, useEffect } from 'react'; import { useNavigate, Link } from 'react-router-dom'; import { Button } from '../../components/ui/button'; import { Input } from '../../components/ui/input'; import { Label } from '../../components/ui/label'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../components/ui/card'; import { KeyRound, ArrowLeft, RefreshCw } from 'lucide-react'; import { forgotPasswordApi } from '../../lib/api/forgotPasswordApi'; import { toast } from 'sonner'; export function VerifyOtp() { const [otp, setOtp] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [resendLoading, setResendLoading] = useState(false); const [countdown, setCountdown] = useState(0); const navigate = useNavigate(); const email = sessionStorage.getItem('resetEmail'); useEffect(() => { if (!email) { navigate('/forgot-password'); } }, [email, navigate]); useEffect(() => { let timer: NodeJS.Timeout; if (countdown > 0) { timer = setTimeout(() => setCountdown(countdown - 1), 1000); } return () => clearTimeout(timer); }, [countdown]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!email) return; setLoading(true); setError(null); try { await forgotPasswordApi.verifyOtp({ email, otp }); sessionStorage.setItem('resetOtp', otp); navigate('/reset-password'); } catch (err) { console.error('OTP verification error:', err); setError(err instanceof Error ? err.message : 'Invalid or expired OTP'); } finally { setLoading(false); } }; const handleResendOtp = async () => { if (!email || countdown > 0) return; setResendLoading(true); setError(null); try { await forgotPasswordApi.forgotPassword({ email }); setCountdown(60); // 60 seconds cooldown toast.sucess('A new verification code has been sent to your email'); } catch (err) { console.error('Resend OTP error:', err); setError(err instanceof Error ? err.message : 'Failed to resend OTP'); } finally { setResendLoading(false); } }; return (
Back Verify Your Identity Enter the 6-digit verification code sent to {email}
setOtp(e.target.value.replace(/\D/g, ''))} placeholder="Enter 6-digit code" className="pl-10 text-center text-2xl tracking-widest" required />
{error && (

{error}

)}
); }