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)}
/>
>
);
}