All files / components/IntersectionObserver IntersectionObserver.svelte

100% Statements 44/44
75% Branches 9/12
100% Functions 1/1
100% Lines 44/44

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 451x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x  
<script lang="ts">
  import { createEventDispatcher, getContext, hasContext } from "svelte";
  import { browser } from "$app/environment";
  import warn from "$lib/util/warn";
  import { getRootObserver, type RootObserver } from "./observe";
  import key from "./key";
 
  const dispatch = createEventDispatcher();
 
  let lastTarget: Element | undefined = undefined;
 
  export let target: Element;
  export let once = false;
  export let enabled = true;
 
  let intersecting = false;
  $: if (enabled && intersecting) dispatch("intersect");
 
  let observerPromise: Promise<RootObserver | undefined>;
  let observer: RootObserver | undefined;
 
  if (enabled && browser && hasContext(key)) {
    observerPromise = getContext<Promise<RootObserver | undefined>>(key);
  } else if (browser && enabled) {
    warn(
      "<IntersectionObserver> was not wrapped in a <RootIntersectionObserver>. It will continue to work, but it is more efficient to wrap the page in a single <RootIntersectionObserver> that can be used by all <IntersectionObserver> components. A <RootIntersectionObserver> also allows you to pass options to the IntersectionObserver used behind the scenes."
    );
    observerPromise = Promise.resolve(getRootObserver());
  } else {
    observerPromise = Promise.resolve(undefined);
  }
 
  observerPromise.then((resolved) => (observer = resolved));
 
  $: if (enabled && observer) {
    if (target === lastTarget) break $;
    if (lastTarget) observer.unobserve(lastTarget);
    lastTarget = target;
    if (!target) break $;
    observer.observe(target, ({ isIntersecting }) => (intersecting = isIntersecting), { once });
  }
</script>
 
<slot {intersecting} />