Spaces:
Running
Running
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 <[email protected]>
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 |
|