Skip to content

Commit 43b2c39

Browse files
fix: deduplicate logic and observe IdTokenListener in addition to AuthStateListener
1 parent 1656841 commit 43b2c39

1 file changed

Lines changed: 20 additions & 24 deletions

File tree

auth/src/main/java/com/firebase/ui/auth/FirebaseAuthUI.kt

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.google.firebase.Firebase
2525
import com.google.firebase.FirebaseApp
2626
import com.google.firebase.auth.FirebaseAuth
2727
import com.google.firebase.auth.FirebaseAuth.AuthStateListener
28+
import com.google.firebase.auth.FirebaseAuth.IdTokenListener
2829
import com.google.firebase.auth.FirebaseUser
2930
import com.google.firebase.auth.auth
3031
import 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

Comments
 (0)