mirror of
https://github.com/prymitive/karma
synced 2026-05-07 03:26:52 +00:00
34 lines
859 B
TypeScript
34 lines
859 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
|
|
) {
|
|
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 };
|