import React, { useState } from 'react'; import { Lock, Eye, EyeOff, AlertCircle } from 'lucide-react'; import { toast } from 'react-toastify'; import { useMutation } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { Button, Input, Card } from '../common'; import { adminService } from '../../services/admin.service'; import { useAdminAuth } from '../../contexts'; export const MandatoryPasswordChangeModal: React.FC = () => { const { t } = useTranslation(); const { updatePasswordChanged } = useAdminAuth(); const [formData, setFormData] = useState({ currentPassword: '', newPassword: '', confirmPassword: '' }); const [showPasswords, setShowPasswords] = useState({ current: false, new: false, confirm: false }); const [errors, setErrors] = useState>({}); const changePasswordMutation = useMutation({ mutationFn: adminService.changePassword, onSuccess: () => { toast.success(t('mandatoryPasswordChange.success')); updatePasswordChanged(); // Reset form setFormData({ currentPassword: '', newPassword: '', confirmPassword: '' }); setErrors({}); }, onError: (error: any) => { if (error.response?.data?.error) { toast.error(error.response.data.error); } else { toast.error(t('passwordChange.failed')); } } }); const validateForm = (): boolean => { const newErrors: Record = {}; if (!formData.currentPassword) { newErrors.currentPassword = t('passwordChange.currentRequired'); } if (!formData.newPassword) { newErrors.newPassword = t('passwordChange.newRequired'); } else if (formData.newPassword.length < 12) { newErrors.newPassword = t('mandatoryPasswordChange.minLengthError'); } else { // Check for character types if (!/[a-z]/.test(formData.newPassword)) { newErrors.newPassword = t('mandatoryPasswordChange.mustContainLowercase'); } else if (!/[A-Z]/.test(formData.newPassword)) { newErrors.newPassword = t('mandatoryPasswordChange.mustContainUppercase'); } else if (!/[0-9]/.test(formData.newPassword)) { newErrors.newPassword = t('mandatoryPasswordChange.mustContainNumbersError'); } else if (!/[!@#$%^&*()_+\-=\[\]{}|;:,.<>?]/.test(formData.newPassword)) { newErrors.newPassword = t('mandatoryPasswordChange.mustContainSpecialError'); } } if (!formData.confirmPassword) { newErrors.confirmPassword = t('passwordChange.confirmRequired'); } else if (formData.newPassword !== formData.confirmPassword) { newErrors.confirmPassword = t('passwordChange.noMatch'); } if (formData.currentPassword === formData.newPassword) { newErrors.newPassword = t('passwordChange.mustBeDifferent'); } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } changePasswordMutation.mutate({ currentPassword: formData.currentPassword, newPassword: formData.newPassword }); }; const handleInputChange = (field: keyof typeof formData) => (e: React.ChangeEvent) => { setFormData(prev => ({ ...prev, [field]: e.target.value })); // Clear error when user types if (errors[field]) { setErrors(prev => ({ ...prev, [field]: '' })); } }; return (

{t('mandatoryPasswordChange.title')}

{t('mandatoryPasswordChange.description')}

{/* Current Password */}
} />
{/* New Password */}
} />
{/* Confirm Password */}
} />
{/* Password Requirements */}

{t('passwordChange.requirements')}

  • {t('mandatoryPasswordChange.minLength')}
  • {t('mandatoryPasswordChange.mustContainUpperLower')}
  • {t('mandatoryPasswordChange.mustContainNumbers')}
  • {t('mandatoryPasswordChange.mustContainSpecial')}
  • {t('passwordChange.mustDiffer')}
{/* Action Button */}
); };