import { CopyOutlined as CopyIcon, DisconnectOutlined as DisconnectIcon, SwapOutlined as SwitchIcon, } from '@ant-design/icons'; import { useWalletMultiButton } from '@solana/wallet-adapter-base-ui'; import type { ButtonProps } from 'antd'; import { Dropdown, Menu } from 'antd'; import React, { useMemo } from 'react'; import { BaseWalletConnectionButton } from './BaseWalletConnectionButton.js'; import { useWalletModal } from './useWalletModal.js'; type Props = ButtonProps & { labels: Omit< { [TButtonState in ReturnType['buttonState']]: string }, 'connected' | 'disconnecting' > & { 'copy-address': string; 'change-wallet': string; disconnect: string; }; }; export function BaseWalletMultiButton({ children, labels, ...props }: Props) { const { setVisible: setModalVisible } = useWalletModal(); const { buttonState, onConnect, onDisconnect, publicKey, walletIcon, walletName } = useWalletMultiButton({ onSelectWallet() { setModalVisible(true); }, }); const content = useMemo(() => { if (children) { return children; } else if (publicKey) { const base58 = publicKey.toBase58(); return base58.slice(0, 4) + '..' + base58.slice(-4); } else if (buttonState === 'connecting' || buttonState === 'has-wallet') { return labels[buttonState]; } else { return labels['no-wallet']; } }, [buttonState, children, labels, publicKey]); return ( {walletName} {publicKey ? ( } onClick={async () => { await navigator.clipboard.writeText(publicKey?.toBase58()); }} > {labels['copy-address']} ) : null} setTimeout(() => setModalVisible(true), 100)} icon={} className="wallet-adapter-multi-button-item" > {labels['change-wallet']} {onDisconnect ? ( } className="wallet-adapter-multi-button-item" > {labels['disconnect']} ) : null} } trigger={buttonState === 'connected' ? ['click'] : []} > { switch (buttonState) { case 'no-wallet': setModalVisible(true); break; case 'has-wallet': if (onConnect) { onConnect(); } break; } }} walletIcon={walletIcon} walletName={walletName} > {content} ); }