From a9854bc3782d2c40ec5150add523c79428e15496 Mon Sep 17 00:00:00 2001 From: Benoit Martins Date: Thu, 30 Jan 2025 13:35:18 +0100 Subject: [PATCH] Optimize computeChatRoomsList execution frequency --- .../Main/Conversations/Fragments/UIList.swift | 2 - .../ConversationsListViewModel.swift | 40 ++++++++++++++----- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/Linphone/UI/Main/Conversations/Fragments/UIList.swift b/Linphone/UI/Main/Conversations/Fragments/UIList.swift index f2ac9d30c..7fa9c6572 100644 --- a/Linphone/UI/Main/Conversations/Fragments/UIList.swift +++ b/Linphone/UI/Main/Conversations/Fragments/UIList.swift @@ -208,7 +208,6 @@ struct UIList: UIViewRepresentable { if isScrolledToBottom && conversationViewModel.displayedConversationUnreadMessagesCount > 0 { conversationViewModel.markAsRead() - conversationsListViewModel.computeChatRoomsList(filter: "") } } } @@ -467,7 +466,6 @@ struct UIList: UIViewRepresentable { if self.parent.isScrolledToBottom && self.parent.conversationViewModel.displayedConversationUnreadMessagesCount > 0 { self.parent.conversationViewModel.markAsRead() - self.parent.conversationsListViewModel.computeChatRoomsList(filter: "") } } } diff --git a/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift b/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift index 49117f1b9..9f1cffc91 100644 --- a/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift +++ b/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift @@ -65,16 +65,36 @@ class ConversationsListViewModel: ObservableObject { func addConversationDelegate() { coreContext.doOnCoreQueue { core in - let account = core.defaultAccount - let chatRoomsCounter = account?.chatRooms != nil ? account!.chatRooms.count : core.chatRooms.count - - self.coreConversationDelegate = CoreDelegateStub(onMessagesReceived: { (_: Core, _: ChatRoom, _: [ChatMessage]) in - self.computeChatRoomsList(filter: "") - }, onMessageSent: { (_: Core, _: ChatRoom, _: ChatMessage) in - self.computeChatRoomsList(filter: "") - }, onChatRoomRead: { (_: Core, _: ChatRoom) in - self.computeChatRoomsList(filter: "") - }, onChatRoomStateChanged: { (core: Core, chatRoom: ChatRoom, state: ChatRoom.State) in + self.coreConversationDelegate = CoreDelegateStub(onMessagesReceived: { (_: Core, chatRoom: ChatRoom, _: [ChatMessage]) in + let model = ConversationModel(chatRoom: chatRoom) + DispatchQueue.main.async { + if let index = self.conversationsList.firstIndex(where: { $0.chatRoom === chatRoom }) { + self.conversationsList.remove(at: index) + } + self.conversationsList.insert(model, at: 0) + } + self.updateUnreadMessagesCount() + }, onMessageSent: { (_: Core, chatRoom: ChatRoom, _: ChatMessage) in + let model = ConversationModel(chatRoom: chatRoom) + DispatchQueue.main.async { + if let index = self.conversationsList.firstIndex(where: { $0.chatRoom === chatRoom }) { + self.conversationsList.remove(at: index) + } + self.conversationsList.insert(model, at: 0) + } + self.updateUnreadMessagesCount() + }, onChatRoomRead: { (_: Core, chatRoom: ChatRoom) in + let model = ConversationModel(chatRoom: chatRoom) + DispatchQueue.main.async { + if let index = self.conversationsList.firstIndex(where: { $0.chatRoom === chatRoom }) { + self.conversationsList.remove(at: index) + self.conversationsList.insert(model, at: index) + } else { + self.conversationsList.insert(model, at: 0) + } + } + self.updateUnreadMessagesCount() + }, onChatRoomStateChanged: { (core: Core, _: ChatRoom, state: ChatRoom.State) in // Log.info("[ConversationsListViewModel] Conversation [${LinphoneUtils.getChatRoomId(chatRoom)}] state changed [$state]") if core.globalState == .On { switch state {