| 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 |
} |