UNPKG

@keccak256-evg/passport-sdk

Version:

T-REX Passport SDK for interacting with Passport and Registry contracts

152 lines 5.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useUnifiedPassportSDK = useUnifiedPassportSDK; const react_1 = require("react"); const UnifiedPassportSDK_1 = require("../UnifiedPassportSDK"); /** * 统一 Passport SDK Hook * 自动检测和管理钱包连接,提供 SDK 实例 */ function useUnifiedPassportSDK(config) { const [sdk, setSdk] = (0, react_1.useState)(null); const [isInitializing, setIsInitializing] = (0, react_1.useState)(false); const [error, setError] = (0, react_1.useState)(null); // 使用 ref 来跟踪初始化状态,避免循环依赖 const isInitializingRef = (0, react_1.useRef)(false); // 获取 EIP-1193 Provider const getEIP1193Provider = (0, react_1.useCallback)(() => { // 检查常见的钱包 provider if (typeof window === 'undefined') { return null; } // MetaMask if (window.ethereum?.isMetaMask) { return window.ethereum; } // 通用 ethereum provider if (window.ethereum) { return window.ethereum; } // 其他钱包 providers const providers = [ window.coinbaseWalletExtension, window.bitkeep?.ethereum, window.trustwallet, ]; for (const provider of providers) { if (provider?.isConnected?.()) { return provider; } } // 如果有多个 provider,返回第一个 if (window.ethereum) { return window.ethereum; } return null; }, []); // 初始化 SDK - 移除对 isInitializing 的依赖 const initialize = (0, react_1.useCallback)(async () => { if (isInitializingRef.current) return; isInitializingRef.current = true; setIsInitializing(true); setError(null); try { const provider = getEIP1193Provider(); if (!provider) { throw new Error('No EIP-1193 compatible wallet provider found. Please install MetaMask or another compatible wallet.'); } const sdkConfig = { provider, chain: config.chain, env: config.env || 'dev', registryAddress: config.registryAddress, }; const newSdk = new UnifiedPassportSDK_1.UnifiedPassportSDK(sdkConfig); setSdk(newSdk); console.log('✅ UnifiedPassportSDK initialized successfully'); } catch (err) { const error = err instanceof Error ? err : new Error('Failed to initialize SDK'); setError(error); console.error('❌ Error initializing UnifiedPassportSDK:', error); } finally { setIsInitializing(false); isInitializingRef.current = false; } }, [config, getEIP1193Provider]); // 移除 isInitializing 依赖 // 清理 SDK const cleanup = (0, react_1.useCallback)(() => { if (sdk) { // 移除事件监听器等清理工作 setSdk(null); setError(null); console.log('🧹 UnifiedPassportSDK cleaned up'); } }, [sdk]); // 获取 provider 信息 const providerInfo = (0, react_1.useMemo)(() => { if (!sdk) return null; return sdk.getProviderInfo(); }, [sdk]); // 自动初始化 (0, react_1.useEffect)(() => { if (config.autoInitialize !== false) { initialize(); } // 清理函数 return () => { if (sdk) { cleanup(); } }; }, [config.userAddress, initialize]); // 添加 initialize 依赖但已经稳定 // 监听账户和网络变化 (0, react_1.useEffect)(() => { if (!sdk) return; let mounted = true; // 监听账户变化 const handleAccountsChanged = (accounts) => { if (!mounted) return; console.log('👤 Accounts changed:', accounts); if (accounts.length === 0) { console.log('🔓 Wallet disconnected'); cleanup(); } }; // 监听网络变化 const handleChainChanged = (chainId) => { if (!mounted) return; console.log('🌐 Chain changed:', chainId); const expectedChainId = `0x${config.chain.id.toString(16)}`; if (chainId !== expectedChainId) { console.warn(`⚠️ Chain mismatch. Expected: ${expectedChainId}, Got: ${chainId}`); } }; // 设置事件监听器 sdk.onAccountsChanged(handleAccountsChanged); sdk.onChainChanged(handleChainChanged); return () => { mounted = false; // 清理事件监听器 if (sdk.removeListener) { sdk.removeListener('accountsChanged', handleAccountsChanged); sdk.removeListener('chainChanged', handleChainChanged); } }; }, [sdk, config.chain.id, cleanup]); return { sdk, isInitializing, error, initialize, cleanup, providerInfo, }; } //# sourceMappingURL=useUnifiedPassportSDK.js.map