Skip to content

Commit

Permalink
fix: Correctly load Draft body
Browse files Browse the repository at this point in the history
  • Loading branch information
PhilippeWeidmann committed Jul 6, 2023
1 parent 1d84a68 commit 0a091fb
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 198 deletions.
114 changes: 20 additions & 94 deletions Mail/Views/New Message/ComposeMessageView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,11 @@ struct ComposeMessageView: View {
@LazyInjectService private var matomo: MatomoUtils
@LazyInjectService private var draftManager: DraftManager

@State private var isLoadingContent: Bool
@State private var isLoadingContent = true
@State private var isShowingCancelAttachmentsError = false
@State private var autocompletionType: ComposeViewFieldType?
@State private var editorFocus = false

/// Something to track the initial loading of a default signature
@StateObject private var signatureManager: SignaturesManager
@StateObject private var mailboxManager: MailboxManager
@StateObject private var attachmentsManager: AttachmentsManager
@StateObject private var alert = NewMessageAlert()

Expand All @@ -83,7 +80,9 @@ struct ComposeMessageView: View {
}
}

let messageReply: MessageReply?
private let messageReply: MessageReply?
private let draftContentManager: DraftContentManager
private let mailboxManager: MailboxManager

private var isSendButtonDisabled: Bool {
let disabledState = draft.identityId == nil
Expand All @@ -93,22 +92,25 @@ struct ComposeMessageView: View {
return disabledState
}

// MAK: - Int
// MARK: - Int

init(draft: Draft, mailboxManager: MailboxManager, messageReply: MessageReply? = nil) {
self.messageReply = messageReply

Self.saveNewDraftInRealm(mailboxManager.getRealm(), draft: draft)
_draft = StateRealmObject(wrappedValue: draft)

_isLoadingContent = State(wrappedValue: (draft.messageUid != nil && draft.remoteUUID.isEmpty) || messageReply != nil)
draftContentManager = DraftContentManager(
incompleteDraft: draft,
messageReply: messageReply,
mailboxManager: mailboxManager
)

_signatureManager = StateObject(wrappedValue: SignaturesManager(mailboxManager: mailboxManager))
_mailboxManager = StateObject(wrappedValue: mailboxManager)
self.mailboxManager = mailboxManager
_attachmentsManager = StateObject(wrappedValue: AttachmentsManager(draft: draft, mailboxManager: mailboxManager))
}

// MAK: - View
// MARK: - View

var body: some View {
NavigationView {
Expand Down Expand Up @@ -139,7 +141,7 @@ struct ComposeMessageView: View {
VStack(spacing: 0) {
ComposeMessageHeaderView(draft: draft, focusedField: _focusedField, autocompletionType: $autocompletionType)

if autocompletionType == nil {
if autocompletionType == nil && !isLoadingContent {
ComposeMessageBodyView(
draft: draft,
isLoadingContent: $isLoadingContent,
Expand All @@ -153,21 +155,15 @@ struct ComposeMessageView: View {
}
}
.task {
await prepareCompleteDraft()
}
.task {
await prepareReplyForwardBodyAndAttachments()
}
.onChange(of: signatureManager.loadingSignatureState) { state in
switch state {
case .success:
setSignature()
case .error:
do {
isLoadingContent = true
try await draftContentManager.prepareCompleteDraft()
attachmentsManager.completeUploadedAttachments()
isLoadingContent = false
} catch {
// Unable to get signatures, "An error occurred" and close modal.
IKSnackBar.showSnackBar(message: MailError.unknownError.localizedDescription)
dismiss()
case .progress:
break
}
}
.background(MailResourcesAsset.backgroundColor.swiftUIColor)
Expand All @@ -183,7 +179,7 @@ struct ComposeMessageView: View {
draftManager.syncDraft(mailboxManager: mailboxManager)
}
.overlay {
if isLoadingContent || signatureManager.loadingSignatureState == .progress {
if isLoadingContent {
progressView
}
}
Expand Down Expand Up @@ -252,76 +248,6 @@ struct ComposeMessageView: View {
realm.add(draft, update: .modified)
}
}

private func prepareCompleteDraft() async {
guard draft.messageUid != nil && draft.remoteUUID.isEmpty else { return }

do {
try await mailboxManager.draft(partialDraft: draft)
isLoadingContent = false
} catch {
dismiss()
IKSnackBar.showSnackBar(message: MailError.unknownError.localizedDescription)
}
}

private func prepareReplyForwardBodyAndAttachments() async {
guard let messageReply else { return }

let prepareTask = Task.detached {
try await prepareBody(message: messageReply.message, replyMode: messageReply.replyMode)
try await prepareAttachments(message: messageReply.message, replyMode: messageReply.replyMode)
}

do {
_ = try await prepareTask.value

isLoadingContent = false
} catch {
dismiss()
IKSnackBar.showSnackBar(message: MailError.unknownError.localizedDescription)
}
}

private func prepareBody(message: Message, replyMode: ReplyMode) async throws {
if !message.fullyDownloaded {
try await mailboxManager.message(message: message)
}

guard let freshMessage = message.thaw() else { return }
freshMessage.realm?.refresh()
$draft.body.wrappedValue = Draft.replyingBody(message: freshMessage, replyMode: replyMode)
}

private func prepareAttachments(message: Message, replyMode: ReplyMode) async throws {
guard replyMode == .forward else { return }
let attachments = try await mailboxManager.apiFetcher.attachmentsToForward(
mailbox: mailboxManager.mailbox,
message: message
).attachments

for attachment in attachments {
$draft.attachments.append(attachment)
}
attachmentsManager.completeUploadedAttachments()
}

private func setSignature() {
guard draft.identityId == nil || draft.identityId?.isEmpty == true else {
return
}

guard let defaultSignature = mailboxManager.getStoredSignatures().defaultSignature else {
return
}

let body = $draft.body.wrappedValue
let signedBody = defaultSignature.appendSignature(to: body)

// At this point we have signatures in base up to date, we use the default one.
$draft.identityId.wrappedValue = "\(defaultSignature.id)"
$draft.body.wrappedValue = signedBody
}
}

struct ComposeMessageView_Previews: PreviewProvider {
Expand Down
82 changes: 0 additions & 82 deletions Mail/Views/New Message/Signatures/SignaturesManager.swift

This file was deleted.

Loading

0 comments on commit 0a091fb

Please sign in to comment.