import React, { useEffect, useState, useRef, useCallback } from 'react'; import Spinner from '../svg/Spinner'; import { CSSTransition } from 'react-transition-group'; import ScrollToBottom from './ScrollToBottom'; import MultiMessage from './MultiMessage'; import { useSelector } from 'react-redux'; export default function Messages({ messages, messageTree }) { const [currentEditId, setCurrentEditId] = useState(-1); const { conversationId } = useSelector((state) => state.convo); const { model, customModel, chatGptLabel } = useSelector((state) => state.submit); const { models } = useSelector((state) => state.models); const [showScrollButton, setShowScrollButton] = useState(false); const scrollableRef = useRef(null); const messagesEndRef = useRef(null); const modelName = models.find((element) => element.model == model)?.name; useEffect(() => { const timeoutId = setTimeout(() => { const { scrollTop, scrollHeight, clientHeight } = scrollableRef.current; const diff = Math.abs(scrollHeight - scrollTop); const percent = Math.abs(clientHeight - diff ) / clientHeight; const hasScrollbar = scrollHeight > clientHeight && percent > 0.2; setShowScrollButton(hasScrollbar); }, 650); // Add a listener on the window object window.addEventListener('scroll', handleScroll); return () => { clearTimeout(timeoutId); window.removeEventListener('scroll', handleScroll); }; }, [messages]); const scrollToBottom = useCallback(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); setShowScrollButton(false); }, [messagesEndRef]); const handleScroll = () => { const { scrollTop, scrollHeight, clientHeight } = scrollableRef.current; const diff = Math.abs(scrollHeight - scrollTop); const percent = Math.abs(clientHeight - diff ) / clientHeight; if (percent <= 0.2) { setShowScrollButton(false); } else { setShowScrollButton(true); } }; let timeoutId = null; const debouncedHandleScroll = () => { clearTimeout(timeoutId); timeoutId = setTimeout(handleScroll, 100); }; const scrollHandler = (e) => { e.preventDefault(); scrollToBottom(); }; return (