diff --git a/web/containers/ListContainer/index.tsx b/web/containers/ListContainer/index.tsx index 0d3e6de617..a9205e1bdc 100644 --- a/web/containers/ListContainer/index.tsx +++ b/web/containers/ListContainer/index.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useEffect, useRef } from 'react' +import { ReactNode, useCallback, useEffect, useRef } from 'react' type Props = { children: ReactNode @@ -6,20 +6,44 @@ type Props = { const ListContainer: React.FC = ({ children }) => { const listRef = useRef(null) + const prevScrollTop = useRef(0) + const isUserManuallyScrollingUp = useRef(false) + + const handleScroll = useCallback((event: React.UIEvent) => { + const currentScrollTop = event.currentTarget.scrollTop + + if (prevScrollTop.current > currentScrollTop) { + console.debug('User is manually scrolling up') + isUserManuallyScrollingUp.current = true + } else { + const currentScrollTop = event.currentTarget.scrollTop + const scrollHeight = event.currentTarget.scrollHeight + const clientHeight = event.currentTarget.clientHeight + + if (currentScrollTop + clientHeight >= scrollHeight) { + console.debug('Scrolled to the bottom') + isUserManuallyScrollingUp.current = false + } + } + + prevScrollTop.current = currentScrollTop + }, []) useEffect(() => { - const scrollHeight = listRef.current?.scrollHeight ?? 0 + if (isUserManuallyScrollingUp.current === true) return + const scrollHeight = listRef.current?.scrollHeight ?? 0 listRef.current?.scrollTo({ top: scrollHeight, behavior: 'instant', }) - }) + }, [listRef.current?.scrollHeight, isUserManuallyScrollingUp]) return (
{children}
diff --git a/web/screens/Chat/ChatBody/index.tsx b/web/screens/Chat/ChatBody/index.tsx index 5f89b76cd2..7ab36de9d9 100644 --- a/web/screens/Chat/ChatBody/index.tsx +++ b/web/screens/Chat/ChatBody/index.tsx @@ -22,8 +22,8 @@ const ChatBody: React.FC = () => { const downloadedModels = useAtomValue(downloadedModelsAtom) const loadModelError = useAtomValue(loadModelErrorAtom) - if (downloadedModels.length === 0) return - if (messages.length === 0) return + if (!downloadedModels.length) return + if (!messages.length) return return (