diff --git a/src/wallet/WalletLoginModal.tsx b/src/wallet/WalletLoginModal.tsx index 38723dc..ce17c75 100644 --- a/src/wallet/WalletLoginModal.tsx +++ b/src/wallet/WalletLoginModal.tsx @@ -181,6 +181,16 @@ export function WalletLoginModal() {

) : null} + {selected ? ( +
+

Wallet debug

+

state: {wc.state}

+

connected: {wc.isConnected ? "yes" : "no"}

+

address: {wc.address || "-"}

+

qr: {wc.qrUri ? "received" : "-"}

+
+ ) : null} + {selected ? (

{t("walletNetworkWarning")} diff --git a/src/wallet/useWalletConnectLogin.ts b/src/wallet/useWalletConnectLogin.ts index f61d5ea..31be95e 100644 --- a/src/wallet/useWalletConnectLogin.ts +++ b/src/wallet/useWalletConnectLogin.ts @@ -1,5 +1,5 @@ -import { useCallback, useEffect, useRef, useState } from "react"; -import { useAccount, useConnect, useDisconnect } from "wagmi"; +import { useCallback, useRef, useState } from "react"; +import { useConnect, useDisconnect } from "wagmi"; import { bsc } from "wagmi/chains"; import { hasWalletConnectProjectId } from "./RainbowWalletProvider"; import type { WalletKind } from "./injected"; @@ -45,12 +45,12 @@ function walletConnectDeeplink( export function useWalletConnectLogin() { const available = hasWalletConnectProjectId(); const { completeLogin } = useWallet(); - const { address, isConnected } = useAccount(); const { connectAsync, connectors } = useConnect(); - const { disconnect } = useDisconnect(); + const { disconnect, disconnectAsync } = useDisconnect(); const [state, setState] = useState("idle"); const [error, setError] = useState(""); const [qrUri, setQrUri] = useState(""); + const [connectedAddress, setConnectedAddress] = useState(""); const pendingRef = useRef(false); const cleanupMessageRef = useRef<(() => void) | null>(null); @@ -61,6 +61,7 @@ export function useWalletConnectLogin() { setState("idle"); setError(""); setQrUri(""); + setConnectedAddress(""); }, []); const start = useCallback( @@ -71,6 +72,7 @@ export function useWalletConnectLogin() { if (!available) return; setError(""); setQrUri(""); + setConnectedAddress(""); pendingRef.current = true; setState("connecting"); @@ -122,8 +124,27 @@ export function useWalletConnectLogin() { connector.emitter.off("message", onMessage); try { + await disconnectAsync().catch(() => undefined); await connector.disconnect().catch(() => undefined); - await connectAsync({ chainId: bsc.id, connector }); + const result = await connectAsync({ chainId: bsc.id, connector }); + const connectedAddress = result.accounts[0]; + if (!connectedAddress) + throw new Error("Wallet connected without an account"); + pendingRef.current = false; + setConnectedAddress(connectedAddress); + console.info("[wallet-login] walletconnect connected", { + address: connectedAddress, + chain: "BNB Chain", + chainId: bsc.id, + }); + window.alert(`扫码成功,已拿到钱包地址:\n${connectedAddress}`); + completeLogin(localWalletToken(connectedAddress), connectedAddress); + console.info("[wallet-login] local wallet session completed", { + address: connectedAddress, + }); + setQrUri(""); + setState("idle"); + disconnect(); } catch (err) { pendingRef.current = false; setState("idle"); @@ -134,17 +155,24 @@ export function useWalletConnectLogin() { cleanupMessageRef.current = null; } }, - [available, connectAsync, connectors], + [ + available, + completeLogin, + connectAsync, + connectors, + disconnect, + disconnectAsync, + ], ); - useEffect(() => { - if (!pendingRef.current || !isConnected || !address) return; - pendingRef.current = false; - completeLogin(localWalletToken(address), address); - setQrUri(""); - setState("idle"); - disconnect(); - }, [address, completeLogin, disconnect, isConnected]); - - return { available, state, error, qrUri, start, reset }; + return { + available, + state, + error, + qrUri, + address: connectedAddress, + isConnected: Boolean(connectedAddress), + start, + reset, + }; }