import { FileText, Globe, Youtube, Loader2, CheckCircle, AlertCircle } from 'lucide-react'; import { KnowledgeSource } from '../types'; interface SourceCardProps { source: KnowledgeSource; compact?: boolean; } const languageColors = { EN: 'bg-blue-500/10 text-blue-600 dark:text-blue-400', HI: 'bg-orange-500/10 text-orange-600 dark:text-orange-400', TE: 'bg-purple-500/10 text-purple-600 dark:text-purple-400', ES: 'bg-green-500/10 text-green-600 dark:text-green-400', FR: 'bg-pink-500/10 text-pink-600 dark:text-pink-400', DE: 'bg-yellow-500/10 text-yellow-600 dark:text-yellow-400', }; const statusIcons: Record = { pending: Loader2, processing: Loader2, completed: CheckCircle, failed: AlertCircle, IDLE: Loader2, UPLOADING: Loader2, EXTRACTING: Loader2, CHUNKING: Loader2, EMBEDDING: Loader2, INDEXING: Loader2, }; const statusColors: Record = { pending: 'text-gray-400', processing: 'text-blue-500 animate-spin', completed: 'text-green-500', failed: 'text-red-500', IDLE: 'text-gray-400', UPLOADING: 'text-[#6366F1] animate-spin', EXTRACTING: 'text-indigo-400 animate-spin', CHUNKING: 'text-blue-400 animate-spin', EMBEDDING: 'text-purple-400 animate-spin', INDEXING: 'text-amber-500 animate-spin', }; export function SourceCard({ source, compact = false }: SourceCardProps) { const Icon = source.type === 'pdf' ? FileText : source.type === 'web' ? Globe : Youtube; const StatusIcon = statusIcons[source.status] || Loader2; if (compact) { return (

{source.title}

{source.language} {source.chunkCount !== undefined && source.chunkCount > 0 && ( {source.chunkCount} chunks )}
); } return (

{source.title}

{source.language} {source.status.toLowerCase()} {source.progress_percentage !== undefined && source.progress_percentage > 0 && source.progress_percentage < 100 ? ` (${source.progress_percentage}%)` : ''}
{source.chunkCount !== undefined && source.chunkCount > 0 && ( {source.chunkCount} chunks )} {source.metadata?.pageCount && ( {source.metadata.pageCount} pages )} {source.metadata?.domain && ( {source.metadata.domain} )} {source.metadata?.duration && ( {source.metadata.duration} )}
{source.lastProcessed && (
Processed {source.lastProcessed.toLocaleDateString()}
)}
); }