'use client'; import { useState, FormEvent, type ChangeEvent, useEffect } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import Link from 'next/link'; import { motion } from 'framer-motion'; import { Lock, Eye, EyeOff, AlertCircle, Flag, Shield, CheckCircle2, ArrowLeft, } from 'lucide-react'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import Input from '@/components/ui/Input'; import Heading from '@/components/ui/Heading'; import { useAuth } from '@/lib/auth/AuthContext'; interface FormErrors { newPassword?: string; confirmPassword?: string; submit?: string; } interface PasswordStrength { score: number; label: string; color: string; } function checkPasswordStrength(password: string): PasswordStrength { let score = 0; if (password.length >= 8) score++; if (password.length >= 12) score++; if (/[a-z]/.test(password) && /[A-Z]/.test(password)) score++; if (/\d/.test(password)) score++; if (/[^a-zA-Z\d]/.test(password)) score++; if (score <= 1) return { score, label: 'Weak', color: 'bg-red-500' }; if (score <= 2) return { score, label: 'Fair', color: 'bg-warning-amber' }; if (score <= 3) return { score, label: 'Good', color: 'bg-primary-blue' }; return { score, label: 'Strong', color: 'bg-performance-green' }; } export default function ResetPasswordPage() { const router = useRouter(); const searchParams = useSearchParams(); const { session } = useAuth(); const [loading, setLoading] = useState(false); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [errors, setErrors] = useState({}); const [success, setSuccess] = useState(null); const [formData, setFormData] = useState({ newPassword: '', confirmPassword: '', }); const [token, setToken] = useState(''); // Check if user is already authenticated useEffect(() => { if (session) { router.replace('/dashboard'); } }, [session, router]); // Extract token from URL on mount useEffect(() => { const tokenParam = searchParams.get('token'); if (tokenParam) { setToken(tokenParam); } }, [searchParams]); const passwordStrength = checkPasswordStrength(formData.newPassword); const passwordRequirements = [ { met: formData.newPassword.length >= 8, label: 'At least 8 characters' }, { met: /[a-z]/.test(formData.newPassword) && /[A-Z]/.test(formData.newPassword), label: 'Upper and lowercase letters' }, { met: /\d/.test(formData.newPassword), label: 'At least one number' }, { met: /[^a-zA-Z\d]/.test(formData.newPassword), label: 'At least one special character' }, ]; const validateForm = (): boolean => { const newErrors: FormErrors = {}; if (!formData.newPassword) { newErrors.newPassword = 'New password is required'; } else if (formData.newPassword.length < 8) { newErrors.newPassword = 'Password must be at least 8 characters'; } else if (!/[a-z]/.test(formData.newPassword) || !/[A-Z]/.test(formData.newPassword) || !/\d/.test(formData.newPassword)) { newErrors.newPassword = 'Password must contain uppercase, lowercase, and number'; } if (!formData.confirmPassword) { newErrors.confirmPassword = 'Please confirm your password'; } else if (formData.newPassword !== formData.confirmPassword) { newErrors.confirmPassword = 'Passwords do not match'; } if (!token) { newErrors.submit = 'Invalid reset token. Please request a new reset link.'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: FormEvent) => { e.preventDefault(); if (loading) return; if (!validateForm()) return; setLoading(true); setErrors({}); setSuccess(null); try { const { ServiceFactory } = await import('@/lib/services/ServiceFactory'); const serviceFactory = new ServiceFactory(process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3001'); const authService = serviceFactory.createAuthService(); const result = await authService.resetPassword({ token, newPassword: formData.newPassword, }); setSuccess(result.message); } catch (error) { setErrors({ submit: error instanceof Error ? error.message : 'Failed to reset password. Please try again.', }); setLoading(false); } }; return (
{/* Background Pattern */}
{/* Header */}
Set New Password

Create a strong password for your account

{/* Background accent */}
{!success ? (
{/* New Password */}
) => setFormData({ ...formData, newPassword: e.target.value })} error={!!errors.newPassword} errorMessage={errors.newPassword} placeholder="••••••••" disabled={loading} className="pl-10 pr-10" autoComplete="new-password" />
{/* Password Strength */} {formData.newPassword && (
{passwordStrength.label}
{passwordRequirements.map((req, index) => (
{req.met ? ( ) : ( )} {req.label}
))}
)}
{/* Confirm Password */}
) => setFormData({ ...formData, confirmPassword: e.target.value })} error={!!errors.confirmPassword} errorMessage={errors.confirmPassword} placeholder="••••••••" disabled={loading} className="pl-10 pr-10" autoComplete="new-password" />
{formData.confirmPassword && formData.newPassword === formData.confirmPassword && (

Passwords match

)}
{/* Error Message */} {errors.submit && (

{errors.submit}

)} {/* Submit Button */} {/* Back to Login */}
Back to Login
) : (

{success}

Your password has been successfully reset

)} {/* Trust Indicators */}
Encrypted & secure
Instant update
{/* Footer */}

Need help?{' '} Contact support

); }