import { useSnapshot } from 'valtio'; import { useState } from 'react'; import { ConnectionsController, ConstantsUtil, SwapController } from '@reown/appkit-core-react-native'; import { FlexView, Text, UiUtil, Toggle, useTheme, Pressable, Icon } from '@reown/appkit-ui-react-native'; import { NumberUtil } from '@reown/appkit-common-react-native'; import { InformationModal } from '../w3m-information-modal'; import styles from './styles'; import { getModalData } from './utils'; interface SwapDetailsProps { initialOpen?: boolean; canClose?: boolean; } // -- Constants ----------------------------------------- // const slippageRate = ConstantsUtil.CONVERT_SLIPPAGE_TOLERANCE; export function SwapDetails({ initialOpen, canClose }: SwapDetailsProps) { const Theme = useTheme(); const { maxSlippage = 0, sourceToken, toToken, gasPriceInUSD = 0, priceImpact, toTokenAmount } = useSnapshot(SwapController.state); const [modalData, setModalData] = useState<{ title: string; description: string } | undefined>(); const toTokenSwappedAmount = SwapController.state.sourceTokenPriceInUSD && SwapController.state.toTokenPriceInUSD ? (1 / SwapController.state.toTokenPriceInUSD) * SwapController.state.sourceTokenPriceInUSD : 0; const renderTitle = () => ( 1 {SwapController.state.sourceToken?.symbol} = {''} {UiUtil.formatNumberToLocalString(toTokenSwappedAmount, 3)}{' '} {SwapController.state.toToken?.symbol} ~$ {UiUtil.formatNumberToLocalString(SwapController.state.sourceTokenPriceInUSD)} ); const minimumReceive = NumberUtil.parseLocalStringToNumber(toTokenAmount) - maxSlippage; const providerFee = SwapController.getProviderFeePrice(); const onPriceImpactPress = () => { setModalData(getModalData('priceImpact')); }; const onSlippagePress = () => { const minimumString = UiUtil.formatNumberToLocalString( minimumReceive, minimumReceive < 1 ? 8 : 2 ); setModalData( getModalData('slippage', { minimumReceive: minimumString, toTokenSymbol: SwapController.state.toToken?.symbol }) ); }; const onNetworkCostPress = () => { setModalData( getModalData('networkCost', { networkSymbol: SwapController.state.networkTokenSymbol, networkName: ConnectionsController.state.activeNetwork?.name }) ); }; return ( <> Network cost ${UiUtil.formatNumberToLocalString(gasPriceInUSD, gasPriceInUSD < 1 ? 8 : 2)} {!!priceImpact && ( Price impact ~{UiUtil.formatNumberToLocalString(priceImpact, 3)}% )} {maxSlippage !== undefined && maxSlippage > 0 && !!sourceToken?.symbol && ( Max. slippage {UiUtil.formatNumberToLocalString(maxSlippage, 6)} {toToken?.symbol}{' '} {slippageRate}% )} Included provider fee ${UiUtil.formatNumberToLocalString(providerFee, providerFee < 1 ? 8 : 2)} setModalData(undefined)} /> ); }