From 7c2c7503f2f939a3743df5006b5962b7e5bb4c85 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Fri, 9 Oct 2026 10:56:00 +0000 Subject: [PATCH] ui: do not show "No relays" while leaving a channel (#7673) --- .../Chat/ComposeMessage/ComposeView.swift | 1 + .../chat/simplex/common/views/chat/ChatView.kt | 18 ++++++++++++++---- .../simplex/common/views/chat/ComposeView.kt | 4 +++- .../views/chatlist/ChatListNavLinkView.kt | 11 +++++++---- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift index a1570ba4a1..fbac41cf40 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift @@ -767,6 +767,7 @@ struct ComposeView: View { let connectedCount = relayMembers.filter { !relayMemberRemoved($0.wrapped.memberStatus) && $0.wrapped.activeConn?.connStatus == .ready && $0.wrapped.activeConn?.connFailedErr == nil }.count let failedCount = relayMembers.filter { !relayMemberRemoved($0.wrapped.memberStatus) && $0.wrapped.activeConn?.connFailedErr != nil }.count let total = relayMembers.count > 0 ? relayMembers.count : hostnames.count + guard total > 0 || chatModel.membersLoaded else { return nil } let noActiveRelays = connectedCount == 0 && (removedCount + failedCount) == total return (hostnames, relayMembers, connectedCount, removedCount, failedCount, total, noActiveRelays) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt index a4a4ddfe94..c1b3c20b71 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt @@ -119,6 +119,20 @@ fun ChatView( } chat } } + if (chatsCtx.secondaryContextFilter == null) { + // cleared when the view is gone rather than on back: Android keeps it on screen while it slides out, + // and by then a channel being created may already be using this state + DisposableEffect(Unit) { + onDispose { + if (chatModel.chatId.value == null && chatModel.creatingChannelId.value == null) { + chatModel.groupMembers.value = emptyList() + chatModel.groupMembersIndexes.value = emptyMap() + chatModel.membersLoaded.value = false + ChannelRelaysModel.reset() + } + } + } + } val user = chatModel.currentUser.value val chatInfo = activeChat.value?.chatInfo if (chat == null || chatInfo == null || user == null) { @@ -382,10 +396,6 @@ fun ChatView( hideKeyboard(view) AudioPlayer.stop() chatModel.chatId.value = null - chatModel.groupMembers.value = emptyList() - chatModel.groupMembersIndexes.value = emptyMap() - chatModel.membersLoaded.value = false - ChannelRelaysModel.reset() }, info = { if (ModalManager.end.hasModalsOpen()) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt index cd733bf275..92ccd92f93 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt @@ -2153,7 +2153,8 @@ private fun ownerRelayState(chat: Chat, chatModel: ChatModel): OwnerRelayState? if (!gInfo.useRelays || gInfo.membership.memberRole != GroupMemberRole.Owner || gInfo.membership.memberStatus in listOf(GroupMemberStatus.MemLeft, GroupMemberStatus.MemRemoved, GroupMemberStatus.MemGroupDeleted) ) return null - val relays = if (ChannelRelaysModel.groupId.value == gInfo.groupId) ChannelRelaysModel.groupRelays.toList() else emptyList() + if (ChannelRelaysModel.groupId.value != gInfo.groupId) return null + val relays = ChannelRelaysModel.groupRelays.toList() if (relays.isEmpty()) return OwnerRelayState(emptyList(), 0, 0, 0, true) val relayMembers = relays.map { relay -> relay to chatModel.groupMembers.value.firstOrNull { it.groupMemberId == relay.groupMemberId } @@ -2186,6 +2187,7 @@ private fun subscriberRelayState(chat: Chat, chatModel: ChatModel): SubscriberRe val connectedCount = relayMembers.count { !relayMemberRemoved(it.memberStatus) && it.activeConn?.connStatus == ConnStatus.Ready && it.activeConn?.connFailedErr == null } val failedCount = relayMembers.count { !relayMemberRemoved(it.memberStatus) && it.activeConn?.connFailedErr != null } val total = if (relayMembers.isNotEmpty()) relayMembers.size else hostnames.size + if (total == 0 && !chatModel.membersLoaded.value) return null val noActiveRelays = connectedCount == 0 && (removedCount + failedCount) == total return SubscriberRelayState(hostnames, relayMembers, connectedCount, removedCount, failedCount, total, noActiveRelays) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt index 5f3fa2725c..489ebb8c39 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt @@ -265,10 +265,13 @@ suspend fun setGroupMembers(rhId: Long?, groupInfo: GroupInfo, chatModel: ChatMo newMember } } - chatModel.groupMembersIndexes.value = emptyMap() - chatModel.groupMembers.value = newMembers - chatModel.membersLoaded.value = true - chatModel.populateGroupMembersIndexes() + withContext(Dispatchers.Main) { + if (chatModel.chatId.value != groupInfo.id) return@withContext + chatModel.groupMembersIndexes.value = emptyMap() + chatModel.groupMembers.value = newMembers + chatModel.membersLoaded.value = true + chatModel.populateGroupMembersIndexes() + } } @Composable