Skip to content

Instantly share code, notes, and snippets.

@hrdtbs
Created May 30, 2019 06:55
Show Gist options
  • Save hrdtbs/676ee0d955aacdc51a2ab212566323b8 to your computer and use it in GitHub Desktop.
Save hrdtbs/676ee0d955aacdc51a2ab212566323b8 to your computer and use it in GitHub Desktop.
import { useEffect, useRef } from "react"
export const useOnClickOutside = <T extends HTMLDivElement>(handler?: (event: MouseEvent | TouchEvent) => void) => {
const ref = useRef<T>(null)
useEffect(() => {
const listener = (event: MouseEvent | TouchEvent) => {
if (handler) {
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])
return ref
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment