'use client'; import { Search, Brain, Globe, Package, Loader2, CheckCircle2, XCircle, AlertCircle, ChevronDown, ChevronUp, ExternalLink, Copy, Check } from 'lucide-react'; import { cn } from '@/lib/utils'; import { useState } from 'react'; import type { ThinkingMessageMetadata } from '@/hooks/use-chat'; interface MessageStepThinkingProps { metadata: ThinkingMessageMetadata; } export function MessageStepThinking({ metadata }: MessageStepThinkingProps) { const [isExpanded, setIsExpanded] = useState(false); const [copiedIndex, setCopiedIndex] = useState(null); const getStepConfig = () => { switch (metadata.stepType) { case 'preprocessing': return { icon: Brain, textColor: "text-blue-600 dark:text-blue-400", bgColor: "bg-blue-50 dark:bg-blue-900/20", }; case 'web-research': return { icon: Globe, textColor: "text-green-600 dark:text-green-400", bgColor: "bg-green-50 dark:bg-green-900/20", }; case 'sources-found': return { icon: Package, textColor: "text-purple-600 dark:text-purple-400", bgColor: "bg-purple-50 dark:bg-purple-900/20", }; case 'processing': return { icon: Brain, textColor: "text-indigo-600 dark:text-indigo-400", bgColor: "bg-indigo-50 dark:bg-indigo-900/20", }; case 'response-generation': return { icon: Loader2, textColor: "text-orange-600 dark:text-orange-400", bgColor: "bg-orange-50 dark:bg-orange-900/20", }; case 'fallback': return { icon: AlertCircle, textColor: "text-yellow-600 dark:text-yellow-400", bgColor: "bg-yellow-50 dark:bg-yellow-900/20", }; case 'error': return { icon: XCircle, textColor: "text-red-600 dark:text-red-400", bgColor: "bg-red-50 dark:bg-red-900/20", }; default: return { icon: Search, textColor: "text-muted-foreground", bgColor: "bg-muted/30", }; } }; const getStepIcon = () => { const config = getStepConfig(); const Icon = config.icon; const isSpinning = metadata.stepType === 'response-generation' && metadata.status === 'running'; return ; }; const copyToClipboard = async (url: string, index: number) => { try { await navigator.clipboard.writeText(url); setCopiedIndex(index); setTimeout(() => setCopiedIndex(null), 2000); } catch (error) { console.error('Failed to copy URL:', error); } }; const config = getStepConfig(); return (
{getStepIcon()} {metadata.label}
{metadata.status === 'running' && ( )} {(metadata.details || metadata.sources || metadata.error) && ( )}
{/* Progress Bar Compacta */} {metadata.progress !== undefined && metadata.progress < 100 && (
)} {/* Conteúdo Expandido */} {isExpanded && (
{metadata.details && (
{metadata.details}
)} {metadata.sources && metadata.sources.length > 0 && (
{metadata.sources.map((source, idx) => (
{source.title || source.url}
))}
)} {metadata.error && (
{metadata.error}
)}
)}
); }