Skip to content

Commit 42c65e6

Browse files
authored
SearchAutocomplete: fix duplicate events (#4337)
1 parent 2784d3b commit 42c65e6

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

packages/@react-aria/autocomplete/src/useSearchAutocomplete.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ export function useSearchAutocomplete<T>(props: AriaSearchAutocompleteOptions<T>
5959
listBoxRef,
6060
keyboardDelegate,
6161
onSubmit = () => {},
62-
onClear
62+
onClear,
63+
onKeyDown,
64+
onKeyUp
6365
} = props;
6466

6567
let {inputProps, clearButtonProps, descriptionProps, errorMessageProps} = useSearchField({
@@ -78,7 +80,9 @@ export function useSearchAutocomplete<T>(props: AriaSearchAutocompleteOptions<T>
7880
if (state.selectionManager.focusedKey === null) {
7981
onSubmit(value, null);
8082
}
81-
}
83+
},
84+
onKeyDown,
85+
onKeyUp
8286
}, {
8387
value: state.inputValue,
8488
setValue: state.setInputValue
@@ -93,7 +97,10 @@ export function useSearchAutocomplete<T>(props: AriaSearchAutocompleteOptions<T>
9397
listBoxRef,
9498
inputRef,
9599
onFocus: undefined,
96-
onBlur: undefined
100+
onFocusChange: undefined,
101+
onBlur: undefined,
102+
onKeyDown: undefined,
103+
onKeyUp: undefined
97104
},
98105
state
99106
);

packages/@react-spectrum/autocomplete/test/SearchAutocomplete.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,36 @@ describe('SearchAutocomplete', function () {
823823
expect(items).toHaveLength(1);
824824
expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
825825
});
826+
827+
it('input events are only fired once', function () {
828+
let onKeyDown = jest.fn();
829+
let onKeyUp = jest.fn();
830+
let onFocus = jest.fn();
831+
let onInputChange = jest.fn();
832+
let onFocusChange = jest.fn();
833+
let onBlur = jest.fn();
834+
let {getByRole} = renderSearchAutocomplete({onKeyDown, onKeyUp, onFocus, onInputChange, onBlur, onFocusChange});
835+
836+
let searchAutocomplete = getByRole('combobox');
837+
typeText(searchAutocomplete, 'w');
838+
839+
act(() => {
840+
jest.runAllTimers();
841+
});
842+
843+
expect(onKeyDown).toHaveBeenCalledTimes(1);
844+
expect(onKeyUp).toHaveBeenCalledTimes(1);
845+
expect(onFocus).toHaveBeenCalledTimes(1);
846+
expect(onInputChange).toHaveBeenCalledTimes(1);
847+
expect(onFocusChange).toHaveBeenCalledTimes(1);
848+
expect(onBlur).toHaveBeenCalledTimes(0);
849+
850+
act(() => {
851+
userEvent.tab();
852+
});
853+
854+
expect(onBlur).toHaveBeenCalledTimes(1);
855+
});
826856
});
827857

828858
describe('blur', function () {

0 commit comments

Comments
 (0)