lpi-multireducer
Version:
A utility to wrap many copies of a single Redux reducer into a single key-based reducer.
68 lines (49 loc) • 2.42 kB
JavaScript
;
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.default = immutableMultireducer;
var _immutable = require('immutable');
var _immutable2 = _interopRequireDefault(_immutable);
var _key = require('./key');
var _initAction = require('./initAction');
var _initAction2 = _interopRequireDefault(_initAction);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function immutableMultireducer(reducers, reducerKey) {
var isCustomMountPoint = void 0;
if (typeof reducers === 'function') {
if (!reducerKey) {
throw new Error('No key specified for custom mounting of reducer');
} else {
isCustomMountPoint = true;
}
}
var initialState = isCustomMountPoint ? reducers(undefined, _initAction2.default) : new _immutable2.default.Map(reducers).map(function (reducer) {
return reducer(undefined, _initAction2.default);
});
return function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
var action = arguments[1];
if (action && action.meta && action.meta[_key.key]) {
var actionReducerKey = action.meta[_key.key];
// custom mount point
if (isCustomMountPoint && (reducerKey === actionReducerKey || _key.KEY_ALL === actionReducerKey)) {
if (_key.KEY_ALL === actionReducerKey) {
var _extends2;
return reducers(state, _extends({}, action, {
meta: _extends({}, action.meta, (_extends2 = {}, _defineProperty(_extends2, _key.key, reducerKey), _defineProperty(_extends2, _key.KEY_ALL, true), _extends2))
}));
}
return reducers(state, action);
}
// usual multireducer mounting
var reducer = reducers[actionReducerKey];
if (reducer) {
return state.set(actionReducerKey, reducer(state.get(actionReducerKey), action));
}
}
return state;
};
}