OXYGENHUB
# 40ab4df121e0 oxygenhub-android / app / src / main / java / io / oxygenhub / android / ui / proposals / ProposalsViewModel.kt
1.3 KiB · last changed Land proposals from the phone (closes #17) 10 days ago source blame history raw
1
package io.oxygenhub.android.ui.proposals
2
3
import androidx.lifecycle.ViewModel
4
import io.oxygenhub.android.api.HubApi
5
import io.oxygenhub.android.api.Proposal
6
import io.oxygenhub.android.api.ProposalState
7
import io.oxygenhub.android.ui.common.Load
8
import io.oxygenhub.android.ui.common.load
9
import kotlinx.coroutines.Job
10
import kotlinx.coroutines.flow.MutableStateFlow
11
import kotlinx.coroutines.flow.StateFlow
12
import kotlinx.coroutines.flow.asStateFlow
13
14
/** A repository's proposals: open (with drafts), landed, closed or all; newest first. */
15
class ProposalsViewModel(
16
    private val api: HubApi,
17
    val owner: String,
18
    val name: String,
19
) : ViewModel() {
20
    private val _state = MutableStateFlow<Load<List<Proposal>>>(Load.Loading)
21
    val state: StateFlow<Load<List<Proposal>>> = _state.asStateFlow()
22
23
    private val _filter = MutableStateFlow(ProposalState.Open)
24
    val filter: StateFlow<ProposalState> = _filter.asStateFlow()
25
26
    private var job: Job? = null
27
28
    init {
29
        refresh()
30
    }
31
32
    fun setFilter(state: ProposalState) {
33
        if (state == _filter.value) return
34
        _filter.value = state
35
        _state.value = Load.Loading
36
        refresh()
37
    }
38
39
    fun refresh() {
40
        val state = _filter.value
41
        job = load(_state, job) { api.proposals(owner, name, state).sortedByDescending { it.number } }
42
    }
43
}