@bigmi/react
Version:
React primitives for Bitcoin apps.
41 lines (40 loc) • 1.73 kB
JavaScript
"use client";
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
let react = require("react");
let _bigmi_core = require("@bigmi/core");
//#region src/hooks/useSyncExternalStoreWithTracked.ts
const isPlainObject = (obj) => typeof obj === "object" && !Array.isArray(obj);
function useSyncExternalStoreWithTracked(subscribe, getSnapshot, getServerSnapshot = getSnapshot, isEqual = _bigmi_core.deepEqual) {
const trackedKeys = (0, react.useRef)(/* @__PURE__ */ new Set());
const previousResult = (0, react.useRef)(void 0);
const snapshotCache = (0, react.useRef)(getSnapshot());
const snapshot = (0, react.useSyncExternalStore)((onChange) => subscribe(() => {
snapshotCache.current = getSnapshot();
onChange();
}), () => snapshotCache.current, getServerSnapshot);
const result = (0, react.useMemo)(() => {
if (!isPlainObject(snapshot)) return snapshot;
const trackedResult = { ...snapshot };
Object.defineProperties(trackedResult, Object.fromEntries(Object.entries(trackedResult).map(([key, value]) => [key, {
configurable: false,
enumerable: true,
get: () => {
trackedKeys.current.add(key);
return value;
}
}])));
return trackedResult;
}, [snapshot]);
return (0, react.useMemo)(() => {
if (!trackedKeys.current.size || !previousResult.current) {
previousResult.current = result;
return result;
}
if (!Array.from(trackedKeys.current).some((key) => !isEqual(result[key], previousResult.current[key]))) return previousResult.current;
previousResult.current = result;
return result;
}, [result, isEqual]);
}
//#endregion
exports.useSyncExternalStoreWithTracked = useSyncExternalStoreWithTracked;
//# sourceMappingURL=useSyncExternalStoreWithTracked.js.map