11package com.dergoogler.mmrl.wx.ui.screens
22
33import android.util.Log
4+ import androidx.compose.animation.AnimatedContentTransitionScope
5+ import androidx.compose.animation.EnterTransition
6+ import androidx.compose.animation.ExitTransition
7+ import androidx.compose.animation.core.tween
8+ import androidx.compose.animation.fadeIn
9+ import androidx.compose.animation.fadeOut
410import androidx.compose.foundation.layout.WindowInsets
511import androidx.compose.foundation.layout.imePadding
612import androidx.compose.foundation.layout.padding
@@ -15,7 +21,6 @@ import androidx.compose.material3.SnackbarHostState
1521import androidx.compose.material3.Text
1622import androidx.compose.runtime.Composable
1723import androidx.compose.runtime.LaunchedEffect
18- import androidx.compose.runtime.derivedStateOf
1924import androidx.compose.runtime.getValue
2025import androidx.compose.runtime.remember
2126import androidx.compose.ui.Modifier
@@ -24,20 +29,18 @@ import androidx.compose.ui.platform.LocalContext
2429import androidx.compose.ui.res.painterResource
2530import androidx.compose.ui.res.stringResource
2631import androidx.compose.ui.unit.dp
27- import androidx.navigation.NavDestination.Companion.hierarchy
28- import androidx.navigation.compose.NavHost
29- import androidx.navigation.compose.currentBackStackEntryAsState
30- import com.dergoogler.mmrl.datastore.model.WorkingMode.Companion.isRoot
32+ import androidx.navigation.NavBackStackEntry
3133import com.dergoogler.mmrl.ext.none
32- import com.dergoogler.mmrl.platform.PlatformManager
3334import com.dergoogler.mmrl.ui.providable.LocalNavController
3435import com.dergoogler.mmrl.wx.App.Companion.TAG
3536import com.dergoogler.mmrl.wx.datastore.providable.LocalUserPreferences
3637import com.dergoogler.mmrl.wx.service.PlatformService
37- import com.dergoogler.mmrl.wx.ui.navigation.MainRoute
38- import com.dergoogler.mmrl.wx.ui.navigation.graphs.modulesRoute
39- import com.dergoogler.mmrl.wx.ui.navigation.graphs.settingsRoute
40- import com.dergoogler.mmrl.wx.util.navigatePopUpTo
38+ import com.dergoogler.mmrl.wx.ui.navigation.MainDestination
39+ import com.dergoogler.mmrl.wx.ui.providable.LocalDestinationsNavigator
40+ import com.ramcosta.composedestinations.DestinationsNavHost
41+ import com.ramcosta.composedestinations.animations.NavHostAnimatedDestinationStyle
42+ import com.ramcosta.composedestinations.generated.NavGraphs
43+ import com.ramcosta.composedestinations.utils.isRouteOnBackStackAsState
4144
4245@Composable
4346fun MainScreen () {
@@ -47,17 +50,6 @@ fun MainScreen() {
4750 val navController = LocalNavController .current
4851 val snackbarHostState = remember { SnackbarHostState () }
4952
50- val isRoot = userPreferences.workingMode.isRoot && PlatformManager .isAlive
51-
52- val mainScreens by remember(isRoot) {
53- derivedStateOf {
54- return @derivedStateOf listOf (
55- MainRoute .Modules ,
56- MainRoute .Settings
57- )
58- }
59- }
60-
6153 LaunchedEffect (Unit ) {
6254 val platform = userPreferences.workingMode.toPlatform()
6355
@@ -73,29 +65,29 @@ fun MainScreen() {
7365
7466 Scaffold (
7567 bottomBar = {
76- BottomNav (mainScreens )
68+ BottomNav ()
7769 },
7870 snackbarHost = { SnackbarHost (snackbarHostState) },
7971 contentWindowInsets = WindowInsets .none
8072 ) { paddingValues ->
81- NavHost (
73+ DestinationsNavHost (
8274 modifier = Modifier .padding(bottom = paddingValues.calculateBottomPadding()),
75+ navGraph = NavGraphs .root,
8376 navController = navController,
84- startDestination = MainRoute .Modules
85- ) {
86- modulesRoute()
87- settingsRoute()
88- }
77+ defaultTransitions = object : NavHostAnimatedDestinationStyle () {
78+ override val enterTransition: AnimatedContentTransitionScope <NavBackStackEntry >.() -> EnterTransition
79+ get() = { fadeIn(animationSpec = tween(340 )) }
80+ override val exitTransition: AnimatedContentTransitionScope <NavBackStackEntry >.() -> ExitTransition
81+ get() = { fadeOut(animationSpec = tween(340 )) }
82+ }
83+ )
8984 }
9085}
9186
9287@Composable
93- private fun BottomNav (
94- mainScreens : List <MainRoute >,
95- ) {
88+ private fun BottomNav () {
9689 val navController = LocalNavController .current
97- val navBackStackEntry by navController.currentBackStackEntryAsState()
98- val currentDestination = navBackStackEntry?.destination
90+ val navigator = LocalDestinationsNavigator .current
9991
10092 NavigationBar (
10193 modifier = Modifier
@@ -107,15 +99,14 @@ private fun BottomNav(
10799 )
108100 )
109101 ) {
110- mainScreens.forEach { screen ->
111- val selected =
112- currentDestination?.hierarchy?.any { it.route == screen::class .java.name } == true
102+ MainDestination .entries.forEach { screen ->
103+ val isSelected by navController.isRouteOnBackStackAsState(screen.direction)
113104
114105 NavigationBarItem (
115106 icon = {
116107 Icon (
117108 painter = painterResource(
118- id = if (selected ) {
109+ id = if (isSelected ) {
119110 screen.iconFilled
120111 } else {
121112 screen.icon
@@ -131,13 +122,19 @@ private fun BottomNav(
131122 )
132123 },
133124 alwaysShowLabel = true ,
134- selected = selected ,
125+ selected = isSelected ,
135126 onClick = {
136- if (selected) return @NavigationBarItem
127+ if (isSelected) {
128+ navigator.popBackStack(screen.direction, false )
129+ }
137130
138- navController.navigatePopUpTo(
139- route = screen,
140- )
131+ navigator.navigate(screen.direction) {
132+ popUpTo(NavGraphs .root) {
133+ saveState = true
134+ }
135+ launchSingleTop = true
136+ restoreState = true
137+ }
141138 }
142139 )
143140 }
0 commit comments