From 36f4ce4386daada4e1b8063dddac2287b7fa517b Mon Sep 17 00:00:00 2001 From: SeongHoonC Date: Thu, 1 Aug 2024 14:49:42 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A0=88=EC=8B=9C=ED=94=BC=20=EC=B6=94?= =?UTF-8?q?=EC=B2=9C=20=EC=83=88=EB=A1=9C=EA=B3=A0=EC=B9=A8=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/recipe/recommend/RecipeItem.kt | 3 +- .../recommend/RecipeRecommendViewModel.kt | 70 +++++++++---------- .../recommend/RecipesRecommendScreen.kt | 62 +++++++++++----- 3 files changed, 81 insertions(+), 54 deletions(-) diff --git a/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipeItem.kt b/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipeItem.kt index 802005c..b959900 100644 --- a/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipeItem.kt +++ b/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipeItem.kt @@ -43,9 +43,10 @@ fun RecipeItem( recipeRecommendItemUiState: RecipeRecommendItemUiState, onRecipeClick: (Recipe) -> Unit, onRecipeLikeClick: (Recipe) -> Unit, + modifier: Modifier =Modifier ) { Column( - modifier = Modifier + modifier = modifier .fillMaxWidth() .clickable { onRecipeClick(recipeRecommendItemUiState.recommendedRecipe.recipe) diff --git a/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipeRecommendViewModel.kt b/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipeRecommendViewModel.kt index 96b8ca2..30c631f 100644 --- a/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipeRecommendViewModel.kt +++ b/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipeRecommendViewModel.kt @@ -14,46 +14,44 @@ import javax.inject.Inject @HiltViewModel class RecipeRecommendViewModel - @Inject - constructor( - private val recipeRepository: RecipeRepository, - ) : ViewModel() { - private val _uiState: MutableStateFlow = - MutableStateFlow(RecipeRecommendUiState.Loading) - val uiState: StateFlow = _uiState.asStateFlow() +@Inject +constructor( + private val recipeRepository: RecipeRepository, +) : ViewModel() { + private val _uiState: MutableStateFlow = + MutableStateFlow(RecipeRecommendUiState.Loading) + val uiState: StateFlow = _uiState.asStateFlow() - fun getRecipeRecommendation() { - val remainRecipes = (_uiState.value as? RecipeRecommendUiState.Success)?.recipes ?: listOf() + fun getRecipeRecommendation() { + _uiState.value = RecipeRecommendUiState.Loading - viewModelScope.launch { - recipeRepository - .getRecipeRecommendation() - .onSuccess { recipes -> - _uiState.value = - RecipeRecommendUiState.Success( - remainRecipes + recipes.toUiState(), - ) - }.onFailure { throwable -> - throwable.printStackTrace() - } - } - } - - fun likeRecipe(recipe: Recipe) { - val successUiState = _uiState.value as? RecipeRecommendUiState.Success ?: return - val likedRecipeUiStates = - successUiState.recipes.map { recipeUiState -> - if (recipeUiState.recommendedRecipe.recipe.id == recipe.id) { - recipeUiState.copy(isLiked = !recipeUiState.isLiked) - } else { - recipeUiState - } + viewModelScope.launch { + recipeRepository + .getRecipeRecommendation() + .onSuccess { recipes -> + _uiState.value = + RecipeRecommendUiState.Success(recipes.toUiState()) + }.onFailure { throwable -> + throwable.printStackTrace() } - _uiState.value = RecipeRecommendUiState.Success(likedRecipeUiStates) } + } - private fun List.toUiState(): List = - map { recipe -> - RecipeRecommendItemUiState(recommendedRecipe = recipe, isLiked = false) + fun likeRecipe(recipe: Recipe) { + val successUiState = _uiState.value as? RecipeRecommendUiState.Success ?: return + val likedRecipeUiStates = + successUiState.recipes.map { recipeUiState -> + if (recipeUiState.recommendedRecipe.recipe.id == recipe.id) { + recipeUiState.copy(isLiked = !recipeUiState.isLiked) + } else { + recipeUiState + } } + _uiState.value = RecipeRecommendUiState.Success(likedRecipeUiStates) } + + private fun List.toUiState(): List = + map { recipe -> + RecipeRecommendItemUiState(recommendedRecipe = recipe, isLiked = false) + } +} diff --git a/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipesRecommendScreen.kt b/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipesRecommendScreen.kt index 4f6afac..92c3092 100644 --- a/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipesRecommendScreen.kt +++ b/Android/feature/recipe/src/main/java/com/sundaegukbap/banchango/feature/recipe/recommend/RecipesRecommendScreen.kt @@ -1,6 +1,7 @@ package com.sundaegukbap.banchango.feature.recipe.recommend import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer @@ -49,6 +50,7 @@ fun RecipeRecommendRoute( RecipeRecommendContent( padding = padding, uiState = uiState, + onRefreshClick = { viewModel.getRecipeRecommendation() }, onLikeClick = { viewModel.likeRecipe(it) }, onRecipeClick = onRecipeClick, onChangeSystemBarsColor = onChangeStatusBarColor, @@ -59,6 +61,7 @@ fun RecipeRecommendRoute( fun RecipeRecommendContent( padding: PaddingValues, uiState: RecipeRecommendUiState, + onRefreshClick: () -> Unit, onLikeClick: (Recipe) -> Unit, onRecipeClick: (Recipe) -> Unit, onChangeSystemBarsColor: (color: Color, darkIcons: Boolean) -> Unit, @@ -67,8 +70,9 @@ fun RecipeRecommendContent( when (uiState) { is RecipeRecommendUiState.Loading -> { RecipeRecommendLoading( - modifier = Modifier.fillMaxSize(), + padding = padding, contentAlignment = Alignment.Center, + onRefreshClick = {}, ) } @@ -78,6 +82,7 @@ fun RecipeRecommendContent( padding = padding, onLikeClick = onLikeClick, onRecipeClick = onRecipeClick, + onRefreshClick = onRefreshClick, ) } } @@ -85,11 +90,22 @@ fun RecipeRecommendContent( @Composable fun RecipeRecommendLoading( - modifier: Modifier, + padding: PaddingValues, contentAlignment: Alignment, + onRefreshClick: () -> Unit, ) { - Box(modifier = modifier, contentAlignment = contentAlignment) { - CircularProgressIndicator() + Box( + modifier = Modifier + .padding(padding) + .fillMaxSize() + .padding(horizontal = 16.dp), + contentAlignment = contentAlignment + ) { + RecipeRecommendTopBar(onRefreshClick, Modifier.align(Alignment.TopCenter)) + CircularProgressIndicator( + modifier = Modifier + .align(Alignment.Center) + ) } } @@ -97,6 +113,7 @@ fun RecipeRecommendLoading( private fun RecipeRecommendScreen( padding: PaddingValues, recipeRecommends: List, + onRefreshClick: () -> Unit, onLikeClick: (Recipe) -> Unit, onRecipeClick: (Recipe) -> Unit, ) { @@ -107,26 +124,36 @@ private fun RecipeRecommendScreen( modifier = Modifier.padding(horizontal = 16.dp) ) { item { - Box( - modifier = Modifier - .padding(vertical = 20.dp) - .fillMaxWidth() - ) { - Text(text = "AI 레시피 추천", fontWeight = FontWeight.Bold) - Image( - painterResource(id = R.drawable.ic_refresh), - contentDescription = "refresh", - modifier = Modifier.align(Alignment.CenterEnd) - ) - } + RecipeRecommendTopBar(onRefreshClick = onRefreshClick) } - items(recipeRecommends) { item -> + items( + items = recipeRecommends, + key = { it.recommendedRecipe.recipe.id } + ) { item -> RecipeItem(item, onRecipeClick, onLikeClick) Spacer(modifier = Modifier.height(20.dp)) } } } +@Composable +private fun RecipeRecommendTopBar(onRefreshClick: () -> Unit, modifier: Modifier = Modifier) { + Box( + modifier = modifier + .padding(vertical = 20.dp) + .fillMaxWidth() + ) { + Text(text = "AI 레시피 추천", fontWeight = FontWeight.Bold) + Image( + painterResource(id = R.drawable.ic_refresh), + contentDescription = "refresh", + modifier = Modifier + .align(Alignment.CenterEnd) + .clickable { onRefreshClick() } + ) + } +} + @Preview(showBackground = true) @Composable fun RecipePagePreview() { @@ -135,6 +162,7 @@ fun RecipePagePreview() { padding = PaddingValues(16.dp), onLikeClick = {}, onRecipeClick = {}, + onRefreshClick = {}, onChangeSystemBarsColor = { _, _ -> }, uiState = RecipeRecommendUiState.Success(