Skip to content

Commit 9ae09f3

Browse files
authored
Merge pull request #110 from COW-dev/feat/#108
[FEAT] Select 컴포넌트 외부 클릭 시 닫기 기능 구현
2 parents d8b3f67 + 5c83625 commit 9ae09f3

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

src/shared/ui/Select/SelectButton.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export function SelectButton({
4646
onClick={onClick}
4747
className={cn(
4848
sizeVariants[size],
49-
'w-full border border-gray-200 bg-white font-semibold text-gray-400',
49+
'w-full border border-gray-200 bg-white font-semibold whitespace-nowrap text-gray-400',
5050
className
5151
)}
5252
{...props}

src/shared/ui/Select/SelectMain.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ComponentProps, ReactNode, useState } from 'react';
1+
import { ComponentProps, ReactNode, useState, useRef, useEffect } from 'react';
22

33
import { OptionList } from './OptionList';
44
import { SelectContext } from './Select.context';
@@ -30,12 +30,27 @@ type Props = {
3030

3131
export function SelectMain({ value, onChange, size = 'lg', defaultValue, children }: Props) {
3232
const [isOpen, setIsOpen] = useState(false);
33+
const ref = useRef<HTMLDivElement>(null);
3334

3435
const handleSelect = (option: string) => {
3536
setIsOpen(false);
3637
onChange?.(option);
3738
};
3839

40+
useEffect(() => {
41+
const handleClickOutside = (event: MouseEvent) => {
42+
if (ref.current && !ref.current.contains(event.target as Node)) {
43+
setIsOpen(false);
44+
}
45+
};
46+
if (isOpen) {
47+
document.addEventListener('mousedown', handleClickOutside);
48+
}
49+
return () => {
50+
document.removeEventListener('mousedown', handleClickOutside);
51+
};
52+
}, [isOpen]);
53+
3954
return (
4055
<SelectContext.Provider
4156
value={{
@@ -44,7 +59,7 @@ export function SelectMain({ value, onChange, size = 'lg', defaultValue, childre
4459
size: size,
4560
}}
4661
>
47-
<div className="relative w-full">
62+
<div ref={ref} className="relative w-full">
4863
<SelectButton
4964
selected={value || defaultValue}
5065
onClick={() => setIsOpen(!isOpen)}

0 commit comments

Comments
 (0)