Files
standardnotes-app-web/app/assets/javascripts/Hooks/useCloseOnClickOutside.ts
2022-05-03 10:51:40 -05:00

27 lines
879 B
TypeScript

import { useCallback, useEffect } from 'preact/hooks'
export function useCloseOnClickOutside(container: { current: HTMLDivElement | null }, callback: () => void): void {
const closeOnClickOutside = useCallback(
(event: { target: EventTarget | null }) => {
if (!container.current) {
return
}
const isDescendantOfContainer = container.current.contains(event.target as Node)
const isDescendantOfDialog = (event.target as HTMLElement).closest('[role="dialog"]')
if (!isDescendantOfContainer && !isDescendantOfDialog) {
callback()
}
},
[container, callback],
)
useEffect(() => {
document.addEventListener('click', closeOnClickOutside, { capture: true })
return () => {
document.removeEventListener('click', closeOnClickOutside, {
capture: true,
})
}
}, [closeOnClickOutside])
}