redux-data-structures
Version:
Creator functions for common reducers
83 lines (77 loc) • 3.27 kB
JavaScript
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var empty = {
byId: {},
allIds: []
};
export default (function (_ref) {
var _ref$initialState = _ref.initialState,
initialState = _ref$initialState === undefined ? empty : _ref$initialState,
_ref$addActionTypes = _ref.addActionTypes,
addActionTypes = _ref$addActionTypes === undefined ? [] : _ref$addActionTypes,
_ref$changeActionType = _ref.changeActionTypes,
changeActionTypes = _ref$changeActionType === undefined ? [] : _ref$changeActionType,
_ref$removeActionType = _ref.removeActionTypes,
removeActionTypes = _ref$removeActionType === undefined ? [] : _ref$removeActionType,
_ref$keyGetter = _ref.keyGetter,
keyGetter = _ref$keyGetter === undefined ? function (action) {
return action.payload.id;
} : _ref$keyGetter,
_ref$itemGetter = _ref.itemGetter,
itemGetter = _ref$itemGetter === undefined ? function (action) {
return Object.assign({}, action.payload);
} : _ref$itemGetter,
_ref$itemModifier = _ref.itemModifier,
itemModifier = _ref$itemModifier === undefined ? function (item, action) {
return Object.assign({}, item, action.payload);
} : _ref$itemModifier,
_ref$resetActionTypes = _ref.resetActionTypes,
resetActionTypes = _ref$resetActionTypes === undefined ? [] : _ref$resetActionTypes,
_ref$emptyActionTypes = _ref.emptyActionTypes,
emptyActionTypes = _ref$emptyActionTypes === undefined ? [] : _ref$emptyActionTypes;
return function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
var action = arguments[1];
var type = action.type;
if (addActionTypes.includes(type)) {
return add(state, action, keyGetter, itemGetter);
} else if (changeActionTypes.includes(type)) {
return change(state, action, keyGetter, itemModifier);
} else if (removeActionTypes.includes(type)) {
return remove(state, action, keyGetter);
} else if (resetActionTypes.includes(type)) {
return initialState;
} else if (emptyActionTypes.includes(type)) {
return empty;
} else {
return state;
}
};
});
var add = function add(state, action, keyGetter, itemGetter) {
var key = keyGetter(action);
return {
byId: Object.assign({}, state.byId, _defineProperty({}, key, itemGetter(action))),
allIds: state.allIds.includes(key) ? state.allIds : state.allIds.concat(key)
};
};
var change = function change(state, action, keyGetter, itemModifier) {
var key = keyGetter(action);
var item = state.byId[key];
return item === undefined ? state : {
byId: Object.assign({}, state.byId, _defineProperty({}, key, itemModifier(item, action))),
allIds: state.allIds
};
};
var remove = function remove(state, action, keyGetter) {
var key = keyGetter(action);
var item = state.byId[key];
if (item === undefined) return state;
var byId = Object.assign({}, state.byId);
delete byId[key];
return {
byId: byId,
allIds: state.allIds.filter(function (x) {
return x !== key;
})
};
};