1- import React , { ReactNode , useEffect , useRef , useState } from 'react'
1+ import React , { ReactNode , useCallback , useEffect , useRef , useState } from 'react'
22import { cn } from '../../lib/utils'
33import styles from './Dropdown.module.css'
44
@@ -19,7 +19,7 @@ interface DropdownProps {
1919 * </Dropdown>
2020 */
2121export default function Dropdown ( { label, align = 'left' , className, children } : DropdownProps ) {
22- const [ isOpen , setIsOpen ] = useState ( false )
22+ const [ isOpen , _setIsOpen ] = useState ( false )
2323 const [ focusedIndex , setFocusedIndex ] = useState ( - 1 )
2424
2525 const dropdownRef = useRef < HTMLDivElement > ( null )
@@ -34,15 +34,21 @@ export default function Dropdown({ label, align = 'left', className, children }:
3434 ) )
3535 }
3636
37+ const setIsOpen = useCallback ( ( value : React . SetStateAction < boolean > ) => {
38+ _setIsOpen ( prev => {
39+ const nextIsOpen = typeof value === 'function' ? value ( prev ) : value
40+ if ( nextIsOpen ) {
41+ // reset focus so we start at the first item
42+ setFocusedIndex ( 0 )
43+ }
44+ return nextIsOpen
45+ } )
46+ } , [ ] )
47+
3748 function toggleDropdown ( ) {
3849 setIsOpen ( prev => ! prev )
3950 }
4051
41- // reset focus so we start at the first item
42- useEffect ( ( ) => {
43- if ( isOpen ) setFocusedIndex ( 0 )
44- } , [ isOpen ] )
45-
4652 // whenever focusedIndex changes, focus the corresponding menu item
4753 useEffect ( ( ) => {
4854 if ( isOpen && focusedIndex >= 0 ) {
@@ -116,7 +122,7 @@ export default function Dropdown({ label, align = 'left', className, children }:
116122 document . removeEventListener ( 'keydown' , handleEscape )
117123 document . removeEventListener ( 'mousedown' , handleClickOutside )
118124 }
119- } , [ ] )
125+ } , [ setIsOpen ] )
120126
121127 return (
122128 < div
0 commit comments