From ce1b66cef2960e0ff64f1c28973370b9c67c50d8 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Mon, 29 Jul 2024 09:49:43 +0100 Subject: [PATCH] ios: optimize marking messages read (#4530) * ios: optimize marking messages read * remove view ifs --- apps/ios/Shared/Views/Chat/ChatView.swift | 45 +++++++++++++++-------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 5eb7861bd2..97decdf143 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -646,23 +646,38 @@ struct ChatView: View { } } .onAppear { - markRead( - chatItems: range.flatMap { m.reversedChatItems[$0] } - ?? [chatItem] - ) - } - } - - private func markRead(chatItems: Array.SubSequence) { - let unreadItems = chatItems.filter { $0.isRcvNew } - if unreadItems.isEmpty { return } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) { - if m.chatId == chat.chatInfo.id { - Task { - for unreadItem in unreadItems { - await apiMarkChatItemRead(chat.chatInfo, unreadItem) + if let range { + if let items = unreadItems(range) { + waitToMarkRead { + for ci in items { + await apiMarkChatItemRead(chat.chatInfo, ci) + } } } + } else if chatItem.isRcvNew { + waitToMarkRead { + await apiMarkChatItemRead(chat.chatInfo, chatItem) + } + } + } + } + + private func unreadItems(_ range: ClosedRange) -> [ChatItem]? { + let items = range.compactMap { i in + if i >= 0 && i < m.reversedChatItems.count { + let ci = m.reversedChatItems[i] + return if ci.isRcvNew { ci } else { nil } + } else { + return nil + } + } + return if items.isEmpty { nil } else { items } + } + + private func waitToMarkRead(_ op: @Sendable @escaping () async -> Void) { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) { + if m.chatId == chat.chatInfo.id { + Task(operation: op) } } }