Replace LiveData with Flow for delete result

This commit is contained in:
Kirill Kamakin
2022-12-16 20:06:44 +01:00
parent 0c532f9d7a
commit 878fc8f080
2 changed files with 34 additions and 12 deletions

View File

@@ -57,9 +57,15 @@ class RecipesListFragment : Fragment(R.layout.fragment_recipes_list) {
checkedMenuItemId = R.id.recipes_list checkedMenuItemId = R.id.recipes_list
) )
} }
viewModel.showFavoriteIcon.observe(viewLifecycleOwner) { showFavoriteIcon -> collectWhenViewResumed(viewModel.showFavoriteIcon) { showFavoriteIcon ->
setupRecipeAdapter(showFavoriteIcon) setupRecipeAdapter(showFavoriteIcon)
} }
collectWhenViewResumed(viewModel.deleteRecipeResult) {
logger.d { "Delete recipe result is $it" }
if (it.isFailure) {
showLongToast(R.string.fragment_recipes_delete_recipe_failed)
}
}
hideKeyboardOnScroll() hideKeyboardOnScroll()
} }
@@ -151,12 +157,7 @@ class RecipesListFragment : Fragment(R.layout.fragment_recipes_list) {
R.string.fragment_recipes_delete_recipe_confirm_dialog_message, entity.name R.string.fragment_recipes_delete_recipe_confirm_dialog_message, entity.name
) )
val onPositiveClick = DialogInterface.OnClickListener { _, _ -> val onPositiveClick = DialogInterface.OnClickListener { _, _ ->
viewModel.onDeleteConfirm(entity).observe(viewLifecycleOwner) { viewModel.onDeleteConfirm(entity)
logger.d { "onDeleteClick: result is $it" }
if (it.isFailure) {
showLongToast(R.string.fragment_recipes_delete_recipe_failed)
}
}
} }
val positiveBtnResId = R.string.fragment_recipes_delete_recipe_confirm_dialog_positive_btn val positiveBtnResId = R.string.fragment_recipes_delete_recipe_confirm_dialog_positive_btn
val titleResId = R.string.fragment_recipes_delete_recipe_confirm_dialog_title val titleResId = R.string.fragment_recipes_delete_recipe_confirm_dialog_title

View File

@@ -2,9 +2,9 @@ package gq.kirmanak.mealient.ui.recipes
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.liveData import androidx.lifecycle.liveData
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import androidx.paging.PagingData
import androidx.paging.cachedIn import androidx.paging.cachedIn
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.data.auth.AuthRepo import gq.kirmanak.mealient.data.auth.AuthRepo
@@ -12,8 +12,16 @@ import gq.kirmanak.mealient.data.recipes.RecipeRepo
import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity
import gq.kirmanak.mealient.extensions.valueUpdatesOnly import gq.kirmanak.mealient.extensions.valueUpdatesOnly
import gq.kirmanak.mealient.logging.Logger import gq.kirmanak.mealient.logging.Logger
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
@@ -23,8 +31,18 @@ class RecipesListViewModel @Inject constructor(
private val logger: Logger, private val logger: Logger,
) : ViewModel() { ) : ViewModel() {
val pagingData = recipeRepo.createPager().flow.cachedIn(viewModelScope) val pagingData: Flow<PagingData<RecipeSummaryEntity>> = recipeRepo.createPager().flow
val showFavoriteIcon = authRepo.isAuthorizedFlow.asLiveData() .cachedIn(viewModelScope)
val showFavoriteIcon: StateFlow<Boolean> = authRepo.isAuthorizedFlow
.stateIn(viewModelScope, SharingStarted.Eagerly, false)
private val _deleteRecipeResult = MutableSharedFlow<Result<Unit>>(
replay = 0,
extraBufferCapacity = 1,
onBufferOverflow = BufferOverflow.DROP_OLDEST
)
val deleteRecipeResult: SharedFlow<Result<Unit>> get() = _deleteRecipeResult
init { init {
authRepo.isAuthorizedFlow.valueUpdatesOnly().onEach { hasAuthorized -> authRepo.isAuthorizedFlow.valueUpdatesOnly().onEach { hasAuthorized ->
@@ -50,8 +68,11 @@ class RecipesListViewModel @Inject constructor(
).also { emit(it) } ).also { emit(it) }
} }
fun onDeleteConfirm(recipeSummaryEntity: RecipeSummaryEntity) = liveData { fun onDeleteConfirm(recipeSummaryEntity: RecipeSummaryEntity) {
logger.v { "onDeleteConfirm() called with: recipeSummaryEntity = $recipeSummaryEntity" } logger.v { "onDeleteConfirm() called with: recipeSummaryEntity = $recipeSummaryEntity" }
recipeRepo.deleteRecipe(recipeSummaryEntity.slug).also { emit(it) } viewModelScope.launch {
val result = recipeRepo.deleteRecipe(recipeSummaryEntity.slug)
_deleteRecipeResult.emit(result)
}
} }
} }