diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/hooks/useCreateCallback.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/hooks/useCreateCallback.tsx index 15946fe3aadc..3407b9f19e71 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/hooks/useCreateCallback.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/hooks/useCreateCallback.tsx @@ -1,10 +1,6 @@ -import { omit } from 'lodash-unified' -import { useCallback, useRef, useState } from 'react' -import { useAsync } from 'react-use' -import type { TransactionReceipt } from 'web3-core' -import Web3Utils from 'web3-utils' import type { HappyRedPacketV4 } from '@masknet/web3-contracts/types/HappyRedPacketV4' import type { PayableTx } from '@masknet/web3-contracts/types/types' +import { isLessThan, toFixed } from '@masknet/web3-shared-base' import { EthereumTokenType, FungibleTokenDetailed, @@ -16,7 +12,10 @@ import { useTokenConstants, useTransactionState, } from '@masknet/web3-shared-evm' -import { isLessThan, toFixed } from '@masknet/web3-shared-base' +import { omit } from 'lodash-unified' +import { useCallback, useRef, useState } from 'react' +import type { TransactionReceipt } from 'web3-core' +import Web3Utils from 'web3-utils' import { useRedPacketContract } from './useRedPacketContract' export interface RedPacketSettings { @@ -29,7 +28,7 @@ export interface RedPacketSettings { token?: FungibleTokenDetailed } -type paramsObjType = { +type ParamsObjType = { publicKey: string shares: number isRandom: boolean @@ -43,7 +42,7 @@ type paramsObjType = { token?: FungibleTokenDetailed } -function checkParams(paramsObj: paramsObjType, setCreateState?: (value: TransactionState) => void) { +function checkParams(paramsObj: ParamsObjType, setCreateState?: (value: TransactionState) => void) { if (isLessThan(paramsObj.total, paramsObj.shares)) { setCreateState?.({ type: TransactionStateType.FAILED, @@ -71,19 +70,29 @@ function checkParams(paramsObj: paramsObjType, setCreateState?: (value: Transact return true } +type MethodParameters = Parameters +interface CreateParams { + gas: number | undefined + params: MethodParameters + paramsObj: ParamsObjType + gasError: Error | null +} + export function useCreateParams(redPacketSettings: RedPacketSettings | undefined, version: number, publicKey: string) { const redPacketContract = useRedPacketContract(version) const { NATIVE_TOKEN_ADDRESS } = useTokenConstants() const account = useAccount() - return useAsync(async () => { + const getCreateParams = useCallback(async (): Promise => { if (!redPacketSettings || !redPacketContract) return null const { duration, isRandom, message, name, shares, total, token } = redPacketSettings const seed = Math.random().toString() const tokenType = token!.type === EthereumTokenType.Native ? 0 : 1 const tokenAddress = token!.type === EthereumTokenType.Native ? NATIVE_TOKEN_ADDRESS : token!.address - if (!tokenAddress) return null + if (!tokenAddress) { + return null + } - const paramsObj: paramsObjType = { + const paramsObj: ParamsObjType = { publicKey, shares, isRandom, @@ -97,12 +106,13 @@ export function useCreateParams(redPacketSettings: RedPacketSettings | undefined token, } - if (!checkParams(paramsObj)) return null + if (!checkParams(paramsObj)) { + return null + } - type MethodParameters = Parameters const params = Object.values(omit(paramsObj, ['token'])) as MethodParameters - let gasError = null as Error | null + let gasError: Error | null = null const value = toFixed(paramsObj.token?.type === EthereumTokenType.Native ? total : 0) const gas = await (redPacketContract as HappyRedPacketV4).methods @@ -113,7 +123,9 @@ export function useCreateParams(redPacketSettings: RedPacketSettings | undefined }) return { gas: gas as number | undefined, params, paramsObj, gasError } - }, [redPacketSettings, account, redPacketContract]).value + }, [redPacketSettings, account, redPacketContract]) + + return getCreateParams } export function useCreateCallback(redPacketSettings: RedPacketSettings, version: number, publicKey: string) { @@ -122,21 +134,22 @@ export function useCreateCallback(redPacketSettings: RedPacketSettings, version: const [createState, setCreateState] = useTransactionState() const redPacketContract = useRedPacketContract(version) const [createSettings, setCreateSettings] = useState(null) - const paramResult = useCreateParams(redPacketSettings, version, publicKey) + const getCreateParams = useCreateParams(redPacketSettings, version, publicKey) const transactionHashRef = useRef() const createCallback = useCallback(async () => { const { token } = redPacketSettings + const createParams = await getCreateParams() - if (!token || !redPacketContract || !paramResult) { + if (!token || !redPacketContract || !createParams) { setCreateState({ type: TransactionStateType.UNKNOWN, }) return } - const { gas, params, paramsObj, gasError } = paramResult + const { gas, params, paramsObj, gasError } = createParams if (gasError) { setCreateState({ @@ -201,7 +214,7 @@ export function useCreateCallback(redPacketSettings: RedPacketSettings, version: reject(error) }) }) - }, [account, redPacketContract, redPacketSettings, chainId, paramResult]) + }, [account, redPacketContract, redPacketSettings, chainId, getCreateParams]) const resetCallback = useCallback(() => { setCreateState({