修复: 审批浮窗无法关闭(托盘拦截误伤+兜底失效)
根因=关窗拦截全局生效误伤浮窗等JS窗口,close被吞成隐藏僵尸永不销毁, 且close() resolve≠销毁使前端兜底被误取消;改仅主窗口拦截,关窗兜底 按tauri://destroyed判定超时强制销毁,主窗口closePopup同步加固
This commit is contained in:
@@ -31,7 +31,7 @@ const EVT_ACTIVATE = 'approval-popup-activate'
|
||||
const EVT_CLOSED = 'approval-popup-closed'
|
||||
|
||||
/** 模块级:当前浮窗引用 + 是否用户手动关闭(防 watch 重复弹) */
|
||||
type PopupWin = { close: () => Promise<void> }
|
||||
type PopupWin = { close: () => Promise<void>; destroy: () => Promise<void> }
|
||||
let _popupWin: PopupWin | null = null
|
||||
let _userClosed = false
|
||||
let _unlistenActivate: (() => void) | null = null
|
||||
@@ -138,14 +138,35 @@ async function openOrUpdate(approvals: AiToolCallInfo[]): Promise<void> {
|
||||
}
|
||||
}
|
||||
|
||||
/** 关闭浮窗(若存在) */
|
||||
/** close() 超时降级 destroy() 的阈值(对齐浮窗侧 closeWithFallback 的 CLOSE_TIMEOUT_MS) */
|
||||
const CLOSE_TIMEOUT_MS = 1500
|
||||
|
||||
/** 关闭浮窗(若存在)。
|
||||
* 根因:Tauri 2.x 的 close() 走 closeRequested(非强制),偶发原生窗口未及时销毁,而主窗口侧
|
||||
* 此前裸 await close() 无兜底 → 浮窗空态 hint「正在关闭…」永久残留。
|
||||
* 对齐浮窗侧 closeWithFallback 语义:取引用后立即置空 _popupWin(防重复关/防关闭期间拿到旧引用),
|
||||
* close 失败或超时未落定 → destroy() 强制销毁。 */
|
||||
async function closePopup(): Promise<void> {
|
||||
const win = _popupWin
|
||||
_popupWin = null
|
||||
if (!win) return
|
||||
const timer = setTimeout(() => {
|
||||
console.warn('[ApprovalPopup] close() 超时,降级 destroy()')
|
||||
win.destroy().catch((e: unknown) => {
|
||||
console.error('[ApprovalPopup] destroy() 兜底也失败:', e)
|
||||
})
|
||||
}, CLOSE_TIMEOUT_MS)
|
||||
try {
|
||||
if (!_popupWin) return
|
||||
await _popupWin.close()
|
||||
_popupWin = null
|
||||
} catch {
|
||||
/* 浮窗已被关/不可用,忽略 */
|
||||
await win.close()
|
||||
clearTimeout(timer)
|
||||
} catch (e) {
|
||||
clearTimeout(timer)
|
||||
console.warn('[ApprovalPopup] close() 失败,降级 destroy():', e)
|
||||
try {
|
||||
await win.destroy()
|
||||
} catch (e2) {
|
||||
console.error('[ApprovalPopup] destroy() 兜底也失败:', e2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user