Skip to content

Commit faea8a4

Browse files
committed
Refactor: Home 레이어 Type-safe navigation 적용
1 parent 9d266a9 commit faea8a4

File tree

4 files changed

+62
-52
lines changed

4 files changed

+62
-52
lines changed

app/src/main/java/com/threegap/bitnagil/navigation/home/HomeBottomNavigationBar.kt

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,16 @@ import androidx.compose.ui.Alignment
2020
import androidx.compose.ui.Modifier
2121
import androidx.compose.ui.tooling.preview.Preview
2222
import androidx.compose.ui.unit.dp
23-
import androidx.navigation.NavController
24-
import androidx.navigation.compose.currentBackStackEntryAsState
2523
import com.threegap.bitnagil.designsystem.BitnagilTheme
2624
import com.threegap.bitnagil.designsystem.component.atom.BitnagilIcon
2725

2826
@Composable
2927
fun HomeBottomNavigationBar(
30-
navController: NavController,
28+
selectedTab: HomeRoute,
29+
onTabSelected: (HomeRoute) -> Unit,
30+
modifier: Modifier = Modifier,
3131
) {
32-
val navBackStackEntry by navController.currentBackStackEntryAsState()
33-
val currentRoute = navBackStackEntry?.destination?.route
34-
35-
Column {
32+
Column(modifier = modifier) {
3633
HorizontalDivider(
3734
modifier = Modifier.fillMaxWidth(),
3835
thickness = 1.dp,
@@ -47,19 +44,13 @@ fun HomeBottomNavigationBar(
4744
horizontalArrangement = Arrangement.spacedBy(10.dp),
4845
verticalAlignment = Alignment.CenterVertically,
4946
) {
50-
HomeRoute.entries.map { homeRoute ->
47+
homeTabList.forEach { homeTab ->
5148
HomeBottomNavigationItem(
5249
modifier = Modifier.weight(1f),
53-
icon = homeRoute.icon,
54-
title = homeRoute.title,
55-
onClick = {
56-
if (currentRoute != homeRoute.route) {
57-
navController.navigate(homeRoute.route) {
58-
popUpTo(0) { inclusive = true }
59-
}
60-
}
61-
},
62-
selected = currentRoute == homeRoute.route,
50+
icon = homeTab.icon,
51+
title = homeTab.title,
52+
selected = selectedTab == homeTab.route,
53+
onClick = { onTabSelected(homeTab.route) },
6354
)
6455
}
6556
}
@@ -71,8 +62,8 @@ private fun HomeBottomNavigationItem(
7162
modifier: Modifier = Modifier,
7263
icon: Int,
7364
title: String,
74-
onClick: () -> Unit,
7565
selected: Boolean,
66+
onClick: () -> Unit,
7667
) {
7768
val interactionSource = remember { MutableInteractionSource() }
7869
val isPressed by interactionSource.collectIsPressedAsState()
@@ -111,9 +102,8 @@ private fun HomeBottomNavigationItem(
111102
@Composable
112103
@Preview
113104
private fun HomeBottomNavigationBarPreview() {
114-
val navigator = rememberHomeNavigator()
115-
116105
HomeBottomNavigationBar(
117-
navController = navigator.navController,
106+
selectedTab = HomeRoute.Home,
107+
onTabSelected = {},
118108
)
119109
}

app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,16 @@ fun HomeNavHost(
6060
activity?.setStatusBarContentColor(isLightContent = isHomeTab)
6161
}
6262

63+
val selectedBottomTab = navigator.currentHomeRoute ?: navigator.startDestination
64+
6365
Box(modifier = modifier.fillMaxSize()) {
6466
Scaffold(
6567
modifier = Modifier.fillMaxSize(),
6668
bottomBar = {
67-
HomeBottomNavigationBar(navController = navigator.navController)
69+
HomeBottomNavigationBar(
70+
selectedTab = selectedBottomTab,
71+
onTabSelected = navigator::navigateTo,
72+
)
6873
},
6974
contentWindowInsets = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp),
7075
content = { innerPadding ->
@@ -73,7 +78,7 @@ fun HomeNavHost(
7378
startDestination = navigator.startDestination,
7479
modifier = modifier.padding(innerPadding),
7580
) {
76-
composable(HomeRoute.Home.route) {
81+
composable<HomeRoute.Home> {
7782
HomeScreenContainer(
7883
navigateToGuide = navigateToGuide,
7984
navigateToRegisterRoutine = {
@@ -86,14 +91,14 @@ fun HomeNavHost(
8691
)
8792
}
8893

89-
composable(HomeRoute.RecommendRoutine.route) {
94+
composable<HomeRoute.RecommendRoutine> {
9095
RecommendRoutineScreenContainer(
9196
navigateToEmotion = navigateToEmotion,
9297
navigateToRegisterRoutine = navigateToRegisterRoutine,
9398
)
9499
}
95100

96-
composable(HomeRoute.MyPage.route) {
101+
composable<HomeRoute.MyPage> {
97102
MyPageScreenContainer(
98103
navigateToSetting = navigateToSetting,
99104
navigateToOnBoarding = navigateToOnBoarding,

app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavigator.kt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,39 @@ package com.threegap.bitnagil.navigation.home
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.remember
5+
import androidx.navigation.NavDestination.Companion.hasRoute
56
import androidx.navigation.NavHostController
67
import androidx.navigation.compose.currentBackStackEntryAsState
78
import androidx.navigation.compose.rememberNavController
89

910
class HomeNavigator(
1011
val navController: NavHostController,
1112
) {
12-
val startDestination = HomeRoute.Home.route
13+
val startDestination: HomeRoute = HomeRoute.Home
1314

14-
val currentRoute: String?
15-
@Composable get() = navController.currentBackStackEntryAsState().value?.destination?.route
15+
val currentHomeRoute: HomeRoute?
16+
@Composable get() {
17+
val destination = navController.currentBackStackEntryAsState().value?.destination
18+
return when {
19+
destination?.hasRoute(HomeRoute.Home::class) == true -> HomeRoute.Home
20+
destination?.hasRoute(HomeRoute.RecommendRoutine::class) == true -> HomeRoute.RecommendRoutine
21+
destination?.hasRoute(HomeRoute.MyPage::class) == true -> HomeRoute.MyPage
22+
else -> null
23+
}
24+
}
1625

1726
val isHomeRoute: Boolean
18-
@Composable get() = currentRoute == HomeRoute.Home.route
27+
@Composable get() = currentHomeRoute == HomeRoute.Home
1928

2029
@Composable
2130
fun shouldShowFloatingAction(): Boolean =
22-
currentRoute in setOf(HomeRoute.Home.route, HomeRoute.RecommendRoutine.route)
31+
currentHomeRoute == HomeRoute.Home || currentHomeRoute == HomeRoute.RecommendRoutine
32+
33+
fun navigateTo(route: HomeRoute) {
34+
navController.navigate(route) {
35+
popUpTo(0) { inclusive = true }
36+
}
37+
}
2338
}
2439

2540
@Composable
Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
package com.threegap.bitnagil.navigation.home
22

33
import com.threegap.bitnagil.R
4+
import kotlinx.serialization.Serializable
45

5-
enum class HomeRoute(
6-
val route: String,
7-
val title: String,
8-
val icon: Int,
9-
) {
10-
Home(
11-
route = "home/home",
12-
title = "",
13-
icon = R.drawable.ic_home,
14-
),
6+
@Serializable
7+
sealed interface HomeRoute {
8+
@Serializable
9+
data object Home : HomeRoute
1510

16-
RecommendRoutine(
17-
route = "home/recommend_routine",
18-
title = "추천 루틴",
19-
icon = R.drawable.ic_routine_recommend,
20-
),
11+
@Serializable
12+
data object RecommendRoutine : HomeRoute
2113

22-
MyPage(
23-
route = "home/my_page",
24-
title = "마이페이지",
25-
icon = R.drawable.ic_profile,
26-
),
27-
;
14+
@Serializable
15+
data object MyPage : HomeRoute
2816
}
17+
18+
data class HomeTab(
19+
val route: HomeRoute,
20+
val title: String,
21+
val icon: Int,
22+
)
23+
24+
val homeTabList = listOf(
25+
HomeTab(HomeRoute.Home, "", R.drawable.ic_home),
26+
HomeTab(HomeRoute.RecommendRoutine, "추천 루틴", R.drawable.ic_routine_recommend),
27+
HomeTab(HomeRoute.MyPage, "마이페이지", R.drawable.ic_profile),
28+
)

0 commit comments

Comments
 (0)