UNPKG

@fluent-windows/hooks

Version:
40 lines (36 loc) 967 B
/** * Subscribe to events that click on a location other than the specified element. * * Demo * import { useClickOutside } from '@fluent-windows/hooks' * * const reference = React.useRef(null) * * useClickOutside( * reference, * (): void => { * // ... * } * ) * * <div ref={reference}>xxx</div> */ import * as React from 'react'; function useClickOutside(ref, handler) { React.useEffect(() => { const listener = event => { // @ts-ignore if (!ref.current || typeof ref.current.contains === 'function' && event.target && ref.current.contains(event.target)) { return; } handler(event); }; document.addEventListener('mousedown', listener); document.addEventListener('touchstart', listener); return () => { document.removeEventListener('mousedown', listener); document.removeEventListener('touchstart', listener); }; }, [ref, handler]); } export default useClickOutside;