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);
							 | 
						||
| 
								 | 
							
								}
							 |