"use client"; import React from "react"; import { cn } from "@/lib/utils"; import { User, Bot, Globe, Youtube, Copy, Check } from "lucide-react"; export interface ChatMsg { id: string; role: "user" | "assistant" | "system"; content: string; type?: "text" | "research" | "youtube"; researchData?: { answer: string; results: { title: string; url: string; content: string }[]; }; youtubeData?: { videos: { id: string; title: string; description: string; channel: string; thumbnail: string; url: string; }[]; }; isStreaming?: boolean; } interface ChatMessageProps { message: ChatMsg; accentColor: string; } export function ChatMessage({ message, accentColor }: ChatMessageProps) { const [copied, setCopied] = React.useState(false); const isUser = message.role === "user"; const handleCopy = () => { navigator.clipboard.writeText(message.content); setCopied(true); setTimeout(() => setCopied(false), 2000); }; return (
{!isUser && (
{message.type === "research" ? ( ) : message.type === "youtube" ? ( ) : ( )}
)}
{/* Research results */} {message.type === "research" && message.researchData && (
{message.researchData.answer && (

{message.researchData.answer}

)} {message.researchData.results.length > 0 && (
Sources {message.researchData.results.map((r, i) => ( {r.title} {r.content} ))}
)}
)} {/* YouTube results */} {message.type === "youtube" && message.youtubeData && (
{message.youtubeData.videos.map((v) => ( {v.thumbnail && ( {v.title} )}
{v.title} {v.channel}
))}
)} {/* Regular text */} {(!message.type || message.type === "text") && ( {message.content} {message.isStreaming && |} )}
{/* Copy button for assistant messages */} {!isUser && !message.isStreaming && message.content && ( )}
{isUser && (
)}
); }