'use client'; import { ExternalLink, Copy, Check, Globe } from 'lucide-react'; import { cn } from '@/lib/utils'; import { useState, useMemo } from 'react'; import type { ScrapedContent } from '@/services/webSearch'; interface SourcesDisplayProps { sources: ScrapedContent[]; className?: string; } export function SourcesDisplay({ sources, className }: SourcesDisplayProps) { const [copiedIndex, setCopiedIndex] = useState(null); if (!sources || sources.length === 0) { return null; } 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); } }; // Memoizar URLs de favicon para evitar recálculos const faviconUrls = useMemo(() => { return sources.map(source => { try { const domain = new URL(source.url).hostname; return `https://www.google.com/s2/favicons?domain=${domain}&sz=32`; } catch { return null; } }); }, [sources]); return (

Fontes consultadas ({sources.length}):

{sources.map((source, idx) => { const faviconUrl = faviconUrls[idx]; const isCopied = copiedIndex === idx; return (
{/* Favicon */} {faviconUrl ? ( { (e.target as HTMLImageElement).style.display = 'none'; }} /> ) : ( )} {/* Title and URL */}
{source.title || `Fonte ${idx + 1}`}
{source.url.replace(/^https?:\/\//, '').replace(/^www\./, '')}
{/* Actions */}
{/* Copy Button */} {/* External Link Button */}
); })}
); }