redux-resource-xhr
Version:
Action creators for Redux Resource using the xhr library
121 lines (101 loc) • 4.26 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 { actionTypes } from 'redux-resource';
import xhr from './xhr';
function crudRequest(crudAction, options) {
var dispatch = options.dispatch,
_options$xhrOptions = options.xhrOptions,
xhrOptions = _options$xhrOptions === undefined ? {} : _options$xhrOptions,
transformData = options.transformData,
_options$actionDefaul = options.actionDefaults,
actionDefaults = _options$actionDefaul === undefined ? {} : _options$actionDefaul,
onPending = options.onPending,
onFailed = options.onFailed,
onSucceeded = options.onSucceeded,
onAborted = options.onAborted;
var resourceName = actionDefaults.resourceName,
resourceType = actionDefaults.resourceType,
requestProperties = actionDefaults.requestProperties;
var typeToUse = resourceType || resourceName;
var crudActionOption = crudAction ? crudAction : '';
// Catch common configuration problems in dev
if (process.env.NODE_ENV !== 'production') {
var lowercaseCrud = crudActionOption.toLowerCase();
var isValidCrudType = lowercaseCrud === 'update' || lowercaseCrud === 'delete' || lowercaseCrud === 'read' || lowercaseCrud === 'create';
var url = xhrOptions.url,
uri = xhrOptions.uri;
if (!typeToUse) {
console.warn('A resourceType was not passed to a Redux Resource Action ' + 'creator. A resourceType must be passed so that Redux Resource ' + 'knows which resource slice to update. Refer to the Request Actions ' + 'guide for more: https://redux-resource.js.org/docs/requests/request-actions.html');
}
if (!isValidCrudType) {
console.warn('An invalid "crudAction" was passed to a Redux Resource action creator. ' + 'It must be one of: "create", "read", "update", "delete"');
}
if (!url && !uri) {
console.warn('No URL was passed to a Redux Resource action creator. You must ' + 'pass either "xhrOptions.url" or "xhrOptions.uri". For more, refer to ' + 'the Redux Resource XHR documentation: ' + 'https://redux-resource.js.org/docs/extras/redux-resource-xhr.html');
}
}
var crudType = crudActionOption.toUpperCase();
var pendingAction = _extends({}, actionDefaults, {
type: actionTypes[crudType + '_RESOURCES_PENDING'],
requestProperties: requestProperties
});
if (onPending) {
onPending(pendingAction);
} else {
dispatch(pendingAction);
}
var req = xhr(xhrOptions, function (err, res, body) {
var statusCode = res ? res.statusCode : null;
if (req.aborted) {
var abortedAction = _extends({}, actionDefaults, {
type: actionTypes[crudType + '_RESOURCES_IDLE'],
requestProperties: requestProperties,
res: res
});
if (onAborted) {
onAborted(abortedAction, res);
} else {
dispatch(abortedAction);
}
} else if (err || statusCode >= 400 || statusCode === 0) {
var failedAction = _extends({}, actionDefaults, {
type: actionTypes[crudType + '_RESOURCES_FAILED'],
requestProperties: _extends({}, requestProperties, {
statusCode: statusCode
}),
res: res,
err: err
});
if (onFailed) {
onFailed(failedAction, err, res);
} else {
dispatch(failedAction);
}
} else {
var resources = void 0;
if (body) {
if (transformData) {
resources = transformData(body, options);
} else {
resources = body;
}
} else {
resources = actionDefaults.resources;
}
var succeededAction = _extends({}, actionDefaults, {
type: actionTypes[crudType + '_RESOURCES_SUCCEEDED'],
requestProperties: _extends({}, requestProperties, {
statusCode: statusCode
}),
resources: resources,
res: res
});
if (onSucceeded) {
onSucceeded(succeededAction, res, body);
} else {
dispatch(succeededAction);
}
}
});
return req;
}
export { crudRequest, xhr };