reactive-react-redux
Version:
React Redux binding with React Hooks and Proxy
79 lines (58 loc) • 3.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useTrackedState = void 0;
var _react = require("react");
var _Provider = require("./Provider");
var _utils = require("./utils");
var _deepProxy = require("./deepProxy");
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var useTrackedState = function useTrackedState() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _opts$customContext = opts.customContext,
customContext = _opts$customContext === void 0 ? _Provider.defaultContext : _opts$customContext;
var _useReducer = (0, _react.useReducer)(function (c) {
return c + 1;
}, 0),
_useReducer2 = _slicedToArray(_useReducer, 2),
forceUpdate = _useReducer2[1];
var _useContext = (0, _react.useContext)(customContext),
state = _useContext.state,
subscribe = _useContext.subscribe;
var affected = new WeakMap();
var lastTracked = (0, _react.useRef)(null);
(0, _utils.useIsomorphicLayoutEffect)(function () {
lastTracked.current = {
state: state,
affected: affected,
cache: new WeakMap(),
/* eslint-disable no-nested-ternary, indent, @typescript-eslint/indent */
assumeChangedIfNotAffected: opts.unstable_forceUpdateForStateChange ? true : opts.unstable_ignoreIntermediateObjectUsage ? false :
/* default */
null
/* eslint-enable no-nested-ternary, indent, @typescript-eslint/indent */
};
});
(0, _react.useEffect)(function () {
var callback = function callback(nextState) {
if (lastTracked.current.state === nextState || !(0, _deepProxy.isDeepChanged)(lastTracked.current.state, nextState, lastTracked.current.affected, lastTracked.current.cache, lastTracked.current.assumeChangedIfNotAffected)) {
// not changed
return;
}
forceUpdate();
};
var unsubscribe = subscribe(callback);
return unsubscribe;
}, [subscribe]);
if (process.env.NODE_ENV !== 'production') {
// eslint-disable-next-line react-hooks/rules-of-hooks
(0, _utils.useAffectedDebugValue)(state, affected);
}
var proxyCache = (0, _react.useRef)(new WeakMap()); // per-hook proxyCache
return (0, _deepProxy.createDeepProxy)(state, affected, proxyCache.current);
};
exports.useTrackedState = useTrackedState;