@@ -21,25 +21,36 @@ package com.wire.android.navigation
2121import androidx.compose.animation.ExperimentalAnimationApi
2222import androidx.compose.runtime.Composable
2323import androidx.compose.runtime.remember
24+ import androidx.compose.ui.Alignment
2425import androidx.compose.ui.Modifier
2526import androidx.hilt.navigation.compose.hiltViewModel
2627import com.ramcosta.composedestinations.DestinationsNavHost
27- import com.ramcosta.composedestinations.animations.rememberAnimatedNavHostEngine
28+ import com.ramcosta.composedestinations.generated.app.destinations.ConversationScreenDestination
29+ import com.ramcosta.composedestinations.generated.app.destinations.LoginScreenDestination
30+ import com.ramcosta.composedestinations.generated.app.destinations.NewLoginPasswordScreenDestination
31+ import com.ramcosta.composedestinations.generated.app.destinations.NewLoginScreenDestination
32+ import com.ramcosta.composedestinations.generated.app.destinations.NewLoginVerificationCodeScreenDestination
33+ import com.ramcosta.composedestinations.generated.app.navgraphs.LoginGraph
34+ import com.ramcosta.composedestinations.generated.app.navgraphs.NewConversationGraph
35+ import com.ramcosta.composedestinations.generated.app.navgraphs.NewLoginGraph
36+ import com.ramcosta.composedestinations.generated.app.navgraphs.PersonalToTeamMigrationGraph
37+ import com.ramcosta.composedestinations.generated.app.navgraphs.WireRootGraph
38+ import com.ramcosta.composedestinations.generated.app.navtype.groupConversationDetailsNavBackArgsNavType
39+ import com.ramcosta.composedestinations.generated.app.navtype.imagesPreviewNavBackArgsNavType
40+ import com.ramcosta.composedestinations.generated.app.navtype.mediaGalleryNavBackArgsNavType
41+ import com.ramcosta.composedestinations.generated.sketch.destinations.DrawingCanvasScreenDestination
42+ import com.ramcosta.composedestinations.generated.sketch.navtype.drawingCanvasNavBackArgsNavType
2843import com.ramcosta.composedestinations.manualcomposablecalls.composable
2944import com.ramcosta.composedestinations.navigation.dependency
45+ import com.ramcosta.composedestinations.navigation.destination
46+ import com.ramcosta.composedestinations.navigation.navGraph
3047import com.ramcosta.composedestinations.scope.resultBackNavigator
3148import com.ramcosta.composedestinations.scope.resultRecipient
32- import com.ramcosta.composedestinations.spec.Route
33- import com.wire.android.feature.sketch.destinations.DrawingCanvasScreenDestination
49+ import com.ramcosta.composedestinations.spec.Direction
3450import com.wire.android.feature.sketch.model.DrawingCanvasNavBackArgs
35- import com.wire.android.navigation.style.DefaultNestedNavGraphAnimations
36- import com.wire.android.navigation.style.DefaultRootNavGraphAnimations
37- import com.wire.android.ui.NavGraphs
3851import com.wire.android.ui.authentication.login.email.LoginEmailViewModel
52+ import com.wire.android.ui.authentication.login.sso.SSOUrlConfigHolder
3953import com.wire.android.ui.authentication.login.sso.SSOUrlConfigHolderImpl
40- import com.wire.android.ui.destinations.ConversationScreenDestination
41- import com.wire.android.ui.destinations.NewLoginPasswordScreenDestination
42- import com.wire.android.ui.destinations.NewLoginVerificationCodeScreenDestination
4354import com.wire.android.ui.home.conversations.ConversationScreen
4455import com.wire.android.ui.home.newconversation.NewConversationViewModel
4556import com.wire.android.ui.userprofile.teammigration.TeamMigrationViewModel
@@ -49,88 +60,100 @@ import com.wire.android.ui.userprofile.teammigration.TeamMigrationViewModel
4960fun MainNavHost (
5061 navigator : Navigator ,
5162 loginTypeSelector : LoginTypeSelector ? ,
52- startDestination : Route ,
63+ startDestination : Direction ,
5364 modifier : Modifier = Modifier ,
5465) {
55- val navHostEngine = rememberAnimatedNavHostEngine(
56- rootDefaultAnimations = DefaultRootNavGraphAnimations ,
57- defaultAnimationsForNestedNavGraph = mapOf (
58- NavGraphs .createPersonalAccount to DefaultNestedNavGraphAnimations ,
59- NavGraphs .createTeamAccount to DefaultNestedNavGraphAnimations ,
60- NavGraphs .newConversation to DefaultNestedNavGraphAnimations ,
61- )
62- )
63-
64- AdjustDestinationStylesForTablets ()
66+ val navHostEngine = rememberWireNavHostEngine(Alignment .Center )
6567 DestinationsNavHost (
6668 modifier = modifier,
67- navGraph = WireMainNavGraph ,
69+ navGraph = WireRootGraph ,
70+ defaultTransitions = WireRootGraph .defaultTransitions,
6871 engine = navHostEngine,
69- startRoute = startDestination,
72+ start = startDestination,
7073 navController = navigator.navController,
7174 dependenciesContainerBuilder = {
7275 // 👇 To make Navigator available to all destinations as a non-navigation parameter
7376 dependency(navigator)
7477
78+ // Always provide a default SSO holder at root scope so destinations can resolve it
79+ // even when navigated directly without going through the expected nested graph route.
80+ val rootEntry = remember(navBackStackEntry) {
81+ navController.getBackStackEntry(WireRootGraph .route)
82+ }
83+ val rootSSOHolder: SSOUrlConfigHolder = SSOUrlConfigHolderImpl (rootEntry.savedStateHandle)
84+ dependency(rootSSOHolder)
85+
7586 // 👇 To make LoginTypeSelector available to all destinations as a non-navigation parameter if provided
7687 if (loginTypeSelector != null ) dependency(loginTypeSelector)
7788
7889 // 👇 To tie NewConversationViewModel to nested NewConversationNavGraph, making it shared between all screens that belong to it
79- dependency( NavGraphs .newConversation ) {
90+ navGraph( NewConversationGraph ) {
8091 val parentEntry = remember(navBackStackEntry) {
81- navController.getBackStackEntry(NavGraphs .newConversation .route)
92+ navController.getBackStackEntry(NewConversationGraph .route)
8293 }
8394 hiltViewModel<NewConversationViewModel >(parentEntry)
8495 }
8596
8697 // 👇 To reuse LoginEmailViewModel from NewLoginPasswordScreen on NewLoginVerificationCodeScreen
87- dependency (NewLoginVerificationCodeScreenDestination ) {
98+ destination (NewLoginVerificationCodeScreenDestination ) {
8899 val loginPasswordEntry = remember(navBackStackEntry) {
89100 navController.getBackStackEntry(NewLoginPasswordScreenDestination .route)
90101 }
91102 hiltViewModel<LoginEmailViewModel >(loginPasswordEntry)
92103 }
93104
94105 // 👇 To tie SSOUrlConfigHolder to nested LoginNavGraph, making it shared between all screens that belong to it
95- dependency( NavGraphs .login ) {
106+ navGraph( LoginGraph ) {
96107 val parentEntry = remember(navBackStackEntry) {
97- navController.getBackStackEntry(NavGraphs .login .route)
108+ navController.getBackStackEntry(LoginGraph .route)
98109 }
99- SSOUrlConfigHolderImpl (parentEntry.savedStateHandle)
110+ val holder: SSOUrlConfigHolder = SSOUrlConfigHolderImpl (parentEntry.savedStateHandle)
111+ dependency(holder)
100112 }
101113
102114 // 👇 To tie SSOUrlConfigHolder to nested NewLoginNavGraph, making it shared between all screens that belong to it
103- dependency( NavGraphs .newLogin ) {
115+ navGraph( NewLoginGraph ) {
104116 val parentEntry = remember(navBackStackEntry) {
105- navController.getBackStackEntry(NavGraphs .newLogin .route)
117+ navController.getBackStackEntry(NewLoginGraph .route)
106118 }
107- SSOUrlConfigHolderImpl (parentEntry.savedStateHandle)
119+ val holder: SSOUrlConfigHolder = SSOUrlConfigHolderImpl (parentEntry.savedStateHandle)
120+ dependency(holder)
121+ }
122+
123+ // Some flows navigate directly to screen destinations instead of the nav graph route.
124+ // Provide the dependency at destination scope as a safe fallback.
125+ destination(LoginScreenDestination ) {
126+ val holder: SSOUrlConfigHolder = SSOUrlConfigHolderImpl (navBackStackEntry.savedStateHandle)
127+ dependency(holder)
128+ }
129+ destination(NewLoginScreenDestination ) {
130+ val holder: SSOUrlConfigHolder = SSOUrlConfigHolderImpl (navBackStackEntry.savedStateHandle)
131+ dependency(holder)
108132 }
109133
110134 // 👇 To tie TeamMigrationViewModel to PersonalToTeamMigrationNavGraph, making it shared between all screens that belong to it
111- dependency( NavGraphs .personalToTeamMigration ) {
135+ navGraph( PersonalToTeamMigrationGraph ) {
112136 val parentEntry = remember(navBackStackEntry) {
113- navController.getBackStackEntry(NavGraphs .personalToTeamMigration .route)
137+ navController.getBackStackEntry(PersonalToTeamMigrationGraph .route)
114138 }
115139 hiltViewModel<TeamMigrationViewModel >(parentEntry)
116140 }
117141 },
118142 manualComposableCallsBuilder = {
119143 /* *
120- * In compose-destinations v1 it's not possible for code generation to use destination generated in another module,
121- * that's why it's necessary to use "open" approach and manually call the composable function for the destination.
122- * In v2 this will be possible, so that we will be able to use regular `ResultRecipient` instead of `OpenResultRecipient`
123- * and provide it directly inside the destination's composable without the need to passing it manually.
124- * https://github.com/raamcosta/compose-destinations/issues/508#issuecomment-1883166574
144+ * Keep manual composable calls for cross-module result wiring until we refactor
145+ * those destinations to rely on generated dependencies directly.
125146 */
126147 composable(ConversationScreenDestination ) {
127148 ConversationScreen (
128149 navigator = navigator,
129- groupDetailsScreenResultRecipient = resultRecipient(),
130- mediaGalleryScreenResultRecipient = resultRecipient(),
131- imagePreviewScreenResultRecipient = resultRecipient(),
132- drawingCanvasScreenResultRecipient = resultRecipient<DrawingCanvasScreenDestination , DrawingCanvasNavBackArgs >(),
133- resultNavigator = resultBackNavigator(),
150+ groupDetailsScreenResultRecipient = resultRecipient(groupConversationDetailsNavBackArgsNavType),
151+ mediaGalleryScreenResultRecipient = resultRecipient(mediaGalleryNavBackArgsNavType),
152+ imagePreviewScreenResultRecipient = resultRecipient(imagesPreviewNavBackArgsNavType),
153+ drawingCanvasScreenResultRecipient = resultRecipient<DrawingCanvasScreenDestination , DrawingCanvasNavBackArgs >(
154+ drawingCanvasNavBackArgsNavType
155+ ),
156+ resultNavigator = resultBackNavigator(groupConversationDetailsNavBackArgsNavType),
134157 )
135158 }
136159 }
0 commit comments