Skip to content

Commit cae0884

Browse files
authored
fix(useCombobox): initial focus behaviour (#1526)
* fix(useCombobox): initial focus behaviour * use getInitialValue * remove unneeded tests
1 parent b498830 commit cae0884

File tree

3 files changed

+48
-26
lines changed

3 files changed

+48
-26
lines changed

src/hooks/useCombobox/__tests__/getInputProps.test.js

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
mouseMoveItemAtIndex,
1717
tab,
1818
clickOnInput,
19+
initialFocusAndOpenTestCases,
1920
} from '../testUtils'
2021
import utils from '../../utils'
2122
import useCombobox from '..'
@@ -413,29 +414,28 @@ describe('getInputProps', () => {
413414
})
414415

415416
describe('initial focus', () => {
416-
test('is grabbed when isOpen is passed as true', () => {
417-
renderCombobox({isOpen: true})
418-
419-
expect(getInput()).toHaveFocus()
420-
})
421-
422-
test('is grabbed when initialIsOpen is passed as true', () => {
423-
renderCombobox({initialIsOpen: true})
424-
425-
expect(getInput()).toHaveFocus()
426-
})
427-
428-
test('is grabbed when defaultIsOpen is passed as true', () => {
429-
renderCombobox({defaultIsOpen: true})
430-
431-
expect(getInput()).toHaveFocus()
432-
})
433-
434-
test('is not grabbed when initial open is set to default (false)', () => {
435-
renderCombobox()
436-
437-
expect(getInput()).not.toHaveFocus()
438-
})
417+
for (const [
418+
initialIsOpen,
419+
defaultIsOpen,
420+
isOpen,
421+
status,
422+
] of initialFocusAndOpenTestCases) {
423+
/* eslint-disable */
424+
test(`is ${
425+
status ? '' : 'not '
426+
}grabbed when initialIsOpen: ${initialIsOpen}, defaultIsOpen: ${defaultIsOpen} and props.isOpen: ${isOpen}`, () => {
427+
renderCombobox({isOpen, defaultIsOpen, initialIsOpen})
428+
429+
if (status) {
430+
expect(getInput()).toHaveFocus()
431+
expect(getItems()).toHaveLength(items.length)
432+
} else {
433+
expect(getInput()).not.toHaveFocus()
434+
expect(getItems()).toHaveLength(0)
435+
}
436+
})
437+
/* eslint-enable */
438+
}
439439
})
440440

441441
describe('event handlers', () => {

src/hooks/useCombobox/index.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
useControlPropsValidator,
1212
useElementIds,
1313
getItemAndIndex,
14+
getInitialValue,
1415
} from '../utils'
1516
import {
1617
getInitialState,
@@ -31,8 +32,6 @@ function useCombobox(userProps = {}) {
3132
...userProps,
3233
}
3334
const {
34-
initialIsOpen,
35-
defaultIsOpen,
3635
items,
3736
scrollIntoView,
3837
environment,
@@ -106,7 +105,7 @@ function useCombobox(userProps = {}) {
106105
})
107106
// Focus the input on first render if required.
108107
useEffect(() => {
109-
const focusOnOpen = initialIsOpen || defaultIsOpen || isOpen
108+
const focusOnOpen = getInitialValue(props, 'isOpen')
110109

111110
if (focusOnOpen && inputRef.current) {
112111
inputRef.current.focus()

src/hooks/useCombobox/testUtils.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,26 @@ function DropdownCombobox({renderSpy, renderItem, ...props}) {
117117
export const renderUseCombobox = props => {
118118
return renderHook(() => useCombobox({items, ...props}))
119119
}
120+
121+
// format is: [initialIsOpen, defaultIsOpen, props.isOpen, menu is open && input is focused]
122+
export const initialFocusAndOpenTestCases = [
123+
[undefined, undefined, undefined, false],
124+
[undefined, undefined, true, true],
125+
[true, true, true, true],
126+
[true, false, true, true],
127+
[false, true, true, true],
128+
[false, false, true, true],
129+
[undefined, undefined, false, false],
130+
[true, true, false, false],
131+
[true, false, false, false],
132+
[false, true, false, false],
133+
[false, false, false, false],
134+
[false, undefined, undefined, false],
135+
[false, false, undefined, false],
136+
[false, true, undefined, false],
137+
[true, undefined, undefined, true],
138+
[true, false, undefined, true],
139+
[true, true, undefined, true],
140+
[undefined, false, undefined, false],
141+
[undefined, true, undefined, true],
142+
]

0 commit comments

Comments
 (0)