1
1
package io.github.mrtry.todolist.app.todo.viewmodel
2
2
3
+ import androidx.lifecycle.LifecycleOwner
4
+ import androidx.lifecycle.MutableLiveData
5
+ import io.github.mrtry.todolist.R
6
+ import io.github.mrtry.todolist.app.todo.ui.navigator.ToDoNavigator
7
+ import io.github.mrtry.todolist.misc.extension.observeNonNull
8
+ import io.github.mrtry.todolist.misc.extension.requireValue
9
+ import io.github.mrtry.todolist.todo.domainservice.ToDoDomainService
3
10
import io.github.mrtry.todolist.todo.entity.ToDo
11
+ import kotlinx.coroutines.CancellationException
12
+ import kotlinx.coroutines.CoroutineScope
13
+ import kotlinx.coroutines.launch
14
+ import timber.log.Timber
4
15
5
- data class ToDoListItemViewModel (
6
- val task : ToDo
7
- )
16
+ class ToDoListItemViewModel (
17
+ todo : ToDo ,
18
+ lifecycleOwner : LifecycleOwner ,
19
+ private val navigator : ToDoNavigator ,
20
+ private val domainService : ToDoDomainService ,
21
+ private val coroutineScope : CoroutineScope
22
+ ) {
23
+ val todo: MutableLiveData <ToDo > = MutableLiveData (todo)
24
+ val isComplete: MutableLiveData <Boolean > = MutableLiveData (todo.isComplete)
25
+ val isSaving: MutableLiveData <Boolean > = MutableLiveData (false )
26
+
27
+ private var currentIsCompleteState: Boolean = isComplete.requireValue()
28
+
29
+ init {
30
+ isComplete.observeNonNull(lifecycleOwner) {
31
+ this .todo.value = this .todo.requireValue().copy(isComplete = it)
32
+ }
33
+
34
+ this .todo.observeNonNull(lifecycleOwner) {
35
+ if (it.isComplete == currentIsCompleteState) return @observeNonNull
36
+
37
+ coroutineScope.launch {
38
+ isSaving.value = true
39
+
40
+ try {
41
+ domainService.save(it)
42
+ currentIsCompleteState = isComplete.requireValue()
43
+ } catch (e: Exception ) {
44
+ if (e is CancellationException ) return @launch
45
+
46
+ Timber .e(e)
47
+ navigator.showSnackBar(R .string.to_do_activity_error_update_task_failed)
48
+ isComplete.value = currentIsCompleteState
49
+ } finally {
50
+ isSaving.value = false
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
0 commit comments