import { useEffect } from "react"; import { motion } from "motion/react"; import { Bot } from "lucide-react"; import type { Message } from "./types"; import TypingIndicator from "./TypingIndicator"; import FeedbackWidget from "./FeedbackWidget"; import MarkdownRenderer from "./renderers/MarkdownRenderer"; interface MessageBubbleProps { message: Message; isStreamingPlaceholder?: boolean; } export default function MessageBubble({ message, isStreamingPlaceholder }: MessageBubbleProps) { useEffect(() => { if (message.role === "assistant") { // console.log( // `[MessageBubble] id=...${message.id.slice(-6)} isStreamingPlaceholder=${isStreamingPlaceholder} contentLen=${message.content.length}` // ); } }, [isStreamingPlaceholder, message.id, message.role, message.content.length]); if (message.role === "user") { return (
{message.content}
); } // Show TypingIndicator when the assistant placeholder has no content yet if (isStreamingPlaceholder && message.content === "") { return ; } return (
{message.sources && message.sources.length > 0 && (

Sources:

{message.sources.map((src, i) => ( 📄 {src.filename} {src.page_label ? ` p.${src.page_label}` : ""} ))}
)}
{!isStreamingPlaceholder && ( )}
); }