@@ -25,6 +25,7 @@ import com.google.firebase.Firebase
2525import com.google.firebase.FirebaseApp
2626import com.google.firebase.auth.FirebaseAuth
2727import com.google.firebase.auth.FirebaseAuth.AuthStateListener
28+ import com.google.firebase.auth.FirebaseAuth.IdTokenListener
2829import com.google.firebase.auth.FirebaseUser
2930import com.google.firebase.auth.auth
3031import kotlinx.coroutines.CancellationException
@@ -255,29 +256,8 @@ class FirebaseAuthUI private constructor(
255256 fun authStateFlow (): Flow <AuthState > {
256257 // Create a flow from FirebaseAuth state listener
257258 val firebaseAuthFlow = callbackFlow {
258- // Set initial state based on current auth state
259- val initialState = auth.currentUser?.let { user ->
260- // Check if email verification is required
261- if (! user.isEmailVerified &&
262- user.email != null &&
263- user.providerData.any { it.providerId == " password" }
264- ) {
265- AuthState .RequiresEmailVerification (
266- user = user,
267- email = user.email!!
268- )
269- } else {
270- AuthState .Success (result = null , user = user, isNewUser = false )
271- }
272- } ? : AuthState .Idle
273-
274- trySend(initialState)
275-
276- // Create auth state listener
277- val authStateListener = AuthStateListener { firebaseAuth ->
278- val currentUser = firebaseAuth.currentUser
279- val state = if (currentUser != null ) {
280- // Check if email verification is required
259+ fun buildState (currentUser : FirebaseUser ? ): AuthState {
260+ return if (currentUser != null ) {
281261 if (! currentUser.isEmailVerified &&
282262 currentUser.email != null &&
283263 currentUser.providerData.any { it.providerId == " password" }
@@ -296,15 +276,31 @@ class FirebaseAuthUI private constructor(
296276 } else {
297277 AuthState .Idle
298278 }
299- trySend(state)
279+ }
280+
281+ // Set initial state based on current auth state
282+ val initialState = buildState(auth.currentUser)
283+
284+ trySend(initialState)
285+
286+ // Create auth state listener
287+ val authStateListener = AuthStateListener { firebaseAuth ->
288+ trySend(buildState(firebaseAuth.currentUser))
289+ }
290+
291+ // AuthStateListener does not reliably fire for account linking, but IdTokenListener does.
292+ val idTokenListener = IdTokenListener { firebaseAuth ->
293+ trySend(buildState(firebaseAuth.currentUser))
300294 }
301295
302296 // Add listener
303297 auth.addAuthStateListener(authStateListener)
298+ auth.addIdTokenListener(idTokenListener)
304299
305300 // Remove listener when flow collection is cancelled
306301 awaitClose {
307302 auth.removeAuthStateListener(authStateListener)
303+ auth.removeIdTokenListener(idTokenListener)
308304 }
309305 }
310306
0 commit comments