redux-resource
Version:
Resource management for Redux.
115 lines (91 loc) • 3.88 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 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.
exports.default = function (crudAction, requestStatus) {
return function (state, action, { initialResourceMeta } = {}) {
const resources = action.resources;
const mergeMeta = action.mergeMeta;
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 idList;
if (resources) {
idList = resources.map(r => {
if (typeof r === 'object') {
return r.id;
} else {
return r;
}
});
} else {
idList = [];
}
const statusAttribute = `${crudAction}Status`;
let newRequests, newMeta, newLists;
if (!requestKey && !idList.length) {
if (process.env.NODE_ENV !== 'production') {
(0, _warning2.default)(`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) {
const existingRequest = state.requests[requestKey] || {};
const newRequest = _extends({}, existingRequest, action.requestProperties, {
requestKey,
resourceType: action.resourceType || action.resourceName,
status: requestStatus
});
if (requestName) {
newRequest.requestName = requestName;
}
newRequests = _extends({}, state.requests, {
[requestKey]: newRequest
});
} else {
newRequests = state.requests;
}
// Lists only change when a request succeeds
newLists = _extends({}, state.lists);
if (idList.length) {
newMeta = (0, _setResourceMeta2.default)({
meta: state.meta,
newMeta: { [statusAttribute]: requestStatus },
resources: idList,
mergeMeta,
initialResourceMeta: _extends({}, _initialResourceMetaState2.default, initialResourceMeta)
});
} else {
newMeta = state.meta;
}
return _extends({}, state, {
requests: newRequests,
lists: newLists,
meta: newMeta
});
};
};
var _setResourceMeta = require('../utils/set-resource-meta');
var _setResourceMeta2 = _interopRequireDefault(_setResourceMeta);
var _initialResourceMetaState = require('./initial-resource-meta-state');
var _initialResourceMetaState2 = _interopRequireDefault(_initialResourceMetaState);
var _warning = require('./warning');
var _warning2 = _interopRequireDefault(_warning);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
;