'use client'; import { motion, AnimatePresence } from 'framer-motion'; import { useState } from 'react'; import { Search, FileCode, ChevronDown, ChevronRight } from 'lucide-react'; interface SearchResult { file_path: string; line_number: number; line_content: string; context_before: string[]; context_after: string[]; } export default function SearchPage() { const [pattern, setPattern] = useState(''); const [filePattern, setFilePattern] = useState('**/*.py'); const [results, setResults] = useState([]); const [isSearching, setIsSearching] = useState(false); const [expandedResults, setExpandedResults] = useState>(new Set()); const handleSearch = async (e: React.FormEvent) => { e.preventDefault(); if (!pattern.trim()) return; setIsSearching(true); try { const response = await fetch('http://localhost:8000/api/search', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ pattern, file_pattern: filePattern, context_lines: 2 }), }); const data = await response.json(); setResults(data.results || []); } catch (error) { console.error('Search failed:', error); } finally { setIsSearching(false); } }; const toggleExpand = (index: number) => { const newExpanded = new Set(expandedResults); if (newExpanded.has(index)) { newExpanded.delete(index); } else { newExpanded.add(index); } setExpandedResults(newExpanded); }; return (
{/* Header */}
🔍

Search Mode

Find patterns across your codebase

{/* Search Form */}
setPattern(e.target.value)} placeholder="e.g., class\s+(\w+) or def.*login" className="w-full px-4 py-3 bg-slate-800/50 border border-slate-700 rounded-xl focus:border-sky-500 focus:outline-none transition-colors" />
setFilePattern(e.target.value)} placeholder="**/*.py" className="w-full px-4 py-3 bg-slate-800/50 border border-slate-700 rounded-xl focus:border-sky-500 focus:outline-none transition-colors" />
{isSearching ? (
) : ( <> Search Codebase )} {/* Results */}
{results.length > 0 && ( Found {results.length} matches )} {results.map((result, i) => ( {/* Header */} {/* Code Preview */} {expandedResults.has(i) && (
                                            {result.context_before?.map((line, j) => (
                                                
{line}
))}
{result.line_content}
{result.context_after?.map((line, j) => (
{line}
))}
)}
))}
{results.length === 0 && !isSearching && (

Enter a pattern to search your codebase

)}
); }