UNPKG

@keccak256-evg/passport-sdk

Version:

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

79 lines 2.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.usePassportInfo = usePassportInfo; const react_1 = require("react"); /** * 获取 Passport 信息的 Hook * 支持自动获取和轮询更新 */ function usePassportInfo(config) { const { sdk, passportAddress, autoFetch = true, pollingInterval = 0 } = config; const [passportInfo, setPassportInfo] = (0, react_1.useState)(null); const [isLoading, setIsLoading] = (0, react_1.useState)(false); const [error, setError] = (0, react_1.useState)(null); // 使用 ref 来跟踪当前的请求状态,避免依赖 isLoading const isRequestingRef = (0, react_1.useRef)(false); // 获取 Passport 信息 - 移除对 isLoading 的依赖 const fetchPassportInfo = (0, react_1.useCallback)(async () => { if (!sdk || !passportAddress || isRequestingRef.current) return; isRequestingRef.current = true; setIsLoading(true); setError(null); try { const info = await sdk.getPassportInfo(passportAddress); setPassportInfo(info); } catch (err) { const error = err instanceof Error ? err : new Error('Failed to fetch passport info'); setError(error); console.error('❌ Error fetching passport info:', error); } finally { setIsLoading(false); isRequestingRef.current = false; } }, [sdk, passportAddress]); // 移除 isLoading 依赖 // 手动刷新 const refresh = (0, react_1.useCallback)(async () => { await fetchPassportInfo(); }, [fetchPassportInfo]); // 清除数据 const clear = (0, react_1.useCallback)(() => { setPassportInfo(null); setError(null); }, []); // 自动获取数据 - 只依赖核心参数 (0, react_1.useEffect)(() => { if (autoFetch && sdk && passportAddress) { fetchPassportInfo(); } }, [autoFetch, sdk, passportAddress, fetchPassportInfo]); // 轮询 - 移除对 isLoading 和 fetchPassportInfo 的依赖 (0, react_1.useEffect)(() => { if (!pollingInterval || pollingInterval <= 0 || !sdk || !passportAddress) { return; } const interval = setInterval(() => { // 直接检查 ref 状态,避免依赖 isLoading if (!isRequestingRef.current && sdk && passportAddress) { fetchPassportInfo(); } }, pollingInterval); return () => clearInterval(interval); }, [pollingInterval, sdk, passportAddress]); // 移除 isLoading 和 fetchPassportInfo 依赖 // 清理数据当依赖变化时 (0, react_1.useEffect)(() => { if (!sdk || !passportAddress) { clear(); } }, [sdk, passportAddress, clear]); return { passportInfo, isLoading, error, refresh, clear, }; } //# sourceMappingURL=usePassportInfo.js.map