E-Mail Anzeige für Ordner erhalten

KI-AGENT: Behält den ausgewählten E-Mail Ordner beim Aktualisieren bei und synchronisiert leere Nicht-Posteingang-Ordner beim ersten Öffnen automatisch, damit deren Nachrichten angezeigt werden.
This commit is contained in:
2026-05-23 20:28:42 +02:00
parent f2adc21fea
commit be4a5caaec

View File

@@ -70,6 +70,7 @@ const loadingMessages = ref(false)
const loadingMessage = ref(false) const loadingMessage = ref(false)
const syncing = ref(false) const syncing = ref(false)
const expandedMailboxPaths = ref<string[]>([]) const expandedMailboxPaths = ref<string[]>([])
const syncedMailboxPaths = ref<string[]>([])
const selectedAccount = computed(() => const selectedAccount = computed(() =>
accounts.value.find((account) => account.id === selectedAccountId.value) || null accounts.value.find((account) => account.id === selectedAccountId.value) || null
@@ -294,6 +295,7 @@ async function loadAccounts() {
async function loadMailboxes() { async function loadMailboxes() {
if (!selectedAccountId.value) return if (!selectedAccountId.value) return
const previousMailboxPath = selectedMailboxPath.value
loadingMailboxes.value = true loadingMailboxes.value = true
selectedMessage.value = null selectedMessage.value = null
@@ -301,7 +303,8 @@ async function loadMailboxes() {
mailboxes.value = await $api(`/api/email/accounts/${selectedAccountId.value}/mailboxes`) mailboxes.value = await $api(`/api/email/accounts/${selectedAccountId.value}/mailboxes`)
resetExpandedMailboxes() resetExpandedMailboxes()
const inbox = mailboxes.value.find((mailbox) => mailbox.specialUse === "\\Inbox" || mailbox.path.toUpperCase() === "INBOX") const inbox = mailboxes.value.find((mailbox) => mailbox.specialUse === "\\Inbox" || mailbox.path.toUpperCase() === "INBOX")
selectedMailboxPath.value = inbox?.path || mailboxes.value[0]?.path || "INBOX" const previousMailbox = mailboxes.value.find((mailbox) => mailbox.path === previousMailboxPath)
selectedMailboxPath.value = previousMailbox?.path || inbox?.path || mailboxes.value[0]?.path || "INBOX"
expandMailboxAncestors(selectedMailboxPath.value) expandMailboxAncestors(selectedMailboxPath.value)
await loadMessages() await loadMessages()
} finally { } finally {
@@ -309,19 +312,20 @@ async function loadMailboxes() {
} }
} }
async function loadMessages() { async function loadMessages(options: { syncIfEmpty?: boolean } = {}) {
if (!selectedAccountId.value || !selectedMailboxPath.value) return if (!selectedAccountId.value || !selectedMailboxPath.value) return
loadingMessages.value = true loadingMessages.value = true
selectedMessage.value = null selectedMessage.value = null
try { try {
messages.value = await $api(`/api/email/accounts/${selectedAccountId.value}/messages`, { messages.value = await fetchMessages(selectedMailboxPath.value)
query: {
mailbox: selectedMailboxPath.value, if (!messages.value.length && options.syncIfEmpty && !syncedMailboxPaths.value.includes(selectedMailboxPath.value)) {
limit: 100, await syncSelectedMailbox({ silent: true, reloadMailboxes: false })
}, syncedMailboxPaths.value = [...syncedMailboxPaths.value, selectedMailboxPath.value]
}) messages.value = await fetchMessages(selectedMailboxPath.value)
}
if (messages.value.length) { if (messages.value.length) {
await selectMessage(messages.value[0]) await selectMessage(messages.value[0])
@@ -331,10 +335,19 @@ async function loadMessages() {
} }
} }
async function fetchMessages(mailboxPath: string) {
return await $api(`/api/email/accounts/${selectedAccountId.value}/messages`, {
query: {
mailbox: mailboxPath,
limit: 100,
},
})
}
async function selectMailbox(mailbox: EmailMailbox) { async function selectMailbox(mailbox: EmailMailbox) {
selectedMailboxPath.value = mailbox.path selectedMailboxPath.value = mailbox.path
expandMailboxAncestors(mailbox.path) expandMailboxAncestors(mailbox.path)
await loadMessages() await loadMessages({ syncIfEmpty: true })
} }
async function selectMessage(message: EmailMessage) { async function selectMessage(message: EmailMessage) {
@@ -384,6 +397,10 @@ async function setMessageSeen(messageId: string, seen: boolean) {
async function syncAccount() { async function syncAccount() {
if (!selectedAccountId.value) return if (!selectedAccountId.value) return
await syncSelectedMailbox({ silent: false, reloadMailboxes: true })
}
async function syncSelectedMailbox(options: { silent: boolean; reloadMailboxes: boolean }) {
syncing.value = true syncing.value = true
try { try {
const res = await $api(`/api/email/accounts/${selectedAccountId.value}/sync`, { const res = await $api(`/api/email/accounts/${selectedAccountId.value}/sync`, {
@@ -394,19 +411,25 @@ async function syncAccount() {
}, },
}) })
toast.add({ if (!options.silent) {
title: "E-Mails synchronisiert", toast.add({
description: `${res.synced?.[0]?.fetched || 0} neue Nachrichten geladen`, title: "E-Mails synchronisiert",
color: "success", description: `${res.synced?.[0]?.fetched || 0} neue Nachrichten geladen`,
}) color: "success",
})
}
await loadMailboxes() if (options.reloadMailboxes) {
await loadMailboxes()
}
} catch (err: any) { } catch (err: any) {
toast.add({ if (!options.silent) {
title: "Synchronisation fehlgeschlagen", toast.add({
description: err?.data?.error || err?.message || "Das Postfach konnte nicht synchronisiert werden.", title: "Synchronisation fehlgeschlagen",
color: "error", description: err?.data?.error || err?.message || "Das Postfach konnte nicht synchronisiert werden.",
}) color: "error",
})
}
} finally { } finally {
syncing.value = false syncing.value = false
} }