( elementRef: RefObject<HTMLElement>, callback: (event: MouseEvent) => void )
| 1 | import { RefObject, useEffect, useRef } from "react"; |
| 2 | |
| 3 | export function useClickOutside( |
| 4 | elementRef: RefObject<HTMLElement>, |
| 5 | callback: (event: MouseEvent) => void |
| 6 | ) { |
| 7 | const callbackRef = useRef<(event: MouseEvent) => void>(); |
| 8 | callbackRef.current = callback; |
| 9 | |
| 10 | useEffect(() => { |
| 11 | const handleClickOutside = (e: MouseEvent) => { |
| 12 | if (!elementRef?.current || !callbackRef.current) { |
| 13 | return; |
| 14 | } |
| 15 | |
| 16 | if (e.target instanceof Element) { |
| 17 | if (!elementRef.current.contains(e.target)) { |
| 18 | callbackRef.current(e); |
| 19 | } |
| 20 | } |
| 21 | }; |
| 22 | |
| 23 | document.addEventListener("click", handleClickOutside, true); |
| 24 | |
| 25 | return () => { |
| 26 | document.removeEventListener("click", handleClickOutside, true); |
| 27 | }; |
| 28 | }, [callbackRef, elementRef]); |
| 29 | } |
nothing calls this directly
no outgoing calls
no test coverage detected