"use client"; import { useEffect, useRef, useState } from "react"; import { useActiveChat } from "@/hooks/use-active-chat"; import type { Attachment, ChatMessage } from "@/lib/types"; import { ChatHeader } from "./chat-header"; import { DataStreamHandler } from "./data-stream-handler"; import { submitEditedMessage } from "./message-editor"; import { Messages } from "./messages"; import { MultimodalInput } from "./multimodal-input"; export function ChatShell() { const { chatId, messages, setMessages, sendMessage, status, stop, regenerate, addToolApprovalResponse, input, setInput, visibilityType, isReadonly, isLoading, votes, currentModelId, setCurrentModelId, } = useActiveChat(); const [editingMessage, setEditingMessage] = useState( null ); const [attachments, setAttachments] = useState([]); const stopRef = useRef(stop); stopRef.current = stop; const prevChatIdRef = useRef(chatId); useEffect(() => { if (prevChatIdRef.current !== chatId) { prevChatIdRef.current = chatId; stopRef.current(); setEditingMessage(null); setAttachments([]); } }, [chatId]); return ( <>
{ const text = msg.parts ?.filter((p) => p.type === "text") .map((p) => p.text) .join(""); setInput(text ?? ""); setEditingMessage(msg); }} regenerate={regenerate} selectedModelId={currentModelId} setMessages={setMessages} status={status} votes={votes} />
{!isReadonly && ( { setEditingMessage(null); setInput(""); }} onModelChange={setCurrentModelId} selectedModelId={currentModelId} selectedVisibilityType={visibilityType} sendMessage={ editingMessage ? async () => { const msg = editingMessage; setEditingMessage(null); await submitEditedMessage({ message: msg, text: input, setMessages, regenerate, }); setInput(""); } : sendMessage } setAttachments={setAttachments} setInput={setInput} setMessages={setMessages} status={status} stop={stop} /> )}
); }