diff --git a/src/components/dialog/ShortcutMessageDialog.vue b/src/components/dialog/ShortcutMessageDialog.vue
index 34cd0d86..d4e8b05f 100644
--- a/src/components/dialog/ShortcutMessageDialog.vue
+++ b/src/components/dialog/ShortcutMessageDialog.vue
@@ -1,6 +1,6 @@
@@ -211,20 +257,30 @@ onMounted(() => {
-
-
-
-
-
-
{{ item.title }}
-
{{ item.subtitle }}
-
-
+
+
+
+
+
+
{{ item.title }}
+
{{ item.subtitle }}
+
+
+
diff --git a/src/service-worker.ts b/src/service-worker.ts
index ca179594..57595de3 100644
--- a/src/service-worker.ts
+++ b/src/service-worker.ts
@@ -297,15 +297,21 @@ async function updateBadge(count: number) {
}
}
+// 清除桌面角标和本地未读计数,确保不支持 Badge API 时也能归零。
async function clearBadge() {
if ('clearAppBadge' in self.navigator) {
try {
await self.navigator.clearAppBadge()
- await setStoredUnreadCount(0)
} catch (error) {
- console.error('Failed to clear app badge:', error)
+ console.error('Failed to clear native app badge:', error)
}
}
+
+ try {
+ await setStoredUnreadCount(0)
+ } catch (error) {
+ console.error('Failed to clear unread count:', error)
+ }
}
// 监控缓存大小
diff --git a/src/utils/badge.ts b/src/utils/badge.ts
index f487d642..cc40c5ae 100644
--- a/src/utils/badge.ts
+++ b/src/utils/badge.ts
@@ -96,28 +96,41 @@ export async function checkAndEmitUnreadMessages() {
}
}
+// 清除未读消息计数,并通知前端同步隐藏未读红点。
+export async function clearUnreadMessages(): Promise {
+ emitUnreadMessageEvent(0)
+ return clearAppBadge()
+}
+
// 清除桌面图标徽章
export async function clearAppBadge(): Promise {
- try {
- // 如果浏览器支持原生Badge API,直接调用
- if ('clearAppBadge' in navigator) {
- await navigator.clearAppBadge()
- }
+ let nativeBadgeCleared = true
+ // 如果浏览器支持原生Badge API,直接调用
+ if ('clearAppBadge' in navigator) {
+ try {
+ await navigator.clearAppBadge()
+ } catch (error) {
+ nativeBadgeCleared = false
+ console.error('Failed to clear native app badge:', error)
+ }
+ }
+
+ try {
// 向service worker发送清除徽章消息
if ('serviceWorker' in navigator && navigator.serviceWorker.controller) {
const messageChannel = new MessageChannel()
return new Promise(resolve => {
messageChannel.port1.onmessage = event => {
- resolve(event.data.success)
+ resolve(Boolean(event.data.success) && nativeBadgeCleared)
}
navigator.serviceWorker.controller?.postMessage({ type: 'CLEAR_BADGE' }, [messageChannel.port2])
})
}
- return true
+ return nativeBadgeCleared
} catch (error) {
console.error('Failed to clear app badge:', error)
return false