import { useMemo } from 'react'; import { useSelector } from 'react-redux'; import { formatCurrency, getValueFromWeiHex, } from '../helpers/utils/confirm-tx.util'; import { getCurrentCurrency, getConversionRate, getNativeCurrency, } from '../selectors'; /** * Defines the shape of the options parameter for useCurrencyDisplay * @typedef {Object} UseCurrencyOptions * @property {string} [displayValue] - When present is used in lieu of formatting the inputValue * @property {string} [prefix] - String to prepend to the final result * @property {number} [numberOfDecimals] - Number of significant decimals to display * @property {string} [denomination] - Denomination (wei, gwei) to convert to for display * @property {string} [currency] - Currency type to convert to. Will override nativeCurrency */ /** * Defines the return shape of the second value in the tuple * @typedef {Object} CurrencyDisplayParts * @property {string} [prefix] - string to prepend to the value for display * @property {string} value - string representing the value, formatted for display * @property {string} [suffix] - string to append to the value for display */ /** * useCurrencyDisplay hook * * Given a hexadecimal encoded value string and an object of parameters used for formatting the * display, produce both a fully formed string and the pieces of that string used for displaying * the currency to the user * @param {string} inputValue - The value to format for display * @param {UseCurrencyOptions} opts - An object for options to format the inputValue * @return {[string, CurrencyDisplayParts]} */ export function useCurrencyDisplay( inputValue, { displayValue, prefix, numberOfDecimals, denomination, currency, ...opts }, ) { const currentCurrency = useSelector(getCurrentCurrency); const nativeCurrency = useSelector(getNativeCurrency); const conversionRate = useSelector(getConversionRate); const toCurrency = currency || currentCurrency; const value = useMemo(() => { if (displayValue) { return displayValue; } return formatCurrency( getValueFromWeiHex({ value: inputValue, fromCurrency: nativeCurrency, toCurrency, conversionRate, numberOfDecimals: numberOfDecimals || 2, toDenomination: denomination, }), toCurrency, ); }, [ inputValue, nativeCurrency, conversionRate, displayValue, numberOfDecimals, denomination, toCurrency, ]); let suffix; if (!opts.hideLabel) { suffix = opts.suffix || toCurrency.toUpperCase(); } return [ `${prefix || ''}${value}${suffix ? ` ${suffix}` : ''}`, { prefix, value, suffix }, ]; }