@keccak256-evg/passport-sdk
Version:
T-REX Passport SDK for interacting with Passport and Registry contracts
152 lines • 5.35 kB
JavaScript
;
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