Skip to content

Commit 8169ca5

Browse files
authored
feat(hotkeys): hook for keyboard shortcuts COMPASS-6551 (#4108)
1 parent 8531c2c commit 8169ca5

File tree

12 files changed

+444
-333
lines changed

12 files changed

+444
-333
lines changed

package-lock.json

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/compass-aggregations/src/components/focus-mode/focus-mode-modal-header.tsx

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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';
1517
import { connect } from 'react-redux';
1618
import type { RootState } from '../../modules';
1719
import {
@@ -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+
7380
export 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

Comments
 (0)