'use client' import Image from 'next/image' import Link from 'next/link' import { FC, useMemo, useState } from 'react' import { Button } from '@/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { env } from '@/config/environment' import { truncateHash } from '@/utils/truncate-hash' import { SupportedChainId } from '@azns/resolver-core' import { useResolveAddressToDomain } from '@azns/resolver-react' import { InjectedAccount } from '@polkadot/extension-inject/types' import { encodeAddress } from '@polkadot/util-crypto' import { SubstrateChain, SubstrateWalletPlatform, allSubstrateWallets, getSubstrateChain, isWalletInstalled, useBalance, useInkathon, } from '@scio-labs/use-inkathon' import { AlertOctagon } from 'lucide-react' import aznsIconSvg from 'public/icons/azns-icon.svg' import toast from 'react-hot-toast' import { AiOutlineCheckCircle, AiOutlineDisconnect } from 'react-icons/ai' import { FiChevronDown, FiExternalLink } from 'react-icons/fi' import { RiArrowDownSLine } from 'react-icons/ri' import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip' export interface ConnectButtonProps {} export const ConnectButton: FC = () => { const { activeChain, switchActiveChain, connect, disconnect, isConnecting, activeAccount, accounts, setActiveAccount, } = useInkathon() const { reducibleBalance, reducibleBalanceFormatted } = useBalance(activeAccount?.address, true, { forceUnit: false, fixedDecimals: 2, removeTrailingZeros: true, }) const [supportedChains] = useState( env.supportedChains.map((networkId) => getSubstrateChain(networkId) as SubstrateChain), ) // Sort installed wallets first const [browserWallets] = useState([ ...allSubstrateWallets.filter( (w) => w.platforms.includes(SubstrateWalletPlatform.Browser) && isWalletInstalled(w), ), ...allSubstrateWallets.filter( (w) => w.platforms.includes(SubstrateWalletPlatform.Browser) && !isWalletInstalled(w), ), ]) // Connect Button if (!activeAccount) return ( {!activeAccount && browserWallets.map((w) => isWalletInstalled(w) ? ( { connect?.(undefined, w) }} > {w.name} ) : (

{w.name}

Not installed

), )}
) // Account Menu & Disconnect Button return (
{/* Account Name, Address, and AZERO.ID-Domain (if assigned) */} {/* Supported Chains */} {supportedChains.map((chain) => ( { await switchActiveChain?.(chain) toast.success(`Switched to ${chain.name}`) }} >

{chain.name}

{chain.network === activeChain?.network && ( )}
))} {/* Available Accounts/Wallets */} {(accounts || []).map((acc) => { const encodedAddress = encodeAddress(acc.address, activeChain?.ss58Prefix || 42) const truncatedEncodedAddress = truncateHash(encodedAddress, 10) return ( { setActiveAccount?.(acc) }} >

{truncatedEncodedAddress}

{acc.address === activeAccount?.address && ( )}
) })} {/* Disconnect Button */} disconnect?.()}>
Disconnect
{/* Account Balance */} {reducibleBalanceFormatted !== undefined && (
{reducibleBalanceFormatted} {(!reducibleBalance || reducibleBalance?.isZero()) && ( No balance to pay fees )}
)}
) } export interface AccountNameProps { account: InjectedAccount } export const AccountName: FC = ({ account, ...rest }) => { const { activeChain } = useInkathon() const doResolveAddress = useMemo( () => Object.values(SupportedChainId).includes(activeChain?.network as SupportedChainId), [activeChain?.network], ) const { primaryDomain } = useResolveAddressToDomain( doResolveAddress ? account?.address : undefined, { chainId: activeChain?.network }, ) return (
{primaryDomain || account.name} {!!primaryDomain && AZERO.ID Logo}
) }