Skip to content

Commit 648583c

Browse files
authored
Merge pull request #5376 from element-hq/feature/fix_room_membership_nav
fix (room navigation) : fix navigation when leaving room/space
2 parents 9ac1bf6 + e52f2e2 commit 648583c

File tree

1 file changed

+22
-25
lines changed

1 file changed

+22
-25
lines changed

appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ import kotlinx.coroutines.flow.SharingStarted
5454
import kotlinx.coroutines.flow.combine
5555
import kotlinx.coroutines.flow.distinctUntilChanged
5656
import kotlinx.coroutines.flow.filter
57-
import kotlinx.coroutines.flow.first
5857
import kotlinx.coroutines.flow.launchIn
5958
import kotlinx.coroutines.flow.map
6059
import kotlinx.coroutines.flow.shareIn
@@ -111,7 +110,7 @@ class RoomFlowNode(
111110
data class JoinedRoom(val roomId: RoomId) : NavTarget
112111

113112
@Parcelize
114-
data class Space(val spaceId: RoomId) : NavTarget
113+
data class JoinedSpace(val spaceId: RoomId) : NavTarget
115114
}
116115

117116
override fun onBuilt() {
@@ -149,30 +148,28 @@ class RoomFlowNode(
149148
.withPreviousValue()
150149
combine(currentMembershipFlow, isSpaceFlow) { (previousMembership, membership), isSpace ->
151150
Timber.d("Room membership: $membership")
152-
when (membership) {
153-
CurrentUserMembership.JOINED -> {
154-
if (isSpace) {
155-
backstack.newRoot(NavTarget.Space(spaceId = roomId))
156-
} else {
157-
backstack.newRoot(NavTarget.JoinedRoom(roomId))
158-
}
151+
if (membership == CurrentUserMembership.JOINED) {
152+
if (isSpace) {
153+
backstack.newRoot(NavTarget.JoinedSpace(spaceId = roomId))
154+
} else {
155+
backstack.newRoot(NavTarget.JoinedRoom(roomId))
159156
}
160-
else -> {
161-
if (membership == CurrentUserMembership.LEFT && previousMembership == CurrentUserMembership.JOINED) {
162-
// The user left the room in this device, remove the room from the backstack
163-
if (!membershipUpdateFlow.first().isUserInRoom) {
164-
navigateUp()
165-
}
166-
} else {
167-
// Was invited or the room is not known, display the join room screen
168-
backstack.newRoot(
169-
NavTarget.JoinRoom(
170-
roomId = roomId,
171-
serverNames = serverNames,
172-
trigger = inputs.trigger.getOrNull() ?: JoinedRoom.Trigger.Invite,
173-
)
157+
} else {
158+
val leavingFromCurrentDevice =
159+
membership == CurrentUserMembership.LEFT &&
160+
previousMembership == CurrentUserMembership.JOINED &&
161+
membershipUpdateFlow.replayCache.lastOrNull()?.isUserInRoom == false
162+
163+
if (leavingFromCurrentDevice) {
164+
navigateUp()
165+
} else {
166+
backstack.newRoot(
167+
NavTarget.JoinRoom(
168+
roomId = roomId,
169+
serverNames = serverNames,
170+
trigger = inputs.trigger.getOrNull() ?: JoinedRoom.Trigger.Invite,
174171
)
175-
}
172+
)
176173
}
177174
}
178175
}.launchIn(lifecycleScope)
@@ -214,7 +211,7 @@ class RoomFlowNode(
214211
)
215212
createNode<JoinedRoomFlowNode>(buildContext, plugins = listOf(inputs) + roomFlowNodeCallback)
216213
}
217-
is NavTarget.Space -> {
214+
is NavTarget.JoinedSpace -> {
218215
val spaceCallback = plugins<SpaceEntryPoint.Callback>().single()
219216
spaceEntryPoint.nodeBuilder(this, buildContext)
220217
.inputs(SpaceEntryPoint.Inputs(roomId = navTarget.spaceId))

0 commit comments

Comments
 (0)