package xyz.pixelatedw.recipe.data import androidx.lifecycle.ViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update class RecipesView : ViewModel() { private val _activeRecipe = MutableStateFlow( null ) val activeRecipe = _activeRecipe.asStateFlow() private val _recipes = MutableStateFlow>( arrayListOf() ) val recipes = _recipes.asStateFlow() private val _tagFilters = MutableStateFlow>( arrayListOf() ) val tagFilters = _tagFilters.asStateFlow() private val _search = MutableStateFlow(null) val search = _search.asStateFlow() private val _keepScreenOn = MutableStateFlow(false) val keepScreenOn = _keepScreenOn.asStateFlow() fun reloadTagFilterState() { _tagFilters.value = _tagFilters.value } fun setTagFilterState(tag: String, state: Boolean) { _tagFilters.value = _tagFilters.value.toMutableList().apply { replaceAll { it -> if (tag == it.tag) it.checked = state; it } }.toList() } fun setKeepScreenOn(flag: Boolean) { _keepScreenOn.update { flag } } fun setRecipes(recipes: List) { _recipes.update { recipes.sortedBy { it.recipe.title } } val filtersMap = mutableMapOf() _recipes.value.stream() .filter { it.tags.isNotEmpty() } .forEach { it.tags.forEach { tag -> val count = filtersMap[tag.name] ?: 0 filtersMap[tag.name] = count + 1; } } val filters = filtersMap.map { it -> TagFilter(it.key, count = it.value) }.toList() _tagFilters.update { filters.distinct() } } fun removeRecipe(recipe: RecipeWithTags) { _recipes.value = _recipes.value.toMutableList().apply { remove(recipe) }.toList() } fun setSearch(search: String) { _search.update { search } } fun setActive(recipe: RecipeWithTags) { _activeRecipe.update { recipe } } }