import { useEffect, useRef, RefObject } from 'react'; /** * Hook for detecting clicks outside an element * * Useful for closing dropdowns, modals, or popups when clicking outside. * Handles both mouse and touch events. * * @param handler - Callback function to run when click outside is detected * @returns Ref to attach to the element * * @example * ```typescript * function Dropdown() { * const [isOpen, setIsOpen] = useState(false); * const dropdownRef = useClickOutside(() => { * setIsOpen(false); * }); * * return ( *
* * {isOpen && ( *
* Option 1 * Option 2 *
* )} *
* ); * } * ``` */ export function useClickOutside( handler: (event: MouseEvent | TouchEvent) => void ): RefObject { const ref = useRef(null); useEffect(() => { const handleClickOutside = (event: MouseEvent | TouchEvent) => { if (ref.current && !ref.current.contains(event.target as Node)) { handler(event); } }; // Add event listeners document.addEventListener('mousedown', handleClickOutside); document.addEventListener('touchstart', handleClickOutside); return () => { // Cleanup document.removeEventListener('mousedown', handleClickOutside); document.removeEventListener('touchstart', handleClickOutside); }; }, [handler]); return ref; }