diff --git a/packages/client/src/components/HoverIndicator.svelte b/packages/client/src/components/HoverIndicator.svelte index 1dcaa0f422..bb5db38d73 100644 --- a/packages/client/src/components/HoverIndicator.svelte +++ b/packages/client/src/components/HoverIndicator.svelte @@ -2,6 +2,7 @@ import { onMount, onDestroy } from "svelte" import { builderStore } from "../store" import Indicator from "./Indicator.svelte" + import { domDebounce } from "../utils/domDebounce" let indicators = [] let interval @@ -34,11 +35,17 @@ indicators = newIndicators } + const debouncedUpdate = domDebounce(updatePosition) const onMouseOver = e => { const element = e.target.closest("[data-type='component']") - componentId = element?.dataset?.id - componentName = element?.dataset?.name + const newId = element?.dataset?.id + const newName = element?.dataset?.name + if (newId !== componentId) { + componentId = newId + componentName = newName + debouncedUpdate() + } } const onMouseLeave = () => { @@ -47,27 +54,33 @@ } onMount(() => { - interval = setInterval(updatePosition, 100) - window.addEventListener("mouseover", onMouseOver) - document.documentElement.addEventListener("mouseleave", onMouseLeave) + debouncedUpdate() + interval = setInterval(debouncedUpdate, 100) + document.addEventListener("mouseover", onMouseOver) + document.addEventListener("mouseleave", onMouseLeave) + document.addEventListener("scroll", debouncedUpdate, true) }) onDestroy(() => { clearInterval(interval) - window.removeEventListener("mouseover", onMouseOver) - document.documentElement.removeEventListener("mouseleave", onMouseLeave) + document.removeEventListener("mouseover", onMouseOver) + document.removeEventListener("mouseleave", onMouseLeave) + document.removeEventListener("scroll", debouncedUpdate, true) }) -{#if componentId !== $builderStore.selectedComponentId} - {#each indicators as indicator, idx} - - {/each} -{/if} +{#key componentId} + {#if componentId !== $builderStore.selectedComponentId} + {#each indicators as indicator, idx} + + {/each} + {/if} +{/key} diff --git a/packages/client/src/components/Indicator.svelte b/packages/client/src/components/Indicator.svelte index 5eb626bf9f..015c66abab 100644 --- a/packages/client/src/components/Indicator.svelte +++ b/packages/client/src/components/Indicator.svelte @@ -1,13 +1,17 @@
diff --git a/packages/client/src/components/SelectionIndicator.svelte b/packages/client/src/components/SelectionIndicator.svelte index a0265822bd..5e9a82e721 100644 --- a/packages/client/src/components/SelectionIndicator.svelte +++ b/packages/client/src/components/SelectionIndicator.svelte @@ -2,6 +2,7 @@ import { onMount, onDestroy } from "svelte" import { builderStore } from "../store" import Indicator from "./Indicator.svelte" + import { domDebounce } from "../utils/domDebounce" let indicators = [] let interval @@ -29,13 +30,17 @@ } indicators = newIndicators } + const debouncedUpdate = domDebounce(updatePosition) onMount(() => { - interval = setInterval(updatePosition, 100) + debouncedUpdate() + interval = setInterval(debouncedUpdate, 100) + document.addEventListener("scroll", debouncedUpdate, true) }) onDestroy(() => { clearInterval(interval) + document.removeEventListener("scroll", debouncedUpdate, true) }) diff --git a/packages/client/src/components/SettingsBar.svelte b/packages/client/src/components/SettingsBar.svelte index e8bfa30d93..1c72e2a951 100644 --- a/packages/client/src/components/SettingsBar.svelte +++ b/packages/client/src/components/SettingsBar.svelte @@ -2,6 +2,7 @@ import { onMount, onDestroy } from "svelte" import SettingsButton from "./SettingsButton.svelte" import { builderStore } from "../store" + import { domDebounce } from "../utils/domDebounce" const verticalOffset = 28 const horizontalOffset = 2 @@ -63,13 +64,17 @@ measured = true } } + const debouncedUpdate = domDebounce(updatePosition) onMount(() => { - interval = setInterval(updatePosition, 100) + debouncedUpdate() + interval = setInterval(debouncedUpdate, 100) + document.addEventListener("scroll", debouncedUpdate, true) }) onDestroy(() => { clearInterval(interval) + document.removeEventListener("scroll", debouncedUpdate, true) }) diff --git a/packages/client/src/utils/domDebounce.js b/packages/client/src/utils/domDebounce.js new file mode 100644 index 0000000000..b7fc017247 --- /dev/null +++ b/packages/client/src/utils/domDebounce.js @@ -0,0 +1,12 @@ +export const domDebounce = callback => { + let active = false + return e => { + if (!active) { + window.requestAnimationFrame(() => { + callback(e) + active = false + }) + active = true + } + } +}