From 6bd1163c6c9de3e8b4e7411dfda0515966d61570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20F=C3=B6rtsch?= Date: Sun, 15 Mar 2026 12:36:57 +0100 Subject: [PATCH] mark messages as read when selecting a thread Updates local flags and enqueues \\Seen flag action for IMAP sync. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../MagnumOpus/ViewModels/MailViewModel.swift | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Apps/MagnumOpus/ViewModels/MailViewModel.swift b/Apps/MagnumOpus/ViewModels/MailViewModel.swift index 45f00cc..5e9f173 100644 --- a/Apps/MagnumOpus/ViewModels/MailViewModel.swift +++ b/Apps/MagnumOpus/ViewModels/MailViewModel.swift @@ -187,7 +187,7 @@ final class MailViewModel { func selectThread(_ thread: ThreadSummary) { selectedThread = thread messageObservation?.cancel() - guard let store else { return } + guard let store, let accountConfig else { return } messageObservation = Task { do { for try await msgs in store.observeMessages(threadId: thread.id) { @@ -199,6 +199,24 @@ final class MailViewModel { } } } + + // Mark all unread messages in the thread as read + if thread.unreadCount > 0 { + do { + let messages = try store.messagesForThread(threadId: thread.id) + for message in messages where !message.isRead { + try store.updateFlags(messageId: message.id, isRead: true, isFlagged: message.isFlagged) + let action = PendingAction( + accountId: accountConfig.id, + actionType: .setFlags, + payload: .setFlags(uid: message.uid, mailbox: mailboxName(for: message.mailboxId) ?? "INBOX", add: ["\\Seen"], remove: []) + ) + Task { try await actionQueue?.enqueue(action) } + } + } catch { + errorMessage = error.localizedDescription + } + } } private var isSyncing = false