import { useState } from 'react' interface PasswordResetFormProps { token: string onSuccess?: () => void onError?: (error: string) => void } export function PasswordResetForm({ token, onSuccess, onError }: PasswordResetFormProps) { const [password, setPassword] = useState('') const [confirmPassword, setConfirmPassword] = useState('') const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const [success, setSuccess] = useState(false) const validatePassword = (): string | null => { if (password.length < 8) { return 'Password must be at least 8 characters long' } const hasUpperCase = /[A-Z]/.test(password) const hasLowerCase = /[a-z]/.test(password) const hasNumbers = /\d/.test(password) if (!hasUpperCase || !hasLowerCase || !hasNumbers) { return 'Password must contain uppercase, lowercase, and numbers' } if (password !== confirmPassword) { return 'Passwords do not match' } return null } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setIsLoading(true) setError(null) const validationError = validatePassword() if (validationError) { setError(validationError) setIsLoading(false) onError?.(validationError) return } try { const response = await fetch('/api/auth/reset-password', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token, password }), }) const data = await response.json() if (!response.ok) { setError(data.message || 'An error occurred') onError?.(data.message || 'An error occurred') return } setSuccess(true) onSuccess?.() } catch (err) { const errorMessage = 'An unexpected error occurred' setError(errorMessage) onError?.(errorMessage) } finally { setIsLoading(false) } } if (success) { return (

Password Reset Successful!

Your password has been reset successfully.

) } return (
{error && (
{error}
)}
setPassword(e.target.value)} className="mt-1 appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-md focus:outline-none focus:ring-green-500 focus:border-green-500 sm:text-sm" placeholder="At least 8 characters" />

Must contain uppercase, lowercase, and numbers

setConfirmPassword(e.target.value)} className="mt-1 appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-md focus:outline-none focus:ring-green-500 focus:border-green-500 sm:text-sm" placeholder="Confirm your password" />
) } export default PasswordResetForm