import { useShuttle } from '@delphi-labs/shuttle-react' import BigNumber from 'bignumber.js' import classNames from 'classnames' import { resolvePrimaryDomainByAddress } from 'ibc-domains-sdk' import { useCallback, useEffect, useState } from 'react' import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' import useClipboard from 'react-use-clipboard' import Button from 'components/common/Button' import { CircularProgress } from 'components/common/CircularProgress' import { FormattedNumber } from 'components/common/FormattedNumber' import { Check, Copy, ExternalLink, Wallet } from 'components/common/Icons' import Overlay from 'components/common/Overlay' import Text from 'components/common/Text' import RecentTransactions from 'components/Wallet/RecentTransactions' import WalletSelect from 'components/Wallet/WalletSelect' import chains from 'configs/chains' import { BN_ZERO } from 'constants/math' import useBaseAsset from 'hooks/assets/useBasetAsset' import useMarketEnabledAssets from 'hooks/assets/useMarketEnabledAssets' import useChainConfig from 'hooks/useChainConfig' import useCurrentWallet from 'hooks/useCurrentWallet' import useICNSDomain from 'hooks/useICNSDomain' import useToggle from 'hooks/useToggle' import useWalletBalances from 'hooks/useWalletBalances' import useStore from 'store' import { NETWORK } from 'types/enums/network' import { ChainInfoID } from 'types/enums/wallet' import { truncate } from 'utils/formatters' import { getPage, getRoute } from 'utils/route' export default function WalletConnectedButton() { // --------------- // EXTERNAL HOOKS // --------------- const marketAssets = useMarketEnabledAssets() const currentWallet = useCurrentWallet() const { disconnectWallet } = useShuttle() const address = currentWallet?.account.address const userDomain = useStore((s) => s.userDomain) const focusComponent = useStore((s) => s.focusComponent) const network = useStore((s) => s.client?.connectedWallet.network) const chainConfig = useChainConfig() const baseAsset = useBaseAsset() const { data: walletBalances, isLoading } = useWalletBalances(address) const { data: icnsData, isLoading: isLoadingICNS } = useICNSDomain(address) const navigate = useNavigate() const { pathname } = useLocation() const [searchParams] = useSearchParams() // --------------- // LOCAL STATE // --------------- const [showDetails, setShowDetails] = useToggle() const [walletAmount, setWalletAmount] = useState(BN_ZERO) const [isCopied, setCopied] = useClipboard(address || '', { successDuration: 1000 * 5, }) // --------------- // VARIABLES // --------------- const explorerName = network && chains[network.chainId as ChainInfoID].explorerName const viewOnFinder = useCallback(() => { const explorerUrl = network && chains[network.chainId as ChainInfoID].endpoints.explorer window.open(`${explorerUrl}/account/${address}`, '_blank') }, [network, address]) const onDisconnectWallet = () => { if (currentWallet) disconnectWallet(currentWallet) useStore.setState({ client: undefined, address: undefined, userDomain: undefined, balances: [], focusComponent: null, }) if (focusComponent) { useStore.setState({ focusComponent: { component: , onClose: () => { useStore.setState({ focusComponent: null }) }, }, }) } navigate(getRoute(getPage(pathname), new URLSearchParams())) } useEffect(() => { const fetchIBCDomain = async () => { if (!address || isLoadingICNS) return resolvePrimaryDomainByAddress(address).then((result) => { if (result.isOk()) { const userDomain = result.value as CommonSlice['userDomain'] useStore.setState({ userDomain }) } else { useStore.setState({ userDomain: undefined }) } }) } if (icnsData?.primary_name) { const userDomain = icnsData.primary_name useStore.setState({ userDomain: { domain: userDomain.split('.')[0], domain_full: userDomain }, }) } else { fetchIBCDomain() } }, [icnsData?.primary_name, isLoadingICNS, address]) useEffect(() => { const newAmount = BigNumber( walletBalances.find((coin: Coin) => coin.denom === baseAsset.denom)?.amount ?? 0, ).dividedBy(10 ** baseAsset.decimals) if (walletAmount.isEqualTo(newAmount)) return setWalletAmount(newAmount) const assetDenoms = marketAssets.map((asset) => asset.denom) const balances = walletBalances.filter((coin) => assetDenoms.includes(coin.denom)) useStore.setState({ balances }) }, [walletBalances, baseAsset.denom, baseAsset.decimals, marketAssets, walletAmount]) return (
{chainConfig.network !== NETWORK.MAINNET && ( {chainConfig.id} )}
{baseAsset.symbol}
{userDomain?.domain_full ? userDomain.domain_full : 'Your Address'} {address} {truncate(address, [14, 14])}
) }