UNPKG

redux-conditional

Version:

Make sharing reducers easy by conditionally applying actions to shared Redux reducers.

60 lines (45 loc) 2.06 kB
'use strict'; 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;