UNPKG

respond-framework

Version:
45 lines (43 loc) 1.62 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 useMemo0 = (func, respond, dependencies = []) => { const last = (0, _react.useRef)(); const subscribe = (0, _react.useCallback)(cb => respond.listen(cb), [respond]); // standard listening to all proxy state changes const createSnapshot = () => respond.snapshot(); const getSnapshot = () => { const next = createSnapshot(); const { snapshot, affected } = last.current ?? {}; const changed = inRender || !last.current || (0, _isChanged.default)(snapshot, next, affected); return changed ? next : snapshot; // not changed -- referentially equal }; let inRender = true; const snapshot = (0, _react.useSyncExternalStore)(subscribe, getSnapshot, createSnapshot); inRender = false; const deps = (0, _react.useMemo)(() => dependencies, dependencies); const cache = (0, _react.useMemo)(() => new WeakMap(), []); const affected = (0, _react.useMemo)(() => new WeakMap(), [snapshot, deps]); const changed = affected !== last.current?.affected; // changes when either snapshot or deps changes const memoized = changed ? func((0, _createSnapProxy.default)(snapshot, { affected, cache }), ...deps) : last.current.memoized; (0, _react.useLayoutEffect)(() => { last.current = { snapshot, affected, memoized, deps }; }); return memoized; }; var _default = exports.default = useMemo0;