import { Ref, watchEffect, ref } from 'vue'; interface IntersectionObserverProps { target: Ref; root?: Ref; onIntersect: IntersectionObserverCallback; rootMargin?: string; threshold?: number; } export function useIntersectionObserver({ target, root, onIntersect, rootMargin = '0px', threshold = 0.1, }: IntersectionObserverProps) { let cleanup = () => {}; const observer: Ref> = ref(null); const stopEffect = watchEffect(() => { cleanup(); observer.value = new IntersectionObserver(onIntersect, { root: root ? root.value : null, rootMargin, threshold, }); const current = target.value; current && observer.value.observe(current); cleanup = () => { if (observer.value) { observer.value.disconnect(); target.value && observer.value.unobserve(target.value); } }; }); return { observer, stop: () => { cleanup(); stopEffect(); }, }; }