import { Conversation, KeyValuePair, Message, OpenAIModel } from "@/types"; import { FC, MutableRefObject, useEffect, useRef, useState } from "react"; import { ChatInput } from "./ChatInput"; import { ChatLoader } from "./ChatLoader"; import { ChatMessage } from "./ChatMessage"; import { ModelSelect } from "./ModelSelect"; import { SystemPrompt } from "./SystemPrompt"; interface Props { conversation: Conversation; models: OpenAIModel[]; apiKey: string; serverSideApiKeyIsSet: boolean; messageIsStreaming: boolean; modelError: boolean; messageError: boolean; loading: boolean; lightMode: "light" | "dark"; onSend: (message: Message, isResend?: boolean, deleteCount?: number) => void; onUpdateConversation: (conversation: Conversation, data: KeyValuePair) => void; onEditMessage: (message: Message, messageIndex: number) => void; stopConversationRef: MutableRefObject; } export const Chat: FC = ({ conversation, models, apiKey, serverSideApiKeyIsSet, messageIsStreaming, modelError, messageError, loading, lightMode, onSend, onUpdateConversation, onEditMessage, stopConversationRef }) => { const [currentMessage, setCurrentMessage] = useState(); const [autoScrollEnabled, setAutoScrollEnabled] = useState(true); const messagesEndRef = useRef(null); const chatContainerRef = useRef(null); const textareaRef = useRef(null); const scrollToBottom = () => { if (autoScrollEnabled) { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); } }; const handleScroll = () => { if (chatContainerRef.current) { const { scrollTop, scrollHeight, clientHeight } = chatContainerRef.current; const bottomTolerance = 30; if (scrollTop + clientHeight < scrollHeight - bottomTolerance) { setAutoScrollEnabled(false); } else { setAutoScrollEnabled(true); } } }; useEffect(() => { scrollToBottom(); textareaRef.current?.focus(); setCurrentMessage(conversation.messages[conversation.messages.length - 2]); }, [conversation.messages]); useEffect(() => { const chatContainer = chatContainerRef.current; if (chatContainer) { chatContainer.addEventListener("scroll", handleScroll); return () => { chatContainer.removeEventListener("scroll", handleScroll); }; } }, []); console.log("currentMessage", currentMessage); return (
{!(apiKey || serverSideApiKeyIsSet) ? (
OpenAI API Key Required
Please set your OpenAI API key in the bottom left of the sidebar.
) : modelError ? (
Error fetching models.
Make sure your OpenAI API key is set in the bottom left of the sidebar.
If you completed this step, OpenAI may be experiencing issues.
) : ( <>
{conversation.messages.length === 0 ? ( <>
{models.length === 0 ? "Loading..." : "Chatbot UI"}
{models.length > 0 && (
onUpdateConversation(conversation, { key: "model", value: model })} /> onUpdateConversation(conversation, { key: "prompt", value: prompt })} />
)}
) : ( <>
Model: {conversation.model.name}
{conversation.messages.map((message, index) => ( ))} {loading && }
)}
{ setCurrentMessage(message); onSend(message); }} onRegenerate={() => { if (currentMessage) { onSend(currentMessage, true, 2); } }} /> )}
); };