From 3f3cf2616c62cd48a7b26394d6236f9bb260bf5f Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Tue, 6 Feb 2024 09:57:44 +0100 Subject: [PATCH] refactor: ComposeMessageIntentView use IntentViewable --- Mail/Utils/IntentViewable.swift | 26 +++++++++++ .../ComposeMessageIntentView.swift | 43 +++++++++++++------ Mail/Views/Thread/OpenThreadIntentView.swift | 6 --- 3 files changed, 57 insertions(+), 18 deletions(-) create mode 100644 Mail/Utils/IntentViewable.swift diff --git a/Mail/Utils/IntentViewable.swift b/Mail/Utils/IntentViewable.swift new file mode 100644 index 0000000000..d47671b51a --- /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 d5fcbf6d0e..823adc937d 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 c767548ac6..4385fbd1e1 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