Spaces:
Runtime error
Runtime error
refactor: migrating ScrollToBottomBtn to svelte-5 (#1709)
Browse files* refactor: migrating ScrollToBottomBtn to svelte-5
* fix: infinite loop on the scrolltobottom effect
---------
Co-authored-by: Nathan Sarrazin <sarrazin.nathan@gmail.com>
src/lib/components/ScrollToBottomBtn.svelte
CHANGED
|
@@ -1,17 +1,15 @@
|
|
| 1 |
<script lang="ts">
|
| 2 |
-
import { run } from "svelte/legacy";
|
| 3 |
-
|
| 4 |
import { fade } from "svelte/transition";
|
| 5 |
-
import { onDestroy } from "svelte";
|
| 6 |
import IconChevron from "./icons/IconChevron.svelte";
|
| 7 |
|
| 8 |
-
let visible = $state(false);
|
| 9 |
interface Props {
|
| 10 |
scrollNode: HTMLElement;
|
| 11 |
class?: string;
|
| 12 |
}
|
| 13 |
|
| 14 |
let { scrollNode, class: className = "" }: Props = $props();
|
|
|
|
|
|
|
| 15 |
let observer: ResizeObserver | null = $state(null);
|
| 16 |
|
| 17 |
function updateVisibility() {
|
|
@@ -24,20 +22,18 @@
|
|
| 24 |
observer?.disconnect();
|
| 25 |
scrollNode?.removeEventListener("scroll", updateVisibility);
|
| 26 |
}
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
});
|
| 37 |
-
observer.observe(scrollNode);
|
| 38 |
}
|
| 39 |
-
|
| 40 |
-
|
| 41 |
});
|
| 42 |
</script>
|
| 43 |
|
|
|
|
| 1 |
<script lang="ts">
|
|
|
|
|
|
|
| 2 |
import { fade } from "svelte/transition";
|
|
|
|
| 3 |
import IconChevron from "./icons/IconChevron.svelte";
|
| 4 |
|
|
|
|
| 5 |
interface Props {
|
| 6 |
scrollNode: HTMLElement;
|
| 7 |
class?: string;
|
| 8 |
}
|
| 9 |
|
| 10 |
let { scrollNode, class: className = "" }: Props = $props();
|
| 11 |
+
|
| 12 |
+
let visible = $state(false);
|
| 13 |
let observer: ResizeObserver | null = $state(null);
|
| 14 |
|
| 15 |
function updateVisibility() {
|
|
|
|
| 22 |
observer?.disconnect();
|
| 23 |
scrollNode?.removeEventListener("scroll", updateVisibility);
|
| 24 |
}
|
| 25 |
+
const cleanup = $effect.root(() => {
|
| 26 |
+
$effect(() => {
|
| 27 |
+
if (scrollNode) {
|
| 28 |
+
if (window.ResizeObserver) {
|
| 29 |
+
observer = new ResizeObserver(() => updateVisibility());
|
| 30 |
+
observer.observe(scrollNode);
|
| 31 |
+
cleanup();
|
| 32 |
+
}
|
| 33 |
+
scrollNode?.addEventListener("scroll", updateVisibility);
|
|
|
|
|
|
|
| 34 |
}
|
| 35 |
+
});
|
| 36 |
+
return () => destroy();
|
| 37 |
});
|
| 38 |
</script>
|
| 39 |
|