MophongLT / frontend /src /hooks /useKeyboardNavigation.js
gaialive's picture
Upload 170 files
227c43a verified
import { useEffect, useCallback } from 'react';
export const useKeyboardNavigation = (options = {}) => {
const {
onEscape,
onEnter,
onArrowUp,
onArrowDown,
onArrowLeft,
onArrowRight,
onTab,
enabled = true,
preventDefault = true,
} = options;
const handleKeyDown = useCallback((event) => {
if (!enabled) return;
const { key, ctrlKey, metaKey, shiftKey } = event;
// Handle different key combinations
switch (key) {
case 'Escape':
if (onEscape) {
if (preventDefault) event.preventDefault();
onEscape(event);
}
break;
case 'Enter':
if (onEnter) {
if (preventDefault) event.preventDefault();
onEnter(event);
}
break;
case 'ArrowUp':
if (onArrowUp) {
if (preventDefault) event.preventDefault();
onArrowUp(event);
}
break;
case 'ArrowDown':
if (onArrowDown) {
if (preventDefault) event.preventDefault();
onArrowDown(event);
}
break;
case 'ArrowLeft':
if (onArrowLeft) {
if (preventDefault) event.preventDefault();
onArrowLeft(event);
}
break;
case 'ArrowRight':
if (onArrowRight) {
if (preventDefault) event.preventDefault();
onArrowRight(event);
}
break;
case 'Tab':
if (onTab) {
if (preventDefault) event.preventDefault();
onTab(event, shiftKey);
}
break;
default:
break;
}
// Handle common shortcuts
if (ctrlKey || metaKey) {
switch (key) {
case 'k':
case 'K':
// Command palette shortcut
if (options.onCommandPalette) {
event.preventDefault();
options.onCommandPalette(event);
}
break;
case '/':
// Search shortcut
if (options.onSearch) {
event.preventDefault();
options.onSearch(event);
}
break;
default:
break;
}
}
}, [
enabled,
preventDefault,
onEscape,
onEnter,
onArrowUp,
onArrowDown,
onArrowLeft,
onArrowRight,
onTab,
options.onCommandPalette,
options.onSearch,
]);
useEffect(() => {
if (enabled) {
document.addEventListener('keydown', handleKeyDown);
return () => document.removeEventListener('keydown', handleKeyDown);
}
}, [enabled, handleKeyDown]);
return { handleKeyDown };
};
export default useKeyboardNavigation;