import { MouseEvent, useCallback, useEffect, useRef, useState } from 'react'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Dialog, DialogBody, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { useUserContext } from '../hooks'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { apiConfig } from '@/config/api.config'; import { Alert, KeenIcon, useDataGrid } from '@/components'; import { toast } from 'sonner'; import { useCallApi } from '@/hooks'; import { doSaveLogActivity } from '@/actions/GlobalActions'; import clsx from 'clsx'; interface RoleListProps { id: string; name: string; roles: string; status: string; } interface CreateUserParams { email: string; username: string; password: string; retype_password: string; name: string; id_role: string; status: string; } const API_URL = apiConfig.service_dashboard; type PasswordType = 'password' | 'retype_password'; const AddDialog = () => { const parentRef = useRef(null); const { showAddDialog, handleAddDialog } = useUserContext(); const { reload } = useDataGrid(); const { PostData, GetData } = useCallApi(); const [roles, setRoles] = useState([]); const [alert, setAlert] = useState({ show: false, message: '' }); const initialState = { email: '', username: '', password: '', retype_password: '', name: '', id_role: '', status: '' }; const [formField, setFormField] = useState(initialState); const [showPassword, setShowPassword] = useState({ password: false, retype_password: false }); const [messagePassword, setMessagePassword] = useState(true); const [isSubmitting, setIsSubmitting] = useState(false); const [passwordErrors, setPasswordErrors] = useState([]); const validatePassword = (password: string, confirmPassword: string) => { const errors: string[] = []; if (password) { if (password.length < 8) { errors.push('Password must be at least 8 characters long'); } if (!/[A-Z]/.test(password)) { errors.push('Password must contain at least one capital letter'); } if (!/[0-9]/.test(password)) { errors.push('Password must contain at least one number'); } if (!/[!@#$%^&*(),.?":{}|<>]/.test(password)) { errors.push('Password must contain at least one special character'); } if (password !== confirmPassword) { errors.push('Passwords do not match'); } } return { isValid: errors.length === 0, errors }; }; const resetForm = () => { setFormField(initialState); setAlert({ show: false, message: '' }); }; /* actions */ const doCreateUser = useCallback( async (e: React.FormEvent) => { e.preventDefault(); const response = await PostData(`${API_URL}/user/create`, formField); if (response?.status) { handleAddDialog(false); resetForm(); reload(); const createActivity = { module: 'Manage User', description: `Create New User => ${formField.username}`, action: 'C' }; doSaveLogActivity(createActivity); toast.success('Success Create User'); } else { toast.error('Failed to create user'); setAlert({ show: true, message: 'Failed to create user. Please try again.' }); } }, [formField] ); const fetchRoles = useCallback(async () => { const params = { limit: 100, page: 1, with_deleted: false, order_field: 'name', order_direction: 'ASC', filter: JSON.stringify({ status: 'Y' }) }; const response = await GetData(`${API_URL}/user_role/list`, params); // console.log('ini data:', response); if (response?.status) { const roleList = response.data?.list || []; setRoles(roleList); } else { setRoles(() => []); } // console.log('ini data user_role:', response?.data); }, []); useEffect(() => { fetchRoles(); }, [fetchRoles]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); console.log('Form data before submit:', formField); if ( formField.email.trim() === '' || formField.username.trim() === '' || formField.password.trim() === '' || formField.retype_password.trim() === '' || formField.name.trim() === '' || formField.id_role.trim() === '' || formField.status.trim() === '' ) { setAlert({ show: true, message: 'Please fill name field.' }); return; } doCreateUser(e); // console.log(formField); setAlert({ show: false, message: '' }); }; useEffect(() => { const validation = validatePassword(formField.password, formField.retype_password); setMessagePassword(validation.isValid); setPasswordErrors(validation.errors); }, [formField.password, formField.retype_password]); const isButtonDisabled = !messagePassword || isSubmitting || passwordErrors.length > 0; useEffect(() => { if (showAddDialog === false) { resetForm(); } }, [showAddDialog]); const togglePassword = useCallback((event: MouseEvent, key: string) => { event.preventDefault(); setShowPassword((prev) => ({ ...prev, [key]: !prev[key as PasswordType] })); }, []); return ( handleAddDialog(open)}>

User - Create

{ handleAddDialog(false); resetForm(); }} >
{alert.show && (

{alert.message}

)}
setFormField((prev) => ({ ...prev, name: target.value })) } />
setFormField((prev) => ({ ...prev, username: target.value })) } />
setFormField((prev) => ({ ...prev, email: target.value })) } />
setFormField((prev) => ({ ...prev, password: target.value })) } />
setFormField((prev) => ({ ...prev, retype_password: target.value })) } />
{passwordErrors.length > 0 && (
{passwordErrors.map((error, index) => (

{error}

))}
)}
); }; export { AddDialog };