logancyang_obsidian-copilot/src/components/ChatComponents/ChatMessages.tsx

70 lines
2 KiB
TypeScript
Raw Normal View History

2024-08-21 22:16:22 +00:00
import ChatSingleMessage from "@/components/ChatComponents/ChatSingleMessage";
import { BotIcon } from "@/components/Icons";
import ReactMarkdown from "@/components/Markdown/MemoizedReactMarkdown";
import { ChatMessage } from "@/sharedState";
import React, { useEffect, useState } from "react";
2023-04-10 20:00:08 +00:00
interface ChatMessagesProps {
chatHistory: ChatMessage[];
currentAiMessage: string;
2024-01-24 23:58:06 +00:00
loading?: boolean;
2023-04-10 20:00:08 +00:00
}
2024-08-21 22:16:22 +00:00
const ChatMessages: React.FC<ChatMessagesProps> = ({ chatHistory, currentAiMessage, loading }) => {
const [loadingDots, setLoadingDots] = useState("");
2024-01-24 23:58:06 +00:00
2023-04-10 20:00:08 +00:00
const scrollToBottom = () => {
2024-08-21 22:16:22 +00:00
const chatMessagesContainer = document.querySelector(".chat-messages");
2023-04-10 20:00:08 +00:00
if (chatMessagesContainer) {
chatMessagesContainer.scrollTop = chatMessagesContainer.scrollHeight;
}
};
2024-08-21 22:16:22 +00:00
useEffect(() => {
scrollToBottom();
}, [chatHistory]);
2023-04-10 20:00:08 +00:00
2024-01-24 23:58:06 +00:00
useEffect(() => {
let intervalId: NodeJS.Timeout;
if (loading) {
intervalId = setInterval(() => {
2024-08-21 22:16:22 +00:00
setLoadingDots((dots) => (dots.length < 6 ? dots + "." : ""));
2024-01-24 23:58:06 +00:00
}, 200);
} else {
2024-08-21 22:16:22 +00:00
setLoadingDots("");
2024-01-24 23:58:06 +00:00
}
return () => clearInterval(intervalId);
}, [loading]);
2023-04-10 20:00:08 +00:00
return (
<div className="chat-messages">
2024-08-21 22:16:22 +00:00
{chatHistory.map(
(message, index) => message.isVisible && <ChatSingleMessage key={index} message={message} />
)}
2024-01-24 23:58:06 +00:00
{currentAiMessage ? (
2023-04-18 03:58:13 +00:00
<div className="message bot-message" key={`ai_message_${currentAiMessage}`}>
2023-04-10 20:00:08 +00:00
<div className="message-icon">
<BotIcon />
</div>
<div className="message-content">
<ReactMarkdown>{currentAiMessage}</ReactMarkdown>
</div>
</div>
2024-01-24 23:58:06 +00:00
) : (
2024-08-21 22:16:22 +00:00
loading && (
<div className="message bot-message" key={`ai_message_${currentAiMessage}`}>
<div className="message-icon">
<BotIcon />
</div>
<div className="message-content">
<ReactMarkdown>{loadingDots}</ReactMarkdown>
</div>
2024-01-24 23:58:06 +00:00
</div>
2024-08-21 22:16:22 +00:00
)
2023-04-10 20:00:08 +00:00
)}
</div>
);
};
export default ChatMessages;