From 0a93f563637fcf254c480a698a51e3cb00298997 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Tue, 18 Mar 2025 16:02:34 +0900 Subject: [PATCH 01/27] =?UTF-8?q?[feat]:=20=EB=A9=94=EB=89=B4=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20top=20app=20bar=20=ED=99=94=EB=A9=B4=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EA=B5=AC=ED=98=84=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetSelector.xml | 15 ----------- .../ui/addmenu/screen/AddMenuScreen.kt | 8 ++++-- .../menuFolder/component/MenuFolderButton.kt | 27 ++++++++++++------- .../component/MenuFolderTopAppBar.kt | 8 +++--- .../ui/menuFolder/screen/MenuFolderScreen.kt | 17 +++++++++--- .../kuit/ourmenu/ui/navigator/MainNavGraph.kt | 12 +++++++++ .../com/kuit/ourmenu/ui/navigator/Routes.kt | 6 +++++ gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 9 files changed, 62 insertions(+), 35 deletions(-) diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index 9b3f5cb2..1f58bdfc 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -13,21 +13,6 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuScreen.kt index 0530f95e..44be08e7 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuScreen.kt @@ -34,6 +34,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavController +import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.addmenu.component.AddMenuSearchBackground import com.kuit.ourmenu.ui.addmenu.component.bottomsheet.AddMenuBottomSheetContent @@ -46,7 +48,7 @@ import com.kuit.ourmenu.ui.theme.ourMenuTypography @OptIn(ExperimentalMaterial3Api::class) @Composable -fun AddMenuScreen(modifier: Modifier = Modifier) { +fun AddMenuScreen(navController: NavController) { var scaffoldState = rememberBottomSheetScaffoldState() var showBottomSheet by rememberSaveable { mutableStateOf(false) } var showSearchBackground by rememberSaveable { mutableStateOf(false) } @@ -162,5 +164,7 @@ fun AddMenuScreen(modifier: Modifier = Modifier) { @Preview(showBackground = true) @Composable private fun AddMenuScreenPreview() { - AddMenuScreen() + val navController = rememberNavController() + + AddMenuScreen(navController) } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt index 0e79c7cc..45afe69f 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt @@ -2,6 +2,7 @@ package com.kuit.ourmenu.ui.menuFolder.component import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.detectHorizontalDragGestures import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -47,7 +48,10 @@ import kotlinx.coroutines.launch fun MenuFolderButton( isSwiped: Boolean, // 현재 버튼이 스와이프된 상태인지 확인 onSwipe: () -> Unit, // 새로운 버튼이 스와이프될 때 호출 - onReset: () -> Unit // 버튼이 닫히면 호출 + onReset: () -> Unit, // 버튼이 닫히면 호출 + onButtonClick: () -> Unit = {}, + onEditClick: () -> Unit = {}, + onDeleteClick: () -> Unit = {} ) { var offsetX by remember { mutableFloatStateOf(0f) } val scope = rememberCoroutineScope() @@ -80,26 +84,30 @@ fun MenuFolderButton( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.CenterEnd ) { - MenuFolderDeleteButton() - MenuFolderEditButton() + MenuFolderDeleteButton(onDeleteClick) + MenuFolderEditButton(onEditClick) } // 스와이프 상태일 때만 offset 적용 - Box(modifier = Modifier.offset(x = if (isSwiped) offsetX.dp else 0.dp)) { + Box(modifier = Modifier + .offset(x = if (isSwiped) offsetX.dp else 0.dp) + .clickable(onClick = onButtonClick) + ) { MenuFolderContent() } } } @Composable -fun MenuFolderEditButton() { +fun MenuFolderEditButton(onEditClick: () -> Unit = {}) { Box( modifier = Modifier .padding(end = 64.dp) .width(80.dp) .fillMaxHeight() .clip(RoundedCornerShape(topEnd = 12.dp, bottomEnd = 12.dp)) - .background(color = Neutral300), + .background(color = Neutral300) + .clickable(onClick = onEditClick), contentAlignment = Alignment.CenterEnd ) { Column(modifier = Modifier.padding(end = 20.dp)) { @@ -119,14 +127,15 @@ fun MenuFolderEditButton() { } @Composable -fun MenuFolderDeleteButton() { +fun MenuFolderDeleteButton(onDeleteClick: () -> Unit = {}) { Box( modifier = Modifier .width(80.dp) .fillMaxHeight() .clip(RoundedCornerShape(topEnd = 12.dp, bottomEnd = 12.dp)) - .background(color = Primary500Main), - contentAlignment = Alignment.CenterEnd + .background(color = Primary500Main) + .clickable(onClick = onDeleteClick), + contentAlignment = Alignment.CenterEnd, ) { Column(modifier = Modifier.padding(end = 20.dp)) { Image( diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderTopAppBar.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderTopAppBar.kt index 4da18245..b6d8b8df 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderTopAppBar.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderTopAppBar.kt @@ -21,7 +21,7 @@ import com.kuit.ourmenu.ui.theme.NeutralWhite @OptIn(ExperimentalMaterial3Api::class) @Composable -fun MenuFolderTopAppBar(modifier: Modifier = Modifier) { +fun MenuFolderTopAppBar(onClick: () -> Unit) { // 기본 TopAppBar( modifier = Modifier @@ -45,7 +45,7 @@ fun MenuFolderTopAppBar(modifier: Modifier = Modifier) { }, actions = { IconButton( - onClick = { /* TODO : Add Menu Button Click Event */ }, + onClick = onClick, modifier = Modifier.padding(end = 20.dp) ) { Icon( @@ -61,5 +61,7 @@ fun MenuFolderTopAppBar(modifier: Modifier = Modifier) { @Preview(showBackground = true) @Composable private fun HomeTopAppBarPreview() { - MenuFolderTopAppBar() + MenuFolderTopAppBar( + onClick = {} + ) } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt index 4b544d45..854289b4 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt @@ -21,16 +21,19 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.menuFolder.component.AddButton import com.kuit.ourmenu.ui.menuFolder.component.MenuFolderButton import com.kuit.ourmenu.ui.menuFolder.component.MenuFolderTopAppBar +import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.theme.NeutralWhite import com.kuit.ourmenu.ui.theme.Primary500Main import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable -fun MenuFolderScreen(modifier: Modifier = Modifier) { +fun MenuFolderScreen(navController: NavController) { val menuCount = 5 // 임의로 정한 값 val menuFolderCount = 8 // 임의로 정한 값 @@ -39,7 +42,11 @@ fun MenuFolderScreen(modifier: Modifier = Modifier) { Scaffold( topBar = { - MenuFolderTopAppBar() + MenuFolderTopAppBar( + onClick = { + navController.navigate(route = Routes.AddMenu) + } + ) } ) { innerPadding -> LazyColumn( @@ -79,7 +86,7 @@ fun MenuFolderScreen(modifier: Modifier = Modifier) { MenuFolderButton( isSwiped = swipedIndex == index, // 현재 스와이프된 아이템인지 확인 onSwipe = { swipedIndex = index }, // 새로운 버튼이 스와이프되면 상태 변경 - onReset = { if (swipedIndex == index) swipedIndex = -1 } // 닫히면 초기화 + onReset = { if (swipedIndex == index) swipedIndex = -1 }, // 닫히면 초기화 ) } @@ -98,5 +105,7 @@ fun MenuFolderScreen(modifier: Modifier = Modifier) { @Preview(showBackground = true) @Composable private fun MenuFolderScreenPreview() { - MenuFolderScreen() + val navController = rememberNavController() + + MenuFolderScreen(navController) } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt index ce866e10..9af61fb6 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt @@ -4,7 +4,9 @@ import androidx.compose.runtime.Composable import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable +import com.kuit.ourmenu.ui.addmenu.screen.AddMenuScreen import com.kuit.ourmenu.ui.home.screen.HomeScreen +import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderScreen import com.kuit.ourmenu.ui.onboarding.screen.LandingScreen import com.kuit.ourmenu.ui.onboarding.screen.LoginScreen import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupEmailScreen @@ -36,5 +38,15 @@ fun MainNavGraph(navController: NavHostController) { composable { SignupVerifyScreen(navController = navController) } + + // 메뉴판 + composable { + MenuFolderScreen(navController = navController) + } + + // 메뉴 추가 + composable { + AddMenuScreen(navController = navController) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt index 1599e9fe..c23979bf 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt @@ -10,6 +10,12 @@ sealed interface Routes{ // 지도 // 메뉴판 + @Serializable + data object MenuFolder: Routes + + // 메뉴 추가 + @Serializable + data object AddMenu: Routes // Mypage diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7469bb5d..8de6174e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.7.3" +agp = "8.8.2" converterGson = "2.11.0" hiltAndroid = "2.52" hiltNavigationCompose = "1.2.0" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7bc793cb..14adae71 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Dec 27 14:17:39 KST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From a37c7b5181fd2ecbf87dbe1d76d3e88657ee74ed Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Tue, 18 Mar 2025 16:30:07 +0900 Subject: [PATCH 02/27] =?UTF-8?q?[feat]:=20=EB=A9=94=EB=89=B4=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20=EC=83=81=EC=84=B8=20=ED=99=94=EB=A9=B4=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99,=20=EB=92=A4=EB=A1=9C=EA=B0=80=EA=B8=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/topappbar/BackButtonTopAppBar.kt | 6 +- .../screen/MenuFolderDetailScreen.kt | 185 ++++++++++-------- .../ui/menuFolder/screen/MenuFolderScreen.kt | 3 + .../kuit/ourmenu/ui/navigator/MainNavGraph.kt | 6 +- .../com/kuit/ourmenu/ui/navigator/Routes.kt | 2 + 5 files changed, 113 insertions(+), 89 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/common/topappbar/BackButtonTopAppBar.kt b/app/src/main/java/com/kuit/ourmenu/ui/common/topappbar/BackButtonTopAppBar.kt index 62865e0f..f75ee916 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/common/topappbar/BackButtonTopAppBar.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/common/topappbar/BackButtonTopAppBar.kt @@ -17,10 +17,10 @@ import com.kuit.ourmenu.ui.theme.Neutral500 @OptIn(ExperimentalMaterial3Api::class) @Composable -fun BackButtonTopAppBar(color: Color, isKebabVisible: Boolean) { +fun BackButtonTopAppBar(color: Color, isKebabVisible: Boolean, onBackClick: () -> Unit = {}) { TopAppBar( title = { - IconButton(onClick = { TODO("뒤로가기 구현") }) { + IconButton(onClick = onBackClick) { Icon( painter = painterResource(R.drawable.ic_back), contentDescription = "Back", @@ -34,7 +34,7 @@ fun BackButtonTopAppBar(color: Color, isKebabVisible: Boolean) { painter = painterResource(R.drawable.ic_kebab), modifier = Modifier.padding(end = 18.dp), contentDescription = "Menu", - tint = color + tint = color, ) } }, diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt index 767c7e43..7d29c100 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt @@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.Icon +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -26,6 +27,8 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.common.topappbar.BackButtonTopAppBar import com.kuit.ourmenu.ui.menuFolder.component.AddButton @@ -35,112 +38,124 @@ import com.kuit.ourmenu.ui.theme.NeutralWhite import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable -fun MenuFolderDetailScreen(modifier: Modifier = Modifier) { +fun MenuFolderDetailScreen(navController: NavController) { val menuCount = 13 // 임의로 정한 값 - Column( - modifier = modifier.fillMaxSize() - ) { - Box( - modifier = Modifier - .height(192.dp), - ) { - Image( - painter = painterResource(R.drawable.img_dummy_pizza), - contentDescription = "menu folder image", - contentScale = ContentScale.FillWidth, - modifier = Modifier.fillMaxWidth() - ) - - // Gradient Overlay - Box( + Scaffold( + topBar = {}, + content = { innerPadding -> + Column( modifier = Modifier - .matchParentSize() - .background( - brush = Brush.verticalGradient( - colors = listOf( - Color.Black.copy(alpha = 0f), // 투명 (rgba(0, 0, 0, 0.00)) - Color.Black.copy(alpha = 0.5f) // 불투명 (rgba(0, 0, 0, 0.70)) - ), - startY = 0f, - endY = 400f // 점점 어두워지는 위치 설정 - ) + .padding(innerPadding) + .fillMaxSize() + ) { + Box( + modifier = Modifier + .height(192.dp), + ) { + Image( + painter = painterResource(R.drawable.img_dummy_pizza), + contentDescription = "menu folder image", + contentScale = ContentScale.FillWidth, + modifier = Modifier.fillMaxWidth() ) - ) - Row( - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(top = 144.dp, start = 20.dp, end = 20.dp).fillMaxWidth() - ) { + Box( + modifier = Modifier + .matchParentSize() + .background( + brush = Brush.verticalGradient( + colors = listOf( + Color.Black.copy(alpha = 0f), // 투명 (rgba(0, 0, 0, 0.00)) + Color.Black.copy(alpha = 0.5f) // 불투명 (rgba(0, 0, 0, 0.70)) + ), + startY = 0f, + endY = 400f // 점점 어두워지는 위치 설정 + ) + ) + ) - Row( - verticalAlignment = Alignment.CenterVertically, + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding(top = 144.dp, start = 20.dp, end = 20.dp) + .fillMaxWidth() + ) { - ) { - Image( - painter = painterResource(id = R.drawable.img_popup_dice), - contentDescription = "Folder Icon", - modifier = Modifier.size(32.dp) - ) - Spacer(modifier = Modifier.width(8.dp)) - Text( - text = stringResource(R.string.menu_folder_name), - color = NeutralWhite, - style = ourMenuTypography().pretendard_600_20, - ) - Spacer(modifier = Modifier.width(8.dp)) - Text( - text = String.format(stringResource(R.string.count), menuCount), - color = Neutral50, - style = ourMenuTypography().pretendard_500_14, - ) - } + Row( + verticalAlignment = Alignment.CenterVertically, - // TODO: 드롭다운 만들기 - Row { - Text( - text = stringResource(R.string.sort_type), - style = ourMenuTypography().pretendard_500_14, - color = Neutral50 - ) + ) { + Image( + painter = painterResource(id = R.drawable.img_popup_dice), + contentDescription = "Folder Icon", + modifier = Modifier.size(32.dp) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = stringResource(R.string.menu_folder_name), + color = NeutralWhite, + style = ourMenuTypography().pretendard_600_20, + ) + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = String.format(stringResource(R.string.count), menuCount), + color = Neutral50, + style = ourMenuTypography().pretendard_500_14, + ) + } - Spacer(modifier = Modifier.width(8.dp)) + // TODO: 드롭다운 만들기 + Row { + Text( + text = stringResource(R.string.sort_type), + style = ourMenuTypography().pretendard_500_14, + color = Neutral50 + ) - Icon( - painter = painterResource(id = R.drawable.ic_dropdown_btn), - contentDescription = "Expand Down", - tint = Neutral50 - ) + Spacer(modifier = Modifier.width(8.dp)) + + Icon( + painter = painterResource(id = R.drawable.ic_dropdown_btn), + contentDescription = "Expand Down", + tint = Neutral50 + ) + } + } } - } - BackButtonTopAppBar(NeutralWhite, true) - } + LazyColumn( + modifier = Modifier.padding(top = 16.dp), + ) { + // TODO: 버튼 누르면 해당 페이지로 이동 + items(menuCount) { index -> + MenuFolderMenuButton() + } - LazyColumn( - modifier = Modifier.padding(top = 16.dp), - ) { - // TODO: 버튼 누르면 해당 페이지로 이동 - items(menuCount) { index -> - MenuFolderMenuButton() + item { + AddButton( + stringResource(R.string.add_menu), + modifier = Modifier.padding(start = 20.dp, end = 20.dp, top = 20.dp) + ) { + // TODO: 버튼 누르면 메뉴 추가 페이지로 이동 + } + } + } } - item { - AddButton( - stringResource(R.string.add_menu), - modifier = Modifier.padding(start = 20.dp, end = 20.dp, top = 20.dp) - ) { - // TODO: 버튼 누르면 메뉴 추가 페이지로 이동 - } + BackButtonTopAppBar(NeutralWhite, true) { + navController.popBackStack() } } + ) - } } @Preview(showBackground = true) @Composable private fun MenuFolderDetailScreenPreview() { - MenuFolderDetailScreen() + val navController = rememberNavController() + + MenuFolderDetailScreen(navController) } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt index 854289b4..d37ec9d3 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt @@ -87,6 +87,9 @@ fun MenuFolderScreen(navController: NavController) { isSwiped = swipedIndex == index, // 현재 스와이프된 아이템인지 확인 onSwipe = { swipedIndex = index }, // 새로운 버튼이 스와이프되면 상태 변경 onReset = { if (swipedIndex == index) swipedIndex = -1 }, // 닫히면 초기화 + onButtonClick = { + navController.navigate(route = Routes.MenuFolderDetail) + } ) } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt index 9af61fb6..bfe37391 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt @@ -6,6 +6,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import com.kuit.ourmenu.ui.addmenu.screen.AddMenuScreen import com.kuit.ourmenu.ui.home.screen.HomeScreen +import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderDetailScreen import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderScreen import com.kuit.ourmenu.ui.onboarding.screen.LandingScreen import com.kuit.ourmenu.ui.onboarding.screen.LoginScreen @@ -16,7 +17,7 @@ import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupVerifyScreen @Composable fun MainNavGraph(navController: NavHostController) { - NavHost(navController, startDestination = Routes.Home) { + NavHost(navController, startDestination = Routes.MenuFolder) { composable { HomeScreen(navController = navController) } @@ -43,6 +44,9 @@ fun MainNavGraph(navController: NavHostController) { composable { MenuFolderScreen(navController = navController) } + composable { + MenuFolderDetailScreen(navController = navController) + } // 메뉴 추가 composable { diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt index c23979bf..801e24a7 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt @@ -12,6 +12,8 @@ sealed interface Routes{ // 메뉴판 @Serializable data object MenuFolder: Routes + @Serializable + data object MenuFolderDetail: Routes // 메뉴 추가 @Serializable From 0e5517f715c9d5e54c4e92ce308d0d007ecfdce8 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Tue, 18 Mar 2025 17:30:36 +0900 Subject: [PATCH 03/27] =?UTF-8?q?[feat]:=20=EB=A9=94=EB=89=B4=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=99=94=EB=A9=B4,=20=EB=A9=94=EB=89=B4=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A7=80=EB=8F=84=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/MenuFolderMenuButton.kt | 8 +++--- .../screen/MenuFolderAllMenuScreen.kt | 25 ++++++++++++++----- .../screen/MenuFolderDetailScreen.kt | 11 ++++++-- .../menuinfo/screen/MenuInfoDefaultScreen.kt | 10 +++++--- .../ui/menuinfo/screen/MenuInfoMapScreen.kt | 12 ++++++--- .../kuit/ourmenu/ui/navigator/MainNavGraph.kt | 10 ++++++++ .../com/kuit/ourmenu/ui/navigator/Routes.kt | 6 +++++ 7 files changed, 64 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderMenuButton.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderMenuButton.kt index 6d96467c..97626489 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderMenuButton.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderMenuButton.kt @@ -1,6 +1,7 @@ package com.kuit.ourmenu.ui.menuFolder.component import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -29,16 +30,16 @@ import com.kuit.ourmenu.ui.theme.Neutral700 import com.kuit.ourmenu.ui.theme.Neutral900 import com.kuit.ourmenu.ui.theme.ourMenuTypography -// TODO: 버튼 누르면 해당 페이지로 이동 @Composable -fun MenuFolderMenuButton(modifier: Modifier = Modifier) { +fun MenuFolderMenuButton(onMenuClick: () -> Unit = {}, onMapClick: () -> Unit = {}) { val menuPrice = 12000 Row( - modifier = modifier + modifier = Modifier .fillMaxWidth() .height(114.dp) .padding(horizontal = 20.dp, vertical = 12.dp) + .clickable(onClick = onMenuClick) ) { Image( painter = painterResource(id = R.drawable.img_dummy_pizza), @@ -111,6 +112,7 @@ fun MenuFolderMenuButton(modifier: Modifier = Modifier) { Image( painter = painterResource(id = R.drawable.ic_to_map), contentDescription = "To Map", + modifier = Modifier.clickable(onClick = onMapClick) ) } } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt index c25ec209..b83f0049 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt @@ -21,10 +21,13 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.common.topappbar.BackButtonTopAppBar import com.kuit.ourmenu.ui.menuFolder.component.AddButton import com.kuit.ourmenu.ui.menuFolder.component.MenuFolderMenuButton +import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.theme.Neutral500 import com.kuit.ourmenu.ui.theme.Neutral700 import com.kuit.ourmenu.ui.theme.Neutral900 @@ -33,17 +36,19 @@ import com.kuit.ourmenu.ui.theme.Primary500Main import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable -fun MenuFolderAllMenuScreen(modifier: Modifier = Modifier) { +fun MenuFolderAllMenuScreen(navController: NavController) { val menuCount = 13 val filterCount = 1 Scaffold( topBar = { - BackButtonTopAppBar(Neutral500, false) + BackButtonTopAppBar(Neutral500, false) { + navController.popBackStack() + } } ) { innerPadding -> Column( - modifier = modifier + modifier = Modifier .padding(innerPadding) ) { Row( @@ -117,9 +122,15 @@ fun MenuFolderAllMenuScreen(modifier: Modifier = Modifier) { LazyColumn( modifier = Modifier, ) { - // TODO: 버튼 누르면 해당 페이지로 이동 items(menuCount) { index -> - MenuFolderMenuButton() + MenuFolderMenuButton( + onMenuClick = { + navController.navigate(route = Routes.MenuInfo) + }, + onMapClick = { + navController.navigate(route = Routes.MenuInfoMap) + } + ) } item { @@ -140,5 +151,7 @@ fun MenuFolderAllMenuScreen(modifier: Modifier = Modifier) { @Preview(showBackground = true) @Composable private fun MenuFolderAllMenuScreenPreview() { - MenuFolderAllMenuScreen() + val navController = rememberNavController() + + MenuFolderAllMenuScreen(navController) } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt index 7d29c100..abb8e0d6 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt @@ -33,6 +33,7 @@ import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.common.topappbar.BackButtonTopAppBar import com.kuit.ourmenu.ui.menuFolder.component.AddButton import com.kuit.ourmenu.ui.menuFolder.component.MenuFolderMenuButton +import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.theme.Neutral50 import com.kuit.ourmenu.ui.theme.NeutralWhite import com.kuit.ourmenu.ui.theme.ourMenuTypography @@ -128,9 +129,15 @@ fun MenuFolderDetailScreen(navController: NavController) { LazyColumn( modifier = Modifier.padding(top = 16.dp), ) { - // TODO: 버튼 누르면 해당 페이지로 이동 items(menuCount) { index -> - MenuFolderMenuButton() + MenuFolderMenuButton( + onMenuClick = { + navController.navigate(route = Routes.MenuInfo) + }, + onMapClick = { + navController.navigate(route = Routes.MenuInfoMap) + } + ) } item { diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuinfo/screen/MenuInfoDefaultScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuinfo/screen/MenuInfoDefaultScreen.kt index f270eddf..c940db35 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuinfo/screen/MenuInfoDefaultScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuinfo/screen/MenuInfoDefaultScreen.kt @@ -12,6 +12,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.ui.menuinfo.component.info.MenuInfoAdditionalContent import com.kuit.ourmenu.ui.menuinfo.component.info.MenuInfoChipContent import com.kuit.ourmenu.ui.menuinfo.component.info.MenuInfoContent @@ -22,7 +24,7 @@ import com.kuit.ourmenu.ui.menuinfo.dummy.MenuInfoDummyData import com.kuit.ourmenu.ui.theme.Neutral300 @Composable -fun MenuInfoDefaultScreen() { +fun MenuInfoDefaultScreen(navController: NavController) { val pagerState = rememberPagerState { 3 } @@ -67,7 +69,7 @@ fun MenuInfoDefaultScreen() { modifier = Modifier .align(Alignment.BottomEnd) .padding(end = 20.dp, bottom = 28.dp), - ) { } + ) { } } } @@ -75,5 +77,7 @@ fun MenuInfoDefaultScreen() { @Preview(showBackground = true) @Composable private fun MenuInfoDefaultPreview() { - MenuInfoDefaultScreen() + val navController = rememberNavController() + + MenuInfoDefaultScreen(navController) } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuinfo/screen/MenuInfoMapScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuinfo/screen/MenuInfoMapScreen.kt index a791faa7..45976c43 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuinfo/screen/MenuInfoMapScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuinfo/screen/MenuInfoMapScreen.kt @@ -18,15 +18,17 @@ import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.ui.common.GoToMapButton import com.kuit.ourmenu.ui.common.bottomsheet.BottomSheetDragHandle -import com.kuit.ourmenu.ui.common.topappbar.OurMenuAddButtonTopAppBar import com.kuit.ourmenu.ui.common.bottomsheet.MenuInfoBottomSheetContent +import com.kuit.ourmenu.ui.common.topappbar.OurMenuAddButtonTopAppBar import com.kuit.ourmenu.ui.theme.NeutralWhite @OptIn(ExperimentalMaterial3Api::class) @Composable -fun MenuInfoMapScreen(modifier: Modifier = Modifier) { +fun MenuInfoMapScreen(navController: NavController) { val scaffoldState = rememberBottomSheetScaffoldState() var dragHandleHeight by remember { mutableStateOf(0.dp) } var bottomSheetContentHeight by remember { mutableStateOf(0.dp) } @@ -60,7 +62,7 @@ fun MenuInfoMapScreen(modifier: Modifier = Modifier) { sheetPeekHeight = bottomSheetContentHeight, ) { innerPaddings -> Box( - modifier = modifier + modifier = Modifier .fillMaxSize() .padding(innerPaddings) ) { @@ -79,5 +81,7 @@ fun MenuInfoMapScreen(modifier: Modifier = Modifier) { @Preview(showBackground = true) @Composable private fun MenuInfoMapScreenPreview() { - MenuInfoMapScreen() + val navController = rememberNavController() + + MenuInfoMapScreen(navController) } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt index bfe37391..e525b31a 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt @@ -8,6 +8,8 @@ import com.kuit.ourmenu.ui.addmenu.screen.AddMenuScreen import com.kuit.ourmenu.ui.home.screen.HomeScreen import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderDetailScreen import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderScreen +import com.kuit.ourmenu.ui.menuinfo.screen.MenuInfoDefaultScreen +import com.kuit.ourmenu.ui.menuinfo.screen.MenuInfoMapScreen import com.kuit.ourmenu.ui.onboarding.screen.LandingScreen import com.kuit.ourmenu.ui.onboarding.screen.LoginScreen import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupEmailScreen @@ -48,6 +50,14 @@ fun MainNavGraph(navController: NavHostController) { MenuFolderDetailScreen(navController = navController) } + // 메뉴 + composable { + MenuInfoDefaultScreen(navController = navController) + } + composable { + MenuInfoMapScreen(navController = navController) + } + // 메뉴 추가 composable { AddMenuScreen(navController = navController) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt index 801e24a7..84f3b7c4 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt @@ -15,6 +15,12 @@ sealed interface Routes{ @Serializable data object MenuFolderDetail: Routes + // 메뉴 + @Serializable + data object MenuInfo: Routes + @Serializable + data object MenuInfoMap: Routes + // 메뉴 추가 @Serializable data object AddMenu: Routes From 06d68459055241142a30aeb1dda3364d21db5ae4 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Tue, 18 Mar 2025 17:32:16 +0900 Subject: [PATCH 04/27] =?UTF-8?q?[feat]:=20=EB=A9=94=EB=89=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B2=84=ED=8A=BC=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt | 2 +- .../kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt index b83f0049..8e28c988 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt @@ -138,7 +138,7 @@ fun MenuFolderAllMenuScreen(navController: NavController) { stringResource(R.string.add_menu), modifier = Modifier.padding(start = 20.dp, end = 20.dp, top = 20.dp) ) { - // TODO: 버튼 누르면 메뉴 추가 페이지로 이동 + navController.navigate(route = Routes.AddMenu) } } } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt index abb8e0d6..f01dff2e 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt @@ -145,7 +145,7 @@ fun MenuFolderDetailScreen(navController: NavController) { stringResource(R.string.add_menu), modifier = Modifier.padding(start = 20.dp, end = 20.dp, top = 20.dp) ) { - // TODO: 버튼 누르면 메뉴 추가 페이지로 이동 + navController.navigate(route = Routes.AddMenu) } } } From 087e7f0a4765f4b941bebc445b99267b258f332c Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Tue, 18 Mar 2025 17:35:22 +0900 Subject: [PATCH 05/27] =?UTF-8?q?[feat]:=20=EC=A0=84=EC=B2=B4=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EB=B3=B4=EA=B8=B0=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt | 6 +++++- .../com/kuit/ourmenu/ui/navigator/MainNavGraph.kt | 12 ++++++++---- .../java/com/kuit/ourmenu/ui/navigator/Routes.kt | 2 ++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt index d37ec9d3..756df97f 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt @@ -1,6 +1,7 @@ package com.kuit.ourmenu.ui.menuFolder.screen import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -62,7 +63,10 @@ fun MenuFolderScreen(navController: NavController) { .height(64.dp) .fillMaxWidth() .clip(RoundedCornerShape(12.dp)) - .background(Primary500Main), + .background(Primary500Main) + .clickable(onClick = { + navController.navigate(route = Routes.MenuFolderAllMenu) + }), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt index e525b31a..1e754048 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt @@ -6,6 +6,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import com.kuit.ourmenu.ui.addmenu.screen.AddMenuScreen import com.kuit.ourmenu.ui.home.screen.HomeScreen +import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderAllMenuScreen import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderDetailScreen import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderScreen import com.kuit.ourmenu.ui.menuinfo.screen.MenuInfoDefaultScreen @@ -19,7 +20,7 @@ import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupVerifyScreen @Composable fun MainNavGraph(navController: NavHostController) { - NavHost(navController, startDestination = Routes.MenuFolder) { + NavHost(navController, startDestination = Routes.Home) { composable { HomeScreen(navController = navController) } @@ -49,11 +50,14 @@ fun MainNavGraph(navController: NavHostController) { composable { MenuFolderDetailScreen(navController = navController) } + composable { + MenuFolderAllMenuScreen(navController = navController) + } // 메뉴 - composable { - MenuInfoDefaultScreen(navController = navController) - } + composable { + MenuInfoDefaultScreen(navController = navController) + } composable { MenuInfoMapScreen(navController = navController) } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt index 84f3b7c4..2ab1348c 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt @@ -14,6 +14,8 @@ sealed interface Routes{ data object MenuFolder: Routes @Serializable data object MenuFolderDetail: Routes + @Serializable + data object MenuFolderAllMenu: Routes // 메뉴 @Serializable From 32ffa9ee9d7584de59fb06680546e111ddaf2916 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 20 Mar 2025 20:54:02 +0900 Subject: [PATCH 06/27] =?UTF-8?q?[ui]:=20=ED=95=84=ED=84=B0=20=EB=B0=94?= =?UTF-8?q?=ED=85=80=EC=8B=9C=ED=8A=B8=20ui=20=EA=B5=AC=ED=98=84=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menuFolder/component/FilterBottomSheet.kt | 340 ++++++++++++++++++ 1 file changed, 340 insertions(+) create mode 100644 app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt new file mode 100644 index 00000000..310eec13 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt @@ -0,0 +1,340 @@ +package com.kuit.ourmenu.ui.menuFolder.component + +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.RangeSlider +import androidx.compose.material3.SliderDefaults +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.kuit.ourmenu.R +import com.kuit.ourmenu.ui.common.BottomHalfWidthButton +import com.kuit.ourmenu.ui.common.OurSnackbarHost +import com.kuit.ourmenu.ui.common.chip.TagChipGroup +import com.kuit.ourmenu.ui.theme.Neutral300 +import com.kuit.ourmenu.ui.theme.Neutral400 +import com.kuit.ourmenu.ui.theme.Neutral500 +import com.kuit.ourmenu.ui.theme.Neutral900 +import com.kuit.ourmenu.ui.theme.NeutralWhite +import com.kuit.ourmenu.ui.theme.Primary500Main +import com.kuit.ourmenu.ui.theme.ourMenuTypography +import kotlinx.coroutines.launch + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun FilterBottomSheet( + modifier: Modifier = Modifier, + categoryTagList: List>, + nationalityTagList: List>, + tasteTagList: List>, + occasionTagList: List>, + onSelectedTagsChange: (List) -> Unit, + onApplyButtonClick: () -> Unit, +) { + // toast를 위한 context + val context = LocalContext.current + val snackbarHostState = remember { SnackbarHostState() } + val scope = rememberCoroutineScope() + + // 가격 범위 설정 + val minPrice = 0f + val maxPrice = 50_000f + var priceRange by remember { mutableStateOf(minPrice..maxPrice) } + val stepSize = 5000f // 5000원 단위 조정 + + // 각 항목별로 선택된 태그 상태를 개별적으로 관리 + var selectedCategoryTag by rememberSaveable { mutableStateOf(null) } + var selectedNationalityTag by rememberSaveable { mutableStateOf(null) } + var selectedTasteTag by rememberSaveable { mutableStateOf(null) } + var selectedOccasionTag by rememberSaveable { mutableStateOf(null) } + + Box(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize(), + verticalArrangement = Arrangement.SpaceBetween + ) { + Column( + modifier = Modifier + .fillMaxWidth() + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = stringResource(R.string.filtering), + style = ourMenuTypography().pretendard_700_16 + ) + Text( + text = stringResource(R.string.select_one), + style = ourMenuTypography().pretendard_600_14, + color = Neutral500 + ) + } + + Spacer(modifier = Modifier.height(20.dp)) + + LazyColumn( + modifier = Modifier + .padding(horizontal = 20.dp), + ) { + // ✅ 종류 (한 개만 선택 가능) + item { + TagChipGroup( + groupLabel = stringResource(R.string.type), + tags = categoryTagList, + selectedTags = listOfNotNull(selectedCategoryTag), + ) { tag -> + if (selectedCategoryTag != null && selectedCategoryTag != tag) { + scope.launch { + snackbarHostState.showSnackbar(context.getString(R.string.tag_max_one)) + } + } else { + selectedCategoryTag = if (selectedCategoryTag == tag) null else tag + } + } + } + + // ✅ 나라 별 음식 (한 개만 선택 가능) + item { + TagChipGroup( + groupLabel = stringResource(R.string.nationality), + tags = nationalityTagList, + selectedTags = listOfNotNull(selectedNationalityTag), + ) { tag -> + if (selectedNationalityTag != null && selectedNationalityTag != tag) { + scope.launch { + snackbarHostState.showSnackbar(context.getString(R.string.tag_max_one)) + } + } else { + selectedNationalityTag = + if (selectedNationalityTag == tag) null else tag + } + } + } + + // ✅ 맛 (한 개만 선택 가능) + item { + TagChipGroup( + groupLabel = stringResource(R.string.taste), + tags = tasteTagList, + selectedTags = listOfNotNull(selectedTasteTag), + ) { tag -> + if (selectedTasteTag != null && selectedTasteTag != tag) { + scope.launch { + snackbarHostState.showSnackbar(context.getString(R.string.tag_max_one)) + } + } else { + selectedTasteTag = if (selectedTasteTag == tag) null else tag + } + } + } + + // ✅ 상황 (한 개만 선택 가능) + item { + TagChipGroup( + groupLabel = stringResource(R.string.occasion), + tags = occasionTagList, + selectedTags = listOfNotNull(selectedOccasionTag), + ) { tag -> + if (selectedOccasionTag != null && selectedOccasionTag != tag) { + scope.launch { + snackbarHostState.showSnackbar(context.getString(R.string.tag_max_one)) + } + } else { + selectedOccasionTag = if (selectedOccasionTag == tag) null else tag + } + } + } + + item { Spacer(modifier = Modifier.height(12.dp)) } + + // ✅ 가격 슬라이더 + item { + Text( + text = stringResource(R.string.price_range_title), + style = ourMenuTypography().pretendard_400_14, + color = Neutral900 + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource( + R.string.price_range, + priceRange.start.toInt(), + priceRange.endInclusive.toInt() + ), + style = ourMenuTypography().pretendard_700_18 + ) + + Spacer(modifier = Modifier.height(8.dp)) + + RangeSlider( + value = priceRange, + onValueChange = { newValue -> + val adjustedStart = + (Math.round(newValue.start / stepSize) * stepSize).coerceAtLeast( + minPrice + ) + val adjustedEnd = + (Math.round(newValue.endInclusive / stepSize) * stepSize).coerceAtMost( + maxPrice + ) + + priceRange = adjustedStart..adjustedEnd // ✅ 5000 단위 반올림 적용 + }, + valueRange = minPrice..maxPrice, + steps = ((maxPrice - minPrice) / stepSize - 1).toInt(), // 5000원 단위로 이동 + colors = SliderDefaults.colors( + thumbColor = Primary500Main, + activeTrackColor = Primary500Main, + inactiveTrackColor = Neutral300, + activeTickColor = Primary500Main, + inactiveTickColor = Neutral300 + ), + modifier = Modifier.padding(horizontal = 8.dp), + startThumb = { + SliderDefaults.Thumb( + interactionSource = remember { MutableInteractionSource() }, + colors = SliderDefaults.colors( + thumbColor = Primary500Main + ), + modifier = Modifier + .size(28.dp) + .clip(CircleShape) + ) + }, + endThumb = { + SliderDefaults.Thumb( + interactionSource = remember { MutableInteractionSource() }, + colors = SliderDefaults.colors( + thumbColor = Primary500Main + ), + modifier = Modifier + .size(28.dp) + .clip(CircleShape) + ) + }, + ) + + Spacer(modifier = Modifier.height(24.dp)) + } + } + + Spacer(modifier = Modifier.height(24.dp)) + + } + + Row( + modifier = modifier + .fillMaxWidth() + .padding(bottom = 20.dp, start = 20.dp, end = 20.dp), + horizontalArrangement = Arrangement.Center + ) { + BottomHalfWidthButton( + modifier = modifier.weight(1f), + containerColor = Neutral400, + contentColor = NeutralWhite, + text = stringResource(R.string.reset) + ) { + // List 비우기 + onSelectedTagsChange(emptyList()) + } + Spacer(modifier = modifier.width(12.dp)) + BottomHalfWidthButton( + modifier = modifier.weight(1f), + containerColor = Primary500Main, + contentColor = NeutralWhite, + text = stringResource(R.string.apply) + ) { + // TODO: 아이콘 선택으로 이동 + onApplyButtonClick() + } + } + } + + OurSnackbarHost( + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(bottom = 60.dp), + hostState = snackbarHostState, + isChecked = false, + message = stringResource(R.string.tag_max_one) + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun FilterBottomSheetPreview() { + val categoryTags = listOf( + R.drawable.ic_tag_rice to "밥", + R.drawable.ic_tag_rice to "빵", + R.drawable.ic_tag_rice to "면", + R.drawable.ic_tag_rice to "고기", + R.drawable.ic_tag_rice to "생선", + R.drawable.ic_tag_rice to "카페", + R.drawable.ic_tag_rice to "디저트", + R.drawable.ic_tag_rice to "패스트푸드", + ) + val nationalityTags = listOf( + R.drawable.ic_tag_rice to "한식", + R.drawable.ic_tag_rice to "중식", + R.drawable.ic_tag_rice to "일식", + R.drawable.ic_tag_rice to "양식", + R.drawable.ic_tag_rice to "아시안", + ) + val tasteTags = listOf( + R.drawable.ic_tag_rice to "매콤함", + R.drawable.ic_tag_rice to "달달함", + R.drawable.ic_tag_rice to "시원함", + R.drawable.ic_tag_rice to "뜨끈함", + R.drawable.ic_tag_rice to "얼큰함", + ) + val occasionTags = listOf( + R.drawable.ic_tag_rice to "혼밥", + R.drawable.ic_tag_rice to "비즈니스 미팅", + R.drawable.ic_tag_rice to "친구 약속", + R.drawable.ic_tag_rice to "데이트", + R.drawable.ic_tag_rice to "밥약", + R.drawable.ic_tag_rice to "단체", + ) + var selectedTags by rememberSaveable { mutableStateOf(listOf()) } + + FilterBottomSheet( + categoryTagList = categoryTags, + nationalityTagList = nationalityTags, + tasteTagList = tasteTags, + occasionTagList = occasionTags, + onSelectedTagsChange = { newSelectedTags -> selectedTags = newSelectedTags }, + onApplyButtonClick = {} + ) +} \ No newline at end of file From 17c5557296e1cdd85f6ec8ec6345927a08725a8f Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 20 Mar 2025 20:54:27 +0900 Subject: [PATCH 07/27] =?UTF-8?q?[refactor]:=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EB=90=90=EB=8D=98=20=EB=B0=94=ED=85=80?= =?UTF-8?q?=EC=8B=9C=ED=8A=B8=20=EC=88=98=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../addmenu/component/bottomsheet/TagSelectBottomSheet.kt | 8 ++++---- .../java/com/kuit/ourmenu/ui/common/chip/TagChipGroup.kt | 7 +++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt index 35d1f19e..b9f7482c 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt @@ -83,7 +83,7 @@ fun TagSelectBottomSheet( //종류 TagChipGroup( - groupLabel = "종류", + groupLabel = stringResource(R.string.type), tags = categoryTagList, selectedTags = selectedTagList, ) { tag -> @@ -97,7 +97,7 @@ fun TagSelectBottomSheet( } //나라 별 음식 TagChipGroup( - groupLabel = "나라 별 음식", + groupLabel = stringResource(R.string.nationality), tags = nationalityTagList, selectedTags = selectedTagList, ) { tag -> @@ -111,7 +111,7 @@ fun TagSelectBottomSheet( } //맛 TagChipGroup( - groupLabel = "맛", + groupLabel = stringResource(R.string.taste), tags = tasteTagList, selectedTags = selectedTagList, ) { tag -> @@ -125,7 +125,7 @@ fun TagSelectBottomSheet( } //상황 TagChipGroup( - groupLabel = "상황", + groupLabel = stringResource(R.string.occasion), tags = occasionTagList, selectedTags = selectedTagList, ) { tag -> diff --git a/app/src/main/java/com/kuit/ourmenu/ui/common/chip/TagChipGroup.kt b/app/src/main/java/com/kuit/ourmenu/ui/common/chip/TagChipGroup.kt index 92c56fff..b3b06c1b 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/common/chip/TagChipGroup.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/common/chip/TagChipGroup.kt @@ -15,9 +15,11 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.kuit.ourmenu.R +import com.kuit.ourmenu.ui.theme.Neutral900 import com.kuit.ourmenu.ui.theme.ourMenuTypography @OptIn(ExperimentalLayoutApi::class) @@ -32,7 +34,8 @@ fun TagChipGroup( Column(modifier = modifier.fillMaxWidth()){ Text( text = groupLabel, - style = ourMenuTypography().pretendard_500_14, + style = ourMenuTypography().pretendard_400_14, + color = Neutral900 ) Spacer(modifier = modifier.height(8.dp)) FlowRow( @@ -73,7 +76,7 @@ private fun TagChipGroupPreview() { var selectedTags by rememberSaveable { mutableStateOf(listOf()) } TagChipGroup( - groupLabel = "종류", + groupLabel = stringResource(R.string.type), tags = tags, selectedTags = selectedTags, ){ tag -> From 4645d533a1e189a39af7fbe3214945d63d00bf6e Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 20 Mar 2025 20:54:43 +0900 Subject: [PATCH 08/27] =?UTF-8?q?[feat]:=20=EB=B0=94=ED=85=80=EC=8B=9C?= =?UTF-8?q?=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EC=A4=91?= =?UTF-8?q?=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen/MenuFolderAllMenuScreen.kt | 83 +++++++++++++++++-- app/src/main/res/values/strings.xml | 10 +++ 2 files changed, 84 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt index 8e28c988..85ed1a72 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt @@ -1,6 +1,8 @@ package com.kuit.ourmenu.ui.menuFolder.screen +import android.util.Log import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -10,11 +12,22 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.BottomSheetScaffold import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults -import androidx.compose.material3.Scaffold +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text +import androidx.compose.material3.rememberBottomSheetScaffoldState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource @@ -24,8 +37,10 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R +import com.kuit.ourmenu.ui.common.bottomsheet.BottomSheetDragHandle import com.kuit.ourmenu.ui.common.topappbar.BackButtonTopAppBar import com.kuit.ourmenu.ui.menuFolder.component.AddButton +import com.kuit.ourmenu.ui.menuFolder.component.FilterBottomSheet import com.kuit.ourmenu.ui.menuFolder.component.MenuFolderMenuButton import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.theme.Neutral500 @@ -34,17 +49,64 @@ import com.kuit.ourmenu.ui.theme.Neutral900 import com.kuit.ourmenu.ui.theme.NeutralWhite import com.kuit.ourmenu.ui.theme.Primary500Main import com.kuit.ourmenu.ui.theme.ourMenuTypography +import kotlinx.coroutines.launch +@OptIn(ExperimentalMaterial3Api::class) @Composable fun MenuFolderAllMenuScreen(navController: NavController) { val menuCount = 13 - val filterCount = 1 + val filterCount by rememberSaveable { mutableIntStateOf(0) } // ✅ 선택된 필터 개수 상태 관리 + var selectedFilters by rememberSaveable { mutableStateOf(listOf()) } // ✅ 선택된 필터 리스트 + + val scaffoldState = rememberBottomSheetScaffoldState() + var showBottomSheet by remember { mutableStateOf(false) } + val coroutineScope = rememberCoroutineScope() + LaunchedEffect(scaffoldState.bottomSheetState) { + snapshotFlow { scaffoldState.bottomSheetState.currentValue } + .collect { state -> + Log.d("AddMenuTagScreen", "BottomSheetState changed: $state") + } + } - Scaffold( + BottomSheetScaffold( + scaffoldState = scaffoldState, topBar = { BackButtonTopAppBar(Neutral500, false) { navController.popBackStack() } + }, + sheetContainerColor = NeutralWhite, + sheetPeekHeight = 0.dp, + sheetContent = { + FilterBottomSheet( + categoryTagList = listOf( + R.drawable.ic_tag_rice to "밥", + R.drawable.ic_tag_rice to "빵", + R.drawable.ic_tag_rice to "면" + ), + nationalityTagList = listOf( + R.drawable.ic_tag_rice to "한식", + R.drawable.ic_tag_rice to "중식", + R.drawable.ic_tag_rice to "일식" + ), + tasteTagList = listOf( + R.drawable.ic_tag_rice to "매콤함", + R.drawable.ic_tag_rice to "달달함", + R.drawable.ic_tag_rice to "시원함" + ), + occasionTagList = listOf( + R.drawable.ic_tag_rice to "혼밥", + R.drawable.ic_tag_rice to "친구 약속", + R.drawable.ic_tag_rice to "데이트" + ), + onApplyButtonClick = { + showBottomSheet = false + }, + onSelectedTagsChange = { newSelectedTags -> selectedFilters = newSelectedTags }, + ) + }, + sheetDragHandle = { + BottomSheetDragHandle() } ) { innerPadding -> Column( @@ -76,7 +138,6 @@ fun MenuFolderAllMenuScreen(navController: NavController) { ) } - // TODO: 드롭다운 만들기 Row { Text( text = stringResource(R.string.sort_type), @@ -93,10 +154,16 @@ fun MenuFolderAllMenuScreen(navController: NavController) { } } - // TODO: 버튼 누르면 필터 적용 + // ✅ 필터 버튼 (필터 개수 반영) Card( shape = RoundedCornerShape(12.dp), - modifier = Modifier.padding(top = 24.dp, bottom = 16.dp, start = 20.dp), + modifier = Modifier + .padding(top = 24.dp, bottom = 16.dp, start = 20.dp) + .clickable { + coroutineScope.launch { + scaffoldState.bottomSheetState.expand() // ✅ 버튼 클릭 시 BottomSheet 열기 + } + }, colors = CardDefaults.cardColors(containerColor = Primary500Main), elevation = CardDefaults.cardElevation(defaultElevation = 8.dp) ) { @@ -112,7 +179,7 @@ fun MenuFolderAllMenuScreen(navController: NavController) { Spacer(modifier = Modifier.width(8.dp)) Text( - text = "$filterCount", + text = "$filterCount", // ✅ 선택된 필터 개수 반영 color = NeutralWhite, style = ourMenuTypography().pretendard_700_16 ) @@ -142,8 +209,6 @@ fun MenuFolderAllMenuScreen(navController: NavController) { } } } - - } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 566ed508..baf1705c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -97,4 +97,14 @@ %d 개 이름순 한강 뷰 맛집 + 필터링 + 각 항목 당 1개 선택 + 가격대 + %d원 ~ %d원 + 태그는 항목 당 1개만 선택할 수 있어요 + + 종류 + 나라 별 음식 + + 상황 \ No newline at end of file From 82f18eea12d8f50b7c38d449fe90add29781052f Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 20 Mar 2025 21:05:20 +0900 Subject: [PATCH 09/27] =?UTF-8?q?[fix]:=20=EC=B4=88=EA=B8=B0=ED=99=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menuFolder/component/FilterBottomSheet.kt | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt index 310eec13..3d30ea12 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt @@ -107,7 +107,7 @@ fun FilterBottomSheet( modifier = Modifier .padding(horizontal = 20.dp), ) { - // ✅ 종류 (한 개만 선택 가능) + // 종류 item { TagChipGroup( groupLabel = stringResource(R.string.type), @@ -124,7 +124,7 @@ fun FilterBottomSheet( } } - // ✅ 나라 별 음식 (한 개만 선택 가능) + // 나라 별 음식 item { TagChipGroup( groupLabel = stringResource(R.string.nationality), @@ -142,7 +142,7 @@ fun FilterBottomSheet( } } - // ✅ 맛 (한 개만 선택 가능) + // 맛 item { TagChipGroup( groupLabel = stringResource(R.string.taste), @@ -159,7 +159,7 @@ fun FilterBottomSheet( } } - // ✅ 상황 (한 개만 선택 가능) + // 상황 item { TagChipGroup( groupLabel = stringResource(R.string.occasion), @@ -178,7 +178,7 @@ fun FilterBottomSheet( item { Spacer(modifier = Modifier.height(12.dp)) } - // ✅ 가격 슬라이더 + // 가격 슬라이더 item { Text( text = stringResource(R.string.price_range_title), @@ -265,8 +265,12 @@ fun FilterBottomSheet( contentColor = NeutralWhite, text = stringResource(R.string.reset) ) { - // List 비우기 - onSelectedTagsChange(emptyList()) + // 모든 선택된 필터 초기화 + selectedCategoryTag = null + selectedNationalityTag = null + selectedTasteTag = null + selectedOccasionTag = null + priceRange = minPrice..maxPrice } Spacer(modifier = modifier.width(12.dp)) BottomHalfWidthButton( @@ -275,7 +279,6 @@ fun FilterBottomSheet( contentColor = NeutralWhite, text = stringResource(R.string.apply) ) { - // TODO: 아이콘 선택으로 이동 onApplyButtonClick() } } From 793291225fe99c65df7ec2f2f1abc4b9c77e97a6 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Tue, 25 Mar 2025 23:29:15 +0900 Subject: [PATCH 10/27] =?UTF-8?q?[fix]:=20=EB=B0=94=ED=85=80=EC=8B=9C?= =?UTF-8?q?=ED=8A=B8=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/menuFolder/screen/MenuFolderAllMenuScreen.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt index 85ed1a72..ff13f38c 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt @@ -23,7 +23,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue @@ -55,11 +54,10 @@ import kotlinx.coroutines.launch @Composable fun MenuFolderAllMenuScreen(navController: NavController) { val menuCount = 13 - val filterCount by rememberSaveable { mutableIntStateOf(0) } // ✅ 선택된 필터 개수 상태 관리 + var filterCount by rememberSaveable { mutableIntStateOf(0) } // ✅ 선택된 필터 개수 상태 관리 var selectedFilters by rememberSaveable { mutableStateOf(listOf()) } // ✅ 선택된 필터 리스트 val scaffoldState = rememberBottomSheetScaffoldState() - var showBottomSheet by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() LaunchedEffect(scaffoldState.bottomSheetState) { snapshotFlow { scaffoldState.bottomSheetState.currentValue } @@ -100,7 +98,10 @@ fun MenuFolderAllMenuScreen(navController: NavController) { R.drawable.ic_tag_rice to "데이트" ), onApplyButtonClick = { - showBottomSheet = false + coroutineScope.launch { + scaffoldState.bottomSheetState.partialExpand() // ✅ 적용 버튼 클릭 시 BottomSheet 닫기 + } + }, onSelectedTagsChange = { newSelectedTags -> selectedFilters = newSelectedTags }, ) From 24be41da6ec438e2a374089b1e755688d02170de Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Tue, 25 Mar 2025 23:49:37 +0900 Subject: [PATCH 11/27] =?UTF-8?q?[fix]:=20=ED=95=84=ED=84=B0=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=20=EB=B0=98=EC=98=81=20=EC=95=88=EB=90=98=EB=8A=94?= =?UTF-8?q?=EA=B1=B0=20=EC=88=98=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/menuFolder/component/FilterBottomSheet.kt | 16 ++++++++++++++++ .../menuFolder/screen/MenuFolderAllMenuScreen.kt | 1 + 2 files changed, 17 insertions(+) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt index 3d30ea12..99a40bbb 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt @@ -74,6 +74,16 @@ fun FilterBottomSheet( var selectedTasteTag by rememberSaveable { mutableStateOf(null) } var selectedOccasionTag by rememberSaveable { mutableStateOf(null) } + fun updateSelectedTags() { + val selectedTags = listOfNotNull( + selectedCategoryTag, + selectedNationalityTag, + selectedTasteTag, + selectedOccasionTag + ) + onSelectedTagsChange(selectedTags) + } + Box(modifier = Modifier.fillMaxSize()) { Column( modifier = Modifier @@ -120,6 +130,7 @@ fun FilterBottomSheet( } } else { selectedCategoryTag = if (selectedCategoryTag == tag) null else tag + updateSelectedTags() } } } @@ -138,6 +149,7 @@ fun FilterBottomSheet( } else { selectedNationalityTag = if (selectedNationalityTag == tag) null else tag + updateSelectedTags() } } } @@ -155,6 +167,7 @@ fun FilterBottomSheet( } } else { selectedTasteTag = if (selectedTasteTag == tag) null else tag + updateSelectedTags() } } } @@ -172,6 +185,7 @@ fun FilterBottomSheet( } } else { selectedOccasionTag = if (selectedOccasionTag == tag) null else tag + updateSelectedTags() } } } @@ -271,6 +285,8 @@ fun FilterBottomSheet( selectedTasteTag = null selectedOccasionTag = null priceRange = minPrice..maxPrice + + onSelectedTagsChange(emptyList()) } Spacer(modifier = modifier.width(12.dp)) BottomHalfWidthButton( diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt index ff13f38c..f96bf42c 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt @@ -99,6 +99,7 @@ fun MenuFolderAllMenuScreen(navController: NavController) { ), onApplyButtonClick = { coroutineScope.launch { + filterCount = selectedFilters.size // ✅ 적용 버튼 클릭 시 선택된 필터 개수 반영 scaffoldState.bottomSheetState.partialExpand() // ✅ 적용 버튼 클릭 시 BottomSheet 닫기 } From 9dd4ee8f48903f9dd2d586a3d434709ee7f06440 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 26 Mar 2025 01:21:57 +0900 Subject: [PATCH 12/27] =?UTF-8?q?[UI]:=20=EC=A0=95=EB=A0=AC=20=EB=93=9C?= =?UTF-8?q?=EB=A1=AD=EB=8B=A4=EC=9A=B4=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=83=9D=EC=84=B1=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/menuFolder/component/SortDropdown.kt | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/SortDropdown.kt diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/SortDropdown.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/SortDropdown.kt new file mode 100644 index 00000000..b7658dc0 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/SortDropdown.kt @@ -0,0 +1,112 @@ +package com.kuit.ourmenu.ui.menuFolder.component + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.kuit.ourmenu.R +import com.kuit.ourmenu.ui.theme.Neutral500 +import com.kuit.ourmenu.ui.theme.Neutral700 +import com.kuit.ourmenu.ui.theme.NeutralWhite +import com.kuit.ourmenu.ui.theme.Primary500Main +import com.kuit.ourmenu.ui.theme.ourMenuTypography + +@Composable +fun SortDropdown( + options: List, + selectedOption: String, + onSelectedOptionChange: (String) -> Unit +) { + var expanded by remember { mutableStateOf(false) } + + Box { + Row( + modifier = Modifier.clickable { + expanded = true + }, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = selectedOption, + style = ourMenuTypography().pretendard_500_14, + color = Neutral700 + ) + + Spacer(modifier = Modifier.width(8.dp)) + + Image( + painter = if (expanded) painterResource(id = R.drawable.ic_dropdown_btn_up) else painterResource( + id = R.drawable.ic_dropdown_btn + ), + modifier = Modifier.size(16.dp), + contentDescription = "Expand Down" + ) + } + + DropdownMenu( + modifier = Modifier + .width(72.dp) + .background(color = NeutralWhite, shape = RoundedCornerShape(8.dp)), + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + options.forEach { option -> + val isSelected = option == selectedOption + + DropdownMenuItem( + modifier = Modifier + .width(72.dp), + text = { + Text( + text = option, + style = ourMenuTypography().pretendard_500_14.copy( + color = if (isSelected) Primary500Main else Neutral500 + ) + ) + }, + onClick = { + onSelectedOptionChange(option) + } + ) + } + } + } + +} + +@Preview(showBackground = true) +@Composable +private fun SortDropdownPreview() { + val options = listOf("이름순", "등록순", "가격순") + var selectedOption by rememberSaveable { mutableStateOf("이름순") } + + Column(modifier = Modifier.fillMaxSize()) { + SortDropdown( + options = options, + selectedOption = selectedOption + ) { + selectedOption = it + } + } +} \ No newline at end of file From f42ef94841ca4c8d269bca9dd6fffd72c39d6724 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 26 Mar 2025 01:24:34 +0900 Subject: [PATCH 13/27] =?UTF-8?q?[fix]:=20toast=20message=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt | 1 - .../kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt index b9f7482c..e9aadedc 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt @@ -173,7 +173,6 @@ fun TagSelectBottomSheet( .padding(bottom = 60.dp), hostState = snackbarHostState, isChecked = false, - message = stringResource(R.string.tag_number_warning) ) } } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt index 99a40bbb..d357c9e2 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/FilterBottomSheet.kt @@ -223,7 +223,7 @@ fun FilterBottomSheet( maxPrice ) - priceRange = adjustedStart..adjustedEnd // ✅ 5000 단위 반올림 적용 + priceRange = adjustedStart..adjustedEnd // 5000 단위 반올림 적용 }, valueRange = minPrice..maxPrice, steps = ((maxPrice - minPrice) / stepSize - 1).toInt(), // 5000원 단위로 이동 @@ -306,7 +306,6 @@ fun FilterBottomSheet( .padding(bottom = 60.dp), hostState = snackbarHostState, isChecked = false, - message = stringResource(R.string.tag_max_one) ) } } From 070145003444ca47a4323be84e581faedc1f3bf3 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 26 Mar 2025 01:34:33 +0900 Subject: [PATCH 14/27] =?UTF-8?q?[UI]:=20=EB=93=9C=EB=A1=AD=EB=8B=A4?= =?UTF-8?q?=EC=9A=B4=20=EC=83=89=EC=83=81=20=EC=88=98=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/ui/menuFolder/component/SortDropdown.kt | 9 ++++++--- app/src/main/res/drawable/ic_dropdown_btn_up.xml | 13 +++++++++++++ app/src/main/res/values/strings.xml | 1 - 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable/ic_dropdown_btn_up.xml diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/SortDropdown.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/SortDropdown.kt index b7658dc0..23b98e90 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/SortDropdown.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/SortDropdown.kt @@ -1,6 +1,5 @@ package com.kuit.ourmenu.ui.menuFolder.component -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -13,6 +12,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -22,6 +22,7 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -34,6 +35,7 @@ import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable fun SortDropdown( + color: Color = Neutral700, options: List, selectedOption: String, onSelectedOptionChange: (String) -> Unit @@ -50,15 +52,16 @@ fun SortDropdown( Text( text = selectedOption, style = ourMenuTypography().pretendard_500_14, - color = Neutral700 + color = color ) Spacer(modifier = Modifier.width(8.dp)) - Image( + Icon( painter = if (expanded) painterResource(id = R.drawable.ic_dropdown_btn_up) else painterResource( id = R.drawable.ic_dropdown_btn ), + tint = color, modifier = Modifier.size(16.dp), contentDescription = "Expand Down" ) diff --git a/app/src/main/res/drawable/ic_dropdown_btn_up.xml b/app/src/main/res/drawable/ic_dropdown_btn_up.xml new file mode 100644 index 00000000..0a7f15f1 --- /dev/null +++ b/app/src/main/res/drawable/ic_dropdown_btn_up.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index baf1705c..fb74a352 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -95,7 +95,6 @@ %d 원 전체 메뉴 %d 개 - 이름순 한강 뷰 맛집 필터링 각 항목 당 1개 선택 From 817a897b6a41cf8fecac7d313cb6b7b08c39feaf Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 26 Mar 2025 01:35:15 +0900 Subject: [PATCH 15/27] =?UTF-8?q?[feat]:=20=EC=A0=95=EB=A0=AC=20=EB=93=9C?= =?UTF-8?q?=EB=A1=AD=EB=8B=A4=EC=9A=B4=20=EC=A0=81=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen/MenuFolderAllMenuScreen.kt | 36 +++++++++---------- .../screen/MenuFolderDetailScreen.kt | 30 ++++++++-------- 2 files changed, 30 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt index f96bf42c..6de8731b 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderAllMenuScreen.kt @@ -41,6 +41,7 @@ import com.kuit.ourmenu.ui.common.topappbar.BackButtonTopAppBar import com.kuit.ourmenu.ui.menuFolder.component.AddButton import com.kuit.ourmenu.ui.menuFolder.component.FilterBottomSheet import com.kuit.ourmenu.ui.menuFolder.component.MenuFolderMenuButton +import com.kuit.ourmenu.ui.menuFolder.component.SortDropdown import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.theme.Neutral500 import com.kuit.ourmenu.ui.theme.Neutral700 @@ -54,8 +55,11 @@ import kotlinx.coroutines.launch @Composable fun MenuFolderAllMenuScreen(navController: NavController) { val menuCount = 13 - var filterCount by rememberSaveable { mutableIntStateOf(0) } // ✅ 선택된 필터 개수 상태 관리 - var selectedFilters by rememberSaveable { mutableStateOf(listOf()) } // ✅ 선택된 필터 리스트 + var filterCount by rememberSaveable { mutableIntStateOf(0) } // 선택된 필터 개수 상태 관리 + var selectedFilters by rememberSaveable { mutableStateOf(listOf()) } // 선택된 필터 리스트 + + val options = listOf("이름순", "등록순", "가격순") + var selectedOption by rememberSaveable { mutableStateOf("이름순") } val scaffoldState = rememberBottomSheetScaffoldState() val coroutineScope = rememberCoroutineScope() @@ -99,8 +103,8 @@ fun MenuFolderAllMenuScreen(navController: NavController) { ), onApplyButtonClick = { coroutineScope.launch { - filterCount = selectedFilters.size // ✅ 적용 버튼 클릭 시 선택된 필터 개수 반영 - scaffoldState.bottomSheetState.partialExpand() // ✅ 적용 버튼 클릭 시 BottomSheet 닫기 + filterCount = selectedFilters.size // 적용 버튼 클릭 시 선택된 필터 개수 반영 + scaffoldState.bottomSheetState.partialExpand() // 적용 버튼 클릭 시 BottomSheet 닫기 } }, @@ -140,30 +144,22 @@ fun MenuFolderAllMenuScreen(navController: NavController) { ) } - Row { - Text( - text = stringResource(R.string.sort_type), - style = ourMenuTypography().pretendard_500_14, - color = Neutral700 - ) - - Spacer(modifier = Modifier.width(8.dp)) - - Image( - painter = painterResource(id = R.drawable.ic_dropdown_btn), - contentDescription = "Expand Down" - ) + SortDropdown( + options = options, + selectedOption = selectedOption, + ) { + selectedOption = it } } - // ✅ 필터 버튼 (필터 개수 반영) + // 필터 버튼 (필터 개수 반영) Card( shape = RoundedCornerShape(12.dp), modifier = Modifier .padding(top = 24.dp, bottom = 16.dp, start = 20.dp) .clickable { coroutineScope.launch { - scaffoldState.bottomSheetState.expand() // ✅ 버튼 클릭 시 BottomSheet 열기 + scaffoldState.bottomSheetState.expand() // 버튼 클릭 시 BottomSheet 열기 } }, colors = CardDefaults.cardColors(containerColor = Primary500Main), @@ -181,7 +177,7 @@ fun MenuFolderAllMenuScreen(navController: NavController) { Spacer(modifier = Modifier.width(8.dp)) Text( - text = "$filterCount", // ✅ 선택된 필터 개수 반영 + text = "$filterCount", // 선택된 필터 개수 반영 color = NeutralWhite, style = ourMenuTypography().pretendard_700_16 ) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt index f01dff2e..a7d8f914 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderDetailScreen.kt @@ -14,10 +14,13 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush @@ -33,6 +36,7 @@ import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.common.topappbar.BackButtonTopAppBar import com.kuit.ourmenu.ui.menuFolder.component.AddButton import com.kuit.ourmenu.ui.menuFolder.component.MenuFolderMenuButton +import com.kuit.ourmenu.ui.menuFolder.component.SortDropdown import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.theme.Neutral50 import com.kuit.ourmenu.ui.theme.NeutralWhite @@ -42,6 +46,9 @@ import com.kuit.ourmenu.ui.theme.ourMenuTypography fun MenuFolderDetailScreen(navController: NavController) { val menuCount = 13 // 임의로 정한 값 + val options = listOf("이름순", "등록순", "가격순") + var selectedOption by rememberSaveable { mutableStateOf("이름순") } + Scaffold( topBar = {}, content = { innerPadding -> @@ -107,21 +114,12 @@ fun MenuFolderDetailScreen(navController: NavController) { ) } - // TODO: 드롭다운 만들기 - Row { - Text( - text = stringResource(R.string.sort_type), - style = ourMenuTypography().pretendard_500_14, - color = Neutral50 - ) - - Spacer(modifier = Modifier.width(8.dp)) - - Icon( - painter = painterResource(id = R.drawable.ic_dropdown_btn), - contentDescription = "Expand Down", - tint = Neutral50 - ) + SortDropdown( + options = options, + selectedOption = selectedOption, + color = NeutralWhite + ) { + selectedOption = it } } } From 24b3579472ede5f8a6b4a9d2dcc4ad9a01897700 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:30:14 +0900 Subject: [PATCH 16/27] =?UTF-8?q?[fix]:=20api=20BASE=5FURL=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 6 +++++- gradle.properties | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 70f3cff9..5a32f2c2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -25,7 +25,7 @@ android { versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - buildConfigField("String", "BASE_URL", properties["BASE_URL"].toString()) + buildConfigField("String", "BASE_URL", "\"${properties["BASE_URL"]}\"") manifestPlaceholders["KAKAO_APP_KEY"] = properties["KAKAO_APP_KEY"].toString() buildConfigField("String", "KAKAO_APP_KEY", properties["KAKAO_APP_KEY"].toString()) @@ -96,6 +96,10 @@ dependencies { // Kakao SDK implementation("com.kakao.sdk:v2-all:2.20.6") implementation("com.kakao.sdk:v2-user:2.20.6") // 카카오 로그인 API 모듈 + + // image + implementation("io.coil-kt.coil3:coil-compose:3.1.0") + implementation("io.coil-kt.coil3:coil-network-okhttp:3.1.0") } // Hilt를 사용할 때 필요한 Annotation Processor diff --git a/gradle.properties b/gradle.properties index 20e2a015..2661ee69 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,4 +20,6 @@ kotlin.code.style=official # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file +android.nonTransitiveRClass=true + +android.defaults.buildfeatures.buildconfig=true \ No newline at end of file From b618c2e908cef5429593bd4f0adde175d9477ed4 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:32:13 +0900 Subject: [PATCH 17/27] =?UTF-8?q?[feat]:=20menuFolder=20Response=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/menuFolder/response/MenuFolderResponse.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderResponse.kt diff --git a/app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderResponse.kt b/app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderResponse.kt new file mode 100644 index 00000000..9c95d534 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderResponse.kt @@ -0,0 +1,10 @@ +package com.kuit.ourmenu.data.model.menuFolder.response + +data class MenuFolderResponse( + val menuFolderId: Int, + val menuFolderTitle: String, + val menuFolderUrl: String, + val menuFolderIcon: String, + val menuIds: List, + val index: Int, +) \ No newline at end of file From cd7edc8c5c450c0ee97dc1aa586cd524200602bc Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:32:31 +0900 Subject: [PATCH 18/27] =?UTF-8?q?[feat]:=20menuFolder=20Service=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kuit/ourmenu/data/service/MenuFolderService.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 app/src/main/java/com/kuit/ourmenu/data/service/MenuFolderService.kt diff --git a/app/src/main/java/com/kuit/ourmenu/data/service/MenuFolderService.kt b/app/src/main/java/com/kuit/ourmenu/data/service/MenuFolderService.kt new file mode 100644 index 00000000..9c1274a7 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/data/service/MenuFolderService.kt @@ -0,0 +1,10 @@ +package com.kuit.ourmenu.data.service + +import com.kuit.ourmenu.data.model.base.BaseResponse +import com.kuit.ourmenu.data.model.menuFolder.response.MenuFolderResponse +import retrofit2.http.GET + +interface MenuFolderService { + @GET("api/menu-folders") + suspend fun getMenuFolders(): BaseResponse> +} \ No newline at end of file From ab24a8b28270edb6ae8dd0f7c8ed477138f07689 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:32:42 +0900 Subject: [PATCH 19/27] =?UTF-8?q?[feat]:=20menuFolder=20Repository=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/repository/MenuFolderRepository.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 app/src/main/java/com/kuit/ourmenu/data/repository/MenuFolderRepository.kt diff --git a/app/src/main/java/com/kuit/ourmenu/data/repository/MenuFolderRepository.kt b/app/src/main/java/com/kuit/ourmenu/data/repository/MenuFolderRepository.kt new file mode 100644 index 00000000..79b2464d --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/data/repository/MenuFolderRepository.kt @@ -0,0 +1,15 @@ +package com.kuit.ourmenu.data.repository + +import com.kuit.ourmenu.data.model.base.handleBaseResponse +import com.kuit.ourmenu.data.service.MenuFolderService +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class MenuFolderRepository @Inject constructor( + private val menuFolderService: MenuFolderService, +) { + suspend fun getMenuFolders() = runCatching { + menuFolderService.getMenuFolders().handleBaseResponse().getOrThrow() + } +} \ No newline at end of file From be6fa4af9a66ab70841feda57cbbaabf40f335f8 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:32:53 +0900 Subject: [PATCH 20/27] =?UTF-8?q?[feat]:=20menuFolder=20ViewModel=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../viewmodel/MenuFolderViewModel.kt | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 app/src/main/java/com/kuit/ourmenu/ui/menuFolder/viewmodel/MenuFolderViewModel.kt diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/viewmodel/MenuFolderViewModel.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/viewmodel/MenuFolderViewModel.kt new file mode 100644 index 00000000..e6ec22f1 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/viewmodel/MenuFolderViewModel.kt @@ -0,0 +1,52 @@ +package com.kuit.ourmenu.ui.menuFolder.viewmodel + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.kuit.ourmenu.data.model.menuFolder.response.MenuFolderResponse +import com.kuit.ourmenu.data.repository.MenuFolderRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class MenuFolderViewModel @Inject constructor( + private val menuFolderRepository: MenuFolderRepository +): ViewModel() { + + private val _menuFolders = MutableStateFlow>(emptyList()) + val menuFolders = _menuFolders.asStateFlow() + + private val _error: MutableStateFlow = MutableStateFlow(null) + val error = _error.asStateFlow() + + private val _isLoading = MutableStateFlow(false) + val isLoading = _isLoading.asStateFlow() +// val menuFolders = mutableStateListOf() +// private val isLoading = mutableStateOf(false) +// private val errorMessage = mutableStateOf(null) + + init { + getMenuFolders() + } + + fun getMenuFolders() { + viewModelScope.launch { + _isLoading.value = true + _error.value = null + + menuFolderRepository.getMenuFolders() + .onSuccess { response -> + if (response != null) { + _menuFolders.value = response.sortedBy { it.index } + } + } + .onFailure { throwable -> + _error.value = throwable.message ?: "메뉴 폴더를 불러오는 중 오류가 발생했습니다." + } + + _isLoading.value = false + } + } +} \ No newline at end of file From 24086537f87cc5fb250213b1abe3de2e968a389e Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:33:07 +0900 Subject: [PATCH 21/27] =?UTF-8?q?[feat]:=20service=20module=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/kuit/ourmenu/data/di/ServiceModule.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/com/kuit/ourmenu/data/di/ServiceModule.kt b/app/src/main/java/com/kuit/ourmenu/data/di/ServiceModule.kt index a5dc9f44..eba4aef0 100644 --- a/app/src/main/java/com/kuit/ourmenu/data/di/ServiceModule.kt +++ b/app/src/main/java/com/kuit/ourmenu/data/di/ServiceModule.kt @@ -2,6 +2,7 @@ package com.kuit.ourmenu.data.di import com.kuit.ourmenu.data.service.AuthService import com.kuit.ourmenu.data.service.DummyService +import com.kuit.ourmenu.data.service.MenuFolderService import com.kuit.ourmenu.data.service.UserService import dagger.Module import dagger.Provides @@ -28,4 +29,10 @@ object ServiceModule { @Singleton fun providesUserService(retrofit: Retrofit): UserService = retrofit.create(UserService::class.java) + + @Provides + @Singleton + fun provideMenuFolderService(retrofit: Retrofit): MenuFolderService = + retrofit.create(MenuFolderService::class.java) + } \ No newline at end of file From e6f5f0c3d0e899f007a8887c6678a32c2be59838 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:33:33 +0900 Subject: [PATCH 22/27] =?UTF-8?q?[feat]:=20menuFolderIconType=20enum=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menuFolder/response/MenuFolderIconType.kt | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderIconType.kt diff --git a/app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderIconType.kt b/app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderIconType.kt new file mode 100644 index 00000000..1cc975e1 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderIconType.kt @@ -0,0 +1,36 @@ +package com.kuit.ourmenu.data.model.menuFolder.response + +enum class MenuFolderIconType { + ANGRY, + BAEKSUK, + BASKET, + BREAD, + CLOUD, + COFFEE, + CONGRATS, + COUPLE, + CRY, + DICE, + DOUGHNUT, + FIRE, + FISH, + FISH_BREAD, + HAMBURGER, + HEART, + ICE_CREAM, + JJAMBBONG, + LEAF, + MAN, + MEAT, + NOODLE, + PEOPLE, + RAMEN, + RICE, + SMILE, + SNOWMAN, + SPOON_AND_CHOPSTICK, + SUN, + SUNNY, + SUSHI, + TABLE, +} \ No newline at end of file From 1687bcd75106db805c9cbed8b6ecaa94db2d8779 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:33:43 +0900 Subject: [PATCH 23/27] =?UTF-8?q?[feat]:=20menuFolder=20api=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EB=A1=9C=EC=A7=81=20=EC=9E=91=EC=84=B1=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menuFolder/component/MenuFolderButton.kt | 40 +++-- .../ui/menuFolder/screen/MenuFolderScreen.kt | 151 ++++++++++++------ 2 files changed, 131 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt index 45afe69f..dbded571 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt @@ -35,7 +35,9 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import coil3.compose.AsyncImage import com.kuit.ourmenu.R +import com.kuit.ourmenu.data.model.menuFolder.response.MenuFolderResponse import com.kuit.ourmenu.ui.theme.Neutral300 import com.kuit.ourmenu.ui.theme.Neutral700 import com.kuit.ourmenu.ui.theme.NeutralWhite @@ -46,6 +48,7 @@ import kotlinx.coroutines.launch @Composable fun MenuFolderButton( + menuFolder: MenuFolderResponse, isSwiped: Boolean, // 현재 버튼이 스와이프된 상태인지 확인 onSwipe: () -> Unit, // 새로운 버튼이 스와이프될 때 호출 onReset: () -> Unit, // 버튼이 닫히면 호출 @@ -89,11 +92,14 @@ fun MenuFolderButton( } // 스와이프 상태일 때만 offset 적용 - Box(modifier = Modifier - .offset(x = if (isSwiped) offsetX.dp else 0.dp) - .clickable(onClick = onButtonClick) + Box( + modifier = Modifier + .offset(x = if (isSwiped) offsetX.dp else 0.dp) + .clickable(onClick = onButtonClick) ) { - MenuFolderContent() + MenuFolderContent( + menuFolder = menuFolder + ) } } } @@ -154,15 +160,18 @@ fun MenuFolderDeleteButton(onDeleteClick: () -> Unit = {}) { } @Composable -fun MenuFolderContent() { - val menuCount = 5 // 임의로 정한 값 +fun MenuFolderContent( + menuFolder: MenuFolderResponse, +) { + val menuCount = menuFolder.menuIds.size Box( modifier = Modifier .fillMaxSize() ) { - Image( - painter = painterResource(id = R.drawable.img_dummy_pizza), + AsyncImage( +// painter = painterResource(id = R.drawable.img_dummy_pizza), + model = menuFolder.menuFolderUrl, contentDescription = "Folder Image", contentScale = ContentScale.FillWidth, modifier = Modifier @@ -194,7 +203,7 @@ fun MenuFolderContent() { ) Spacer(modifier = Modifier.width(4.dp)) Text( - text = stringResource(R.string.menu_folder_name), + text = menuFolder.menuFolderTitle, color = NeutralWhite, style = ourMenuTypography().pretendard_500_24, ) @@ -220,5 +229,16 @@ fun gradientBrush(): Brush { @Preview(showBackground = true) @Composable private fun MenuFolderButtonPreview() { - MenuFolderButton(false, {}, {}) + val dummyMenuFolder = MenuFolderResponse( + menuFolderId = 1, + menuFolderTitle = "인기 메뉴", + menuFolderUrl = "https://ourmenu-default.s3.ap-northeast-2.amazonaws.com/default_menu_folder_img.svg", + menuFolderIcon = "DICE", + menuIds = listOf(1, 2, 3), + index = 0 + ) + + MenuFolderButton( + menuFolder = dummyMenuFolder, + false, {}, {}) } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt index 756df97f..3c2096bb 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt @@ -1,5 +1,6 @@ package com.kuit.ourmenu.ui.menuFolder.screen +import android.util.Log import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -8,6 +9,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Scaffold import androidx.compose.material3.Text @@ -22,25 +24,38 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.menuFolder.component.AddButton import com.kuit.ourmenu.ui.menuFolder.component.MenuFolderButton import com.kuit.ourmenu.ui.menuFolder.component.MenuFolderTopAppBar +import com.kuit.ourmenu.ui.menuFolder.viewmodel.MenuFolderViewModel import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.theme.NeutralWhite import com.kuit.ourmenu.ui.theme.Primary500Main import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable -fun MenuFolderScreen(navController: NavController) { +fun MenuFolderScreen( + navController: NavController, + viewModel: MenuFolderViewModel = hiltViewModel() +) { val menuCount = 5 // 임의로 정한 값 val menuFolderCount = 8 // 임의로 정한 값 // 현재 스와이프된 버튼의 인덱스를 관리 (한 번에 하나만 스와이프되도록) var swipedIndex by remember { mutableIntStateOf(-1) } + val menuFolders by viewModel.menuFolders.collectAsStateWithLifecycle() + val isLoading by viewModel.isLoading.collectAsStateWithLifecycle() + val error by viewModel.error.collectAsStateWithLifecycle() + val totalMenuCount = menuFolders.sumOf { it.menuIds.size } + + Log.d("MenuFolderScreen", "menuFolders: $menuFolders") + Scaffold( topBar = { MenuFolderTopAppBar( @@ -50,63 +65,99 @@ fun MenuFolderScreen(navController: NavController) { ) } ) { innerPadding -> - LazyColumn( - modifier = Modifier - .padding(innerPadding) - .padding(horizontal = 20.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { - item { - Column( - modifier = Modifier - .padding(top = 24.dp) - .height(64.dp) - .fillMaxWidth() - .clip(RoundedCornerShape(12.dp)) - .background(Primary500Main) - .clickable(onClick = { - navController.navigate(route = Routes.MenuFolderAllMenu) - }), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Text( - text = stringResource(R.string.see_all_menu), - color = NeutralWhite, - style = ourMenuTypography().pretendard_700_18 - ) +// if (isLoading) { +// // 로딩 상태 표시 +// Column( +// modifier = Modifier +// .padding(innerPadding) +// .fillMaxWidth() +// .padding(top = 100.dp), +// horizontalAlignment = Alignment.CenterHorizontally +// ) { +// Text(text = "로딩 중...", style = ourMenuTypography().pretendard_500_16) +// } +// } else if (error != null) { +// // 에러 상태 표시 +// Column( +// modifier = Modifier +// .padding(innerPadding) +// .fillMaxWidth() +// .padding(top = 100.dp), +// horizontalAlignment = Alignment.CenterHorizontally +// ) { +// Text(text = error ?: "에러 발생", color = MaterialTheme.colorScheme.error) +// } +// } else { + LazyColumn( + modifier = Modifier + .padding(innerPadding) + .padding(horizontal = 20.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + item { + Column( + modifier = Modifier + .padding(top = 24.dp) + .height(64.dp) + .fillMaxWidth() + .clip(RoundedCornerShape(12.dp)) + .background(Primary500Main) + .clickable(onClick = { + navController.navigate(route = Routes.MenuFolderAllMenu) + }), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = stringResource(R.string.see_all_menu), + color = NeutralWhite, + style = ourMenuTypography().pretendard_700_18 + ) - Text( - text = String.format(stringResource(R.string.menu_count), menuCount), - color = NeutralWhite, - style = ourMenuTypography().pretendard_500_14, + Text( + text = String.format(stringResource(R.string.menu_count), totalMenuCount), + color = NeutralWhite, + style = ourMenuTypography().pretendard_500_14, + ) + } + } + + // 스와이프 제어 + // TODO: 드래그 앤 드롭 구현 +// items(menuFolderCount) { index -> +// MenuFolderButton( +// isSwiped = swipedIndex == index, // 현재 스와이프된 아이템인지 확인 +// onSwipe = { swipedIndex = index }, // 새로운 버튼이 스와이프되면 상태 변경 +// onReset = { if (swipedIndex == index) swipedIndex = -1 }, // 닫히면 초기화 +// onButtonClick = { +// navController.navigate(route = Routes.MenuFolderDetail) +// } +// ) +// } + // 서버에서 받아온 menuFolders 기준으로 출력 + itemsIndexed(menuFolders) { index, folder -> + MenuFolderButton( + menuFolder = folder, + isSwiped = swipedIndex == index, + onSwipe = { swipedIndex = index }, + onReset = { if (swipedIndex == index) swipedIndex = -1 }, + onButtonClick = { + navController.navigate(route = Routes.MenuFolderDetail) + } ) } - } - // 스와이프 제어 - // TODO: 드래그 앤 드롭 구현 - items(menuFolderCount) { index -> - MenuFolderButton( - isSwiped = swipedIndex == index, // 현재 스와이프된 아이템인지 확인 - onSwipe = { swipedIndex = index }, // 새로운 버튼이 스와이프되면 상태 변경 - onReset = { if (swipedIndex == index) swipedIndex = -1 }, // 닫히면 초기화 - onButtonClick = { - navController.navigate(route = Routes.MenuFolderDetail) + item { + AddButton( + stringResource(R.string.add_menu_folder), + modifier = Modifier + ) { + // TODO: 버튼 누르면 메뉴판 추가 페이지로 이동 } - ) - } - - item { - AddButton( - stringResource(R.string.add_menu_folder), - modifier = Modifier - ) { - // TODO: 버튼 누르면 메뉴판 추가 페이지로 이동 } } } - } +// } } @Preview(showBackground = true) From 5ae5f944da0825da162623325e9012c6d14f3e4f Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:22:39 +0900 Subject: [PATCH 24/27] =?UTF-8?q?[feat]:=20coil=20=EC=84=B8=ED=8C=85=20(#5?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5a32f2c2..3d4da186 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -100,6 +100,7 @@ dependencies { // image implementation("io.coil-kt.coil3:coil-compose:3.1.0") implementation("io.coil-kt.coil3:coil-network-okhttp:3.1.0") + implementation("io.coil-kt.coil3:coil-svg:3.1.0") } // Hilt를 사용할 때 필요한 Annotation Processor From 0069c3453c4e1c355f9a1028749199647323a5ea Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:23:57 +0900 Subject: [PATCH 25/27] =?UTF-8?q?[fix]:=20api=20=EC=97=B0=EA=B2=B0=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/model/menuFolder/response/MenuFolderResponse.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderResponse.kt b/app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderResponse.kt index 9c95d534..77e23550 100644 --- a/app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderResponse.kt +++ b/app/src/main/java/com/kuit/ourmenu/data/model/menuFolder/response/MenuFolderResponse.kt @@ -1,5 +1,8 @@ package com.kuit.ourmenu.data.model.menuFolder.response +import kotlinx.serialization.Serializable + +@Serializable data class MenuFolderResponse( val menuFolderId: Int, val menuFolderTitle: String, From c3fc627178b1573c7d3e8719999957dfd1f91cd9 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:26:17 +0900 Subject: [PATCH 26/27] =?UTF-8?q?[chore]:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=A3=BC=EC=84=9D=20=EC=82=AD=EC=A0=9C=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menuFolder/component/MenuFolderButton.kt | 1 - .../ui/menuFolder/screen/MenuFolderScreen.kt | 141 +++++++----------- .../viewmodel/MenuFolderViewModel.kt | 24 +-- 3 files changed, 63 insertions(+), 103 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt index dbded571..4e6cb28b 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/component/MenuFolderButton.kt @@ -170,7 +170,6 @@ fun MenuFolderContent( .fillMaxSize() ) { AsyncImage( -// painter = painterResource(id = R.drawable.img_dummy_pizza), model = menuFolder.menuFolderUrl, contentDescription = "Folder Image", contentScale = ContentScale.FillWidth, diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt index 3c2096bb..63154350 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/screen/MenuFolderScreen.kt @@ -43,16 +43,11 @@ fun MenuFolderScreen( navController: NavController, viewModel: MenuFolderViewModel = hiltViewModel() ) { - val menuCount = 5 // 임의로 정한 값 - val menuFolderCount = 8 // 임의로 정한 값 - // 현재 스와이프된 버튼의 인덱스를 관리 (한 번에 하나만 스와이프되도록) var swipedIndex by remember { mutableIntStateOf(-1) } val menuFolders by viewModel.menuFolders.collectAsStateWithLifecycle() - val isLoading by viewModel.isLoading.collectAsStateWithLifecycle() - val error by viewModel.error.collectAsStateWithLifecycle() - val totalMenuCount = menuFolders.sumOf { it.menuIds.size } + val totalMenuCount = menuFolders.sumOf { it.menuIds.size } // 전체 메뉴 개수 - 서버에서 받아오도록 수정 Log.d("MenuFolderScreen", "menuFolders: $menuFolders") @@ -65,99 +60,63 @@ fun MenuFolderScreen( ) } ) { innerPadding -> -// if (isLoading) { -// // 로딩 상태 표시 -// Column( -// modifier = Modifier -// .padding(innerPadding) -// .fillMaxWidth() -// .padding(top = 100.dp), -// horizontalAlignment = Alignment.CenterHorizontally -// ) { -// Text(text = "로딩 중...", style = ourMenuTypography().pretendard_500_16) -// } -// } else if (error != null) { -// // 에러 상태 표시 -// Column( -// modifier = Modifier -// .padding(innerPadding) -// .fillMaxWidth() -// .padding(top = 100.dp), -// horizontalAlignment = Alignment.CenterHorizontally -// ) { -// Text(text = error ?: "에러 발생", color = MaterialTheme.colorScheme.error) -// } -// } else { - LazyColumn( - modifier = Modifier - .padding(innerPadding) - .padding(horizontal = 20.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { - item { - Column( - modifier = Modifier - .padding(top = 24.dp) - .height(64.dp) - .fillMaxWidth() - .clip(RoundedCornerShape(12.dp)) - .background(Primary500Main) - .clickable(onClick = { - navController.navigate(route = Routes.MenuFolderAllMenu) - }), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Text( - text = stringResource(R.string.see_all_menu), - color = NeutralWhite, - style = ourMenuTypography().pretendard_700_18 - ) - - Text( - text = String.format(stringResource(R.string.menu_count), totalMenuCount), - color = NeutralWhite, - style = ourMenuTypography().pretendard_500_14, - ) - } - } + LazyColumn( + modifier = Modifier + .padding(innerPadding) + .padding(horizontal = 20.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + item { + Column( + modifier = Modifier + .padding(top = 24.dp) + .height(64.dp) + .fillMaxWidth() + .clip(RoundedCornerShape(12.dp)) + .background(Primary500Main) + .clickable(onClick = { + navController.navigate(route = Routes.MenuFolderAllMenu) + }), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = stringResource(R.string.see_all_menu), + color = NeutralWhite, + style = ourMenuTypography().pretendard_700_18 + ) - // 스와이프 제어 - // TODO: 드래그 앤 드롭 구현 -// items(menuFolderCount) { index -> -// MenuFolderButton( -// isSwiped = swipedIndex == index, // 현재 스와이프된 아이템인지 확인 -// onSwipe = { swipedIndex = index }, // 새로운 버튼이 스와이프되면 상태 변경 -// onReset = { if (swipedIndex == index) swipedIndex = -1 }, // 닫히면 초기화 -// onButtonClick = { -// navController.navigate(route = Routes.MenuFolderDetail) -// } -// ) -// } - // 서버에서 받아온 menuFolders 기준으로 출력 - itemsIndexed(menuFolders) { index, folder -> - MenuFolderButton( - menuFolder = folder, - isSwiped = swipedIndex == index, - onSwipe = { swipedIndex = index }, - onReset = { if (swipedIndex == index) swipedIndex = -1 }, - onButtonClick = { - navController.navigate(route = Routes.MenuFolderDetail) - } + Text( + text = String.format(stringResource(R.string.menu_count), totalMenuCount), + color = NeutralWhite, + style = ourMenuTypography().pretendard_500_14, ) } + } - item { - AddButton( - stringResource(R.string.add_menu_folder), - modifier = Modifier - ) { - // TODO: 버튼 누르면 메뉴판 추가 페이지로 이동 + // TODO: 드래그 앤 드롭 구현 + itemsIndexed(menuFolders) { index, folder -> + MenuFolderButton( + menuFolder = folder, + isSwiped = swipedIndex == index, + onSwipe = { swipedIndex = index }, + onReset = { if (swipedIndex == index) swipedIndex = -1 }, + onButtonClick = { + navController.navigate(route = Routes.MenuFolderDetail) } + ) + } + + item { + AddButton( + stringResource(R.string.add_menu_folder), + modifier = Modifier + ) { + // TODO: 버튼 누르면 메뉴판 추가 페이지로 이동 } } } -// } + } } @Preview(showBackground = true) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/viewmodel/MenuFolderViewModel.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/viewmodel/MenuFolderViewModel.kt index e6ec22f1..8f753473 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/viewmodel/MenuFolderViewModel.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/viewmodel/MenuFolderViewModel.kt @@ -1,5 +1,6 @@ package com.kuit.ourmenu.ui.menuFolder.viewmodel +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.kuit.ourmenu.data.model.menuFolder.response.MenuFolderResponse @@ -13,7 +14,7 @@ import javax.inject.Inject @HiltViewModel class MenuFolderViewModel @Inject constructor( private val menuFolderRepository: MenuFolderRepository -): ViewModel() { +) : ViewModel() { private val _menuFolders = MutableStateFlow>(emptyList()) val menuFolders = _menuFolders.asStateFlow() @@ -23,9 +24,6 @@ class MenuFolderViewModel @Inject constructor( private val _isLoading = MutableStateFlow(false) val isLoading = _isLoading.asStateFlow() -// val menuFolders = mutableStateListOf() -// private val isLoading = mutableStateOf(false) -// private val errorMessage = mutableStateOf(null) init { getMenuFolders() @@ -37,14 +35,18 @@ class MenuFolderViewModel @Inject constructor( _error.value = null menuFolderRepository.getMenuFolders() - .onSuccess { response -> - if (response != null) { - _menuFolders.value = response.sortedBy { it.index } + .fold( + onSuccess = { response -> + if (response != null) { + _menuFolders.value = response.sortedBy { it.index } + Log.d("test", _menuFolders.value.toString()) + } + }, + onFailure = { throwable -> + _error.value = throwable.message ?: "메뉴 폴더를 불러오는 중 오류가 발생했습니다." + Log.d("test2", _error.value.toString()) } - } - .onFailure { throwable -> - _error.value = throwable.message ?: "메뉴 폴더를 불러오는 중 오류가 발생했습니다." - } + ) _isLoading.value = false } From 681692961dc2045b03d4aa7141d87098e55d66d7 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Sun, 30 Mar 2025 18:37:33 +0900 Subject: [PATCH 27/27] =?UTF-8?q?[fix]:=20=EB=B2=84=EC=A0=84=20=EB=B0=94?= =?UTF-8?q?=EB=80=90=EA=B1=B0=20=EB=90=98=EB=8F=8C=EB=A6=AC=EA=B8=B0=20(#5?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8de6174e..7469bb5d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.8.2" +agp = "8.7.3" converterGson = "2.11.0" hiltAndroid = "2.52" hiltNavigationCompose = "1.2.0" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 14adae71..7bc793cb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Dec 27 14:17:39 KST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists