redux-conditional
Version:
Make sharing reducers easy by conditionally applying actions to shared Redux reducers.
60 lines (45 loc) • 2.06 kB
JavaScript
;
exports.__esModule = true;
exports.simpleConditional = exports.conditionalDefaultSubKey = exports.conditionalReducerByKey = exports.conditionalReducer = undefined;
var _simpleConditional = require('./simpleConditional');
var unknownAction = { type: Symbol('REDUX CONDITIONAL UNKNOWN TYPE') };
var conditionalReducer = function conditionalReducer(conditionFn, reducer) {
return function (state, action) {
return reducer(state, conditionFn(state, action) ? action : unknownAction);
};
};
var normalizeTargets = function normalizeTargets(targets, conditionFnMaker) {
if (Array.isArray(targets)) {
return targets.map(function (key) {
return { key: key, conditionFn: conditionFnMaker(key) };
});
}
return Object.keys(targets).map(function (key) {
return { key: key, conditionFn: conditionFnMaker(targets[key]) };
});
};
// simpleConditional().default expects the "data" can be accessed by action[conditionalKey][conditionalDefaultSubKey]
var conditionalReducerByKey = function conditionalReducerByKey(targets) {
var _ref = arguments.length <= 1 || arguments[1] === undefined ? (0, _simpleConditional.simpleConditional)()['default'] : arguments[1];
var conditionMaker = _ref.conditionMaker;
var normalized = normalizeTargets(targets, conditionMaker);
return function (reducer) {
return function (state, action) {
var nextState = {};
var changed = false;
normalized.forEach(function (target) {
var subState = state;
if (state) {
subState = state[target.key];
}
nextState[target.key] = conditionalReducer(target.conditionFn, reducer)(subState, action);
changed = changed || nextState[target.key] !== subState;
});
return changed ? nextState : state;
};
};
};
exports.conditionalReducer = conditionalReducer;
exports.conditionalReducerByKey = conditionalReducerByKey;
exports.conditionalDefaultSubKey = _simpleConditional.conditionalDefaultSubKey;
exports.simpleConditional = _simpleConditional.simpleConditional;