import { apiConfig } from '@/config/api.config'; import { useManageProviderContext } from '../hooks/useManageProviderContext'; import { Alert, useDataGrid } from '@/components'; import { useCallApi } from '@/hooks'; import { getAuth } from '@/auth'; import React, { useCallback, useEffect, useState } from 'react'; 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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { CustomerProps, TransactionProps } from './AddDialog'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'; import { doSaveLogActivity } from '@/actions/GlobalActions'; const API_URL_CUSTOMER = apiConfig.service_customer; const API_URL_MASTERDATA = apiConfig.service_master_data; const API_URL_TRANSACTION = apiConfig.service_transaction; const EditDialog = () => { const { showEditDialog, handleEditDialog, selectedProvider, provider } = useManageProviderContext(); const { reload } = useDataGrid(); const { PutData, GetData } = useCallApi(); const parsedUser = getAuth()?.user; const created_time = new Date(); const formattedTime = created_time.toISOString().slice(0, 19).replace('T', ' '); const [open, setOpen] = useState(false); const [isLoading, setIsLoading] = useState(false); const [alert, setAlert] = useState({ show: false, message: '' }); const initialState: { name: string; description: string; type: string; status: string; transaction_type: string; agent: string | null; updated_by: string; updated_at: string; } = { name: '', description: '', type: '', status: '', transaction_type: '', agent: null, updated_by: '', updated_at: '' }; const [formField, setFormField] = useState(initialState); const [transactions, setTransactions] = useState([]); const [customers, setCustomers] = useState([]); const resetForm = () => { setFormField(initialState); setAlert({ show: false, message: '' }); }; const doUpdateProvider = useCallback( async (e: React.FormEvent) => { e.preventDefault(); const response = await PutData( `${API_URL_MASTERDATA}/provider/update/${selectedProvider}`, formField ); if (response?.status) { resetForm(); handleEditDialog(false, null); toast.success('Provider updated successfully.'); const createActivity = { module: 'Manage Provider', description: `Update Provider => ${selectedProvider}`, action: 'U' }; doSaveLogActivity(createActivity); reload(); } else { toast.error('Failed to update provider.'); setAlert({ show: true, message: 'Failed to update provider.' }); } }, [selectedProvider, formField] ); const getCustomerList = async (sorting: any) => { try { sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; const response = await GetData(`${API_URL_CUSTOMER}/customer/list`, { limit: 100, page: 1, with_deleted: false, order_field: sorting[0].id, order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' }); // console.log('CUSTOMER: ', response?.data); setCustomers(response?.data.list); } catch (error) { console.error('Error fetching customer', error); } }; const getTransactionTypeList = async (sorting: any) => { try { const response = await GetData(`${API_URL_TRANSACTION}/transactiontype/list`, { limit: 100, page: 1, with_deleted: false, order_field: sorting[0].id, order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' }); // console.log('TRANSACTION TYPE: ', response?.data); setTransactions(response?.data.list); } catch (error) { console.error('Error fetching transaction type', error); } }; const doFetchData = useCallback(async (id: string) => { setIsLoading(true); const minDelay = new Promise((resolve) => setTimeout(resolve, 300)); const fetchData = GetData(`${API_URL_MASTERDATA}/provider/getdata/${id}`, { id }); const [response] = await Promise.all([fetchData, minDelay]); // console.log(response); if (response?.status) { setFormField((prev) => ({ ...prev, name: response?.data.name, description: response?.data.description, type: response?.data.type, status: response?.data.status, transaction_type: response?.data.transaction_type?.id || '', agent: response?.data.agent?.id || null })); } setIsLoading(false); }, []); const handleUpdate = (e: React.FormEvent) => { e.preventDefault(); if ( formField.name.trim() === '' || formField.description.trim() === '' || formField.type.trim() === '' || formField.status.trim() === '' || formField.transaction_type.trim() === '' || formField.agent === null ) { setAlert({ show: true, message: 'Please fill in all required fields.' }); return; } doUpdateProvider(e); // console.log(formField); setAlert({ show: false, message: '' }); }; useEffect(() => { if (showEditDialog === false) { resetForm(); } }, [showEditDialog]); useEffect(() => { if (selectedProvider) { doFetchData(selectedProvider); } }, [selectedProvider]); useEffect(() => { if (showEditDialog) { setFormField({ ...formField, updated_by: parsedUser.username, updated_at: formattedTime }); } }, [formattedTime]); useEffect(() => { getCustomerList([{ id: 'id', desc: false }]); getTransactionTypeList([{ id: 'name', desc: false }]); }, []); return ( handleEditDialog(open, null)}> Provider - Update
{alert.show && (

{alert.message}

)} {isLoading ? (

Loading Provider Details...

) : (
setFormField((prev) => ({ ...prev, name: target.value })) } />
setFormField({ ...formField, description: e.target.value }) } />
{formField.type === 'agent' ? (
{ e.currentTarget.scrollTop += e.deltaY; }} > No Agent found. {customers.map((customer) => ( { setFormField({ ...formField, agent: customer.id }); setOpen(false); }} > {customer.username} ))}
) : (
)}
)}
); }; export default EditDialog;