Add: viewmodel

This commit is contained in:
Carlos Martinez
2021-06-17 12:08:48 -04:00
parent 3848ac0519
commit 3a29504fd2
7 changed files with 69 additions and 3 deletions

View File

@@ -0,0 +1,7 @@
package dev.carlos.core.domain.network
enum class RequestError {
NO_NETWORK,
BAD_RESPONSE,
UNKNOWN_PROBLEM
}

View File

@@ -3,5 +3,6 @@ package dev.carlos.core.domain.network
sealed class RequestState { sealed class RequestState {
class Success<out T>(val data: T) : RequestState() class Success<out T>(val data: T) : RequestState()
object Loading : RequestState() object Loading : RequestState()
class Error(val throwable: Throwable) : RequestState() class Error(val type: RequestError) : RequestState()
object Empty : RequestState()
} }

View File

@@ -0,0 +1,17 @@
package dev.carlos.core.viewmodel
import androidx.lifecycle.ViewModel
import io.reactivex.disposables.CompositeDisposable
abstract class RxViewModel : ViewModel() {
protected val compositeDisposable by lazy { CompositeDisposable() }
override fun onCleared() {
super.onCleared()
clearCompositeDisposable()
}
private fun clearCompositeDisposable() {
compositeDisposable.clear()
}
}

View File

@@ -11,6 +11,6 @@ class AcronymsDataRepository(
) : AcronymsRepository { ) : AcronymsRepository {
override fun getAcronymDefinition(acronym: String): Single<ShortformModel> { override fun getAcronymDefinition(acronym: String): Single<ShortformModel> {
return remoteDatasource.getAcronymDefinition(acronym).map { it.single()?.toShortformModel() } return remoteDatasource.getAcronymDefinition(acronym).map { it.single().toShortformModel() }
} }
} }

View File

@@ -9,6 +9,8 @@ import dev.carlos.shortform.data.cloud.retrofit.AcronymsRemoteDatasource
import dev.carlos.shortform.data.cloud.retrofit.AcronymsService import dev.carlos.shortform.data.cloud.retrofit.AcronymsService
import dev.carlos.shortform.domain.AcronymsRepository import dev.carlos.shortform.domain.AcronymsRepository
import dev.carlos.shortform.domain.GetAcronymDefinition import dev.carlos.shortform.domain.GetAcronymDefinition
import dev.carlos.shortform.viewmodels.AcronymsViewmodel
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module import org.koin.dsl.module
val acronymsModule = module { val acronymsModule = module {
@@ -22,4 +24,6 @@ val acronymsModule = module {
factory<AcronymsRepository> { AcronymsDataRepository(get()) } factory<AcronymsRepository> { AcronymsDataRepository(get()) }
factory { GetAcronymDefinition(get(), get()) } factory { GetAcronymDefinition(get(), get()) }
viewModel { AcronymsViewmodel(get()) }
} }

View File

@@ -0,0 +1,37 @@
package dev.carlos.shortform.viewmodels
import androidx.lifecycle.MutableLiveData
import dev.carlos.core.domain.network.RequestError
import dev.carlos.core.domain.network.RequestState
import dev.carlos.core.viewmodel.RxViewModel
import dev.carlos.shortform.data.models.ShortformModel
import dev.carlos.shortform.domain.GetAcronymDefinition
import retrofit2.HttpException
import java.net.UnknownHostException
class AcronymsViewmodel(
private val GetAcronymsDefinition: GetAcronymDefinition
) : RxViewModel() {
val acronymDefinition = MutableLiveData<RequestState>()
fun fetchAcronymDefinition(acronym: String) {
val disposable = GetAcronymsDefinition.getAcronymDefinition(acronym)
.doOnSubscribe { acronymDefinition.postValue(RequestState.Loading) }
.subscribe(::handleSuccess, ::handleError)
compositeDisposable.add(disposable)
}
private fun handleSuccess(definition: ShortformModel) {
acronymDefinition.postValue(RequestState.Success(definition))
}
private fun handleError(exception: Throwable) {
when (exception) {
is NoSuchElementException -> acronymDefinition.postValue(RequestState.Empty)
is UnknownHostException -> acronymDefinition.postValue(RequestState.Error(RequestError.NO_NETWORK))
is HttpException -> acronymDefinition.postValue(RequestState.Error(RequestError.BAD_RESPONSE))
else -> acronymDefinition.postValue(RequestState.Error(RequestError.UNKNOWN_PROBLEM))
}
}
}