Fix navigation issue #2778
This commit is contained in:
parent
f5619625a0
commit
981c19ab33
3 changed files with 26 additions and 15 deletions
|
|
@ -35,7 +35,6 @@ import com.bumble.appyx.core.plugin.plugins
|
||||||
import com.bumble.appyx.navmodel.backstack.BackStack
|
import com.bumble.appyx.navmodel.backstack.BackStack
|
||||||
import com.bumble.appyx.navmodel.backstack.operation.push
|
import com.bumble.appyx.navmodel.backstack.operation.push
|
||||||
import com.bumble.appyx.navmodel.backstack.operation.replace
|
import com.bumble.appyx.navmodel.backstack.operation.replace
|
||||||
import com.bumble.appyx.navmodel.backstack.operation.singleTop
|
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import io.element.android.anvilannotations.ContributesNode
|
import io.element.android.anvilannotations.ContributesNode
|
||||||
|
|
@ -60,6 +59,7 @@ import io.element.android.features.securebackup.api.SecureBackupEntryPoint
|
||||||
import io.element.android.libraries.architecture.BackstackView
|
import io.element.android.libraries.architecture.BackstackView
|
||||||
import io.element.android.libraries.architecture.BaseFlowNode
|
import io.element.android.libraries.architecture.BaseFlowNode
|
||||||
import io.element.android.libraries.architecture.createNode
|
import io.element.android.libraries.architecture.createNode
|
||||||
|
import io.element.android.libraries.architecture.waitForNavTargetAttached
|
||||||
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
|
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
|
||||||
import io.element.android.libraries.di.AppScope
|
import io.element.android.libraries.di.AppScope
|
||||||
import io.element.android.libraries.di.SessionScope
|
import io.element.android.libraries.di.SessionScope
|
||||||
|
|
@ -363,25 +363,15 @@ class LoggedInFlowNode @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun attachRoomList() {
|
|
||||||
if (!canShowRoomList()) return
|
|
||||||
attachChild<Node> {
|
|
||||||
backstack.singleTop(NavTarget.RoomList)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun attachRoom(roomId: RoomId) {
|
suspend fun attachRoom(roomId: RoomId) {
|
||||||
if (!canShowRoomList()) return
|
waitForNavTargetAttached { navTarget ->
|
||||||
|
navTarget is NavTarget.RoomList
|
||||||
|
}
|
||||||
attachChild<RoomFlowNode> {
|
attachChild<RoomFlowNode> {
|
||||||
backstack.singleTop(NavTarget.RoomList)
|
|
||||||
backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias()))
|
backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun canShowRoomList(): Boolean {
|
|
||||||
return ftueService.state.value is FtueState.Complete
|
|
||||||
}
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
override fun View(modifier: Modifier) {
|
override fun View(modifier: Modifier) {
|
||||||
Box(modifier = modifier) {
|
Box(modifier = modifier) {
|
||||||
|
|
|
||||||
|
|
@ -288,7 +288,7 @@ class RootFlowNode @AssistedInject constructor(
|
||||||
.attachSession()
|
.attachSession()
|
||||||
.apply {
|
.apply {
|
||||||
when (deeplinkData) {
|
when (deeplinkData) {
|
||||||
is DeeplinkData.Root -> attachRoomList()
|
is DeeplinkData.Root -> Unit // The room list will always be shown, observing FtueState
|
||||||
is DeeplinkData.Room -> attachRoom(deeplinkData.roomId)
|
is DeeplinkData.Room -> attachRoom(deeplinkData.roomId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ import androidx.lifecycle.lifecycleScope
|
||||||
import com.bumble.appyx.core.children.nodeOrNull
|
import com.bumble.appyx.core.children.nodeOrNull
|
||||||
import com.bumble.appyx.core.node.Node
|
import com.bumble.appyx.core.node.Node
|
||||||
import com.bumble.appyx.core.node.ParentNode
|
import com.bumble.appyx.core.node.ParentNode
|
||||||
|
import kotlinx.coroutines.cancel
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||||
import kotlin.coroutines.resume
|
import kotlin.coroutines.resume
|
||||||
|
|
@ -48,3 +49,23 @@ suspend inline fun <reified N : Node, NavTarget : Any> ParentNode<NavTarget>.wai
|
||||||
continuation.cancel()
|
continuation.cancel()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait for a child to be attached to the parent node, only using the NavTarget
|
||||||
|
*/
|
||||||
|
suspend inline fun <NavTarget : Any> ParentNode<NavTarget>.waitForNavTargetAttached(crossinline predicate: (NavTarget) -> Boolean) =
|
||||||
|
suspendCancellableCoroutine { continuation ->
|
||||||
|
lifecycleScope.launch {
|
||||||
|
children.collect { childMap ->
|
||||||
|
val node = childMap.entries
|
||||||
|
.map { it.key.navTarget }
|
||||||
|
.lastOrNull(predicate)
|
||||||
|
if (node != null && !continuation.isCompleted) {
|
||||||
|
continuation.resume(Unit)
|
||||||
|
cancel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.invokeOnCompletion {
|
||||||
|
continuation.cancel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue