/* eslint-disable @typescript-eslint/no-explicit-any */ import React, { useEffect, useState, useRef } from 'react'; import { Field, ErrorMessage, useFormikContext } from 'formik'; import { getCustomerSettlementIntervals, updateCustomerSettlementIntervals } from '../../../../Api/CustomerApi'; import { toast } from 'react-toastify'; interface SettlementSectionProps { open: boolean; toggle: () => void; SettlementInterval: Record; disabled: boolean; } const SettlementSection = ({ open, toggle, SettlementInterval, disabled }: SettlementSectionProps) => { const { values, setFieldValue } = useFormikContext(); const [loading, setLoading] = useState(false); const [updating, setUpdating] = useState(disabled); const [initial, setInitial] = useState<{ cod_settlement_interval: string; invoice_settlement_interval: string } | null>(null); const isFirstLoad = useRef(true); // Fetch default values on mount useEffect(() => { if (!open) return; setLoading(true); getCustomerSettlementIntervals() .then((res) => { if (res?.status && res.data) { setInitial(res.data); setFieldValue('cod_settlement_interval', res.data.cod_settlement_interval); setFieldValue('invoice_settlement_interval', res.data.invoice_settlement_interval); } else { toast.error(res?.message || 'Failed to fetch settlement intervals'); } }) .catch((err) => toast.error(err?.message || 'Failed to fetch settlement intervals')) .finally(() => { setLoading(false); isFirstLoad.current = false; }); // eslint-disable-next-line }, [open]); // Update API call on change useEffect(() => { if (loading || isFirstLoad.current || !initial) return; // Only call if values are different from initial if ( values.cod_settlement_interval !== initial.cod_settlement_interval || values.invoice_settlement_interval !== initial.invoice_settlement_interval ) { setUpdating(true); updateCustomerSettlementIntervals({ cod_settlement_interval: values.cod_settlement_interval, invoice_settlement_interval: values.invoice_settlement_interval, }) .then((res) => { if (res?.status) { toast.success('Settlement intervals updated successfully.'); // Fetch latest after update getCustomerSettlementIntervals() .then((res2) => { if (res2?.status && res2.data) { setInitial(res2.data); setFieldValue('cod_settlement_interval', res2.data.cod_settlement_interval); setFieldValue('invoice_settlement_interval', res2.data.invoice_settlement_interval); } else { toast.error(res2?.message || 'Failed to fetch updated settlement intervals'); } }) .catch((err) => toast.error(err?.message || 'Failed to fetch updated settlement intervals')); } else { toast.error(res?.message || 'Failed to update settlement intervals'); } }) .catch((err) => toast.error(err?.message || 'Failed to update settlement intervals')) .finally(() => setUpdating(false)); } // eslint-disable-next-line }, [values.cod_settlement_interval, values.invoice_settlement_interval]); return ( <>

Settlement Intervals

{open && (
{loading ? (
Loading...
) : ( <>
{Object.entries(SettlementInterval) .filter(([, value]) => !isNaN(Number(value))) .map(([key, value]) => ( ))}
{Object.entries(SettlementInterval) .filter(([, value]) => !isNaN(Number(value))) .map(([key, value]) => ( ))}
{(updating && !disabled) && (
Updating...
)} )}
)}
); }; export default SettlementSection;