import { useState, useEffect, useCallback } from 'react' import { motion, AnimatePresence } from 'framer-motion' import { Search, Database, Terminal, FileText, Loader2, ChevronRight } from 'lucide-react' const API_BASE = '' export default function QueryPanel() { const [files, setFiles] = useState([]) const [selectedFile, setSelectedFile] = useState(null) const [mode, setMode] = useState('search') const [searchQuery, setSearchQuery] = useState('') const [sqlQuery, setSqlQuery] = useState('SELECT * FROM data LIMIT 10') const [chunkIdx, setChunkIdx] = useState(0) const [results, setResults] = useState(null) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) useEffect(() => { const fetchFiles = async () => { try { const res = await fetch(`${API_BASE}/files`) const data = await res.json() setFiles(data.files || []) if (data.files?.length > 0) setSelectedFile(data.files[0].file_id) } catch { setFiles([]) } } fetchFiles() }, []) const execute = useCallback(async () => { if (!selectedFile) return setLoading(true) setError(null) setResults(null) try { let res if (mode === 'search') { res = await fetch(`${API_BASE}/search/${selectedFile}?q=${encodeURIComponent(searchQuery)}`) } else if (mode === 'sql') { res = await fetch(`${API_BASE}/query/sql/${selectedFile}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sql: sqlQuery }), }) } else if (mode === 'chunk') { res = await fetch(`${API_BASE}/chunk/${selectedFile}/${chunkIdx}`) } const data = await res.json() setResults(data) } catch (e) { setError(e.message) } finally { setLoading(false) } }, [selectedFile, mode, searchQuery, sqlQuery, chunkIdx]) const modes = [ { id: 'search', label: 'Search', icon: Search }, { id: 'sql', label: 'SQL', icon: Database }, { id: 'chunk', label: 'Chunk', icon: FileText }, ] return (
{/* File selector */}
Target File
{files.length === 0 ? (
No files indexed.
) : (
{files.map(f => ( ))}
)}
{/* Mode selector */}
{modes.map(m => ( ))}
{/* Query input */} {mode === 'search' && (
setSearchQuery(e.target.value)} onKeyDown={e => e.key === 'Enter' && execute()} placeholder="Search file content..." className="flex-1 bg-transparent text-sm text-text placeholder-secondary/50 focus:outline-none" />
)} {mode === 'sql' && (
SQL Query