From a9a29df203283fff41bca338e64d2639a0a2103c Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Fri, 29 May 2026 21:34:34 -0700 Subject: [PATCH] fix: cancel floating panel focus frame (#3455) --- .../FloatingTerminalPanel.tsx | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/renderer/src/components/floating-terminal/FloatingTerminalPanel.tsx b/src/renderer/src/components/floating-terminal/FloatingTerminalPanel.tsx index bbc37811e67..ddac1b9149d 100644 --- a/src/renderer/src/components/floating-terminal/FloatingTerminalPanel.tsx +++ b/src/renderer/src/components/floating-terminal/FloatingTerminalPanel.tsx @@ -139,6 +139,8 @@ export function FloatingTerminalPanel({ const pendingEditorCloseQueueRef = useRef([]) const saveDialogFileIdRef = useRef(null) const panelRef = useRef(null) + const shortcutFocusFrameRef = useRef(null) + const shortcutFocusTimeoutRef = useRef(null) const dragRef = useRef<{ pointerId: number startX: number @@ -690,17 +692,35 @@ export function FloatingTerminalPanel({ panelRef.current?.focus({ preventScroll: true }) }, []) + const cancelShortcutFocusFrame = useCallback((): void => { + if (shortcutFocusFrameRef.current !== null) { + cancelAnimationFrame(shortcutFocusFrameRef.current) + shortcutFocusFrameRef.current = null + } + if (shortcutFocusTimeoutRef.current !== null) { + window.clearTimeout(shortcutFocusTimeoutRef.current) + shortcutFocusTimeoutRef.current = null + } + }, []) + + useEffect(() => cancelShortcutFocusFrame, [cancelShortcutFocusFrame]) + const focusPanelForShortcutsAfterClose = useCallback(() => { if (typeof window === 'undefined') { return } - const focusPanel = (): void => focusPanelForShortcuts(false) + cancelShortcutFocusFrame() + const focusPanel = (): void => { + shortcutFocusFrameRef.current = null + shortcutFocusTimeoutRef.current = null + focusPanelForShortcuts(false) + } if (typeof window.requestAnimationFrame === 'function') { - window.requestAnimationFrame(focusPanel) + shortcutFocusFrameRef.current = window.requestAnimationFrame(focusPanel) return } - globalThis.setTimeout(focusPanel, 0) - }, [focusPanelForShortcuts]) + shortcutFocusTimeoutRef.current = window.setTimeout(focusPanel, 0) + }, [cancelShortcutFocusFrame, focusPanelForShortcuts]) const setFloatingTerminalInputFocused = useCallback((target: EventTarget | null): void => { window.api.ui.setFloatingTerminalInputFocused(isFloatingWorkspaceTerminalInputTarget(target))