2025-10-03 16:51:44 +02:00
|
|
|
import { onBeforeUnmount, onMounted, type Ref } from 'vue';
|
2025-09-23 14:18:04 +02:00
|
|
|
|
2025-10-03 16:51:44 +02:00
|
|
|
export default function useClickOutside(component: Ref<HTMLElement | null>, callback: () => void) {
|
|
|
|
|
if (!component) return;
|
|
|
|
|
const listener = (event: MouseEvent) => {
|
|
|
|
|
if (event.target !== component.value && event.composedPath().includes(component.value as EventTarget)) {
|
|
|
|
|
return;
|
2025-09-23 14:18:04 +02:00
|
|
|
}
|
2025-10-03 16:51:44 +02:00
|
|
|
if (typeof callback === 'function') {
|
|
|
|
|
callback();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
window.addEventListener('click', listener);
|
|
|
|
|
});
|
|
|
|
|
onBeforeUnmount(() => {
|
|
|
|
|
window.removeEventListener('click', listener);
|
|
|
|
|
});
|
2025-09-23 14:18:04 +02:00
|
|
|
|
2025-10-03 16:51:44 +02:00
|
|
|
return { listener };
|
|
|
|
|
}
|