redux-conditional
Version:
Make sharing reducers easy by conditionally applying actions to shared Redux reducers.
52 lines (39 loc) • 1.73 kB
JavaScript
import { conditionalDefaultSubKey, simpleConditional } from './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 ? 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;
};
};
};
export { conditionalReducer, conditionalReducerByKey, conditionalDefaultSubKey, simpleConditional };