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