diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index 1f58bdfc..92045ed8 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -13,6 +13,12 @@ + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9dc223f3..f702414f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -6,7 +6,7 @@ plugins { android { namespace = "com.kuit.ourmenu" - compileSdk = 34 + compileSdk = 35 defaultConfig { applicationId = "com.kuit.ourmenu" @@ -49,6 +49,8 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) + implementation(libs.androidx.lifecycle.viewmodel.compose) + implementation(libs.androidx.lifecycle.runtime.compose.android) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuSearchBackground.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuSearchBackground.kt new file mode 100644 index 00000000..e1711326 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuSearchBackground.kt @@ -0,0 +1,136 @@ +package com.kuit.ourmenu.ui.addmenu.component + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Icon +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.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +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 com.kuit.ourmenu.R +import com.kuit.ourmenu.ui.addmenu.component.item.StoreSearchItem +import com.kuit.ourmenu.ui.common.BottomFullWidthButton +import com.kuit.ourmenu.ui.theme.Neutral100 +import com.kuit.ourmenu.ui.theme.Neutral500 +import com.kuit.ourmenu.ui.theme.Neutral700 +import com.kuit.ourmenu.ui.theme.ourMenuTypography + +@Composable +fun AddMenuSearchBackground( + modifier: Modifier = Modifier, + searchActionDone: Boolean, + recentSearchResults: List, //이후에 타입 변경 + searchResults: List, //이후에 타입 변경 + onItemClick: () -> Unit +) { + Box( + modifier = Modifier + .fillMaxSize(), + ) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(bottom = 52.dp) + ) { + if (searchActionDone) { + //검색을 한 경우 + if (searchResults.isEmpty()) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(top = 116.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Icon( + painter = painterResource(R.drawable.ic_addmenu_noresult), + contentDescription = "no result", + tint = Color.Unspecified + ) + Text( + text = stringResource(R.string.no_result), + style = ourMenuTypography().pretendard_600_14, + color = Neutral500, + modifier = Modifier.padding(top = 8.dp) + ) + } + } else { + LazyColumn(modifier = Modifier.padding(top = 68.dp)) { + items(searchResults) { item -> + StoreSearchItem( + isLastItem = item, + ){ + onItemClick() + } + } + } + } + } else { + //검색을 하지 않은 경우 + Text( + text = stringResource(R.string.recent_search), + style = ourMenuTypography().pretendard_600_14, + color = Neutral700, + modifier = Modifier.padding(start = 28.dp, top = 68.dp) + ) + if (recentSearchResults.isEmpty()) { + Column(modifier = Modifier.fillMaxSize()) { /*empty view*/ } + } else { + LazyColumn() { + items(recentSearchResults) { item -> + StoreSearchItem( + isLastItem = item, + ){ + onItemClick() + } + } + } + } + } + + } + + BottomFullWidthButton( + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(start = 20.dp, end = 20.dp, bottom = 20.dp), + onClick = { TODO() }, + containerColor = Neutral100, + contentColor = Neutral500, + text = stringResource(R.string.add_store_and_menu_by_myself) + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun AddMenuSearchBackgroundPreview() { + val searchActionDone by rememberSaveable { mutableStateOf(false) } + val recentSearchResults = mutableListOf( + false, + false, + false, + false, + true, + ) + val searchResults: MutableList = mutableListOf(true) + AddMenuSearchBackground( + searchActionDone = searchActionDone, + recentSearchResults = recentSearchResults, + searchResults = searchResults, + ){ + //onItemClick + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuBottomSheetContent.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/AddMenuBottomSheetContent.kt similarity index 78% rename from app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuBottomSheetContent.kt rename to app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/AddMenuBottomSheetContent.kt index dea5be86..eb4046e0 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuBottomSheetContent.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/AddMenuBottomSheetContent.kt @@ -1,4 +1,4 @@ -package com.kuit.ourmenu.ui.addmenu.component +package com.kuit.ourmenu.ui.addmenu.component.bottomsheet import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement @@ -11,7 +11,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.BottomSheetScaffoldState import androidx.compose.material3.ExperimentalMaterial3Api @@ -22,6 +22,7 @@ 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.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -32,7 +33,12 @@ 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.lifecycle.compose.collectAsStateWithLifecycle +import androidx.lifecycle.viewmodel.compose.viewModel import com.kuit.ourmenu.R +import com.kuit.ourmenu.ui.addmenu.component.item.SelectMenuItem +import com.kuit.ourmenu.ui.addmenu.viewmodel.AddMenuDummyStoreInfo +import com.kuit.ourmenu.ui.addmenu.viewmodel.AddMenuSearchViewModel import com.kuit.ourmenu.ui.common.BottomFullWidthButton import com.kuit.ourmenu.ui.theme.Neutral100 import com.kuit.ourmenu.ui.theme.Neutral300 @@ -40,16 +46,19 @@ import com.kuit.ourmenu.ui.theme.Neutral400 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 import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable -fun AddMenuBottomSheetContent(scaffoldState: BottomSheetScaffoldState) { +fun AddMenuBottomSheetContent( + scaffoldState: BottomSheetScaffoldState, + storeInfo: AddMenuDummyStoreInfo, + onItemClick: (Int) -> Unit +) { val coroutineScope = rememberCoroutineScope() - val dummyMenuItemList = listOf( - false, false, true, false, false, false, false, false - ) + val enableNextButton = storeInfo.menuList.any { it } Column( modifier = Modifier @@ -59,7 +68,7 @@ fun AddMenuBottomSheetContent(scaffoldState: BottomSheetScaffoldState) { Text( text = "식당 이름", style = ourMenuTypography().pretendard_700_20 - ) + ) Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { Icon( painter = painterResource(id = R.drawable.ic_location_info), @@ -119,7 +128,7 @@ fun AddMenuBottomSheetContent(scaffoldState: BottomSheetScaffoldState) { .padding(vertical = 12.dp) ) BottomFullWidthButton( - containerColor = Neutral400, + containerColor = Primary500Main, contentColor = NeutralWhite, text = stringResource(R.string.next) ) { @@ -134,8 +143,12 @@ fun AddMenuBottomSheetContent(scaffoldState: BottomSheetScaffoldState) { .weight(1f) .padding(top = 12.dp) ) { - items(dummyMenuItemList) { items -> - SelectMenuItem(items) + itemsIndexed(storeInfo.menuList) { index, isSelected -> +// Log.d("AddMenuBottomSheetContent", "Item: $index, $isSelected") + SelectMenuItem( + isSelected = isSelected, + onClick = { onItemClick(index) } + ) } } @@ -145,15 +158,17 @@ fun AddMenuBottomSheetContent(scaffoldState: BottomSheetScaffoldState) { contentColor = Neutral500, text = stringResource(R.string.add_menu_by_myself) ) { - + //메뉴 추가화면으로 이동하는 로직 } Spacer(modifier = Modifier.padding(10.dp)) BottomFullWidthButton( - containerColor = Neutral400, + containerColor = if (enableNextButton) Primary500Main else Neutral400, contentColor = NeutralWhite, text = stringResource(R.string.next) ) { - + if (enableNextButton){ + //버튼 활성화 된 경우의 동작 + } } } @@ -166,9 +181,13 @@ fun AddMenuBottomSheetContent(scaffoldState: BottomSheetScaffoldState) { @Composable private fun AddMenuBottomSheetContentPreview() { val scaffoldState = rememberBottomSheetScaffoldState() + val viewModel: AddMenuSearchViewModel = viewModel() + val storeInfo by viewModel.storeInfo.collectAsStateWithLifecycle() LaunchedEffect(Unit) { //아래 주석 해제하면 bottom sheet 확장된 상태 확인 가능 -// scaffoldState.bottomSheetState.expand() + scaffoldState.bottomSheetState.expand() + } + AddMenuBottomSheetContent(scaffoldState, storeInfo) { index -> + viewModel.updateSelectedMenu(index = index) } - AddMenuBottomSheetContent(scaffoldState) } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/IconSelectBottomSheet.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/IconSelectBottomSheet.kt similarity index 92% rename from app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/IconSelectBottomSheet.kt rename to app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/IconSelectBottomSheet.kt index 9ebc13aa..325aba25 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/IconSelectBottomSheet.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/IconSelectBottomSheet.kt @@ -1,4 +1,4 @@ -package com.kuit.ourmenu.ui.addmenu.component +package com.kuit.ourmenu.ui.addmenu.component.bottomsheet import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -15,6 +15,7 @@ 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.addmenu.component.item.IconItem import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/TagSelectBottomSheet.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt similarity index 97% rename from app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/TagSelectBottomSheet.kt rename to app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt index d5ecd6e5..9e4acf41 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/TagSelectBottomSheet.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/bottomsheet/TagSelectBottomSheet.kt @@ -1,4 +1,4 @@ -package com.kuit.ourmenu.ui.addmenu.component +package com.kuit.ourmenu.ui.addmenu.component.bottomsheet import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuInfoAddressFieldItem.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/AddMenuInfoAddressFieldItem.kt similarity index 97% rename from app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuInfoAddressFieldItem.kt rename to app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/AddMenuInfoAddressFieldItem.kt index a62bf2cd..1e43a96c 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuInfoAddressFieldItem.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/AddMenuInfoAddressFieldItem.kt @@ -1,4 +1,4 @@ -package com.kuit.ourmenu.ui.addmenu.component +package com.kuit.ourmenu.ui.addmenu.component.item import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement @@ -69,7 +69,7 @@ fun AddMenuInfoAddressFieldItem( containerColor = Neutral100, placeHolder = { Text( - text = stringResource(R.string.type_restaurant_address), + text = stringResource(R.string.type_store_address), style = ourMenuTypography().pretendard_500_14, color = Neutral500 ) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuInfoMenuBoardFieldItem.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/AddMenuInfoMenuBoardFieldItem.kt similarity index 98% rename from app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuInfoMenuBoardFieldItem.kt rename to app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/AddMenuInfoMenuBoardFieldItem.kt index fe4bd783..552d19e6 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuInfoMenuBoardFieldItem.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/AddMenuInfoMenuBoardFieldItem.kt @@ -1,4 +1,4 @@ -package com.kuit.ourmenu.ui.addmenu.component +package com.kuit.ourmenu.ui.addmenu.component.item import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuInfoTextFieldItem.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/AddMenuInfoTextFieldItem.kt similarity index 91% rename from app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuInfoTextFieldItem.kt rename to app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/AddMenuInfoTextFieldItem.kt index e91ecf99..100cadfa 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/AddMenuInfoTextFieldItem.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/AddMenuInfoTextFieldItem.kt @@ -1,4 +1,4 @@ -package com.kuit.ourmenu.ui.addmenu.component +package com.kuit.ourmenu.ui.addmenu.component.item import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement @@ -95,7 +95,7 @@ fun AddMenuInfoTextFieldItem( @Composable private fun AddMenuInfoTextFieldItemPreview() { var priceText by rememberSaveable { mutableStateOf("") } - var restaurantNameText by rememberSaveable { mutableStateOf("") } + var storeNameText by rememberSaveable { mutableStateOf("") } Column( modifier = Modifier.fillMaxSize(), @@ -110,10 +110,10 @@ private fun AddMenuInfoTextFieldItemPreview() { isPriceInfo = true ) AddMenuInfoTextFieldItem( - fieldName = stringResource(R.string.restaurant_name), - text = restaurantNameText, - onTextChange = { restaurantNameText = it }, - placeholder = stringResource(R.string.type_restaurant_name) + fieldName = stringResource(R.string.store_name), + text = storeNameText, + onTextChange = { storeNameText = it }, + placeholder = stringResource(R.string.type_store_name) ) } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/FoodTagItem.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/FoodTagItem.kt similarity index 97% rename from app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/FoodTagItem.kt rename to app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/FoodTagItem.kt index ba258f12..8d088695 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/FoodTagItem.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/FoodTagItem.kt @@ -1,4 +1,4 @@ -package com.kuit.ourmenu.ui.addmenu.component +package com.kuit.ourmenu.ui.addmenu.component.item import androidx.compose.material3.AssistChip import androidx.compose.material3.AssistChipDefaults diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/IconItem.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/IconItem.kt similarity index 96% rename from app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/IconItem.kt rename to app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/IconItem.kt index 3c237043..ab3dfbbe 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/IconItem.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/IconItem.kt @@ -1,4 +1,4 @@ -package com.kuit.ourmenu.ui.addmenu.component +package com.kuit.ourmenu.ui.addmenu.component.item import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/SelectMenuItem.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/SelectMenuItem.kt similarity index 92% rename from app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/SelectMenuItem.kt rename to app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/SelectMenuItem.kt index cbec5f27..5576be66 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/SelectMenuItem.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/SelectMenuItem.kt @@ -1,4 +1,4 @@ -package com.kuit.ourmenu.ui.addmenu.component +package com.kuit.ourmenu.ui.addmenu.component.item import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.layout.Arrangement @@ -29,7 +29,7 @@ import com.kuit.ourmenu.ui.theme.Primary500Main import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable -fun SelectMenuItem(isSelected: Boolean = false) { +fun SelectMenuItem(isSelected: Boolean = false, onClick: () -> Unit) { HorizontalDivider( thickness = 1.dp, color = Neutral300, @@ -55,7 +55,7 @@ fun SelectMenuItem(isSelected: Boolean = false) { } if (isSelected) { Button( - onClick = {}, + onClick = onClick, shape = RoundedCornerShape(16.dp), colors = ButtonDefaults.buttonColors( containerColor = Primary500Main @@ -70,7 +70,7 @@ fun SelectMenuItem(isSelected: Boolean = false) { } } else { Button( - onClick = {}, + onClick = onClick, shape = RoundedCornerShape(16.dp), border = BorderStroke(1.dp, Primary500Main), colors = ButtonDefaults.buttonColors( @@ -93,7 +93,7 @@ fun SelectMenuItem(isSelected: Boolean = false) { @Composable private fun SelectedMenuItemPreview() { Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center) { - SelectMenuItem(false) - SelectMenuItem(true) + SelectMenuItem(false, onClick = {}) + SelectMenuItem(true, onClick = {}) } } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/RestaurantSearchItem.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/StoreSearchItem.kt similarity index 85% rename from app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/RestaurantSearchItem.kt rename to app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/StoreSearchItem.kt index ffc7979b..e59e88c8 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/RestaurantSearchItem.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/component/item/StoreSearchItem.kt @@ -1,5 +1,6 @@ -package com.kuit.ourmenu.ui.addmenu.component +package com.kuit.ourmenu.ui.addmenu.component.item +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -23,11 +24,15 @@ import com.kuit.ourmenu.ui.theme.Neutral700 import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable -fun RestaurantSearchItem(isLastItem: Boolean = false) { +fun StoreSearchItem( + isLastItem: Boolean = false, + onClick: () -> Unit = {} +) { Row( modifier = Modifier .fillMaxWidth() - .padding(vertical = 20.dp, horizontal = 20.dp), + .padding(vertical = 20.dp, horizontal = 20.dp) + .clickable(onClick = onClick), verticalAlignment = Alignment.CenterVertically ) { Icon( @@ -63,8 +68,8 @@ fun RestaurantSearchItem(isLastItem: Boolean = false) { @Composable private fun RestaurantSearchItemPreview() { Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center) { - RestaurantSearchItem() - RestaurantSearchItem() - RestaurantSearchItem(true) + StoreSearchItem() + StoreSearchItem() + StoreSearchItem(true) } } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuInfoScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuInfoScreen.kt index ecf2d10d..728cea57 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuInfoScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuInfoScreen.kt @@ -27,11 +27,11 @@ 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.addmenu.component.AddMenuInfoAddressFieldItem -import com.kuit.ourmenu.ui.addmenu.component.AddMenuInfoMenuBoardFieldItem -import com.kuit.ourmenu.ui.addmenu.component.AddMenuInfoTextFieldItem -import com.kuit.ourmenu.ui.common.topappbar.OurMenuBackButtonTopAppBar +import com.kuit.ourmenu.ui.addmenu.component.item.AddMenuInfoAddressFieldItem +import com.kuit.ourmenu.ui.addmenu.component.item.AddMenuInfoMenuBoardFieldItem +import com.kuit.ourmenu.ui.addmenu.component.item.AddMenuInfoTextFieldItem import com.kuit.ourmenu.ui.common.BottomFullWidthButton +import com.kuit.ourmenu.ui.common.topappbar.OurMenuBackButtonTopAppBar import com.kuit.ourmenu.ui.theme.Neutral300 import com.kuit.ourmenu.ui.theme.Neutral400 import com.kuit.ourmenu.ui.theme.Neutral500 @@ -44,7 +44,7 @@ fun AddMenuInfoScreen(autoInput: Boolean = true) { var menuBoardText by rememberSaveable { mutableStateOf("") } var menuNameText by rememberSaveable { mutableStateOf("") } var priceText by rememberSaveable { mutableStateOf("") } - var restaurantNameText by rememberSaveable { mutableStateOf("") } + var storeNameText by rememberSaveable { mutableStateOf("") } var mainAddressText by rememberSaveable { mutableStateOf("") } var detailedAddressText by rememberSaveable { mutableStateOf("") } @@ -134,10 +134,10 @@ fun AddMenuInfoScreen(autoInput: Boolean = true) { isPriceInfo = true ) AddMenuInfoTextFieldItem( - fieldName = stringResource(R.string.restaurant_name), - text = restaurantNameText, - onTextChange = { restaurantNameText = it }, - placeholder = stringResource(R.string.type_restaurant_name) + fieldName = stringResource(R.string.store_name), + text = storeNameText, + onTextChange = { storeNameText = it }, + placeholder = stringResource(R.string.type_store_name) ) AddMenuInfoAddressFieldItem( 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 d204cc86..f3bbec0d 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 @@ -1,9 +1,13 @@ package com.kuit.ourmenu.ui.addmenu.screen +import androidx.activity.compose.BackHandler import androidx.compose.foundation.background +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsFocusedAsState +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -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 @@ -14,6 +18,7 @@ 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.mutableStateOf import androidx.compose.runtime.remember @@ -23,13 +28,18 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource 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 com.kuit.ourmenu.R -import com.kuit.ourmenu.ui.addmenu.component.AddMenuBottomSheetContent -import com.kuit.ourmenu.ui.common.topappbar.OurMenuBackButtonTopAppBar +import com.kuit.ourmenu.ui.addmenu.component.AddMenuSearchBackground +import com.kuit.ourmenu.ui.addmenu.component.bottomsheet.AddMenuBottomSheetContent +import com.kuit.ourmenu.ui.addmenu.viewmodel.AddMenuSearchViewModel import com.kuit.ourmenu.ui.common.SearchBar +import com.kuit.ourmenu.ui.common.topappbar.OurMenuBackButtonTopAppBar import com.kuit.ourmenu.ui.theme.Neutral300 import com.kuit.ourmenu.ui.theme.Primary500Main import com.kuit.ourmenu.ui.theme.ourMenuTypography @@ -37,9 +47,33 @@ import com.kuit.ourmenu.ui.theme.ourMenuTypography @OptIn(ExperimentalMaterial3Api::class) @Composable fun AddMenuScreen(modifier: Modifier = Modifier) { - val scaffoldState = rememberBottomSheetScaffoldState() - val showBottomSheet by remember { mutableStateOf(true) } + var scaffoldState = rememberBottomSheetScaffoldState() + var showBottomSheet by rememberSaveable { mutableStateOf(false) } + var showSearchBackground by rememberSaveable { mutableStateOf(false) } var searchText by rememberSaveable { mutableStateOf("") } + var searchActionDone by rememberSaveable { mutableStateOf(false) } + val interactionSource = remember { MutableInteractionSource() } + val searchBarFocused by interactionSource.collectIsFocusedAsState() + val focusManager = LocalFocusManager.current + + val viewModel: AddMenuSearchViewModel = viewModel() + val recentSearchResults by viewModel.recentSearchResults.collectAsStateWithLifecycle() + val searchResults by viewModel.searchResults.collectAsStateWithLifecycle() + val storeInfo by viewModel.storeInfo.collectAsStateWithLifecycle() + + LaunchedEffect(searchBarFocused) { + if (searchBarFocused) { + showSearchBackground = true + showBottomSheet = false + } + } + + BackHandler(enabled = showSearchBackground) { + if (searchBarFocused) focusManager.clearFocus() + searchActionDone = false + showSearchBackground = false + searchText = "" + } BottomSheetScaffold( scaffoldState = scaffoldState, @@ -55,7 +89,10 @@ fun AddMenuScreen(modifier: Modifier = Modifier) { sheetContainerColor = Color.White, sheetContent = { //bottom sheet 구성 - AddMenuBottomSheetContent(scaffoldState) + AddMenuBottomSheetContent( + scaffoldState = scaffoldState, + storeInfo = storeInfo, + onItemClick = { index -> viewModel.updateSelectedMenu(index) }) }, //조건 만족하면 bottom sheet 보여주고, 아니면 화면에 안보이도록 처리 sheetPeekHeight = if (showBottomSheet) 254.dp else 0.dp, @@ -77,15 +114,47 @@ fun AddMenuScreen(modifier: Modifier = Modifier) { } } ) { - //전체 화면 구성, 지도는 추가 예정 - Column(modifier = Modifier.padding(horizontal = 20.dp)) { - Spacer(modifier = Modifier.height(12.dp)) + Box(modifier = Modifier.fillMaxWidth()) { + if (!showSearchBackground) { + //지도 컴포넌트 + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text("지도 컴포넌트") + } + } else { + //검색 컴포넌트 + AddMenuSearchBackground( + searchActionDone = searchActionDone, + recentSearchResults = recentSearchResults, + searchResults = searchResults + ) { + //검색된 아이템 클릭시 작동할 함수 + if (searchBarFocused) focusManager.clearFocus() + showSearchBackground = false + showBottomSheet = true + searchText = "" + } + } + SearchBar( + modifier = Modifier.padding(top = 12.dp, start = 20.dp, end = 20.dp), text = searchText, - onTextChange = { searchText = it }, - ){ + onTextChange = { + searchText = it + showSearchBackground = true + showBottomSheet = false + }, + interactionSource = interactionSource + ) { //onSearch 함수 + if (searchBarFocused) focusManager.clearFocus() + searchActionDone = true + } + } } } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuSearchScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuSearchScreen.kt deleted file mode 100644 index 34fa17bb..00000000 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuSearchScreen.kt +++ /dev/null @@ -1,153 +0,0 @@ -package com.kuit.ourmenu.ui.addmenu.screen - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -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.Color -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 com.kuit.ourmenu.R -import com.kuit.ourmenu.ui.common.topappbar.OurMenuBackButtonTopAppBar -import com.kuit.ourmenu.ui.addmenu.component.RestaurantSearchItem -import com.kuit.ourmenu.ui.common.BottomFullWidthButton -import com.kuit.ourmenu.ui.common.SearchBar -import com.kuit.ourmenu.ui.theme.Neutral100 -import com.kuit.ourmenu.ui.theme.Neutral500 -import com.kuit.ourmenu.ui.theme.Neutral700 -import com.kuit.ourmenu.ui.theme.Primary500Main -import com.kuit.ourmenu.ui.theme.ourMenuTypography - -@Composable -fun AddMenuSearchScreen(modifier: Modifier = Modifier) { - var searchText by rememberSaveable { mutableStateOf("") } - val searchActionDone by rememberSaveable { mutableStateOf(true) } - val dummyRecentSearchList = mutableListOf( - false, - false, - false, - false, - true, - ) - val dummySearchResultList: MutableList = mutableListOf() - - Scaffold(modifier = Modifier.fillMaxSize(), - topBar = { - OurMenuBackButtonTopAppBar { - Text( - text = stringResource(R.string.ourmenu), - color = Primary500Main, - style = ourMenuTypography().pretendard_600_18 - ) - } - }, - bottomBar = { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(start = 20.dp, end = 20.dp, bottom = 20.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - BottomFullWidthButton( - onClick = { TODO() }, - containerColor = Neutral100, - contentColor = Neutral500, - text = stringResource(R.string.add_restaurant_and_menu_by_myself) - ) - } - }, - content = { paddingValues -> - Column( - modifier = Modifier - .padding(paddingValues) - .fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 12.dp, horizontal = 20.dp) - ) { - SearchBar( - text = searchText, - onTextChange = { searchText = it } - ) { - //onSearch 함수 - } - } - Column(modifier = Modifier.fillMaxSize()) { - if (searchActionDone) { - //검색을 한 경우 - if (dummySearchResultList.isEmpty()) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(top = 64.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Icon( - painter = painterResource(R.drawable.ic_addmenu_noresult), - contentDescription = "no result", - tint = Color.Unspecified - ) - Text( - text = stringResource(R.string.no_result), - style = ourMenuTypography().pretendard_600_14, - color = Neutral500, - modifier = Modifier.padding(top = 8.dp) - ) - } - } else { - LazyColumn { - items(dummySearchResultList) { item -> - RestaurantSearchItem(item) - } - } - } - } else { - //검색을 하지 않은 경우 - Text( - text = stringResource(R.string.recent_search), - style = ourMenuTypography().pretendard_600_14, - color = Neutral700, - modifier = Modifier.padding(start = 28.dp) - ) - if (dummyRecentSearchList.isEmpty()) { - Column(modifier = Modifier.fillMaxSize()) { /*empty view*/ } - } else { - LazyColumn { - items(dummyRecentSearchList) { item -> - RestaurantSearchItem(item) - } - } - } - } - - } - } - } - ) - -} - -@Preview(showBackground = true) -@Composable -private fun AddMenuSearchScreenPreview() { - AddMenuSearchScreen() -} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuTagScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuTagScreen.kt index 1d07581a..8ef023bd 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuTagScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/screen/AddMenuTagScreen.kt @@ -39,9 +39,9 @@ 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.addmenu.component.bottomsheet.IconSelectBottomSheet +import com.kuit.ourmenu.ui.addmenu.component.bottomsheet.TagSelectBottomSheet import com.kuit.ourmenu.ui.common.topappbar.OurMenuBackButtonTopAppBar -import com.kuit.ourmenu.ui.addmenu.component.IconSelectBottomSheet -import com.kuit.ourmenu.ui.addmenu.component.TagSelectBottomSheet import com.kuit.ourmenu.ui.common.CustomTextField import com.kuit.ourmenu.ui.theme.Neutral100 import com.kuit.ourmenu.ui.theme.Neutral300 diff --git a/app/src/main/java/com/kuit/ourmenu/ui/addmenu/viewmodel/AddMenuSearchViewModel.kt b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/viewmodel/AddMenuSearchViewModel.kt new file mode 100644 index 00000000..dfed7b06 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/addmenu/viewmodel/AddMenuSearchViewModel.kt @@ -0,0 +1,86 @@ +package com.kuit.ourmenu.ui.addmenu.viewmodel + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.kuit.ourmenu.R +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch + +class AddMenuSearchViewModel : ViewModel() { + // 최근 검색 결과를 저장 + private val _recentSearchResults = MutableStateFlow>(emptyList()) + val recentSearchResults: StateFlow> = _recentSearchResults + + //실제 검색 결과를 저장 + private val _searchResulst = MutableStateFlow>(emptyList()) + val searchResults: StateFlow> = _searchResulst + + //식당 정보 + private val _storeInfo = MutableStateFlow(AddMenuDummyStoreInfo()) + val storeInfo: StateFlow = _storeInfo + + init { + getRecentSearchResults() + //확인용, 이후에는 제거 + getSearchResults() + getRestaurantInfo() + } + + fun getRecentSearchResults() { + viewModelScope.launch { + _recentSearchResults.value = listOf(false, false, false, false, true) + } + } + + fun getSearchResults() { + viewModelScope.launch { + _searchResulst.value = listOf() + } + } + + fun getRestaurantInfo() { + viewModelScope.launch { + _storeInfo.value = AddMenuDummyStoreInfo( + imgList = listOf( + R.drawable.img_dummy_pizza, + R.drawable.img_dummy_pizza, + R.drawable.img_dummy_pizza, + ), + name = R.string.our_ddeokbokki.toString(), + address = R.string.resaturant_address.toString(), + menuList = listOf(false, false, false, false, false, false, false, false) + ) + } + } + + fun updateSelectedMenu(index: Int) { + Log.d("AddMenuViewModel", "index: $index") + viewModelScope.launch { + val currentState = _storeInfo.value.menuList[index] + val updatedMenuList = + if (currentState){ + //선택된 아이템 클릭시 false로 다시 변경 + _storeInfo.value.menuList.map { + false + } + }else{ + //클릭된 인덱스만 true, 나머지는 false + _storeInfo.value.menuList.mapIndexed { i, _ -> + i == index + } + } +// Log.d("AddMenuViewModel", "updatedMenuList: $updatedMenuList") + _storeInfo.value = _storeInfo.value.copy(menuList = updatedMenuList) + } + } +} + +//이후에 dto 반영시 삭제 예정 +data class AddMenuDummyStoreInfo( + val imgList: List = emptyList(), + val name: String = "", + val address: String = "", + val menuList: List = emptyList(), +) \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/common/BottomFullWidthButton.kt b/app/src/main/java/com/kuit/ourmenu/ui/common/BottomFullWidthButton.kt index 922b5172..9ba5e708 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/common/BottomFullWidthButton.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/common/BottomFullWidthButton.kt @@ -27,6 +27,7 @@ import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable fun BottomFullWidthButton( + modifier: Modifier = Modifier, containerColor: Color, contentColor: Color, text: String, @@ -34,7 +35,7 @@ fun BottomFullWidthButton( ) { Button( onClick = onClick, - modifier = Modifier + modifier = modifier .fillMaxWidth() .size(320.dp, 48.dp) .shadow(elevation = 4.dp, shape = RoundedCornerShape(12.dp)), @@ -44,7 +45,8 @@ fun BottomFullWidthButton( contentColor = contentColor ), ) { - Text(text = text, + Text( + text = text, style = ourMenuTypography().pretendard_700_16, color = contentColor ) @@ -55,11 +57,19 @@ fun BottomFullWidthButton( @Composable private fun BottomFullWidthButtonPreview() { Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center) { - BottomFullWidthButton(Neutral100, Neutral500, stringResource(R.string.add_restaurant_and_menu_by_myself)){ + BottomFullWidthButton( + containerColor = Neutral100, + contentColor = Neutral500, + text = stringResource(R.string.add_store_and_menu_by_myself) + ) { //onClick 작성 } Spacer(modifier = Modifier.height(16.dp)) - BottomFullWidthButton(Primary500Main, NeutralWhite, stringResource(R.string.add_menu)){ + BottomFullWidthButton( + containerColor = Primary500Main, + contentColor = NeutralWhite, + text = stringResource(R.string.add_menu) + ) { //onClick 작성 } } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/common/BottomHalfWidthButton.kt b/app/src/main/java/com/kuit/ourmenu/ui/common/BottomHalfWidthButton.kt index 898b12b7..68411a51 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/common/BottomHalfWidthButton.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/common/BottomHalfWidthButton.kt @@ -27,13 +27,14 @@ import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable fun BottomHalfWidthButton( + modifier: Modifier = Modifier, containerColor: Color, contentColor: Color, text: String, onClick: () -> Unit ) { Button( - modifier = Modifier + modifier = modifier .size(154.dp, 52.dp) .shadow(elevation = 4.dp, shape = RoundedCornerShape(12.dp)), shape = RoundedCornerShape(12.dp), @@ -62,10 +63,18 @@ private fun BottomHalfWidthButtonPreview() { horizontalAlignment = Alignment.CenterHorizontally ) { Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) { - BottomHalfWidthButton(Neutral400, NeutralWhite, stringResource(R.string.cancel)) { + BottomHalfWidthButton( + containerColor = Neutral400, + contentColor = NeutralWhite, + text = stringResource(R.string.cancel) + ) { } - BottomHalfWidthButton(Primary500Main, NeutralWhite, stringResource(R.string.apply)) { + BottomHalfWidthButton( + containerColor = Primary500Main, + contentColor = NeutralWhite, + text = stringResource(R.string.apply) + ) { } } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/common/CustomTextField.kt b/app/src/main/java/com/kuit/ourmenu/ui/common/CustomTextField.kt index f16a78af..bde64ff9 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/common/CustomTextField.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/common/CustomTextField.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.input.VisualTransformation @@ -68,7 +69,7 @@ import com.kuit.ourmenu.ui.theme.ourMenuTypography * * @param singleLine 입력된 텍스트를 한 줄로만 표시할지의 여부를 나타낸다. 기본값은 true * - * @param shape 배경, 내부영역을 포함한 컴포넌트의 전체적인 모양 처리 + * @param shape 컴포넌트의 내부 영역의 모양 처리, modifier에 RoundedCornerShape를 적용하면 여기에도 적용해야 동일해진다 * ex) RoundedCornerShape(8.dp) 등 * * @param trailingIcon 컴포넌트의 우측 끝에 위치하게 할 Icon 객체를 lambda를 통해 넘겨준다 @@ -87,6 +88,9 @@ import com.kuit.ourmenu.ui.theme.ourMenuTypography * @param cursorColor 커서에 대한 색상을 Color 객체를 통해 지정한다 * 기본 값으로는 Color.Black으로 지정 * + * @param isError 에러 처리에 필요한 조건문에 사용할 변수, 기본값은 false로 초기화되어 있다 + * ex) 비밀번호 오류시 container 색상 변경 등 + * * @param keyboardOptions 키보드에 대한 설정을 KeyboardOptions를 통해 지정한다 * * @param keyboardActions 키보드에서 특정 버튼을 눌렀을 때의 작업을 keyboardActions를 통해 지정한다 @@ -109,6 +113,7 @@ fun CustomTextField( paddingValues: PaddingValues = PaddingValues(0.dp), containerColor: Color = Color.White, cursorColor: Color = Color.Black, + isError: Boolean = false, keyboardOptions: KeyboardOptions = KeyboardOptions.Default, keyboardActions: KeyboardActions = KeyboardActions.Default ) { @@ -123,7 +128,8 @@ fun CustomTextField( singleLine = singleLine, textStyle = textStyle, keyboardOptions = keyboardOptions, - keyboardActions = keyboardActions + keyboardActions = keyboardActions, + cursorBrush = SolidColor(cursorColor) ) { innerTextField -> TextFieldDefaults.DecorationBox( @@ -142,11 +148,12 @@ fun CustomTextField( /* * 이곳에서 enabled 여부, focus 여부 등에 따른 색상, indicator(밑줄)의 색상 등을 따로 지정할 수 있다. * */ - focusedContainerColor = containerColor, + focusedContainerColor = if(isError) Color.Red else containerColor, unfocusedContainerColor = containerColor, focusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent, - cursorColor = cursorColor + disabledContainerColor = containerColor, + disabledIndicatorColor = containerColor, ) ) @@ -168,9 +175,11 @@ private fun CustomTextFieldPreview() { CustomTextField( modifier = Modifier .fillMaxWidth() - .border(0.8.dp, Color.Black), + .border(0.8.dp, Color.Black, RoundedCornerShape(8.dp)), + shape = RoundedCornerShape(8.dp), text = textForSimple, - onTextChange = { textForSimple = it } + onTextChange = { textForSimple = it }, + isError = true ) Spacer(modifier = Modifier.height(20.dp)) //추가 기능이 있는 버전 @@ -194,7 +203,8 @@ private fun CustomTextFieldPreview() { contentDescription = "SearchIcon" ) }, - paddingValues = PaddingValues(20.dp, 0.dp) + paddingValues = PaddingValues(20.dp, 0.dp), + cursorColor = Color.Red, ) } } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/common/SearchBar.kt b/app/src/main/java/com/kuit/ourmenu/ui/common/SearchBar.kt index 310a89a3..9deb51b9 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/common/SearchBar.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/common/SearchBar.kt @@ -2,6 +2,7 @@ package com.kuit.ourmenu.ui.common import androidx.compose.foundation.border import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -10,12 +11,15 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Card import androidx.compose.material3.Icon 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.Modifier @@ -24,6 +28,7 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.kuit.ourmenu.R @@ -34,12 +39,14 @@ import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable fun SearchBar( + modifier: Modifier = Modifier, text: String, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, onTextChange: (String) -> Unit, onSearch: () -> Unit, ) { Card( - modifier = Modifier + modifier .shadow(elevation = 2.dp, shape = RoundedCornerShape(8.dp)) .fillMaxWidth(), shape = RoundedCornerShape(8.dp) @@ -69,7 +76,10 @@ fun SearchBar( ) }, paddingValues = PaddingValues(start = 28.dp, top = 0.dp, bottom = 0.dp), - cursorColor = Primary500Main + cursorColor = Primary500Main, + interactionSource = interactionSource, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), + keyboardActions = KeyboardActions(onSearch = { onSearch() }) ) } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/LandingScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/LandingScreen.kt index 5672b83c..a7c57ea6 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/LandingScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/LandingScreen.kt @@ -64,7 +64,7 @@ fun LandingScreen(modifier: Modifier = Modifier) { Spacer(modifier = Modifier.height(44.dp)) - BottomFullWidthButton(Primary500Main, NeutralWhite, stringResource(R.string.login)) { + BottomFullWidthButton(modifier = Modifier, containerColor = Primary500Main, contentColor = NeutralWhite, text = stringResource(R.string.login)) { // TODO: onClick 작성 } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/LoginScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/LoginScreen.kt index e2e56f1e..dc800ac0 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/LoginScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/LoginScreen.kt @@ -133,9 +133,10 @@ fun LoginScreen(modifier: Modifier = Modifier) { Spacer(modifier = Modifier.height(24.dp)) BottomFullWidthButton( - Primary500Main, - NeutralWhite, - stringResource(R.string.login), + modifier = Modifier, + containerColor = Primary500Main, + contentColor = NeutralWhite, + text = stringResource(R.string.login), ) { // TODO: onClick 작성 } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 29ae3ee5..f32826c2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,13 +12,13 @@ 메뉴 이름을 입력해주세요 메뉴 가격 직접 가격을 입력해주세요 - 가게 이름 - 가게 이름을 입력해주세요 + 가게 이름 + 가게 이름을 입력해주세요 가게 주소 - 가게 주소를 입력해주세요. + 가게 주소를 입력해주세요. 상세 주소를 입력해주세요. OURMENU - 가게와 메뉴 직접 추가 + 가게와 메뉴 직접 추가 검색 결과가 없어요! 최근 검색 취소 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 60cfe30c..fff6a216 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,9 @@ espressoCore = "3.5.1" lifecycleRuntimeKtx = "2.6.1" activityCompose = "1.8.0" composeBom = "2024.04.01" +lifecycleViewmodel = "2.9.0-alpha08" +lifecycleViewmodelCompose = "2.9.0-alpha08" +lifecycleRuntimeComposeAndroid = "2.8.7" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -24,6 +27,9 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel", version.ref = "lifecycleViewmodel" } +androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleViewmodelCompose" } +androidx-lifecycle-runtime-compose-android = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose-android", version.ref = "lifecycleRuntimeComposeAndroid" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }