From 9c39af73be07f03a01b7150424c711c2224448b6 Mon Sep 17 00:00:00 2001 From: Jordan Chapelle Date: Wed, 5 Mar 2025 16:59:12 +0100 Subject: [PATCH 1/2] fix: Show not inline files --- .../Thread/Message/Attachment/AttachmentsView.swift | 2 +- .../Views/Thread/Message/MessageSubHeaderView.swift | 4 ++-- MailCore/Models/Message.swift | 13 +++++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Mail/Views/Thread/Message/Attachment/AttachmentsView.swift b/Mail/Views/Thread/Message/Attachment/AttachmentsView.swift index 0a0761bfeb..35bb619dfc 100644 --- a/Mail/Views/Thread/Message/Attachment/AttachmentsView.swift +++ b/Mail/Views/Thread/Message/Attachment/AttachmentsView.swift @@ -41,7 +41,7 @@ struct AttachmentsView: View { @State private var isDownloadDisabled = false private var attachments: [Attachment] { - return message.attachments.filter { $0.disposition == .attachment || $0.contentId == nil } + return message.notInlineAttachments } private var formattedText: String { diff --git a/Mail/Views/Thread/Message/MessageSubHeaderView.swift b/Mail/Views/Thread/Message/MessageSubHeaderView.swift index 7a89c0ad03..0384ee772d 100644 --- a/Mail/Views/Thread/Message/MessageSubHeaderView.swift +++ b/Mail/Views/Thread/Message/MessageSubHeaderView.swift @@ -55,8 +55,8 @@ struct MessageSubHeaderView: View { .padding(.horizontal, value: .medium) } - if !message.attachments.filter({ $0.disposition == .attachment || $0.contentId == nil }).isEmpty || message - .swissTransferUuid != nil { + if !message.notInlineAttachments.isEmpty + || message.swissTransferUuid != nil { AttachmentsView(message: message) } } diff --git a/MailCore/Models/Message.swift b/MailCore/Models/Message.swift index 68bc8d5d19..d0ee5046a1 100644 --- a/MailCore/Models/Message.swift +++ b/MailCore/Models/Message.swift @@ -174,6 +174,19 @@ public final class Message: Object, Decodable, Identifiable { return Array(dup) } + public var notInlineAttachments: [Attachment] { + attachments + .filter { attachment in + if attachment.disposition == .attachment || attachment.contentId == nil { + return true + } else if let contentId = attachment.contentId { + return self.body?.value?.contains(contentId) == false + } else { + return false + } + } + } + public func fromMe(currentMailboxEmail: String) -> Bool { return from.contains { $0.isMe(currentMailboxEmail: currentMailboxEmail) } } From acf5aaeddc11828b9cbd1647bc7c8b7d772c00f2 Mon Sep 17 00:00:00 2001 From: Jordan Chapelle Date: Thu, 6 Mar 2025 13:38:45 +0100 Subject: [PATCH 2/2] refactor: Compute not inline attachments once --- .../Thread/Message/Attachment/AttachmentsView.swift | 6 ++---- .../Views/Thread/Message/MessageSubHeaderView.swift | 2 +- .../MailboxInfosManager/MailboxInfosManager.swift | 2 +- .../MailboxManager/MailboxManager+Message.swift | 10 ++++++++++ MailCore/Models/Attachment.swift | 1 + MailCore/Models/Message.swift | 13 ++----------- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Mail/Views/Thread/Message/Attachment/AttachmentsView.swift b/Mail/Views/Thread/Message/Attachment/AttachmentsView.swift index 35bb619dfc..ee04e95d43 100644 --- a/Mail/Views/Thread/Message/Attachment/AttachmentsView.swift +++ b/Mail/Views/Thread/Message/Attachment/AttachmentsView.swift @@ -40,9 +40,7 @@ struct AttachmentsView: View { @State private var trackDownloadTask: [String: Task] = [:] @State private var isDownloadDisabled = false - private var attachments: [Attachment] { - return message.notInlineAttachments - } + let attachments: [Attachment] private var formattedText: String { var text = [String]() @@ -232,5 +230,5 @@ struct DownloadAllAttachmentsButtonView: View { } #Preview { - AttachmentsView(message: PreviewHelper.sampleMessage) + AttachmentsView(message: PreviewHelper.sampleMessage, attachments: []) } diff --git a/Mail/Views/Thread/Message/MessageSubHeaderView.swift b/Mail/Views/Thread/Message/MessageSubHeaderView.swift index 0384ee772d..0eb8678e07 100644 --- a/Mail/Views/Thread/Message/MessageSubHeaderView.swift +++ b/Mail/Views/Thread/Message/MessageSubHeaderView.swift @@ -57,7 +57,7 @@ struct MessageSubHeaderView: View { if !message.notInlineAttachments.isEmpty || message.swissTransferUuid != nil { - AttachmentsView(message: message) + AttachmentsView(message: message, attachments: Array(message.notInlineAttachments)) } } } diff --git a/MailCore/Cache/MailboxInfosManager/MailboxInfosManager.swift b/MailCore/Cache/MailboxInfosManager/MailboxInfosManager.swift index fea8f15fdb..15ec845ea0 100644 --- a/MailCore/Cache/MailboxInfosManager/MailboxInfosManager.swift +++ b/MailCore/Cache/MailboxInfosManager/MailboxInfosManager.swift @@ -26,7 +26,7 @@ import RealmSwift extension MailboxInfosManager: RealmConfigurable {} public final class MailboxInfosManager { - private static let currentDbVersion: UInt64 = 8 + private static let currentDbVersion: UInt64 = 9 private let dbName = "MailboxInfos.realm" public let realmConfiguration: Realm.Configuration diff --git a/MailCore/Cache/MailboxManager/MailboxManager+Message.swift b/MailCore/Cache/MailboxManager/MailboxManager+Message.swift index a389612006..e60dbab72b 100644 --- a/MailCore/Cache/MailboxManager/MailboxManager+Message.swift +++ b/MailCore/Cache/MailboxManager/MailboxManager+Message.swift @@ -28,6 +28,16 @@ public extension MailboxManager { let completedMessage = try await apiFetcher.message(message: message) completedMessage.fullyDownloaded = true + for attachment in completedMessage.attachments { + if attachment.disposition == .attachment || attachment.contentId == nil { + attachment.isInline = false + } else if let contentId = attachment.contentId { + attachment.isInline = completedMessage.body?.value?.contains(contentId) == true + } else { + attachment.isInline = true + } + } + // Update message in Realm try? writeTransaction { writableRealm in writableRealm.add(completedMessage, update: .modified) diff --git a/MailCore/Models/Attachment.swift b/MailCore/Models/Attachment.swift index 9116b4d00b..f1431bddc8 100644 --- a/MailCore/Models/Attachment.swift +++ b/MailCore/Models/Attachment.swift @@ -34,6 +34,7 @@ public class Attachment: /* Hashable, */ EmbeddedObject, Codable, Identifiable { @Persisted(originProperty: "attachments") var parentLink: LinkingObjects @Persisted public var saved = false @Persisted public var temporaryLocalUrl: String? + @Persisted public var isInline: Bool public var parent: Message? { return parentLink.first diff --git a/MailCore/Models/Message.swift b/MailCore/Models/Message.swift index d0ee5046a1..d8f73fc2fb 100644 --- a/MailCore/Models/Message.swift +++ b/MailCore/Models/Message.swift @@ -174,17 +174,8 @@ public final class Message: Object, Decodable, Identifiable { return Array(dup) } - public var notInlineAttachments: [Attachment] { - attachments - .filter { attachment in - if attachment.disposition == .attachment || attachment.contentId == nil { - return true - } else if let contentId = attachment.contentId { - return self.body?.value?.contains(contentId) == false - } else { - return false - } - } + public var notInlineAttachments: Results { + attachments.filter("isInline == false") } public func fromMe(currentMailboxEmail: String) -> Bool {