Spaces:
Running on Zero
Running on Zero
File size: 1,362 Bytes
ef6e870 | 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 45 46 47 48 | /**
* Scroll container binding and navigation guard for the ChatScreen.
*
* Binds the `AutoScrollController` to `document.documentElement`, exposes
* the container for programmatic scrolling, and flags an `isNavigating`
* window during route changes so the controller can reset without its
* scroll handler seeing spurious events from layout shifts.
*/
import { afterNavigate, beforeNavigate } from '$app/navigation';
import type { AutoScrollController } from './use-auto-scroll.svelte';
export function useChatScreenScroll(autoScroll: AutoScrollController) {
let chatScrollContainer: HTMLElement | undefined = $state();
let isNavigating = $state(false);
function handleScroll(event: UIEvent) {
// Ignore scroll events caused by navigation layout changes or by our own
// programmatic scrolls so they don't accidentally disable auto-scroll.
if (isNavigating || !event.isTrusted) return;
autoScroll.handleScroll();
}
beforeNavigate(() => {
isNavigating = true;
autoScroll.resetScrollState();
});
afterNavigate(() => {
setTimeout(() => {
isNavigating = false;
autoScroll.resetScrollState();
}, 10);
});
$effect(() => {
chatScrollContainer = document.documentElement;
autoScroll.setContainer(chatScrollContainer);
});
return {
get chatScrollContainer() {
return chatScrollContainer;
},
handleScroll
};
}
|