redux-dispatcher
Version:
All-in-one simple solution to manage actions with less code
74 lines (57 loc) • 2.15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createFacade;
var _dispatcherMiddleware = require("./dispatcherMiddleware");
var _createReducer = require("./createReducer");
var _injectResult = require("./enhancer/injectResult");
var _injectEvent = _interopRequireDefault(require("./enhancer/injectEvent"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @param: mapDispatchToAction: Object<string: function or object>
*/
function createFacade(key, mapDispatchToAction, enhancer) {
const facade = (0, _createReducer.createReducer)(key, enhancer);
facade.key = key;
for (const dispatch in mapDispatchToAction) if (mapDispatchToAction.hasOwnProperty(dispatch)) {
const {
type,
creator
} = mapDispatchToAction[dispatch];
facade[dispatch] = createDispatcher(type, creator);
}
return facade;
}
;
const createDispatcher = (actionType, actionCreator) => {
const dispatcher = (...args) => {
let payload = typeof actionCreator === 'function' ? actionCreator.apply(null, args) : actionCreator;
if (typeof payload === 'function') // support for thunk
{
const effect = payload;
payload = args;
if (effect.constructor.name === 'AsyncFunction') // you can await on dispatch to get result
return new Promise(resolve => {
resolve(effect({ ..._dispatcherMiddleware.context,
dispatch: _dispatcherMiddleware.store.dispatch,
getState: _dispatcherMiddleware.store.getState
}));
});
effect({ ..._dispatcherMiddleware.context,
dispatch: _dispatcherMiddleware.store.dispatch,
getState: _dispatcherMiddleware.store.getState
});
}
let action = (0, _injectResult.injectResult)({
type: payload.type || actionType,
...payload
});
action = (0, _injectEvent.default)(action);
_dispatcherMiddleware.store.dispatch(action);
return action;
};
dispatcher.toString = () => actionType;
dispatcher.type = actionType;
return dispatcher;
};