infoalloggi-monorepo/apps/infoalloggi/src/hooks/useClickOutside.tsx

29 lines
794 B
TypeScript
Raw Normal View History

2025-08-04 17:45:44 +02:00
import { type RefObject, useEffect } from "react";
export function useClickOutside<T extends HTMLElement>(
refs: RefObject<T | null>[],
handler: (event: MouseEvent | TouchEvent) => void,
): void {
useEffect(() => {
const handleClickOutside = (event: MouseEvent | TouchEvent) => {
if (
refs.some(
(ref) => ref.current && ref.current.contains(event.target as Node),
)
) {
return;
}
handler(event);
};
document.addEventListener("mousedown", handleClickOutside);
document.addEventListener("touchstart", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
document.removeEventListener("touchstart", handleClickOutside);
};
}, [refs, handler]);
}