@@ -54,7 +54,6 @@ import kotlinx.coroutines.flow.SharingStarted
54
54
import kotlinx.coroutines.flow.combine
55
55
import kotlinx.coroutines.flow.distinctUntilChanged
56
56
import kotlinx.coroutines.flow.filter
57
- import kotlinx.coroutines.flow.first
58
57
import kotlinx.coroutines.flow.launchIn
59
58
import kotlinx.coroutines.flow.map
60
59
import kotlinx.coroutines.flow.shareIn
@@ -111,7 +110,7 @@ class RoomFlowNode(
111
110
data class JoinedRoom (val roomId : RoomId ) : NavTarget
112
111
113
112
@Parcelize
114
- data class Space (val spaceId : RoomId ) : NavTarget
113
+ data class JoinedSpace (val spaceId : RoomId ) : NavTarget
115
114
}
116
115
117
116
override fun onBuilt () {
@@ -149,30 +148,28 @@ class RoomFlowNode(
149
148
.withPreviousValue()
150
149
combine(currentMembershipFlow, isSpaceFlow) { (previousMembership, membership), isSpace ->
151
150
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))
159
156
}
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 ,
174
171
)
175
- }
172
+ )
176
173
}
177
174
}
178
175
}.launchIn(lifecycleScope)
@@ -214,7 +211,7 @@ class RoomFlowNode(
214
211
)
215
212
createNode<JoinedRoomFlowNode >(buildContext, plugins = listOf (inputs) + roomFlowNodeCallback)
216
213
}
217
- is NavTarget .Space -> {
214
+ is NavTarget .JoinedSpace -> {
218
215
val spaceCallback = plugins<SpaceEntryPoint .Callback >().single()
219
216
spaceEntryPoint.nodeBuilder(this , buildContext)
220
217
.inputs(SpaceEntryPoint .Inputs (roomId = navTarget.spaceId))
0 commit comments