UNPKG

react-redux-provide

Version:

Build your UI with React. Manage application state with Redux providers. Persist and share application state with replication. Use pure functions everywhere.

251 lines (202 loc) 7.09 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; exports.getClientState = getClientState; exports.getInitialState = getInitialState; exports.default = createProviderStore; var _redux = require('redux'); var _reduxReplicate = require('redux-replicate'); var _reduxReplicate2 = _interopRequireDefault(_reduxReplicate); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function getClientState(_ref) { var providerKey = _ref.providerKey; if (typeof window !== 'undefined' && window.clientStates) { var clientState = window.clientStates[providerKey]; if (typeof clientState !== 'undefined') { return clientState; } } return null; } function getInitialState(_ref2) { var providerKey = _ref2.providerKey, state = _ref2.state; var clientState = getClientState({ providerKey: providerKey, state: state }); if (clientState) { delete window.clientStates[providerKey]; return state ? _extends({}, state, clientState) : clientState; } return state || {}; } /** * Creates and returns a store specifically for some provider instance. * * @param {Object} providerInstance * @param {Mixed} storeKey Optional * @param {Object} createState Optional * @param {Function} createFunction Optional * @param {Object} creatorStore Optional * @return {Object} * @api public */ function createProviderStore(providerInstance, storeKey, createState, createFunction, creatorStore) { var reducers = providerInstance.reducers, middleware = providerInstance.middleware, enhancer = providerInstance.enhancer, replication = providerInstance.replication; var watchedReducers = {}; var watching = {}; var enhancers = []; var create = void 0; var store = void 0; var setState = void 0; var settingState = void 0; var combinedReducers = void 0; if (typeof storeKey === 'undefined') { storeKey = providerInstance.providerKey; } function unshiftReplication(_ref3) { var key = _ref3.key, reducerKeys = _ref3.reducerKeys, queryable = _ref3.queryable, baseQuery = _ref3.baseQuery, replicator = _ref3.replicator; if (replicator) { if (baseQuery) { if (Array.isArray(reducerKeys)) { for (var reducerKey in baseQuery) { if (reducerKeys.indexOf(reducerKey) < 0) { reducerKeys.push(reducerKey); } } } if (Array.isArray(queryable)) { for (var _reducerKey in baseQuery) { if (queryable.indexOf(_reducerKey) < 0) { queryable.push(_reducerKey); } } } } enhancers.unshift((0, _reduxReplicate2.default)({ key: typeof key === 'undefined' ? storeKey : key, reducerKeys: reducerKeys, queryable: queryable, replicator: replicator, create: createFunction || Boolean(createState), clientState: getClientState(providerInstance), creatorStore: creatorStore })); } } if (middleware) { enhancers.push(_redux.applyMiddleware.apply(null, [].concat(middleware))); } if (enhancer) { enhancers = enhancers.concat(enhancer); } if (replication) { if (Array.isArray(replication)) { var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = replication[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var _ref5 = _step.value; var key = _ref5.key; if (typeof key !== 'undefined') { storeKey = key; break; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } replication.forEach(unshiftReplication); } else { unshiftReplication(replication); } } if (enhancers.length) { create = _redux.compose.apply(undefined, _toConsumableArray(enhancers))(_redux.createStore); } else { create = _redux.createStore; } var initialState = {}; var preInitialState = _extends({}, createState || getInitialState(providerInstance)); Object.keys(reducers).forEach(function (reducerKey) { if (typeof preInitialState[reducerKey] !== 'undefined') { initialState[reducerKey] = preInitialState[reducerKey]; } watchedReducers[reducerKey] = function (state, action) { var nextState = void 0; if (settingState && typeof settingState[reducerKey] !== 'undefined') { nextState = settingState[reducerKey]; } else { nextState = reducers[reducerKey](state, action); } if (watching[reducerKey] && state !== nextState) { watching[reducerKey].forEach(function (fn) { return fn(nextState); }); } return nextState; }; }); combinedReducers = (0, _redux.combineReducers)(watchedReducers); store = create(combinedReducers, initialState); // we use a custom `watch` method with instead of a replicator // since it's slightly more efficient and every clock cycle counts, // especially with potentially thousands or even millions of components store.watch = function (reducerKey, fn) { if (!watching[reducerKey]) { watching[reducerKey] = new Set(); } watching[reducerKey].add(fn); return function () { return watching[reducerKey].delete(fn); }; }; setState = store.setState; store.setState = function () { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var nextState = args[0]; var state = store.getState(); if (setState) { var _loop = function _loop(reducerKey) { var current = state[reducerKey]; var next = nextState[reducerKey]; if (watching[reducerKey] && current !== next) { watching[reducerKey].forEach(function (fn) { return fn(next); }); } }; for (var reducerKey in nextState) { _loop(reducerKey); } setState.apply(undefined, args); } else { settingState = nextState; store.replaceReducer(combinedReducers); settingState = null; } }; return store; }