ola-toolkit
Version:
ola 开发工具套件
121 lines (86 loc) • 3.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.initialState = undefined;
exports.createBasicReducer = createBasicReducer;
exports.createExtensibleReducer = createExtensibleReducer;
var _immutable = require('immutable');
var _immutable2 = _interopRequireDefault(_immutable);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var initialState = exports.initialState = (0, _immutable.Map)({
loaded: false,
loading: false,
error: null,
payload: (0, _immutable.Map)({
page: (0, _immutable.Map)()
})
});
/**
* 创建简单Reducer
* @param actionNames
* @returns {Function}
*/
function createBasicReducer(actionNames) {
return function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
switch (action.type) {
case actionNames.fetch:
return state.set('loaded', false).set('loading', true);
case actionNames.success:
case actionNames.update:
return state.set('loading', false).set('loaded', true).set('error', null).set('payload', action.payload);
case actionNames.fail:
return state.set('loading', false).set('loaded', false).set('error', action.payload).set('payload', initialState.get('payload'));
case actionNames.clear:
return state.set('loading', false).set('loaded', false).set('error', null).set('payload', initialState.get('payload'));
default:
return state;
}
};
}
/**
* 创建可扩展数据的 Reducer
* @param keys
* @param actionNames
* @returns {Function}
*
* @example
* makeExtensibleReducer([{
key: 'topicList',
type: Array
}], ...);
*/
function createExtensibleReducer(actionNames) {
var keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
return function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
switch (action.type) {
case actionNames.fetch:
return state.set('loading', true);
case actionNames.success:
var payload = action.payload;
keys.forEach(function (key) {
var toBeExtend = state.get('payload').get(key);
if (_immutable.List.isList(payload.get(key))) {
toBeExtend = toBeExtend || (0, _immutable.List)();
payload = payload.set(key, toBeExtend.concat(payload.get(key)));
} else if (_immutable.Map.isMap(payload.get(key))) {
toBeExtend = toBeExtend || (0, _immutable.Map)();
payload = payload.set(key, toBeExtend.merge(payload.get(key)));
}
});
return state.set('loading', false).set('loaded', true).set('error', null).set('payload', payload);
case actionNames.update:
return state.set('loading', false).set('loaded', true).set('error', null).set('payload', action.payload);
case actionNames.fail:
return state.set('loading', false).set('loaded', false).set('error', action.get('error')).set('payload', action.get('payload'));
case actionNames.clear:
return state.set('loading', false).set('loaded', false).set('payload', initialState.get('payload')).set('error', null);
default:
return state;
}
};
}