UNPKG

redux-resource

Version:
136 lines (108 loc) 4.93 kB
'use strict'; 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 }; }