Spaces:
Paused
Paused
Adrien Denat
commited on
use Svelte $navigating state to update button visibility on navigation (#145)
Browse files* use Svelte $navigating state to update button visibility on navigation
* use ResizeObserver to detect changes instead of props
* remove useless intermediate function
* properly handle scrollNode prop changes
src/lib/components/ScrollToBottomBtn.svelte
CHANGED
|
@@ -1,27 +1,39 @@
|
|
| 1 |
<script lang="ts">
|
| 2 |
import { fade } from "svelte/transition";
|
| 3 |
-
import IconChevron from "./icons/IconChevron.svelte";
|
| 4 |
import { onDestroy } from "svelte";
|
|
|
|
| 5 |
|
| 6 |
export let scrollNode: HTMLElement;
|
| 7 |
export { className as class };
|
| 8 |
|
| 9 |
let visible: boolean = false;
|
| 10 |
let className = "";
|
|
|
|
| 11 |
|
| 12 |
$: if (scrollNode) {
|
| 13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
}
|
| 15 |
|
| 16 |
-
function
|
|
|
|
| 17 |
visible =
|
| 18 |
Math.ceil(scrollNode.scrollTop) + 200 < scrollNode.scrollHeight - scrollNode.clientHeight;
|
| 19 |
}
|
| 20 |
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
scrollNode
|
| 24 |
-
}
|
|
|
|
|
|
|
| 25 |
</script>
|
| 26 |
|
| 27 |
{#if visible}
|
|
|
|
| 1 |
<script lang="ts">
|
| 2 |
import { fade } from "svelte/transition";
|
|
|
|
| 3 |
import { onDestroy } from "svelte";
|
| 4 |
+
import IconChevron from "./icons/IconChevron.svelte";
|
| 5 |
|
| 6 |
export let scrollNode: HTMLElement;
|
| 7 |
export { className as class };
|
| 8 |
|
| 9 |
let visible: boolean = false;
|
| 10 |
let className = "";
|
| 11 |
+
let observer: ResizeObserver | null = null;
|
| 12 |
|
| 13 |
$: if (scrollNode) {
|
| 14 |
+
destroy();
|
| 15 |
+
|
| 16 |
+
if (window.ResizeObserver) {
|
| 17 |
+
observer = new ResizeObserver(() => {
|
| 18 |
+
updateVisibility();
|
| 19 |
+
});
|
| 20 |
+
observer.observe(scrollNode);
|
| 21 |
+
}
|
| 22 |
+
scrollNode.addEventListener("scroll", updateVisibility);
|
| 23 |
}
|
| 24 |
|
| 25 |
+
function updateVisibility() {
|
| 26 |
+
if (!scrollNode) return;
|
| 27 |
visible =
|
| 28 |
Math.ceil(scrollNode.scrollTop) + 200 < scrollNode.scrollHeight - scrollNode.clientHeight;
|
| 29 |
}
|
| 30 |
|
| 31 |
+
function destroy() {
|
| 32 |
+
observer?.disconnect();
|
| 33 |
+
scrollNode?.removeEventListener("scroll", updateVisibility);
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
onDestroy(destroy);
|
| 37 |
</script>
|
| 38 |
|
| 39 |
{#if visible}
|