|
|
<script lang="ts"> |
|
|
import { onMount } from "svelte"; |
|
|
interface Props { |
|
|
onvisible?: () => void; |
|
|
} |
|
|
|
|
|
let { onvisible }: Props = $props(); |
|
|
|
|
|
let loader: HTMLDivElement | undefined = $state(); |
|
|
let observer: IntersectionObserver; |
|
|
let intervalId: ReturnType<typeof setInterval> | undefined; |
|
|
|
|
|
onMount(() => { |
|
|
if (!loader) { |
|
|
return; |
|
|
} |
|
|
|
|
|
observer = new IntersectionObserver((entries) => { |
|
|
entries.forEach((entry) => { |
|
|
if (entry.isIntersecting) { |
|
|
|
|
|
if (intervalId) { |
|
|
clearInterval(intervalId); |
|
|
} |
|
|
|
|
|
intervalId = setInterval(() => { |
|
|
onvisible?.(); |
|
|
}, 250); |
|
|
} else { |
|
|
|
|
|
if (intervalId) { |
|
|
clearInterval(intervalId); |
|
|
intervalId = undefined; |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
observer.observe(loader); |
|
|
|
|
|
return () => { |
|
|
observer.disconnect(); |
|
|
if (intervalId) { |
|
|
clearInterval(intervalId); |
|
|
} |
|
|
}; |
|
|
}); |
|
|
</script> |
|
|
|
|
|
<div bind:this={loader} class="h-2"></div> |
|
|
|