From 8bd604b474f497a129a3e8af25b3a7099f9e0499 Mon Sep 17 00:00:00 2001 From: CherryXiao Date: Fri, 20 Feb 2026 18:15:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Agent=20=E6=9D=83=E9=99=90=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=88=87=E6=8D=A2=E5=90=8E=E4=BF=9D=E6=8C=81=20toolti?= =?UTF-8?q?p=20=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 点击权限模式按钮后,tooltip 保持显示直到用户鼠标移开, 而不是闪现后立即消失。使用 keepOpenRef + 100ms 保护期 防止点击瞬间的误关闭,改善用户体验。 Co-Authored-By: Claude Opus 4.6 --- .../agent/PermissionModeSelector.tsx | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/apps/electron/src/renderer/components/agent/PermissionModeSelector.tsx b/apps/electron/src/renderer/components/agent/PermissionModeSelector.tsx index a7fa40f..90f1dc3 100644 --- a/apps/electron/src/renderer/components/agent/PermissionModeSelector.tsx +++ b/apps/electron/src/renderer/components/agent/PermissionModeSelector.tsx @@ -44,6 +44,8 @@ export function PermissionModeSelector(): React.ReactElement | null { const [mode, setMode] = useAtom(agentPermissionModeAtom) const currentWorkspaceId = useAtomValue(currentAgentWorkspaceIdAtom) const workspaces = useAtomValue(agentWorkspacesAtom) + const [tooltipOpen, setTooltipOpen] = React.useState(false) + const keepOpenRef = React.useRef(false) // 获取当前工作区的 slug const workspaceSlug = React.useMemo(() => { @@ -83,16 +85,36 @@ export function PermissionModeSelector(): React.ReactElement | null { } }, [mode, workspaceSlug, setMode]) + /** 处理点击:切换模式并保持 tooltip 显示 */ + const handleClick = React.useCallback(() => { + cycleMode() + keepOpenRef.current = true + setTooltipOpen(true) + // 短暂忽略点击后的关闭请求,之后允许正常 hover 行为 + setTimeout(() => { + keepOpenRef.current = false + }, 100) + requestAnimationFrame(() => document.querySelector('.ProseMirror')?.focus()) + }, [cycleMode]) + + /** 处理 tooltip 状态变化,点击后保持打开 */ + const handleOpenChange = React.useCallback((open: boolean) => { + if (!open && keepOpenRef.current) { + return // 点击后保持打开,忽略关闭请求 + } + setTooltipOpen(open) + }, []) + const config = MODE_CONFIG[mode] const Icon = config.icon return ( - +