|
1 | 1 | "use client"; |
2 | 2 |
|
3 | | -import { ConnectButton, useCurrentAccount } from "@mysten/dapp-kit"; |
| 3 | +import { ConnectButton, useCurrentAccount, useDisconnectWallet } from "@mysten/dapp-kit"; |
| 4 | +import { useState, useCallback } from "react"; |
4 | 5 |
|
5 | 6 | export function WalletConnectButton() { |
6 | 7 | const account = useCurrentAccount(); |
| 8 | + const { mutate: disconnect } = useDisconnectWallet(); |
| 9 | + const [isMenuOpen, setIsMenuOpen] = useState(false); |
7 | 10 |
|
8 | | - // Format địa chỉ: 0x1234...5678 |
9 | 11 | const formatAddress = (address: string) => { |
10 | 12 | return `${address.slice(0, 6)}...${address.slice(-4)}`; |
11 | 13 | }; |
12 | 14 |
|
| 15 | + const handleDisconnect = useCallback(() => { |
| 16 | + // Clear session storage to fix redirect_uri mismatch on re-login |
| 17 | + sessionStorage.clear(); |
| 18 | + disconnect(); |
| 19 | + setIsMenuOpen(false); |
| 20 | + }, [disconnect]); |
| 21 | + |
13 | 22 | return ( |
14 | | - <ConnectButton |
15 | | - connectText="Launch App" |
16 | | - className="sui-wallet-button" |
17 | | - > |
18 | | - {account && ( |
19 | | - <div className="bg-black dark:bg-white text-white dark:text-black px-5 py-2 rounded-full font-bold text-sm uppercase hover:scale-105 transition-transform flex items-center gap-2"> |
20 | | - <span className="material-icons text-base">account_balance_wallet</span> |
21 | | - <span>{formatAddress(account.address)}</span> |
| 23 | + <div className="relative"> |
| 24 | + <ConnectButton connectText="Launch App" className="sui-wallet-button"> |
| 25 | + {account && ( |
| 26 | + <button |
| 27 | + onClick={() => setIsMenuOpen(!isMenuOpen)} |
| 28 | + className="bg-black dark:bg-white text-white dark:text-black px-5 py-2 rounded-full font-bold text-sm uppercase hover:scale-105 transition-transform flex items-center gap-2" |
| 29 | + > |
| 30 | + <span className="material-icons text-base">account_balance_wallet</span> |
| 31 | + <span>{formatAddress(account.address)}</span> |
| 32 | + <span className="material-icons text-sm"> |
| 33 | + {isMenuOpen ? "expand_less" : "expand_more"} |
| 34 | + </span> |
| 35 | + </button> |
| 36 | + )} |
| 37 | + </ConnectButton> |
| 38 | + |
| 39 | + {/* Dropdown menu */} |
| 40 | + {isMenuOpen && account && ( |
| 41 | + <div className="absolute right-0 top-full mt-2 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 py-2 min-w-[150px] z-50"> |
| 42 | + <button |
| 43 | + onClick={handleDisconnect} |
| 44 | + className="w-full px-4 py-2 text-left text-sm text-red-600 hover:bg-gray-100 dark:hover:bg-gray-700 flex items-center gap-2" |
| 45 | + > |
| 46 | + <span className="material-icons text-sm">logout</span> |
| 47 | + Disconnect |
| 48 | + </button> |
22 | 49 | </div> |
23 | 50 | )} |
24 | | - </ConnectButton> |
| 51 | + |
| 52 | + {/* Click outside to close */} |
| 53 | + {isMenuOpen && ( |
| 54 | + <div |
| 55 | + className="fixed inset-0 z-40" |
| 56 | + onClick={() => setIsMenuOpen(false)} |
| 57 | + /> |
| 58 | + )} |
| 59 | + </div> |
25 | 60 | ); |
26 | 61 | } |
0 commit comments