UNPKG

redux-polling

Version:

Convenient way to support polling in your Redux app so you can focus on the business logic

150 lines (111 loc) 4.08 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); exports.start = start; exports.stop = stop; exports.reset = reset; exports.request = request; exports.addEntries = addEntries; var _actions = require('./actions'); var _reducer = require('./reducer'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var timeouts = {}; function start(_ref, action, next) { var getState = _ref.getState, dispatch = _ref.dispatch; var state = getState(); var pollingName = action.meta.pollingName; var _getPollingState = (0, _reducer.getPollingState)(state, pollingName), isActive = _getPollingState.isActive; if (isActive) { return false; } next(action); var requestAction = (0, _actions.createAction)(_actions.actionTypes.request, action.meta); dispatch(requestAction); return true; } function stop(_, action, next) { next(action); var _action$meta = action.meta, onStop = _action$meta.callbacks.onStop, pollingName = _action$meta.pollingName; if (typeof onStop === 'function') { onStop(); } clearTimeout(timeouts[pollingName]); return true; } function reset(_, action, next) { next(action); var _action$meta2 = action.meta, onReset = _action$meta2.callbacks.onReset, pollingName = _action$meta2.pollingName; if (typeof onReset === 'function') { onReset(); } clearTimeout(timeouts[pollingName]); return true; } function request(_ref2, action) { var getState = _ref2.getState, dispatch = _ref2.dispatch; var state = getState(); var pollingName = action.meta.pollingName; var _getPollingState2 = (0, _reducer.getPollingState)(state, pollingName), isActive = _getPollingState2.isActive, requestPayload = _getPollingState2.requestPayload; if (!isActive) { return false; } var _action$meta3 = action.meta, callbacks = _action$meta3.callbacks, pollingInterval = _action$meta3.pollingInterval; var pollingFunc = callbacks.polling; return Promise.resolve(pollingFunc.apply(undefined, (0, _toConsumableArray3.default)(requestPayload).concat([getState]))).then(function (data) { var entries = void 0; if (data.multipleEntries === true) { if (Array.isArray(data.entries) === true) { entries = data.entries; } else { throw new Error('Entries must be an array when providing multiple entries'); } } else { entries = [data]; } var addEntriesAction = (0, _actions.createAction)(_actions.actionTypes.addEntries, action.meta, entries); dispatch(addEntriesAction); }, function (err) { return err; } // If exception during polling - do nothing ).then(function () { timeouts[pollingName] = setTimeout(function () { var requestAction = (0, _actions.createAction)(_actions.actionTypes.request, action.meta); dispatch(requestAction); }, pollingInterval); }); } function addEntries(_ref3, action, next) { var getState = _ref3.getState; var shouldAddEntry = action.meta.callbacks.shouldAddEntry; var entries = action.payload; if (!Array.isArray(entries)) { throw new Error('Payload for ' + _actions.actionTypes.addEntries + ' must be array of entries'); } if (typeof shouldAddEntry === 'function') { entries = entries.filter(function (entry) { return shouldAddEntry(entry, getState); }); } if (entries.length > 0) { next((0, _extends3.default)({}, action, { payload: entries })); } return entries.length; }