This commit is contained in:
Dr. Michael Kübler
2026-11-07 23:24:14 +01:00
committed by Dr. Michael Kübler
parent 8e95cc3acd
commit c5e46946ac
16 changed files with 1073 additions and 197 deletions
+12 -6
View File
@@ -40,9 +40,11 @@ struct MessageActionButtons: View {
struct MessageDetailWindow: View {
let store: MailStore
let messageID: String?
@State private var draft: ComposeDraft?
@Environment(\.openWindow) private var openWindow
@State private var confirmingDelete = false
@AppStorage("mailDeleteConfirmation") private var deleteConfirmation: MailDeleteConfirmation = .always
@AppStorage("markReadImmediately") private var markReadImmediately = false
@AppStorage("markReadDelaySeconds") private var markReadDelaySeconds = 1
private var message: MailMessage? {
_ = store.archiveRevision
@@ -57,15 +59,15 @@ struct MessageDetailWindow: View {
guard let message else { return }
switch command {
case .reply, .forward:
draft = .from(message, accountID: store.accountID(for: message.id), forwarding: command == .forward)
let draft = ComposeDraft.from(message, accountID: store.accountID(for: message.id), forwarding: command == .forward)
openWindow(id: "compose", value: store.prepareCompose(draft))
case .delete:
if deleteConfirmation.isRequired(count: 1) { confirmingDelete = true }
else { Task { await store.deleteMessages(ids: [message.id]) } }
default: break
}
}.disabled(message == nil || store.isBusy)
}.disabled(message == nil)
}
.sheet(item: $draft) { ComposeView(store: store, draft: $0) }
.alert("Nachricht löschen?", isPresented: $confirmingDelete) {
Button("Abbrechen", role: .cancel) {}
Button("Löschen", role: .destructive) {
@@ -76,8 +78,12 @@ struct MessageDetailWindow: View {
? "Die Nachricht wird auch auf dem Server endgültig gelöscht."
: "Die Nachricht wird auch auf dem Server in den Papierkorb verschoben.")
}
.task(id: messageID) {
if let message, !message.isRead { await store.setRead(ids: [message.id], read: true) }
.task(id: AutoReadRequest(ids: Set([messageID].compactMap { $0 }), immediately: markReadImmediately, seconds: markReadDelaySeconds)) {
guard let message, !message.isRead else { return }
do {
try await AutoReadRequest(ids: [message.id], immediately: markReadImmediately, seconds: markReadDelaySeconds).wait()
await store.setRead(ids: [message.id], read: true)
} catch { /* The message window closed before the read delay elapsed. */ }
}
.alert("MikeMail", isPresented: Binding(get: { store.error != nil }, set: { if !$0 { store.error = nil } })) {
Button("OK") { store.error = nil }