1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-23 02:10:12 +01:00
metamask-extension/ui/hooks/useSwappedTokenValue.js

79 lines
3.1 KiB
JavaScript
Raw Normal View History

import { useSelector } from 'react-redux';
import { getSwapsTokensReceivedFromTxMeta } from '../../shared/lib/transactions-controller-utils';
import { TransactionType } from '../../shared/constants/transaction';
import {
isSwapsDefaultTokenAddress,
isSwapsDefaultTokenSymbol,
} from '../../shared/modules/swaps.utils';
import { getCurrentChainId } from '../selectors';
import { useTokenFiatAmount } from './useTokenFiatAmount';
2020-10-06 20:28:38 +02:00
/**
* @typedef {object} SwappedTokenValue
2020-10-06 20:28:38 +02:00
* @property {string} swapTokenValue - a primary currency string formatted for display
* @property {string} swapTokenFiatAmount - a secondary currency string formatted for display
* @property {boolean} isViewingReceivedTokenFromSwap - true if user is on the asset page for the
* destination/received asset in a swap.
*/
/**
* A Swap transaction group's primaryTransaction contains details of the swap,
2020-10-06 20:28:38 +02:00
* including the source (from) and destination (to) token type (ETH, DAI, etc..)
* When viewing an asset page that is not for the current chain's default token, we
* need to determine if that asset is the token that was received (destination) from
* the swap. In that circumstance we would want to show the primaryCurrency in the
* activity list that is most relevant for that token (- 1000 DAI, for example, when
* swapping DAI for ETH).
*
2020-10-06 20:28:38 +02:00
* @param {import('../selectors').transactionGroup} transactionGroup - Group of transactions by nonce
* @param {import('./useTokenDisplayValue').Token} currentAsset - The current asset the user is looking at
* @returns {SwappedTokenValue}
*/
2020-11-03 00:41:28 +01:00
export function useSwappedTokenValue(transactionGroup, currentAsset) {
const { symbol, decimals, address } = currentAsset;
const { primaryTransaction, initialTransaction } = transactionGroup;
const { type } = initialTransaction;
const { from: senderAddress } = initialTransaction.txParams || {};
const chainId = useSelector(getCurrentChainId);
2020-10-06 20:28:38 +02:00
2020-11-03 00:41:28 +01:00
const isViewingReceivedTokenFromSwap =
currentAsset?.symbol === primaryTransaction.destinationTokenSymbol ||
(isSwapsDefaultTokenAddress(currentAsset.address, chainId) &&
isSwapsDefaultTokenSymbol(
primaryTransaction.destinationTokenSymbol,
chainId,
));
2020-10-06 20:28:38 +02:00
2020-11-03 00:41:28 +01:00
const swapTokenValue =
type === TransactionType.swap && isViewingReceivedTokenFromSwap
2020-11-03 00:41:28 +01:00
? getSwapsTokensReceivedFromTxMeta(
primaryTransaction.destinationTokenSymbol,
initialTransaction,
address,
senderAddress,
decimals,
null,
chainId,
2020-11-03 00:41:28 +01:00
)
: type === TransactionType.swap && primaryTransaction.swapTokenValue;
2020-11-03 00:41:28 +01:00
const isNegative =
typeof swapTokenValue === 'string'
? Math.sign(swapTokenValue) === -1
: false;
2020-10-06 20:28:38 +02:00
const _swapTokenFiatAmount = useTokenFiatAmount(
address,
swapTokenValue || '',
symbol,
);
2020-11-03 00:41:28 +01:00
const swapTokenFiatAmount =
swapTokenValue && isViewingReceivedTokenFromSwap && _swapTokenFiatAmount;
2020-11-03 00:41:28 +01:00
return {
swapTokenValue,
swapTokenFiatAmount,
isViewingReceivedTokenFromSwap,
isNegative,
};
2020-10-06 20:28:38 +02:00
}