fix: actively fetch FCM token on login if not cached

- LoginViewModel now calls Tasks.await(FirebaseMessaging.getInstance().token)
  to actively fetch the FCM token if not yet saved in prefs
- Previous code relied solely on onNewToken callback, which may not fire
  before the user logs in on a fresh install
This commit is contained in:
2026-06-13 13:23:29 -04:00
parent f1f263225f
commit 395c84f75e
2 changed files with 15 additions and 1 deletions

View File

@@ -8,10 +8,14 @@ import com.devlab.app.data.api.SessionManager
import com.devlab.app.data.repository.AuthRepository
import com.devlab.app.data.model.FcmRegisterRequest
import com.devlab.app.util.PreferencesManager
import com.google.android.gms.tasks.Tasks
import com.google.firebase.messaging.FirebaseMessaging
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.coroutines.Dispatchers
data class LoginUiState(
val username: String = "",
@@ -100,7 +104,17 @@ class LoginViewModel : ViewModel() {
private suspend fun registerFcmToken() {
try {
val fcmToken = prefs.getFcmToken()
var fcmToken = prefs.getFcmToken()
if (fcmToken.isBlank()) {
fcmToken = withContext(Dispatchers.IO) {
try {
Tasks.await(FirebaseMessaging.getInstance().token)
} catch (_: Exception) { "" }
}
if (fcmToken.isNotBlank()) {
prefs.saveFcmToken(fcmToken)
}
}
if (fcmToken.isNotBlank()) {
val service = RetrofitClient.getApiService()
service.registerFcmToken(FcmRegisterRequest(fcmToken))