redux-observable-sans
Version:
Use redux without any boilerplate
96 lines (81 loc) • 3.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.toAction = exports.socketEpics = exports.queryAction = exports.queryEpic = exports.commandAction = exports.commandEpic = exports.baseEpic = 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 _reduxObservable = require('redux-observable');
var _operators = require('rxjs/operators');
var _changeCase = require('change-case');
var baseEpic = exports.baseEpic = function baseEpic(type) {
var typeUc = (0, _changeCase.constantCase)(type);
var typeLc = (0, _changeCase.camelCase)(type);
return function (socket, tokenFn) {
var addToken = typeof tokenFn !== 'function' ? function (payload) {
return payload;
} : function (payload, state$, deps) {
return Object.assign(payload, tokenFn(state$, deps));
};
return function (action$, state$, deps) {
return action$.pipe((0, _reduxObservable.ofType)(typeUc), (0, _operators.map)(function (_ref) {
var payload = _ref.payload;
var all = addToken(payload, state$, deps);
socket.emit(typeLc, all);
return _extends({}, payload, {
type: (0, _changeCase.constantCase)(payload.type)
});
}));
};
};
};
/**
* commandEpic
* Listens for `COMMAND` actions,
* then emits a `command` event via socket (with token if tokenFn defined)
* then emits a "CONVERTED_COMMAND" redux action
*
* eg, { type: `COMMAND`, payload: { type: `doSomething`, data: `whatevs` }}
* causes socket.emit(`command`, { type: doSomething, data: `whatevs`, token: { ... } })
* and returns { type: `DO_SOMETHING`, payload: `whatevs` }
*/
var commandEpic = exports.commandEpic = baseEpic('command');
var commandAction = exports.commandAction = function commandAction(dispatch) {
return function (type) {
return function (payload) {
return dispatch({ type: 'COMMAND', payload: { type: type, payload: payload } });
};
};
};
/**
* queryEpic
* Listens for `QUERY` actions,
* then emits a `query` event via socket (with token if tokenFn defined)
* then emits a "CONVERTED_COMMAND" redux action
*
* eg, see commandEpic example
*/
var queryEpic = exports.queryEpic = baseEpic('query');
var queryAction = exports.queryAction = function queryAction(dispatch) {
return function (type) {
return function (payload) {
return dispatch({ type: 'QUERY', payload: { type: type, payload: payload } });
};
};
};
var socketEpics = exports.socketEpics = function socketEpics(socket, tokenFn) {
return [commandEpic(socket, tokenFn), queryEpic(socket, tokenFn)];
};
// handle events sent form backend
var toAction = exports.toAction = function toAction(dispatch) {
return function (data) {
var type = (0, _changeCase.constantCase)(data.type);
var reduxAction = _extends({}, data, { type: type });
dispatch(reduxAction);
if (data.type === 'CommandRejected' || data.type === 'QueryRejected') {
var reduxActionFailure = _extends({}, data.payload, {
type: (0, _changeCase.constantCase)(data.payload.type) + '_FAILURE'
});
dispatch(reduxActionFailure);
}
};
};