1- import { useEffect , useMemo , useState } from 'react' ;
1+ import { useEffect , useMemo , useRef , useState } from 'react' ;
22import { CallbackGeneratedChunk , useAppContext } from '../utils/app.context' ;
33import ChatMessage from './ChatMessage' ;
44import { CanvasType , Message , PendingMessage } from '../utils/types' ;
@@ -19,6 +19,7 @@ import {
1919import Dropzone from 'react-dropzone' ;
2020import toast from 'react-hot-toast' ;
2121import ChatInputExtraContextItem from './ChatInputExtraContextItem.tsx' ;
22+ import { scrollToBottom , useChatScroll } from './useChatScroll.tsx' ;
2223
2324/**
2425 * A message display is a message node with additional information for rendering.
@@ -84,24 +85,6 @@ function getListMessageDisplay(
8485 return res ;
8586}
8687
87- const scrollToBottom = throttle (
88- ( requiresNearBottom : boolean , delay : number = 80 ) => {
89- const mainScrollElem = document . getElementById ( 'main-scroll' ) ;
90- if ( ! mainScrollElem ) return ;
91- const spaceToBottom =
92- mainScrollElem . scrollHeight -
93- mainScrollElem . scrollTop -
94- mainScrollElem . clientHeight ;
95- if ( ! requiresNearBottom || spaceToBottom < 50 ) {
96- setTimeout (
97- ( ) => mainScrollElem . scrollTo ( { top : mainScrollElem . scrollHeight } ) ,
98- delay
99- ) ;
100- }
101- } ,
102- 80
103- ) ;
104-
10588export default function ChatScreen ( ) {
10689 const {
10790 viewingChat,
@@ -117,6 +100,9 @@ export default function ChatScreen() {
117100 const extraContext = useChatExtraContext ( ) ;
118101 useVSCodeContext ( textarea , extraContext ) ;
119102
103+ const msgListRef = useRef < HTMLDivElement > ( null ) ;
104+ useChatScroll ( msgListRef ) ;
105+
120106 // keep track of leaf node for rendering
121107 const [ currNodeId , setCurrNodeId ] = useState < number > ( - 1 ) ;
122108 const messages : MessageDisplay [ ] = useMemo ( ( ) => {
@@ -139,7 +125,7 @@ export default function ChatScreen() {
139125 if ( currLeafNodeId ) {
140126 setCurrNodeId ( currLeafNodeId ) ;
141127 }
142- scrollToBottom ( true ) ;
128+ // useChatScroll will handle the auto scroll
143129 } ;
144130
145131 const sendNewMessage = async ( ) => {
@@ -246,7 +232,7 @@ export default function ChatScreen() {
246232 } ) }
247233 >
248234 { /* chat messages */ }
249- < div id = "messages-list" className = "grow" >
235+ < div id = "messages-list" className = "grow" ref = { msgListRef } >
250236 < div className = "mt-auto flex flex-col items-center" >
251237 { /* placeholder to shift the message to the bottom */ }
252238 { viewingChat ? (
0 commit comments