typescriptbeginner

useClickAway Hook

Fires a callback when a click is detected outside the referenced element.

typescript
import { useEffect, useRef, RefObject } from 'react';

export function useClickAway<T extends HTMLElement>(
  callback: (event: MouseEvent | TouchEvent) => void
): RefObject<T | null> {
  const ref = useRef<T | null>(null);
  const callbackRef = useRef(callback);

  useEffect(() => {
    callbackRef.current = callback;
  }, [callback]);

  useEffect(() => {
    const handler = (event: MouseEvent | TouchEvent) => {
      const el = ref.current;
      if (el && !el.contains(event.target as Node)) {
        callbackRef.current(event);
      }
    };

    document.addEventListener('mousedown', handler);
    document.addEventListener('touchstart', handler);
    return () => {
      document.removeEventListener('mousedown', handler);
      document.removeEventListener('touchstart', handler);
    };
  }, []);

  return ref;
}

Use Cases

  • Dropdown close on outside click
  • Modal dismiss

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.