fix: email read status not working

This commit is contained in:
aslost
2026-08-26 12:01:20 +08:00
parent ee5c4e35c9
commit ee7eb51517
2 changed files with 54 additions and 4 deletions
+17
View File
@@ -1,4 +1,5 @@
import { defineStore } from 'pinia'
import { EmailUnreadEnum } from '@/enums/email-enum.js'
export const useEmailStore = defineStore('email', {
state: () => ({
@@ -36,6 +37,13 @@ export const useEmailStore = defineStore('email', {
for (const item of list) {
if (!item?.emailId) continue
if (!item.attList) item.attList = []
// 完整列表可能早于「标已读」返回,避免把本地已读状态盖回未读
const prev = this.detailMap[item.emailId]
const keepRead = prev?.unread === EmailUnreadEnum.READ
|| (currentId === item.emailId && this.contentData.email?.unread === EmailUnreadEnum.READ)
if (keepRead) {
item.unread = EmailUnreadEnum.READ
}
this.detailMap[item.emailId] = item
if (currentId && item.emailId === currentId) {
this.contentData.email = item
@@ -56,5 +64,14 @@ export const useEmailStore = defineStore('email', {
recipient: email?.recipient || '[]',
}
},
markListRead(emailId) {
const scrolls = [this.emailScroll, this.starScroll, this.sendScroll]
for (const scroll of scrolls) {
const list = scroll?.emailList
if (!list?.length) continue
const item = list.find(e => e.emailId === emailId)
if (item) item.unread = EmailUnreadEnum.READ
}
},
},
})
+37 -4
View File
@@ -113,16 +113,49 @@ watch(() => accountStore.currentAccountId, () => {
handleBack()
})
onMounted(() => {
if (emailStore.contentData.showUnread && email.value.unread === EmailUnreadEnum.UNREAD && email.value.emailId) {
email.value.unread = EmailUnreadEnum.READ;
emailRead([email.value.emailId]);
let readRequesting = false
function tryMarkRead() {
if (!emailStore.contentData.showUnread || readRequesting) return
const current = email.value
if (!current?.emailId || current.unread !== EmailUnreadEnum.UNREAD) return
// 等详情数据就绪(detailMap 已写入,或正文已有内容)再标已读
const full = emailStore.detailMap[current.emailId]
const detailReady = !!full || !!(current.content || current.text)
if (!detailReady) return
readRequesting = true
const emailId = current.emailId
current.unread = EmailUnreadEnum.READ
if (emailStore.detailMap[emailId]) {
emailStore.detailMap[emailId].unread = EmailUnreadEnum.READ
}
emailStore.markListRead(emailId)
emailRead([emailId]).finally(() => {
readRequesting = false
})
}
watch(
() => [
email.value?.emailId,
email.value?.content,
email.value?.text,
emailStore.detailMap[email.value?.emailId]
],
() => tryMarkRead(),
{ flush: 'post' }
)
onMounted(() => {
tryMarkRead()
window.addEventListener('keydown', handleKeyDown);
})
onUnmounted(() => {
emailStore.contentData.showUnread = false;
readRequesting = false
window.removeEventListener('keydown', handleKeyDown);
})