redux-action-reducer
Version:
Remove redux reducer boilerplate
91 lines (75 loc) • 3.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var payloadPassThrough = function payloadPassThrough(state, payload) {
return payload;
};
var handlePayloadPassThrough = function handlePayloadPassThrough(actionSpec) {
var maybeActionReducer = actionSpec.slice(-1)[0];
var allButLast = actionSpec.slice(0, -1);
if (typeof maybeActionReducer === 'function') {
return { actionTypes: allButLast, actionReducer: maybeActionReducer };
}
if (typeof maybeActionReducer === 'string') {
return { actionTypes: actionSpec, actionReducer: payloadPassThrough };
}
throw new Error('[redux-action-reducer] Arguments passed to createReducer must either contain a reducer function or none at all (payload pass-through).');
};
var createReducer = function createReducer() {
for (var _len = arguments.length, actionHandlers = Array(_len), _key = 0; _key < _len; _key++) {
actionHandlers[_key] = arguments[_key];
}
return function () {
var defaultValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var actions = actionHandlers.reduce(function (acc, actionSpec) {
actionSpec = [].concat(actionSpec);
var _handlePayloadPassThr = handlePayloadPassThrough(actionSpec),
actionTypes = _handlePayloadPassThr.actionTypes,
actionReducer = _handlePayloadPassThr.actionReducer;
actionTypes.forEach(function (actionType) {
if (typeof actionType === 'undefined') {
throw new Error('[redux-action-reducer] An action type passed to createReducer is undefined');
}
acc[actionType] = actionReducer;
});
return acc;
}, {});
return function (state, _ref) {
var type = _ref.type,
payload = _ref.payload,
error = _ref.error;
if (actions[type]) {
return actions[type](state, payload, error);
}
return typeof state === 'undefined' ? defaultValue : state;
};
};
};
exports.default = createReducer;
var whenError = exports.whenError = function whenError() {
var reducer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : payloadPassThrough;
return function (state, payload, error) {
return error ? reducer(state, payload) : state;
};
};
var whenSuccess = exports.whenSuccess = function whenSuccess() {
var reducer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : payloadPassThrough;
return function (state, payload, error) {
return error ? state : reducer(state, payload);
};
};
var extendReducer = exports.extendReducer = function extendReducer(reducer) {
return function () {
for (var _len2 = arguments.length, actionHandlers = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
actionHandlers[_key2] = arguments[_key2];
}
return function () {
var defaultValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var extraReducer = createReducer.apply(undefined, actionHandlers)(defaultValue);
return function (state, action) {
return extraReducer(reducer(state, action), action);
};
};
};
};