Blog>
Snippets

Creating and Using a Simple Event Channel

Demonstrate creating an event channel that listens to window resize events and triggers a Redux-Saga to handle the event.
import { eventChannel } from 'redux-saga';
import { takeEvery, call, put } from 'redux-saga/effects';
First, import the necessary functions from 'redux-saga'.
function createResizeChannel() {
  return eventChannel(emitter => {
    const resizeHandler = () => emitter(window.innerWidth);
    window.addEventListener('resize', resizeHandler);
    // The subscriber must return an unsubscribe function
    return () => {
      window.removeEventListener('resize', resizeHandler);
    };
  });
}
Define a function to create an event channel that listens to window resize events and emits the window's inner width.
function* handleResize(width) {
  // Handle the resize event here. Maybe update state with the new width.
  yield put({ type: 'WINDOW_RESIZE', width });
}
Define a saga to handle the resize events. It receives the window width and dispatches an action to update the state.
function* watchResize() {
  const channel = yield call(createResizeChannel);
  yield takeEvery(channel, handleResize);
}
Define a watcher saga that listens to all events from the created resize channel and calls 'handleResize' saga for each event.
export default watchResize;
Export the watcher saga by default.