@shopgate/engage
Version:
Shopgate's ENGAGE library.
8 lines • 1.15 kB
JavaScript
import{useEffect,useCallback}from'react';/**
* Hook to handle a single keyboard shortcut.
* Supports both 'cmd' (meta) and 'ctrl' keys explicitly.
*
* @param {string} shortcut - Shortcut string using mac-style notation, e.g. 'cmd+i'.
* @param {Function} callback - Function to call when the shortcut is triggered.
*/export function useShortcut(shortcut,callback){var normalizeShortcut=useCallback(function(){return shortcut.toLowerCase().split('+').map(function(k){return k.trim();}).sort().join('+');},[shortcut]);var handleKeyDown=useCallback(function(event){var keys=[];if(event.ctrlKey)keys.push('ctrl');if(event.metaKey)keys.push('cmd');// Treat meta as cmd
if(event.altKey)keys.push('alt');if(event.shiftKey)keys.push('shift');var key=event.key.toLowerCase();if(!['control','meta','alt','shift'].includes(key)){keys.push(key);}var pressed=keys.sort().join('+');if(pressed===normalizeShortcut()){event.preventDefault();callback(event);}},[callback,normalizeShortcut]);useEffect(function(){window.addEventListener('keydown',handleKeyDown);return function(){return window.removeEventListener('keydown',handleKeyDown);};},[handleKeyDown]);}