react-use/src/useClickAway.ts
jeetiss 3305f39c51 save callback independently
add deps for skip useless event sub/unsub
2019-06-14 22:18:22 +03:00

32 lines
838 B
TypeScript

import { RefObject, useEffect, useRef } from 'react';
import { off, on } from './util';
const defaultEvents = ['mousedown', 'touchstart'];
const useClickAway = (
ref: RefObject<HTMLElement | null>,
onClickAway: (event: KeyboardEvent) => void,
events: string[] = defaultEvents
) => {
const savedCallback = useRef(onClickAway);
useEffect(() => {
savedCallback.current = onClickAway;
}, [onClickAway]);
useEffect(() => {
const handler = event => {
const { current: el } = ref;
el && !el.contains(event.target) && savedCallback.current(event);
};
for (const eventName of events) {
on(document, eventName, handler);
}
return () => {
for (const eventName of events) {
off(document, eventName, handler);
}
};
}, [events, ref]);
};
export default useClickAway;