From 85531aa9fc4834c1aecd9085dc024a09cef2080a Mon Sep 17 00:00:00 2001 From: abhinav7x94 Date: Sun, 16 Aug 2026 04:34:34 +0530 Subject: [PATCH] fix(extension): restore global save shortcut --- .../entrypoints/content/shared.ts | 7 +-- .../utils/keyboard-shortcut.test.ts | 50 +++++++++++++++++++ .../utils/keyboard-shortcut.ts | 13 +++++ 3 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 apps/browser-extension/utils/keyboard-shortcut.test.ts create mode 100644 apps/browser-extension/utils/keyboard-shortcut.ts diff --git a/apps/browser-extension/entrypoints/content/shared.ts b/apps/browser-extension/entrypoints/content/shared.ts index 12647908..42b2efa2 100644 --- a/apps/browser-extension/entrypoints/content/shared.ts +++ b/apps/browser-extension/entrypoints/content/shared.ts @@ -1,4 +1,5 @@ import { MESSAGE_TYPES } from "../../utils/constants" +import { isSaveMemoryShortcut } from "../../utils/keyboard-shortcut" import { bearerToken, userData } from "../../utils/storage" import type { APIResponse } from "../../utils/types" import { DOMUtils } from "../../utils/ui-components" @@ -94,11 +95,7 @@ export async function saveMemory( export function setupGlobalKeyboardShortcut() { document.addEventListener("keydown", async (event) => { - if ( - (event.ctrlKey || event.metaKey) && - event.shiftKey && - event.key === "m" - ) { + if (isSaveMemoryShortcut(event)) { event.preventDefault() await saveMemory("keyboard_shortcut") } diff --git a/apps/browser-extension/utils/keyboard-shortcut.test.ts b/apps/browser-extension/utils/keyboard-shortcut.test.ts new file mode 100644 index 00000000..3f68e1ac --- /dev/null +++ b/apps/browser-extension/utils/keyboard-shortcut.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, it } from "bun:test" +import { + isSaveMemoryShortcut, + type SaveMemoryShortcutEvent, +} from "./keyboard-shortcut" + +function shortcutEvent( + overrides: Partial = {}, +): SaveMemoryShortcutEvent { + return { + ctrlKey: false, + key: "M", + metaKey: false, + repeat: false, + shiftKey: true, + ...overrides, + } +} + +describe("isSaveMemoryShortcut", () => { + it("accepts uppercase M from Ctrl+Shift+M", () => { + expect(isSaveMemoryShortcut(shortcutEvent({ ctrlKey: true }))).toBeTrue() + }) + + it("accepts uppercase M from Command+Shift+M", () => { + expect(isSaveMemoryShortcut(shortcutEvent({ metaKey: true }))).toBeTrue() + }) + + it("accepts lowercase key representations", () => { + expect( + isSaveMemoryShortcut(shortcutEvent({ ctrlKey: true, key: "m" })), + ).toBeTrue() + }) + + it("rejects missing modifiers and other keys", () => { + expect(isSaveMemoryShortcut(shortcutEvent())).toBeFalse() + expect( + isSaveMemoryShortcut(shortcutEvent({ ctrlKey: true, shiftKey: false })), + ).toBeFalse() + expect( + isSaveMemoryShortcut(shortcutEvent({ ctrlKey: true, key: "N" })), + ).toBeFalse() + }) + + it("rejects repeated keydown events", () => { + expect( + isSaveMemoryShortcut(shortcutEvent({ ctrlKey: true, repeat: true })), + ).toBeFalse() + }) +}) diff --git a/apps/browser-extension/utils/keyboard-shortcut.ts b/apps/browser-extension/utils/keyboard-shortcut.ts new file mode 100644 index 00000000..9833b0d2 --- /dev/null +++ b/apps/browser-extension/utils/keyboard-shortcut.ts @@ -0,0 +1,13 @@ +export type SaveMemoryShortcutEvent = Pick< + KeyboardEvent, + "ctrlKey" | "key" | "metaKey" | "repeat" | "shiftKey" +> + +export function isSaveMemoryShortcut(event: SaveMemoryShortcutEvent): boolean { + return ( + !event.repeat && + (event.ctrlKey || event.metaKey) && + event.shiftKey && + event.key.toLowerCase() === "m" + ) +}