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 45dc21461c
commit e1e68f5f11
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.repository.AuthRepository
import com.devlab.app.data.model.FcmRegisterRequest import com.devlab.app.data.model.FcmRegisterRequest
import com.devlab.app.util.PreferencesManager 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.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.coroutines.Dispatchers
data class LoginUiState( data class LoginUiState(
val username: String = "", val username: String = "",
@@ -100,7 +104,17 @@ class LoginViewModel : ViewModel() {
private suspend fun registerFcmToken() { private suspend fun registerFcmToken() {
try { 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()) { if (fcmToken.isNotBlank()) {
val service = RetrofitClient.getApiService() val service = RetrofitClient.getApiService()
service.registerFcmToken(FcmRegisterRequest(fcmToken)) service.registerFcmToken(FcmRegisterRequest(fcmToken))

Binary file not shown.