| | <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> |
| |
|