forked from getsentry/sentry-docs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclientUtils.ts
More file actions
31 lines (28 loc) · 759 Bytes
/
Copy pathclientUtils.ts
File metadata and controls
31 lines (28 loc) · 759 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import {useEffect} from 'react';
type ClickOutsideCallback = (event: MouseEvent) => void;
interface UseClickOutsideOpts<E extends HTMLElement> {
handler: ClickOutsideCallback;
ref: React.RefObject<E>;
enabled?: boolean;
}
export function useOnClickOutside<E extends HTMLElement>({
ref,
enabled = true,
handler,
}: UseClickOutsideOpts<E>) {
useEffect(() => {
const cb = (event: MouseEvent) => {
if (!enabled) {
return;
}
if (!(event.target instanceof Element)) {
return;
}
if (!ref.current?.contains(event.target)) {
handler(event);
}
};
document.addEventListener('click', cb);
return () => document.removeEventListener('click', cb);
}, [enabled, handler, ref]);
}