import { useWallet } from '@solana/wallet-adapter-react'; import type { FC } from 'react'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import type { ButtonProps } from './Button.js'; import { Button } from './Button.js'; import { useWalletModal } from './useWalletModal.js'; import { WalletConnectButton } from './WalletConnectButton.js'; import { WalletIcon } from './WalletIcon.js'; import { WalletModalButton } from './WalletModalButton.js'; export const WalletMultiButton: FC = ({ children, ...props }) => { const { publicKey, wallet, disconnect } = useWallet(); const { setVisible } = useWalletModal(); const [copied, setCopied] = useState(false); const [active, setActive] = useState(false); const ref = useRef(null); const base58 = useMemo(() => publicKey?.toBase58(), [publicKey]); const content = useMemo(() => { if (children) return children; if (!wallet || !base58) return null; return base58.slice(0, 4) + '..' + base58.slice(-4); }, [children, wallet, base58]); const copyAddress = useCallback(async () => { if (base58) { await navigator.clipboard.writeText(base58); setCopied(true); setTimeout(() => setCopied(false), 400); } }, [base58]); const openDropdown = useCallback(() => { setActive(true); }, []); const closeDropdown = useCallback(() => { setActive(false); }, []); const openModal = useCallback(() => { setVisible(true); closeDropdown(); }, [setVisible, closeDropdown]); useEffect(() => { const listener = (event: MouseEvent | TouchEvent) => { const node = ref.current; // Do nothing if clicking dropdown or its descendants if (!node || node.contains(event.target as Node)) return; closeDropdown(); }; document.addEventListener('mousedown', listener); document.addEventListener('touchstart', listener); return () => { document.removeEventListener('mousedown', listener); document.removeEventListener('touchstart', listener); }; }, [ref, closeDropdown]); if (!wallet) return {children}; if (!base58) return {children}; return (
  • {copied ? 'Copied' : 'Copy address'}
  • Change wallet
  • Disconnects
); };