UNPKG

reactive-react-redux

Version:

React Redux binding with React Hooks and Proxy

76 lines (59 loc) 2.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useSelector = void 0; var _react = require("react"); var _Provider = require("./Provider"); var _utils = require("./utils"); 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 isFunction = function isFunction(f) { return typeof f === 'function'; }; var defaultEqualityFn = function defaultEqualityFn(a, b) { return a === b; }; var useSelector = function useSelector(selector, eqlFn, opts) { var _ref = opts || !isFunction(eqlFn) && eqlFn || {}, _ref$equalityFn = _ref.equalityFn, equalityFn = _ref$equalityFn === void 0 ? isFunction(eqlFn) ? eqlFn : defaultEqualityFn : _ref$equalityFn, _ref$customContext = _ref.customContext, customContext = _ref$customContext === void 0 ? _Provider.defaultContext : _ref$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 selected = selector(state); var ref = (0, _react.useRef)(null); (0, _utils.useIsomorphicLayoutEffect)(function () { ref.current = { equalityFn: equalityFn, selector: selector, state: state, selected: selected }; }); (0, _react.useEffect)(function () { var callback = function callback(nextState) { try { if (ref.current.state === nextState || ref.current.equalityFn(ref.current.selected, ref.current.selector(nextState))) { // not changed return; } } catch (e) {// ignored (stale props or some other reason) } forceUpdate(); }; var unsubscribe = subscribe(callback); return unsubscribe; }, [subscribe]); return selected; }; exports.useSelector = useSelector;