From 8c31bd5dd14b81d88344f3459567394a5ae1db06 Mon Sep 17 00:00:00 2001 From: Diogo Date: Sat, 19 Oct 2024 11:03:44 +0100 Subject: [PATCH] update min unread item in memory when app is running --- apps/ios/Shared/Model/ChatModel.swift | 15 +++++++++++ apps/ios/Shared/Views/Chat/ChatView.swift | 33 +++++++++++++---------- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index e6970d4728..79fd8a36aa 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -400,6 +400,9 @@ final class ChatModel: ObservableObject { } if case .rcvNew = cItem.meta.itemStatus { unreadCollector.changeUnreadCounter(cInfo.id, by: 1) + if chats[i].chatStats.minUnreadItemId == 0 { + chats[i].chatStats.minUnreadItemId = cItem.id + } } popChatCollector.throttlePopChat(cInfo.id, currentPosition: i) } else { @@ -486,6 +489,10 @@ final class ChatModel: ObservableObject { if let pItem = chat.chatItems.last, pItem.id == cItem.id { chat.chatItems = [ChatItem.deletedItemDummy()] } + if chat.chatStats.minUnreadItemId == cItem.id { + let oldestUnreadItem = chat.chatItems.last { $0.isRcvNew } + chat.chatStats.minUnreadItemId = oldestUnreadItem?.id ?? 0 + } } // remove from current chat if chatId == cInfo.id { @@ -643,6 +650,14 @@ final class ChatModel: ObservableObject { } } self.unreadCollector.changeUnreadCounter(cInfo.id, by: -itemIds.count) + if let chat = getChat(cInfo.id), itemIds.contains(chat.chatStats.minUnreadItemId) { + let firstUnreadItem = im.reversedChatItems.last(where: { $0.isRcvNew}) + chat.chatStats = ChatStats( + unreadCount: chat.chatStats.unreadCount, + minUnreadItemId: firstUnreadItem?.id ?? 0, + unreadChat: chat.chatStats.unreadChat + ) + } } private let unreadCollector = UnreadCollector() diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 087c530fcd..dd8703ace7 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -370,21 +370,26 @@ struct ChatView: View { } ChatView.FloatingButtonModel.shared.totalUnread = chat.chatStats.unreadCount sectionModel.resetSections(items: im.reversedChatItems) - + let minUnreadItemId = chat.chatStats.minUnreadItemId - if minUnreadItemId > 0, !im.reversedChatItems.contains(where: { $0.id == minUnreadItemId }) { - Task { - if let reversedPage = await loadItemsAround(chat.chatInfo, minUnreadItemId) { - await MainActor.run { - let reversedPageToAppend = self.sectionModel.handleSectionInsertion( - candidateSection: .current, - reversedPage: reversedPage, - allItems: im.reversedChatItems - ) - im.reversedChatItems.append(contentsOf: reversedPageToAppend) - - withAnimation { - scrollModel.scrollToItem(id: minUnreadItemId, position: .middle) + if minUnreadItemId > 0 { + if im.reversedChatItems.contains(where: { $0.id == minUnreadItemId }) { + withAnimation { + scrollModel.scrollToItem(id: minUnreadItemId, position: .middle) + } + } else { + Task { + if let reversedPage = await loadItemsAround(chat.chatInfo, minUnreadItemId) { + await MainActor.run { + let reversedPageToAppend = self.sectionModel.handleSectionInsertion( + candidateSection: .current, + reversedPage: reversedPage, + allItems: im.reversedChatItems + ) + im.reversedChatItems.append(contentsOf: reversedPageToAppend) + withAnimation { + scrollModel.scrollToItem(id: minUnreadItemId, position: .middle, animated: false) + } } } }