UNPKG

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
'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; }