You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			58 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			TypeScript
		
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			TypeScript
		
	
| 
											1 year ago
										 | import useKey, { Handler, KeyPredicate, UseKeyOptions } from 'react-use/lib/useKey'; | ||
|  | 
 | ||
|  | function specialKeyPressed(event: KeyboardEvent) { | ||
|  |   const pressed = []; | ||
|  | 
 | ||
|  |   if (event.metaKey) { | ||
|  |     pressed.push('super'); | ||
|  |   } | ||
|  |   if (event.ctrlKey) { | ||
|  |     pressed.push('ctrl'); | ||
|  |   } | ||
|  |   if (event.altKey) { | ||
|  |     pressed.push('alt'); | ||
|  |   } | ||
|  |   if (event.shiftKey) { | ||
|  |     pressed.push('shift'); | ||
|  |   } | ||
|  | 
 | ||
|  |   return pressed.join(' + '); | ||
|  | } | ||
|  | 
 | ||
|  | export function useHotkey( | ||
|  |   key: string, | ||
|  |   onPress: (event: KeyboardEvent) => void | Promise<void>, | ||
|  |   disabled?: boolean | ||
|  | ) { | ||
|  |   const opts: UseKeyOptions<HTMLElement> = {}; | ||
|  | 
 | ||
|  |   const predicate: KeyPredicate = event => { | ||
|  |     const lowerKey = key.toLowerCase(); | ||
|  |     const eventKey = event.key.toLowerCase(); | ||
|  | 
 | ||
|  |     switch (lowerKey) { | ||
|  |       case 'esc': | ||
|  |       case 'escape': | ||
|  |         return eventKey === 'escape' || eventKey === 'esc'; | ||
|  |       default: | ||
|  |         return eventKey === lowerKey; | ||
|  |     } | ||
|  |   }; | ||
|  | 
 | ||
|  |   const handler: Handler = event => { | ||
|  |     if (disabled) { | ||
|  |       return; | ||
|  |     } | ||
|  | 
 | ||
|  |     const specialKeys = specialKeyPressed(event); | ||
|  | 
 | ||
|  |     if (specialKeys) { | ||
|  |       return; | ||
|  |     } | ||
|  | 
 | ||
|  |     void onPress(event); | ||
|  |   }; | ||
|  | 
 | ||
|  |   useKey(predicate, handler, opts); | ||
|  | } |