1616
1717package com.tunjid.heron.scaffold.scaffold
1818
19+ import androidx.compose.animation.EnterExitState
1920import androidx.compose.animation.animateBounds
2021import androidx.compose.animation.core.animateDpAsState
2122import androidx.compose.foundation.gestures.Orientation
@@ -36,13 +37,21 @@ import androidx.compose.runtime.Composable
3637import androidx.compose.runtime.LaunchedEffect
3738import androidx.compose.runtime.getValue
3839import androidx.compose.runtime.remember
40+ import androidx.compose.runtime.rememberCoroutineScope
3941import androidx.compose.runtime.rememberUpdatedState
4042import androidx.compose.runtime.snapshotFlow
4143import androidx.compose.ui.Modifier
4244import androidx.compose.ui.draw.clip
45+ import androidx.compose.ui.geometry.Offset
4346import androidx.compose.ui.graphics.Color
4447import androidx.compose.ui.unit.dp
48+ import androidx.compose.ui.unit.round
4549import androidx.compose.ui.zIndex
50+ import androidx.lifecycle.compose.LifecycleStartEffect
51+ import androidx.navigationevent.NavigationEvent
52+ import androidx.navigationevent.NavigationEventTransitionState
53+ import androidx.navigationevent.compose.LocalNavigationEventDispatcherOwner
54+ import com.tunjid.composables.backpreview.BackPreviewState
4655import com.tunjid.composables.constrainedsize.constrainedSizePlacement
4756import com.tunjid.heron.ui.text.Memo
4857import com.tunjid.heron.ui.text.message
@@ -51,7 +60,10 @@ import com.tunjid.treenav.compose.threepane.ThreePane
5160import com.tunjid.treenav.compose.threepane.ThreePaneMovableElementSharedTransitionScope
5261import com.tunjid.treenav.compose.threepane.rememberThreePaneMovableElementSharedTransitionScope
5362import com.tunjid.treenav.strings.Route
63+ import kotlinx.coroutines.flow.collectLatest
5464import kotlinx.coroutines.flow.filterNotNull
65+ import kotlinx.coroutines.flow.first
66+ import kotlinx.coroutines.launch
5567
5668class PaneScaffoldState internal constructor(
5769 internal val appState : AppState ,
@@ -108,8 +120,9 @@ class PaneScaffoldState internal constructor(
108120 internal val hasSiblings
109121 get() = splitPaneState.filteredPaneOrder.size > 1
110122
111- internal val backPreviewProgress
112- get() = appState.backPreviewState.progress
123+ internal val backPreviewState = BackPreviewState (
124+ minScale = 0.75f ,
125+ )
113126
114127 internal val defaultContainerColor: Color
115128 @Composable get() {
@@ -135,7 +148,7 @@ fun PaneScope<ThreePane, Route>.rememberPaneScaffoldState(): PaneScaffoldState {
135148 val splitPaneState = LocalSplitPaneState .current
136149 val paneMovableElementSharedTransitionScope =
137150 rememberThreePaneMovableElementSharedTransitionScope()
138- return remember(
151+ val paneScaffoldState = remember(
139152 appState,
140153 splitPaneState,
141154 paneMovableElementSharedTransitionScope,
@@ -146,6 +159,41 @@ fun PaneScope<ThreePane, Route>.rememberPaneScaffoldState(): PaneScaffoldState {
146159 paneMovableElementSharedTransitionScope = paneMovableElementSharedTransitionScope,
147160 )
148161 }
162+
163+ val scope = rememberCoroutineScope()
164+
165+ val navigationEventDispatcher =
166+ LocalNavigationEventDispatcherOwner .current!!
167+ .navigationEventDispatcher
168+
169+ LifecycleStartEffect (
170+ key1 = scope,
171+ key2 = navigationEventDispatcher,
172+ ) {
173+ val job = scope.launch {
174+ navigationEventDispatcher.transitionState
175+ .collectLatest { eventState ->
176+ when (eventState) {
177+ is NavigationEventTransitionState .Idle -> {
178+ // Wait to be visible
179+ snapshotFlow { paneScaffoldState.transition.targetState }
180+ .first { it == EnterExitState .Visible }
181+ paneScaffoldState.backPreviewState.progress = 0f
182+ }
183+ is NavigationEventTransitionState .InProgress -> paneScaffoldState.backPreviewState.apply {
184+ progress = eventState.latestEvent.progress
185+ atStart = eventState.latestEvent.swipeEdge == NavigationEvent .EDGE_LEFT
186+ pointerOffset = Offset (
187+ x = eventState.latestEvent.touchX,
188+ y = eventState.latestEvent.touchY,
189+ ).round()
190+ }
191+ }
192+ }
193+ }
194+ onStopOrDispose { job.cancel() }
195+ }
196+ return paneScaffoldState
149197}
150198
151199@Composable
0 commit comments