@@ -7,34 +7,23 @@ import androidx.compose.animation.core.rememberInfiniteTransition
77import androidx.compose.foundation.layout.Box
88import androidx.compose.foundation.layout.fillMaxSize
99import androidx.compose.foundation.layout.padding
10- import androidx.compose.material3.Icon
11- import androidx.compose.material3.NavigationBar
12- import androidx.compose.material3.NavigationBarItem
1310import androidx.compose.material3.Scaffold
14- import androidx.compose.material3.Text
1511import androidx.compose.runtime.Composable
1612import androidx.compose.runtime.CompositionLocalProvider
1713import androidx.compose.runtime.LaunchedEffect
1814import androidx.compose.ui.Modifier
19- import androidx.compose.ui.graphics.Color
20- import androidx.compose.ui.res.painterResource
2115import androidx.hilt.navigation.compose.hiltViewModel
2216import androidx.navigation.NavBackStackEntry
23- import androidx.navigation.compose.NavHost
24- import androidx.navigation.compose.composable
2517import androidx.navigation.compose.currentBackStackEntryAsState
2618import androidx.navigation.compose.rememberNavController
2719import androidx.navigation.toRoute
2820import com.cornellappdev.score.R
29- import com.cornellappdev.score.nav.root.ScoreRootScreens.Home.toScreen
30- import com.cornellappdev.score.screen.GameDetailsScreen
31- import com.cornellappdev.score.screen.HomeScreen
32- import com.cornellappdev.score.screen.PastGamesScreen
33- import com.cornellappdev.score.theme.CrimsonPrimary
34- import com.cornellappdev.score.theme.GrayPrimary
21+ import com.cornellappdev.score.nav.ScoreNavHost
22+ import com.cornellappdev.score.nav.ScoreNavigationBar
23+ import com.cornellappdev.score.nav.root.ScoreScreens.GameDetailsPage
24+ import com.cornellappdev.score.nav.root.ScoreScreens.Home
25+ import com.cornellappdev.score.nav.root.ScoreScreens.ScoresScreen
3526import com.cornellappdev.score.theme.LocalInfiniteLoading
36- import com.cornellappdev.score.theme.Style.bodyMedium
37- import com.cornellappdev.score.theme.White
3827import kotlinx.serialization.Serializable
3928
4029@Composable
@@ -67,93 +56,46 @@ fun RootNavigation(
6756 }
6857 }
6958
59+
7060 Scaffold (modifier = Modifier .fillMaxSize(), bottomBar = {
71- if (navBackStackEntry?.toScreen() is ScoreRootScreens . GameDetailsPage ) {
61+ if (navBackStackEntry?.toScreen() is GameDetailsPage ) {
7262 return @Scaffold
7363 }
74- NavigationBar (containerColor = White ) {
75- tabs.map { item ->
76- val isSelected = item.screen == navBackStackEntry?.toScreen()
77-
78- NavigationBarItem (
79- selected = isSelected,
80- onClick = { navController.navigate(item.screen) },
81- icon = {
82- Icon (
83- painter = painterResource(id = if (isSelected) item.selectedIcon else item.unselectedIcon),
84- contentDescription = null ,
85- tint = Color .Unspecified
86- )
87- },
88- label = {
89- Text (
90- text = item.label,
91- style = bodyMedium,
92- color = if (isSelected) {
93- CrimsonPrimary
94- } else {
95- GrayPrimary
96- }
97- )
98- }
99- )
100- }
101- }
64+ ScoreNavigationBar ({ navController.navigate(it) }, navBackStackEntry)
10265 }
10366 ) { innerPadding ->
10467 Box (modifier = Modifier .padding(innerPadding)) {
10568 CompositionLocalProvider (LocalInfiniteLoading provides animatedValue) {
106- NavHost (
107- navController = navController,
108- startDestination = ScoreRootScreens .Home
109- ) {
110- composable<ScoreRootScreens .Home > {
111- HomeScreen (navigateToGameDetails = {
112- navController.navigate(ScoreRootScreens .GameDetailsPage (it))
113- })
114- }
115-
116- composable<ScoreRootScreens .GameDetailsPage > {
117- GameDetailsScreen (onBackArrow = {
118- navController.navigateUp()
119- })
12069
121- }
122-
123- composable<ScoreRootScreens .ScoresScreen > {
124- PastGamesScreen (navigateToGameDetails = {
125- navController.navigate(ScoreRootScreens .GameDetailsPage (it))
126- })
127- }
128- }
70+ ScoreNavHost (navController)
12971 }
13072 }
13173 }
13274}
13375
13476
13577@Serializable
136- sealed class ScoreRootScreens {
78+ sealed class ScoreScreens {
13779 @Serializable
138- data object Home : ScoreRootScreens ()
80+ data object Home : ScoreScreens ()
13981
14082 @Serializable
141- data class GameDetailsPage (val gameId : String ) : ScoreRootScreens ()
83+ data class GameDetailsPage (val gameId : String ) : ScoreScreens ()
14284
14385 @Serializable
144- data object ScoresScreen : ScoreRootScreens ()
145-
146- fun NavBackStackEntry.toScreen (): ScoreRootScreens ? =
147- when (destination.route?.substringAfterLast(" ." )?.substringBefore(" /" )) {
148- " Home" -> toRoute<Home >()
149- " GameDetailsPage" -> toRoute<GameDetailsPage >()
150- " ScoresScreen" -> toRoute<ScoresScreen >()
151- else -> throw IllegalArgumentException (" Invalid screen" )
152- }
86+ data object ScoresScreen : ScoreScreens ()
15387}
15488
89+ fun NavBackStackEntry.toScreen (): ScoreScreens ? =
90+ when (destination.route?.substringAfterLast(" ." )?.substringBefore(" /" )) {
91+ " Home" -> toRoute<Home >()
92+ " GameDetailsPage" -> toRoute<GameDetailsPage >()
93+ " ScoresScreen" -> toRoute<ScoresScreen >()
94+ else -> throw IllegalArgumentException (" Invalid screen" )
95+ }
96+
15597data class NavItem (
156- val screen : ScoreRootScreens ,
98+ val screen : ScoreScreens ,
15799 val label : String ,
158100 val unselectedIcon : Int ,
159101 val selectedIcon : Int
@@ -164,12 +106,12 @@ val tabs = listOf(
164106 label = " Schedule" ,
165107 unselectedIcon = R .drawable.ic_schedule,
166108 selectedIcon = R .drawable.ic_schedule_filled,
167- screen = ScoreRootScreens .Home ,
109+ screen = ScoreScreens .Home ,
168110 ),
169111 NavItem (
170112 label = " Scores" ,
171113 unselectedIcon = R .drawable.ic_scores,
172114 selectedIcon = R .drawable.ic_scores_filled,
173- screen = ScoreRootScreens .ScoresScreen ,
115+ screen = ScoreScreens .ScoresScreen ,
174116 ),
175117)
0 commit comments