genji-core
Version:
The core lightweight library for genji, based on redux and redux-saga.
81 lines (65 loc) • 2.25 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.combineReducers = combineReducers;
exports.default = createImmerReducer;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
var _immer = _interopRequireDefault(require("immer"));
var _invariant = _interopRequireDefault(require("invariant"));
function combineReducers(reducers) {
return function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var action = arguments.length > 1 ? arguments[1] : undefined;
var hasChanged = false;
var nextState = {};
for (var key in reducers) {
var prevStateKey = state[key];
var nextStateKey = reducers[key](prevStateKey, action);
nextState[key] = nextStateKey;
hasChanged = hasChanged || nextStateKey !== prevStateKey;
}
if (hasChanged == false) {
return state;
} else {
return (0, _objectSpread2.default)({}, state, nextState);
}
};
}
function createImmerReducer(reducers) {
var defaultState = {};
var mutations = {};
for (var key in reducers) {
defaultState[key] = reducers[key].state;
for (var action in reducers[key].mutations) {
mutations[action] = reducers[key].mutations[action];
}
}
return function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var action = arguments.length > 1 ? arguments[1] : undefined;
var addState = {};
var hasAddState = false;
for (var _key in defaultState) {
if (_key in state == false) {
addState[_key] = defaultState[_key];
hasAddState = true;
}
}
if (hasAddState) {
state = (0, _objectSpread2.default)({}, state, addState);
}
var type = action.type;
(0, _invariant.default)(type, 'dispatch: action should be a plain Object with type');
var handler = mutations[type];
if (handler) {
var ret = (0, _immer.default)(state, function (draft) {
handler(draft, action);
});
return ret === undefined ? {} : ret;
} else {
return state;
}
};
}