@fluent-windows/hooks
Version:
Fluent-Windows React hooks.
40 lines (36 loc) • 967 B
JavaScript
/**
* 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;