micro/packages/web/src/hooks/useOnClickOutside.tsx

25 lines
787 B
TypeScript

import { useEffect } from "react";
export function useOnClickOutside(ref: React.MutableRefObject<any>, handler: () => void) {
useEffect(() => {
const onClick = (event: Event) => {
if (!ref.current || ref.current.contains(event.target)) return;
handler();
};
const onKeyPress = (event: KeyboardEvent) => {
if (event.key !== "Escape") return;
handler();
};
document.addEventListener("mousedown", onClick);
document.addEventListener("touchstart", onClick);
document.addEventListener("keydown", onKeyPress);
return () => {
document.removeEventListener("mousedown", onClick);
document.removeEventListener("touchstart", onClick);
document.removeEventListener("keydown", onKeyPress);
};
}, [ref, handler]);
}