98 lines
3.1 KiB
Kotlin
98 lines
3.1 KiB
Kotlin
package com.hyperling.expensetracker
|
|
|
|
import androidx.lifecycle.ViewModel
|
|
import androidx.lifecycle.viewModelScope
|
|
import kotlinx.coroutines.flow.MutableStateFlow
|
|
import kotlinx.coroutines.flow.SharingStarted
|
|
import kotlinx.coroutines.flow.combine
|
|
import kotlinx.coroutines.flow.flatMapLatest
|
|
import kotlinx.coroutines.flow.stateIn
|
|
import kotlinx.coroutines.flow.update
|
|
import kotlinx.coroutines.launch
|
|
|
|
class ExpenseViewModel (
|
|
private val dao: ExpenseDao,
|
|
): ViewModel() {
|
|
|
|
private val _sortType = MutableStateFlow(SortType.NAME)
|
|
private val _state = MutableStateFlow(ExpenseState())
|
|
|
|
private val _expenses = _sortType
|
|
.flatMapLatest { sortType ->
|
|
when(sortType) {
|
|
SortType.NAME -> dao.selectExpensesName()
|
|
SortType.COST -> dao.selectExpensesCost()
|
|
SortType.RATE -> dao.selectExpensesRate()
|
|
}
|
|
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
|
|
|
|
val state = combine(_state, _sortType, _expenses) { state, sortType, expenses ->
|
|
state.copy(
|
|
expenses = expenses,
|
|
sortType = sortType
|
|
)
|
|
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), ExpenseState())
|
|
|
|
fun onEvent(event: ExpenseEvent) {
|
|
when(event) {
|
|
is ExpenseEvent.DeleteExpense -> {
|
|
viewModelScope.launch {
|
|
dao.deleteExpense(event.expense)
|
|
}
|
|
}
|
|
ExpenseEvent.HideDialog -> {
|
|
_state.update { it.copy(
|
|
isAddingExpense = false
|
|
) }
|
|
}
|
|
ExpenseEvent.SaveExpense -> {
|
|
val name = state.value.name
|
|
val cost = state.value.cost
|
|
val rate = state.value.rate
|
|
|
|
if (name.isBlank()
|
|
|| cost.isBlank()
|
|
//|| rate.isBlank() # TBD, enable this once Rate is working.
|
|
) {
|
|
return
|
|
}
|
|
|
|
val expense = Expense(name, cost, rate)
|
|
|
|
viewModelScope.launch {
|
|
dao.upsertExpense(expense)
|
|
}
|
|
|
|
_state.update { it.copy(
|
|
isAddingExpense = false,
|
|
name = "",
|
|
cost = "",
|
|
rate = Rate.MONTHLY,
|
|
) }
|
|
}
|
|
is ExpenseEvent.SetName -> {
|
|
_state.update { it.copy(
|
|
name = event.name
|
|
) }
|
|
}
|
|
is ExpenseEvent.SetCost -> {
|
|
_state.update { it.copy(
|
|
cost = event.cost
|
|
) }
|
|
}
|
|
is ExpenseEvent.SetRate -> {
|
|
_state.update { it.copy(
|
|
rate = event.rate
|
|
) }
|
|
}
|
|
ExpenseEvent.ShowDialog -> {
|
|
_state.update { it.copy(
|
|
isAddingExpense = true
|
|
) }
|
|
}
|
|
is ExpenseEvent.SortExpenses -> {
|
|
_sortType.value = event.sortType
|
|
}
|
|
}
|
|
}
|
|
} |