123456789101112131415161718192021222324252627282930313233 |
- import {useEffect} from 'react';
- // hook from https://usehooks.com/useOnClickOutside/
- function useOnClickOutside<T extends HTMLElement = HTMLElement>(
- ref: React.RefObject<T>,
- handler: (event: MouseEvent | TouchEvent) => void
- ) {
- useEffect(
- () => {
- const listener = (event: MouseEvent | TouchEvent) => {
- const el = ref?.current;
- // Do nothing if clicking ref's element or descendent elements
- if (!el || el.contains(event.target as Node)) {
- return;
- }
- handler(event);
- };
- document.addEventListener('mousedown', listener);
- document.addEventListener('touchstart', listener);
- return () => {
- document.removeEventListener('mousedown', listener);
- document.removeEventListener('touchstart', listener);
- };
- },
- // Reload only if ref or handler changes
- [ref, handler]
- );
- }
- export default useOnClickOutside;
|