redux-resource
Version:
Resource management for Redux.
136 lines (108 loc) • 4.93 kB
JavaScript
;
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
// This reducer helper handles the "CRU" in "CRUD".
exports.default = function (state, action, { initialResourceMeta }, updatedMeta) {
const resources = action.resources;
const resourcesIsUndefined = typeof resources === 'undefined';
const hasResources = resources && resources.length;
let requestKey, requestName;
if (action.request && typeof action.request === 'string') {
requestKey = requestName = action.request;
}
if (action.requestKey && typeof action.requestKey === 'string') {
requestKey = action.requestKey;
}
if (action.requestName && typeof action.requestName === 'string') {
requestName = action.requestName;
}
let list;
if (action.list && typeof action.list === 'string') {
list = action.list;
}
if (process.env.NODE_ENV !== 'production') {
if (!resources) {
(0, _warning2.default)(`A 'resources' array was not included in a Redux Resource ` + `"success" action with type "${action.type}. Without a 'resources' ` + `Array, Redux Resource will not be able to track which resources ` + `were affected by this CRUD operation. You should check your Action ` + `Creators to make sure that they always include a 'resources' array. ` + `For more information, refer to the request action documentation at: ` + `https://redux-resource.js.org/docs/requests/request-actions.html`, 'SUCCESS_NO_RESOURCES');
} else if (!Array.isArray(resources)) {
(0, _warning2.default)(`A non-array 'resources' value was passed to a Redux Resource ` + `"success" action with type "${action.type}". 'resources' must be an ` + `array. If your backend returned a single object, be sure to wrap it ` + `inside of an array. If you're using the Redux Resource XHR ` + `library, you can do this using the "transformData" option. ` + `For more information, refer to the request action documentation at: ` + `https://redux-resource.js.org/docs/requests/request-actions.html`, 'NON_ARRAY_RESOURCES');
}
}
// Without resources, a list, or a request key, there is nothing to update
if (!hasResources && !requestKey && !list) {
return state;
}
const newResources = (0, _upsertResources2.default)(state.resources, resources, action.mergeResources);
const newMeta = (0, _setResourceMeta2.default)({
resources,
meta: state.meta,
newMeta: updatedMeta,
mergeMeta: action.mergeMeta,
initialResourceMeta
});
let newRequests;
if (requestKey) {
const existingRequest = state.requests[requestKey] || {};
const newRequest = _extends({}, existingRequest, action.requestProperties, {
resourceType: action.resourceType || action.resourceName,
requestKey,
status: _requestStatuses2.default.SUCCEEDED
});
if (requestName) {
newRequest.requestName = requestName;
}
let newRequestIds;
if (hasResources) {
newRequestIds = resources.map(resource => {
return typeof resource === 'object' ? resource.id : resource;
});
}
newRequest.ids = newRequestIds || [];
newRequests = _extends({}, state.requests, {
[requestKey]: newRequest
});
} else {
newRequests = state.requests;
}
let newLists;
if (list) {
const currentList = state.lists[list] || [];
let newList;
if (action.mergeListIds === false) {
if (hasResources) {
newList = resources.map(resource => {
return typeof resource === 'object' ? resource.id : resource;
});
} else if (!resourcesIsUndefined) {
newList = [];
}
} else if (hasResources) {
newList = Array.prototype.slice.call(currentList);
resources.forEach(resource => {
const id = typeof resource === 'object' ? resource.id : resource;
if (!newList.includes(id)) {
newList.push(id);
}
});
}
newLists = _extends({}, state.lists, {
[list]: newList || currentList
});
} else {
newLists = state.lists;
}
return _extends({}, state, {
resources: newResources,
meta: newMeta,
requests: newRequests,
lists: newLists
});
};
var _setResourceMeta = require('./set-resource-meta');
var _setResourceMeta2 = _interopRequireDefault(_setResourceMeta);
var _upsertResources = require('./upsert-resources');
var _upsertResources2 = _interopRequireDefault(_upsertResources);
var _requestStatuses = require('./request-statuses');
var _requestStatuses2 = _interopRequireDefault(_requestStatuses);
var _warning = require('./warning');
var _warning2 = _interopRequireDefault(_warning);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }