Spaces:
Paused
Paused
| export const KEYBOARD_SHORTCUT_TEXT_INPUT_SELECTOR = [ | |
| "input", | |
| "textarea", | |
| "select", | |
| "[contenteditable='true']", | |
| "[contenteditable='plaintext-only']", | |
| "[role='textbox']", | |
| "[role='combobox']", | |
| ].join(", "); | |
| const MODIFIER_ONLY_KEYS = new Set(["Shift", "Meta", "Control", "Alt"]); | |
| export type InboxQuickArchiveKeyAction = "ignore" | "archive" | "disarm"; | |
| export function isKeyboardShortcutTextInputTarget(target: EventTarget | null): boolean { | |
| if (!(target instanceof HTMLElement)) return false; | |
| if (target.isContentEditable) return true; | |
| return !!target.closest(KEYBOARD_SHORTCUT_TEXT_INPUT_SELECTOR); | |
| } | |
| export function hasBlockingShortcutDialog(root: ParentNode = document): boolean { | |
| return !!root.querySelector("[role='dialog'][aria-modal='true']"); | |
| } | |
| export function isModifierOnlyKey(key: string): boolean { | |
| return MODIFIER_ONLY_KEYS.has(key); | |
| } | |
| export function resolveInboxQuickArchiveKeyAction({ | |
| armed, | |
| defaultPrevented, | |
| key, | |
| metaKey, | |
| ctrlKey, | |
| altKey, | |
| target, | |
| hasOpenDialog, | |
| }: { | |
| armed: boolean; | |
| defaultPrevented: boolean; | |
| key: string; | |
| metaKey: boolean; | |
| ctrlKey: boolean; | |
| altKey: boolean; | |
| target: EventTarget | null; | |
| hasOpenDialog: boolean; | |
| }): InboxQuickArchiveKeyAction { | |
| if (!armed) return "ignore"; | |
| if (defaultPrevented) return "disarm"; | |
| if (metaKey || ctrlKey || altKey || isModifierOnlyKey(key)) return "ignore"; | |
| if (hasOpenDialog || isKeyboardShortcutTextInputTarget(target)) return "disarm"; | |
| if (key === "y") return "archive"; | |
| return "disarm"; | |
| } | |