mirror of
https://github.com/imcarlost/Acronyms.git
synced 2026-04-10 02:46:53 -04:00
Add: viewmodel
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
package dev.carlos.core.domain.network
|
||||||
|
|
||||||
|
enum class RequestError {
|
||||||
|
NO_NETWORK,
|
||||||
|
BAD_RESPONSE,
|
||||||
|
UNKNOWN_PROBLEM
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
17
core/src/main/java/dev/carlos/core/viewmodel/RxViewModel.kt
Normal file
17
core/src/main/java/dev/carlos/core/viewmodel/RxViewModel.kt
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()) }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user