UNPKG

redux-resource-xhr

Version:

Action creators for Redux Resource using the xhr library

121 lines (101 loc) 4.26 kB
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 };