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