Files
karma/ui/src/Hooks/useOnClickOutside.ts
2023-07-25 19:16:46 +01:00

34 lines
867 B
TypeScript

import { useEffect, RefObject } from "react";
type Handler = (event: MouseEvent | TouchEvent) => void;
// https://usehooks.com/useOnClickOutside/
function useOnClickOutside(
ref: RefObject<HTMLElement>,
handler: Handler,
enabled: boolean,
): void {
useEffect(() => {
const listener: { (event: MouseEvent | TouchEvent): void } = (
event: MouseEvent | TouchEvent,
) => {
if (!ref.current || ref.current.contains(event.target as Node)) {
return;
}
handler(event);
};
if (enabled) {
document.addEventListener("mousedown", listener);
document.addEventListener("touchstart", listener);
}
return () => {
document.removeEventListener("mousedown", listener);
document.removeEventListener("touchstart", listener);
};
}, [ref, handler, enabled]);
}
export { useOnClickOutside };