@seasketch/geoprocessing
Version:
Geoprocessing and reporting framework for SeaSketch 2.0
35 lines (29 loc) • 916 B
text/typescript
import React, { useEffect, useRef } from "react";
interface ClickOutsideProps {
ref: React.RefObject<HTMLDivElement>;
}
/**
* Creates and returns reference to a div element, which the caller can
* populate. `callback` is invoked if a click occurs outside of the reference
* Useful for dropdown implementation
*/
export default function useClickOutside(
callback: (...args: any[]) => void,
): ClickOutsideProps {
const ref = useRef<HTMLDivElement>(null);
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
if (
ref.current &&
!ref.current.contains(event.target as HTMLDivElement)
) {
Reflect.apply(callback, null, [false]);
}
};
document.addEventListener("click", handleClickOutside, true);
return () => {
document.removeEventListener("click", handleClickOutside, true);
};
}, [callback]);
return { ref };
}