WalletConnectButton.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { Button, ButtonProps } from '@material-ui/core';
  2. import { useWallet } from '@solana/wallet-adapter-react';
  3. import React, { FC, MouseEventHandler, useCallback, useMemo } from 'react';
  4. import { WalletIcon } from './WalletIcon';
  5. export const WalletConnectButton: FC<ButtonProps> = ({
  6. color = 'primary',
  7. variant = 'contained',
  8. children,
  9. disabled,
  10. onClick,
  11. ...props
  12. }) => {
  13. const { wallet, connect, connecting, connected } = useWallet();
  14. const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
  15. (event) => {
  16. if (onClick) onClick(event);
  17. // eslint-disable-next-line @typescript-eslint/no-empty-function
  18. if (!event.defaultPrevented) connect().catch(() => {});
  19. },
  20. [onClick, connect]
  21. );
  22. const content = useMemo(() => {
  23. if (children) return children;
  24. if (connecting) return 'Connecting ...';
  25. if (connected) return 'Connected';
  26. if (wallet) return 'Connect';
  27. return 'Connect Wallet';
  28. }, [children, connecting, connected, wallet]);
  29. return (
  30. <Button
  31. color={color}
  32. variant={variant}
  33. onClick={handleClick}
  34. disabled={disabled || !wallet || connecting || connected}
  35. startIcon={<WalletIcon wallet={wallet} />}
  36. {...props}
  37. >
  38. {content}
  39. </Button>
  40. );
  41. };