import React from "react"; import { ScrollArea } from "@/components/ui/scroll-area"; import { useParams } from "react-router-dom"; import { isHumanMessage, isAIMessage, AIMessage } from "@langchain/core/messages"; import { MessagesProps } from "../types"; import { HumanMessageComponent } from "./HumanMessage"; import { AIMessageComponent } from "./AIMessage"; import { Button } from "@/components/ui/button"; import { ArrowDown } from "lucide-react"; import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"; export const Messages = React.memo(({ messages, streamingHumanMessage, streamingAIMessageChunks, setPreviewDocument, onEditMessage, onRegenerateMessage, editingMessageIndex, onSaveEdit, onCancelEdit, }: MessagesProps) => { const { id } = useParams(); const viewportRef = React.useRef(null); const [showScrollToBottom, setShowScrollToBottom] = React.useState(false); const handleScroll = React.useCallback((event: Event) => { const viewport = event.target as HTMLDivElement; const isNotAtBottom = viewport.scrollHeight - viewport.scrollTop - viewport.clientHeight > 10; setShowScrollToBottom(isNotAtBottom); }, []); const scrollToBottom = React.useCallback(() => { if (!viewportRef.current) return; const viewport = viewportRef.current; viewport.scrollTo({ top: viewport.scrollHeight, behavior: 'smooth' }); }, []); React.useEffect(() => { const viewport = viewportRef.current; if (!viewport) return; viewport.addEventListener('scroll', handleScroll); // Initial check for scroll position handleScroll({ target: viewport } as unknown as Event); return () => viewport.removeEventListener('scroll', handleScroll); }, [handleScroll]); if (id === "new" || !messages) { return
; } return (
{messages.map((message, index) => { if (isHumanMessage(message)) { return ( onEditMessage(index)} onRegenerate={() => onRegenerateMessage(index)} isEditing={editingMessageIndex === index} onSave={onSaveEdit} onCancelEdit={onCancelEdit} /> ); } if (isAIMessage(message)) { return ; } return null; })} {streamingHumanMessage && ( )} {streamingAIMessageChunks.length > 0 && ( chunk.content).join(""))} /> )}
{showScrollToBottom && ( )}
); }); Messages.displayName = "Messages";