import { useShuttle } from '@delphi-labs/shuttle-react' import BigNumber from 'bignumber.js' import { AnimatedNumber, Button, CircularProgress, DisplayCurrency, SVG } from 'components/common' import { SUPPORTED_CHAINS } from 'constants/appConstants' import { CHAINS } from 'constants/chains' import { findByDenom } from 'functions' import { useUserBalance } from 'hooks/queries' import useCurrentWallet from 'hooks/wallet/useCurrentWallet' import { formatValue } from 'libs/parse' import { truncate } from 'libs/text' import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import useClipboard from 'react-use-clipboard' import useStore from 'store' import colors from 'styles/_assets.module.scss' import { State } from 'types/enums' import { ChainInfoID } from 'types/enums/wallet' import styles from './WalletConnectedButton.module.scss' export const WalletConnectedButton = () => { // --------------- // EXTERNAL HOOKS // --------------- const currentWallet = useCurrentWallet() const chainInfo = useStore((s) => s.chainInfo) const { disconnectWallet } = useShuttle() const userWalletAddress = useStore((s) => s.userWalletAddress) const baseCurrency = useStore((s) => s.baseCurrency) const network = useStore((s) => s.client?.connectedWallet.network) const networkConfig = useStore((s) => s.networkConfig) const [isTestnet, setIsTestnet] = useState(false) const userIcns = useStore((s) => s.userIcns) const { data: walletBalances, isLoading } = useUserBalance() const { t } = useTranslation() const baseAsset = useMemo(() => networkConfig.assets.base, [networkConfig]) // --------------- // LOCAL STATE // --------------- const [showDetails, setShowDetails] = useState(false) const [walletAmount, setWalletAmount] = useState(new BigNumber(0)) const [isCopied, setCopied] = useClipboard(userWalletAddress, { 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/${userWalletAddress}`, '_blank') }, [network, userWalletAddress]) const onDisconnectWallet = () => { if (currentWallet) disconnectWallet(currentWallet) useStore.setState({ client: undefined, userWalletAddress: undefined, chainInfo: undefined, userIcns: undefined, marketAssetLiquidity: [], marketInfo: [], redBankAssets: [], redBankState: State.INITIALISING, userBalancesState: State.INITIALISING, }) } const onClickAway = useCallback(() => { setShowDetails(false) }, []) useEffect(() => { if (!chainInfo) return setIsTestnet( !!SUPPORTED_CHAINS.find( (chain) => chain.type === 'testnet' && chain.chainId === networkConfig.name, ), ) }, [chainInfo, networkConfig.name]) useEffect(() => { if (!walletBalances) return const newAmount = BigNumber( walletBalances.find((coin: Coin) => coin.denom === baseAsset.denom)?.amount ?? 0, ).dividedBy(10 ** baseAsset.decimals) if (walletAmount.isEqualTo(newAmount)) return setWalletAmount(newAmount) }, [walletBalances, baseAsset.denom, baseAsset.decimals, walletAmount]) const baseCurrencyBalance = Number( findByDenom(walletBalances || [], baseCurrency.denom || '')?.amount || 0, ) return (
{isTestnet && {networkConfig.name}}

{userIcns ? userIcns : t('common.yourAddress')}

{userWalletAddress}

{truncate(userWalletAddress, [14, 14])}

)}
) }