From f41c04735ba84d573e5d13ed849a567fea064dfa Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Wed, 10 Jul 2024 16:15:14 +0400 Subject: [PATCH] ios: lookup group members via map (#4431) --- apps/ios/Shared/Model/ChatModel.swift | 20 ++++++++++++++++--- apps/ios/Shared/Views/Chat/ChatView.swift | 2 ++ .../Views/Chat/Group/GroupChatInfoView.swift | 1 + .../Shared/Views/NewChat/AddGroupView.swift | 1 + 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index 141e6d5c42..262c4a4b48 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -73,6 +73,7 @@ final class ChatModel: ObservableObject { var chatItemStatuses: Dictionary = [:] @Published var chatToTop: String? @Published var groupMembers: [GMember] = [] + @Published var groupMembersIndexes: Dictionary = [:] // groupMemberId to index in groupMembers list // items in the terminal view @Published var showingTerminal = false @Published var terminalItems: [TerminalItem] = [] @@ -180,8 +181,18 @@ final class ChatModel: ObservableObject { } } + func populateGroupMembersIndexes() { + groupMembersIndexes.removeAll() + for (i, member) in groupMembers.enumerated() { + groupMembersIndexes[member.groupMemberId] = i + } + } + func getGroupMember(_ groupMemberId: Int64) -> GMember? { - groupMembers.first { $0.groupMemberId == groupMemberId } + if let i = groupMembersIndexes[groupMemberId] { + return groupMembers[i] + } + return nil } private func getChatIndex(_ id: String) -> Int? { @@ -667,14 +678,17 @@ final class ChatModel: ObservableObject { } // update current chat if chatId == groupInfo.id { - if let i = groupMembers.firstIndex(where: { $0.groupMemberId == member.groupMemberId }) { + if let i = groupMembersIndexes[member.groupMemberId] { withAnimation(.default) { self.groupMembers[i].wrapped = member self.groupMembers[i].created = Date.now } return false } else { - withAnimation { groupMembers.append(GMember(member)) } + withAnimation { + groupMembers.append(GMember(member)) + groupMembersIndexes[member.groupMemberId] = groupMembers.count - 1 + } return true } } else { diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index d0e73adccd..7e302d67d1 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -121,6 +121,7 @@ struct ChatView: View { chatModel.chatItemStatuses = [:] chatModel.reversedChatItems = [] chatModel.groupMembers = [] + chatModel.groupMembersIndexes.removeAll() membersLoaded = false } } @@ -255,6 +256,7 @@ struct ChatView: View { await MainActor.run { if chatModel.chatId == groupInfo.id { chatModel.groupMembers = groupMembers.map { GMember.init($0) } + chatModel.populateGroupMembersIndexes() membersLoaded = true updateView() } diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift index eabf7ad8c9..59a21d2330 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift @@ -207,6 +207,7 @@ struct GroupChatInfoView: View { let groupMembers = await apiListMembers(groupInfo.groupId) await MainActor.run { chatModel.groupMembers = groupMembers.map { GMember.init($0) } + chatModel.populateGroupMembersIndexes() } } } diff --git a/apps/ios/Shared/Views/NewChat/AddGroupView.swift b/apps/ios/Shared/Views/NewChat/AddGroupView.swift index 5c8a88bd8f..42428dfb55 100644 --- a/apps/ios/Shared/Views/NewChat/AddGroupView.swift +++ b/apps/ios/Shared/Views/NewChat/AddGroupView.swift @@ -194,6 +194,7 @@ struct AddGroupView: View { let groupMembers = await apiListMembers(gInfo.groupId) await MainActor.run { m.groupMembers = groupMembers.map { GMember.init($0) } + m.populateGroupMembersIndexes() } } let c = Chat(chatInfo: .group(groupInfo: gInfo), chatItems: [])