@smartinvoicexyz/hooks
Version:
Unified source for React hooks used across the Smart Invoice protocol.
55 lines (54 loc) • 2.17 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 { 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,
};
};