import { TRANSACTION_TYPES } from '../../../shared/constants/transaction'; import { ETH_SWAPS_TOKEN_OBJECT } from '../../../shared/constants/swaps'; import { getSwapsTokensReceivedFromTxMeta } from '../pages/swaps/swaps.util'; import { useTokenFiatAmount } from './useTokenFiatAmount'; /** * @typedef {Object} SwappedTokenValue * @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, * including the source (from) and destination (to) token type (ETH, DAI, etc..) * When viewing a non ETH asset page, 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). * @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} */ export function useSwappedTokenValue(transactionGroup, currentAsset) { const { symbol, decimals, address } = currentAsset; const { primaryTransaction, initialTransaction } = transactionGroup; const { type } = initialTransaction; const { from: senderAddress } = initialTransaction.txParams || {}; const isViewingReceivedTokenFromSwap = currentAsset?.symbol === primaryTransaction.destinationTokenSymbol || (currentAsset.address === ETH_SWAPS_TOKEN_OBJECT.address && primaryTransaction.destinationTokenSymbol === 'ETH'); const swapTokenValue = type === TRANSACTION_TYPES.SWAP && isViewingReceivedTokenFromSwap ? getSwapsTokensReceivedFromTxMeta( primaryTransaction.destinationTokenSymbol, initialTransaction, address, senderAddress, decimals, ) : type === TRANSACTION_TYPES.SWAP && primaryTransaction.swapTokenValue; const isNegative = typeof swapTokenValue === 'string' ? Math.sign(swapTokenValue) === -1 : false; const _swapTokenFiatAmount = useTokenFiatAmount( address, swapTokenValue || '', symbol, ); const swapTokenFiatAmount = swapTokenValue && isViewingReceivedTokenFromSwap && _swapTokenFiatAmount; return { swapTokenValue, swapTokenFiatAmount, isViewingReceivedTokenFromSwap, isNegative, }; }