UNPKG

@gilbarbara/hooks

Version:

Collection of useful React hooks

26 lines (19 loc) 648 B
import { useEffect, useRef } from 'react'; import { useMemoizedValue } from './useMemoizedValue'; import { off, on } from './utils'; export function useClickOutside<T extends Element = HTMLElement>(callback: () => void) { const ref = useRef<T>(null); const memoizedCallback = useMemoizedValue(callback); useEffect(() => { const handleClick = (event: MouseEvent | TouchEvent) => { if (!ref.current?.contains(event.target as Node)) { memoizedCallback(); } }; on(document, 'click', handleClick); return () => { off(document, 'click', handleClick); }; }, [memoizedCallback]); return ref; }