import React, { useState, useEffect } from 'react'; import { Search, Filter, ExternalLink, Clock, FileText, Loader2, BookOpen, Eye } from 'lucide-react'; import { WikimediaAPI, WIKIMEDIA_PROJECTS } from '../utils/wikimedia-api'; import { SearchResult } from '../types'; interface SearchInterfaceProps { onViewArticle?: (title: string, project: string, content: string) => void; } const SearchInterface: React.FC = ({ onViewArticle }) => { const [query, setQuery] = useState(''); const [selectedProject, setSelectedProject] = useState('wikipedia'); const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); const [showFilters, setShowFilters] = useState(false); const [loadingContent, setLoadingContent] = useState(null); const handleSearch = async (searchQuery: string = query) => { if (!searchQuery.trim()) return; setLoading(true); try { const searchResults = await WikimediaAPI.search(searchQuery, selectedProject, 20); setResults(searchResults); } catch (error) { console.error('Search failed:', error); setResults([]); } finally { setLoading(false); } }; const handleViewInWikistro = async (result: SearchResult) => { setLoadingContent(result.pageid.toString()); try { const content = await WikimediaAPI.getPageContent(result.title, result.project); if (onViewArticle) { onViewArticle(result.title, result.project, content); } } catch (error) { console.error('Failed to load article content:', error); } finally { setLoadingContent(null); } }; const formatDate = (timestamp: string) => { return new Date(timestamp).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); }; const truncateSnippet = (snippet: string, maxLength: number = 200) => { const cleanSnippet = snippet.replace(/<[^>]*>/g, ''); return cleanSnippet.length > maxLength ? cleanSnippet.substring(0, maxLength) + '...' : cleanSnippet; }; useEffect(() => { const delayedSearch = setTimeout(() => { if (query.trim()) { handleSearch(query); } }, 500); return () => clearTimeout(delayedSearch); }, [query, selectedProject]); const currentProject = WIKIMEDIA_PROJECTS.find(p => p.id === selectedProject); return (
setQuery(e.target.value)} placeholder="Search across Wikimedia projects..." className="w-full pl-12 pr-4 py-4 border border-gray-300 rounded-xl focus:ring-2 focus:ring-primary-500 focus:border-transparent text-lg" onKeyDown={(e) => e.key === 'Enter' && handleSearch()} />
{showFilters && (
{WIKIMEDIA_PROJECTS.map((project) => ( ))}
)}
{currentProject && (

{currentProject.name}

{currentProject.description}

)} {loading && (
Searching {currentProject?.name}...
)} {!loading && results.length === 0 && query && (

No results found

Try adjusting your search terms or selecting a different project.

)} {!loading && results.length > 0 && (

Search Results ({results.length})

{results.map((result) => (

{result.title}

{truncateSnippet(result.snippet)}

{formatDate(result.timestamp)}
{Math.round(result.size / 1024)}KB
{result.project}
Open Original
))}
)}
); }; export default SearchInterface;