import { Alert, BestRoute, Button, styled, VerticalSwapIcon } from '@rangodev/ui'; import React, { useEffect, useState } from 'react'; import { useInRouterContext, useNavigate } from 'react-router-dom'; import { Header } from '../components/Header'; import { TokenInfo } from '../components/TokenInfo'; import { useBestRouteStore } from '../store/bestRoute'; import { BottomLogo } from '../components/BottomLogo'; import { SwithFromAndTo } from '../components/SwitchFromAndTo'; import { Footer } from '../components/Footer'; import { navigationRoutes } from '../constants/navigationRoutes'; import { useBestRoute } from '../hooks/useBestRoute'; import { useMetaStore } from '../store/meta'; import { useWalletsStore } from '../store/wallets'; import { errorMessages } from '../constants/errors'; import { getSwapButtonTitle, getOutputRatio, hasLimitError, outputRatioHasWarning, canComputePriceImpact, } from '../utils/swap'; const Container = styled('div', { display: 'flex', flexDirection: 'column', justifyContent: 'center', alignItems: 'center', }); const SwitchButtonContainer = styled('div', { display: 'flex', justifyContent: 'center', alignItems: 'center', position: 'relative', top: '11px', }); const BestRouteContainer = styled('div', { width: '100%', paddingTop: '$16', }); const Alerts = styled('div', { paddingTop: '$16', }); export function Home() { const [waningMessage, setWarningMessage] = useState(''); const isRouterInContext = useInRouterContext(); const navigate = useNavigate(); const [count, setCount] = useState(0); const fromChain = useBestRouteStore.use.fromChain(); const fromToken = useBestRouteStore.use.fromToken(); const toChain = useBestRouteStore.use.toChain(); const toToken = useBestRouteStore.use.toToken(); const setFromChain = useBestRouteStore.use.setFromChain(); const setFromToken = useBestRouteStore.use.setFromToken(); const setToChain = useBestRouteStore.use.setToChain(); const setToToken = useBestRouteStore.use.setToToken(); const setBestRoute = useBestRouteStore.use.setBestRoute(); const inputUsdValue = useBestRouteStore.use.inputUsdValue(); const inputAmount = useBestRouteStore.use.inputAmount(); const setInputAmount = useBestRouteStore.use.setInputAmount(); const outputAmount = useBestRouteStore.use.outputAmount(); const outputUsdValue = useBestRouteStore.use.outputUsdValue(); const bestRoute = useBestRouteStore.use.bestRoute(); const loadingMetaStatus = useMetaStore.use.loadingStatus(); const accounts = useWalletsStore.use.accounts(); const swithFromAndTo = () => { setFromChain(toChain); setFromToken(toToken); setToChain(fromChain); setToToken(fromToken); setInputAmount(outputAmount?.toString() || ''); setCount((prev) => prev + 1); }; const { data, loading: fetchingBestRoute, error: bestRouteError, retry } = useBestRoute(); const noConnectedWallet = accounts.length > 0; const noRoutesFound = !bestRoute?.result; const errorMessage = loadingMetaStatus === 'failed' ? errorMessages.genericServerError : bestRouteError; const needsToWarnEthOnPath = false; const showBestRoute = inputAmount && (!!data || fetchingBestRoute || bestRouteError); const outToInRatio = getOutputRatio(inputUsdValue, outputUsdValue); const highValueLoss = outputRatioHasWarning(inputUsdValue, outToInRatio); const priceImpactCanNotBeComputed = !canComputePriceImpact( bestRoute, inputAmount, inputUsdValue, outputUsdValue, ); const buttonTitle = getSwapButtonTitle( accounts, fetchingBestRoute, hasLimitError(bestRoute), highValueLoss, priceImpactCanNotBeComputed, needsToWarnEthOnPath, ); const buttonDisabled = loadingMetaStatus != 'success' || fetchingBestRoute || highValueLoss || (noConnectedWallet && noRoutesFound) || hasLimitError(bestRoute); useEffect(() => { setBestRoute(data); }, [data]); return (
{showBestRoute && ( )} {(errorMessage || waningMessage) && ( {errorMessage && } {waningMessage && } )} ); }