|
|
<script lang="ts"> |
|
|
import { createEventDispatcher, onDestroy, onMount } from 'svelte'; |
|
|
const dispatch = createEventDispatcher(); |
|
|
|
|
|
let loaderElement: HTMLElement; |
|
|
|
|
|
let observer; |
|
|
let intervalId; |
|
|
|
|
|
onMount(() => { |
|
|
observer = new IntersectionObserver( |
|
|
(entries, observer) => { |
|
|
entries.forEach((entry) => { |
|
|
if (entry.isIntersecting) { |
|
|
intervalId = setInterval(() => { |
|
|
dispatch('visible'); |
|
|
}, 100); |
|
|
|
|
|
|
|
|
} else { |
|
|
clearInterval(intervalId); |
|
|
} |
|
|
}); |
|
|
}, |
|
|
{ |
|
|
root: null, |
|
|
rootMargin: '0px', |
|
|
threshold: 0.1 |
|
|
} |
|
|
); |
|
|
|
|
|
observer.observe(loaderElement); |
|
|
}); |
|
|
|
|
|
onDestroy(() => { |
|
|
observer.disconnect(); |
|
|
|
|
|
if (intervalId) { |
|
|
clearInterval(intervalId); |
|
|
} |
|
|
}); |
|
|
</script> |
|
|
|
|
|
<div bind:this={loaderElement}> |
|
|
<slot /> |
|
|
</div> |
|
|
|