UNPKG

redux-resource

Version:
107 lines (90 loc) 4.24 kB
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; }; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 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; } import setResourceMeta from '../utils/set-resource-meta'; import initialResourceMetaState from './initial-resource-meta-state'; import warning from './warning'; // This helper is used to simplify non-success reducers. Because non-success // reducers don't modify the data – ever – it simplifies the scope of what can // change. // Basically, two things can change: // // 1. Request status for resource IDs in `meta`, if IDs are passed in // 2. Request status for a named request // // A named request's IDs don't change, and neither does the resource. Consequently, // this helper completely defines all of the ways in which the non-success reducers // can change the state. export default function (crudAction, requestStatus) { return function (state, action) { var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, initialResourceMeta = _ref.initialResourceMeta; var resources = action.resources; var mergeMeta = action.mergeMeta; var requestKey = void 0, requestName = void 0; 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; } var idList = void 0; if (resources) { idList = resources.map(function (r) { if ((typeof r === 'undefined' ? 'undefined' : _typeof(r)) === 'object') { return r.id; } else { return r; } }); } else { idList = []; } var statusAttribute = crudAction + 'Status'; var newRequests = void 0, newMeta = void 0, newLists = void 0; if (!requestKey && !idList.length) { if (process.env.NODE_ENV !== 'production') { warning('A Redux Resource action of type ' + action.type + ' was dispatched ' + 'without a "requestKey" or "resources" array. Without one of these ' + 'values, Redux Resource cannot track the request status for this ' + 'CRUD operation. You should check your Action Creators. Read more about ' + 'request tracking at: https://redux-resource.js.org/docs/other-guides/tracking-request-statuses.html', 'NO_OP_NON_SUCCESS_ACTION'); } return state; } if (requestKey) { var existingRequest = state.requests[requestKey] || {}; var newRequest = _extends({}, existingRequest, action.requestProperties, { requestKey: requestKey, resourceType: action.resourceType || action.resourceName, status: requestStatus }); if (requestName) { newRequest.requestName = requestName; } newRequests = _extends({}, state.requests, _defineProperty({}, requestKey, newRequest)); } else { newRequests = state.requests; } // Lists only change when a request succeeds newLists = _extends({}, state.lists); if (idList.length) { newMeta = setResourceMeta({ meta: state.meta, newMeta: _defineProperty({}, statusAttribute, requestStatus), resources: idList, mergeMeta: mergeMeta, initialResourceMeta: _extends({}, initialResourceMetaState, initialResourceMeta) }); } else { newMeta = state.meta; } return _extends({}, state, { requests: newRequests, lists: newLists, meta: newMeta }); }; }