0x0x230x

Untitled

Jan 20th, 2025
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.19 KB | None | 0 0
  1. 'use client';
  2.  
  3. import {
  4. usePrivy,
  5. useWallets,
  6. useCreateWallet,
  7. useSolanaWallets,
  8. } from '@privy-io/react-auth';
  9. import { Button } from '@/components/ui/button';
  10. import { useDisconnect } from 'wagmi';
  11. import { useRef, useState } from 'react';
  12. import {
  13. NavigationMenu,
  14. NavigationMenuContent,
  15. NavigationMenuItem,
  16. NavigationMenuList,
  17. NavigationMenuTrigger,
  18. } from '@/components/ui/navigation-menu';
  19. import { useAsyncEffect } from '@/lib/hooks/useAsyncEffect';
  20.  
  21. export default function ConnectWalletButton() {
  22. const { ready, authenticated, login, logout } = usePrivy();
  23. const { wallets: evmWallets, ready: evmWalletsReady } = useWallets();
  24. const { disconnect } = useDisconnect();
  25. const [isDisconnecting, setIsDisconnecting] = useState(false);
  26. const isCreatingSolanaWallet = useRef(false);
  27.  
  28. const {
  29. createWallet: createSolanaWallet,
  30. ready: solanaWalletsReady,
  31. wallets: solanaWallets,
  32. } = useSolanaWallets();
  33.  
  34.  
  35. useAsyncEffect(async () => {
  36. if (!authenticated || !solanaWalletsReady) {
  37. return;
  38. }
  39.  
  40. const solanaWallet = solanaWallets.find(
  41. (wallet) => wallet.connectorType === 'embedded',
  42. );
  43.  
  44. if (!solanaWallet && !isCreatingSolanaWallet.current) {
  45. try {
  46. isCreatingSolanaWallet.current = true;
  47. await createSolanaWallet();
  48. } catch (error) {
  49. isCreatingSolanaWallet.current = false;
  50. console.log('Error creating solana wallet', error);
  51. }
  52. }
  53. }, [authenticated, solanaWalletsReady, solanaWallets]);
  54.  
  55. const handleDisconnect = async () => {
  56. setIsDisconnecting(true);
  57. await disconnect();
  58. await logout();
  59. setIsDisconnecting(false);
  60. localStorage.removeItem('wagmi.io.metamask.disconnected');
  61. };
  62.  
  63. const renderButton = () => {
  64. if (!ready || isDisconnecting || !evmWallets || !solanaWallets) {
  65. return (
  66. <Button className="w-[165px] h-[40px]" disabled>
  67. {isDisconnecting ? 'Disconnecting...' : 'Connecting...'}
  68. </Button>
  69. );
  70. }
  71.  
  72. const evmWallet = evmWallets.find(
  73. (wallet) => wallet.connectorType === 'embedded',
  74. );
  75.  
  76. const solanaWallet = solanaWallets.find(
  77. (wallet) => wallet.connectorType === 'embedded',
  78. );
  79.  
  80. if (authenticated && (evmWallet || solanaWallet)) {
  81. const addressToDisplay = evmWallet?.address || solanaWallet?.address;
  82.  
  83. return (
  84. <NavigationMenu>
  85. <NavigationMenuList>
  86. <NavigationMenuItem>
  87. <NavigationMenuTrigger className="w-[165px] h-[40px] rounded-sm font-superstar bg-primary text-primary-foreground hover:bg-primary/90 data-[state=open]:bg-primary/90 flex items-center justify-center">
  88. {addressToDisplay?.slice(0, 6)}...
  89. {addressToDisplay?.slice(-4)}
  90. </NavigationMenuTrigger>
  91. <NavigationMenuContent>
  92. <div className="flex flex-col p-2 w-[165px] bg-zinc-900 rounded-lg border-0 shadow-lg">
  93. {/* <Button
  94. variant="ghost"
  95. className="w-full justify-start py-2 text-white hover:bg-zinc-800 hover:text-white font-superstar"
  96. onClick={() => router.push(`/profile/${address}`)}
  97. >
  98. PROFILE
  99. </Button> */}
  100. <Button
  101. variant="ghost"
  102. className="w-full justify-start py-2 text-red-500 hover:bg-zinc-800 hover:text-red-400 font-superstar"
  103. onClick={handleDisconnect}
  104. disabled={isDisconnecting}
  105. >
  106. DISCONNECT
  107. </Button>
  108. </div>
  109. </NavigationMenuContent>
  110. </NavigationMenuItem>
  111. </NavigationMenuList>
  112. </NavigationMenu>
  113. );
  114. }
  115.  
  116. return (
  117. ready &&
  118. !authenticated && (
  119. <Button
  120. className="w-[165px] h-[40px] font-superstar"
  121. onClick={() => login({ loginMethods: ['farcaster'] })}
  122. >
  123. Login with Farcaster
  124. </Button>
  125. )
  126. );
  127. };
  128.  
  129. return <div className="h-[40px] flex items-center">{renderButton()}</div>;
  130. }
  131.  
Advertisement
Add Comment
Please, Sign In to add comment