Show fiat amounts inline on token transfers (#8786)

Fiat amounts are now shown inline on token transfers in the transaction
list, where possible (i.e. where the conversion rates are known).

The logic for this hook is pretty tangled because it's used for so many
fundamentally different types of items (eth transactions, token
transactions, signature requests). In the future we should split these
into different components.

The documentation for the `useTokenFiatAmount` hook was updated to make
`tokenAmount` optional, but in practice it already worked as expected
without the amount being passed in.
feature/default_network_editable
Mark Stacey 4 years ago committed by GitHub
parent 016acd3e94
commit 3c98be4214
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      ui/app/hooks/tests/useTransactionDisplayData.test.js
  2. 2
      ui/app/hooks/useTokenFiatAmount.js
  3. 11
      ui/app/hooks/useTransactionDisplayData.js

@ -4,6 +4,7 @@ import { renderHook } from '@testing-library/react-hooks'
import sinon from 'sinon' import sinon from 'sinon'
import transactions from '../../../../test/data/transaction-data.json' import transactions from '../../../../test/data/transaction-data.json'
import { useTransactionDisplayData } from '../useTransactionDisplayData' import { useTransactionDisplayData } from '../useTransactionDisplayData'
import * as useTokenFiatAmountHooks from '../useTokenFiatAmount'
import { getPreferences, getShouldShowFiat, getNativeCurrency, getCurrentCurrency } from '../../selectors' import { getPreferences, getShouldShowFiat, getNativeCurrency, getCurrentCurrency } from '../../selectors'
import { getTokens } from '../../ducks/metamask/metamask' import { getTokens } from '../../ducks/metamask/metamask'
import * as i18nhooks from '../useI18nContext' import * as i18nhooks from '../useI18nContext'
@ -74,11 +75,15 @@ const expectedResults = [
status: 'confirmed' }, status: 'confirmed' },
] ]
let useSelector, useI18nContext let useSelector, useI18nContext, useTokenFiatAmount
describe('useTransactionDisplayData', function () { describe('useTransactionDisplayData', function () {
before(function () { before(function () {
useSelector = sinon.stub(reactRedux, 'useSelector') useSelector = sinon.stub(reactRedux, 'useSelector')
useTokenFiatAmount = sinon.stub(useTokenFiatAmountHooks, 'useTokenFiatAmount')
useTokenFiatAmount.returns((tokenAddress) => {
return tokenAddress ? '1 TST' : undefined
})
useI18nContext = sinon.stub(i18nhooks, 'useI18nContext') useI18nContext = sinon.stub(i18nhooks, 'useI18nContext')
useI18nContext.returns((key, variables) => getMessage('en', messages, key, variables)) useI18nContext.returns((key, variables) => getMessage('en', messages, key, variables))
useSelector.callsFake((selector) => { useSelector.callsFake((selector) => {

@ -6,7 +6,7 @@ import { getFormattedTokenFiatAmount } from '../helpers/utils/token-util'
/** /**
* Get the token balance converted to fiat and formatted for display * Get the token balance converted to fiat and formatted for display
* *
* @param {string} tokenAddress - The token address * @param {string} [tokenAddress] - The token address
* @param {string} [tokenAmount] - The token balance * @param {string} [tokenAmount] - The token balance
* @param {string} [tokenSymbol] - The token symbol * @param {string} [tokenSymbol] - The token symbol
* @return {string} - The formatted token amount in the user's chosen fiat currency * @return {string} - The formatted token amount in the user's chosen fiat currency

@ -3,6 +3,7 @@ import { getKnownMethodData } from '../selectors/selectors'
import { getTransactionActionKey, getStatusKey } from '../helpers/utils/transactions.util' import { getTransactionActionKey, getStatusKey } from '../helpers/utils/transactions.util'
import { camelCaseToCapitalize } from '../helpers/utils/common.util' import { camelCaseToCapitalize } from '../helpers/utils/common.util'
import { useI18nContext } from './useI18nContext' import { useI18nContext } from './useI18nContext'
import { useTokenFiatAmount } from './useTokenFiatAmount'
import { PRIMARY, SECONDARY } from '../helpers/constants/common' import { PRIMARY, SECONDARY } from '../helpers/constants/common'
import { getTokenToAddress } from '../helpers/utils/token-util' import { getTokenToAddress } from '../helpers/utils/token-util'
import { useUserPreferencedCurrency } from './useUserPreferencedCurrency' import { useUserPreferencedCurrency } from './useUserPreferencedCurrency'
@ -84,6 +85,7 @@ export function useTransactionDisplayData (transactionGroup) {
const token = isTokenCategory && knownTokens.find((token) => token.address === recipientAddress) const token = isTokenCategory && knownTokens.find((token) => token.address === recipientAddress)
const tokenData = useTokenData(initialTransaction?.txParams?.data, isTokenCategory) const tokenData = useTokenData(initialTransaction?.txParams?.data, isTokenCategory)
const tokenDisplayValue = useTokenDisplayValue(initialTransaction?.txParams?.data, token, isTokenCategory) const tokenDisplayValue = useTokenDisplayValue(initialTransaction?.txParams?.data, token, isTokenCategory)
const tokenFiatAmount = useTokenFiatAmount(token?.address, tokenDisplayValue, token?.symbol)
let category let category
let title let title
@ -127,14 +129,15 @@ export function useTransactionDisplayData (transactionGroup) {
const [primaryCurrency] = useCurrencyDisplay(primaryValue, { const [primaryCurrency] = useCurrencyDisplay(primaryValue, {
prefix, prefix,
displayValue: isTokenCategory && tokenDisplayValue, displayValue: isTokenCategory ? tokenDisplayValue : undefined,
suffix: isTokenCategory && token?.symbol, suffix: isTokenCategory ? token?.symbol : undefined,
...primaryCurrencyPreferences, ...primaryCurrencyPreferences,
}) })
const [secondaryCurrency] = useCurrencyDisplay(primaryValue, { const [secondaryCurrency] = useCurrencyDisplay(primaryValue, {
prefix, prefix,
displayValue: isTokenCategory && tokenDisplayValue, displayValue: isTokenCategory ? tokenFiatAmount : undefined,
hideLabel: isTokenCategory ? true : undefined,
...secondaryCurrencyPreferences, ...secondaryCurrencyPreferences,
}) })
@ -146,7 +149,7 @@ export function useTransactionDisplayData (transactionGroup) {
primaryCurrency, primaryCurrency,
senderAddress, senderAddress,
recipientAddress, recipientAddress,
secondaryCurrency: isTokenCategory ? undefined : secondaryCurrency, secondaryCurrency: isTokenCategory && !tokenFiatAmount ? undefined : secondaryCurrency,
status, status,
isPending: status in PENDING_STATUS_HASH, isPending: status in PENDING_STATUS_HASH,
} }

Loading…
Cancel
Save