Skip to content

Commit cbebb9e

Browse files
committed
Add outside click close function
1 parent 48760a6 commit cbebb9e

File tree

1 file changed

+21
-2
lines changed
  • packages/components/src/components/Select

1 file changed

+21
-2
lines changed

packages/components/src/components/Select/index.tsx

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@
22

33
import { Box, css, Flex, VStack } from '@devup-ui/react'
44
import clsx from 'clsx'
5-
import { ComponentProps, createContext, useContext, useState } from 'react'
5+
import {
6+
ComponentProps,
7+
createContext,
8+
useContext,
9+
useEffect,
10+
useRef,
11+
useState,
12+
} from 'react'
613

714
import { Button } from '../Button'
815
import { IconCheck } from './IconCheck'
@@ -39,11 +46,22 @@ export function Select({
3946
open: openProp,
4047
onOpenChange,
4148
}: SelectProps) {
49+
const ref = useRef<HTMLDivElement>(null)
4250
const [open, setOpen] = useState(openProp ?? false)
4351
const [value, setValue] = useState<SelectValue<typeof type>>(
4452
type === 'checkbox' ? [] : '',
4553
)
4654

55+
useEffect(() => {
56+
if (!ref.current) return
57+
const handleOutsideClick = (e: MouseEvent) => {
58+
if (ref.current?.contains(e.target as Node)) return
59+
setOpen(false)
60+
}
61+
document.addEventListener('click', handleOutsideClick)
62+
return () => document.removeEventListener('click', handleOutsideClick)
63+
}, [open, setOpen])
64+
4765
const handleOpenChange = (open: boolean) => {
4866
setOpen(open)
4967
onOpenChange?.(open)
@@ -72,7 +90,7 @@ export function Select({
7290
type,
7391
}}
7492
>
75-
<Box display="inline-block" pos="relative">
93+
<Box ref={ref} display="inline-block" pos="relative">
7694
{children}
7795
</Box>
7896
</SelectContext.Provider>
@@ -108,6 +126,7 @@ export function SelectTrigger({
108126

109127
export function SelectContainer({ children, ...props }: ComponentProps<'div'>) {
110128
const { open } = useSelect()
129+
111130
if (!open) return null
112131
return (
113132
<VStack

0 commit comments

Comments
 (0)