Skip to content

Commit a512335

Browse files
authored
feat: Prevent long press of enter (#1053)
* feat: Prevent long press of enter * feat: lint * feat: test * feat: test * feat: 优化代码 * feat: test * feat: 优化代码 * feat: 判断方式 * feat: 删除判断 * feat: 优化代码 * feat: reviewg * feat: review
1 parent 66b6667 commit a512335

File tree

4 files changed

+45
-7
lines changed

4 files changed

+45
-7
lines changed

src/BaseSelect/index.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import classNames from 'classnames';
33
import useLayoutEffect from 'rc-util/lib/hooks/useLayoutEffect';
44
import useMergedState from 'rc-util/lib/hooks/useMergedState';
55
import isMobile from 'rc-util/lib/isMobile';
6-
import KeyCode from 'rc-util/lib/KeyCode';
76
import { useComposeRef } from 'rc-util/lib/ref';
87
import type { ScrollConfig, ScrollTo } from 'rc-virtual-list/lib/List';
98
import * as React from 'react';
@@ -480,13 +479,16 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
480479
* - false: Search text is not empty when first time backspace down
481480
*/
482481
const [getClearLock, setClearLock] = useLock();
482+
const keyLockRef = React.useRef(false);
483483

484484
// KeyDown
485485
const onInternalKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (event, ...rest) => {
486486
const clearLock = getClearLock();
487-
const { which } = event;
487+
const { key } = event;
488488

489-
if (which === KeyCode.ENTER) {
489+
const isEnterKey = key === 'Enter';
490+
491+
if (isEnterKey) {
490492
// Do not submit form when type in the input
491493
if (mode !== 'combobox') {
492494
event.preventDefault();
@@ -502,7 +504,7 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
502504

503505
// Remove value by `backspace`
504506
if (
505-
which === KeyCode.BACKSPACE &&
507+
key === 'Backspace' &&
506508
!clearLock &&
507509
multiple &&
508510
!mergedSearchValue &&
@@ -529,10 +531,14 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
529531
}
530532
}
531533

532-
if (mergedOpen) {
534+
if (mergedOpen && (!isEnterKey || !keyLockRef.current)) {
533535
listRef.current?.onKeyDown(event, ...rest);
534536
}
535537

538+
if (isEnterKey) {
539+
keyLockRef.current = true;
540+
}
541+
536542
onKeyDown?.(event, ...rest);
537543
};
538544

@@ -541,7 +547,9 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
541547
if (mergedOpen) {
542548
listRef.current?.onKeyUp(event, ...rest);
543549
}
544-
550+
if (event.key === 'Enter') {
551+
keyLockRef.current = false;
552+
}
545553
onKeyUp?.(event, ...rest);
546554
};
547555

tests/Multiple.test.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
findSelection,
1717
removeSelection,
1818
keyDown,
19+
keyUp,
1920
} from './utils/common';
2021
import allowClearTest from './shared/allowClearTest';
2122
import { fireEvent, render } from '@testing-library/react';
@@ -294,6 +295,25 @@ describe('Select.Multiple', () => {
294295
expect(onChange).toHaveBeenCalledWith([2], expect.anything());
295296
});
296297

298+
it('should prevent long press of enter', () => {
299+
const onChange = jest.fn();
300+
const { container } = render(
301+
<Select mode="multiple" onChange={onChange}>
302+
<Option value={1}>1</Option>
303+
<Option value={2}>2</Option>
304+
</Select>,
305+
);
306+
307+
toggleOpen(container);
308+
fireEvent.mouseMove(container.querySelectorAll('.rc-select-item-option')[1]);
309+
310+
keyDown(container.querySelector('input'), KeyCode.ENTER);
311+
keyDown(container.querySelector('input'), KeyCode.ENTER);
312+
keyUp(container.querySelector('input'), KeyCode.ENTER);
313+
expectOpen(container);
314+
expect(onChange).toHaveBeenCalledTimes(1);
315+
});
316+
297317
it('enter twice to cancel the selection', () => {
298318
const onChange = jest.fn();
299319
const { container } = render(
@@ -306,7 +326,7 @@ describe('Select.Multiple', () => {
306326
toggleOpen(container);
307327
fireEvent.mouseMove(container.querySelectorAll('.rc-select-item-option')[0]);
308328
keyDown(container.querySelector('input'), KeyCode.ENTER);
309-
329+
keyUp(container.querySelector('input'), KeyCode.ENTER);
310330
fireEvent.mouseMove(container.querySelectorAll('.rc-select-item-option')[0]);
311331
keyDown(container.querySelector('input'), KeyCode.ENTER);
312332

tests/Select.test.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
findSelection,
2626
injectRunAllTimers,
2727
keyDown,
28+
keyUp,
2829
selectItem,
2930
toggleOpen,
3031
} from './utils/common';
@@ -1469,6 +1470,7 @@ describe('Select.Basic', () => {
14691470
for (let i = 0; i < 10; i += 1) {
14701471
onSelect.mockReset();
14711472
keyDown(container.querySelector('input'), KeyCode.ENTER);
1473+
keyUp(container.querySelector('input'), KeyCode.ENTER);
14721474
expect(onSelect).toHaveBeenCalledWith('1', expect.anything());
14731475
}
14741476
});

tests/utils/common.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,11 @@ export function keyDown(element: HTMLElement, keyCode: number) {
106106
fireEvent(element, event);
107107
});
108108
}
109+
110+
export function keyUp(element: HTMLElement, keyCode: number) {
111+
const event = createEvent.keyUp(element, { keyCode });
112+
113+
act(() => {
114+
fireEvent(element, event);
115+
});
116+
}

0 commit comments

Comments
 (0)