import ReactMarkdown from 'react-markdown'; import remarkMath from 'remark-math'; import rehypeKatex from 'rehype-katex'; import rehypeRaw from 'rehype-raw'; import { getChatMarkdownComponents, getTitleMarkdownComponents } from '../utils/markdownComponents.jsx'; import SimpleChat from './SimpleChat.jsx'; import ChunkLoadingTips from './ChunkLoadingTips.jsx'; import React, { useEffect } from 'react'; import { createTextStreamResponse } from 'ai'; const ChunkPanel = ({ documentData, currentChunkIndex, showChat, updateGlobalChatHistory, getGlobalChatHistory, addMessageToChunk, getCurrentChunkMessages, hasChunkMessages, markChunkUnderstood, skipChunk, goToPrevChunk, streamResponse, isChunkLoading }) => { const chatMarkdownComponents = getChatMarkdownComponents(); const titleMarkdownComponents = getTitleMarkdownComponents(); // Generate greeting for chunks that don't have messages yet // Only for initial chunk (0) and when not transitioning useEffect(() => { if (documentData && showChat && !hasChunkMessages(currentChunkIndex) && currentChunkIndex === 0) { console.log("🤖 Triggering greeting generation for chunk 0"); generateGreetingStreaming(); } }, [documentData?.chunks?.length, showChat, currentChunkIndex]); // More stable dependencies const updateLastAssistantMessage = (delta) => { const allMessages = getGlobalChatHistory(); const currentChunkMessages = allMessages.filter(msg => msg.chunkIndex === currentChunkIndex); const lastAssistantInChunk = [...currentChunkMessages].reverse().find(msg => msg.role === 'assistant'); if (!lastAssistantInChunk) { console.warn("No assistant message found for current chunk — adding new one."); addMessageToChunk({ role: 'assistant', content: delta }, currentChunkIndex); return; } const updatedMessages = allMessages.map(msg => { if (msg === lastAssistantInChunk) { return { ...msg, content: msg.content + (typeof delta === "string" ? delta : delta?.content || "") }; } return msg; }); updateGlobalChatHistory(updatedMessages); }; const generateGreetingStreaming = async () => { const requestBody = JSON.stringify({ messages: [], currentChunk: documentData?.chunks?.[currentChunkIndex]?.text || '', document: documentData ? JSON.stringify(documentData) : '', }); streamResponse(requestBody, false); }; const handleSendStreaming = async (text) => { const userMessage = { role: 'user', content: text, chunkIndex: currentChunkIndex }; addMessageToChunk(userMessage, currentChunkIndex); // Build the messages array manually to include the user message immediately const messagesWithUserMessage = [...getGlobalChatHistory(), userMessage]; const requestBody = JSON.stringify({ messages: messagesWithUserMessage, currentChunk: documentData?.chunks?.[currentChunkIndex]?.text || '', document: documentData ? JSON.stringify(documentData) : '' }); streamResponse(requestBody, false); }; return ( <> {/* Chunk Header */}