| 1 | import assert from "node:assert/strict"; |
| 2 | import { managementDom } from "../test-support/managementDom"; |
| 3 | const dom = managementDom(); |
| 4 | const { default: React, act } = await import("react"); |
| 5 | const { createRoot } = await import("react-dom/client"); |
| 6 | const { useGlobalShortcut, resolvedShortcutCombo, detectShortcutPlatform } = await import("../lib/keyboardShortcuts"); |
| 7 | const { useAppNavigationStore: navigation } = await import("../store/appNavigation"); |
| 8 | let sidebar = 0; let palette = 0; let closes = 0; |
| 9 | function Shortcuts() { |
| 10 | useGlobalShortcut("sidebar.toggle", () => { sidebar++; }); |
| 11 | useGlobalShortcut("commandPalette.open", () => { palette++; }); |
| 12 | useGlobalShortcut("tab.close", () => { closes++; navigation.getState().returnToWorkspace(); }); |
| 13 | return null; |
| 14 | } |
| 15 | const fire = (action: Parameters<typeof resolvedShortcutCombo>[0]) => { |
| 16 | const combo = resolvedShortcutCombo(action, detectShortcutPlatform()); |
| 17 | document.dispatchEvent(new dom.window.KeyboardEvent("keydown", { key: combo.key, ctrlKey: combo.ctrl, metaKey: combo.meta, altKey: combo.alt, shiftKey: combo.shift, bubbles: true, cancelable: true })); |
| 18 | }; |
| 19 | const root = createRoot(document.getElementById("root")!); |
| 20 | await act(async () => root.render(<Shortcuts />)); |
| 21 | fire("sidebar.toggle"); assert.equal(sidebar, 1); |
| 22 | navigation.getState().openPage({ kind: "automation" }); |
| 23 | fire("sidebar.toggle"); assert.equal(sidebar, 1, "hidden workspace shortcuts are suspended"); |
| 24 | fire("commandPalette.open"); assert.equal(palette, 1); |
| 25 | const modal = document.createElement("div"); modal.setAttribute("aria-modal", "true"); document.body.append(modal); |
| 26 | fire("tab.close"); assert.equal(closes, 0, "a child dialog has priority over page shortcuts"); |
| 27 | modal.remove(); fire("tab.close"); |
| 28 | assert.equal(closes, 1); assert.equal(navigation.getState().page.kind, "workspace"); |
| 29 | await act(async () => root.unmount()); dom.window.close(); |
| 30 | console.log("PASS hidden-workspace shortcuts, command palette, child-dialog priority and return shortcut"); |
| 31 |