UNPKG

redux-saga-watch-actions

Version:

Easily create watchers to map actions to sagas

72 lines (59 loc) 2.42 kB
import invariant from 'tiny-invariant'; export const createCancelTask = tasks => key => { if (!tasks[key]) { return; } const task = tasks[key].task; if (!task) { return; } const result = task.cancel(); delete tasks[key]; return result; }; export const createCancelAllTasks = (tasks, cancelTask) => () => Object.keys(tasks).map(key => cancelTask(key)); export const createInjectSaga = (tasks, cancelTask, runSaga) => function () { let _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, key = _ref.key, saga = _ref.saga, args = _ref.args; !key ? process.env.NODE_ENV !== "production" ? invariant(false, 'injectSaga expects a key option to identify this saga') : invariant(false) : void 0; !saga ? process.env.NODE_ENV !== "production" ? invariant(false, 'injectSaga expects a saga option to specify which saga to run') : invariant(false) : void 0; !(args === undefined || Array.isArray(args)) ? process.env.NODE_ENV !== "production" ? invariant(false, 'injectSaga expects args option to be undefined or an array of args') : invariant(false) : void 0; let task; let prevSaga; if (tasks[key]) { task = tasks[key].task; prevSaga = tasks[key].prevSaga; } if (task && prevSaga !== saga) { cancelTask(key); task = undefined; } const alreadyRunning = task && typeof task.isRunning === 'function' ? task.isRunning() : false; if (task === undefined || !alreadyRunning) { task = args ? runSaga(saga, args) : runSaga(saga); tasks[key] = { task, prevSaga: saga }; } return task; }; const createSagaMiddlewareHelpers = function createSagaMiddlewareHelpers(sagaMiddleware) { let tasks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; !(sagaMiddleware && typeof sagaMiddleware.run === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'createSagaMiddlewareHelpers expects a sagaMiddleware to include a run method') : invariant(false) : void 0; const runSaga = function runSaga() { return sagaMiddleware.run(...arguments); }; const cancelTask = createCancelTask(tasks); const cancelAllTasks = createCancelAllTasks(tasks, cancelTask); const injectSaga = createInjectSaga(tasks, cancelTask, runSaga); return { cancelAllTasks, cancelTask, injectSaga, runSaga }; }; export default createSagaMiddlewareHelpers;