summaryrefslogtreecommitdiff
path: root/apps/web/src/actions/keybinding.ts
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-07-27 00:26:31 +0200
committercashmere <cashmere@autistici.org>2026-07-27 00:26:31 +0200
commitb4d8145f2adb981b462a4581bdf3bf96bc32e3d9 (patch)
tree728d90210d573f3ac577a44edf8e6815cc05e140 /apps/web/src/actions/keybinding.ts
parent607f9717ae44efe8f135b6c79ed85a583f3d2d1d (diff)
downloadopencut-b4d8145f2adb981b462a4581bdf3bf96bc32e3d9.tar.gz
fix: restore missing keybinding validation guards
persistence.ts imported isActionWithOptionalArgs and isShortcutKey, neither of which existed at runtime — loading persisted custom keybindings would crash. Adds actions/guards.ts (excluding required-args actions per TActionArgsMap) and isShortcutKey in keybinding.ts; the nine previously dead persistence tests now pass.
Diffstat (limited to 'apps/web/src/actions/keybinding.ts')
-rw-r--r--apps/web/src/actions/keybinding.ts20
1 files changed, 20 insertions, 0 deletions
diff --git a/apps/web/src/actions/keybinding.ts b/apps/web/src/actions/keybinding.ts
index aeec2fd6..a71b7e98 100644
--- a/apps/web/src/actions/keybinding.ts
+++ b/apps/web/src/actions/keybinding.ts
@@ -32,6 +32,26 @@ export function isKey(value: string): value is Key {
return KEY_SET.has(value);
}
+const MODIFIER_KEYS: readonly ModifierKeys[] = [
+ "ctrl",
+ "alt",
+ "shift",
+ "ctrl+shift",
+ "alt+shift",
+ "ctrl+alt",
+ "ctrl+alt+shift",
+];
+
+export function isShortcutKey(value: string): value is ShortcutKey {
+ if (isKey(value)) {
+ return true;
+ }
+ const parts = value.split("+");
+ const key = parts.at(-1) ?? "";
+ const modifiers = parts.slice(0, -1).join("+");
+ return (MODIFIER_KEYS as readonly string[]).includes(modifiers) && isKey(key);
+}
+
export type ModifierBasedShortcutKey = `${ModifierKeys}+${Key}`;
// Singular keybindings (these will be disabled when an input-ish area has been focused)
export type SingleCharacterShortcutKey = `${Key}`;