package me.amitshekhar.learn.kotlin.flow.ui.errorhandling.emitall import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import me.amitshekhar.learn.kotlin.flow.data.api.ApiHelper import me.amitshekhar.learn.kotlin.flow.data.local.DatabaseHelper import me.amitshekhar.learn.kotlin.flow.data.model.ApiUser import me.amitshekhar.learn.kotlin.flow.ui.base.UiState import me.amitshekhar.learn.kotlin.flow.utils.DispatcherProvider class EmitAllViewModel( private val apiHelper: ApiHelper, private val dbHelper: DatabaseHelper, val dispatcherProvider: DispatcherProvider ) : ViewModel() { private val _uiState = MutableStateFlow>>(UiState.Loading) val uiState: StateFlow>> = _uiState init { fetchUsers() } private fun fetchUsers() { viewModelScope.launch(dispatcherProvider.main) { _uiState.value = UiState.Loading apiHelper.getUsers().catch { emitAll(flowOf(emptyList())) }.zip(apiHelper.getUsersWithError().catch { emitAll(flowOf(emptyList())) }) { usersFromApi, moreUsersFromApi -> val allUsersFromApi = mutableListOf() allUsersFromApi.addAll(usersFromApi) allUsersFromApi.addAll(moreUsersFromApi) return@zip allUsersFromApi }.flowOn(dispatcherProvider.io).catch { e -> _uiState.value = UiState.Error(e.toString()) }.collect { _uiState.value = UiState.Success(it) } } } }