Files
veridian/app/composables/useKeyboardShortcuts.ts
T

48 lines
1.3 KiB
TypeScript

export const useKeyboardShortcuts = () => {
const shortcutsMap = new Map<string, (event: KeyboardEvent) => void>();
const normalize = (combo: string[]) =>
combo.map(k => k.toLowerCase()).sort().join('+');
const addShortcut = (combo: string[], callback: (event: KeyboardEvent) => void) => {
const normalizedKey = normalize(combo);
shortcutsMap.set(normalizedKey, callback);
return () => {
shortcutsMap.delete(normalizedKey);
};
};
const handleKeyDown = (event: KeyboardEvent) => {
const keys: string[] = [];
if (event.ctrlKey) keys.push('ctrl');
if (event.metaKey) keys.push('meta');
if (event.shiftKey) keys.push('shift');
if (event.altKey) keys.push('alt');
const mainKey = event.key.toLowerCase();
if (!['control', 'shift', 'meta', 'alt'].includes(mainKey)) {
keys.push(mainKey);
}
const pressedCombo = normalize(keys);
if (shortcutsMap.has(pressedCombo)) {
shortcutsMap.get(pressedCombo)!(event);
}
};
onMounted(() => {
document.addEventListener('keydown', handleKeyDown);
});
onUnmounted(() => {
document.removeEventListener('keydown', handleKeyDown);
});
return {
addShortcut,
handleKeyDown,
};
};