diff --git a/src/renderer/src/components/Scrollbar/index.tsx b/src/renderer/src/components/Scrollbar/index.tsx index 86f8c4b42a..7452efd0fc 100644 --- a/src/renderer/src/components/Scrollbar/index.tsx +++ b/src/renderer/src/components/Scrollbar/index.tsx @@ -12,33 +12,41 @@ const Scrollbar: FC = ({ ref: passedRef, right, children, onScroll: exter const [isScrolling, setIsScrolling] = useState(false) const timeoutRef = useRef(null) - const handleScroll = useCallback(() => { - setIsScrolling(true) - + const clearScrollingTimeout = useCallback(() => { if (timeoutRef.current) { clearTimeout(timeoutRef.current) + timeoutRef.current = null } - - timeoutRef.current = setTimeout(() => setIsScrolling(false), 1500) }, []) - const throttledInternalScrollHandler = throttle(handleScroll, 200) + const handleScroll = useCallback(() => { + setIsScrolling(true) + clearScrollingTimeout() + timeoutRef.current = setTimeout(() => { + setIsScrolling(false) + timeoutRef.current = null + }, 1000) + }, [clearScrollingTimeout]) + + // eslint-disable-next-line react-hooks/exhaustive-deps + const throttledInternalScrollHandler = useCallback(throttle(handleScroll, 100, { leading: true, trailing: true }), [ + handleScroll + ]) // Combined scroll handler const combinedOnScroll = useCallback(() => { - // Event is available if needed by internal handler - throttledInternalScrollHandler() // Call internal logic + throttledInternalScrollHandler() if (externalOnScroll) { - externalOnScroll() // Call external logic (from useScrollPosition) + externalOnScroll() } }, [throttledInternalScrollHandler, externalOnScroll]) useEffect(() => { return () => { - timeoutRef.current && clearTimeout(timeoutRef.current) + clearScrollingTimeout() throttledInternalScrollHandler.cancel() } - }, [throttledInternalScrollHandler]) + }, [throttledInternalScrollHandler, clearScrollingTimeout]) return ( = (props) => { includeUser={filterIncludeUser} onIncludeUserChange={userOutlinedItemClickHandler} /> - - - + {isMultiSelectMode && } @@ -142,13 +140,6 @@ const Chat: FC = (props) => { ) } -const MessagesContainer = styled.div` - display: flex; - flex-direction: column; - overflow: hidden; - flex: 1; -` - const Container = styled.div` display: flex; flex-direction: row; diff --git a/src/renderer/src/pages/home/Messages/Messages.tsx b/src/renderer/src/pages/home/Messages/Messages.tsx index 4933ae2190..3b754d7cbe 100644 --- a/src/renderer/src/pages/home/Messages/Messages.tsx +++ b/src/renderer/src/pages/home/Messages/Messages.tsx @@ -53,7 +53,7 @@ const Messages: React.FC = ({ assistant, topic, setActiveTopic, o `topic-${topic.id}` ) const { t } = useTranslation() - const { showPrompt, showTopics, topicPosition, showAssistants, messageNavigation } = useSettings() + const { showPrompt, topicPosition, messageNavigation } = useSettings() const { updateTopic, addTopic } = useAssistant(assistant.id) const dispatch = useAppDispatch() const [displayMessages, setDisplayMessages] = useState([]) @@ -267,8 +267,9 @@ const Messages: React.FC = ({ assistant, topic, setActiveTopic, o const groupedMessages = useMemo(() => Object.entries(getGroupedMessages(displayMessages)), [displayMessages]) return ( - = ({ assistant, topic, setActiveTopic, o {messageNavigation === 'anchor' && } {messageNavigation === 'buttons' && } - - + ) } @@ -369,7 +369,7 @@ interface ContainerProps { $right?: boolean } -const Container = styled(Scrollbar)` +const MessagesContainer = styled(Scrollbar)` display: flex; flex-direction: column-reverse; padding: 10px 0 20px;