fun RouteBuilder.featureNavGraph(
featureRoute: String,
initialSceneRoute: String,
routeBuilder: RouteBuilder.() -> Unit,
) {
group(
route = featureRoute,
initialRoute = initialSceneRoute,
) {
routeBuilder() // routes specific to feature.
}
}
@Composable
fun AppNavigation(navigator: Navigator) {
val koin = getKoin()
val userAuthViewModel = koin.get<UserAuthViewModel>()
val viewModel: DashboardViewModel = koinInject()
val deepLinkStateManager: DeepLinkStateManager = koinInject()
//Observe deeplink state and navigate accordingly.
val deepLinkState by deepLinkStateManager.deepLinkInfo.collectAsState()
deepLinkState?.route?.let {
navigator.navigate(route = it)
}
NavHost(
navigator = navigator,
initialRoute = OnboardingRoutes.ROOT.route,
) {
featureNavGraph(
featureRoute = OnboardingRoutes.ROOT.route,
initialSceneRoute = OnboardingRoutes.LANDING.route,
) {
onboardingRoutes(navigator)
}
// User authentication navigation
featureNavGraph(
featureRoute = UserAuthRoutes.ROOT.route,
initialSceneRoute = UserAuthRoutes.LANDING.route,
) {
userAuthRoutes(navigator, userAuthViewModel)
}
// nested navigation graph, this should be used per module
featureNavGraph(
featureRoute = DashboardRoutes.DASHBOARD_ROOT.route,
initialSceneRoute = DashboardRoutes.DASHBOARD_LAUNCHER.route,
) {
dashboardRoutes(navigator,viewModel)
}
// nested navigation graph, this should be used per module
featureNavGraph(
featureRoute = ReelsRoutes.ROOT.route,
initialSceneRoute = ReelsRoutes.REELS_LIST.route
.plus("/{${ReelRoutesParams.DISCOVER_CATEGORY_ID.param}}?")
.plus("/{${ReelRoutesParams.SELECTED_REEL_INDEX.param}}?")
.plus("/{${ReelRoutesParams.INITIAL_REELS_IDS.param}}?")
.plus("/{${ReelRoutesParams.ENC_FEED_POST_ID.param}}?")
) {
reelsRoutes(navigator)
}
}
}