diff --git a/packages/@react-aria/autocomplete/src/useSearchAutocomplete.ts b/packages/@react-aria/autocomplete/src/useSearchAutocomplete.ts index d4a82e856cc..66088e0502f 100644 --- a/packages/@react-aria/autocomplete/src/useSearchAutocomplete.ts +++ b/packages/@react-aria/autocomplete/src/useSearchAutocomplete.ts @@ -59,7 +59,9 @@ export function useSearchAutocomplete(props: AriaSearchAutocompleteOptions listBoxRef, keyboardDelegate, onSubmit = () => {}, - onClear + onClear, + onKeyDown, + onKeyUp } = props; let {inputProps, clearButtonProps, descriptionProps, errorMessageProps} = useSearchField({ @@ -78,7 +80,9 @@ export function useSearchAutocomplete(props: AriaSearchAutocompleteOptions if (state.selectionManager.focusedKey === null) { onSubmit(value, null); } - } + }, + onKeyDown, + onKeyUp }, { value: state.inputValue, setValue: state.setInputValue @@ -93,7 +97,10 @@ export function useSearchAutocomplete(props: AriaSearchAutocompleteOptions listBoxRef, inputRef, onFocus: undefined, - onBlur: undefined + onFocusChange: undefined, + onBlur: undefined, + onKeyDown: undefined, + onKeyUp: undefined }, state ); diff --git a/packages/@react-spectrum/autocomplete/test/SearchAutocomplete.test.js b/packages/@react-spectrum/autocomplete/test/SearchAutocomplete.test.js index 8d1166f87df..18866ea5587 100644 --- a/packages/@react-spectrum/autocomplete/test/SearchAutocomplete.test.js +++ b/packages/@react-spectrum/autocomplete/test/SearchAutocomplete.test.js @@ -823,6 +823,36 @@ describe('SearchAutocomplete', function () { expect(items).toHaveLength(1); expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant'); }); + + it('input events are only fired once', function () { + let onKeyDown = jest.fn(); + let onKeyUp = jest.fn(); + let onFocus = jest.fn(); + let onInputChange = jest.fn(); + let onFocusChange = jest.fn(); + let onBlur = jest.fn(); + let {getByRole} = renderSearchAutocomplete({onKeyDown, onKeyUp, onFocus, onInputChange, onBlur, onFocusChange}); + + let searchAutocomplete = getByRole('combobox'); + typeText(searchAutocomplete, 'w'); + + act(() => { + jest.runAllTimers(); + }); + + expect(onKeyDown).toHaveBeenCalledTimes(1); + expect(onKeyUp).toHaveBeenCalledTimes(1); + expect(onFocus).toHaveBeenCalledTimes(1); + expect(onInputChange).toHaveBeenCalledTimes(1); + expect(onFocusChange).toHaveBeenCalledTimes(1); + expect(onBlur).toHaveBeenCalledTimes(0); + + act(() => { + userEvent.tab(); + }); + + expect(onBlur).toHaveBeenCalledTimes(1); + }); }); describe('blur', function () {