'use client'; import { Card } from '@/components/ui/card'; import { ExternalLink } from 'lucide-react'; import { ScrapedContent } from '@/services/webSearch'; import { useRef, useState } from 'react'; import { cn } from '@/lib/utils'; interface SourcesCarouselProps { sources: ScrapedContent[]; } export function SourcesCarousel({ sources }: SourcesCarouselProps) { if (!sources || sources.length === 0) return null; const scrollContainerRef = useRef(null); const [isDragging, setIsDragging] = useState(false); const [startX, setStartX] = useState(0); const [scrollLeft, setScrollLeft] = useState(0); const [hasMoved, setHasMoved] = useState(false); // Handlers para mouse drag const handleMouseDown = (e: React.MouseEvent) => { if (!scrollContainerRef.current) return; setIsDragging(true); setStartX(e.pageX - scrollContainerRef.current.offsetLeft); setScrollLeft(scrollContainerRef.current.scrollLeft); setHasMoved(false); }; const handleMouseMove = (e: React.MouseEvent) => { if (!isDragging || !scrollContainerRef.current) return; e.preventDefault(); const x = e.pageX - scrollContainerRef.current.offsetLeft; const walk = (x - startX) * 1.5; // Velocidade do scroll scrollContainerRef.current.scrollLeft = scrollLeft - walk; // Se moveu mais de 3px, marca como movimento (não clique) if (Math.abs(walk) > 3) { setHasMoved(true); } }; const handleMouseUp = () => { setIsDragging(false); // Resetar após um pequeno delay setTimeout(() => setHasMoved(false), 150); }; const handleMouseLeave = () => { setIsDragging(false); setTimeout(() => setHasMoved(false), 150); }; // Handlers para touch drag (mobile) const handleTouchStart = (e: React.TouchEvent) => { if (!scrollContainerRef.current) return; setIsDragging(true); setStartX(e.touches[0].pageX - scrollContainerRef.current.offsetLeft); setScrollLeft(scrollContainerRef.current.scrollLeft); setHasMoved(false); }; const handleTouchMove = (e: React.TouchEvent) => { if (!isDragging || !scrollContainerRef.current) return; const x = e.touches[0].pageX - scrollContainerRef.current.offsetLeft; const walk = (x - startX) * 1.5; scrollContainerRef.current.scrollLeft = scrollLeft - walk; if (Math.abs(walk) > 3) { setHasMoved(true); } }; const handleTouchEnd = () => { setIsDragging(false); setTimeout(() => setHasMoved(false), 150); }; // Prevenir navegação do link durante drag const handleLinkClick = (e: React.MouseEvent) => { if (hasMoved || isDragging) { e.preventDefault(); e.stopPropagation(); } }; return (

Fontes Analisadas

{sources.map((source, idx) => { const hostname = new URL(source.url).hostname.replace('www.', ''); const faviconUrl = `https://www.google.com/s2/favicons?domain=${hostname}&sz=32`; return (
(e.target as HTMLImageElement).style.display = 'none'} />
{source.title}
{hostname}
); })}
); }