import { useEffect, useRef, RefObject } from 'react';
export function useClickOutside<T extends HTMLElement>(
onOutside: (e: MouseEvent | TouchEvent) => void
): RefObject<T> {
const ref = useRef<T>(null);
useEffect(() => {
const handler = (e: MouseEvent | TouchEvent) => {
if (ref.current && !ref.current.contains(e.target as Node)) {
onOutside(e);
}
};
document.addEventListener('mousedown', handler);
document.addEventListener('touchstart', handler);
return () => {
document.removeEventListener('mousedown', handler);
document.removeEventListener('touchstart', handler);
};
}, [onOutside]);
return ref;
}
function Dropdown() {
const [open, setOpen] = useState(false);
const ref = useClickOutside<HTMLDivElement>(() => setOpen(false));
return <div ref={ref}>{open && <Menu />}</div>;
}
Create a free account and build your private vault. Share publicly whenever you want.