redux-resource-plugins
Version:
Official plugins for Redux Resource
103 lines (83 loc) • 3.55 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; };
exports.default = httpStatusCodes;
var _reduxResource = require('redux-resource');
// End actions can be failed, succeeded, or idle. Idle should be dispatched
// when the request is aborted (with a status code of 0).
const createEndActions = [_reduxResource.actionTypes.CREATE_RESOURCES_FAILED, _reduxResource.actionTypes.CREATE_RESOURCES_SUCCEEDED, _reduxResource.actionTypes.CREATE_RESOURCES_IDLE];
const readEndActions = [_reduxResource.actionTypes.READ_RESOURCES_FAILED, _reduxResource.actionTypes.READ_RESOURCES_SUCCEEDED, _reduxResource.actionTypes.READ_RESOURCES_IDLE];
const updateEndActions = [_reduxResource.actionTypes.UPDATE_RESOURCES_FAILED, _reduxResource.actionTypes.UPDATE_RESOURCES_SUCCEEDED, _reduxResource.actionTypes.UPDATE_RESOURCES_IDLE];
const deleteEndActions = [_reduxResource.actionTypes.DELETE_RESOURCES_FAILED, _reduxResource.actionTypes.DELETE_RESOURCES_SUCCEEDED, _reduxResource.actionTypes.DELETE_RESOURCES_IDLE];
// This sets a new meta property on resource and request metadata: `statusCode`.
// This will be equal to the last status code for a request
function httpStatusCodes(resourceType) {
return function (state, action) {
const typeToCheck = action.resourceType || action.resourceName;
if (typeToCheck !== resourceType) {
return state;
}
const isCreateEndAction = createEndActions.indexOf(action.type) !== -1;
const isReadEndAction = readEndActions.indexOf(action.type) !== -1;
const isUpdateEndAction = updateEndActions.indexOf(action.type) !== -1;
const isDeleteEndAction = deleteEndActions.indexOf(action.type) !== -1;
if (!isCreateEndAction && !isReadEndAction && !isUpdateEndAction && !isDeleteEndAction) {
return state;
}
const statusCode = typeof action.statusCode === 'number' ? action.statusCode : null;
const resources = action.resources;
let request;
const naiveKey = action.requestKey || action.request;
if (naiveKey && typeof naiveKey === 'string') {
request = naiveKey;
}
let newRequests, newMeta, idList;
if (resources) {
idList = resources.map(r => {
if (typeof r === 'object') {
return r.id;
} else {
return r;
}
});
} else {
idList = [];
}
if (request) {
const existingRequest = state.requests[request] || {};
newRequests = _extends({}, state.requests, {
[request]: _extends({}, existingRequest, {
statusCode
})
});
} else {
newRequests = _extends({}, state.requests);
}
if (idList.length) {
let metaPrefix;
if (isCreateEndAction) {
metaPrefix = 'create';
} else if (isReadEndAction) {
metaPrefix = 'read';
} else if (isUpdateEndAction) {
metaPrefix = 'update';
} else if (isDeleteEndAction) {
metaPrefix = 'delete';
}
newMeta = (0, _reduxResource.setResourceMeta)({
meta: state.meta,
newMeta: {
[`${metaPrefix}StatusCode`]: statusCode
},
resources: idList,
mergeMeta: true
});
} else {
newMeta = state.meta;
}
return _extends({}, state, {
requests: newRequests,
meta: newMeta
});
};
}