import { useCallback, useEffect, useRef, useState } from 'react'; import { NumericFormat } from 'react-number-format'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'; import { Dialog, DialogBody, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { useManageTransferFeeContext } from '../hooks/useManageTransferFeeContext'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { apiConfig } from '@/config/api.config'; import { Alert, Container, DataGridInner, KeenIcon, useDataGrid } from '@/components'; import { toast } from 'sonner'; import { useCallApi } from '@/hooks'; import { doSaveLogActivity } from '@/actions/GlobalActions'; import { getAuth } from '@/auth'; const API_URL = apiConfig.service_transaction; const API_URL_MASTER_DATA = apiConfig.service_master_data; const API_URL_CUSTOMER = apiConfig.service_customer; interface WalletProps { id: string; name: string; description?: string; } interface CustomerProps { id: string; username: string; msisdn: string; fullname?: string; } interface TransactionTypeProps { id: string; name: string; } const EditFeeDialog = () => { const parentRef = useRef(null); const { showEditFeeDialog, handleEditFeeDialog, selectedTransferFee } = useManageTransferFeeContext(); const { reload } = useDataGrid(); const [wallets, setWallets] = useState([]); const { GetData, PutData } = useCallApi(); const [isSubmitting, setIsSubmitting] = useState(false); const [transactionTypes, setTransactionTypes] = useState([]); const parsedUser = getAuth()?.user; const [customers, setCustomers] = useState([]); const [open, setOpen] = useState(false); const [alert, setAlert] = useState({ show: false, message: '' }); const initialState = { name: '', description: '', transaction_type: '', minimum_amount: 0, maximum_amount: 0, period_start: '', period_end: '', deduct_amount: 0, deduct_percentage: 0, fee_amount: 0, priority: '', status: '', status_include: '', updated_by: '', updated_at: '', deduct_from: '', deduct_from_account: '', credit_to: '', credit_destination: '00000000-0000-0000-0000-000000000000', credit_destination_account: '' }; const [formField, setFormField] = useState(initialState); useEffect(() => { const updated_time = new Date(); const formattedTime = updated_time.toISOString().slice(0, 19).replace('T', ' '); if (showEditFeeDialog) { setFormField((prevState) => ({ ...prevState, updated_by: parsedUser?.username, updated_at: formattedTime })); } }, [showEditFeeDialog]); const resetForm = () => { if (selectedTransferFee) { fetchTransactionFee(selectedTransferFee); } else { setFormField(initialState); } }; const doUpdateTransferFee = useCallback( async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); const requiredFields = [ 'name', 'description', 'period_start', 'period_end', 'transaction_type', 'status', 'status_include', 'priority', 'deduct_from', 'deduct_from_account', 'credit_to', 'credit_destination_account' ]; for (const field of requiredFields) { if (formField[field as keyof typeof formField] === '') { setAlert({ show: true, message: `All required fields must be filled out. Missing: ${field.replace(/_/g, ' ')}` }); setIsSubmitting(false); return; } } if (formField.credit_to === 'I' && !formField.credit_destination) { setAlert({ show: true, message: 'Credit destination is required when Input Customer is selected' }); setIsSubmitting(false); return; } setAlert({ show: false, message: '' }); const payload = { ...formField }; if (formField.credit_to !== 'I') { payload.credit_destination = '00000000-0000-0000-0000-000000000000'; } try { const response = await PutData( `${API_URL}/transactionfees/update/${selectedTransferFee}`, payload ); if (response?.status) { toast.success('Successfully updated transfer fee'); reload(); handleEditFeeDialog(false, null); const createActivity = { module: 'Manage Transfer Type', description: `Edit Transfer Type => ${selectedTransferFee}`, action: 'U' }; } else { setAlert({ show: true, message: response?.message || 'Failed to update transfer fee' }); } } catch (error) { console.error('Error updating transfer fee', error); setAlert({ show: true, message: 'An error occurred while updating the transfer fee' }); } finally { setIsSubmitting(false); } }, [formField, selectedTransferFee, PutData, reload, handleEditFeeDialog] ); const fetchWallets = useCallback(async () => { const params = { limit: 100, page: 1, with_deleted: false, order_field: 'Wallets.name', order_direction: 'ASC' }; try { const response = await GetData(`${API_URL_MASTER_DATA}/wallet/list`, params); if (response?.status && response?.data) { setWallets(response.data.list); } else { setWallets([]); } } catch (error) { console.error('Error fetching wallets', error); setWallets([]); } }, [GetData]); useEffect(() => { if (!showEditFeeDialog) return; fetchWallets(); }, [showEditFeeDialog, fetchWallets]); useEffect(() => { if (!showEditFeeDialog) return; 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 ? 'DESC' : 'ASC' }); setCustomers(response?.data.list || []); } catch (error) { console.error('Error fetching customers', error); } }; getCustomerList([{ id: 'msisdn', desc: false }]); }, [showEditFeeDialog, GetData]); useEffect(() => { if (!showEditFeeDialog) return; const getTransactionTypeList = async (sorting: any) => { try { sorting = sorting.length === 0 ? [{ id: 'name', desc: false }] : sorting; const response = await GetData(`${API_URL}/transactiontype/list`, { limit: 100, page: 1, with_deleted: false, order_field: sorting[0].id, order_direction: sorting[0].desc ? 'DESC' : 'ASC' }); setTransactionTypes(response?.data.list || []); } catch (error) { console.error('Error fetching transaction types', error); } }; getTransactionTypeList([{ id: 'id', desc: false }]); }, [showEditFeeDialog, GetData]); const formatDate = (dateString: string) => { if (!dateString || dateString.includes('0001-01-01')) return ''; return dateString.split('T')[0]; }; const fetchTransactionFee = useCallback( async (id: string) => { try { const response = await GetData(`${API_URL}/transactionfees/getdata/${id}`, {}); if (response?.status) { setFormField({ ...initialState, name: response.data.name || '', description: response.data.description || '', transaction_type: response.data.transaction_type?.id || '', minimum_amount: response.data.minimum_amount || 0, maximum_amount: response.data.maximum_amount || 0, period_start: formatDate(response.data.period_start), period_end: formatDate(response.data.period_end), deduct_amount: response.data.deduct_amount || 0, deduct_percentage: response.data.deduct_percentage || 0, fee_amount: response.data.fee_amount || 0, priority: response.data.priority || '', status: response.data.status || '', status_include: response.data.status_include || '', deduct_from: response.data.deduct_from || '', deduct_from_account: response.data.deduct_from_account?.id || '', credit_to: response.data.credit_to || '', credit_destination: response.data.credit_destination?.id || '00000000-0000-0000-0000-000000000000', credit_destination_account: response.data.credit_destination_account?.id || '', updated_by: parsedUser?.username, updated_at: new Date().toISOString().slice(0, 19).replace('T', ' ') }); } } catch (error) { console.error('Error fetching transaction fee details', error); setAlert({ show: true, message: 'Failed to fetch transaction fee details' }); } }, [GetData, parsedUser?.username] ); const hasFetchedRef = useRef(false); useEffect(() => { if (selectedTransferFee && showEditFeeDialog && !hasFetchedRef.current) { fetchTransactionFee(selectedTransferFee); hasFetchedRef.current = true; } if (!showEditFeeDialog) { hasFetchedRef.current = false; } }, [selectedTransferFee, showEditFeeDialog, fetchTransactionFee]); const handleCloseDialog = () => { setFormField(initialState); setAlert({ show: false, message: '' }); handleEditFeeDialog(false, null); }; return ( { if (!open) { handleCloseDialog(); } }} >

Edit Transfer Fee

{alert.show && (

{alert.message}

)}
setFormField((prev) => ({ ...prev, name: target.value })) } />
setFormField((prev) => ({ ...prev, description: target.value })) } />
{ setFormField((prev) => ({ ...prev, minimum_amount: values.floatValue || 0 })); }} placeholder="Enter Minimum Amount" />
{ setFormField((prev) => ({ ...prev, maximum_amount: values.floatValue || 0 })); }} placeholder="Enter Maximum Amount" />
setFormField((prev) => ({ ...prev, period_start: target.value })) } />
setFormField((prev) => ({ ...prev, period_end: target.value })) } />
{ setFormField((prev) => ({ ...prev, deduct_amount: values.floatValue || 0 })); }} placeholder="Enter Deduct Amount" />
{ setFormField((prev) => ({ ...prev, deduct_percentage: values.floatValue || 0 })); }} placeholder="Enter Deduct Percentage" />
{ setFormField((prev) => ({ ...prev, fee_amount: values.floatValue || 0 })); }} placeholder="Enter Fee Amount" />
{formField.credit_to === 'I' && (
)}
); }; export { EditFeeDialog };