@@ -13,6 +13,7 @@ import androidx.navigation.NavBackStackEntry
1313import androidx.navigation.compose.NavHost
1414import androidx.navigation.compose.composable
1515import androidx.navigation.compose.rememberNavController
16+ import androidx.navigation.toRoute
1617import models.Wonder
1718import models.parse
1819import ui.screens.ArtifactDetailsScreen
@@ -39,26 +40,24 @@ fun App() {
3940
4041 NavHost (
4142 navController = navigator,
42- startDestination = " /home " ,
43+ startDestination = AppRoute . Home ,
4344 enterTransition = { DefaultEnterTransition },
4445 exitTransition = { DefaultExitTransition },
4546 popEnterTransition = { DefaultPopEnterTransition },
4647 popExitTransition = { DefaultPopExitTransition },
4748 ) {
48- composable(
49- " /home" ,
50- ) { backStackEntry ->
49+ composable<AppRoute .Home > { backStackEntry ->
5150 // Temporary fix as current Wonder is not being remembered when in backstack
5251 val savedStateHandle = backStackEntry.savedStateHandle
5352 val currentWonderName = savedStateHandle.get<String >(" currentWonder" )
5453 val currentWonder = Wonder .parse(currentWonderName)
5554 HomeScreen (
5655 initialWonder = currentWonder,
5756 openDetailScreen = {
58- navigator.navigate(" /home/wonder/ ${ it.name} " )
57+ navigator.navigate(AppRoute . Wonder ( it.name) )
5958 },
6059 openTimelineScreen = {
61- navigator.navigate(" /timeline?type= ${ it.name} " )
60+ navigator.navigate(AppRoute . Timeline ( it.name) )
6261 },
6362 animatedVisibilityScope = this ,
6463 sharedTransitionScope = this @SharedTransitionLayout,
@@ -69,49 +68,42 @@ fun App() {
6968
7069 }
7170
72- composable(
73- " /home/wonder/{type}" ,
74- ) { backStackEntry ->
75- val id = backStackEntry.arguments?.getString(" type" )
76- val wonder = Wonder .parse(id)
71+ composable<AppRoute .Wonder > { backStackEntry ->
72+ val route = backStackEntry.toRoute<AppRoute .Wonder >()
73+ val wonder = Wonder .parse(route.wonderId)
7774 WonderDetailsScreen (
7875 wonder = wonder,
7976 onPressHome = { navigator.popBackStack() },
80- openTimelineScreen = { navigator.navigate(" /timeline?type= ${ it?.name} " ) },
81- openArtifactDetailsScreen = { navigator.navigate(" /artifact/ ${it} " ) },
82- openArtifactListScreen = { navigator.navigate(" /search/ ${ it.name} " ) },
83- openMapScreen = { navigator.navigate(" /maps/ ${ it.name} " ) },
84- openVideoScreen = { navigator.navigate(" /video/ $it " ) },
77+ openTimelineScreen = { navigator.navigate(AppRoute . Timeline ( it?.name) ) },
78+ openArtifactDetailsScreen = { navigator.navigate(AppRoute . ArtifactDetails (it) ) },
79+ openArtifactListScreen = { navigator.navigate(AppRoute . Search ( it.name) ) },
80+ openMapScreen = { navigator.navigate(AppRoute . Maps ( it.name) ) },
81+ openVideoScreen = { navigator.navigate(AppRoute . Video (it) ) },
8582 animatedVisibilityScope = this ,
8683 sharedTransitionScope = this @SharedTransitionLayout,
8784 )
8885 }
89- composable(
90- " /timeline" ,
91- ) { backStackEntry ->
92- val id = backStackEntry.arguments?.getString(" type" )
93- val wonder = Wonder .parse(id)
86+
87+ composable<AppRoute .Timeline > { backStackEntry ->
88+ val route = backStackEntry.toRoute<AppRoute .Timeline >()
89+ val wonder = Wonder .parse(route.wonderId)
9490 TimelineScreen (
9591 selectedWonder = wonder,
9692 onClickBack = { navigator.popBackStack() },
9793 )
9894 }
9995
100- composable(
101- " /artifact/{id}" ,
102- ) { backStackEntry ->
103- val id = backStackEntry.arguments?.getString(" id" )!!
96+ composable<AppRoute .ArtifactDetails > { backStackEntry ->
97+ val route = backStackEntry.toRoute<AppRoute .ArtifactDetails >()
10498 ArtifactDetailsScreen (
105- artifactId = id ,
99+ artifactId = route.artifactId ,
106100 onClickBack = { navigator.popBackStack() },
107101 )
108102 }
109103
110- composable(
111- " /search/{type}" ,
112- ) { backStackEntry ->
113- val id = backStackEntry.arguments?.getString(" type" )
114- val wonder = Wonder .parse(id)
104+ composable<AppRoute .Search > { backStackEntry ->
105+ val route = backStackEntry.toRoute<AppRoute .Search >()
106+ val wonder = Wonder .parse(route.wonderId)
115107 val viewModel = viewModel { ArtifactListViewModel (wonder) }
116108 ArtifactListScreen (
117109 wonder = wonder,
@@ -120,28 +112,24 @@ fun App() {
120112 onQueryChange = viewModel::onQueryChange,
121113 suggestions = viewModel.suggestions.collectAsStateWithLifecycle().value,
122114 filteredArtifacts = viewModel.filteredArtifacts.collectAsStateWithLifecycle().value,
123- onClickArtifact = { navigator.navigate(" /artifact/ ${it} " ) },
115+ onClickArtifact = { navigator.navigate(AppRoute . ArtifactDetails ( " $it " ) ) },
124116 onBackClick = { navigator.navigateUp() },
125117 )
126118 }
127119
128- composable(
129- " /maps/{type}" ,
130- ) { backStackEntry ->
131- val id = backStackEntry.arguments?.getString(" type" )
132- val wonder = Wonder .parse(id)
120+ composable<AppRoute .Maps > { backStackEntry ->
121+ val route = backStackEntry.toRoute<AppRoute .Maps >()
122+ val wonder = Wonder .parse(route.wonderId)
133123 MapScreen (
134124 latLng = wonder.latLng,
135125 onBackClick = { navigator.popBackStack() }
136126 )
137127 }
138128
139- composable(
140- " /video/{id}" ,
141- ) { backStackEntry ->
142- val id = backStackEntry.arguments?.getString(" id" )!!
129+ composable<AppRoute .Video > { backStackEntry ->
130+ val route = backStackEntry.toRoute<AppRoute .Video >()
143131 YoutubeVideoScreen (
144- id = id ,
132+ id = route.videoId ,
145133 onBackClick = { navigator.popBackStack() }
146134 )
147135 }
0 commit comments