优化未读消息弹窗的打开逻辑

This commit is contained in:
jxxghp
2025-06-14 10:11:41 +08:00
parent 5b461f8e1f
commit aa9dab5d96
2 changed files with 58 additions and 14 deletions

View File

@@ -72,16 +72,31 @@ async function checkUnreadMessages() {
const unreadCount = await checkUnreadOnStartup() const unreadCount = await checkUnreadOnStartup()
if (unreadCount > 0) { if (unreadCount > 0) {
// 延迟2秒打开消息弹窗确保页面和组件都已完全加载 // 等待组件完全加载并重试打开消息弹窗
setTimeout(() => { await waitAndOpenMessageDialog()
shortcutBarRef.value?.openMessageDialog()
}, 2000)
} }
} catch (error) { } catch (error) {
// 静默处理错误 // 静默处理错误
} }
} }
// 等待组件准备好并打开消息弹窗
async function waitAndOpenMessageDialog() {
const maxRetries = 5
const retryDelay = 1000 // 1秒
for (let i = 0; i < maxRetries; i++) {
// 等待一段时间确保组件加载完成
await new Promise(resolve => setTimeout(resolve, retryDelay * (i + 1)))
// 检查ShortcutBar组件是否已经准备好
if (shortcutBarRef.value && typeof shortcutBarRef.value.openMessageDialog === 'function') {
shortcutBarRef.value.openMessageDialog()
return // 成功打开,退出重试循环
}
}
}
onMounted(() => { onMounted(() => {
// 获取菜单列表 // 获取菜单列表
startMenus.value = getMenuList(t('menu.start')) startMenus.value = getMenuList(t('menu.start'))
@@ -90,8 +105,12 @@ onMounted(() => {
organizeMenus.value = getMenuList(t('menu.organize')) organizeMenus.value = getMenuList(t('menu.organize'))
systemMenus.value = getMenuList(t('menu.system')) systemMenus.value = getMenuList(t('menu.system'))
// 检查未读消息 // 延迟检查未读消息,确保所有组件都已加载完成
checkUnreadMessages() nextTick(() => {
setTimeout(() => {
checkUnreadMessages()
}, 500)
})
}) })
</script> </script>

View File

@@ -13,21 +13,36 @@ export async function waitForServiceWorker(): Promise<ServiceWorker | null> {
return navigator.serviceWorker.controller return navigator.serviceWorker.controller
} }
// 等待Service Worker注册和激活 // 等待Service Worker注册和激活最多等待10秒
return new Promise(resolve => { return new Promise(resolve => {
let timeoutId: ReturnType<typeof setTimeout> | null = null
let resolved = false
const resolveOnce = (sw: ServiceWorker | null) => {
if (resolved) return
resolved = true
if (timeoutId) clearTimeout(timeoutId)
resolve(sw)
}
const checkServiceWorker = () => { const checkServiceWorker = () => {
if (navigator.serviceWorker.controller) { if (navigator.serviceWorker.controller) {
resolve(navigator.serviceWorker.controller) resolveOnce(navigator.serviceWorker.controller)
} else { } else {
setTimeout(checkServiceWorker, 100) setTimeout(checkServiceWorker, 200)
} }
} }
// 监听Service Worker变化 // 监听Service Worker变化
navigator.serviceWorker.addEventListener('controllerchange', () => { navigator.serviceWorker.addEventListener('controllerchange', () => {
resolve(navigator.serviceWorker.controller) resolveOnce(navigator.serviceWorker.controller)
}) })
// 设置超时10秒后返回null
timeoutId = setTimeout(() => {
resolveOnce(null)
}, 10000)
checkServiceWorker() checkServiceWorker()
}) })
} }
@@ -41,11 +56,21 @@ export async function checkUnreadOnStartup(): Promise<number> {
return 0 return 0
} }
// 延迟500ms确保Service Worker完全准备好 // 延迟1秒确保Service Worker完全准备好
await new Promise(resolve => setTimeout(resolve, 500)) await new Promise(resolve => setTimeout(resolve, 1000))
const unreadCount = await getUnreadCount() // 重试机制获取未读消息数量
return unreadCount for (let i = 0; i < 3; i++) {
try {
const unreadCount = await getUnreadCount()
return unreadCount
} catch (error) {
if (i === 2) throw error // 最后一次重试失败则抛出错误
await new Promise(resolve => setTimeout(resolve, 500)) // 等待500ms后重试
}
}
return 0
} catch (error) { } catch (error) {
return 0 return 0
} }