Spaces:
Running
Running
File size: 1,368 Bytes
88b6846 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import { useEffect } from 'react';
interface Shortcuts {
[key: string]: () => void;
}
export function useKeyboardShortcuts(shortcuts: Shortcuts) {
useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
// Ignore if typing in an input
if (
document.activeElement?.tagName === 'INPUT' ||
document.activeElement?.tagName === 'TEXTAREA' ||
document.activeElement?.tagName === 'SELECT'
) {
return;
}
const key = event.key.toLowerCase();
const ctrl = event.ctrlKey || event.metaKey;
const shift = event.shiftKey;
// Construct key string like "ctrl+s" or "shift+arrowright"
let keyString = key;
if (shift) keyString = `shift+${keyString}`;
if (ctrl) keyString = `ctrl+${keyString}`;
if (shortcuts[keyString]) {
event.preventDefault();
shortcuts[keyString]();
} else if (shortcuts[key]) {
// Fallback for single keys
event.preventDefault();
shortcuts[key]();
}
};
window.addEventListener('keydown', handleKeyDown);
return () => window.removeEventListener('keydown', handleKeyDown);
}, [shortcuts]);
}
|