From b0eb68130618bbdf6358c135d7c393e46fe1756d Mon Sep 17 00:00:00 2001 From: Kyle Fang Date: Thu, 13 Aug 2020 12:37:05 +0800 Subject: [PATCH] fix: add observer compatibility to auth APIs --- packages/auth/lib/index.d.ts | 8 +++++--- packages/auth/lib/index.js | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/auth/lib/index.d.ts b/packages/auth/lib/index.d.ts index 4eb53171..20673d73 100644 --- a/packages/auth/lib/index.d.ts +++ b/packages/auth/lib/index.d.ts @@ -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): () => 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): () => 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): () => void; /** * Signs the user out. @@ -1634,6 +1634,8 @@ export namespace FirebaseAuthTypes { } } +type CallbackOrObserver 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'; diff --git a/packages/auth/lib/index.js b/packages/auth/lib/index.js index 24110ce9..d020699d 100644 --- a/packages/auth/lib/index.js +++ b/packages/auth/lib/index.js @@ -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(() => {