Search code examples
firebasefirebase-authenticationredux-saga

Redux-saga firebase onAuthStateChanged eventChannel


How to handle firebase auth state observer in redux saga?

firebase.auth().onAuthStateChanged((user) => {

});

I want to run APP_START saga when my app starts which will run firebase.auth().onAuthStateChanged observer and will run other sagas depending on the callback.

As I understand eventChannel is right way to do it. But I don't understand how to make it work with firebase.auth().onAuthStateChanged.

Can someone show how to put firebase.auth().onAuthStateChanged in to eventChannel?


Solution

  • You can use eventChannel. Here is an example code:

    function getAuthChannel() {
      if (!this.authChannel) {
        this.authChannel = eventChannel(emit => {
          const unsubscribe = firebase.auth().onAuthStateChanged(user => emit({ user }));
          return unsubscribe;
        });
      }
      return this.authChannel;
    }
    
    function* watchForFirebaseAuth() {
      ...
      // This is where you wait for a callback from firebase
      const channel = yield call(getAuthChannel);
      const result = yield take(channel);
      // result is what you pass to the emit function. In this case, it's an object like { user: { name: 'xyz' } }
      ...
    }
    

    When you are done, you can close the channel using this.authChannel.close().