Vercel/src/utility/useKeydownHandler.ts
Sam Becker b7cb6715b7
Speed up category hovers (#279)
* Extract out ShareHover components
* Refactor hover/category state
* Rename photo query options types
* Restore category count slice of app state
* Streamline entity hover headers
* Standardize swr keys
* Suppress hover counts to years
* Refine entity hover design
* Make image hovers opt out
2025-07-04 12:19:45 -05:00

45 lines
1.2 KiB
TypeScript

import { useAppState } from '@/app/AppState';
import { useCallback, useEffect } from 'react';
const LISTENER_KEYDOWN = 'keydown';
export default function useKeydownHandler({
onKeyDown: onKeyDownArg,
keys,
ignoreShouldRespondToKeyboardCommands = false,
}: {
onKeyDown?: (e: KeyboardEvent) => void
keys?: string[]
ignoreShouldRespondToKeyboardCommands?: boolean
}) {
const { shouldRespondToKeyboardCommands } = useAppState();
const onKeyDown = useCallback((e: KeyboardEvent) => {
const isKeyValid = (
!keys ||
keys.some(key => key.toUpperCase() === e.key?.toUpperCase())
);
const isTextEntry = (
document.activeElement?.tagName === 'INPUT' ||
document.activeElement?.tagName === 'TEXTAREA'
);
if (isKeyValid && !isTextEntry) {
onKeyDownArg?.(e);
}
}, [onKeyDownArg, keys]);
useEffect(() => {
if (
shouldRespondToKeyboardCommands ||
ignoreShouldRespondToKeyboardCommands
) {
window.addEventListener(LISTENER_KEYDOWN, onKeyDown);
return () => window.removeEventListener(LISTENER_KEYDOWN, onKeyDown);
}
}, [
shouldRespondToKeyboardCommands,
ignoreShouldRespondToKeyboardCommands,
onKeyDown,
]);
}