import { ArrowBack } from "@mui/icons-material"; import { Box, Link, Skeleton, Typography } from "@mui/material"; import { useEffect, useState, useMemo, useCallback } from "react"; import { Link as RouterLink, useLocation, useParams, useNavigate } from "react-router-dom"; import { useAccount, useSwitchChain } from "wagmi"; import { isAddress } from "viem"; import ReactGA from "react-ga4"; import PageTitle from "../../components/PageTitle/PageTitle"; import Metric from "../../components/Metric/Metric"; import TokenStack from "../../components/TokenStack/TokenStack"; import BondPrice from "./components/BondPrice"; import BondDiscount from "./components/BondDiscount"; import BondInputArea from "./components/BondInputArea"; import BondSettingsModal from "./components/BondSettingsModal"; import NotFound from "../NotFound/NotFound"; import { DecimalBigNumber } from "../../helpers/DecimalBigNumber"; import { isNetworkLegacy } from "../../constants"; import { formatCurrency } from "../../helpers"; import { useLocalStorage } from "../../hooks/localstorage"; import { useLiveBonds } from "../../hooks/bonds"; import { useFtsoPrice } from "../../hooks/prices"; const BondModalContainer = ({ chainId, address, config, connect }) => { const { id, network } = useParams(); const { liveBonds } = useLiveBonds(chainId, network); const bond = liveBonds.find(bond => bond.id === Number(id)); if (!bond) return ; return ; }; export const BondModal = ({ bond, chainId, address, config, connect }) => { const navigate = useNavigate(); const { network } = useParams(); const { pathname } = useLocation(); const [isSettingsOpen, setSettingsOpen] = useState(false); const { getStorageValue, setStorageValue } = useLocalStorage(); const [slippage, setSlippage] = useState(() => getStorageValue(chainId, address, "bond-slippage", "10")); const [formatDecimals, setFormatDecimals] = useState(() => getStorageValue(chainId, address, "bond-decimals", "5")); const [recipientAddress, setRecipientAddressInner] = useState(() => getStorageValue(chainId, address, "bond-recipient", address)); useEffect(() => { ReactGA.send({ hitType: "pageview", page: pathname }); }, []) const setRecipientAddress = useCallback((value) => { setRecipientAddressInner(value); if (isAddress(value)) { setStorageValue(chainId, address, "bond-recipient", value); } }, [chainId, address]); const setSlippageInner = useCallback((value) => { const maybeValue = parseFloat(value); if (!maybeValue || parseFloat(value) <= 100) { setSlippage(value); setStorageValue(chainId, address, "bond-slippage", value); } }, [chainId, address]); const setFormatDecimalsInner = useCallback((value) => { if (Number(value) <= 17) { setFormatDecimals(value); setStorageValue(chainId, address, "bond-decimals", value); } }, [chainId, address]); useEffect(() => { const handleKeyDown = (event) => { if (event.key === "Escape") isSettingsOpen ? setSettingsOpen(false) : navigate(`/${network}/bonds`); }; window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, [network, navigate, isSettingsOpen]); const chainSymbol = useMemo(() => { const chainSymbol = config?.getClient()?.chain?.nativeCurrency?.symbol; if (chainSymbol) return chainSymbol; return "WTF"; }, [config]); const preparedQuoteToken = useMemo(() => { if (isNetworkLegacy(chainId)) { return { address: bond.quoteToken.quoteTokenAddress, icons: bond.quoteToken.icons, name: bond.quoteToken.name, } } return { address: undefined, icons: [chainSymbol], name: chainSymbol }; }, [bond, chainSymbol, chainId]) return ( Back {preparedQuoteToken.name} } /> setSettingsOpen(false)} slippage={slippage} recipientAddress={recipientAddress} formatDecimals={formatDecimals} onRecipientAddressChange={event => setRecipientAddress(event.currentTarget.value)} onSlippageChange={event => setSlippageInner(event.currentTarget.value)} onDecimalsChange={event => setFormatDecimalsInner(event.currentTarget.value)} /> ) } /> } /> } /> setSettingsOpen(true)} formatDecimals={formatDecimals} /> ); }; const TokenPrice = ({ priceInUsd }) => { return priceInUsd ? ( <>{formatCurrency(priceInUsd, 2)} ) : ( ); }; export default BondModalContainer;