优化调整

This commit is contained in:
zhongluofeng
2026-08-14 17:47:06 +08:00
parent 6c7897bf47
commit 7d49a7395f
50 changed files with 2805 additions and 259 deletions
+3
View File
@@ -43,6 +43,8 @@ export const useClipboardStore = defineStore('clipboard', () => {
const settings = ref<ClipboardSettings>({ ...DEFAULT_SETTINGS })
const status = ref<ClipboardStatus>({ running: false, count: 0 })
const loading = ref(false)
/** 是否已完成首次加载:再次进入模块时 store 已有缓存,可即时渲染而非再弹骨架屏 */
const initialized = ref(false)
// 事件监听(应用级单例,只注册一次)
let changedUnlisten: UnlistenFn | null = null
@@ -238,6 +240,7 @@ export const useClipboardStore = defineStore('clipboard', () => {
settings,
status,
loading,
initialized,
init,
dispose,
fetchHistoryPage,
+17 -3
View File
@@ -74,11 +74,21 @@ export const useDownloaderStore = defineStore('downloader', () => {
try {
// Rust 端序列化保证字段完整,断言为 Required 收窄后的类型
const fresh = (await commands.downloaderGetTasks()) as DownloadTask[]
// merge 化:保留本地仍在更新的任务对象(进度事件可能刚修改过它),
// 避免整体替换导致进行中任务的实时进度/速度被快照回退
// merge 化:进行中任务保留本地实时进度,避免快照回退;
// 暂停/终态(paused/complete/error)时 Rust 端已同步完整进度(完成时
// completed_size 已对齐 total_size),整体替换为服务端快照,
// 避免本地旧进度覆盖导致"已完成但停在 99%"的状态不一致
const merged = fresh.map(freshTask => {
if (
freshTask.status === 'paused' ||
freshTask.status === 'complete' ||
freshTask.status === 'error'
) {
return freshTask
}
const local = tasks.value.find(t => t.id === freshTask.id)
return local ?? freshTask
if (!local) return freshTask
return { ...local, status: freshTask.status, error: freshTask.error }
})
tasks.value = merged
} catch (e) {
@@ -91,6 +101,10 @@ export const useDownloaderStore = defineStore('downloader', () => {
const updateTaskProgress = (payload: ProgressPayload) => {
const task = tasks.value.find((t) => t.id === payload.id)
if (task) {
// 终态任务忽略迟到的进度事件(下载完成后 in-flight 事件可能把状态/进度回退)
if (task.status === 'complete' || task.status === 'error') return
// 已暂停任务忽略仍携带 active 的迟到事件(暂停瞬间发出的旧事件)
if (task.status === 'paused' && payload.status === 'active') return
task.completedSize = payload.completedSize
task.totalSize = payload.totalSize
task.speed = payload.speed
+5 -9
View File
@@ -980,18 +980,14 @@ export const useMonitorStore = defineStore('monitor', () => {
// 注册 OSD 窗口事件监听
setupOsdEventListeners().catch(e => logger.error('[OSD] 事件监听注册失败: ' + e))
// 监听托盘菜单"切换 OSD"事件(应用级常驻,不随模块挂载/卸载变化)
// 监听托盘菜单"切换 OSD"事件(应用级常驻,不随模块挂载/卸载变化)
// 只修改 overlayEnabled,窗口显示/隐藏统一由下方 store watch 处理,
// 与主界面 OSD 开关(updateOsdConfig)走完全相同的路径,避免双 hide 竞态。
listen(EVENTS.trayToggleOsd, () => {
osdConfig.value.overlayEnabled = !osdConfig.value.overlayEnabled
saveOsdConfig(osdConfig.value)
if (osdConfig.value.overlayEnabled) {
if (osdConfig.value.overlayItems.length === 0) {
toast.warning('OSD 显示项为空,已开启但未创建窗口')
} else {
ensureOverlayWindow().catch(e => logger.error('[OSD] 托盘开启悬浮窗失败: ' + e))
}
} else {
hideOverlayWindow().catch(e => logger.error('[OSD] 托盘关闭悬浮窗失败: ' + e))
if (osdConfig.value.overlayEnabled && osdConfig.value.overlayItems.length === 0) {
toast.warning('OSD 显示项为空,已开启但未创建窗口')
}
}).then(unlisten => { osdEventUnlisteners.push(unlisten) })
.catch(e => logger.error('[OSD] 注册 tray:toggle-osd 监听失败: ' + e))