Commit 736e395c authored by Jack Short's avatar Jack Short Committed by GitHub

chore: displaying local currency and language formatting (#7267)

* chore: displaying local currency and language formatting

* moving to hook

* moving it to useformatter hook

* moving hook to bottom of file
parent 80211358
...@@ -25,7 +25,7 @@ import { updateSelectedWallet } from 'state/user/reducer' ...@@ -25,7 +25,7 @@ import { updateSelectedWallet } from 'state/user/reducer'
import styled from 'styled-components' import styled from 'styled-components'
import { CopyHelper, ExternalLink, ThemedText } from 'theme' import { CopyHelper, ExternalLink, ThemedText } from 'theme'
import { shortenAddress } from 'utils' import { shortenAddress } from 'utils'
import { formatNumber, NumberType } from 'utils/formatNumbers' import { NumberType, useFormatter } from 'utils/formatNumbers'
import { useCloseModal, useFiatOnrampAvailability, useOpenModal, useToggleModal } from '../../state/application/hooks' import { useCloseModal, useFiatOnrampAvailability, useOpenModal, useToggleModal } from '../../state/application/hooks'
import { ApplicationModal } from '../../state/application/reducer' import { ApplicationModal } from '../../state/application/reducer'
...@@ -159,6 +159,7 @@ export default function AuthenticatedHeader({ account, openSettings }: { account ...@@ -159,6 +159,7 @@ export default function AuthenticatedHeader({ account, openSettings }: { account
const resetSellAssets = useSellAsset((state) => state.reset) const resetSellAssets = useSellAsset((state) => state.reset)
const clearCollectionFilters = useWalletCollections((state) => state.clearCollectionFilters) const clearCollectionFilters = useWalletCollections((state) => state.clearCollectionFilters)
const isClaimAvailable = useIsNftClaimAvailable((state) => state.isClaimAvailable) const isClaimAvailable = useIsNftClaimAvailable((state) => state.isClaimAvailable)
const { formatNumber } = useFormatter()
const shouldDisableNFTRoutes = useDisableNFTRoutes() const shouldDisableNFTRoutes = useDisableNFTRoutes()
......
...@@ -13,7 +13,7 @@ import { useCallback, useMemo, useReducer } from 'react' ...@@ -13,7 +13,7 @@ import { useCallback, useMemo, useReducer } from 'react'
import { useNavigate } from 'react-router-dom' import { useNavigate } from 'react-router-dom'
import styled from 'styled-components' import styled from 'styled-components'
import { ThemedText } from 'theme' import { ThemedText } from 'theme'
import { formatNumber, NumberType } from 'utils/formatNumbers' import { NumberType, useFormatter } from 'utils/formatNumbers'
import { ExpandoRow } from '../ExpandoRow' import { ExpandoRow } from '../ExpandoRow'
import { PortfolioLogo } from '../PortfolioLogo' import { PortfolioLogo } from '../PortfolioLogo'
...@@ -118,6 +118,8 @@ function calculcateLiquidityValue(price0: number | undefined, price1: number | u ...@@ -118,6 +118,8 @@ function calculcateLiquidityValue(price0: number | undefined, price1: number | u
} }
function PositionListItem({ positionInfo }: { positionInfo: PositionInfo }) { function PositionListItem({ positionInfo }: { positionInfo: PositionInfo }) {
const { formatNumber } = useFormatter()
const { chainId, position, pool, details, inRange, closed } = positionInfo const { chainId, position, pool, details, inRange, closed } = positionInfo
const { priceA, priceB, fees: feeValue } = useFeeValues(positionInfo) const { priceA, priceB, fees: feeValue } = useFeeValues(positionInfo)
......
...@@ -11,7 +11,7 @@ import { useCallback, useMemo, useState } from 'react' ...@@ -11,7 +11,7 @@ import { useCallback, useMemo, useState } from 'react'
import { useNavigate } from 'react-router-dom' import { useNavigate } from 'react-router-dom'
import styled from 'styled-components' import styled from 'styled-components'
import { EllipsisStyle, ThemedText } from 'theme' import { EllipsisStyle, ThemedText } from 'theme'
import { formatNumber, NumberType } from 'utils/formatNumbers' import { NumberType, useFormatter } from 'utils/formatNumbers'
import { splitHiddenTokens } from 'utils/splitHiddenTokens' import { splitHiddenTokens } from 'utils/splitHiddenTokens'
import { useToggleAccountDrawer } from '../..' import { useToggleAccountDrawer } from '../..'
...@@ -79,6 +79,7 @@ function TokenRow({ token, quantity, denominatedValue, tokenProjectMarket }: Tok ...@@ -79,6 +79,7 @@ function TokenRow({ token, quantity, denominatedValue, tokenProjectMarket }: Tok
navigate(getTokenDetailsURL(token)) navigate(getTokenDetailsURL(token))
toggleWalletDrawer() toggleWalletDrawer()
}, [navigate, token, toggleWalletDrawer]) }, [navigate, token, toggleWalletDrawer])
const { formatNumber } = useFormatter()
const currency = gqlToCurrency(token) const currency = gqlToCurrency(token)
if (!currency) { if (!currency) {
...@@ -100,7 +101,11 @@ function TokenRow({ token, quantity, denominatedValue, tokenProjectMarket }: Tok ...@@ -100,7 +101,11 @@ function TokenRow({ token, quantity, denominatedValue, tokenProjectMarket }: Tok
title={<TokenNameText>{token?.name}</TokenNameText>} title={<TokenNameText>{token?.name}</TokenNameText>}
descriptor={ descriptor={
<TokenBalanceText> <TokenBalanceText>
{formatNumber({ input: quantity, type: NumberType.TokenNonTx })} {token?.symbol} {formatNumber({
input: quantity,
type: NumberType.TokenNonTx,
})}{' '}
{token?.symbol}
</TokenBalanceText> </TokenBalanceText>
} }
onClick={navigateToTokenDetails} onClick={navigateToTokenDetails}
......
...@@ -6,7 +6,7 @@ import { MouseoverTooltip } from 'components/Tooltip' ...@@ -6,7 +6,7 @@ import { MouseoverTooltip } from 'components/Tooltip'
import { useMemo } from 'react' import { useMemo } from 'react'
import styled from 'styled-components' import styled from 'styled-components'
import { ThemedText } from 'theme' import { ThemedText } from 'theme'
import { formatNumber, formatPriceImpact, NumberType } from 'utils/formatNumbers' import { formatPriceImpact, NumberType, useFormatter } from 'utils/formatNumbers'
import { warningSeverity } from 'utils/prices' import { warningSeverity } from 'utils/prices'
const FiatLoadingBubble = styled(LoadingBubble)` const FiatLoadingBubble = styled(LoadingBubble)`
...@@ -22,6 +22,8 @@ export function FiatValue({ ...@@ -22,6 +22,8 @@ export function FiatValue({
fiatValue: { data?: number; isLoading: boolean } fiatValue: { data?: number; isLoading: boolean }
priceImpact?: Percent priceImpact?: Percent
}) { }) {
const { formatNumber } = useFormatter()
const priceImpactColor = useMemo(() => { const priceImpactColor = useMemo(() => {
if (!priceImpact) return undefined if (!priceImpact) return undefined
if (priceImpact.lessThan('0')) return 'success' if (priceImpact.lessThan('0')) return 'success'
......
...@@ -6,7 +6,7 @@ import { ReactNode } from 'react' ...@@ -6,7 +6,7 @@ import { ReactNode } from 'react'
import styled from 'styled-components' import styled from 'styled-components'
import { ExternalLink, ThemedText } from 'theme' import { ExternalLink, ThemedText } from 'theme'
import { textFadeIn } from 'theme/styles' import { textFadeIn } from 'theme/styles'
import { formatNumber, NumberType } from 'utils/formatNumbers' import { NumberType, useFormatter } from 'utils/formatNumbers'
import { UNSUPPORTED_METADATA_CHAINS } from '../constants' import { UNSUPPORTED_METADATA_CHAINS } from '../constants'
import { TokenSortMethod } from '../state' import { TokenSortMethod } from '../state'
...@@ -59,6 +59,8 @@ function Stat({ ...@@ -59,6 +59,8 @@ function Stat({
title: ReactNode title: ReactNode
description?: ReactNode description?: ReactNode
}) { }) {
const { formatNumber } = useFormatter()
return ( return (
<StatWrapper data-cy={`${dataCy}`}> <StatWrapper data-cy={`${dataCy}`}>
<MouseoverTooltip text={description}>{title}</MouseoverTooltip> <MouseoverTooltip text={description}>{title}</MouseoverTooltip>
......
...@@ -16,7 +16,7 @@ import { CSSProperties, ReactNode } from 'react' ...@@ -16,7 +16,7 @@ import { CSSProperties, ReactNode } from 'react'
import { Link, useParams } from 'react-router-dom' import { Link, useParams } from 'react-router-dom'
import styled, { css, useTheme } from 'styled-components' import styled, { css, useTheme } from 'styled-components'
import { BREAKPOINTS, ClickableStyle } from 'theme' import { BREAKPOINTS, ClickableStyle } from 'theme'
import { formatNumber, formatUSDPrice, NumberType } from 'utils/formatNumbers' import { formatUSDPrice, NumberType, useFormatter } from 'utils/formatNumbers'
import { import {
LARGE_MEDIA_BREAKPOINT, LARGE_MEDIA_BREAKPOINT,
...@@ -440,6 +440,8 @@ interface LoadedRowProps { ...@@ -440,6 +440,8 @@ interface LoadedRowProps {
/* Loaded State: row component with token information */ /* Loaded State: row component with token information */
export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HTMLDivElement>) => { export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HTMLDivElement>) => {
const { formatNumber } = useFormatter()
const { tokenListIndex, tokenListLength, token, sortRank } = props const { tokenListIndex, tokenListLength, token, sortRank } = props
const filterString = useAtomValue(filterStringAtom) const filterString = useAtomValue(filterStringAtom)
......
...@@ -9,7 +9,7 @@ import { ZERO_PERCENT } from 'constants/misc' ...@@ -9,7 +9,7 @@ import { ZERO_PERCENT } from 'constants/misc'
import useNativeCurrency from 'lib/hooks/useNativeCurrency' import useNativeCurrency from 'lib/hooks/useNativeCurrency'
import { ClassicTrade, InterfaceTrade } from 'state/routing/types' import { ClassicTrade, InterfaceTrade } from 'state/routing/types'
import { getTransactionCount, isClassicTrade } from 'state/routing/utils' import { getTransactionCount, isClassicTrade } from 'state/routing/utils'
import { formatCurrencyAmount, formatNumber, formatPriceImpact, NumberType } from 'utils/formatNumbers' import { formatCurrencyAmount, formatPriceImpact, NumberType, useFormatter } from 'utils/formatNumbers'
import { ExternalLink, Separator, ThemedText } from '../../theme' import { ExternalLink, Separator, ThemedText } from '../../theme'
import Column from '../Column' import Column from '../Column'
...@@ -47,6 +47,7 @@ export function AdvancedSwapDetails({ trade, allowedSlippage, syncing = false }: ...@@ -47,6 +47,7 @@ export function AdvancedSwapDetails({ trade, allowedSlippage, syncing = false }:
const { chainId } = useWeb3React() const { chainId } = useWeb3React()
const nativeCurrency = useNativeCurrency(chainId) const nativeCurrency = useNativeCurrency(chainId)
const txCount = getTransactionCount(trade) const txCount = getTransactionCount(trade)
const { formatNumber } = useFormatter()
const supportsGasEstimate = chainId && SUPPORTED_GAS_ESTIMATE_CHAIN_IDS.includes(chainId) const supportsGasEstimate = chainId && SUPPORTED_GAS_ESTIMATE_CHAIN_IDS.includes(chainId)
......
...@@ -7,7 +7,7 @@ import { InterfaceTrade } from 'state/routing/types' ...@@ -7,7 +7,7 @@ import { InterfaceTrade } from 'state/routing/types'
import { isClassicTrade, isUniswapXTrade } from 'state/routing/utils' import { isClassicTrade, isUniswapXTrade } from 'state/routing/utils'
import styled from 'styled-components' import styled from 'styled-components'
import { Divider, ExternalLink, ThemedText } from 'theme' import { Divider, ExternalLink, ThemedText } from 'theme'
import { formatNumber, NumberType } from 'utils/formatNumbers' import { NumberType, useFormatter } from 'utils/formatNumbers'
const Container = styled(AutoColumn)` const Container = styled(AutoColumn)`
padding: 4px; padding: 4px;
...@@ -35,6 +35,8 @@ const GasCostItem = ({ ...@@ -35,6 +35,8 @@ const GasCostItem = ({
itemValue?: React.ReactNode itemValue?: React.ReactNode
amount?: number amount?: number
}) => { }) => {
const { formatNumber } = useFormatter()
return ( return (
<Row justify="space-between"> <Row justify="space-between">
<ThemedText.SubHeaderSmall>{title}</ThemedText.SubHeaderSmall> <ThemedText.SubHeaderSmall>{title}</ThemedText.SubHeaderSmall>
......
...@@ -11,7 +11,7 @@ import { InterfaceTrade } from 'state/routing/types' ...@@ -11,7 +11,7 @@ import { InterfaceTrade } from 'state/routing/types'
import { isUniswapXTrade } from 'state/routing/utils' import { isUniswapXTrade } from 'state/routing/utils'
import styled from 'styled-components' import styled from 'styled-components'
import { ThemedText } from 'theme' import { ThemedText } from 'theme'
import { formatNumber, NumberType } from 'utils/formatNumbers' import { NumberType, useFormatter } from 'utils/formatNumbers'
import { GasBreakdownTooltip } from './GasBreakdownTooltip' import { GasBreakdownTooltip } from './GasBreakdownTooltip'
...@@ -26,6 +26,7 @@ const StyledGasIcon = styled(Gas)` ...@@ -26,6 +26,7 @@ const StyledGasIcon = styled(Gas)`
export default function GasEstimateTooltip({ trade, loading }: { trade?: InterfaceTrade; loading: boolean }) { export default function GasEstimateTooltip({ trade, loading }: { trade?: InterfaceTrade; loading: boolean }) {
const { chainId } = useWeb3React() const { chainId } = useWeb3React()
const { formatNumber } = useFormatter()
if (!trade || !chainId || !SUPPORTED_GAS_ESTIMATE_CHAIN_IDS.includes(chainId)) { if (!trade || !chainId || !SUPPORTED_GAS_ESTIMATE_CHAIN_IDS.includes(chainId)) {
return null return null
......
...@@ -16,7 +16,7 @@ import { getTransactionCount, isClassicTrade } from 'state/routing/utils' ...@@ -16,7 +16,7 @@ import { getTransactionCount, isClassicTrade } from 'state/routing/utils'
import { useRouterPreference, useUserSlippageTolerance } from 'state/user/hooks' import { useRouterPreference, useUserSlippageTolerance } from 'state/user/hooks'
import styled, { DefaultTheme, useTheme } from 'styled-components' import styled, { DefaultTheme, useTheme } from 'styled-components'
import { ExternalLink, ThemedText } from 'theme' import { ExternalLink, ThemedText } from 'theme'
import { formatNumber, formatPriceImpact, NumberType } from 'utils/formatNumbers' import { formatPriceImpact, NumberType, useFormatter } from 'utils/formatNumbers'
import { formatTransactionAmount, priceToPreciseFloat } from 'utils/formatNumbers' import { formatTransactionAmount, priceToPreciseFloat } from 'utils/formatNumbers'
import getRoutingDiagramEntries from 'utils/getRoutingDiagramEntries' import getRoutingDiagramEntries from 'utils/getRoutingDiagramEntries'
import { formatSwapButtonClickEventProperties } from 'utils/loggingFormatters' import { formatSwapButtonClickEventProperties } from 'utils/loggingFormatters'
...@@ -78,6 +78,7 @@ export default function SwapModalFooter({ ...@@ -78,6 +78,7 @@ export default function SwapModalFooter({
const theme = useTheme() const theme = useTheme()
const { chainId } = useWeb3React() const { chainId } = useWeb3React()
const nativeCurrency = useNativeCurrency(chainId) const nativeCurrency = useNativeCurrency(chainId)
const { formatNumber } = useFormatter()
const label = `${trade.executionPrice.baseCurrency?.symbol} ` const label = `${trade.executionPrice.baseCurrency?.symbol} `
const labelInverted = `${trade.executionPrice.quoteCurrency?.symbol}` const labelInverted = `${trade.executionPrice.quoteCurrency?.symbol}`
......
...@@ -9,7 +9,7 @@ import { TextProps } from 'rebass' ...@@ -9,7 +9,7 @@ import { TextProps } from 'rebass'
import { Field } from 'state/swap/actions' import { Field } from 'state/swap/actions'
import styled from 'styled-components' import styled from 'styled-components'
import { BREAKPOINTS, ThemedText } from 'theme' import { BREAKPOINTS, ThemedText } from 'theme'
import { formatNumber, NumberType } from 'utils/formatNumbers' import { NumberType, useFormatter } from 'utils/formatNumbers'
import { formatReviewSwapCurrencyAmount } from 'utils/formatNumbers' import { formatReviewSwapCurrencyAmount } from 'utils/formatNumbers'
export const Label = styled(ThemedText.BodySmall)<{ cursor?: string }>` export const Label = styled(ThemedText.BodySmall)<{ cursor?: string }>`
...@@ -45,6 +45,8 @@ interface AmountProps { ...@@ -45,6 +45,8 @@ interface AmountProps {
} }
export function SwapModalHeaderAmount({ tooltipText, label, amount, usdAmount, field, currency }: AmountProps) { export function SwapModalHeaderAmount({ tooltipText, label, amount, usdAmount, field, currency }: AmountProps) {
const { formatNumber } = useFormatter()
return ( return (
<Row align="center" justify="space-between" gap="md"> <Row align="center" justify="space-between" gap="md">
<Column gap="xs"> <Column gap="xs">
......
...@@ -5,7 +5,7 @@ import tryParseCurrencyAmount from 'lib/utils/tryParseCurrencyAmount' ...@@ -5,7 +5,7 @@ import tryParseCurrencyAmount from 'lib/utils/tryParseCurrencyAmount'
import { useCallback, useMemo, useState } from 'react' import { useCallback, useMemo, useState } from 'react'
import styled from 'styled-components' import styled from 'styled-components'
import { ThemedText } from 'theme' import { ThemedText } from 'theme'
import { formatNumber, formatPrice, NumberType } from 'utils/formatNumbers' import { formatPrice, NumberType, useFormatter } from 'utils/formatNumbers'
interface TradePriceProps { interface TradePriceProps {
price: Price<Currency, Currency> price: Price<Currency, Currency>
...@@ -28,6 +28,8 @@ const StyledPriceContainer = styled.button` ...@@ -28,6 +28,8 @@ const StyledPriceContainer = styled.button`
` `
export default function TradePrice({ price }: TradePriceProps) { export default function TradePrice({ price }: TradePriceProps) {
const { formatNumber } = useFormatter()
const [showInverted, setShowInverted] = useState<boolean>(false) const [showInverted, setShowInverted] = useState<boolean>(false)
const { baseCurrency, quoteCurrency } = price const { baseCurrency, quoteCurrency } = price
......
...@@ -5,6 +5,10 @@ import { ...@@ -5,6 +5,10 @@ import {
SupportedLocalCurrency, SupportedLocalCurrency,
} from 'constants/localCurrencies' } from 'constants/localCurrencies'
import { DEFAULT_LOCALE, SupportedLocale } from 'constants/locales' import { DEFAULT_LOCALE, SupportedLocale } from 'constants/locales'
import { useCurrencyConversionFlagEnabled } from 'featureFlags/flags/currencyConversion'
import { useActiveLocalCurrency } from 'hooks/useActiveLocalCurrency'
import { useActiveLocale } from 'hooks/useActiveLocale'
import { useCallback, useMemo } from 'react'
type Nullish<T> = T | null | undefined type Nullish<T> = T | null | undefined
type NumberFormatOptions = Intl.NumberFormatOptions type NumberFormatOptions = Intl.NumberFormatOptions
...@@ -525,3 +529,42 @@ export function formatReviewSwapCurrencyAmount(amount: CurrencyAmount<Currency>) ...@@ -525,3 +529,42 @@ export function formatReviewSwapCurrencyAmount(amount: CurrencyAmount<Currency>)
} }
return formattedAmount return formattedAmount
} }
function useFormatterLocales(): {
formatterLocale: SupportedLocale
formatterLocalCurrency: SupportedLocalCurrency
} {
const currencyConversionEnabled = useCurrencyConversionFlagEnabled()
const activeLocale = useActiveLocale()
const activeLocalCurrency = useActiveLocalCurrency()
if (currencyConversionEnabled) {
return {
formatterLocale: activeLocale,
formatterLocalCurrency: activeLocalCurrency,
}
}
return {
formatterLocale: DEFAULT_LOCALE,
formatterLocalCurrency: DEFAULT_LOCAL_CURRENCY,
}
}
// Constructs an object that injects the correct locale and local currency into each of the above formatter functions.
export function useFormatter() {
const { formatterLocale, formatterLocalCurrency } = useFormatterLocales()
const formatNumberWithLocales = useCallback(
(options: Omit<FormatNumberOptions, 'locale' | 'localCurrency'>) =>
formatNumber({ ...options, locale: formatterLocale, localCurrency: formatterLocalCurrency }),
[formatterLocalCurrency, formatterLocale]
)
return useMemo(
() => ({
formatNumber: formatNumberWithLocales,
}),
[formatNumberWithLocales]
)
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment