fix: prevent double-Esc abort while dropdowns are open

Keeps Escape focused on closing active dropdowns first
Avoids accidental session aborts from menu interactions
This commit is contained in:
Bohdan Triapitsyn
2026-06-03 23:29:52 +03:00
parent 84df7fa24f
commit e65739d900
+25 -1
View File
@@ -69,6 +69,29 @@ export const useKeyboardShortcuts = () => {
target.getAttribute('data-terminal-hidden-input') === 'true' target.getAttribute('data-terminal-hidden-input') === 'true'
); );
}; };
const dropdownTargetSelector = [
'[data-slot="dropdown-menu-content"]',
'[data-slot="select-content"]',
'[role="combobox"]',
'[role="listbox"]',
'[role="menu"]',
'[role="menuitem"]',
'[role="option"]',
'[data-radix-popper-content-wrapper]',
].join(',');
const isDropdownEventTarget = (target: EventTarget | null) => {
return target instanceof Element && Boolean(target.closest(dropdownTargetSelector));
};
const hasOpenDropdown = () => {
const openDropdowns = document.querySelectorAll<HTMLElement>(
'[data-slot="dropdown-menu-content"], [data-slot="select-content"], [role="listbox"], [role="menu"], [data-radix-popper-content-wrapper]'
);
return Array.from(openDropdowns).some((element) => element.getClientRects().length > 0);
};
const handleTerminalShortcutCapture = (e: KeyboardEvent) => { const handleTerminalShortcutCapture = (e: KeyboardEvent) => {
if (!isTerminalEventTarget(e.target)) { if (!isTerminalEventTarget(e.target)) {
return; return;
@@ -454,6 +477,7 @@ export const useKeyboardShortcuts = () => {
target?.closest('.terminal-viewport-container') || target?.closest('.terminal-viewport-container') ||
target?.getAttribute('data-terminal-hidden-input') === 'true' target?.getAttribute('data-terminal-hidden-input') === 'true'
); );
const hasDropdownInteraction = isDropdownEventTarget(target) || hasOpenDropdown();
const { const {
isSettingsDialogOpen, isSettingsDialogOpen,
@@ -466,7 +490,7 @@ export const useKeyboardShortcuts = () => {
activeMainTab, activeMainTab,
} = useUIStore.getState(); } = useUIStore.getState();
if (isInsideDialog || isInsideTerminal) { if (isInsideDialog || isInsideTerminal || hasDropdownInteraction) {
resetAbortPriming(); resetAbortPriming();
return; return;
} }