From 71be2db437db1e1d398ba6d5ba8a9de03e8486db Mon Sep 17 00:00:00 2001 From: Thirfir Date: Wed, 6 Nov 2024 22:45:32 +0900 Subject: [PATCH 01/13] add: BusSearchScreen --- .../koreatech/bus/navigation/BusNavigation.kt | 10 +- .../in/koreatech/bus/navigation/Routes.kt | 1 + .../search/composebal/BusSearchScreen.kt | 144 ++++++++++++++++++ .../search/viewmodel/BusSearchViewModel.kt | 35 +++++ feature/bus/src/main/res/drawable/ic_swap.xml | 21 +++ feature/bus/src/main/res/values/strings.xml | 9 ++ 6 files changed, 219 insertions(+), 1 deletion(-) create mode 100644 feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt create mode 100644 feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt create mode 100644 feature/bus/src/main/res/drawable/ic_swap.xml diff --git a/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt b/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt index 00341c717..c74fb57b0 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt @@ -9,7 +9,8 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController -import `in`.koreatech.bus.screen.timetable.viewmodel.BusViewModel +import `in`.koreatech.bus.screen.search.composebal.BusSearchScreen +import `in`.koreatech.bus.screen.timetable.composable.BusTimetableScreen @Composable fun BusNavigation( @@ -32,5 +33,12 @@ fun BusNavigation( composable { } + + composable { + BusSearchScreen( + modifier = Modifier.fillMaxSize(), + onNavigationIconClick = { navController.popBackStack() } + ) + } } } \ No newline at end of file diff --git a/feature/bus/src/main/java/in/koreatech/bus/navigation/Routes.kt b/feature/bus/src/main/java/in/koreatech/bus/navigation/Routes.kt index 9b4fc63f5..f53194a1b 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/navigation/Routes.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/navigation/Routes.kt @@ -5,4 +5,5 @@ import kotlinx.serialization.Serializable internal object Routes { @Serializable data object BusTimetable + @Serializable data object BusSearch } \ No newline at end of file diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt new file mode 100644 index 000000000..aada8e6a7 --- /dev/null +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt @@ -0,0 +1,144 @@ +package `in`.koreatech.bus.screen.search.composebal + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +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 androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import `in`.koreatech.bus.screen.search.viewmodel.BusSearchViewModel +import `in`.koreatech.koin.core.designsystem.component.topbar.KoinTopAppBar +import `in`.koreatech.koin.core.designsystem.theme.KoinTheme +import `in`.koreatech.koin.feature.bus.R + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun BusSearchScreen( + modifier: Modifier = Modifier, + onNavigationIconClick: () -> Unit = {}, + viewModel: BusSearchViewModel = hiltViewModel() +) { + + val departure by viewModel.departure.collectAsStateWithLifecycle() + val arrival by viewModel.arrival.collectAsStateWithLifecycle() + + Column( + modifier = modifier + ) { + KoinTopAppBar( + title = stringResource(R.string.title_bus_search), + onNavigationIconClick = onNavigationIconClick + ) + + Text( + modifier = Modifier.padding(top = 16.dp), + text = stringResource(R.string.introduce_bus_search), + style = KoinTheme.typography.medium16, + color = KoinTheme.colors.neutral800 + ) + + Text( + modifier = Modifier.padding(top = 2.dp), + text = stringResource(R.string.caution_possibly_inaccurate), + style = KoinTheme.typography.regular12, + color = KoinTheme.colors.neutral600 + ) + + Row( + modifier = Modifier.fillMaxWidth().padding(top = 46.dp), + verticalAlignment = Alignment.Bottom + ) { + BusSearchInput( + title = stringResource(R.string.departure), + place = departure, + placeholder = stringResource(R.string.select_departure), + modifier = Modifier.weight(1f) + ) + + IconButton( + onClick = viewModel::swapDepartureAndArrival, + modifier = Modifier.padding(horizontal = 16.dp) + ) { + Icon( + painter = painterResource(id = R.drawable.ic_swap), + contentDescription = stringResource(R.string.swap_content_description) + ) + } + + BusSearchInput( + title = stringResource(R.string.arrival), + place = arrival, + placeholder = stringResource(R.string.select_arrival), + modifier = Modifier.weight(1f) + ) + } + } +} + +@Composable +private fun BusSearchInput( + title: String, + place: String, + placeholder: String, + modifier: Modifier = Modifier, +) { + + val isPlaceDetermined by remember { derivedStateOf { place.isNotEmpty() } } + + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = title, + style = KoinTheme.typography.medium16, + color = KoinTheme.colors.primary500 + ) + + Box( + modifier = Modifier + .background(if(isPlaceDetermined.not()) KoinTheme.colors.neutral100 else Color.Transparent) + .padding(vertical = 12.dp, horizontal = 39.dp), + contentAlignment = Alignment.Center + ) { + if (isPlaceDetermined.not()) + Text( + text = placeholder, + style = KoinTheme.typography.regular14, + color = KoinTheme.colors.neutral400 // TODO neutral450 ? + ) + else { + Text( + text = place, + style = KoinTheme.typography.bold18, + color = KoinTheme.colors.neutral800 + ) + } + } + } +} + +@Preview +@Composable +private fun BusSearchScreenPreview() { + BusSearchScreen( + modifier = Modifier.fillMaxWidth() + ) +} \ No newline at end of file diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt new file mode 100644 index 000000000..6f3830a08 --- /dev/null +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt @@ -0,0 +1,35 @@ +package `in`.koreatech.bus.screen.search.viewmodel + +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class BusSearchViewModel @Inject constructor( + private val savedStateHandle: SavedStateHandle +) : ViewModel() { + + val departure = savedStateHandle.getStateFlow(KEY_DEPARTURE, "") + val arrival = savedStateHandle.getStateFlow(KEY_ARRIVAL, "") + + fun setDeparture(departure: String) { + savedStateHandle[KEY_DEPARTURE] = departure + } + + fun setArrival(arrival: String) { + savedStateHandle[KEY_ARRIVAL] = arrival + } + + fun swapDepartureAndArrival() { + val currentDeparture = departure.value + val currentArrival = arrival.value + setDeparture(currentArrival) + setArrival(currentDeparture) + } + + companion object { + private const val KEY_DEPARTURE = "departure" + private const val KEY_ARRIVAL = "arrival" + } +} \ No newline at end of file diff --git a/feature/bus/src/main/res/drawable/ic_swap.xml b/feature/bus/src/main/res/drawable/ic_swap.xml new file mode 100644 index 000000000..d6d2d6a78 --- /dev/null +++ b/feature/bus/src/main/res/drawable/ic_swap.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/feature/bus/src/main/res/values/strings.xml b/feature/bus/src/main/res/values/strings.xml index caaed9e72..00f578d59 100644 --- a/feature/bus/src/main/res/values/strings.xml +++ b/feature/bus/src/main/res/values/strings.xml @@ -14,6 +14,15 @@ 주말 순환 + + 교통편 조회하기 + 목적지까지 가장 빠른 교통편을 알려드릴게요. + 학기 중 시간표와 다를 수 있습니다. + 출발 + 도착 + 출발지 선택 + 도착지 선택 + 출발지와 도착지를 바꾸기 \ No newline at end of file From 421dab5b260a015cab8906e34f448e5bcd84d4cb Mon Sep 17 00:00:00 2001 From: Thirfir Date: Wed, 6 Nov 2024 23:54:38 +0900 Subject: [PATCH 02/13] add: Compose ContraintLayout dependency --- feature/bus/build.gradle.kts | 2 ++ gradle/libs.versions.toml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/feature/bus/build.gradle.kts b/feature/bus/build.gradle.kts index bac9fe443..6e6b3a869 100644 --- a/feature/bus/build.gradle.kts +++ b/feature/bus/build.gradle.kts @@ -35,4 +35,6 @@ dependencies { implementation("androidx.navigation:navigation-compose:2.8.3") implementation(libs.kotlinx.serialization.json) + + implementation(libs.androidx.constraintlayout.compose) } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f94ec6283..f41e5ec9e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,6 +2,7 @@ activityComposeVersion = "1.8.2" activityKtxVersion = "1.5.0" cardviewVersion = "1.0.0" +constraintlayoutComposeVersion = "1.1.0" inAppUpdateVersion = "2.1.0" featureDeliveryKtxVersion = "2.1.0" firebaseBomVersion = "32.5.0" @@ -76,6 +77,7 @@ kotlinxCollectionsImmutableVersion = "0.3.8" androidx-activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activityKtxVersion" } androidx-cardview = { module = "androidx.cardview:cardview", version.ref = "cardviewVersion" } androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayoutVersion" } +androidx-constraintlayout-compose = { module = "androidx.constraintlayout:constraintlayout-compose", version.ref = "constraintlayoutComposeVersion" } androidx-fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragmentKtxVersion" } androidx-lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "lifecycleLivedataKtxVersion" } androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtxVersion" } From fed5808a61cde3727557b47885c52446e8379d8c Mon Sep 17 00:00:00 2001 From: Thirfir Date: Wed, 6 Nov 2024 23:55:01 +0900 Subject: [PATCH 03/13] =?UTF-8?q?add:=20ConstraintLayout=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20=EB=B2=84=EC=8A=A4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=B7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/composebal/BusSearchScreen.kt | 182 +++++++++++++----- 1 file changed, 136 insertions(+), 46 deletions(-) diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt index aada8e6a7..85f1c8d56 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt @@ -3,9 +3,13 @@ package `in`.koreatech.bus.screen.search.composebal import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.IntrinsicSize +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.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -16,14 +20,18 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember 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.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.constraintlayout.compose.ConstraintLayout +import androidx.constraintlayout.compose.Dimension import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import `in`.koreatech.bus.screen.search.viewmodel.BusSearchViewModel +import `in`.koreatech.koin.core.designsystem.component.tab.KoinSurface import `in`.koreatech.koin.core.designsystem.component.topbar.KoinTopAppBar import `in`.koreatech.koin.core.designsystem.theme.KoinTheme import `in`.koreatech.koin.feature.bus.R @@ -47,54 +55,123 @@ fun BusSearchScreen( onNavigationIconClick = onNavigationIconClick ) - Text( - modifier = Modifier.padding(top = 16.dp), - text = stringResource(R.string.introduce_bus_search), - style = KoinTheme.typography.medium16, - color = KoinTheme.colors.neutral800 + BusSearchContentView( + modifier = Modifier + .fillMaxSize() + .padding(top = 16.dp) + .padding(horizontal = 24.dp), + departure = departure, + arrival = arrival, + onSwapIconClicked = viewModel::swapDepartureAndArrival ) + } +} - Text( - modifier = Modifier.padding(top = 2.dp), - text = stringResource(R.string.caution_possibly_inaccurate), - style = KoinTheme.typography.regular12, - color = KoinTheme.colors.neutral600 - ) +@Composable +private fun BusSearchContentView( + departure: String, + arrival: String, + modifier: Modifier = Modifier, + onSwapIconClicked: () -> Unit = {}, +) { - Row( - modifier = Modifier.fillMaxWidth().padding(top = 46.dp), - verticalAlignment = Alignment.Bottom - ) { - BusSearchInput( - title = stringResource(R.string.departure), - place = departure, - placeholder = stringResource(R.string.select_departure), - modifier = Modifier.weight(1f) + KoinSurface { + Column(modifier = modifier) { + Text( + modifier = Modifier, + text = stringResource(R.string.introduce_bus_search), + style = KoinTheme.typography.medium16, + color = KoinTheme.colors.neutral800 + ) + + Text( + modifier = Modifier.padding(top = 2.dp), + text = stringResource(R.string.caution_possibly_inaccurate), + style = KoinTheme.typography.regular12, + color = KoinTheme.colors.neutral600 ) - IconButton( - onClick = viewModel::swapDepartureAndArrival, - modifier = Modifier.padding(horizontal = 16.dp) + ConstraintLayout( + modifier = Modifier + .fillMaxWidth() + .padding(top = 46.dp) + .height(IntrinsicSize.Min) ) { - Icon( - painter = painterResource(id = R.drawable.ic_swap), - contentDescription = stringResource(R.string.swap_content_description) + val (departureText, arrivalText, departureField, arrivalField, iconSwap) = createRefs() + + Text( + modifier = Modifier.constrainAs(departureText) { + start.linkTo(departureField.start) + top.linkTo(parent.top) + end.linkTo(departureField.end) + }, + text = stringResource(R.string.departure), + style = KoinTheme.typography.medium16, + color = KoinTheme.colors.primary500 + ) + Text( + modifier = Modifier.constrainAs(arrivalText) { + top.linkTo(parent.top) + start.linkTo(arrivalField.start) + end.linkTo(arrivalField.end) + }, + text = stringResource(R.string.arrival), + style = KoinTheme.typography.medium16, + color = KoinTheme.colors.primary500 ) - } - BusSearchInput( - title = stringResource(R.string.arrival), - place = arrival, - placeholder = stringResource(R.string.select_arrival), - modifier = Modifier.weight(1f) - ) + BusSearchInput( + place = departure, + placeholder = stringResource(R.string.select_departure), + modifier = Modifier.padding(top = 10.dp).constrainAs(departureField) { + top.linkTo(iconSwap.top) + bottom.linkTo(iconSwap.bottom) + start.linkTo(parent.start) + end.linkTo(iconSwap.start) + + width = Dimension.fillToConstraints + height = Dimension.preferredWrapContent + } + ) + + IconButton( + onClick = onSwapIconClicked, + modifier = Modifier + .padding(top = 10.dp) + .padding(horizontal = 16.dp, vertical = 12.dp) + .size(32.dp) + .constrainAs(iconSwap) { + top.linkTo(departureText.bottom) + start.linkTo(departureField.end) + end.linkTo(arrivalField.start) + } + ) { + Icon( + painter = painterResource(id = R.drawable.ic_swap), + contentDescription = stringResource(R.string.swap_content_description), + ) + } + + BusSearchInput( + place = arrival, + placeholder = stringResource(R.string.select_arrival), + modifier = Modifier.padding(top = 10.dp).constrainAs(arrivalField) { + top.linkTo(iconSwap.top) + bottom.linkTo(iconSwap.bottom) + start.linkTo(iconSwap.end) + end.linkTo(parent.end) + + width = Dimension.fillToConstraints + height = Dimension.preferredWrapContent + } + ) + } } } } @Composable private fun BusSearchInput( - title: String, place: String, placeholder: String, modifier: Modifier = Modifier, @@ -106,27 +183,24 @@ private fun BusSearchInput( modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally ) { - Text( - text = title, - style = KoinTheme.typography.medium16, - color = KoinTheme.colors.primary500 - ) - Box( modifier = Modifier - .background(if(isPlaceDetermined.not()) KoinTheme.colors.neutral100 else Color.Transparent) - .padding(vertical = 12.dp, horizontal = 39.dp), + .clip(RoundedCornerShape(4.dp)) + .background(if (isPlaceDetermined.not()) KoinTheme.colors.neutral100 else Color.Transparent) + .fillMaxSize(), contentAlignment = Alignment.Center ) { if (isPlaceDetermined.not()) Text( text = placeholder, + maxLines = 1, style = KoinTheme.typography.regular14, color = KoinTheme.colors.neutral400 // TODO neutral450 ? ) else { Text( text = place, + maxLines = 1, style = KoinTheme.typography.bold18, color = KoinTheme.colors.neutral800 ) @@ -135,10 +209,26 @@ private fun BusSearchInput( } } -@Preview +@OptIn(ExperimentalMaterial3Api::class) +@Preview(showBackground = true) @Composable private fun BusSearchScreenPreview() { - BusSearchScreen( + Column( modifier = Modifier.fillMaxWidth() - ) + ) { + KoinTopAppBar( + title = stringResource(R.string.title_bus_search), + onNavigationIconClick = { } + ) + + BusSearchContentView( + departure = "", + arrival = "도착지", + modifier = Modifier + .fillMaxSize() + .padding(top = 16.dp) + .padding(horizontal = 24.dp), + onSwapIconClicked = { } + ) + } } \ No newline at end of file From 6b57e4509c4ff9746de0d3d9ea118f589abe725c Mon Sep 17 00:00:00 2001 From: Thirfir Date: Wed, 6 Nov 2024 23:58:06 +0900 Subject: [PATCH 04/13] =?UTF-8?q?add:=20=ED=94=84=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/composebal/BusSearchScreen.kt | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt index 85f1c8d56..cf44ece6c 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt @@ -223,7 +223,54 @@ private fun BusSearchScreenPreview() { BusSearchContentView( departure = "", - arrival = "도착지", + arrival = "", + modifier = Modifier + .fillMaxSize() + .padding(top = 16.dp) + .padding(horizontal = 24.dp), + onSwapIconClicked = { } + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Preview(showBackground = true) +@Composable +private fun BusSearchScreen2Preview() { + Column( + modifier = Modifier.fillMaxWidth() + ) { + KoinTopAppBar( + title = stringResource(R.string.title_bus_search), + onNavigationIconClick = { } + ) + + BusSearchContentView( + departure = "코리아텍", + arrival = "", + modifier = Modifier + .fillMaxSize() + .padding(top = 16.dp) + .padding(horizontal = 24.dp), + onSwapIconClicked = { } + ) + } +} +@OptIn(ExperimentalMaterial3Api::class) +@Preview(showBackground = true) +@Composable +private fun BusSearchScreen3Preview() { + Column( + modifier = Modifier.fillMaxWidth() + ) { + KoinTopAppBar( + title = stringResource(R.string.title_bus_search), + onNavigationIconClick = { } + ) + + BusSearchContentView( + departure = "코리아텍", + arrival = "천안역", modifier = Modifier .fillMaxSize() .padding(top = 16.dp) From bbcb5426e4c36cec3251fcffe990dba9066e35ae Mon Sep 17 00:00:00 2001 From: Thirfir Date: Thu, 7 Nov 2024 00:05:36 +0900 Subject: [PATCH 05/13] =?UTF-8?q?add:=20=EC=A1=B0=ED=9A=8C=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EB=B7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen/search/composebal/BusSearchScreen.kt | 14 ++++++++++++++ feature/bus/src/main/res/values/strings.xml | 1 + 2 files changed, 15 insertions(+) diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt index cf44ece6c..5e784a56e 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt @@ -4,12 +4,15 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.PaddingValues +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.shape.RoundedCornerShape +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -31,6 +34,7 @@ import androidx.constraintlayout.compose.Dimension import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import `in`.koreatech.bus.screen.search.viewmodel.BusSearchViewModel +import `in`.koreatech.koin.core.designsystem.component.button.FilledButton import `in`.koreatech.koin.core.designsystem.component.tab.KoinSurface import `in`.koreatech.koin.core.designsystem.component.topbar.KoinTopAppBar import `in`.koreatech.koin.core.designsystem.theme.KoinTheme @@ -166,6 +170,16 @@ private fun BusSearchContentView( } ) } + + Spacer(modifier = Modifier.weight(1f)) + FilledButton( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 30.dp), + text = stringResource(R.string.search), + contentPadding = PaddingValues(vertical = 12.dp), + onClick = { } + ) } } } diff --git a/feature/bus/src/main/res/values/strings.xml b/feature/bus/src/main/res/values/strings.xml index 00f578d59..9aa0fb169 100644 --- a/feature/bus/src/main/res/values/strings.xml +++ b/feature/bus/src/main/res/values/strings.xml @@ -23,6 +23,7 @@ 출발지 선택 도착지 선택 출발지와 도착지를 바꾸기 + 조회하기 \ No newline at end of file From 0b98fcdfbfef1256554cd23f99c50d678e720bb9 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Thu, 7 Nov 2024 00:09:19 +0900 Subject: [PATCH 06/13] =?UTF-8?q?add:=20=EB=B2=84=ED=8A=BC=20onClick=20?= =?UTF-8?q?=EC=9E=84=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/screen/search/composebal/BusSearchScreen.kt | 7 ++++--- .../bus/screen/search/viewmodel/BusSearchViewModel.kt | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt index 5e784a56e..e4a920a10 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt @@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -66,7 +65,8 @@ fun BusSearchScreen( .padding(horizontal = 24.dp), departure = departure, arrival = arrival, - onSwapIconClicked = viewModel::swapDepartureAndArrival + onSwapIconClicked = viewModel::swapDepartureAndArrival, + onSearchClicked = viewModel::search ) } } @@ -77,6 +77,7 @@ private fun BusSearchContentView( arrival: String, modifier: Modifier = Modifier, onSwapIconClicked: () -> Unit = {}, + onSearchClicked: () -> Unit = {} ) { KoinSurface { @@ -178,7 +179,7 @@ private fun BusSearchContentView( .padding(bottom = 30.dp), text = stringResource(R.string.search), contentPadding = PaddingValues(vertical = 12.dp), - onClick = { } + onClick = onSearchClicked ) } } diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt index 6f3830a08..2d18fc8d1 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt @@ -28,6 +28,10 @@ class BusSearchViewModel @Inject constructor( setArrival(currentDeparture) } + fun search() { + // TODO Search bus + } + companion object { private const val KEY_DEPARTURE = "departure" private const val KEY_ARRIVAL = "arrival" From d97bcb21147711050bcf3d87957d9ae0ee4e579e Mon Sep 17 00:00:00 2001 From: Thirfir Date: Thu, 7 Nov 2024 00:32:55 +0900 Subject: [PATCH 07/13] =?UTF-8?q?add:=20=EC=9E=84=EC=8B=9C=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/domain/error/busv2/ErrorType.kt | 6 ++++ .../usecase/busv2/SearchBusV2UseCase.kt | 21 +++++++++++++ .../koreatech/bus/navigation/BusNavigation.kt | 5 +++- .../search/composebal/BusSearchScreen.kt | 14 +++++++++ .../search/viewmodel/BusSearchViewModel.kt | 30 +++++++++++++++++-- 5 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 domain/src/main/java/in/koreatech/koin/domain/error/busv2/ErrorType.kt create mode 100644 domain/src/main/java/in/koreatech/koin/domain/usecase/busv2/SearchBusV2UseCase.kt diff --git a/domain/src/main/java/in/koreatech/koin/domain/error/busv2/ErrorType.kt b/domain/src/main/java/in/koreatech/koin/domain/error/busv2/ErrorType.kt new file mode 100644 index 000000000..6d260a619 --- /dev/null +++ b/domain/src/main/java/in/koreatech/koin/domain/error/busv2/ErrorType.kt @@ -0,0 +1,6 @@ +package `in`.koreatech.koin.domain.error.busv2 + +sealed class SearchBusError: Throwable() { + class EmptyDeparture: SearchBusError() + class EmptyArrival: SearchBusError() +} \ No newline at end of file diff --git a/domain/src/main/java/in/koreatech/koin/domain/usecase/busv2/SearchBusV2UseCase.kt b/domain/src/main/java/in/koreatech/koin/domain/usecase/busv2/SearchBusV2UseCase.kt new file mode 100644 index 000000000..af90e655e --- /dev/null +++ b/domain/src/main/java/in/koreatech/koin/domain/usecase/busv2/SearchBusV2UseCase.kt @@ -0,0 +1,21 @@ +package `in`.koreatech.koin.domain.usecase.busv2 + +import `in`.koreatech.koin.domain.error.busv2.SearchBusError +import javax.inject.Inject + +class SearchBusV2UseCase @Inject constructor( + // private val busRepository +) { + + suspend operator fun invoke(departure: String, arrival: String): Result { + return when { + departure.isEmpty() -> Result.failure(SearchBusError.EmptyDeparture()) + arrival.isEmpty() -> Result.failure(SearchBusError.EmptyArrival()) + else -> { + // TODO repository Search bus + // busRepository.searchBus(departure, arrival) + Result.success(Unit) + } + } + } +} \ No newline at end of file diff --git a/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt b/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt index c74fb57b0..d6115b519 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt @@ -37,7 +37,10 @@ fun BusNavigation( composable { BusSearchScreen( modifier = Modifier.fillMaxSize(), - onNavigationIconClick = { navController.popBackStack() } + onNavigationIconClick = { navController.popBackStack() }, + onSearchSuccess = { + // navController.navigate(Routes.SearchedTimetable(it)) + } ) } } diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt index e4a920a10..1bd99a7f0 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -33,6 +34,7 @@ import androidx.constraintlayout.compose.Dimension import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import `in`.koreatech.bus.screen.search.viewmodel.BusSearchViewModel +import `in`.koreatech.bus.screen.search.viewmodel.SearchBusUiState import `in`.koreatech.koin.core.designsystem.component.button.FilledButton import `in`.koreatech.koin.core.designsystem.component.tab.KoinSurface import `in`.koreatech.koin.core.designsystem.component.topbar.KoinTopAppBar @@ -44,6 +46,7 @@ import `in`.koreatech.koin.feature.bus.R fun BusSearchScreen( modifier: Modifier = Modifier, onNavigationIconClick: () -> Unit = {}, + onSearchSuccess: (Unit) -> Unit = {}, viewModel: BusSearchViewModel = hiltViewModel() ) { @@ -69,6 +72,17 @@ fun BusSearchScreen( onSearchClicked = viewModel::search ) } + + LaunchedEffect(Unit) { + viewModel.searchBusUiState.collect { + when(it) { + is SearchBusUiState.Loading -> Unit + is SearchBusUiState.EmptyDeparture -> Unit + is SearchBusUiState.EmptyArrival -> Unit + is SearchBusUiState.Success -> onSearchSuccess(it.data) // TODO : data 타입 + } + } + } } @Composable diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt index 2d18fc8d1..bd25ffb26 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/viewmodel/BusSearchViewModel.kt @@ -2,17 +2,27 @@ package `in`.koreatech.bus.screen.search.viewmodel import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import `in`.koreatech.koin.domain.error.busv2.SearchBusError +import `in`.koreatech.koin.domain.usecase.busv2.SearchBusV2UseCase +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class BusSearchViewModel @Inject constructor( - private val savedStateHandle: SavedStateHandle + private val savedStateHandle: SavedStateHandle, + private val searchBusV2UseCase: SearchBusV2UseCase ) : ViewModel() { val departure = savedStateHandle.getStateFlow(KEY_DEPARTURE, "") val arrival = savedStateHandle.getStateFlow(KEY_ARRIVAL, "") + private val _searchBusUiState = MutableSharedFlow() + val searchBusUiState = _searchBusUiState.asSharedFlow() + fun setDeparture(departure: String) { savedStateHandle[KEY_DEPARTURE] = departure } @@ -29,11 +39,27 @@ class BusSearchViewModel @Inject constructor( } fun search() { - // TODO Search bus + viewModelScope.launch { + searchBusV2UseCase(departure.value, arrival.value).onSuccess { + _searchBusUiState.emit(SearchBusUiState.Success(Unit)) // TODO: 리턴 타입 + }.onFailure { + when (it) { + is SearchBusError.EmptyDeparture -> _searchBusUiState.emit(SearchBusUiState.EmptyDeparture) + is SearchBusError.EmptyArrival -> _searchBusUiState.emit(SearchBusUiState.EmptyArrival) + } + } + } } companion object { private const val KEY_DEPARTURE = "departure" private const val KEY_ARRIVAL = "arrival" } +} + +sealed interface SearchBusUiState { + data object Loading : SearchBusUiState + data class Success(val data: Unit) : SearchBusUiState // TODO: 리턴 타입 + data object EmptyDeparture : SearchBusUiState + data object EmptyArrival : SearchBusUiState } \ No newline at end of file From 74f101ec5824fe540141231bd7415f486aa195f5 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Thu, 7 Nov 2024 00:35:15 +0900 Subject: [PATCH 08/13] =?UTF-8?q?add:=20Button=20enabled=20=EC=83=81?= =?UTF-8?q?=ED=83=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/screen/search/composebal/BusSearchScreen.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt index 1bd99a7f0..8eb724fb3 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt @@ -52,6 +52,8 @@ fun BusSearchScreen( val departure by viewModel.departure.collectAsStateWithLifecycle() val arrival by viewModel.arrival.collectAsStateWithLifecycle() + + val searchButtonEnabled by remember { derivedStateOf { departure.isNotEmpty() && arrival.isNotEmpty() } } Column( modifier = modifier @@ -68,6 +70,7 @@ fun BusSearchScreen( .padding(horizontal = 24.dp), departure = departure, arrival = arrival, + searchButtonEnabled = searchButtonEnabled, onSwapIconClicked = viewModel::swapDepartureAndArrival, onSearchClicked = viewModel::search ) @@ -90,6 +93,7 @@ private fun BusSearchContentView( departure: String, arrival: String, modifier: Modifier = Modifier, + searchButtonEnabled: Boolean = false, onSwapIconClicked: () -> Unit = {}, onSearchClicked: () -> Unit = {} ) { @@ -191,6 +195,7 @@ private fun BusSearchContentView( modifier = Modifier .fillMaxWidth() .padding(bottom = 30.dp), + enabled = searchButtonEnabled, text = stringResource(R.string.search), contentPadding = PaddingValues(vertical = 12.dp), onClick = onSearchClicked @@ -304,7 +309,8 @@ private fun BusSearchScreen3Preview() { .fillMaxSize() .padding(top = 16.dp) .padding(horizontal = 24.dp), - onSwapIconClicked = { } + onSwapIconClicked = { }, + searchButtonEnabled = true ) } } \ No newline at end of file From 2b8edebfcfac8fc98c62b18a2aca715251b035e7 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Thu, 7 Nov 2024 13:36:17 +0900 Subject: [PATCH 09/13] =?UTF-8?q?add:=20place=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EB=B0=94=ED=85=80=EC=8B=9C=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/dialog/ChoiceDialog.kt | 2 +- .../search/composebal/BusSearchScreen.kt | 91 +++++++++++---- .../composebal/SelectPlaceBottomSheet.kt | 108 ++++++++++++++++++ .../bus/screen/search/type/PlaceSelectMode.kt | 7 ++ .../bus/screen/search/type/PlaceType.kt | 12 ++ feature/bus/src/main/res/values/strings.xml | 7 ++ 6 files changed, 204 insertions(+), 23 deletions(-) create mode 100644 feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/SelectPlaceBottomSheet.kt create mode 100644 feature/bus/src/main/java/in/koreatech/bus/screen/search/type/PlaceSelectMode.kt create mode 100644 feature/bus/src/main/java/in/koreatech/bus/screen/search/type/PlaceType.kt diff --git a/core/designsystem/src/main/java/in/koreatech/koin/core/designsystem/component/dialog/ChoiceDialog.kt b/core/designsystem/src/main/java/in/koreatech/koin/core/designsystem/component/dialog/ChoiceDialog.kt index 4d2f97fac..136d7cd68 100644 --- a/core/designsystem/src/main/java/in/koreatech/koin/core/designsystem/component/dialog/ChoiceDialog.kt +++ b/core/designsystem/src/main/java/in/koreatech/koin/core/designsystem/component/dialog/ChoiceDialog.kt @@ -1,4 +1,4 @@ -package `in`.koreatech.koin.core.designsystem.component +package `in`.koreatech.koin.core.designsystem.component.dialog import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt index 8eb724fb3..6acb20bb0 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt @@ -20,11 +20,14 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +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.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -33,11 +36,13 @@ import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import `in`.koreatech.bus.screen.search.type.PlaceSelectMode import `in`.koreatech.bus.screen.search.viewmodel.BusSearchViewModel import `in`.koreatech.bus.screen.search.viewmodel.SearchBusUiState import `in`.koreatech.koin.core.designsystem.component.button.FilledButton import `in`.koreatech.koin.core.designsystem.component.tab.KoinSurface import `in`.koreatech.koin.core.designsystem.component.topbar.KoinTopAppBar +import `in`.koreatech.koin.core.designsystem.noRippleClickable import `in`.koreatech.koin.core.designsystem.theme.KoinTheme import `in`.koreatech.koin.feature.bus.R @@ -50,11 +55,15 @@ fun BusSearchScreen( viewModel: BusSearchViewModel = hiltViewModel() ) { + val context = LocalContext.current + val departure by viewModel.departure.collectAsStateWithLifecycle() val arrival by viewModel.arrival.collectAsStateWithLifecycle() - + val searchButtonEnabled by remember { derivedStateOf { departure.isNotEmpty() && arrival.isNotEmpty() } } + var placeSelectMode by remember { mutableStateOf(PlaceSelectMode.NONE) } + Column( modifier = modifier ) { @@ -72,10 +81,36 @@ fun BusSearchScreen( arrival = arrival, searchButtonEnabled = searchButtonEnabled, onSwapIconClicked = viewModel::swapDepartureAndArrival, - onSearchClicked = viewModel::search + onSearchClicked = viewModel::search, + onDepartureFieldClicked = { placeSelectMode = PlaceSelectMode.DEPARTURE }, + onArrivalFieldClicked = { placeSelectMode = PlaceSelectMode.ARRIVAL } + ) + } + + if (placeSelectMode != PlaceSelectMode.NONE) { + SelectPlaceBottomSheet( + onDismissRequest = { placeSelectMode = PlaceSelectMode.NONE }, + selectMode = placeSelectMode, + onConfirmSelection = { + when (placeSelectMode) { + PlaceSelectMode.DEPARTURE -> { + placeSelectMode = PlaceSelectMode.ARRIVAL + viewModel.setDeparture(context.getString(it.titleRes)) + } + + PlaceSelectMode.ARRIVAL -> { + placeSelectMode = PlaceSelectMode.NONE + viewModel.setArrival(context.getString(it.titleRes)) + } + + PlaceSelectMode.NONE -> Unit + } + }, + modifier = Modifier, ) } + LaunchedEffect(Unit) { viewModel.searchBusUiState.collect { when(it) { @@ -95,7 +130,9 @@ private fun BusSearchContentView( modifier: Modifier = Modifier, searchButtonEnabled: Boolean = false, onSwapIconClicked: () -> Unit = {}, - onSearchClicked: () -> Unit = {} + onSearchClicked: () -> Unit = {}, + onDepartureFieldClicked: () -> Unit = {}, + onArrivalFieldClicked: () -> Unit = {} ) { KoinSurface { @@ -146,15 +183,20 @@ private fun BusSearchContentView( BusSearchInput( place = departure, placeholder = stringResource(R.string.select_departure), - modifier = Modifier.padding(top = 10.dp).constrainAs(departureField) { - top.linkTo(iconSwap.top) - bottom.linkTo(iconSwap.bottom) - start.linkTo(parent.start) - end.linkTo(iconSwap.start) - - width = Dimension.fillToConstraints - height = Dimension.preferredWrapContent - } + modifier = Modifier + .padding(top = 10.dp) + .noRippleClickable { + onDepartureFieldClicked() + } + .constrainAs(departureField) { + top.linkTo(iconSwap.top) + bottom.linkTo(iconSwap.bottom) + start.linkTo(parent.start) + end.linkTo(iconSwap.start) + + width = Dimension.fillToConstraints + height = Dimension.preferredWrapContent + } ) IconButton( @@ -178,15 +220,20 @@ private fun BusSearchContentView( BusSearchInput( place = arrival, placeholder = stringResource(R.string.select_arrival), - modifier = Modifier.padding(top = 10.dp).constrainAs(arrivalField) { - top.linkTo(iconSwap.top) - bottom.linkTo(iconSwap.bottom) - start.linkTo(iconSwap.end) - end.linkTo(parent.end) - - width = Dimension.fillToConstraints - height = Dimension.preferredWrapContent - } + modifier = Modifier + .padding(top = 10.dp) + .noRippleClickable { + onArrivalFieldClicked() + } + .constrainAs(arrivalField) { + top.linkTo(iconSwap.top) + bottom.linkTo(iconSwap.bottom) + start.linkTo(iconSwap.end) + end.linkTo(parent.end) + + width = Dimension.fillToConstraints + height = Dimension.preferredWrapContent + } ) } @@ -211,7 +258,7 @@ private fun BusSearchInput( modifier: Modifier = Modifier, ) { - val isPlaceDetermined by remember { derivedStateOf { place.isNotEmpty() } } + val isPlaceDetermined = place.isNotEmpty() Column( modifier = modifier, diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/SelectPlaceBottomSheet.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/SelectPlaceBottomSheet.kt new file mode 100644 index 000000000..cd1f72c68 --- /dev/null +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/SelectPlaceBottomSheet.kt @@ -0,0 +1,108 @@ +package `in`.koreatech.bus.screen.search.composebal + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +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.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.ModalBottomSheet +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.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import `in`.koreatech.bus.screen.search.type.PlaceSelectMode +import `in`.koreatech.bus.screen.search.type.PlaceType +import `in`.koreatech.koin.core.designsystem.component.button.FilledButton +import `in`.koreatech.koin.core.designsystem.component.chip.TextChipGroup +import `in`.koreatech.koin.core.designsystem.theme.KoinTheme +import `in`.koreatech.koin.feature.bus.R + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +internal fun SelectPlaceBottomSheet( + onDismissRequest: () -> Unit, + selectMode: PlaceSelectMode, + onConfirmSelection: (selectedPlace: PlaceType) -> Unit, + modifier: Modifier = Modifier, +) { + require(selectMode != PlaceSelectMode.NONE) { + "SelectPlaceBottomSheet should not be used with PlaceSelectMode.NONE" + } + + val context = LocalContext.current + + var selectedPlace by remember { mutableStateOf(PlaceType.KOREATECH) } + val sheetTitle = when (selectMode) { + PlaceSelectMode.DEPARTURE -> stringResource(R.string.question_departure) + PlaceSelectMode.ARRIVAL -> stringResource(R.string.question_arrival) + PlaceSelectMode.NONE -> "" + } + val buttonText = when (selectMode) { + PlaceSelectMode.DEPARTURE -> stringResource(R.string.action_select_arrival) + PlaceSelectMode.ARRIVAL -> stringResource(R.string.confirm_selection) + PlaceSelectMode.NONE -> "" + } + + ModalBottomSheet( + onDismissRequest = onDismissRequest, + modifier = modifier, + containerColor = Color.White, + shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), + ) { + + Text( + text = sheetTitle, + style = KoinTheme.typography.medium18, + fontWeight = FontWeight.SemiBold, + modifier = Modifier.padding(horizontal = 32.dp).padding(bottom = 12.dp) + ) + + HorizontalDivider( + color = KoinTheme.colors.neutral200 + ) + + TextChipGroup( + modifier = Modifier.padding(horizontal = 32.dp, vertical = 16.dp), + titles = PlaceType.entries.map { context.getString(it.titleRes) }, + onChipSelected = { + selectedPlace = PlaceType.entries.find { type -> + context.getString(type.titleRes) == it + } ?: PlaceType.KOREATECH + }, + selectedChipIndexes = intArrayOf(selectedPlace.ordinal), + shape = RoundedCornerShape(4.dp), + contentPadding = PaddingValues(horizontal = 16.dp, vertical = 12.dp), + showClickRipple = false + ) + + Spacer(modifier = Modifier.height(140.dp)) + FilledButton( + modifier = Modifier.fillMaxWidth().padding(horizontal = 32.dp).padding(bottom = 36.dp), + text = buttonText, + onClick = { onConfirmSelection(selectedPlace) }, + contentPadding = PaddingValues(vertical = 12.dp) + ) + } +} + +@Preview +@Composable +private fun SelectPlaceBottomSheetPreview() { + SelectPlaceBottomSheet( + onDismissRequest = {}, + selectMode = PlaceSelectMode.DEPARTURE, + onConfirmSelection = {} + ) +} \ No newline at end of file diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/type/PlaceSelectMode.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/type/PlaceSelectMode.kt new file mode 100644 index 000000000..84865ecdc --- /dev/null +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/type/PlaceSelectMode.kt @@ -0,0 +1,7 @@ +package `in`.koreatech.bus.screen.search.type + +enum class PlaceSelectMode { + DEPARTURE, + ARRIVAL, + NONE +} diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/type/PlaceType.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/type/PlaceType.kt new file mode 100644 index 000000000..6a3c2335e --- /dev/null +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/type/PlaceType.kt @@ -0,0 +1,12 @@ +package `in`.koreatech.bus.screen.search.type + +import androidx.annotation.StringRes +import `in`.koreatech.koin.feature.bus.R + +internal enum class PlaceType( + @StringRes val titleRes: Int +) { + KOREATECH(R.string.koreatech), + CHEONAN_STATION(R.string.cheonan_station), + CHEONAN_TERMINAL(R.string.cheonan_terminal), +} \ No newline at end of file diff --git a/feature/bus/src/main/res/values/strings.xml b/feature/bus/src/main/res/values/strings.xml index 9aa0fb169..dde5efdbb 100644 --- a/feature/bus/src/main/res/values/strings.xml +++ b/feature/bus/src/main/res/values/strings.xml @@ -24,6 +24,13 @@ 도착지 선택 출발지와 도착지를 바꾸기 조회하기 + 어디서 출발하시나요? + 목적지가 어디인가요? + 도착지 선택하기 + 확인하기 + 코리아텍 + 천안역 + 천안터미널 \ No newline at end of file From a62d78137eb2c9a40733425215bec7feddc21b90 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Thu, 7 Nov 2024 13:37:47 +0900 Subject: [PATCH 10/13] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/composebal/BusSearchContentView.kt | 199 ++++++++++++++++++ .../search/composebal/BusSearchScreen.kt | 188 ----------------- 2 files changed, 199 insertions(+), 188 deletions(-) create mode 100644 feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchContentView.kt diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchContentView.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchContentView.kt new file mode 100644 index 000000000..f82c8a834 --- /dev/null +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchContentView.kt @@ -0,0 +1,199 @@ +package `in`.koreatech.bus.screen.search.composebal + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.PaddingValues +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.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +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.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.constraintlayout.compose.ConstraintLayout +import androidx.constraintlayout.compose.Dimension +import `in`.koreatech.koin.core.designsystem.component.button.FilledButton +import `in`.koreatech.koin.core.designsystem.component.tab.KoinSurface +import `in`.koreatech.koin.core.designsystem.noRippleClickable +import `in`.koreatech.koin.core.designsystem.theme.KoinTheme +import `in`.koreatech.koin.feature.bus.R + +@Composable +internal fun BusSearchContentView( + departure: String, + arrival: String, + modifier: Modifier = Modifier, + searchButtonEnabled: Boolean = false, + onSwapIconClicked: () -> Unit = {}, + onSearchClicked: () -> Unit = {}, + onDepartureFieldClicked: () -> Unit = {}, + onArrivalFieldClicked: () -> Unit = {} +) { + + KoinSurface { + Column(modifier = modifier) { + Text( + modifier = Modifier, + text = stringResource(R.string.introduce_bus_search), + style = KoinTheme.typography.medium16, + color = KoinTheme.colors.neutral800 + ) + + Text( + modifier = Modifier.padding(top = 2.dp), + text = stringResource(R.string.caution_possibly_inaccurate), + style = KoinTheme.typography.regular12, + color = KoinTheme.colors.neutral600 + ) + + ConstraintLayout( + modifier = Modifier + .fillMaxWidth() + .padding(top = 46.dp) + .height(IntrinsicSize.Min) + ) { + val (departureText, arrivalText, departureField, arrivalField, iconSwap) = createRefs() + + Text( + modifier = Modifier.constrainAs(departureText) { + start.linkTo(departureField.start) + top.linkTo(parent.top) + end.linkTo(departureField.end) + }, + text = stringResource(R.string.departure), + style = KoinTheme.typography.medium16, + color = KoinTheme.colors.primary500 + ) + Text( + modifier = Modifier.constrainAs(arrivalText) { + top.linkTo(parent.top) + start.linkTo(arrivalField.start) + end.linkTo(arrivalField.end) + }, + text = stringResource(R.string.arrival), + style = KoinTheme.typography.medium16, + color = KoinTheme.colors.primary500 + ) + + BusSearchInput( + place = departure, + placeholder = stringResource(R.string.select_departure), + modifier = Modifier + .padding(top = 10.dp) + .noRippleClickable { + onDepartureFieldClicked() + } + .constrainAs(departureField) { + top.linkTo(iconSwap.top) + bottom.linkTo(iconSwap.bottom) + start.linkTo(parent.start) + end.linkTo(iconSwap.start) + + width = Dimension.fillToConstraints + height = Dimension.preferredWrapContent + } + ) + + IconButton( + onClick = onSwapIconClicked, + modifier = Modifier + .padding(top = 10.dp) + .padding(horizontal = 16.dp, vertical = 12.dp) + .size(32.dp) + .constrainAs(iconSwap) { + top.linkTo(departureText.bottom) + start.linkTo(departureField.end) + end.linkTo(arrivalField.start) + } + ) { + Icon( + painter = painterResource(id = R.drawable.ic_swap), + contentDescription = stringResource(R.string.swap_content_description), + ) + } + + BusSearchInput( + place = arrival, + placeholder = stringResource(R.string.select_arrival), + modifier = Modifier + .padding(top = 10.dp) + .noRippleClickable { + onArrivalFieldClicked() + } + .constrainAs(arrivalField) { + top.linkTo(iconSwap.top) + bottom.linkTo(iconSwap.bottom) + start.linkTo(iconSwap.end) + end.linkTo(parent.end) + + width = Dimension.fillToConstraints + height = Dimension.preferredWrapContent + } + ) + } + + Spacer(modifier = Modifier.weight(1f)) + FilledButton( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 30.dp), + enabled = searchButtonEnabled, + text = stringResource(R.string.search), + contentPadding = PaddingValues(vertical = 12.dp), + onClick = onSearchClicked + ) + } + } +} + +@Composable +private fun BusSearchInput( + place: String, + placeholder: String, + modifier: Modifier = Modifier, +) { + + val isPlaceDetermined = place.isNotEmpty() + + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Box( + modifier = Modifier + .clip(RoundedCornerShape(4.dp)) + .background(if (isPlaceDetermined.not()) KoinTheme.colors.neutral100 else Color.Transparent) + .fillMaxSize(), + contentAlignment = Alignment.Center + ) { + if (isPlaceDetermined.not()) + Text( + text = placeholder, + maxLines = 1, + style = KoinTheme.typography.regular14, + color = KoinTheme.colors.neutral400 // TODO neutral450 ? + ) + else { + Text( + text = place, + maxLines = 1, + style = KoinTheme.typography.bold18, + color = KoinTheme.colors.neutral800 + ) + } + } + } +} \ No newline at end of file diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt index 6acb20bb0..06262dabe 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt @@ -1,21 +1,10 @@ package `in`.koreatech.bus.screen.search.composebal -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.IntrinsicSize -import androidx.compose.foundation.layout.PaddingValues -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.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf @@ -23,27 +12,17 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember 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.graphics.Color import androidx.compose.ui.platform.LocalContext -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.constraintlayout.compose.ConstraintLayout -import androidx.constraintlayout.compose.Dimension import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import `in`.koreatech.bus.screen.search.type.PlaceSelectMode import `in`.koreatech.bus.screen.search.viewmodel.BusSearchViewModel import `in`.koreatech.bus.screen.search.viewmodel.SearchBusUiState -import `in`.koreatech.koin.core.designsystem.component.button.FilledButton -import `in`.koreatech.koin.core.designsystem.component.tab.KoinSurface import `in`.koreatech.koin.core.designsystem.component.topbar.KoinTopAppBar -import `in`.koreatech.koin.core.designsystem.noRippleClickable -import `in`.koreatech.koin.core.designsystem.theme.KoinTheme import `in`.koreatech.koin.feature.bus.R @OptIn(ExperimentalMaterial3Api::class) @@ -123,173 +102,6 @@ fun BusSearchScreen( } } -@Composable -private fun BusSearchContentView( - departure: String, - arrival: String, - modifier: Modifier = Modifier, - searchButtonEnabled: Boolean = false, - onSwapIconClicked: () -> Unit = {}, - onSearchClicked: () -> Unit = {}, - onDepartureFieldClicked: () -> Unit = {}, - onArrivalFieldClicked: () -> Unit = {} -) { - - KoinSurface { - Column(modifier = modifier) { - Text( - modifier = Modifier, - text = stringResource(R.string.introduce_bus_search), - style = KoinTheme.typography.medium16, - color = KoinTheme.colors.neutral800 - ) - - Text( - modifier = Modifier.padding(top = 2.dp), - text = stringResource(R.string.caution_possibly_inaccurate), - style = KoinTheme.typography.regular12, - color = KoinTheme.colors.neutral600 - ) - - ConstraintLayout( - modifier = Modifier - .fillMaxWidth() - .padding(top = 46.dp) - .height(IntrinsicSize.Min) - ) { - val (departureText, arrivalText, departureField, arrivalField, iconSwap) = createRefs() - - Text( - modifier = Modifier.constrainAs(departureText) { - start.linkTo(departureField.start) - top.linkTo(parent.top) - end.linkTo(departureField.end) - }, - text = stringResource(R.string.departure), - style = KoinTheme.typography.medium16, - color = KoinTheme.colors.primary500 - ) - Text( - modifier = Modifier.constrainAs(arrivalText) { - top.linkTo(parent.top) - start.linkTo(arrivalField.start) - end.linkTo(arrivalField.end) - }, - text = stringResource(R.string.arrival), - style = KoinTheme.typography.medium16, - color = KoinTheme.colors.primary500 - ) - - BusSearchInput( - place = departure, - placeholder = stringResource(R.string.select_departure), - modifier = Modifier - .padding(top = 10.dp) - .noRippleClickable { - onDepartureFieldClicked() - } - .constrainAs(departureField) { - top.linkTo(iconSwap.top) - bottom.linkTo(iconSwap.bottom) - start.linkTo(parent.start) - end.linkTo(iconSwap.start) - - width = Dimension.fillToConstraints - height = Dimension.preferredWrapContent - } - ) - - IconButton( - onClick = onSwapIconClicked, - modifier = Modifier - .padding(top = 10.dp) - .padding(horizontal = 16.dp, vertical = 12.dp) - .size(32.dp) - .constrainAs(iconSwap) { - top.linkTo(departureText.bottom) - start.linkTo(departureField.end) - end.linkTo(arrivalField.start) - } - ) { - Icon( - painter = painterResource(id = R.drawable.ic_swap), - contentDescription = stringResource(R.string.swap_content_description), - ) - } - - BusSearchInput( - place = arrival, - placeholder = stringResource(R.string.select_arrival), - modifier = Modifier - .padding(top = 10.dp) - .noRippleClickable { - onArrivalFieldClicked() - } - .constrainAs(arrivalField) { - top.linkTo(iconSwap.top) - bottom.linkTo(iconSwap.bottom) - start.linkTo(iconSwap.end) - end.linkTo(parent.end) - - width = Dimension.fillToConstraints - height = Dimension.preferredWrapContent - } - ) - } - - Spacer(modifier = Modifier.weight(1f)) - FilledButton( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 30.dp), - enabled = searchButtonEnabled, - text = stringResource(R.string.search), - contentPadding = PaddingValues(vertical = 12.dp), - onClick = onSearchClicked - ) - } - } -} - -@Composable -private fun BusSearchInput( - place: String, - placeholder: String, - modifier: Modifier = Modifier, -) { - - val isPlaceDetermined = place.isNotEmpty() - - Column( - modifier = modifier, - horizontalAlignment = Alignment.CenterHorizontally - ) { - Box( - modifier = Modifier - .clip(RoundedCornerShape(4.dp)) - .background(if (isPlaceDetermined.not()) KoinTheme.colors.neutral100 else Color.Transparent) - .fillMaxSize(), - contentAlignment = Alignment.Center - ) { - if (isPlaceDetermined.not()) - Text( - text = placeholder, - maxLines = 1, - style = KoinTheme.typography.regular14, - color = KoinTheme.colors.neutral400 // TODO neutral450 ? - ) - else { - Text( - text = place, - maxLines = 1, - style = KoinTheme.typography.bold18, - color = KoinTheme.colors.neutral800 - ) - } - } - } -} - @OptIn(ExperimentalMaterial3Api::class) @Preview(showBackground = true) @Composable From eff679d1e6e1b9d62ad1366d14879ab4dde4bb38 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Thu, 7 Nov 2024 13:39:33 +0900 Subject: [PATCH 11/13] =?UTF-8?q?chore:=20TODO=20=EC=A3=BC=EC=84=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/screen/search/composebal/BusSearchContentView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchContentView.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchContentView.kt index f82c8a834..b6f987401 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchContentView.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchContentView.kt @@ -120,7 +120,7 @@ internal fun BusSearchContentView( } ) { Icon( - painter = painterResource(id = R.drawable.ic_swap), + painter = painterResource(id = R.drawable.ic_swap), // TODO : 아이콘 깨짐 contentDescription = stringResource(R.string.swap_content_description), ) } From 9a65dc935dcd95de1d0d1eb7336e95814b33787d Mon Sep 17 00:00:00 2001 From: Thirfir Date: Thu, 7 Nov 2024 18:07:37 +0900 Subject: [PATCH 12/13] =?UTF-8?q?chore:=20=EC=98=A4=ED=83=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/in/koreatech/bus/navigation/BusNavigation.kt | 2 +- .../search/{composebal => composable}/BusSearchContentView.kt | 2 +- .../screen/search/{composebal => composable}/BusSearchScreen.kt | 2 +- .../search/{composebal => composable}/SelectPlaceBottomSheet.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename feature/bus/src/main/java/in/koreatech/bus/screen/search/{composebal => composable}/BusSearchContentView.kt (99%) rename feature/bus/src/main/java/in/koreatech/bus/screen/search/{composebal => composable}/BusSearchScreen.kt (99%) rename feature/bus/src/main/java/in/koreatech/bus/screen/search/{composebal => composable}/SelectPlaceBottomSheet.kt (98%) diff --git a/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt b/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt index d6115b519..9323317fc 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt @@ -9,7 +9,7 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController -import `in`.koreatech.bus.screen.search.composebal.BusSearchScreen +import `in`.koreatech.bus.screen.search.composable.BusSearchScreen import `in`.koreatech.bus.screen.timetable.composable.BusTimetableScreen @Composable diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchContentView.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composable/BusSearchContentView.kt similarity index 99% rename from feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchContentView.kt rename to feature/bus/src/main/java/in/koreatech/bus/screen/search/composable/BusSearchContentView.kt index b6f987401..05aeafd3c 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchContentView.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composable/BusSearchContentView.kt @@ -1,4 +1,4 @@ -package `in`.koreatech.bus.screen.search.composebal +package `in`.koreatech.bus.screen.search.composable import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composable/BusSearchScreen.kt similarity index 99% rename from feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt rename to feature/bus/src/main/java/in/koreatech/bus/screen/search/composable/BusSearchScreen.kt index 06262dabe..55af22c5f 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/BusSearchScreen.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composable/BusSearchScreen.kt @@ -1,4 +1,4 @@ -package `in`.koreatech.bus.screen.search.composebal +package `in`.koreatech.bus.screen.search.composable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/SelectPlaceBottomSheet.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composable/SelectPlaceBottomSheet.kt similarity index 98% rename from feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/SelectPlaceBottomSheet.kt rename to feature/bus/src/main/java/in/koreatech/bus/screen/search/composable/SelectPlaceBottomSheet.kt index cd1f72c68..cdef4448c 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/search/composebal/SelectPlaceBottomSheet.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/screen/search/composable/SelectPlaceBottomSheet.kt @@ -1,4 +1,4 @@ -package `in`.koreatech.bus.screen.search.composebal +package `in`.koreatech.bus.screen.search.composable import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer From 32ff1fc076fc6317f9c69dbaf309b305a8de9020 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Thu, 7 Nov 2024 22:05:34 +0900 Subject: [PATCH 13/13] =?UTF-8?q?fix:=20=EB=B9=8C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/in/koreatech/bus/navigation/BusNavigation.kt | 8 +++++--- .../bus/screen/timetable/viewmodel/BusViewModel.kt | 11 ----------- 2 files changed, 5 insertions(+), 14 deletions(-) delete mode 100644 feature/bus/src/main/java/in/koreatech/bus/screen/timetable/viewmodel/BusViewModel.kt diff --git a/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt b/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt index 9323317fc..6e59f2fe9 100644 --- a/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt +++ b/feature/bus/src/main/java/in/koreatech/bus/navigation/BusNavigation.kt @@ -2,9 +2,9 @@ package `in`.koreatech.bus.navigation import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -16,7 +16,6 @@ import `in`.koreatech.bus.screen.timetable.composable.BusTimetableScreen fun BusNavigation( modifier: Modifier = Modifier, navController: NavHostController = rememberNavController(), - viewModel: BusViewModel = hiltViewModel() ) { NavHost( @@ -31,7 +30,10 @@ fun BusNavigation( ) { composable { - + BusTimetableScreen( + modifier = Modifier.fillMaxSize(), + onNavigationIconClick = { navController.popBackStack() } + ) } composable { diff --git a/feature/bus/src/main/java/in/koreatech/bus/screen/timetable/viewmodel/BusViewModel.kt b/feature/bus/src/main/java/in/koreatech/bus/screen/timetable/viewmodel/BusViewModel.kt deleted file mode 100644 index aa0234d35..000000000 --- a/feature/bus/src/main/java/in/koreatech/bus/screen/timetable/viewmodel/BusViewModel.kt +++ /dev/null @@ -1,11 +0,0 @@ -package `in`.koreatech.bus.screen.timetable.viewmodel - -import androidx.lifecycle.ViewModel -import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject - -@HiltViewModel -class BusViewModel @Inject constructor( - -) : ViewModel() { -} \ No newline at end of file