/** * Calls the close callback when a click happened outside of the rootElement. * * @param event The "click" event object. * @param rootElement * @param closeCallback A closure function to call when the click event happened outside of the rootElement. */ export const closeWhenClickedOutside = (event: MouseEvent, rootElement: HTMLElement, closeCallback: () => void) => { // We walk up the tree to see if any parent of the clicked element is the root element. // If it is not, we call the close callback. We're doing all this hassle to only call the // closing callback when a click happens outside of the rootElement. let parent = (event.target as HTMLElement)?.parentElement while (parent !== rootElement) { if (parent === null || parent.parentElement === null) { parent = null break } parent = parent.parentElement } if (parent === rootElement) { return } closeCallback() }