import { play , pause , stop , adjustVolume , toggleRepeat , toggleShuffle , openMediaFileDialog , seekForward , seekBackward , reverseList , nextN , next , previous , toggleDoubleSizeMode , toggleWindow , } from "./actionCreators" ; import { TOGGLE_TIME_MODE , TOGGLE_LLAMA_MODE } from "./actionTypes" ; import { Dispatch } from "./types" ; const IGNORE_EVENTS_FROM_TAGS = new Set ( [ "input" , "textarea" , "select" ] ) ; export function bindHotkeys ( dispatch ) { let currentPos = 0 ; const trigger = [ 78 , 85 , 76 , 76 , 83 , 79 , 70 , 84 , ] ; const listener = ( e ) => { if ( e . target instanceof Element && IGNORE_EVENTS_FROM_TAGS . has ( e . target . tagName . toLowerCase ( ) ) ) { return ; } if ( e . ctrlKey ) { switch ( e . keyCode ) { case 68 : dispatch ( toggleDoubleSizeMode ( ) ) ; e . preventDefault ( ) ; break ; case 76 : break ; case 82 : dispatch ( reverseList ( ) ) ; break ; case 84 : dispatch ( { type : TOGGLE_TIME_MODE } ) ; break ; } } else if ( e . altKey ) { switch ( e . keyCode ) { case 87 : dispatch ( toggleWindow ( "main" ) ) ; break ; case 69 : dispatch ( toggleWindow ( "playlist" ) ) ; break ; case 71 : dispatch ( toggleWindow ( "equalizer" ) ) ; break ; } } else { switch ( e . keyCode ) { case 37 : dispatch ( seekBackward ( 5 ) ) ; break ; case 38 : dispatch ( adjustVolume ( 1 ) ) ; break ; case 39 : dispatch ( seekForward ( 5 ) ) ; break ; case 40 : dispatch ( adjustVolume ( - 1 ) ) ; break ; case 66 : dispatch ( next ( ) ) ; break ; case 67 : dispatch ( pause ( ) ) ; break ; case 76 : dispatch ( openMediaFileDialog ( ) ) ; break ; case 82 : dispatch ( toggleRepeat ( ) ) ; break ; case 83 : dispatch ( toggleShuffle ( ) ) ; break ; case 86 : dispatch ( stop ( ) ) ; break ; case 88 : dispatch ( play ( ) ) ; break ; case 90 : dispatch ( previous ( ) ) ; break ; case 96 : dispatch ( openMediaFileDialog ( ) ) ; break ; case 97 : dispatch ( nextN ( - 10 ) ) ; break ; case 98 : dispatch ( adjustVolume ( - 1 ) ) ; break ; case 99 : dispatch ( nextN ( 10 ) ) ; break ; case 100 : dispatch ( previous ( ) ) ; break ; case 101 : dispatch ( play ( ) ) ; break ; case 102 : dispatch ( next ( ) ) ; break ; case 103 : dispatch ( seekBackward ( 5 ) ) ; break ; case 104 : dispatch ( adjustVolume ( 1 ) ) ; break ; case 105 : dispatch ( seekForward ( 5 ) ) ; break ; } } if ( e . keyCode !== 27 ) { currentPos = e . keyCode === trigger [ currentPos ] ? currentPos + 1 : 0 ; if ( currentPos === trigger . length ) { dispatch ( { type : TOGGLE_LLAMA_MODE } ) ; } } } ; document . addEventListener ( "keydown" , listener ) ; return ( ) => { document . removeEventListener ( "keydown" , listener ) ; } ; }