Skip to content

Commit b9a3899

Browse files
authored
fix: prevent calling onClose() when shiftKey, ctrlKey or metaKey is pressed (#1870)
1 parent d0c15d6 commit b9a3899

File tree

5 files changed

+39
-10
lines changed

5 files changed

+39
-10
lines changed

packages/docsearch-react/src/DocSearchModal.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,13 @@ import type {
2020
import { useSearchClient } from './useSearchClient';
2121
import { useTouchEvents } from './useTouchEvents';
2222
import { useTrapFocus } from './useTrapFocus';
23-
import { groupBy, identity, noop, removeHighlightTags } from './utils';
23+
import {
24+
groupBy,
25+
identity,
26+
noop,
27+
removeHighlightTags,
28+
isModifierEvent,
29+
} from './utils';
2430

2531
export type ModalTranslations = Partial<{
2632
searchBox: SearchBoxTranslations;
@@ -156,7 +162,7 @@ export function DocSearchModal({
156162
onSelect({ item, event }) {
157163
saveRecentSearch(item);
158164

159-
if (!event.shiftKey && !event.ctrlKey && !event.metaKey) {
165+
if (!isModifierEvent(event)) {
160166
onClose();
161167
}
162168
},
@@ -172,7 +178,7 @@ export function DocSearchModal({
172178
onSelect({ item, event }) {
173179
saveRecentSearch(item);
174180

175-
if (!event.shiftKey && !event.ctrlKey && !event.metaKey) {
181+
if (!isModifierEvent(event)) {
176182
onClose();
177183
}
178184
},
@@ -256,7 +262,7 @@ export function DocSearchModal({
256262
onSelect({ item, event }) {
257263
saveRecentSearch(item);
258264

259-
if (!event.shiftKey && !event.ctrlKey && !event.metaKey) {
265+
if (!isModifierEvent(event)) {
260266
onClose();
261267
}
262268
},
@@ -431,9 +437,11 @@ export function DocSearchModal({
431437
inputRef={inputRef}
432438
translations={screenStateTranslations}
433439
getMissingResultsUrl={getMissingResultsUrl}
434-
onItemClick={(item) => {
440+
onItemClick={(item, event) => {
435441
saveRecentSearch(item);
436-
onClose();
442+
if (!isModifierEvent(event)) {
443+
onClose();
444+
}
437445
}}
438446
/>
439447
</div>

packages/docsearch-react/src/Results.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ interface ResultsProps<TItem extends BaseItem>
2424
runDeleteTransition: (cb: () => void) => void;
2525
runFavoriteTransition: (cb: () => void) => void;
2626
}) => React.ReactNode;
27-
onItemClick: (item: TItem) => void;
27+
onItemClick: (item: TItem, event: KeyboardEvent | MouseEvent) => void;
2828
hitComponent: DocSearchProps['hitComponent'];
2929
}
3030

@@ -104,8 +104,8 @@ function Result<TItem extends StoredDocSearchHit>({
104104
{...getItemProps({
105105
item,
106106
source: collection.source,
107-
onClick() {
108-
onItemClick(item);
107+
onClick(event) {
108+
onItemClick(item, event);
109109
},
110110
})}
111111
>

packages/docsearch-react/src/ScreenState.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ export interface ScreenStateProps<TItem extends BaseItem>
3232
state: AutocompleteState<TItem>;
3333
recentSearches: StoredSearchPlugin<StoredDocSearchHit>;
3434
favoriteSearches: StoredSearchPlugin<StoredDocSearchHit>;
35-
onItemClick: (item: InternalDocSearchHit) => void;
35+
onItemClick: (
36+
item: InternalDocSearchHit,
37+
event: KeyboardEvent | MouseEvent
38+
) => void;
3639
inputRef: React.MutableRefObject<HTMLInputElement | null>;
3740
hitComponent: DocSearchProps['hitComponent'];
3841
indexName: DocSearchProps['indexName'];
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from './groupBy';
22
export * from './identity';
3+
export * from './isModifierEvent';
34
export * from './noop';
45
export * from './removeHighlightTags';
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* Detect when an event is modified with a special key to let the browser
3+
* trigger its default behavior.
4+
*/
5+
export function isModifierEvent<TEvent extends KeyboardEvent | MouseEvent>(
6+
event: TEvent
7+
): boolean {
8+
const isMiddleClick = (event as MouseEvent).button === 1;
9+
10+
return (
11+
isMiddleClick ||
12+
event.altKey ||
13+
event.ctrlKey ||
14+
event.metaKey ||
15+
event.shiftKey
16+
);
17+
}

0 commit comments

Comments
 (0)