redux-resource-plugins
Version:
Official plugins for Redux Resource
63 lines (49 loc) • 2.15 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; };
import { upsertResources, setResourceMeta, requestStatuses, actionTypes } from 'redux-resource';
// This plugin adds support for "compound documents," or including multiple
// resource types in a single action.
export default function includedResources(resourceType) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return function (state, action) {
var initialResourceMeta = options.initialResourceMeta;
var includedResources = action.includedResources,
mergeMeta = action.mergeMeta,
mergeResources = action.mergeResources,
type = action.type;
var isReadType = type === actionTypes.READ_RESOURCES_SUCCEEDED;
var isCreateType = type === actionTypes.CREATE_RESOURCES_SUCCEEDED;
var isUpdateType = type === 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
var includedResourceList = includedResources[resourceType];
if (!includedResourceList) {
return state;
}
var resources = upsertResources(state.resources, includedResourceList, mergeResources);
var newMeta = {
readStatus: requestStatuses.SUCCEEDED
};
if (isCreateType) {
newMeta.createStatus = requestStatuses.SUCCEEDED;
} else if (isUpdateType) {
newMeta.updateStatus = requestStatuses.SUCCEEDED;
}
var meta = setResourceMeta({
resources: includedResourceList,
meta: state.meta,
newMeta: newMeta,
initialResourceMeta: initialResourceMeta,
mergeMeta: mergeMeta
});
return _extends({}, state, {
meta: meta,
resources: resources
});
};
}