react-redux-fetch
Version:
A declarative and customizable way to fetch data for React components and manage that data in the Redux state
70 lines (47 loc) • 2.25 kB
JavaScript
'use strict';
exports.__esModule = true;
exports.default = createAddToListAction;
var _seamlessImmutable = require('seamless-immutable');
var _seamlessImmutable2 = _interopRequireDefault(_seamlessImmutable);
var _at = require('lodash/at');
var _at2 = _interopRequireDefault(_at);
var _filter = require('lodash/filter');
var _filter2 = _interopRequireDefault(_filter);
var _isArray = require('lodash/isArray');
var _isArray2 = _interopRequireDefault(_isArray);
var _reduce = require('lodash/reduce');
var _reduce2 = _interopRequireDefault(_reduce);
var _find2 = require('lodash/find');
var _find3 = _interopRequireDefault(_find2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function createAddToListAction(state, action) {
if (action.request.meta && action.request.meta.addToList) {
var _action$request$meta$ = action.request.meta.addToList,
path = _action$request$meta$.path,
idName = _action$request$meta$.idName;
var stateValue = path ? (0, _at2.default)(state.value, path)[0] : state.value;
var actionValue = path ? (0, _at2.default)(action.value, path)[0] : action.value;
var actionValueList = !(0, _isArray2.default)(actionValue) ? [actionValue] : actionValue;
var itemsAdded = [];
if (!(0, _isArray2.default)(stateValue)) {
throw Error("Cannot use 'meta.addToList' if the value in the state is not an array!");
}
var newValue = (0, _reduce2.default)(stateValue, function (s, item) {
var _find;
var itemFromActionValueList = (0, _find3.default)(actionValueList, (_find = {}, _find[idName] = item[idName], _find));
if (itemFromActionValueList) {
itemsAdded.push(itemFromActionValueList[idName]);
}
var newS = [].concat(s, [itemFromActionValueList || item]);
return newS;
}, []);
var itemsToAppend = (0, _filter2.default)(actionValueList, function (o) {
return itemsAdded.indexOf(o[idName]) === -1;
});
var finalValue = [].concat(newValue, itemsToAppend);
return Object.assign({}, action, {
value: path ? _seamlessImmutable2.default.from(state.value).setIn(path.split('.'), finalValue, { deep: true }) : finalValue
});
}
return action;
}