redux-saga and firebase - Can't log the user out in a clean way

Viewed 604

As a preface, let me mention that I have never used redux-saga or Firebase before today. I'm currently playing around to get a feel for both technologies.

I'm probably just missing a small concept, but I can't seem to get signout to work on my app. I figured that I should probably use call() to manage side effects within a saga, but nothing does the trick.

Here's the saga in question:

export function* deauthenticateUser() {
  yield takeLatest(DEAUTHENTICATE_REQUEST, function* () {
    try {
      yield call(firebase.auth().signOut)
      yield put({ type: DEAUTHENTICATE })
    }
    catch (error) {
      yield put({
        type: DEAUTHENTICATE_FAILURE,
        payload: error,
        error: true,
      })
    }
  })
}

I confirmed that calling firebase.auth().signout() directly works, it's only when using call() that I get the error action. Note that there's also no payload when the error gets dispatched.

I checked in Firebase's documentation, and apparently firebase.auth().signout() returns a promise with nothing as it's content. I'm starting to wonder if that wouldn't be the problem, maybe redux-saga does not like having no result in it's promise when using call()?

How would one handle authentication and especially logging out with Firebase and redux-saga?

1 Answers

From a comment from NULL SWEΔT, I had to call yield call([firebase.auth(), firebase.auth().signOut]).

The reason for this is because of JS' context and how this works. More details by reading this and this (read documentation for call([context, fn], ...args)).

Related