UNPKG

@smartinvoicexyz/hooks

Version:

Unified source for React hooks used across the Smart Invoice protocol.

57 lines (56 loc) 2.38 kB
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, }; };