Loader.svelte 943 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. <script lang="ts">
  2. import { createEventDispatcher, onDestroy, onMount } from 'svelte';
  3. const dispatch = createEventDispatcher();
  4. let loaderElement: HTMLElement;
  5. let observer;
  6. let intervalId;
  7. onMount(() => {
  8. observer = new IntersectionObserver(
  9. (entries, observer) => {
  10. entries.forEach((entry) => {
  11. if (entry.isIntersecting) {
  12. intervalId = setInterval(() => {
  13. dispatch('visible');
  14. }, 100);
  15. // dispatch('visible');
  16. // observer.unobserve(loaderElement); // Stop observing until content is loaded
  17. } else {
  18. clearInterval(intervalId);
  19. }
  20. });
  21. },
  22. {
  23. root: null, // viewport
  24. rootMargin: '0px',
  25. threshold: 0.1 // When 10% of the loader is visible
  26. }
  27. );
  28. observer.observe(loaderElement);
  29. });
  30. onDestroy(() => {
  31. observer.disconnect();
  32. if (intervalId) {
  33. clearInterval(intervalId);
  34. }
  35. });
  36. </script>
  37. <div bind:this={loaderElement}>
  38. <slot />
  39. </div>