react-async-saga-reducer
Version:
Use redux saga with useReducer hook to handle side effects without Redux
31 lines (30 loc) • 1.15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useAsyncSagaReducer = void 0;
var React = require("react");
var redux_saga_1 = require("redux-saga");
exports.useAsyncSagaReducer = function (reducer, saga, initialState) {
var _a = React.useReducer(reducer, initialState), state = _a[0], reactDispatch = _a[1];
var stateRef = React.useRef(state);
React.useEffect(function () {
stateRef.current = state;
}, [state]);
var sagaChannel = React.useMemo(function () {
var channel = redux_saga_1.stdChannel();
var dispatch = function (action) {
reactDispatch(action);
Promise.resolve().then(function () {
channel.put(action);
});
};
var getState = function () { return stateRef.current; };
return { channel: channel, dispatch: dispatch, getState: getState };
}, []);
React.useEffect(function () {
var task = redux_saga_1.runSaga(sagaChannel, saga);
return function () {
task.cancel();
};
}, [sagaChannel]);
return [state, sagaChannel.dispatch];
};