import { useShuttle } from '@delphi-labs/shuttle-react' import BigNumber from 'bignumber.js' import classNames from 'classnames' import { useCallback, useEffect, useState } from 'react' import useClipboard from 'react-use-clipboard' import Button from 'components/Button' import { CircularProgress } from 'components/CircularProgress' import { FormattedNumber } from 'components/FormattedNumber' import { Check, Copy, ExternalLink, Osmo } from 'components/Icons' import Overlay from 'components/Overlay' import Text from 'components/Text' import { CHAINS } from 'constants/chains' import { IS_TESTNET } from 'constants/env' import { BN_ZERO } from 'constants/math' import useCurrentWallet from 'hooks/useCurrentWallet' import useToggle from 'hooks/useToggle' import useWalletBalances from 'hooks/useWalletBalances' import useStore from 'store' import { ChainInfoID } from 'types/enums/wallet' import { getBaseAsset, getEnabledMarketAssets } from 'utils/assets' import { truncate } from 'utils/formatters' export default function WalletConnectedButton() { // --------------- // EXTERNAL HOOKS // --------------- const marketAssets = getEnabledMarketAssets() const currentWallet = useCurrentWallet() const { disconnectWallet } = useShuttle() const address = useStore((s) => s.address) const focusComponent = useStore((s) => s.focusComponent) const network = useStore((s) => s.client?.connectedWallet.network) const baseAsset = getBaseAsset() const { data: walletBalances, isLoading } = useWalletBalances(address) // --------------- // 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].explorer window.open(`${explorerUrl}/account/${address}`, '_blank') }, [network, address]) const onDisconnectWallet = () => { if (!currentWallet) return disconnectWallet(currentWallet) useStore.setState({ client: undefined, balances: [] }) } 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 (