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