| 12345678910111213141516171819202122232425262728293031323334 |
- import React, { useEffect } from 'react';
- import { throttle } from '../utils/misc';
- export const scrollToBottom = (requiresNearBottom: boolean, delay?: number) => {
- const mainScrollElem = document.getElementById('main-scroll');
- if (!mainScrollElem) return;
- const spaceToBottom =
- mainScrollElem.scrollHeight -
- mainScrollElem.scrollTop -
- mainScrollElem.clientHeight;
- if (!requiresNearBottom || spaceToBottom < 100) {
- setTimeout(
- () => mainScrollElem.scrollTo({ top: mainScrollElem.scrollHeight }),
- delay ?? 80
- );
- }
- };
- const scrollToBottomThrottled = throttle(scrollToBottom, 80);
- export function useChatScroll(msgListRef: React.RefObject<HTMLDivElement>) {
- useEffect(() => {
- if (!msgListRef.current) return;
- const resizeObserver = new ResizeObserver((_) => {
- scrollToBottomThrottled(true, 10);
- });
- resizeObserver.observe(msgListRef.current);
- return () => {
- resizeObserver.disconnect();
- };
- }, [msgListRef]);
- }
|