@@ -10,8 +10,10 @@ import {
1010 spacing ,
1111 Toggle ,
1212 Tooltip ,
13+ useHotkeys ,
14+ formatHotkey ,
1315} from '@mongodb-js/compass-components' ;
14- import React , { useEffect , useState } from 'react' ;
16+ import React , { useState } from 'react' ;
1517import { connect } from 'react-redux' ;
1618import type { RootState } from '../../modules' ;
1719import {
@@ -70,6 +72,11 @@ const tooltipContentItemStyles = css({
7072 flexShrink : 0 ,
7173} ) ;
7274
75+ const PREVIOUS_STAGE_HOTKEY = 'meta+shift+9' ;
76+ const NEXT_STAGE_HOTKEY = 'meta+shift+0' ;
77+ const ADD_STAGE_AFTER_HOTKEY = 'meta+shift+a' ;
78+ const ADD_STAGE_BEFORE_HOTKEY = 'meta+shift+b' ;
79+
7380export const FocusModeModalHeader : React . FunctionComponent <
7481 FocusModeModalHeaderProps
7582> = ( {
@@ -82,34 +89,6 @@ export const FocusModeModalHeader: React.FunctionComponent<
8289} ) => {
8390 const [ menuOpen , setMenuOpen ] = useState ( false ) ;
8491
85- const keyEventListener = ( e : KeyboardEvent ) => {
86- const isShiftKey = e . shiftKey ;
87- const isCtrlOrMetaKey = e . ctrlKey || e . metaKey ;
88- if ( ! isShiftKey || ! isCtrlOrMetaKey ) {
89- return ;
90- }
91-
92- switch ( e . key ) {
93- case '9' :
94- return onPreviousStage ( ) ;
95- case '0' :
96- return onNextStage ( ) ;
97- case 'a' :
98- return onAddStageAfter ( ) ;
99- case 'b' :
100- return onAddStageBefore ( ) ;
101- default :
102- return ;
103- }
104- } ;
105-
106- useEffect ( ( ) => {
107- window . addEventListener ( 'keydown' , keyEventListener ) ;
108- return ( ) => {
109- window . removeEventListener ( 'keydown' , keyEventListener ) ;
110- } ;
111- } , [ keyEventListener ] ) ;
112-
11392 const isFirst = stageIndex === 0 ;
11493 const isLast = stages . length - 1 === stageIndex ;
11594
@@ -137,6 +116,11 @@ export const FocusModeModalHeader: React.FunctionComponent<
137116 setMenuOpen ( false ) ;
138117 } ;
139118
119+ useHotkeys ( PREVIOUS_STAGE_HOTKEY , onPreviousStage ) ;
120+ useHotkeys ( NEXT_STAGE_HOTKEY , onNextStage ) ;
121+ useHotkeys ( ADD_STAGE_AFTER_HOTKEY , onAddStageAfter ) ;
122+ useHotkeys ( ADD_STAGE_BEFORE_HOTKEY , onAddStageBefore ) ;
123+
140124 const stageSelectLabels = stages . map ( ( stageName , index ) => {
141125 return `Stage ${ index + 1 } : ${ stageName ?? 'select' } ` ;
142126 } ) ;
@@ -179,7 +163,9 @@ export const FocusModeModalHeader: React.FunctionComponent<
179163 < span className = { tooltipContentItemStyles } >
180164 Go to previous stage
181165 </ span >
182- < span className = { tooltipContentItemStyles } > Ctrl + Shift + 9</ span >
166+ < span className = { tooltipContentItemStyles } >
167+ { formatHotkey ( PREVIOUS_STAGE_HOTKEY ) }
168+ </ span >
183169 </ Body >
184170 </ Tooltip >
185171 { /* @ts -expect-error leafygreen unresonably expects a labelledby here */ }
@@ -227,7 +213,9 @@ export const FocusModeModalHeader: React.FunctionComponent<
227213 >
228214 < Body className = { tooltipContentStyles } >
229215 < span > Go to next stage</ span >
230- < span > Ctrl + Shift + 0</ span >
216+ < span className = { tooltipContentItemStyles } >
217+ { formatHotkey ( NEXT_STAGE_HOTKEY ) }
218+ </ span >
231219 </ Body >
232220 </ Tooltip >
233221 </ div >
@@ -283,14 +271,14 @@ export const FocusModeModalHeader: React.FunctionComponent<
283271 < MenuItem
284272 className = { menuItemStyles }
285273 onClick = { onAddStageAfter }
286- data-hotkey = "Ctrl + Shift + A"
274+ data-hotkey = { formatHotkey ( ADD_STAGE_AFTER_HOTKEY ) }
287275 >
288276 Add stage after
289277 </ MenuItem >
290278 < MenuItem
291279 className = { menuItemStyles }
292280 onClick = { onAddStageBefore }
293- data-hotkey = "Ctrl + Shift + B"
281+ data-hotkey = { formatHotkey ( ADD_STAGE_BEFORE_HOTKEY ) }
294282 >
295283 Add stage before
296284 </ MenuItem >
0 commit comments