11import "./css/Dropdown.css" ;
22import sortIcon from "../img/sort.svg" ;
33import arrowDownIcon from "../img/arrow_down.svg" ;
4- import { createContext , useContext , useRef , useEffect } from "react" ;
4+ import { createContext , useContext , useRef } from "react" ;
5+ import useClickOutside from "../hooks/useClickOutside" ;
56const DropdownContext = createContext ( ) ;
67
78const Dropdown = ( {
89 children,
910 className = "" ,
10- onClickDropdown ,
11- onClickDropdownItem ,
11+ onToggleDropdown ,
12+ onDropdownItemClick ,
1213 onCloseDropdown = ( ) => { } ,
1314 dropdownList,
1415 showDropdown,
1516 value,
1617} ) => {
1718 const dropdownRef = useRef ( null ) ;
18-
19- // 외부 클릭 시 드롭다운 닫기
20- useEffect ( ( ) => {
21- const handleClickOutside = ( e ) => {
22- if ( dropdownRef . current && ! dropdownRef . current . contains ( e . target ) ) {
23- onCloseDropdown ( ) ;
24- }
25- } ;
26- window . addEventListener ( "click" , handleClickOutside ) ;
27- return ( ) => window . removeEventListener ( "click" , handleClickOutside ) ;
28- } , [ onCloseDropdown ] ) ;
19+ useClickOutside ( dropdownRef , onCloseDropdown ) ;
2920
3021 return (
3122 < DropdownContext . Provider
3223 value = { {
3324 className,
34- onClickDropdown ,
35- onClickDropdownItem ,
25+ onToggleDropdown ,
26+ onDropdownItemClick ,
3627 onCloseDropdown,
3728 dropdownList,
3829 showDropdown,
@@ -47,9 +38,9 @@ const Dropdown = ({
4738} ;
4839
4940const Button = ( ) => {
50- const { value, onClickDropdown } = useContext ( DropdownContext ) ;
41+ const { value, onToggleDropdown } = useContext ( DropdownContext ) ;
5142 return (
52- < div className = "dropdown__button" onClick = { onClickDropdown } >
43+ < div className = "dropdown__button" onClick = { onToggleDropdown } >
5344 < span className = "dropdown__text" > { value . name } </ span >
5445 < img
5546 src = { arrowDownIcon }
@@ -62,15 +53,15 @@ const Button = () => {
6253} ;
6354
6455const List = ( { listClassName = "" } ) => {
65- const { showDropdown, dropdownList, onClickDropdownItem } =
56+ const { showDropdown, dropdownList, onDropdownItemClick } =
6657 useContext ( DropdownContext ) ;
6758 if ( ! showDropdown ) return null ;
6859 return (
6960 < ul className = { `dropdown__list ${ listClassName } ` } >
7061 { dropdownList ?. map ( ( item , index ) => (
7162 < li
7263 key = { `${ item . value } -${ index } ` }
73- onClick = { ( ) => onClickDropdownItem ( item ) }
64+ onClick = { ( ) => onDropdownItemClick ( item ) }
7465 >
7566 { item . name }
7667 </ li >
0 commit comments