core, ui: keep loaded support stats on member join, handle failed loads on iOS, write members on main thread

This commit is contained in:
Narasimha-sc committed 2026-09-30 15:38:13 +00:00
1 parent 0fe04240b2
commit d20c0a55c2
7 files changed
+42 -19

No files matched your search

@@ -388,6 +388,11 @@ object ChatModel {
chatsContext.upsertGroupMember(rhId, cInfo.groupInfo, current?.copy(supportChat = member.supportChat) ?: member)
}
fun withLoadedSupportChat(member: GroupMember): GroupMember {
val supportChat = groupMembersIndexes.value[member.groupMemberId]?.let { groupMembers.value.getOrNull(it) }?.supportChat
return if (supportChat != null) member.copy(supportChat = supportChat) else member
}
fun populateGroupMembersIndexes() {
groupMembersIndexes.value = emptyMap()
val gmIndexes = groupMembersIndexes.value.toMutableMap()
@@ -979,6 +984,7 @@ object ChatModel {
// stale data, should be cleared at that point, otherwise, duplicated items will be here which will produce crashes in LazyColumn
groupMembers.value = emptyList()
groupMembersIndexes.value = emptyMap()
membersLoaded.value = false
}
val memberIndex = groupMembersIndexes.value[member.groupMemberId]
val updated = chatItems.value.map {
@@ -3162,7 +3162,7 @@ object ChatController {
is CR.JoinedGroupMemberConnecting ->
if (active(r.user)) {
withContext(Dispatchers.Main) {
chatModel.chatsContext.upsertGroupMember(rhId, r.groupInfo, r.member)
chatModel.chatsContext.upsertGroupMember(rhId, r.groupInfo, chatModel.withLoadedSupportChat(r.member))
}
}
is CR.MemberAcceptedByOther ->
@@ -3273,7 +3273,7 @@ object ChatController {
is CR.JoinedGroupMember ->
if (active(r.user)) {
withContext(Dispatchers.Main) {
chatModel.chatsContext.upsertGroupMember(rhId, r.groupInfo, r.member)
chatModel.chatsContext.upsertGroupMember(rhId, r.groupInfo, chatModel.withLoadedSupportChat(r.member))
}
}
is CR.ConnectedToGroupMember -> {
@@ -265,11 +265,13 @@ suspend fun setGroupMembers(rhId: Long?, groupInfo: GroupInfo, chatModel: ChatMo
newMember
}
}
if (chatModel.chatId.value != groupInfo.id && chatModel.creatingChannelId.value != groupInfo.id) return@coroutineScope
chatModel.groupMembersIndexes.value = emptyMap()
chatModel.groupMembers.value = newMembers
chatModel.membersLoaded.value = true
chatModel.populateGroupMembersIndexes()
withContext(Dispatchers.Main) {
if (chatModel.chatId.value != groupInfo.id && chatModel.creatingChannelId.value != groupInfo.id) return@withContext
chatModel.groupMembersIndexes.value = emptyMap()
chatModel.groupMembers.value = newMembers
chatModel.membersLoaded.value = true
chatModel.populateGroupMembersIndexes()
}
}
@Composable