package auth.presentation import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import auth.domain.repository.AuthRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import com.google.firebase.messaging.FirebaseMessaging import javax.inject.Inject data class AuthState( val isLoading: Boolean = false, val error: String? = null, val isAuthenticated: Boolean = false ) @HiltViewModel class AuthViewModel @Inject constructor( private val repository: AuthRepository ) : ViewModel() { private val _state = MutableStateFlow(AuthState(isAuthenticated = repository.isAuthenticated())) val state: StateFlow = _state.asStateFlow() init { viewModelScope.launch { repository.isAuthenticatedFlow().collect { authenticated -> _state.update { it.copy(isAuthenticated = authenticated) } if (authenticated) { updatePushToken() } } } } fun checkAuth() { _state.update { it.copy(isAuthenticated = repository.isAuthenticated()) } } fun login(userName: String, password: String) { viewModelScope.launch { _state.update { it.copy(isLoading = true, error = null) } repository.login(userName, password) .onSuccess { _state.update { it.copy(isLoading = false, isAuthenticated = true) } updatePushToken() } .onFailure { e -> _state.update { it.copy(isLoading = false, error = e.message) } } } } fun register(userName: String, password: String) { viewModelScope.launch { _state.update { it.copy(isLoading = true, error = null) } repository.register(userName, password) .onSuccess { _state.update { it.copy(isLoading = false, isAuthenticated = true) } updatePushToken() } .onFailure { e -> _state.update { it.copy(isLoading = false, error = e.message) } } } } private fun updatePushToken() { FirebaseMessaging.getInstance().token.addOnCompleteListener { task -> if (task.isSuccessful) { val token = task.result viewModelScope.launch { repository.updatePushToken(token) } } } } }