import React, { memo, useEffect, useState } from 'react'; import { Modal, Input, Button, Switch, ConfigProvider, Typography, Divider, Select } from 'antd'; import { NotifAlert, NotifOk } from '../../../components/Global/ToastNotif'; import { validateRun } from '../../../Utils/validate'; import { createContact, updateContact } from '../../../api/contact'; const { Text } = Typography; const DetailContact = memo(function DetailContact(props) { const [confirmLoading, setConfirmLoading] = useState(false); const defaultData = { id: '', name: '', phone: '', is_active: true, contact_type: 'operator', }; const [formData, setFormData] = useState(defaultData); const handleInputChange = (e) => { let name, value; if (e && e.target) { name = e.target.name; value = e.target.value; } else if (e && e.type === 'change') { name = e.name || e.target?.name; value = e.value !== undefined ? e.value : e.checked; } else if (typeof e === 'string' || typeof e === 'number') { // Handle Select onChange value = e; name = 'contact_type'; } else { return; } // Validasi untuk field phone - hanya angka yang diperbolehkan if (name === 'phone') { value = value.replace(/[^0-9+\-\s()]/g, ''); } if (name) { setFormData((prev) => ({ ...prev, [name]: value, })); } }; const handleStatusToggle = (checked) => { setFormData({ ...formData, is_active: checked, }); }; const handleSave = async () => { setConfirmLoading(true); // Custom validation untuk name - minimal 3 karakter if (formData.name && formData.name.length < 3) { NotifOk({ icon: 'warning', title: 'Peringatan', message: 'Nama contact minimal 3 karakter', }); setConfirmLoading(false); return; } // Custom validation untuk phone - Indonesian phone format const phoneRegex = /^(?:\+62|0)8\d{7,10}$/; if (formData.phone && !phoneRegex.test(formData.phone.replace(/[\s\-\(\)]/g, ''))) { NotifOk({ icon: 'warning', title: 'Peringatan', message: 'Nomor telepon harus format Indonesia (+628XXXXXXXXX atau 08XXXXXXXXX)', }); setConfirmLoading(false); return; } // Validation rules const validationRules = [ { field: 'name', label: 'Contact Name', required: true }, { field: 'phone', label: 'Phone', required: true }, { field: 'contact_type', label: 'Contact Type', required: true }, ]; if ( validateRun(formData, validationRules, (errorMessages) => { NotifOk({ icon: 'warning', title: 'Peringatan', message: errorMessages }); setConfirmLoading(false); }) ) return; try { const contactData = { contact_name: formData.name, contact_phone: formData.phone.replace(/[\s\-\(\)]/g, ''), // Clean phone number is_active: formData.is_active, contact_type: formData.contact_type, }; let response; if (props.actionMode === 'edit') { response = await updateContact(props.selectedData.contact_id || props.selectedData.id, contactData); } else { response = await createContact(contactData); } NotifAlert({ icon: 'success', title: 'Berhasil', message: `Data Contact berhasil ${ props.actionMode === 'add' ? 'ditambahkan' : 'diperbarui' }.`, }); props.onContactSaved?.(response.data, props.actionMode); handleCancel(); } catch (error) { console.error('Save failed:', error); NotifAlert({ icon: 'error', title: 'Error', message: error.response?.data?.message || 'Terjadi kesalahan saat menyimpan data.', }); } finally { setConfirmLoading(false); } }; const handleCancel = () => { props.setActionMode('list'); props.setSelectedData(null); }; useEffect(() => { if (props.showModal) { if (props.actionMode === 'edit' && props.selectedData) { setFormData({ name: props.selectedData.contact_name || props.selectedData.name, phone: props.selectedData.contact_phone || props.selectedData.phone, is_active: props.selectedData.is_active || props.selectedData.status === 'active', contact_type: props.selectedData.contact_type || props.contactType || 'operator', }); } else if (props.actionMode === 'add') { setFormData({ name: '', phone: '', is_active: true, contact_type: props.contactType === 'all' ? 'operator' : props.contactType || 'operator', }); } } }, [props.showModal, props.actionMode, props.selectedData, props.contactType]); return ( {!props.readOnly && ( )} , ]} >
Status
{formData.is_active ? 'Active' : 'Inactive'}
Name *
Phone *
Contact Type *
); }); export default DetailContact;