redux-act-classy
Version:
Make Redux classier with Async Lifecycle Actions that take a modern approach to redux action creation.
77 lines • 2.94 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
var _ = require("lodash");
var defaultConfig = {
dispatchLifecycleActions: true
};
exports.buildAClassyMiddleware = function (config) { return function (_a) {
var dispatch = _a.dispatch, getState = _a.getState;
return function (next) { return function (action) {
var dispatchLifecycleActions = Object.assign(defaultConfig, config).dispatchLifecycleActions;
var actionIsAClass = !_.isPlainObject(action);
if (actionIsAClass) {
var actionAsObject_1 = extractNonFunctionFields(action);
var isAsynchronousAction = _.isFunction(action.perform);
if (isAsynchronousAction) {
if (dispatchLifecycleActions) {
dispatch({
actionData: actionAsObject_1,
type: action.constructor.OnStart
});
}
return action
.perform(dispatch, getState)
.then(function (successResult) {
return dispatchLifecycleActions &&
dispatch({
actionData: actionAsObject_1,
type: action.constructor.OnSuccess,
successResult: successResult
});
})
.catch(function (errorResult) {
return dispatchLifecycleActions &&
dispatch({
actionData: actionAsObject_1,
type: action.constructor.OnError,
errorResult: errorResult
});
})
.finally(function () {
return dispatchLifecycleActions &&
dispatch({
actionData: actionAsObject_1,
type: action.constructor.OnComplete
});
});
}
else {
return next(__assign({}, actionAsObject_1));
}
}
else {
return next(action);
}
}; };
}; };
var extractNonFunctionFields = function (obj) {
var cleanedObj = {};
Object.keys(obj)
.filter(function (key) { return !_.isFunction(obj[key]); })
.forEach(function (key) {
cleanedObj[key] = obj[key];
});
return cleanedObj;
};
//# sourceMappingURL=Middleware.js.map