import React, { useCallback, useEffect, useRef, useState } from 'react'; import { useManagePostoAdmsContext } from '../hooks/useManagePostoAdmsContext'; import { Alert, KeenIcon, useDataGrid } from '@/components'; import { useCallApi } from '@/hooks'; import { getAuth, useAuthContext } from '@/auth'; import { apiConfig } from '@/config/api.config'; import { toast } from 'sonner'; import { Dialog, DialogBody, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'; import { doSaveLogActivity } from '@/actions/GlobalActions'; import { RefreshCw } from 'lucide-react'; interface MunicipioProps { id: number; name: string; } const API_URL = apiConfig.service_master_data; const AddDialog = () => { const parentRef = useRef(null); const { showAddDialog, handleAddDialog, selectedPostoAdms } = useManagePostoAdmsContext(); const { reload } = useDataGrid(); const { PostData, GetData } = useCallApi(); const parsedUser = getAuth()?.user; const [municipios, setMunicipios] = useState([]); const [open, setOpen] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [alert, setAlert] = useState({ show: false, message: '' }); const [errors, setErrors] = useState>({}); const initialState = { name: '', municipio_id: 0, created_by: '', created_at: '' }; const [formField, setFormField] = useState(initialState); const created_time = new Date(); const formattedTime = created_time.toISOString().slice(0, 19).replace('T', ' '); const resetForm = () => { setFormField(initialState); setErrors({}); }; const validateForm = () => { const requiredFields = [ { key: 'name', label: 'Postu Administrativo Name' }, { key: 'municipio_id', label: 'Municipio Name' } ]; const newErrors: Record = {}; let isValid = true; requiredFields.forEach(({ key, label }) => { const value = formField[key as keyof typeof formField]; const isEmpty = value === '' || value === null || value === undefined || value === 0; if (isEmpty) { newErrors[key] = `${label} is required`; toast.error(`${label} is required`); isValid = false; } }); setErrors(newErrors); return isValid; }; const doCreatePostoAdm = useCallback( async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); try { const response = await PostData(`${API_URL}/postoadms/create`, formField); if (response?.status) { handleAddDialog(false); resetForm(); reload(); toast.success('Postu Administrativo created successfully!'); const createActivity = { module: 'Manage Posto Administrativo', description: `Create Postu Administrativo => ${formField.name}`, action: 'C' }; doSaveLogActivity(createActivity); } else { toast.error('Failed to create Postu Administrativo. Please try again.'); setAlert({ show: true, message: response?.message }); } } catch (error) { toast.error('Something went wrong. Please try again.'); } finally { setIsSubmitting(false); } }, [formField] ); const doFetchMunicipios = async (sorting: any) => { try { sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; const response = await GetData(`${API_URL}/municipios/list`, { limit: 100, page: 1, with_deleted: false, order_field: sorting[0].id, order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' }); // console.log(response?.data); setMunicipios(response?.data.list); } catch (error) { console.error('Error fetching Municipio', error); setAlert({ show: true, message: 'Failed to get Municipio. Please try again.' }); } }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); if (!validateForm()) { setIsSubmitting(false); return; } doCreatePostoAdm(e); }; useEffect(() => { if (showAddDialog) { setFormField({ ...formField, created_by: parsedUser?.username, created_at: formattedTime }); } }, [formattedTime]); useEffect(() => { if (showAddDialog === false) { resetForm(); } }, [showAddDialog]); useEffect(() => { doFetchMunicipios([{ id: 'name', desc: false }]); }, []); return ( handleAddDialog(open)}> Postu Administrativo - Create
{alert.show && (

{alert.message}

)}
{ setFormField((prev) => ({ ...prev, name: target.value })); if (target.value) { setErrors((prev) => ({ ...prev, name: '' })); } }} /> {errors.name && {errors.name}}
e.stopPropagation()} > No Municipio found. {municipios.map((municipio) => ( { setFormField({ ...formField, municipio_id: municipio.id }); setErrors((prev) => ({ ...prev, municipio_id: '' })); setOpen(false); }} > {municipio.name} ))} {errors.municipio_id && ( {errors.municipio_id} )}
); }; export default AddDialog;