diff --git a/app/src/main/java/gq/kirmanak/mealient/data/recipes/RecipeRepo.kt b/app/src/main/java/gq/kirmanak/mealient/data/recipes/RecipeRepo.kt index c10b2bc..d8fdddd 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/recipes/RecipeRepo.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/recipes/RecipeRepo.kt @@ -18,5 +18,5 @@ interface RecipeRepo { suspend fun refreshRecipes() - suspend fun updateIsRecipeFavorite(recipeSlug: String, isFavorite: Boolean) + suspend fun updateIsRecipeFavorite(recipeSlug: String, isFavorite: Boolean): Result } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipeRepoImpl.kt b/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipeRepoImpl.kt index 900d320..8a50ce0 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipeRepoImpl.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipeRepoImpl.kt @@ -72,14 +72,15 @@ class RecipeRepoImpl @Inject constructor( } } - override suspend fun updateIsRecipeFavorite(recipeSlug: String, isFavorite: Boolean) { + override suspend fun updateIsRecipeFavorite( + recipeSlug: String, + isFavorite: Boolean, + ): Result = runCatchingExceptCancel { logger.v { "updateIsRecipeFavorite() called with: recipeSlug = $recipeSlug, isFavorite = $isFavorite" } - runCatchingExceptCancel { - dataSource.updateIsRecipeFavorite(recipeSlug, isFavorite) - mediator.onFavoritesChange() - }.onFailure { - logger.e(it) { "Can't update recipe's is favorite status" } - } + dataSource.updateIsRecipeFavorite(recipeSlug, isFavorite) + mediator.onFavoritesChange() + }.onFailure { + logger.e(it) { "Can't update recipe's is favorite status" } } companion object { diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt index 0767e60..f6f08f1 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt @@ -93,7 +93,7 @@ class RecipesListFragment : Fragment(R.layout.fragment_recipes_list) { val recipesAdapter = recipePagingAdapterFactory.build { when (it) { is RecipeViewHolder.ClickEvent.FavoriteClick -> { - viewModel.onFavoriteIconClick(it.recipeSummaryEntity) + onFavoriteClick(it) } is RecipeViewHolder.ClickEvent.RecipeClick -> { onRecipeClicked(it.recipeSummaryEntity) @@ -137,6 +137,16 @@ class RecipesListFragment : Fragment(R.layout.fragment_recipes_list) { } } + private fun onFavoriteClick(event: RecipeViewHolder.ClickEvent) { + logger.v { "onFavoriteClick() called with: event = $event" } + viewModel.onFavoriteIconClick(event.recipeSummaryEntity).observe(viewLifecycleOwner) { + logger.d { "onFavoriteClick: result is $it" } + if (it.isFailure) { + showLongToast(R.string.fragment_recipes_favorite_update_failed) + } + } + } + private fun onLoadFailure(error: Throwable) { logger.w(error) { "onLoadFailure() called" } val reason = error.toLoadErrorReasonText()?.let { getString(it) } diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListViewModel.kt index a5846e3..7534550 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListViewModel.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListViewModel.kt @@ -13,7 +13,6 @@ import gq.kirmanak.mealient.extensions.valueUpdatesOnly import gq.kirmanak.mealient.logging.Logger import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -42,14 +41,11 @@ class RecipesListViewModel @Inject constructor( } // TODO hide favourite icons if not authorized - // TODO show error message when can't update favourite status - fun onFavoriteIconClick(recipeSummaryEntity: RecipeSummaryEntity) { + fun onFavoriteIconClick(recipeSummaryEntity: RecipeSummaryEntity) = liveData { logger.v { "onFavoriteIconClick() called with: recipeSummaryEntity = $recipeSummaryEntity" } - viewModelScope.launch { - recipeRepo.updateIsRecipeFavorite( - recipeSlug = recipeSummaryEntity.slug, - isFavorite = recipeSummaryEntity.isFavorite.not(), - ) - } + recipeRepo.updateIsRecipeFavorite( + recipeSlug = recipeSummaryEntity.slug, + isFavorite = recipeSummaryEntity.isFavorite.not(), + ).also { emit(it) } } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0ad1898..bb69c91 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,6 +49,7 @@ unauthorized unexpected response no connection + Favorite status update failed Change URL Search recipes @string/app_name