redux-saga-watch-actions
Version:
Easily create watchers to map actions to sagas
72 lines (59 loc) • 2.42 kB
JavaScript
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;