redux-resource-plugins
Version:
Official plugins for Redux Resource
63 lines (48 loc) • 2.06 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 = includedResources;
var _reduxResource = require('redux-resource');
// This plugin adds support for "compound documents," or including multiple
// resource types in a single action.
function includedResources(resourceType, options = {}) {
return (state, action) => {
const { initialResourceMeta } = options;
const { includedResources, mergeMeta, mergeResources, type } = action;
const isReadType = type === _reduxResource.actionTypes.READ_RESOURCES_SUCCEEDED;
const isCreateType = type === _reduxResource.actionTypes.CREATE_RESOURCES_SUCCEEDED;
const isUpdateType = type === _reduxResource.actionTypes.UPDATE_RESOURCES_SUCCEEDED;
if (!isReadType && !isCreateType && !isUpdateType) {
return state;
}
// If this action has no includedResources, then there is nothing to do
if (!includedResources) {
return state;
}
// If there are no included resources for this slice, then we do nothing
const includedResourceList = includedResources[resourceType];
if (!includedResourceList) {
return state;
}
const resources = (0, _reduxResource.upsertResources)(state.resources, includedResourceList, mergeResources);
const newMeta = {
readStatus: _reduxResource.requestStatuses.SUCCEEDED
};
if (isCreateType) {
newMeta.createStatus = _reduxResource.requestStatuses.SUCCEEDED;
} else if (isUpdateType) {
newMeta.updateStatus = _reduxResource.requestStatuses.SUCCEEDED;
}
const meta = (0, _reduxResource.setResourceMeta)({
resources: includedResourceList,
meta: state.meta,
newMeta,
initialResourceMeta,
mergeMeta
});
return _extends({}, state, {
meta,
resources
});
};
}