import { useState } from "react"; import { ArrowRight, RefreshCcw, Copy, Check, Trash2, RotateCcw, ListFilter, ChevronLeft, ChevronRight } from "lucide-react"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import { format } from "date-fns"; import { Avatar, AvatarFallback } from "../ui/avatar"; import { ChatMessage } from "./ChatMessage"; import { ThinkingAnimation } from "./ThinkingAnimation"; import { toast } from '../ui/sonner'; import { MessageActions } from "./MessageActions"; import { MessageVariationControls } from "./MessageVariationControls"; import { DeleteMessageDialog } from "./DeleteMessageDialog"; import { MessageVariation, Message } from "@/types/chat"; interface ChatBubbleProps { message: Message; onViewSearchResults?: (messageId: string) => void; onRetry?: (messageId: string) => void; onRegenerate?: (messageId: string) => void; onDelete?: (messageId: string) => void; onSelectVariation?: (messageId: string, variationId: string) => void; } export const ChatBubble = ({ message, onViewSearchResults, onRetry, onRegenerate, onDelete, onSelectVariation }: ChatBubbleProps) => { const [copied, setCopied] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const isWelcomeMessage = message.id === "welcomems"; const isSystem = message.sender === "system"; const hasVariations = isSystem && message.variations && message.variations.length > 0; // If the message has variations, display the active one or the first one const displayContent = isSystem && hasVariations && message.activeVariation ? message.variations.find(v => v.id === message.activeVariation)?.content || message.content : message.content; const copyToClipboard = () => { // Strip thinking content before copying const cleanContent = displayContent.replace(/[\s\S]*?<\/think>/g, '').trim(); navigator.clipboard.writeText(cleanContent); setCopied(true); toast.success('Copied to clipboard!'); setTimeout(() => setCopied(false), 2000); }; const handleDelete = () => { setDeleteDialogOpen(false); if (onDelete) { onDelete(message.id); } }; return ( <>
{isSystem ? "AI" : "You"}
{message.isLoading ? ( ) : ( )}
{/* Chat bubble footer */}
{/* Time */}
{format(message.timestamp, "h:mm a")}
{/* Controls */} {!isWelcomeMessage && (
{/* Variation controls */} {hasVariations && message.variations && message.variations.length > 1 && ( )} setDeleteDialogOpen(true)} onCopy={copyToClipboard} copied={copied} />
)}
); };