Skip to content

Commit c57671e

Browse files
authored
Make useSearchField behave close to browser (#6404)
Make `useSearchField` behave close to browser
1 parent 96e4caf commit c57671e

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

packages/@react-aria/searchfield/src/useSearchField.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,23 +49,26 @@ export function useSearchField(
4949
let {
5050
isDisabled,
5151
isReadOnly,
52-
onSubmit = () => {},
52+
onSubmit,
5353
onClear,
5454
type = 'search'
5555
} = props;
5656

5757
let onKeyDown = (e) => {
5858
const key = e.key;
5959

60-
if (key === 'Enter') {
60+
if (key === 'Enter' && (isDisabled || isReadOnly)) {
6161
e.preventDefault();
6262
}
6363

6464
if (isDisabled || isReadOnly) {
6565
return;
6666
}
6767

68-
if (key === 'Enter') {
68+
// for backward compatibility;
69+
// otherwise, "Enter" on an input would trigger a form submit, the default browser behavior
70+
if (key === 'Enter' && onSubmit) {
71+
e.preventDefault();
6972
onSubmit(state.value);
7073
}
7174

packages/@react-aria/searchfield/test/useSearchField.test.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,21 +67,20 @@ describe('useSearchField hook', () => {
6767
onSubmit.mockClear();
6868
});
6969

70-
it('preventDefault is called for Enter and not Escape', () => {
70+
it('preventDefault and stopPropagation are not called for Escape', () => {
7171
let {inputProps} = renderSearchHook({});
72-
inputProps.onKeyDown(event('Enter'));
73-
expect(preventDefault).toHaveBeenCalledTimes(1);
7472
inputProps.onKeyDown(event('Escape'));
75-
expect(preventDefault).toHaveBeenCalledTimes(1);
73+
expect(preventDefault).toHaveBeenCalledTimes(0);
74+
expect(stopPropagation).toHaveBeenCalledTimes(0);
7675
});
7776

78-
it('stopPropagation is not called for Escape', () => {
79-
let {inputProps} = renderSearchHook({});
80-
inputProps.onKeyDown(event('Escape'));
81-
expect(stopPropagation).toHaveBeenCalledTimes(0);
77+
it('preventDefault is not called for Enter if onSubmit is not provided', () => {
78+
let {inputProps} = renderSearchHook();
79+
inputProps.onKeyDown(event('Enter'));
80+
expect(preventDefault).toHaveBeenCalledTimes(0);
8281
});
8382

84-
it('onSubmit is called if Enter is pressed', () => {
83+
it('preventDefault and onSubmit are called for Enter if submit is provided', () => {
8584
let {inputProps} = renderSearchHook({onSubmit});
8685
inputProps.onKeyDown(event('Enter'));
8786
expect(onSubmit).toHaveBeenCalledTimes(1);

0 commit comments

Comments
 (0)