A React hook for effortlessly capturing and validating keyboard shortcut keys.
- Record keyboard shortcuts with modifier keys (Ctrl, Alt, Shift, Meta/Command)
- Customizable validation rules:
- Min/max number of modifier keys
- Excluded keys and modifiers
- Excluded shortcut combinations
https://stackblitz.com/edit/react-brtovrsp?file=Shortcut.jsx
npm install use-shortcut-recorderimport { useShortcutRecorder } from 'use-shortcut-recorder';
function ShortcutInput() {
const {
shortcut,
savedShortcut,
isRecording,
error,
startRecording,
stopRecording,
resetRecording,
clearLastRecording,
} = useShortcutRecorder({
onChange: (newShortcut) => {
console.log('Shortcut changed:', newShortcut);
},
excludedKeys: ['KeyA', 'KeyB'],
excludedShortcuts: [
['Alt', 'KeyM'],
['Meta', 'KeyZ']
],
excludedModKeys: ['Control'],
maxModKeys: 3,
minModKeys: 1,
} );
return (
<div>
<label htmlFor="shortcut-input">Enter Shortcut:</label>
<input
id="shortcut-input"
type="text"
className='shortcut-input'
placeholder={
isRecording ? 'Key Recording Started..' : 'Click to Record Shortcut..'
}
onFocus={startRecording}
onClick={startRecording}
onBlur={() => stopRecording()}
value={isRecording
? shortcut.join(' + ')
: savedShortcut.join(' + ')}
readOnly={true}
/>
{error && <div>{error.message}</div>}
{savedShortcut && (
<div>
Saved Shortcut: <strong>{savedShortcut.join(' + ')}</strong>
</div>
)}
<button onClick={clearLastRecording}>Reset</button>
</div>
);
}
The useShortcutRecorder hook accepts a configuration object with the following properties:
| Option | Type | Default | Description |
|---|---|---|---|
onChange |
(keys: string[]) => void |
() => {} |
Callback function called when a valid shortcut is recorded |
excludedShortcuts |
string[][] |
[[]] |
Array of shortcut combinations to exclude |
excludedModKeys |
string[] |
[] |
Array of modifier keys to exclude |
excludedKeys |
string[] |
[] |
Array of non-modifier keys to exclude |
minModKeys |
number |
0 |
Minimum number of modifier keys required |
maxModKeys |
number |
4 |
Maximum number of modifier keys allowed |
The hook returns an object with the following properties:
| Property | Type | Description |
|---|---|---|
shortcut |
string[] |
Current shortcut being recorded |
savedShortcut |
string[] |
Last successfully recorded shortcut |
isRecording |
boolean |
Whether the recorder is currently active |
error |
ShortcutRecorderError |
Current error state |
startRecording |
() => void |
Function to start recording |
stopRecording |
() => void |
Function to stop recording |
resetRecording |
() => void |
Function to reset current recording |
clearLastRecording |
() => void |
Function to clear saved shortcut |
The error object contains a code and message. Possible error codes:
| Error Code | Description |
|---|---|
NONE |
No error |
MAX_MOD_KEYS_EXCEEDED |
Too many modifier keys used |
MIN_MOD_KEYS_REQUIRED |
Not enough modifier keys used |
MOD_KEY_NOT_ALLOWED |
Modifier key is in the excluded list |
KEY_NOT_ALLOWED |
Non-modifier key is in the excluded list |
SHORTCUT_NOT_ALLOWED |
Shortcut combination is in the excluded list |
This hook uses keyboard event codes for key identification. For consistency and cross-browser compatibility, all left/right variations of modifier keys (e.g., ShiftLeft/ShiftRight, ControlLeft/ControlRight) are normalized to their base name (e.g., Shift, Control). Specifically, both MetaLeft/MetaRight and the now-deprecated OSLeft/OSRight are mapped to Meta for the Windows/Command key.
MIT