Skip to content

Commit 7f03f18

Browse files
committed
fix eslint error, by removing sync state change in useEffect
https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
1 parent 19423f4 commit 7f03f18

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

src/components/Dropdown/Dropdown.tsx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { ReactNode, useEffect, useRef, useState } from 'react'
1+
import React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react'
22
import { cn } from '../../lib/utils'
33
import styles from './Dropdown.module.css'
44

@@ -19,7 +19,7 @@ interface DropdownProps {
1919
* </Dropdown>
2020
*/
2121
export 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

Comments
 (0)