-
Notifications
You must be signed in to change notification settings - Fork 2
/
PostsViewModel.kt
51 lines (44 loc) · 1.58 KB
/
PostsViewModel.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.fredporciuncula.rxjava2coroutines.posts
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import com.fredporciuncula.rxjava2coroutines.api.PostApi
import com.fredporciuncula.rxjava2coroutines.db.PostDao
import com.fredporciuncula.rxjava2coroutines.livedata.SafeMediatorLiveData
import com.fredporciuncula.rxjava2coroutines.models.toLocalPosts
import com.fredporciuncula.rxjava2coroutines.models.toPosts
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.addTo
import io.reactivex.rxkotlin.subscribeBy
import timber.log.Timber
import javax.inject.Inject
class PostsViewModel @Inject constructor(
private val postApi: PostApi,
private val postDao: PostDao,
val adapter: PostAdapter
) : ViewModel() {
private val disposables = CompositeDisposable()
private val state = SafeMediatorLiveData(initialValue = PostsViewState()).apply {
addSource(postDao.posts()) { update(posts = it.toPosts()) }
}
fun state(): LiveData<PostsViewState> = state
fun refreshPosts() {
postApi
.fetchPosts()
.doOnSubscribe { state.update(isLoading = true) }
.doOnSuccess {
postDao.clearAndInsert(it.toLocalPosts())
}
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onSuccess = {
state.update(isLoading = false)
},
onError = {
Timber.e(it)
state.update(isLoading = false, error = PostsError())
})
.addTo(disposables)
}
override fun onCleared() = disposables.dispose()
}