Skip to content

Commit

Permalink
feat: disable CTA button based on balance wip
Browse files Browse the repository at this point in the history
  • Loading branch information
micaelae committed Feb 25, 2025
1 parent 6bd256c commit 69f94eb
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 45 deletions.
55 changes: 38 additions & 17 deletions ui/hooks/bridge/useIsTxSubmittable.ts
Original file line number Diff line number Diff line change
@@ -1,49 +1,70 @@
import { useSelector } from 'react-redux';
import { useMemo } from 'react';
import { SWAPS_CHAINID_DEFAULT_TOKEN_MAP } from '../../../shared/constants/swaps';
import {
getBridgeQuotes,
getFromAmount,
getFromChain,
getFromToken,
getToChain,
getValidationErrors,
getToToken,
} from '../../ducks/bridge/selectors';
import { getMultichainCurrentChainId } from '../../selectors/multichain';
import { useMultichainSelector } from '../useMultichainSelector';
import { useIsMultichainSwap } from '../../pages/bridge/hooks/useIsMultichainSwap';
import useLatestBalance from './useLatestBalance';

export const useIsTxSubmittable = () => {
const fromToken = useSelector(getFromToken);
const toToken = useSelector(getToToken);
const fromChain = useSelector(getFromChain);
const fromChainId = useMultichainSelector(getMultichainCurrentChainId);
const toChain = useSelector(getToChain);
const fromAmount = useSelector(getFromAmount);
const { activeQuote } = useSelector(getBridgeQuotes);

const isSwap = useIsMultichainSwap();
const {
isInsufficientBalance,
isInsufficientGasBalance,
isInsufficientGasForQuote,
} = useSelector(getValidationErrors);

const { balanceAmount } = useLatestBalance(fromToken, fromChain?.chainId);
const { balanceAmount: nativeAssetBalance } = useLatestBalance(
fromChain?.chainId
const balanceAmount = useLatestBalance(fromToken, fromChainId);
const nativeAssetBalance = useLatestBalance(
fromChainId
? SWAPS_CHAINID_DEFAULT_TOKEN_MAP[
fromChain.chainId as keyof typeof SWAPS_CHAINID_DEFAULT_TOKEN_MAP
fromChainId as keyof typeof SWAPS_CHAINID_DEFAULT_TOKEN_MAP
]
: null,
fromChain?.chainId,
fromChainId,
);

return Boolean(
fromToken &&
toToken &&
fromChain &&
toChain &&
fromAmount &&
activeQuote &&
!isInsufficientBalance(balanceAmount) &&
!isInsufficientGasBalance(nativeAssetBalance) &&
!isInsufficientGasForQuote(nativeAssetBalance),
return useMemo(
() =>
Boolean(
fromToken &&
toToken &&
fromChainId &&
(isSwap || toChain) &&
fromAmount &&
activeQuote &&
!isInsufficientBalance(balanceAmount) &&
!isInsufficientGasBalance(nativeAssetBalance) &&
!isInsufficientGasForQuote(nativeAssetBalance),
),
[
activeQuote,
balanceAmount,
fromAmount,
fromChainId,
fromToken,
isInsufficientBalance,
isInsufficientGasBalance,
isInsufficientGasForQuote,
nativeAssetBalance,
isSwap,
toChain,
toToken,
],
);
};
29 changes: 12 additions & 17 deletions ui/hooks/bridge/useLatestBalance.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { type Hex, type CaipChainId, isCaipChainId } from '@metamask/utils';
import type { BigNumber } from 'bignumber.js';
import { useMemo } from 'react';
import { Numeric } from '../../../shared/modules/Numeric';
import { getSelectedInternalAccount } from '../../selectors';
import { calcLatestSrcBalance } from '../../../shared/modules/bridge-utils/balance';
Expand All @@ -10,7 +10,6 @@ import {
getMultichainBalances,
getMultichainCurrentChainId,
} from '../../selectors/multichain';
import { calcTokenValue } from '../../../shared/lib/swaps-utils';

/**
* Custom hook to fetch and format the latest balance of a given token or native asset.
Expand Down Expand Up @@ -38,9 +37,7 @@ const useLatestBalance = (
);
const nonEvmBalances = nonEvmBalancesByAccountId[id];

const { value: latestBalance } = useAsyncResult<
Numeric | BigNumber | undefined
>(async () => {
const value = useAsyncResult<Numeric | undefined>(async () => {
if (
token?.address &&
// TODO check whether chainId is EVM when MultichainNetworkController is integrated
Expand All @@ -56,11 +53,10 @@ const useLatestBalance = (
);
}

if (isCaipChainId(chainId) && token?.decimals && token?.string) {
return calcTokenValue(
nonEvmBalances?.[`${token.address}`]?.amount ?? token.string,
token.decimals,
);
if (isCaipChainId(chainId) && token?.decimals) {
return Numeric.from(
nonEvmBalances?.[token.address]?.amount ?? token?.string,
).shiftedBy(-1 * token.decimals);
}

return undefined;
Expand All @@ -79,14 +75,13 @@ const useLatestBalance = (
);
}

const tokenDecimals = token?.decimals ? Number(token.decimals) : 1;

return {
balanceAmount:
token && latestBalance
? calcTokenAmount(latestBalance.toString(), tokenDecimals)
return useMemo(
() =>
value?.value
? calcTokenAmount(value.value.toString(), token?.decimals)
: undefined,
};
[value, token?.decimals],
);
};

export default useLatestBalance;
4 changes: 2 additions & 2 deletions ui/hooks/bridge/useQuoteFetchEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ export const useQuoteFetchEvents = () => {
const fromToken = useSelector(getFromToken);
const fromChain = useSelector(getFromChain);

const { balanceAmount } = useLatestBalance(fromToken, fromChain?.chainId);
const { balanceAmount: nativeAssetBalance } = useLatestBalance(
const balanceAmount = useLatestBalance(fromToken, fromChain?.chainId);
const nativeAssetBalance = useLatestBalance(
fromChain?.chainId
? SWAPS_CHAINID_DEFAULT_TOKEN_MAP[
fromChain.chainId as keyof typeof SWAPS_CHAINID_DEFAULT_TOKEN_MAP
Expand Down
4 changes: 2 additions & 2 deletions ui/pages/bridge/prepare/bridge-cta-button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ export const BridgeCTAButton = ({

const wasTxDeclined = useSelector(getWasTxDeclined);

const { balanceAmount } = useLatestBalance(fromToken, fromChain?.chainId);
const { balanceAmount: nativeAssetBalance } = useLatestBalance(
const balanceAmount = useLatestBalance(fromToken, fromChain?.chainId);
const nativeAssetBalance = useLatestBalance(
fromChain?.chainId
? SWAPS_CHAINID_DEFAULT_TOKEN_MAP[
fromChain.chainId as keyof typeof SWAPS_CHAINID_DEFAULT_TOKEN_MAP
Expand Down
4 changes: 2 additions & 2 deletions ui/pages/bridge/prepare/bridge-input-group.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,10 @@ export const BridgeInputGroup = ({
const locale = useSelector(getIntlLocale);

const selectedChainId = networkProps?.network?.chainId;
const { balanceAmount } = useLatestBalance(token, selectedChainId);
const balanceAmount = useLatestBalance(token, selectedChainId);
// const currentChainId = useMultichainSelector(getMultichainCurrentChainId);
// const selectedChainId = networkProps?.network?.chainId ?? currentChainId;
// const { balanceAmount } = useLatestBalance(token, selectedChainId);
// const balanceAmount = useLatestBalance(token, selectedChainId);

const [, handleCopy] = useCopyToClipboard(MINUTE) as [
boolean,
Expand Down
7 changes: 2 additions & 5 deletions ui/pages/bridge/prepare/prepare-bridge-page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -180,17 +180,14 @@ const PrepareBridgePage = () => {
const { quotesRefreshCount } = useSelector(getBridgeQuotes);
const { openBuyCryptoInPdapp } = useRamps();

const { balanceAmount: nativeAssetBalance } = useLatestBalance(
const nativeAssetBalance = useLatestBalance(
SWAPS_CHAINID_DEFAULT_TOKEN_MAP[
fromChain?.chainId as keyof typeof SWAPS_CHAINID_DEFAULT_TOKEN_MAP
],
fromChain?.chainId,
);

const { balanceAmount: srcTokenBalance } = useLatestBalance(
fromToken,
fromChain?.chainId,
);
const srcTokenBalance = useLatestBalance(fromToken, fromChain?.chainId);

const {
filteredTokenListGenerator: toTokenListGenerator,
Expand Down

0 comments on commit 69f94eb

Please sign in to comment.