diff --git a/Mail/Utils/IntentViewable.swift b/Mail/Utils/IntentViewable.swift
new file mode 100644
index 000000000..d47671b51
--- /dev/null
+++ b/Mail/Utils/IntentViewable.swift
@@ -0,0 +1,26 @@
+/*
+ Infomaniak Mail - iOS App
+ Copyright (C) 2024 Infomaniak Network SA
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+ */
+
+import SwiftUI
+
+protocol IntentViewable {
+ associatedtype Intent
+
+ var resolvedIntent: State { get }
+ func initFromIntent() async
+}
diff --git a/Mail/Views/New Message/ComposeMessageIntentView.swift b/Mail/Views/New Message/ComposeMessageIntentView.swift
index d5fcbf6d0..823adc937 100644
--- a/Mail/Views/New Message/ComposeMessageIntentView.swift
+++ b/Mail/Views/New Message/ComposeMessageIntentView.swift
@@ -22,24 +22,33 @@ import NavigationBackport
import RealmSwift
import SwiftUI
-struct ComposeMessageIntentView: View {
+struct ComposeMessageIntentView: View, IntentViewable {
+ typealias Intent = ResolvedIntent
+
@LazyInjectService private var accountManager: AccountManager
@LazyInjectService private var snackbarPresenter: SnackBarPresentable
@Environment(\.dismiss) private var dismiss
- @State private var draft: Draft?
- @State private var mailboxManager: MailboxManager?
- @State private var messageReply: MessageReply?
+ let resolvedIntent = State()
+
+ struct ResolvedIntent {
+ let mailboxManager: MailboxManager
+ let draft: Draft
+ let messageReply: MessageReply?
+ }
let composeMessageIntent: ComposeMessageIntent
var body: some View {
NBNavigationStack {
- if let draft,
- let mailboxManager {
- ComposeMessageView(draft: draft, mailboxManager: mailboxManager, messageReply: messageReply)
- .environmentObject(mailboxManager)
+ if let resolvedIntent = resolvedIntent.wrappedValue {
+ ComposeMessageView(
+ draft: resolvedIntent.draft,
+ mailboxManager: resolvedIntent.mailboxManager,
+ messageReply: resolvedIntent.messageReply
+ )
+ .environmentObject(resolvedIntent.mailboxManager)
} else {
ProgressView()
.progressViewStyle(.circular)
@@ -62,6 +71,7 @@ struct ComposeMessageIntentView: View {
}
var draftToWrite: Draft?
+ var maybeMessageReply: MessageReply?
switch composeMessageIntent.type {
case .new:
draftToWrite = Draft(localUUID: UUID().uuidString)
@@ -76,7 +86,7 @@ struct ComposeMessageIntentView: View {
case .reply(let messageUid, let replyMode):
if let frozenMessage = mailboxManager.getRealm().object(ofType: Message.self, forPrimaryKey: messageUid)?.freeze() {
let messageReply = MessageReply(frozenMessage: frozenMessage, replyMode: replyMode)
- self.messageReply = messageReply
+ maybeMessageReply = messageReply
draftToWrite = Draft.replying(
reply: messageReply,
currentMailboxEmail: mailboxManager.mailbox.email
@@ -88,9 +98,18 @@ struct ComposeMessageIntentView: View {
let draftLocalUUID = draftToWrite.localUUID
writeDraftToRealm(mailboxManager.getRealm(), draft: draftToWrite)
- Task { @MainActor in
- draft = mailboxManager.draft(localUuid: draftLocalUUID)
- self.mailboxManager = mailboxManager
+ Task { @MainActor [maybeMessageReply] in
+ guard let liveDraft = mailboxManager.draft(localUuid: draftLocalUUID) else {
+ dismiss()
+ snackbarPresenter.show(message: MailError.localMessageNotFound.errorDescription ?? "")
+ return
+ }
+
+ resolvedIntent.wrappedValue = ResolvedIntent(
+ mailboxManager: mailboxManager,
+ draft: liveDraft,
+ messageReply: maybeMessageReply
+ )
}
} else {
dismiss()
diff --git a/Mail/Views/Thread/OpenThreadIntentView.swift b/Mail/Views/Thread/OpenThreadIntentView.swift
index c767548ac..4385fbd1e 100644
--- a/Mail/Views/Thread/OpenThreadIntentView.swift
+++ b/Mail/Views/Thread/OpenThreadIntentView.swift
@@ -21,12 +21,6 @@ import MailCore
import RealmSwift
import SwiftUI
-protocol IntentViewable {
- associatedtype Intent
- var resolvedIntent: State { get }
- func initFromIntent() async
-}
-
struct OpenThreadIntentView: View, IntentViewable {
typealias Intent = ResolvedIntent