@smartinvoicexyz/hooks
Version:
Unified source for React hooks used across the Smart Invoice protocol.
57 lines (56 loc) • 2.38 kB
JavaScript
import { SMART_INVOICE_UPDATABLE_ABI, TOASTS, } from '@smartinvoicexyz/constants';
import { waitForSubgraphSync } from '@smartinvoicexyz/graphql';
import { errorToastHandler } from '@smartinvoicexyz/utils';
import _ from 'lodash';
import { useCallback, useState } from 'react';
import { useChainId, usePublicClient, useSimulateContract, useWriteContract, } from 'wagmi';
export const useRelease = ({ invoice, milestone, onTxSuccess, toast, }) => {
const chainId = useChainId();
const publicClient = usePublicClient();
const specifiedMilestone = _.isNumber(milestone);
const { data, isLoading: prepareLoading, error: prepareError, } = useSimulateContract({
chainId,
address: invoice?.address,
abi: SMART_INVOICE_UPDATABLE_ABI,
functionName: 'release', // specifyMilestones ? 'release(uint256)' : 'release',
args: specifiedMilestone ? [BigInt(milestone)] : undefined, // optional args
query: {
enabled: !!invoice?.address,
},
});
const [waitingForTx, setWaitingForTx] = useState(false);
const { writeContractAsync, isPending: writeLoading, error: writeError, } = useWriteContract({
mutation: {
onSuccess: async (hash) => {
setWaitingForTx(true);
toast.loading(TOASTS.useRelease.waitingForTx);
const receipt = await publicClient?.waitForTransactionReceipt({ hash });
toast.loading(TOASTS.useRelease.waitingForIndex);
if (receipt && publicClient) {
await waitForSubgraphSync(publicClient.chain.id, receipt.blockNumber);
}
setWaitingForTx(false);
onTxSuccess?.();
},
onError: (error) => errorToastHandler('useRelease', error, toast),
},
});
const writeAsync = useCallback(async () => {
try {
if (!data) {
throw new Error('simulation data is not available');
}
return writeContractAsync(data.request);
}
catch (error) {
errorToastHandler('useRelease', error, toast);
return undefined;
}
}, [writeContractAsync, data]);
return {
writeAsync,
isLoading: prepareLoading || writeLoading || waitingForTx,
prepareError,
writeError,
};
};