UNPKG

redux-resource-xhr

Version:

Action creators for Redux Resource using the xhr library

128 lines (104 loc) 4.07 kB
'use strict'; exports.__esModule = true; exports.xhr = exports.crudRequest = undefined; 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; }; var _reduxResource = require('redux-resource'); var _xhr = require('./xhr'); var _xhr2 = _interopRequireDefault(_xhr); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function crudRequest(crudAction, options) { const { dispatch, xhrOptions = {}, transformData, actionDefaults = {}, onPending, onFailed, onSucceeded, onAborted } = options; const { resourceName, resourceType, requestProperties } = actionDefaults; const typeToUse = resourceType || resourceName; const crudActionOption = crudAction ? crudAction : ''; // Catch common configuration problems in dev if (process.env.NODE_ENV !== 'production') { const lowercaseCrud = crudActionOption.toLowerCase(); const isValidCrudType = lowercaseCrud === 'update' || lowercaseCrud === 'delete' || lowercaseCrud === 'read' || lowercaseCrud === 'create'; const { url, uri } = xhrOptions; 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`); } } const crudType = crudActionOption.toUpperCase(); const pendingAction = _extends({}, actionDefaults, { type: _reduxResource.actionTypes[`${crudType}_RESOURCES_PENDING`], requestProperties }); if (onPending) { onPending(pendingAction); } else { dispatch(pendingAction); } const req = (0, _xhr2.default)(xhrOptions, (err, res, body) => { const statusCode = res ? res.statusCode : null; if (req.aborted) { const abortedAction = _extends({}, actionDefaults, { type: _reduxResource.actionTypes[`${crudType}_RESOURCES_IDLE`], requestProperties, res }); if (onAborted) { onAborted(abortedAction, res); } else { dispatch(abortedAction); } } else if (err || statusCode >= 400 || statusCode === 0) { const failedAction = _extends({}, actionDefaults, { type: _reduxResource.actionTypes[`${crudType}_RESOURCES_FAILED`], requestProperties: _extends({}, requestProperties, { statusCode }), res, err }); if (onFailed) { onFailed(failedAction, err, res); } else { dispatch(failedAction); } } else { let resources; if (body) { if (transformData) { resources = transformData(body, options); } else { resources = body; } } else { resources = actionDefaults.resources; } const succeededAction = _extends({}, actionDefaults, { type: _reduxResource.actionTypes[`${crudType}_RESOURCES_SUCCEEDED`], requestProperties: _extends({}, requestProperties, { statusCode }), resources, res }); if (onSucceeded) { onSucceeded(succeededAction, res, body); } else { dispatch(succeededAction); } } }); return req; } exports.crudRequest = crudRequest; exports.xhr = _xhr2.default;