diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1797aef0..4c0d3983 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -68,6 +68,7 @@ dependencies { implementation(libs.androidx.lifecycle.runtime.compose.android) implementation(libs.androidx.navigation.compose) implementation(libs.androidx.datastore.preferences) + implementation(libs.androidx.espresso.core) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) @@ -75,6 +76,7 @@ dependencies { androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) + implementation(libs.kotlinx.collections.immutable) // Dots Indicator implementation("com.tbuonomo:dotsindicator:5.1.0") diff --git a/app/src/main/java/com/kuit/ourmenu/MainActivity.kt b/app/src/main/java/com/kuit/ourmenu/MainActivity.kt index 8cec8dfc..740cb2a3 100644 --- a/app/src/main/java/com/kuit/ourmenu/MainActivity.kt +++ b/app/src/main/java/com/kuit/ourmenu/MainActivity.kt @@ -4,16 +4,25 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.material3.Scaffold 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 com.kuit.ourmenu.ui.navigator.MainNavHost +import com.kuit.ourmenu.ui.navigator.MainTab +import com.kuit.ourmenu.ui.navigator.component.MainBottomBar +import com.kuit.ourmenu.ui.navigator.rememberMainNavigator import androidx.navigation.compose.rememberNavController import coil3.imageLoader -import com.kuit.ourmenu.ui.navigator.MainNavGraph import com.kuit.ourmenu.ui.onboarding.screen.SplashScreen +import com.kuit.ourmenu.ui.theme.NeutralWhite import com.kuit.ourmenu.ui.theme.OurMenuTheme import dagger.hilt.android.AndroidEntryPoint +import kotlinx.collections.immutable.toPersistentList @AndroidEntryPoint class MainActivity : ComponentActivity() { @@ -22,7 +31,9 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge() setContent { var showSplash by remember { mutableStateOf(true) } - val navController = rememberNavController() + + val navController = rememberMainNavigator() + OurMenuTheme { if (showSplash) { SplashScreen( @@ -31,8 +42,25 @@ class MainActivity : ComponentActivity() { showSplash = false } } else { - // TODO: MainNavigation 추가하기 - MainNavGraph(navController = navController) + Scaffold( + bottomBar = { + MainBottomBar( + modifier = Modifier + .background(NeutralWhite) + .navigationBarsPadding(), + visible = navController.shouldShowBottomBar(), + tabs = MainTab.entries.toPersistentList(), + currentTab = navController.currentTab, + onTabSelected = { navController.navigate(it) } + ) + }, + content = { innerPadding -> + MainNavHost( + navController = navController, + padding = innerPadding + ) + } + ) } } } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/home/navigation/HomeNavigation.kt b/app/src/main/java/com/kuit/ourmenu/ui/home/navigation/HomeNavigation.kt new file mode 100644 index 00000000..2fecea7e --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/home/navigation/HomeNavigation.kt @@ -0,0 +1,24 @@ +package com.kuit.ourmenu.ui.home.navigation + +import androidx.compose.foundation.layout.PaddingValues +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavOptions +import androidx.navigation.compose.composable +import com.kuit.ourmenu.ui.home.screen.HomeScreen +import com.kuit.ourmenu.ui.navigator.MainTabRoute + +fun NavController.navigateToHome(navOptions: NavOptions) { + navigate(MainTabRoute.Home, navOptions) +} + +fun NavGraphBuilder.homeNavGraph( + padding: PaddingValues, + // navigate 이벤트 +) { + composable { + HomeScreen( + // navigate 이벤트 + 기타 이벤트 + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/home/screen/HomeScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/home/screen/HomeScreen.kt index 64adadc1..13b803d0 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/home/screen/HomeScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/home/screen/HomeScreen.kt @@ -12,7 +12,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.ui.common.topappbar.OurMenuAddButtonTopAppBar import com.kuit.ourmenu.ui.home.component.recommendation.main.HomeMainRecommendation @@ -20,7 +19,7 @@ import com.kuit.ourmenu.ui.home.component.recommendation.sub.HomeSubRecommendati import com.kuit.ourmenu.ui.home.dummy.HomeDummyData @Composable -fun HomeScreen(modifier: Modifier = Modifier, navController: NavHostController) { +fun HomeScreen(modifier: Modifier = Modifier) { val scrollState = rememberScrollState() @@ -69,5 +68,5 @@ fun HomeScreen(modifier: Modifier = Modifier, navController: NavHostController) @Composable private fun HomeScreenPreview() { val navController = rememberNavController() - HomeScreen(navController = navController) + HomeScreen() } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/navigation/MenuFolderNavigation.kt b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/navigation/MenuFolderNavigation.kt new file mode 100644 index 00000000..8f540256 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/menuFolder/navigation/MenuFolderNavigation.kt @@ -0,0 +1,24 @@ +package com.kuit.ourmenu.ui.menuFolder.navigation + +import androidx.compose.foundation.layout.PaddingValues +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavOptions +import androidx.navigation.compose.composable +import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderScreen +import com.kuit.ourmenu.ui.navigator.MainTabRoute + +fun NavController.navigateToMenuFolder(navOptions: NavOptions) { + navigate(MainTabRoute.MenuFolder, navOptions) +} + +fun NavGraphBuilder.menuFolderNavGraph( + padding: PaddingValues, + // navigate 이벤트 +) { + composable { + MenuFolderScreen( + // navigate 이벤트 + 기타 이벤트 + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/my/navigation/MyNavigation.kt b/app/src/main/java/com/kuit/ourmenu/ui/my/navigation/MyNavigation.kt new file mode 100644 index 00000000..c90a24b8 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/my/navigation/MyNavigation.kt @@ -0,0 +1,21 @@ +package com.kuit.ourmenu.ui.my.navigation + +import androidx.compose.foundation.layout.PaddingValues +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavOptions +import androidx.navigation.compose.composable +import com.kuit.ourmenu.ui.navigator.MainTabRoute + +fun NavController.navigateToMy(navOptions: NavOptions) { + navigate(MainTabRoute.My, navOptions) +} + +fun NavGraphBuilder.myNavGraph( + padding: PaddingValues, + // navigate 이벤트 +) { + composable { + // MyScreen.kt + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavController.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavController.kt new file mode 100644 index 00000000..aba88643 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavController.kt @@ -0,0 +1,97 @@ +package com.kuit.ourmenu.ui.navigator + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.navigation.NavDestination +import androidx.navigation.NavHostController +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import androidx.navigation.navOptions +import com.kuit.ourmenu.ui.home.navigation.navigateToHome +import com.kuit.ourmenu.ui.menuFolder.navigation.navigateToMenuFolder +import com.kuit.ourmenu.ui.my.navigation.navigateToMy +import com.kuit.ourmenu.ui.onboarding.navigation.navigateOnboardingToHome +import com.kuit.ourmenu.ui.onboarding.navigation.navigateToLogin +import com.kuit.ourmenu.ui.onboarding.navigation.navigateToSignupEmail +import com.kuit.ourmenu.ui.onboarding.navigation.navigateToSignupMealTime +import com.kuit.ourmenu.ui.onboarding.navigation.navigateToSignupPassword +import com.kuit.ourmenu.ui.onboarding.navigation.navigateToSignupVerify +import com.kuit.ourmenu.ui.searchmenu.navigation.navigateToSearchMenu + +class MainNavController( + val navController: NavHostController, +) { + private val currentDestination: NavDestination? + @Composable get() = navController + .currentBackStackEntryAsState().value?.destination + + val startDestination = Routes.Landing + + val currentTab: MainTab? + @Composable get() = MainTab.entries.find { tab -> + currentDestination?.route == tab.route::class.qualifiedName + } + + fun navigate(tab: MainTab) { + val navOptions = navOptions { + popUpTo(MainTab.HOME.route) { + inclusive = false + } + launchSingleTop = true + restoreState = true + } + + when (tab) { + MainTab.HOME -> navController.navigateToHome(navOptions) + MainTab.MAP -> navController.navigateToSearchMenu(navOptions) + MainTab.MENU_FOLDER -> navController.navigateToMenuFolder(navOptions) + MainTab.MY -> navController.navigateToMy(navOptions) + } + } + + // Back Pressed + fun navigateUp() { + navController.navigateUp() + } + + // Onboarding + fun navigateToLogin() { + navController.navigateToLogin() + } + + fun navigateToSignupEmail() { + navController.navigateToSignupEmail() + } + + fun navigateToSignupPassword() { + navController.navigateToSignupPassword() + } + + fun navigateToSignupMealTime() { + navController.navigateToSignupMealTime() + } + + fun navigateToSignupVerify() { + navController.navigateToSignupVerify() + } + + fun navigateOnboardingToHome() { + navController.navigateOnboardingToHome() + } + + fun popBackStack() { + navController.popBackStack() + } + + @Composable + fun shouldShowBottomBar(): Boolean = MainTab.contains { + currentDestination?.route?.startsWith(it::class.qualifiedName!!) == true + } +} + +@Composable +fun rememberMainNavigator( + navController: NavHostController = rememberNavController(), +): MainNavController = remember(navController) { + MainNavController(navController) +} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt deleted file mode 100644 index 54adc541..00000000 --- a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavGraph.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.kuit.ourmenu.ui.navigator - -import androidx.compose.runtime.Composable -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.navigation.NavHostController -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import com.kuit.ourmenu.ui.addmenu.screen.AddMenuScreen -import androidx.navigation.compose.navigation -import com.kuit.ourmenu.ui.home.screen.HomeScreen -import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderAllMenuScreen -import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderDetailScreen -import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderScreen -import com.kuit.ourmenu.ui.menuinfo.screen.MenuInfoDefaultScreen -import com.kuit.ourmenu.ui.menuinfo.screen.MenuInfoMapScreen -import com.kuit.ourmenu.ui.onboarding.screen.LandingScreen -import com.kuit.ourmenu.ui.onboarding.screen.LoginScreen -import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupEmailScreen -import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupMealTimeScreen -import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupPasswordScreen -import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupVerifyScreen -import com.kuit.ourmenu.ui.onboarding.viewmodel.SignupViewModel - -@Composable -fun MainNavGraph(navController: NavHostController) { - val viewModel = hiltViewModel() - - NavHost(navController, startDestination = Routes.Onboarding) { - composable { - HomeScreen(navController = navController) - } - - navigation(startDestination = Routes.Landing) { - - composable { - LandingScreen(navController = navController) - } - composable { - LoginScreen(navController = navController) - } - composable { - SignupEmailScreen(navController = navController, viewModel = viewModel) - } - composable { - SignupPasswordScreen(navController = navController, viewModel = viewModel) - } - composable { - SignupMealTimeScreen(navController = navController, viewModel = viewModel) - } - composable { - SignupVerifyScreen(navController = navController, viewModel = viewModel) - } - } - - // 메뉴판 - composable { - MenuFolderScreen(navController = navController) - } - composable { - MenuFolderDetailScreen(navController = navController) - } - composable { - MenuFolderAllMenuScreen(navController = navController) - } - - // 메뉴 - composable { - MenuInfoDefaultScreen(navController = navController) - } - composable { - MenuInfoMapScreen(navController = navController) - } - - // 메뉴 추가 - composable { - AddMenuScreen(navController = navController) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavHost.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavHost.kt new file mode 100644 index 00000000..c584097d --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainNavHost.kt @@ -0,0 +1,85 @@ +package com.kuit.ourmenu.ui.navigator + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import com.kuit.ourmenu.ui.addmenu.screen.AddMenuScreen +import com.kuit.ourmenu.ui.home.navigation.homeNavGraph +import com.kuit.ourmenu.ui.menuFolder.navigation.menuFolderNavGraph +import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderAllMenuScreen +import com.kuit.ourmenu.ui.menuFolder.screen.MenuFolderDetailScreen +import com.kuit.ourmenu.ui.menuinfo.screen.MenuInfoDefaultScreen +import com.kuit.ourmenu.ui.menuinfo.screen.MenuInfoMapScreen +import com.kuit.ourmenu.ui.my.navigation.myNavGraph +import com.kuit.ourmenu.ui.onboarding.navigation.onboardingNavGraph +import com.kuit.ourmenu.ui.onboarding.viewmodel.SignupViewModel +import com.kuit.ourmenu.ui.searchmenu.navigation.searchMenuNavGraph + +@Composable +fun MainNavHost( + modifier: Modifier = Modifier, + navController: MainNavController, + padding : PaddingValues +) { + val signupViewModel = hiltViewModel() + + NavHost( + navController = navController.navController, + startDestination = navController.startDestination + ) { + + onboardingNavGraph( + viewModel = signupViewModel, + navigateBack = navController::navigateUp, + navigateOnboardingToHome = navController::navigateOnboardingToHome, + navigateToLogin = navController::navigateToLogin, + navigateToSignupEmail = navController::navigateToSignupEmail, + navigateToSignupVerify = navController::navigateToSignupVerify, + navigateToSignupPassword = navController::navigateToSignupPassword, + navigateToSignupMealTime = navController::navigateToSignupMealTime, + ) + + homeNavGraph( + padding = padding, + ) + + menuFolderNavGraph( + padding = padding, + ) + + searchMenuNavGraph( + padding = padding, + ) + + myNavGraph( + padding = padding, + ) + + // 메뉴판 +// composable { +// MenuFolderScreen(navController = navController.navController) +// } + composable { + MenuFolderDetailScreen(navController = navController.navController) + } + composable { + MenuFolderAllMenuScreen(navController = navController.navController) + } + + // 메뉴 + composable { + MenuInfoDefaultScreen(navController = navController.navController) + } + composable { + MenuInfoMapScreen(navController = navController.navController) + } + + // 메뉴 추가 + composable { + AddMenuScreen(navController = navController.navController) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainTab.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainTab.kt new file mode 100644 index 00000000..da459053 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainTab.kt @@ -0,0 +1,50 @@ +package com.kuit.ourmenu.ui.navigator + +import androidx.compose.runtime.Composable +import com.kuit.ourmenu.R + +enum class MainTab( + val iconResId: Int, + val selectedIconResId: Int, + internal val contentDescription: String, + val label: String, + val route: MainTabRoute, +) { + HOME( + iconResId = R.drawable.ic_navigation_bar_home, + selectedIconResId = R.drawable.ic_navigation_bar_home_selected, + contentDescription = "Home Icon", + label = "홈", + route = MainTabRoute.Home, + ), + MAP( + iconResId = R.drawable.ic_navigation_bar_map, + selectedIconResId = R.drawable.ic_navigation_bar_map_selected, + contentDescription = "Map Icon", + label = "지도", + route = MainTabRoute.Map, + ), + MENU_FOLDER( + iconResId = R.drawable.ic_navigation_bar_folder, + selectedIconResId = R.drawable.ic_navigation_bar_folder_selected, + contentDescription = "Menu Folder Icon", + label = "메뉴판", + route = MainTabRoute.MenuFolder, + ), + MY( + iconResId = R.drawable.ic_navigation_bar_my, + selectedIconResId = R.drawable.ic_navigation_bar_my_selected, + contentDescription = "My Icon", + label = "마이", + route = MainTabRoute.My, + ) + ; + + companion object { + + @Composable + fun contains(predicate: @Composable (Routes) -> Boolean): Boolean { + return entries.map { it.route }.any { predicate(it) } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainTabRoute.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainTabRoute.kt new file mode 100644 index 00000000..0e0639fa --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/MainTabRoute.kt @@ -0,0 +1,14 @@ +package com.kuit.ourmenu.ui.navigator + +import kotlinx.serialization.Serializable + +sealed interface MainTabRoute : Routes { + @Serializable + data object Home : MainTabRoute + @Serializable + data object Map : MainTabRoute + @Serializable + data object MenuFolder : MainTabRoute + @Serializable + data object My : MainTabRoute +} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt index 91736858..3ad1ae17 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/Routes.kt @@ -3,16 +3,9 @@ package com.kuit.ourmenu.ui.navigator import kotlinx.serialization.Serializable sealed interface Routes{ - // Home - @Serializable - data object Home: Routes - - // 지도 // 메뉴판 @Serializable - data object MenuFolder: Routes - @Serializable data object MenuFolderDetail: Routes @Serializable data object MenuFolderAllMenu: Routes diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/component/MainBottomBar.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/component/MainBottomBar.kt new file mode 100644 index 00000000..dda6736a --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/component/MainBottomBar.kt @@ -0,0 +1,79 @@ +package com.kuit.ourmenu.ui.navigator.component + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideIn +import androidx.compose.animation.slideOut +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.dp +import com.kuit.ourmenu.ui.navigator.MainTab +import com.kuit.ourmenu.ui.theme.NeutralWhite +import com.kuit.ourmenu.ui.theme.OurMenuTheme +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList + +@Composable +internal fun MainBottomBar( + modifier: Modifier = Modifier, + visible: Boolean, + tabs: ImmutableList, + currentTab: MainTab?, + onTabSelected: (MainTab) -> Unit, +) { + AnimatedVisibility( + visible = visible, + enter = fadeIn() + slideIn { IntOffset(0, it.height) }, + exit = fadeOut() + slideOut { IntOffset(0, it.height) }, + ) { + Row( + modifier = modifier + .shadow( + elevation = 4.dp, + spotColor = Color(0x1F000000), + ambientColor = Color(0x1F000000) + ) + .background(color = NeutralWhite) + .fillMaxWidth() + .padding(horizontal = 20.dp) + .height(76.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly + ) { + tabs.forEach { tab -> + MainBottomBarItem( + tab = tab, + selected = tab == currentTab, + onClick = { + if (tab != currentTab) onTabSelected(tab) + } + ) + } + } + } +} + +@Preview(showBackground = true) +@Composable +private fun MainBottomBarPreview() { + OurMenuTheme { + MainBottomBar( + visible = true, + tabs = MainTab.entries.toImmutableList(), + currentTab = MainTab.HOME, + onTabSelected = {} + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/navigator/component/MainBottomBarItem.kt b/app/src/main/java/com/kuit/ourmenu/ui/navigator/component/MainBottomBarItem.kt new file mode 100644 index 00000000..c7006768 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/navigator/component/MainBottomBarItem.kt @@ -0,0 +1,60 @@ +package com.kuit.ourmenu.ui.navigator.component + +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.selection.selectable +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +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.graphics.vector.ImageVector +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.unit.dp +import com.kuit.ourmenu.ui.navigator.MainTab +import com.kuit.ourmenu.ui.theme.Neutral500 +import com.kuit.ourmenu.ui.theme.Primary500Main +import com.kuit.ourmenu.ui.theme.ourMenuTypography + +@Composable +fun RowScope.MainBottomBarItem( + modifier: Modifier = Modifier, + tab: MainTab, + selected: Boolean = false, + onClick: () -> Unit = {} +) { + Column( + modifier = modifier + .padding(vertical = 10.dp) + .weight(1f) + .fillMaxHeight() + .selectable( + selected = selected, + indication = null, + role = Role.Tab, + interactionSource = remember { MutableInteractionSource() }, + onClick = onClick, + ), + verticalArrangement = Arrangement.spacedBy(6.dp, Alignment.CenterVertically), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Icon( + imageVector = ImageVector.vectorResource(if (selected) tab.selectedIconResId else tab.iconResId), + contentDescription = tab.contentDescription, + tint = Color.Unspecified + ) + Text( + text = tab.label, + style = ourMenuTypography().pretendard_400_12.copy( + color = if (selected) Primary500Main else Neutral500 + ) + ) + } +} diff --git a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/navigation/OnboardingNavigation.kt b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/navigation/OnboardingNavigation.kt new file mode 100644 index 00000000..82a6e2cd --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/navigation/OnboardingNavigation.kt @@ -0,0 +1,99 @@ +package com.kuit.ourmenu.ui.onboarding.navigation + +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable +import com.kuit.ourmenu.ui.navigator.MainTabRoute +import com.kuit.ourmenu.ui.navigator.Routes +import com.kuit.ourmenu.ui.onboarding.screen.LandingScreen +import com.kuit.ourmenu.ui.onboarding.screen.LoginScreen +import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupEmailScreen +import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupMealTimeScreen +import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupPasswordScreen +import com.kuit.ourmenu.ui.onboarding.screen.signup.SignupVerifyScreen +import com.kuit.ourmenu.ui.onboarding.viewmodel.SignupViewModel + +fun NavController.navigateToLogin() { + navigate(Routes.Login) +} + +fun NavController.navigateToSignupEmail() { + navigate(Routes.SignupEmail) +} + +fun NavController.navigateToSignupPassword() { + navigate(Routes.SignupPassword) +} + +fun NavController.navigateToSignupMealTime() { + navigate(Routes.SignupMealTime) +} + +fun NavController.navigateToSignupVerify() { + navigate(Routes.SignupVerify) +} + +fun NavController.navigateOnboardingToHome() { + navigate(MainTabRoute.Home) { + popUpTo(Routes.Landing) { + inclusive = true + } + } +} + + +fun NavGraphBuilder.onboardingNavGraph( + navigateBack: () -> Unit, + navigateOnboardingToHome: () -> Unit, + navigateToLogin: () -> Unit, + navigateToSignupEmail: () -> Unit, + navigateToSignupVerify: () -> Unit, + navigateToSignupMealTime: () -> Unit, + navigateToSignupPassword: () -> Unit, + viewModel: SignupViewModel, +) { + + composable { + LandingScreen( + navigateToHome = navigateOnboardingToHome, + navigateToLogin = navigateToLogin, + navigateToSignupEmail = navigateToSignupEmail, + navigateToSignupMealTime = navigateToSignupMealTime, + ) + } + composable { + LoginScreen( + navigateToHome = navigateOnboardingToHome, + navigateBack = navigateBack, + navigateToSignupEmail = navigateToSignupEmail, + ) + } + composable { + SignupEmailScreen( + navigateToVerify = navigateToSignupVerify, + navigateBack = navigateBack, + viewModel = viewModel + ) + } + composable { + SignupVerifyScreen( + navigateToPassword = navigateToSignupPassword, + navigateBack = navigateBack, + viewModel = viewModel + ) + } + composable { + SignupPasswordScreen( + navigateToMealTime = navigateToSignupMealTime, + navigateBack = navigateBack, + viewModel = viewModel + ) + } + composable { + SignupMealTimeScreen( + navigateToHome = navigateOnboardingToHome, + navigateBack = navigateBack, + viewModel = viewModel + ) + } +} \ No newline at end of file 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 397fe3bf..3d42457b 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 @@ -37,11 +37,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.common.BottomFullWidthButton -import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.oauth.KakaoModule.getKakaoLogin import com.kuit.ourmenu.ui.onboarding.component.BottomFullWidthBorderButton import com.kuit.ourmenu.ui.onboarding.state.KakaoState @@ -57,7 +54,10 @@ import kotlinx.coroutines.launch @Composable fun LandingScreen( - navController: NavController, + navigateToHome: () -> Unit, + navigateToLogin: () -> Unit, + navigateToSignupEmail: () -> Unit, + navigateToSignupMealTime: () -> Unit, viewModel: LandingViewModel = hiltViewModel() ) { val kakaoState by viewModel.kakaoState.collectAsStateWithLifecycle() @@ -69,13 +69,11 @@ fun LandingScreen( LaunchedEffect(kakaoState) { Log.d("KakaoModule", kakaoState.toString()) when (kakaoState) { - is KakaoState.Login -> navController.navigate(route = Routes.Home) { - popUpTo(Routes.Onboarding) { inclusive = true } - } + is KakaoState.Login -> navigateToHome() is KakaoState.Loading -> viewModel.signInWithKakao() - is KakaoState.Signup -> navController.navigate(route = Routes.SignupMealTime) + is KakaoState.Signup -> navigateToSignupMealTime() is KakaoState.Error -> { // 에러에 따라 snackbar 를 show 하면 됨 scope.launch { @@ -92,15 +90,15 @@ fun LandingScreen( Box( modifier = - Modifier - .fillMaxSize() - .padding(bottom = 18.dp), + Modifier + .fillMaxSize() + .padding(bottom = 18.dp), ) { Column( modifier = - Modifier - .fillMaxSize() - .padding(horizontal = 20.dp), + Modifier + .fillMaxSize() + .padding(horizontal = 20.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { Image( @@ -139,13 +137,13 @@ fun LandingScreen( contentColor = NeutralWhite, text = stringResource(R.string.login) ) { - navController.navigate(route = Routes.Login) + navigateToLogin() } Spacer(modifier = Modifier.height(16.dp)) BottomFullWidthBorderButton { - navController.navigate(route = Routes.SignupEmail) + navigateToSignupEmail() } Box( @@ -198,9 +196,9 @@ fun LandingScreen( Box( modifier = - Modifier - .fillMaxSize() - .padding(bottom = 65.5.dp), + Modifier + .fillMaxSize() + .padding(bottom = 65.5.dp), contentAlignment = Alignment.BottomCenter, ) { Row { @@ -227,7 +225,11 @@ fun LandingScreen( @Composable @Preview(showBackground = true) private fun LandingScreenPreview() { - val navController = rememberNavController() - - LandingScreen(navController) + LandingScreen( + navigateToHome = {}, + navigateToLogin = {}, + navigateToSignupEmail = {}, + navigateToSignupMealTime = {}, + viewModel = hiltViewModel() + ) } \ No newline at end of file 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 90c7d259..55b0c9dd 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 @@ -43,17 +43,13 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.common.BottomFullWidthButton import com.kuit.ourmenu.ui.common.OurSnackbarHost -import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.onboarding.component.BottomFullWidthBorderButton import com.kuit.ourmenu.ui.onboarding.component.LoginTextField import com.kuit.ourmenu.ui.onboarding.component.OnboardingTopAppBar import com.kuit.ourmenu.ui.onboarding.state.LoginState -import com.kuit.ourmenu.ui.onboarding.state.PasswordState import com.kuit.ourmenu.ui.onboarding.viewmodel.LoginViewModel import com.kuit.ourmenu.ui.theme.Neutral100 import com.kuit.ourmenu.ui.theme.Neutral300 @@ -68,7 +64,9 @@ import kotlin.math.roundToInt @Composable fun LoginScreen( - navController: NavController, + navigateToHome: () -> Unit, + navigateBack: () -> Unit, + navigateToSignupEmail: () -> Unit, viewModel: LoginViewModel = hiltViewModel() ) { val email by viewModel.email.collectAsStateWithLifecycle() @@ -85,12 +83,9 @@ fun LoginScreen( LaunchedEffect(loginState) { when (loginState) { - is LoginState.Success -> navController.navigate(route = Routes.Home) { - popUpTo(route = Routes.Onboarding) { inclusive = true } - } + is LoginState.Success -> navigateToHome() is LoginState.Error -> { - // 에러에 따라 snackbar 를 show 하면 됨 scope.launch { snackbarHostState.showSnackbar( message = viewModel.error.value ?: "", @@ -142,9 +137,7 @@ fun LoginScreen( Scaffold( topBar = { OnboardingTopAppBar( - onBackClick = { - navController.popBackStack() - }, + onBackClick = navigateBack, ) }, content = { innerPadding -> @@ -264,7 +257,7 @@ fun LoginScreen( Spacer(modifier = Modifier.height(24.dp)) BottomFullWidthBorderButton { - navController.navigate(route = Routes.SignupEmail) + navigateToSignupEmail() } } @@ -311,7 +304,9 @@ fun LoginScreen( @Preview(showBackground = true) @Composable private fun LoginScreenPreview() { - val navController = rememberNavController() - - LoginScreen(navController) + LoginScreen( + navigateToHome = {}, + navigateBack = {}, + navigateToSignupEmail = {} + ) } diff --git a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupEmailScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupEmailScreen.kt index 745a2959..40297217 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupEmailScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupEmailScreen.kt @@ -23,12 +23,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.common.DisableBottomFullWidthButton import com.kuit.ourmenu.ui.common.OurSnackbarHost -import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.onboarding.component.EmailSpinner import com.kuit.ourmenu.ui.onboarding.component.LoginTextField import com.kuit.ourmenu.ui.onboarding.component.OnboardingTopAppBar @@ -41,13 +38,14 @@ import kotlinx.coroutines.launch @Composable fun SignupEmailScreen( - navController: NavController, + navigateToVerify: () -> Unit, + navigateBack: () -> Unit, viewModel: SignupViewModel = hiltViewModel() ) { val email by viewModel.email.collectAsStateWithLifecycle() val domain by viewModel.domain.collectAsStateWithLifecycle() - val enable = /*email.isNotEmpty() && domain.isNotEmpty()*/ true + val enable = email.isNotEmpty() && domain.isNotEmpty() val emailState by viewModel.emailState.collectAsStateWithLifecycle() val snackbarHostState = remember { SnackbarHostState() } @@ -56,7 +54,7 @@ fun SignupEmailScreen( LaunchedEffect(emailState) { when (emailState) { - is SignupState.Success -> navController.navigate(route = Routes.SignupVerify) + is SignupState.Success -> navigateToVerify() is SignupState.Error -> { scope.launch { snackbarHostState.showSnackbar( @@ -82,9 +80,7 @@ fun SignupEmailScreen( Scaffold( topBar = { OnboardingTopAppBar( - onBackClick = { - navController.navigateUp() - } + onBackClick = navigateBack ) }, modifier = Modifier @@ -193,7 +189,8 @@ fun EmailInputField( @Preview @Composable private fun SignupEmailScreenPreview() { - val navController = rememberNavController() - - SignupEmailScreen(navController) + SignupEmailScreen( + navigateToVerify = {}, + navigateBack = {} + ) } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupMealTimeScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupMealTimeScreen.kt index e0634247..e92fa44a 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupMealTimeScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupMealTimeScreen.kt @@ -18,11 +18,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.common.DisableBottomFullWidthButton -import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.onboarding.component.MealTimeGrid import com.kuit.ourmenu.ui.onboarding.component.OnboardingTopAppBar import com.kuit.ourmenu.ui.onboarding.state.SignupState @@ -33,7 +30,8 @@ import com.kuit.ourmenu.ui.theme.ourMenuTypography @Composable fun SignupMealTimeScreen( - navController: NavController, + navigateToHome: () -> Unit, + navigateBack: () -> Unit, viewModel: SignupViewModel = hiltViewModel() ) { @@ -44,12 +42,8 @@ fun SignupMealTimeScreen( LaunchedEffect(signupState) { when (signupState) { - is SignupState.Success ->{ - navController.navigate(route = Routes.Home) { - popUpTo(Routes.Onboarding) { - inclusive = true - } - } + is SignupState.Success -> { + navigateToHome() } is SignupState.Error -> @@ -62,9 +56,7 @@ fun SignupMealTimeScreen( Scaffold( topBar = { OnboardingTopAppBar( - onBackClick = { - navController.navigateUp() - } + onBackClick = navigateBack ) }, modifier = Modifier @@ -128,9 +120,9 @@ fun SignupMealTimeScreen( widthDp = 360 ) @Composable -private fun SignupNicknameScreenPreview() { - val navController = rememberNavController() - - SignupMealTimeScreen(navController) - +private fun SignupMealTimeScreenPreview() { + SignupMealTimeScreen( + navigateToHome = {}, + navigateBack = {} + ) } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupPasswordScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupPasswordScreen.kt index 887b855e..7146eee1 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupPasswordScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupPasswordScreen.kt @@ -38,12 +38,9 @@ import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.common.DisableBottomFullWidthButton import com.kuit.ourmenu.ui.common.OurSnackbarHost -import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.onboarding.component.LoginTextField import com.kuit.ourmenu.ui.onboarding.component.OnboardingTopAppBar import com.kuit.ourmenu.ui.onboarding.state.PasswordState @@ -62,7 +59,8 @@ import kotlin.math.roundToInt @Composable fun SignupPasswordScreen( - navController: NavController, + navigateToMealTime: () -> Unit, + navigateBack: () -> Unit, viewModel: SignupViewModel = hiltViewModel() ) { val password by viewModel.password.collectAsStateWithLifecycle() @@ -117,7 +115,7 @@ fun SignupPasswordScreen( } PasswordState.Valid -> { - navController.navigate(route = Routes.SignupMealTime) + navigateToMealTime() } else -> {} @@ -129,19 +127,15 @@ fun SignupPasswordScreen( .fillMaxSize() .imePadding(), topBar = { - OnboardingTopAppBar( - onBackClick = { - navController.navigateUp() - } - ) + OnboardingTopAppBar(onBackClick = navigateBack) }, content = { innerPadding -> Column( modifier = - Modifier - .fillMaxSize() - .padding(innerPadding) - .padding(horizontal = 20.dp), + Modifier + .fillMaxSize() + .padding(innerPadding) + .padding(horizontal = 20.dp), ) { Text( text = stringResource(R.string.enter_password), @@ -174,7 +168,7 @@ fun SignupPasswordScreen( input = password, onTextChange = { viewModel.updatePassword(it) }, visualTransformation = - if (isPasswordVisible) VisualTransformation.None else PasswordVisualTransformation(), + if (isPasswordVisible) VisualTransformation.None else PasswordVisualTransformation(), ) Spacer(modifier = Modifier.height(8.dp)) @@ -205,14 +199,14 @@ fun SignupPasswordScreen( checked = isPasswordVisible, onCheckedChange = { isPasswordVisible = it }, modifier = - Modifier - .size(24.dp), + Modifier + .size(24.dp), colors = - CheckboxDefaults.colors( - checkmarkColor = NeutralWhite, - checkedColor = Primary500Main, - uncheckedColor = Neutral300, - ), + CheckboxDefaults.colors( + checkmarkColor = NeutralWhite, + checkedColor = Primary500Main, + uncheckedColor = Neutral300, + ), ) Text( @@ -238,9 +232,9 @@ fun SignupPasswordScreen( bottomBar = { Column( modifier = - Modifier - .fillMaxWidth() - .padding(20.dp), + Modifier + .fillMaxWidth() + .padding(20.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { Box( @@ -265,6 +259,8 @@ fun SignupPasswordScreen( @Preview(showBackground = true) @Composable private fun SignupPasswordScreenPreview() { - val navController = rememberNavController() - SignupPasswordScreen(navController) -} + SignupPasswordScreen( + navigateToMealTime = {}, + navigateBack = {} + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupVerifyScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupVerifyScreen.kt index 80b00ff2..5af888b4 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupVerifyScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/onboarding/screen/signup/SignupVerifyScreen.kt @@ -35,15 +35,11 @@ import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController import com.kuit.ourmenu.R import com.kuit.ourmenu.ui.common.DisableBottomFullWidthButton import com.kuit.ourmenu.ui.common.OurSnackbarHost -import com.kuit.ourmenu.ui.navigator.Routes import com.kuit.ourmenu.ui.onboarding.component.OnboardingTopAppBar import com.kuit.ourmenu.ui.onboarding.component.VerifyCodeTextField -import com.kuit.ourmenu.ui.onboarding.state.PasswordState import com.kuit.ourmenu.ui.onboarding.state.SignupState import com.kuit.ourmenu.ui.onboarding.viewmodel.SignupViewModel import com.kuit.ourmenu.ui.theme.Neutral300 @@ -53,13 +49,13 @@ import com.kuit.ourmenu.ui.theme.NeutralWhite import com.kuit.ourmenu.ui.theme.Primary500Main import com.kuit.ourmenu.ui.theme.ourMenuTypography import com.kuit.ourmenu.utils.AnimationUtil.shakeAnimation -import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlin.math.roundToInt @Composable fun SignupVerifyScreen( - navController: NavController, + navigateToPassword: () -> Unit, + navigateBack: () -> Unit, viewModel: SignupViewModel = hiltViewModel() ) { val focusRequesters = List(6) { FocusRequester() } @@ -78,7 +74,7 @@ fun SignupVerifyScreen( LaunchedEffect(verifyState) { when (verifyState) { is SignupState.Success -> - navController.navigate(route = Routes.SignupPassword) + navigateToPassword() is SignupState.Error -> { shakeAnimation( @@ -103,9 +99,7 @@ fun SignupVerifyScreen( .imePadding(), topBar = { OnboardingTopAppBar( - onBackClick = { - navController.navigateUp() - } + onBackClick = navigateBack ) }, content = { innerPadding -> @@ -253,7 +247,8 @@ fun SignupVerifyScreen( @Preview(showBackground = true) @Composable private fun SignupVerifyScreenPreview() { - val navController = rememberNavController() - - SignupVerifyScreen(navController) -} + SignupVerifyScreen( + navigateToPassword = {}, + navigateBack = {} + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/navigation/SearchMenuNavigation.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/navigation/SearchMenuNavigation.kt new file mode 100644 index 00000000..57130b11 --- /dev/null +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/navigation/SearchMenuNavigation.kt @@ -0,0 +1,22 @@ +package com.kuit.ourmenu.ui.searchmenu.navigation + +import androidx.compose.foundation.layout.PaddingValues +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavOptions +import androidx.navigation.compose.composable +import com.kuit.ourmenu.ui.navigator.MainTabRoute +import com.kuit.ourmenu.ui.searchmenu.screen.SearchMenuScreen + +fun NavController.navigateToSearchMenu(navOptions: NavOptions) { + navigate(MainTabRoute.Map, navOptions) +} + +fun NavGraphBuilder.searchMenuNavGraph( + padding: PaddingValues, + // navigate 이벤트 +) { + composable { + SearchMenuScreen() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_navigation_bar_folder.xml b/app/src/main/res/drawable/ic_navigation_bar_folder.xml new file mode 100644 index 00000000..17b52515 --- /dev/null +++ b/app/src/main/res/drawable/ic_navigation_bar_folder.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_navigation_bar_folder_selected.xml b/app/src/main/res/drawable/ic_navigation_bar_folder_selected.xml new file mode 100644 index 00000000..454e670c --- /dev/null +++ b/app/src/main/res/drawable/ic_navigation_bar_folder_selected.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_navigation_bar_home.xml b/app/src/main/res/drawable/ic_navigation_bar_home.xml new file mode 100644 index 00000000..f48c5ec2 --- /dev/null +++ b/app/src/main/res/drawable/ic_navigation_bar_home.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_navigation_bar_home_selected.xml b/app/src/main/res/drawable/ic_navigation_bar_home_selected.xml new file mode 100644 index 00000000..fea6e40b --- /dev/null +++ b/app/src/main/res/drawable/ic_navigation_bar_home_selected.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_navigation_bar_map.xml b/app/src/main/res/drawable/ic_navigation_bar_map.xml new file mode 100644 index 00000000..7696d134 --- /dev/null +++ b/app/src/main/res/drawable/ic_navigation_bar_map.xml @@ -0,0 +1,17 @@ + + + + diff --git a/app/src/main/res/drawable/ic_navigation_bar_map_selected.xml b/app/src/main/res/drawable/ic_navigation_bar_map_selected.xml new file mode 100644 index 00000000..0888be05 --- /dev/null +++ b/app/src/main/res/drawable/ic_navigation_bar_map_selected.xml @@ -0,0 +1,17 @@ + + + + diff --git a/app/src/main/res/drawable/ic_navigation_bar_my.xml b/app/src/main/res/drawable/ic_navigation_bar_my.xml new file mode 100644 index 00000000..6ca51b24 --- /dev/null +++ b/app/src/main/res/drawable/ic_navigation_bar_my.xml @@ -0,0 +1,17 @@ + + + + diff --git a/app/src/main/res/drawable/ic_navigation_bar_my_selected.xml b/app/src/main/res/drawable/ic_navigation_bar_my_selected.xml new file mode 100644 index 00000000..ad1d5412 --- /dev/null +++ b/app/src/main/res/drawable/ic_navigation_bar_my_selected.xml @@ -0,0 +1,17 @@ + + + + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f75840ea..73b0ce55 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,6 +9,7 @@ coreKtx = "1.10.1" junit = "4.13.2" junitVersion = "1.1.5" espressoCore = "3.5.1" +kotlinxCollectionsImmutable = "0.3.5" kotlinxSerializationJson = "1.6.0" lifecycleRuntimeKtx = "2.6.1" activityCompose = "1.8.0" @@ -44,6 +45,7 @@ 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" } +kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinxCollectionsImmutable" } 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" }