1234 #79
					 2 changed files with 54 additions and 17 deletions
				
			
		|  | @ -1,4 +1,4 @@ | ||||||
| import React, { ForwardedRef, useEffect, useRef } from 'react'; | import React, { ForwardedRef, useState, useEffect, useRef } from 'react'; | ||||||
| 
 | 
 | ||||||
| type Message = { | type Message = { | ||||||
|   role: string |   role: string | ||||||
|  | @ -15,24 +15,45 @@ interface ConversationProps { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const ConversationFrontend = React.forwardRef<HTMLDivElement, ConversationProps>( | const ConversationFrontend = React.forwardRef<HTMLDivElement, ConversationProps>( | ||||||
|   ({ messages,onStopClick, onResendClick, onEditClick, onCopyClick, isClicked }, ref: ForwardedRef<HTMLDivElement>) => { |   ({ messages, onStopClick, onResendClick, onEditClick, onCopyClick, isClicked }, ref: ForwardedRef<HTMLDivElement>) => { | ||||||
| 
 |     const [isScrolling, setIsScrolling] = useState(true); | ||||||
|     const messagesEndRef = useRef<HTMLDivElement | null>(null) |     const messagesEndRef = useRef<HTMLDivElement | null>(null); | ||||||
| 
 | 
 | ||||||
|     useEffect(() => { |     useEffect(() => { | ||||||
|     if (messagesEndRef.current) { |       const observer = new IntersectionObserver( | ||||||
|       const rect = messagesEndRef.current.getBoundingClientRect(); |         (entries) => { | ||||||
|       console.log('Position of the target div:'); |           if (entries[0].isIntersecting) { | ||||||
|       console.log('Top:', rect.top);      // Distance from the top of the viewport
 |             console.log('End of messages reached'); | ||||||
|       console.log('Left:', rect.left);    // Distance from the left of the viewport
 |             setIsScrolling(true); | ||||||
|       console.log('Width:', rect.width);   // Width of the element
 |           } else { | ||||||
|       console.log('Height:', rect.height); // Height of the element
 |             console.log('End of messages not reached'); | ||||||
|  |             setIsScrolling(false); | ||||||
|           } |           } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           root: document.querySelector('.output'), | ||||||
|  |           threshold: 1.0, // Ensure the whole element is visible
 | ||||||
|  |         } | ||||||
|  |       ); | ||||||
|  |        | ||||||
|  |       const endOfMessages = messagesEndRef.current; | ||||||
|  |       if (endOfMessages) { | ||||||
|  |         observer.observe(endOfMessages); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       return () => { | ||||||
|  |         if (endOfMessages) { | ||||||
|  |           observer.unobserve(endOfMessages); | ||||||
|  |         } | ||||||
|  |       }; | ||||||
|     }, [messages]); |     }, [messages]); | ||||||
| 
 | 
 | ||||||
|  |     // Scroll to bottom when new messages arrive
 | ||||||
|     useEffect(() => { |     useEffect(() => { | ||||||
|       messagesEndRef.current?.scrollIntoView() |       if (isScrolling) { | ||||||
|     }, [messages]) |         messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); | ||||||
|  |       } | ||||||
|  |     }, [messages, isScrolling]); | ||||||
| 
 | 
 | ||||||
|     return ( |     return ( | ||||||
|       <div className="output" ref={ref}> |       <div className="output" ref={ref}> | ||||||
|  | @ -77,8 +98,9 @@ const ConversationFrontend = React.forwardRef<HTMLDivElement, ConversationProps> | ||||||
|               <span className="tooltiptext">{isClicked?"Copied!": "Copy" }</span> |               <span className="tooltiptext">{isClicked?"Copied!": "Copy" }</span> | ||||||
|             </div> |             </div> | ||||||
|           </div> |           </div> | ||||||
|           <div ref={messagesEndRef} /> |           <div className={"endOfMessages"} ref={messagesEndRef} style={{height:"10px"}}/> | ||||||
|         </div> |         </div> | ||||||
|  |         <button id="scrollToBottom" disabled={isScrolling?true:false} style={{visibility: isScrolling?"hidden":"visible"}} onClick={()=> setIsScrolling(true)}>Down</button> | ||||||
|       </div> |       </div> | ||||||
|     ); |     ); | ||||||
|   }  |   }  | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| /* Output Section */ | /* Output Section */ | ||||||
| .output { | .output { | ||||||
|  |     scroll-behavior: smooth; | ||||||
|     grid-column: 2; |     grid-column: 2; | ||||||
|     grid-row: 1 / 4; |     grid-row: 1 / 4; | ||||||
|     background-color: var(--output-background-color); |     background-color: var(--output-background-color); | ||||||
|  | @ -13,6 +14,7 @@ | ||||||
|     overflow-y: auto; |     overflow-y: auto; | ||||||
|     width: calc(100% - 2em); /* Corrected calculation for width */ |     width: calc(100% - 2em); /* Corrected calculation for width */ | ||||||
|     height: 86dvh; |     height: 86dvh; | ||||||
|  |     position: relative; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #conversation { | #conversation { | ||||||
|  | @ -127,3 +129,16 @@ | ||||||
|     pointer-events: none; |     pointer-events: none; | ||||||
|     user-select: none; |     user-select: none; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #scrollToBottom{ | ||||||
|  |     scroll-behavior: smooth; | ||||||
|  |     visibility: hidden; | ||||||
|  |     position: absolute; | ||||||
|  |     height: 50px; | ||||||
|  |     width: 50px; | ||||||
|  |     margin: auto; | ||||||
|  |     border-radius: 100%; | ||||||
|  |     bottom: 16dvh; | ||||||
|  |     left: 50%; | ||||||
|  |     translate: -25px; | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue