Skip to content

Commit 1e73285

Browse files
committed
Use Nav3 scene decorator for nav bars
1 parent cac3922 commit 1e73285

2 files changed

Lines changed: 40 additions & 13 deletions

File tree

app/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation/NavHost.kt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ internal fun NavHost(
143143
val showGoldenKodee by remember { conferenceService.goldenKodeeData.map { it != null } }
144144
.collectAsStateWithLifecycle(false)
145145

146+
val navigationDecorator = remember(navState, navigator, showGoldenKodee) {
147+
NavigationSceneDecoratorStrategy(navState, navigator, showGoldenKodee)
148+
}
149+
146150
val isGoldenKodee = navState.topLevelRoute is GoldenKodeeScreen
147151

148152
ThemeChangeAnimation(
@@ -171,16 +175,11 @@ internal fun NavHost(
171175
WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal)
172176
)
173177
) {
174-
NavScaffold(
175-
navState = navState,
176-
navigator = navigator,
177-
showGoldenKodee = showGoldenKodee,
178-
) {
179-
NavDisplay(
180-
entries = navState.toDecoratedEntries(entryProvider),
181-
onBack = navigator::goBack,
182-
)
183-
}
178+
NavDisplay(
179+
entries = navState.toDecoratedEntries(entryProvider),
180+
onBack = navigator::goBack,
181+
sceneDecoratorStrategies = listOf(navigationDecorator),
182+
)
184183

185184
val baseUrl = LocalAppGraph.current.baseUrl
186185
val flagsManager = LocalAppGraph.current.flagsManager

app/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation/NavScaffold.kt

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ import androidx.compose.ui.platform.LocalDensity
2626
import androidx.compose.ui.text.style.TextAlign
2727
import androidx.compose.ui.unit.IntSize
2828
import androidx.compose.ui.unit.dp
29+
import androidx.navigation3.scene.Scene
30+
import androidx.navigation3.scene.SceneDecoratorStrategy
31+
import androidx.navigation3.scene.SceneDecoratorStrategyScope
2932
import org.jetbrains.kotlinconf.generated.resources.Res
3033
import org.jetbrains.kotlinconf.generated.resources.award_28
3134
import org.jetbrains.kotlinconf.generated.resources.award_28_fill
@@ -88,12 +91,37 @@ private val bottomNavDestinations: List<MainNavDestination<TopLevelRoute>> = lis
8891
),
8992
)
9093

94+
internal class NavigationSceneDecoratorStrategy(
95+
private val navState: NavState,
96+
private val navigator: Navigator,
97+
private val showGoldenKodee: Boolean,
98+
) : SceneDecoratorStrategy<AppRoute> {
99+
override fun SceneDecoratorStrategyScope<AppRoute>.decorateScene(scene: Scene<AppRoute>): Scene<AppRoute> {
100+
return if (navState.topLevelRoute != null) {
101+
NavigationDecoratingScene(scene, navState, navigator, showGoldenKodee)
102+
} else {
103+
scene
104+
}
105+
}
106+
}
107+
108+
private class NavigationDecoratingScene(
109+
private val scene: Scene<AppRoute>,
110+
private val navState: NavState,
111+
private val navigator: Navigator,
112+
private val showGoldenKodee: Boolean,
113+
) : Scene<AppRoute> by scene {
114+
override val content: @Composable () -> Unit = {
115+
NavScaffold(navState, navigator, showGoldenKodee, scene)
116+
}
117+
}
118+
91119
@Composable
92-
internal fun NavScaffold(
120+
private fun NavScaffold(
93121
navState: NavState,
94122
navigator: Navigator,
95123
showGoldenKodee: Boolean,
96-
content: @Composable (() -> Unit)
124+
scene: Scene<AppRoute>,
97125
) {
98126
val onSelectRoute: (TopLevelRoute) -> Unit = { route ->
99127
navigator.activate(route)
@@ -137,7 +165,7 @@ internal fun NavScaffold(
137165

138166
Column(Modifier.weight(1f)) {
139167
Box(Modifier.weight(1f).clipToBounds()) {
140-
content()
168+
scene.content()
141169
}
142170

143171
NotificationBar()

0 commit comments

Comments
 (0)