import { useEffect, type RefObject } from 'react' type Event = MouseEvent | TouchEvent export const useClickOutside = ( reference: RefObject, handler: (event: Event) => void, ) => { useEffect(() => { const listener = (event: Event) => { const element = reference?.current if (!element || element.contains((event?.target as Node) || undefined)) { return } handler(event) } document.addEventListener('mousedown', listener) document.addEventListener('touchstart', listener) return () => { document.removeEventListener('mousedown', listener) document.removeEventListener('touchstart', listener) } }, [reference, handler]) }