123456789101112131415161718192021222324252627282930313233 |
- import {useEffect} from 'react';
- 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;
-
- 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);
- };
- },
-
- [ref, handler]
- );
- }
- export default useOnClickOutside;
|