From 26316ddd2c5a53bc7d592b434828cb620f4da90d Mon Sep 17 00:00:00 2001 From: Ambroise Decouttere Date: Tue, 30 Apr 2024 14:58:55 +0200 Subject: [PATCH] feat: Mark message as seen locally before api call --- .../MailboxManager+Message.swift | 43 +++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/MailCore/Cache/MailboxManager/MailboxManager+Message.swift b/MailCore/Cache/MailboxManager/MailboxManager+Message.swift index d2fdd3ddb..9d952e9c6 100644 --- a/MailCore/Cache/MailboxManager/MailboxManager+Message.swift +++ b/MailCore/Cache/MailboxManager/MailboxManager+Message.swift @@ -105,17 +105,52 @@ public extension MailboxManager { // MARK: Private func markAsSeen(messages: [Message], seen: Bool) async throws { - if seen { - try await apiFetcher.markAsSeen(mailbox: mailbox, messages: messages) - } else { - try await apiFetcher.markAsUnseen(mailbox: mailbox, messages: messages) + await markSeenLocally(seen, messages: messages) + + do { + if seen { + try await apiFetcher.markAsSeen(mailbox: mailbox, messages: messages) + } else { + try await apiFetcher.markAsUnseen(mailbox: mailbox, messages: messages) + } + } catch { + await markSeenLocally(!seen, messages: messages) } + try await refreshFolder(from: messages, additionalFolder: nil) // TODO: Remove after fix SentryDebug.listIncoherentMessageUpdate(messages: messages, actualSeen: seen) } + func markSeenLocally(_ seen: Bool, messages: [Message]) async { + await backgroundRealm.execute { realm in + var updateThreads = Set() + + try? realm.write { + for message in messages { + guard let liveMessage = realm.object(ofType: Message.self, forPrimaryKey: message.uid) else { + continue + } + + liveMessage.seen = seen + + for thread in liveMessage.threads { + updateThreads.insert(thread) + } + } + + for thread in updateThreads { + guard let liveThread = realm.object(ofType: Thread.self, forPrimaryKey: thread.uid) else { + continue + } + + liveThread.updateUnseenMessages() + } + } + } + } + /// Set starred the given messages. /// - Important: This methods stars only the messages you passes, no processing is done to add duplicates or remove drafts func star(messages: [Message], starred: Bool) async throws {