Advertisement
Guest User

Untitled

a guest
Sep 16th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.41 KB | None | 0 0
  1. class PersonViewModel(
  2. private val interactor: IPersonInteractor
  3. ) : ViewModel(), IPersonViewModel {
  4.  
  5. private val viewState: MutableLiveData<MviViewState> = MutableLiveData()
  6.  
  7. private val changesDisposable = CompositeDisposable()
  8. private val actionsDisposable = CompositeDisposable()
  9.  
  10. private val reducer: (MviViewState, MviChange) -> MviViewState =
  11. { initialViewState, change ->
  12. when (change) {
  13. is LoadingChange -> processLoadingChange(initialViewState)
  14. is PersonChange -> processPersonChange(initialViewState, change)
  15. is NoPersonChange -> processNoPersonChange(initialViewState)
  16. is ErrorChange -> processErrorChange(initialViewState)
  17. }.also { newViewState ->
  18. viewState.value = newViewState
  19. }
  20. }
  21.  
  22. init {
  23. Log.d("zavanton - PersonViewModel is init")
  24. viewState.value = MviViewState(firstName = "Anton", lastName = "Zavyalov", loading = false)
  25. }
  26.  
  27. override fun onViewCreated() {
  28. // to restore the view - pass a copy of the existing value to viewState
  29. viewState.value = viewState.value?.copy()
  30. }
  31.  
  32. override fun getViewState(): LiveData<MviViewState> = viewState
  33.  
  34. override fun listenForActions(actions: Subject<MviAction>) {
  35. actionsDisposable.add(
  36. actions.subscribe { action ->
  37. when (action) {
  38. is FindAction -> processFindById(action)
  39. }
  40. })
  41. }
  42.  
  43. override fun onCleared() {
  44. super.onCleared()
  45. Log.d("zavanton - onCleared")
  46.  
  47. if (!changesDisposable.isDisposed) {
  48. changesDisposable.dispose()
  49. }
  50. if (!actionsDisposable.isDisposed) {
  51. actionsDisposable.dispose()
  52. }
  53. }
  54.  
  55. private fun processFindById(findAction: FindAction) {
  56. val loadPersonObservable: Observable<MviChange> =
  57. interactor.fetchPersonById(findAction.id)
  58. .subscribeOn(Schedulers.io())
  59. .observeOn(AndroidSchedulers.mainThread())
  60. .startWith(LoadingChange)
  61.  
  62. viewState.value?.apply {
  63. changesDisposable.add(loadPersonObservable
  64. .scan(this, reducer) // reduce
  65. .distinctUntilChanged()
  66. .doOnNext { Log.d("zavanton - received state: $it") }
  67. .subscribe(
  68. { state -> viewState.value = state }, // render state
  69. { Log.e(it, "zavanton - error while loading person: $it") }
  70. )
  71. )
  72. }
  73. }
  74.  
  75. private fun processLoadingChange(initialViewState: MviViewState): MviViewState =
  76. initialViewState.copy(loading = true)
  77.  
  78. private fun processPersonChange(initialViewState: MviViewState, demoChange: PersonChange): MviViewState =
  79. initialViewState.copy(
  80. firstName = demoChange.person.firstName,
  81. lastName = demoChange.person.lastName,
  82. loading = false
  83. )
  84.  
  85. private fun processNoPersonChange(initialViewState: MviViewState): MviViewState =
  86. initialViewState.copy(
  87. firstName = "Not Available",
  88. lastName = "Not Available",
  89. loading = false
  90. )
  91.  
  92. private fun processErrorChange(initialViewState: MviViewState): MviViewState =
  93. initialViewState.copy(
  94. firstName = "Error",
  95. lastName = "Error",
  96. loading = false
  97. )
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement