UNPKG

@smartinvoicexyz/hooks

Version:

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

55 lines (54 loc) 2.17 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 { usePublicClient, useSimulateContract, useWriteContract } from 'wagmi'; export const useWithdraw = ({ invoice, onTxSuccess, toast, }) => { const publicClient = usePublicClient(); const { address } = _.pick(invoice, ['address']); const { data, isLoading: prepareLoading, error: prepareError, } = useSimulateContract({ address: address, functionName: 'withdraw', abi: SMART_INVOICE_UPDATABLE_ABI, args: [], query: { enabled: !!address, }, }); const [waitingForTx, setWaitingForTx] = useState(false); const { writeContractAsync, isPending: writeLoading, error: writeError, } = useWriteContract({ mutation: { onSuccess: async (hash) => { setWaitingForTx(true); toast.loading(TOASTS.useWithdraw.waitingForTx); const receipt = await publicClient?.waitForTransactionReceipt({ hash }); toast.loading(TOASTS.useWithdraw.waitingForIndex); if (receipt && publicClient) { await waitForSubgraphSync(publicClient.chain.id, receipt.blockNumber); } setWaitingForTx(false); onTxSuccess?.(); }, onError: error => errorToastHandler('useWithdraw', error, toast), }, }); const writeAsync = useCallback(async () => { try { if (!data) { throw new Error('simulation data is not available'); } return writeContractAsync(data.request); } catch (error) { errorToastHandler('useWithdraw', error, toast); return undefined; } }, [writeContractAsync, data]); return { writeAsync, isLoading: prepareLoading || writeLoading || waitingForTx, prepareError, writeError, }; };