reactive-react-redux
Version:
React Redux binding with React Hooks and Proxy
105 lines (82 loc) • 3.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Provider = exports.defaultContext = exports.createCustomContext = void 0;
var _react = require("react");
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; }
// -------------------------------------------------------
// context
// -------------------------------------------------------
var warningObject = {
get state() {
throw new Error('Please use <Provider store={...}>');
},
get dispatch() {
throw new Error('Please use <Provider store={...}>');
},
get subscribe() {
throw new Error('Please use <Provider store={...}>');
}
};
var calculateChangedBits = function calculateChangedBits(a, b) {
return a.dispatch !== b.dispatch || a.subscribe !== b.subscribe ? 1 : 0;
};
var createCustomContext = function createCustomContext() {
var w = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : warningObject;
var c = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : calculateChangedBits;
return (0, _react.createContext)(w, c);
};
exports.createCustomContext = createCustomContext;
var defaultContext = createCustomContext(); // -------------------------------------------------------
// provider
// -------------------------------------------------------
exports.defaultContext = defaultContext;
var Provider = function Provider(_ref) {
var store = _ref.store,
_ref$customContext = _ref.customContext,
customContext = _ref$customContext === void 0 ? defaultContext : _ref$customContext,
children = _ref.children;
var _useState = (0, _react.useState)(store.getState()),
_useState2 = _slicedToArray(_useState, 2),
state = _useState2[0],
setState = _useState2[1];
var listeners = (0, _react.useRef)([]);
(0, _react.useEffect)(function () {
listeners.current.forEach(function (listener) {
return listener(state);
});
}, [state]);
var subscribe = (0, _react.useCallback)(function (listener) {
listeners.current.push(listener);
var unsubscribe = function unsubscribe() {
var index = listeners.current.indexOf(listener);
listeners.current.splice(index, 1);
}; // run once in case the state is already changed
listener(store.getState());
return unsubscribe;
}, [store]);
(0, _react.useEffect)(function () {
var callback = function callback() {
var nextState = store.getState();
listeners.current.forEach(function (listener) {
return listener(nextState);
});
setState(nextState);
};
var unsubscribe = store.subscribe(callback);
callback(); // in case it's already changed
return unsubscribe;
}, [store]);
return (0, _react.createElement)(customContext.Provider, {
value: {
state: state,
dispatch: store.dispatch,
subscribe: subscribe
}
}, children);
};
exports.Provider = Provider;