fix: add observer compatibility to auth APIs

This commit is contained in:
Kyle Fang
2020-08-13 12:37:05 +08:00
parent d5d1470e81
commit b0eb681306
2 changed files with 17 additions and 6 deletions

View File

@@ -1254,7 +1254,7 @@ export namespace FirebaseAuthTypes {
*
* @param listener A listener function which triggers when auth state changed (for example signing out).
*/
onAuthStateChanged(listener: AuthListenerCallback): () => void;
onAuthStateChanged(listener: CallbackOrObserver<AuthListenerCallback>): () => void;
/**
* Listen for changes in ID token.
@@ -1276,7 +1276,7 @@ export namespace FirebaseAuthTypes {
*
* @param listener A listener function which triggers when the users ID token changes.
*/
onIdTokenChanged(listener: AuthListenerCallback): () => void;
onIdTokenChanged(listener: CallbackOrObserver<AuthListenerCallback>): () => void;
/**
* Adds a listener to observe changes to the User object. This is a superset of everything from
@@ -1302,7 +1302,7 @@ export namespace FirebaseAuthTypes {
* @react-native-firebase
* @param listener A listener function which triggers when the users data changes.
*/
onUserChanged(listener: AuthListenerCallback): () => void;
onUserChanged(listener: CallbackOrObserver<AuthListenerCallback>): () => void;
/**
* Signs the user out.
@@ -1634,6 +1634,8 @@ export namespace FirebaseAuthTypes {
}
}
type CallbackOrObserver<T extends (...args: any[]) => any> = T | { next: T };
declare module '@react-native-firebase/auth' {
// tslint:disable-next-line:no-duplicate-imports required otherwise doesn't work
import { ReactNativeFirebase } from '@react-native-firebase/app';

View File

@@ -129,7 +129,14 @@ class FirebaseAuthModule extends FirebaseModule {
};
}
onAuthStateChanged(listener) {
_parseListener(listenerOrObserver) {
return typeof listenerOrObserver === 'object'
? listenerOrObserver.next.bind(listenerOrObserver)
: listenerOrObserver;
}
onAuthStateChanged(listenerOrObserver) {
const listener = this._parseListener(listenerOrObserver);
const subscription = this.emitter.addListener(
this.eventNameForApp('onAuthStateChanged'),
listener,
@@ -143,7 +150,8 @@ class FirebaseAuthModule extends FirebaseModule {
return () => subscription.remove();
}
onIdTokenChanged(listener) {
onIdTokenChanged(listenerOrObserver) {
const listener = this._parseListener(listenerOrObserver);
const subscription = this.emitter.addListener(
this.eventNameForApp('onIdTokenChanged'),
listener,
@@ -157,7 +165,8 @@ class FirebaseAuthModule extends FirebaseModule {
return () => subscription.remove();
}
onUserChanged(listener) {
onUserChanged(listenerOrObserver) {
const listener = this._parseListener(listenerOrObserver);
const subscription = this.emitter.addListener(this.eventNameForApp('onUserChanged'), listener);
if (this._authResult) {
Promise.resolve().then(() => {