Refresh favorite recipes on change

This commit is contained in:
Kirill Kamakin
2022-12-13 20:53:45 +01:00
parent af390ebcaf
commit 97735847c0
5 changed files with 23 additions and 0 deletions

View File

@@ -17,4 +17,6 @@ interface RecipeStorage {
suspend fun saveRecipeInfo(recipe: FullRecipeInfo) suspend fun saveRecipeInfo(recipe: FullRecipeInfo)
suspend fun queryRecipeInfo(recipeId: String): FullRecipeEntity? suspend fun queryRecipeInfo(recipeId: String): FullRecipeEntity?
suspend fun updateFavoriteRecipes(favorites: List<String>)
} }

View File

@@ -72,4 +72,12 @@ class RecipeStorageImpl @Inject constructor(
logger.v { "queryRecipeInfo() returned: $fullRecipeInfo" } logger.v { "queryRecipeInfo() returned: $fullRecipeInfo" }
return fullRecipeInfo return fullRecipeInfo
} }
override suspend fun updateFavoriteRecipes(favorites: List<String>) {
logger.v { "updateFavoriteRecipes() called with: favorites = $favorites" }
db.withTransaction {
recipeDao.setFavorite(favorites)
recipeDao.setNonFavorite(favorites)
}
}
} }

View File

@@ -76,6 +76,7 @@ class RecipeRepoImpl @Inject constructor(
logger.v { "updateIsRecipeFavorite() called with: recipeSlug = $recipeSlug, isFavorite = $isFavorite" } logger.v { "updateIsRecipeFavorite() called with: recipeSlug = $recipeSlug, isFavorite = $isFavorite" }
runCatchingExceptCancel { runCatchingExceptCancel {
dataSource.updateIsRecipeFavorite(recipeSlug, isFavorite) dataSource.updateIsRecipeFavorite(recipeSlug, isFavorite)
mediator.onFavoritesChange()
}.onFailure { }.onFailure {
logger.e(it) { "Can't update recipe's is favorite status" } logger.e(it) { "Can't update recipe's is favorite status" }
} }

View File

@@ -79,4 +79,10 @@ class RecipesRemoteMediator @Inject constructor(
else storage.saveRecipes(entities) else storage.saveRecipes(entities)
recipes.size recipes.size
} }
suspend fun onFavoritesChange() {
val favorites = network.getFavoriteRecipes()
storage.updateFavoriteRecipes(favorites)
pagingSourceFactory.invalidate()
}
} }

View File

@@ -40,4 +40,10 @@ interface RecipeDao {
@Query("DELETE FROM recipe_instruction WHERE recipe_id = :recipeId") @Query("DELETE FROM recipe_instruction WHERE recipe_id = :recipeId")
suspend fun deleteRecipeInstructions(recipeId: String) suspend fun deleteRecipeInstructions(recipeId: String)
@Query("UPDATE recipe_summaries SET is_favorite = 1 WHERE slug IN (:favorites)")
suspend fun setFavorite(favorites: List<String>)
@Query("UPDATE recipe_summaries SET is_favorite = 0 WHERE slug NOT IN (:favorites)")
suspend fun setNonFavorite(favorites: List<String>)
} }