UNPKG

redux-observable-sans

Version:
96 lines (81 loc) 3.36 kB
'use strict'; 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); } }; };