2023-01-04 15:35:11 +01:00
|
|
|
import { useEventListener } from '@chakra-ui/react'
|
|
|
|
|
import { RefObject } from 'react'
|
|
|
|
|
|
|
|
|
|
type Handler = (event: MouseEvent) => void
|
|
|
|
|
|
|
|
|
|
type Props<T> = {
|
|
|
|
|
ref: RefObject<T>
|
|
|
|
|
handler: Handler
|
2023-02-23 16:11:51 +01:00
|
|
|
capture?: boolean
|
2023-01-04 15:35:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const useOutsideClick = <T extends HTMLElement = HTMLElement>({
|
|
|
|
|
ref,
|
|
|
|
|
handler,
|
2023-02-23 16:11:51 +01:00
|
|
|
capture,
|
2023-01-04 15:35:11 +01:00
|
|
|
}: Props<T>): void => {
|
|
|
|
|
const triggerHandlerIfOutside = (event: MouseEvent) => {
|
|
|
|
|
const el = ref?.current
|
|
|
|
|
if (!el || el.contains(event.target as Node)) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
handler(event)
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-23 16:11:51 +01:00
|
|
|
useEventListener('pointerdown', triggerHandlerIfOutside, null, {
|
|
|
|
|
capture,
|
|
|
|
|
})
|
2023-01-04 15:35:11 +01:00
|
|
|
}
|