From c45d73304fc750c63f7686ca2807cddeac56f416 Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Thu, 4 Apr 2024 01:34:56 +0900 Subject: [PATCH] [feat] #1 main-navigator --- .../org/sopt/main/navigator/MainActivity.kt | 43 +++++++++++++++ .../org/sopt/main/navigator/MainNavigator.kt | 52 +++++++++++++++++++ .../org/sopt/main/navigator/MainScreen.kt | 47 +++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 feature/main/src/main/java/org/sopt/main/navigator/MainActivity.kt create mode 100644 feature/main/src/main/java/org/sopt/main/navigator/MainNavigator.kt create mode 100644 feature/main/src/main/java/org/sopt/main/navigator/MainScreen.kt diff --git a/feature/main/src/main/java/org/sopt/main/navigator/MainActivity.kt b/feature/main/src/main/java/org/sopt/main/navigator/MainActivity.kt new file mode 100644 index 0000000..c87e507 --- /dev/null +++ b/feature/main/src/main/java/org/sopt/main/navigator/MainActivity.kt @@ -0,0 +1,43 @@ +package org.sopt.main.navigator + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import dagger.hilt.android.AndroidEntryPoint +import org.sopt.designsystem.ui.theme.NOWSOPTAndroidTheme + +@AndroidEntryPoint +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + NOWSOPTAndroidTheme { + // A surface container using the 'background' color from the theme + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + MainScreen( + modifier = Modifier + .fillMaxSize() + ) + } + } + } + } +} + +@Preview(showBackground = true) +@Composable +fun GreetingPreview() { + NOWSOPTAndroidTheme { + MainScreen() + } +} \ No newline at end of file diff --git a/feature/main/src/main/java/org/sopt/main/navigator/MainNavigator.kt b/feature/main/src/main/java/org/sopt/main/navigator/MainNavigator.kt new file mode 100644 index 0000000..4322f5b --- /dev/null +++ b/feature/main/src/main/java/org/sopt/main/navigator/MainNavigator.kt @@ -0,0 +1,52 @@ +package org.sopt.main.navigator + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.navigation.NavDestination +import androidx.navigation.NavHostController +import androidx.navigation.NavOptions +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import org.sopt.main.home.navigation.navigateHome +import org.sopt.main.login.navigation.LoginRoute +import org.sopt.main.login.navigation.navigateLogin +import org.sopt.main.model.User +import org.sopt.main.signup.navigation.navigateSignup + +class MainNavigator( + val navController: NavHostController +) { + private val currentDestination: NavDestination? + @Composable get() = navController + .currentBackStackEntryAsState().value?.destination + + val startDestination = LoginRoute.route + + fun navigateLogin(user: User) { + navController.navigateLogin(user) + } + + fun navigateSignup() { + navController.navigateSignup() + } + + fun navigateHome(user: User) { + navController.navigateHome(user) + } + + fun popBackStackIfNotHome() { + if (!isSameCurrentDestination(LoginRoute.route)) { + navController.popBackStack() + } + } + + private fun isSameCurrentDestination(route: String) = + navController.currentDestination?.route == route +} + +@Composable +fun rememberMainNavigator( + navController: NavHostController = rememberNavController(), +): MainNavigator = remember(navController) { + MainNavigator(navController) +} \ No newline at end of file diff --git a/feature/main/src/main/java/org/sopt/main/navigator/MainScreen.kt b/feature/main/src/main/java/org/sopt/main/navigator/MainScreen.kt new file mode 100644 index 0000000..3c43580 --- /dev/null +++ b/feature/main/src/main/java/org/sopt/main/navigator/MainScreen.kt @@ -0,0 +1,47 @@ +package org.sopt.main.navigator + +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.rememberNavController +import org.sopt.main.home.navigation.homeNavGraph +import org.sopt.main.login.navigation.loginNavGraph +import org.sopt.main.signup.navigation.signupNavGraph + +@Composable +fun MainScreen( + modifier: Modifier = Modifier, + navigator: MainNavigator = rememberMainNavigator(), +) { + val context = LocalContext.current + + Scaffold( + modifier = modifier, + content = { it -> + val padding = it + NavHost( + navController = navigator.navController, + startDestination = navigator.startDestination, + ) { + loginNavGraph( + navController = navigator.navController, + popBackStack = navigator::popBackStackIfNotHome, + navigateSignup = navigator::navigateSignup, + navigateHome = navigator::navigateHome + ) + + signupNavGraph( + popBackStack = navigator::popBackStackIfNotHome, + navigateLogin = navigator::navigateLogin + ) + + homeNavGraph( + navController = navigator.navController, + popBackStack = navigator::popBackStackIfNotHome, + ) + } + } + ) +} \ No newline at end of file