redux-thunk-actions
Version:
redux-thunk-actions ===================
91 lines (80 loc) • 3.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createActionThunk = createActionThunk;
var _reduxActions = require('redux-actions');
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
/**
* Creates an async action creator
*
* @param {String} TYPE the type of the action
* @param {Function} fn the function to be called async
* @param {Boolean} suppressException optionally do not throw exceptions
* @return {Funtion} the action creator
*/
function createActionThunk(type, fn, suppressException) {
var _actionCreators;
var TYPE_STARTED = type + '_STARTED';
var TYPE_SUCCEEDED = type + '_SUCCEEDED';
var TYPE_FAILED = type + '_FAILED';
var TYPE_ENDED = type + '_ENDED';
var actionCreators = (_actionCreators = {}, _defineProperty(_actionCreators, TYPE_STARTED, (0, _reduxActions.createAction)(TYPE_STARTED)), _defineProperty(_actionCreators, TYPE_SUCCEEDED, (0, _reduxActions.createAction)(TYPE_SUCCEEDED)), _defineProperty(_actionCreators, TYPE_FAILED, (0, _reduxActions.createAction)(TYPE_FAILED)), _defineProperty(_actionCreators, TYPE_ENDED, (0, _reduxActions.createAction)(TYPE_ENDED)), _actionCreators);
var successActionWithMeta = (0, _reduxActions.createAction)(TYPE_SUCCEEDED, function (_ref) {
var payload = _ref.payload;
return payload;
}, function (_ref2) {
var meta = _ref2.meta;
return meta;
});
var factory = function factory() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return function (dispatch, getState, extra) {
var result = void 0;
var startedAt = new Date().getTime();
dispatch(actionCreators[TYPE_STARTED](args));
var succeeded = function succeeded(data) {
var action = data && data.payload ? successActionWithMeta(data) : actionCreators[TYPE_SUCCEEDED](data);
dispatch(action);
var endedAt = new Date().getTime();
dispatch(actionCreators[TYPE_ENDED]({
elapsed: endedAt - startedAt
}));
return data;
};
var failed = function failed(err) {
var endedAt = new Date().getTime();
dispatch(actionCreators[TYPE_FAILED](err));
dispatch(actionCreators[TYPE_ENDED]({
elapsed: endedAt - startedAt
}));
if (!suppressException) {
throw err;
}
};
try {
result = fn.apply(undefined, args.concat([{ getState: getState, dispatch: dispatch, extra: extra }]));
} catch (error) {
failed(error);
}
// in case of async (promise), use success and fail callbacks.
if (isPromise(result)) {
return result.then(succeeded, failed);
}
return succeeded(result);
};
};
factory.NAME = type;
factory.START = actionCreators[TYPE_STARTED].toString();
factory.STARTED = factory.START;
factory.SUCCEEDED = actionCreators[TYPE_SUCCEEDED].toString();
factory.FAILED = actionCreators[TYPE_FAILED].toString();
factory.ENDED = actionCreators[TYPE_ENDED].toString();
return factory;
}
//helpers
function isPromise(p) {
return p && p.then && p.catch;
}