diff --git a/app/src/main/java/com/runnect/runnect/presentation/base/BaseViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/base/BaseViewModel.kt index 55119415..bbdb57f0 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/base/BaseViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/base/BaseViewModel.kt @@ -2,11 +2,15 @@ package com.runnect.runnect.presentation.base import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.runnect.runnect.domain.common.toLog import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch import retrofit2.HttpException import timber.log.Timber @@ -15,6 +19,23 @@ import java.net.UnknownHostException abstract class BaseViewModel : ViewModel() { + sealed interface EventState { + object Empty : EventState + data class ShowToast(val message: String) : EventState + data class ShowSnackBar(val message: String) : EventState + data class NetworkError(val message: String) : EventState + data class UnknownError(val message: String) : EventState + } + + private val _eventState: MutableSharedFlow = MutableSharedFlow() + val eventState: SharedFlow = _eventState.asSharedFlow() + + protected fun sendEvent(event: EventState) { + viewModelScope.launch { + _eventState.emit(event) + } + } + open val exceptionHandler = CoroutineExceptionHandler { _, throwable -> Timber.tag(throwable::class.java.simpleName).e(throwable) @@ -22,9 +43,15 @@ abstract class BaseViewModel : ViewModel() { is SocketException, is HttpException, is UnknownHostException -> { + sendEvent( + EventState.NetworkError(throwable.toLog()) + ) Timber.e(throwable) } else -> { + sendEvent( + EventState.UnknownError(throwable.toLog()) + ) Timber.e(throwable) } }