frigate/web/src/routes/Events/hooks/useClickOutside.jsx

23 lines
857 B
React
Raw Normal View History

2021-08-28 18:56:48 +03:00
import { useCallback, useEffect, useRef, useState } from 'preact/hooks';
2021-08-28 22:35:48 +03:00
// https://stackoverflow.com/a/54292872/2693528
2021-08-28 18:56:48 +03:00
export const useOuterClick = (callback) => {
const callbackRef = useRef(); // initialize mutable ref, which stores callback
const innerRef = useRef(); // returned to client, who marks "border" element
// update cb on each render, so second useEffect has access to current value
useEffect(() => {
callbackRef.current = callback;
});
useEffect(() => {
document.addEventListener('click', handleClick);
return () => document.removeEventListener('click', handleClick);
function handleClick(e) {
if (innerRef.current && callbackRef.current && !innerRef.current.contains(e.target)) callbackRef.current(e);
}
2021-08-28 22:35:48 +03:00
}, []);
2021-08-28 18:56:48 +03:00
return innerRef; // convenience for client (doesn't need to init ref himself)
};