/
BrowseProjectsViewModel.kt
79 lines (63 loc) · 2.65 KB
/
BrowseProjectsViewModel.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package co.joebirch.presentation
import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.arch.lifecycle.ViewModel
import co.joebirch.domain.interactor.bookmark.BookmarkProject
import co.joebirch.domain.interactor.bookmark.UnbookmarkProject
import co.joebirch.domain.interactor.browse.GetProjects
import co.joebirch.domain.model.Project
import co.joebirch.presentation.mapper.ProjectViewMapper
import co.joebirch.presentation.model.ProjectView
import co.joebirch.presentation.state.Resource
import co.joebirch.presentation.state.ResourceState
import io.reactivex.observers.DisposableCompletableObserver
import io.reactivex.observers.DisposableObserver
import javax.inject.Inject
open class BrowseProjectsViewModel @Inject internal constructor(
private val getProjects: GetProjects?,
private val bookmarkProject: BookmarkProject,
private val unBookmarkProject: UnbookmarkProject,
private val mapper: ProjectViewMapper): ViewModel() {
private val liveData: MutableLiveData<Resource<List<ProjectView>>> = MutableLiveData()
init {
fetchProjects()
}
override fun onCleared() {
getProjects?.dispose()
super.onCleared()
}
fun getProjects(): LiveData<Resource<List<ProjectView>>> {
return liveData
}
fun fetchProjects() {
liveData.postValue(Resource(ResourceState.LOADING, null, null))
getProjects?.execute(ProjectsSubscriber())
}
fun bookmarkProject(projectId: String) {
return bookmarkProject.execute(BookmarkProjectsSubscriber(),
BookmarkProject.Params.forProject(projectId))
}
fun unbookmarkProject(projectId: String) {
return unBookmarkProject.execute(BookmarkProjectsSubscriber(),
UnbookmarkProject.Params.forProject(projectId))
}
inner class ProjectsSubscriber: DisposableObserver<List<Project>>() {
override fun onNext(t: List<Project>) {
liveData.postValue(Resource(ResourceState.SUCCESS,
t.map { mapper.mapToView(it) }, null))
}
override fun onComplete() { }
override fun onError(e: Throwable) {
liveData.postValue(Resource(ResourceState.ERROR, null, e.localizedMessage))
}
}
inner class BookmarkProjectsSubscriber: DisposableCompletableObserver() {
override fun onComplete() {
liveData.postValue(Resource(ResourceState.SUCCESS, liveData.value?.data, null))
}
override fun onError(e: Throwable) {
liveData.postValue(Resource(ResourceState.ERROR, liveData.value?.data,
e.localizedMessage))
}
}
}