redux-action
Version:
redux action utils
86 lines (61 loc) • 2.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.default = createReducer;
var _util = require('./util');
var _clone = require('clone');
var _clone2 = _interopRequireDefault(_clone);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var assign = Object.assign;
/**
* @param {Object} handlers
* @param {Object} defaultState
*/
function createReducer(defaultState, handlers) {
if ((typeof defaultState === 'undefined' ? 'undefined' : _typeof(defaultState)) !== 'object') {
return (0, _util.throwError)('invalid defaultState');
}
if ((typeof handlers === 'undefined' ? 'undefined' : _typeof(handlers)) !== 'object') {
return (0, _util.throwError)('invalid handlers');
}
return function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState;
var action = arguments[1];
var type = action.type;
// TODO: check Immutable data type
if (!type) {
return assign({}, state);
}
var handler = handlers[type];
if (!(0, _util.isFunc)(handler)) {
return assign({}, state);
}
return (0, _clone2.default)(assign({}, state, executeHandler(handler, state, action)));
};
}
/**
* private
*/
function executeHandler(handler, state, action) {
var result = void 0;
if (action.hasOwnProperty('payload')) {
result = handler(action.payload, state, action);
} else {
// TODO: remove this, only standard `payload`
console.warn('non standard action support will be removed');
result = handler(pickAction(action), state, action);
}
return assign({}, state, result);
}
function pickAction(action) {
var ignoreKeys = ['type', 'payload', 'error', 'meta'];
var payload = {};
Object.keys(action).forEach(function (key) {
if (ignoreKeys.indexOf(key) === -1) {
payload[key] = action[key];
}
});
return payload;
}