|
import { useEffect, RefObject } from 'react'; |
|
type Handler = () => void; |
|
|
|
export default function useOnClickOutside( |
|
ref: RefObject<HTMLElement>, |
|
handler: Handler, |
|
excludeIds: string[], |
|
): void { |
|
useEffect(() => { |
|
const handleClickOutside = (event: MouseEvent) => { |
|
const target = event.target as Node | null; |
|
if (target && 'id' in target && excludeIds.includes((target as HTMLElement).id)) { |
|
return; |
|
} |
|
|
|
if (ref.current && !ref.current.contains(target)) { |
|
handler(); |
|
} |
|
}; |
|
|
|
document.addEventListener('mousedown', handleClickOutside); |
|
return () => { |
|
document.removeEventListener('mousedown', handleClickOutside); |
|
}; |
|
|
|
}, [ref, handler]); |
|
} |
|
|