UNPKG

@bigmi/react

Version:

React primitives for Bitcoin apps.

41 lines (40 loc) 1.73 kB
"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