import { useMemo } from 'react' import Image from 'next/image' import { useTranslations } from 'next-intl' import { CHAINS_BY_ID } from '@constants/chains' import { DATA_PLACEHOLDER } from '@/constants/placeholders' import { Token } from '@/utils/types' import { useUsdSlippage } from '@hooks/useUsdSlippage' import { formatBigIntToString } from '@/utils/bigint/format' import { formatSlippage } from '@/utils/formatSlippage' const SwapExchangeRateInfo = ({ fromAmount, fromToken, toToken, exchangeRate, toChainId, outputAmount, isQuoteLoading, }: { fromAmount: bigint fromToken: Token toToken: Token exchangeRate: bigint toChainId: number outputAmount: bigint isQuoteLoading: boolean }) => { const safeExchangeRate = useMemo(() => exchangeRate ?? 0n, [exchangeRate]) const safeFromAmount = useMemo(() => fromAmount ?? 0n, [fromAmount]) const formattedExchangeRate = formatBigIntToString(safeExchangeRate, 18, 5) // Calculate USD-based slippage const { slippage, isLoading, error, textColor } = useUsdSlippage({ originToken: fromToken, destToken: toToken, originChainId: toChainId, // Swap happens on same chain destChainId: toChainId, inputAmount: safeFromAmount > 0n ? safeFromAmount : null, outputAmount: outputAmount > 0n ? outputAmount : null, }) const expectedToChain = useMemo(() => { return toChainId && }, [toChainId]) return (
) } const ExpectedPrice = ({ expectedToChain, safeFromAmount, formattedExchangeRate, toToken, isQuoteLoading, }) => { const t = useTranslations('Swap') return (

{t('Expected price on')}

{expectedToChain}
{safeFromAmount != 0n && !isQuoteLoading ? ( <> {formattedExchangeRate}{' '} {toToken?.symbol} ) : ( DATA_PLACEHOLDER )}
) } interface SlippageProps { safeFromAmount: bigint slippage: number | null isLoading: boolean error: string | null textColor: string } const Slippage = ({ safeFromAmount, slippage, isLoading, error, textColor, }: SlippageProps) => { const t = useTranslations('Slippage') const shouldShow = !isLoading && safeFromAmount > 0n return (

{t('Slippage')}

{shouldShow ? ( <> {error && ( {t(error)} )} {!error && slippage !== null && ( {formatSlippage(slippage)} )} {!error && slippage === null && ( {DATA_PLACEHOLDER} )} ) : ( {DATA_PLACEHOLDER} )}
) } const ChainInfoLabel = ({ chainId }: { chainId: number }) => { const chain = CHAINS_BY_ID[chainId] return chain ? ( chain image {chain.name.length > 10 ? chain.chainSymbol : chain.name} ) : null } export default SwapExchangeRateInfo