respond-framework
Version:
create as fast you think
45 lines (43 loc) • 1.62 kB
JavaScript
;
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;