magner
Version:
Universal admin panel magnetic to any backend
31 lines (27 loc) • 860 B
text/typescript
import { onMounted, onUnmounted } from 'vue';
import { isInWhiteList } from 'lib/utils/helpers/white-list';
/**
* Function adds a click-event listener, checks event target and fires callback function if needed
*
* @param contentId
* @param targetSelector
* @param callback
*/
export const useClickOutside = (contentId: string, targetSelector: string, callback: (e: EventTarget) => void) => {
const clickedOutside = (e: MouseEvent) => {
const content = document.getElementById(contentId) || undefined;
if (
e.target
&& !(e.target as HTMLElement).closest(targetSelector)
&& !isInWhiteList(e.target, content)
) {
callback(e.target);
}
};
onMounted(() => {
document.addEventListener('click', clickedOutside);
});
onUnmounted(() => {
document.removeEventListener('click', clickedOutside);
});
};