import React, { useState, useEffect } from 'react'; import { Modal, Input, Typography, Button, ConfigProvider } from 'antd'; import { NotifAlert, NotifOk } from '../../../components/Global/ToastNotif'; import { changePassword } from '../../../api/user'; const { Text } = Typography; const ChangePasswordModal = (props) => { const [confirmLoading, setConfirmLoading] = useState(false); const [formData, setFormData] = useState({ newPassword: '', confirmPassword: '', }); const [errors, setErrors] = useState({}); const validatePassword = (password) => { if (!password) return 'Password wajib diisi'; // Must be at least 8 characters long if (password.length < 8) { return 'Password must be at least 8 characters long'; } // Must contain at least one uppercase letter if (!/[A-Z]/.test(password)) { return 'Password must contain at least one uppercase letter'; } // Must contain at least one lowercase letter if (!/[a-z]/.test(password)) { return 'Password must contain at least one lowercase letter'; } // Must contain at least one number if (!/\d/.test(password)) { return 'Password must contain at least one number'; } // Must contain at least one special character if (!/[!@#$%^&*(),.?":{}|<>]/.test(password)) { return 'Password must contain at least one special character'; } return null; }; const validateForm = () => { const newErrors = {}; const passwordError = validatePassword(formData.newPassword); if (passwordError) { newErrors.newPassword = passwordError; } if (!formData.confirmPassword) { newErrors.confirmPassword = 'Konfirmasi password wajib diisi'; } else if (formData.newPassword !== formData.confirmPassword) { newErrors.confirmPassword = 'Password tidak cocok'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleCancel = () => { props.setShowModal(false); props.setSelectedUser(null); setFormData({ newPassword: '', confirmPassword: '', }); setErrors({}); }; const handleSave = async () => { if (!validateForm()) { NotifOk({ icon: 'warning', title: 'Peringatan', message: 'Mohon periksa kembali form Anda', }); return; } setConfirmLoading(true); try { const response = await changePassword(props.selectedUser.user_id, formData.newPassword); console.log('Change Password Response:', response); if (response && response.statusCode === 200) { NotifOk({ icon: 'success', title: 'Berhasil', message: `Password untuk user "${props.selectedUser.user_fullname}" berhasil diubah.`, }); handleCancel(); } else { NotifAlert({ icon: 'error', title: 'Gagal', message: response?.message || 'Terjadi kesalahan saat mengubah password.', }); } } catch (error) { console.error('Change Password Error:', error); NotifAlert({ icon: 'error', title: 'Error', message: error.message || 'Terjadi kesalahan pada server. Coba lagi nanti.', }); } setConfirmLoading(false); }; const handleInputChange = (e) => { const { name, value } = e.target; setFormData({ ...formData, [name]: value, }); // Clear error for this field if (errors[name]) { setErrors({ ...errors, [name]: null, }); } }; useEffect(() => { if (!props.showModal) { setFormData({ newPassword: '', confirmPassword: '', }); setErrors({}); } }, [props.showModal]); return ( , ]} width={500} >
Username
Password Baru * {errors.newPassword && ( {errors.newPassword} )}
Konfirmasi Password * {errors.confirmPassword && ( {errors.confirmPassword} )}
Persyaratan password:
  • Minimal 8 karakter
  • Minimal 1 huruf besar (A-Z)
  • Minimal 1 huruf kecil (a-z)
  • Minimal 1 angka (0-9)
  • Minimal 1 karakter spesial (!@#$%^&*)
); }; export default ChangePasswordModal;