"use client"; import { useState, useRef } from "react"; import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; import type { ChatMsg } from "./ChatPanel"; import { Brain, User, Copy, Check } from "lucide-react"; import { Button } from "@/components/ui/button"; interface Props { message: ChatMsg; } export default function MessageBubble({ message }: Props) { const isUser = message.role === "user"; const [copied, setCopied] = useState(false); const copiedTimeoutRef = useRef | null>(null); const handleCopy = async () => { if (!message.content) return; try { await navigator.clipboard.writeText(message.content); setCopied(true); if (copiedTimeoutRef.current) clearTimeout(copiedTimeoutRef.current); copiedTimeoutRef.current = setTimeout(() => setCopied(false), 2000); } catch { setCopied(false); } }; return (
{!isUser && (
)}
{isUser ? (

{message.content}

) : ( <> {message.content && ( )}
{message.content ? ( {message.content} ) : message.isStreaming ? (
) : null} {message.isStreaming && message.content && ( )}
)}
{isUser && (
)}
); }