redux-resource
Version:
Resource management for Redux.
107 lines (90 loc) • 4.24 kB
JavaScript
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
});
};
}