'use client' import { useState, useEffect } from 'react' import { validatePassword } from '@/lib/validation' import { updatePassword } from '@/lib/auth-actions' import { useToast } from './ToastContainer' interface PasswordChangeFormProps { userId: string } export default function PasswordChangeForm({ userId }: PasswordChangeFormProps) { const { showToast } = useToast() const [currentPassword, setCurrentPassword] = useState('') const [newPassword, setNewPassword] = useState('') const [confirmPassword, setConfirmPassword] = useState('') const [isSubmitting, setIsSubmitting] = useState(false) const [errors, setErrors] = useState<{ currentPassword?: string newPassword?: string confirmPassword?: string }>({}) const [touched, setTouched] = useState<{ currentPassword: boolean newPassword: boolean confirmPassword: boolean }>({ currentPassword: false, newPassword: false, confirmPassword: false, }) // Inline validation when fields change useEffect(() => { if (touched.currentPassword) { if (!currentPassword) { setErrors((prev) => ({ ...prev, currentPassword: 'Current password is required' })) } else { setErrors((prev) => ({ ...prev, currentPassword: undefined })) } } }, [currentPassword, touched.currentPassword]) useEffect(() => { if (touched.newPassword) { const result = validatePassword(newPassword) setErrors((prev) => ({ ...prev, newPassword: result.isValid ? undefined : result.error, })) } }, [newPassword, touched.newPassword]) useEffect(() => { if (touched.confirmPassword) { if (!confirmPassword) { setErrors((prev) => ({ ...prev, confirmPassword: 'Please confirm your new password' })) } else if (newPassword !== confirmPassword) { setErrors((prev) => ({ ...prev, confirmPassword: 'Passwords do not match' })) } else { setErrors((prev) => ({ ...prev, confirmPassword: undefined })) } } }, [confirmPassword, newPassword, touched.confirmPassword]) const handleCurrentPasswordBlur = () => { setTouched((prev) => ({ ...prev, currentPassword: true })) } const handleNewPasswordBlur = () => { setTouched((prev) => ({ ...prev, newPassword: true })) } const handleConfirmPasswordBlur = () => { setTouched((prev) => ({ ...prev, confirmPassword: true })) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() // Validate all fields before submission const newPasswordResult = validatePassword(newPassword) const newErrors: { currentPassword?: string newPassword?: string confirmPassword?: string } = {} if (!currentPassword) { newErrors.currentPassword = 'Current password is required' } if (!newPasswordResult.isValid) { newErrors.newPassword = newPasswordResult.error } if (!confirmPassword) { newErrors.confirmPassword = 'Please confirm your new password' } else if (newPassword !== confirmPassword) { newErrors.confirmPassword = 'Passwords do not match' } if (currentPassword === newPassword) { newErrors.newPassword = 'New password must be different from current password' } if (Object.keys(newErrors).length > 0) { setErrors(newErrors) setTouched({ currentPassword: true, newPassword: true, confirmPassword: true }) return } setIsSubmitting(true) setErrors({}) try { const result = await updatePassword(userId, currentPassword, newPassword) if (!result.success) { if (result.error === 'Current password is incorrect') { setErrors({ currentPassword: 'Current password is incorrect' }) showToast('Current password is incorrect', 'error') } else { showToast(result.error || 'Password update failed', 'error') } } else { showToast('Password updated successfully', 'success') // Reset form setCurrentPassword('') setNewPassword('') setConfirmPassword('') setTouched({ currentPassword: false, newPassword: false, confirmPassword: false }) } } catch (err) { console.error('Password update error:', err) showToast('An error occurred. Please try again.', 'error') } finally { setIsSubmitting(false) } } return (
) }