Spaces:
Sleeping
Sleeping
| /** | |
| * useClickOutside Hook - Detect clicks outside a ref element | |
| * | |
| * Useful for closing dropdowns, modals, etc. | |
| */ | |
| import { useEffect } from 'react'; | |
| export const useClickOutside = ( | |
| ref: React.RefObject<HTMLElement>, | |
| handler: () => void | |
| ): void => { | |
| useEffect(() => { | |
| const listener = (event: MouseEvent | TouchEvent) => { | |
| // Do nothing if clicking ref's element or descendent elements | |
| if (!ref.current || ref.current.contains(event.target as Node)) { | |
| return; | |
| } | |
| handler(); | |
| }; | |
| document.addEventListener('mousedown', listener); | |
| document.addEventListener('touchstart', listener); | |
| return () => { | |
| document.removeEventListener('mousedown', listener); | |
| document.removeEventListener('touchstart', listener); | |
| }; | |
| }, [ref, handler]); | |
| }; | |