@portabletext/keyboard-shortcuts
Version:
Create platform-aware keyboard shortcuts with automatic detection of Apple vs non-Apple platforms
48 lines (43 loc) • 1.42 kB
text/typescript
import type {KeyboardEventDefinition} from './keyboard-event-definition'
/**
* Checks if a keyboard event matches a keyboard shortcut definition.
*/
export function isKeyboardShortcut<
TKeyboardEvent extends Pick<
KeyboardEvent,
'key' | 'code' | 'shiftKey' | 'altKey' | 'ctrlKey' | 'metaKey'
> = Pick<
KeyboardEvent,
'key' | 'code' | 'shiftKey' | 'altKey' | 'ctrlKey' | 'metaKey'
>,
>(definition: KeyboardEventDefinition, event: TKeyboardEvent) {
if (!isCorrectModifiers(definition, event)) {
return false
}
if (
definition.code !== undefined &&
definition.code.toLowerCase() === event.code.toLowerCase()
) {
return true
}
return (
definition.key !== undefined &&
definition.key.toLowerCase() === event.key.toLowerCase()
)
}
function isCorrectModifiers<
TKeyboardEvent extends Pick<
KeyboardEvent,
'key' | 'code' | 'shiftKey' | 'altKey' | 'ctrlKey' | 'metaKey'
> = Pick<
KeyboardEvent,
'key' | 'code' | 'shiftKey' | 'altKey' | 'ctrlKey' | 'metaKey'
>,
>(definition: KeyboardEventDefinition, event: TKeyboardEvent) {
return (
(definition.ctrl === event.ctrlKey || definition.ctrl === undefined) &&
(definition.meta === event.metaKey || definition.meta === undefined) &&
(definition.shift === event.shiftKey || definition.shift === undefined) &&
(definition.alt === event.altKey || definition.alt === undefined)
)
}