UNPKG

respond-framework

Version:
39 lines (37 loc) 1.22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = require("react"); var _createSnapProxy = require("./createSnapProxy.js"); var _isChanged = require("./helpers/isChanged.js"); const useSnapshotPrevState = proxy => { const last = (0, _react.useRef)(); const respond = proxy.respond; const subscribe = (0, _react.useCallback)(cb => respond.subscribe(cb), [respond]); const getSnapshot = () => { const next = proxy.prevState; const { snapshot, affected } = last.current ?? {}; return inRender || (0, _isChanged.default)(snapshot, next, affected) ? next : snapshot; // not changed -- referentially equal }; let inRender = true; const snapshot = (0, _react.useSyncExternalStore)(subscribe, getSnapshot, () => proxy.prevState); inRender = false; const affected = new WeakMap(); const cache = (0, _react.useMemo)(() => new WeakMap(), []); // per-hook proxy cache (0, _react.useLayoutEffect)(() => { last.current = { snapshot, affected }; }); return (0, _createSnapProxy.default)(snapshot, { affected, cache }); }; var _default = exports.default = useSnapshotPrevState;