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
	};
}