UNPKG

reactive-react-redux

Version:

React Redux binding with React Hooks and Proxy

79 lines (58 loc) 3.12 kB
"use strict"; 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;