import { useState } from 'react'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Checkbox } from '@/components/ui/checkbox'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { useAppStore } from '@/stores/app-store'; import { useFileStore } from '@/stores/file-store'; import { ipc } from '@/lib/ipc'; interface SearchResult { filePath: string; line: number; content: string; } export function FindInFilesDialog() { const closeModal = useAppStore((s) => s.closeModal); const rootPath = useFileStore((s) => s.rootPath); const openFile = useFileStore((s) => s.openFile); const [query, setQuery] = useState(''); const [isRegex, setIsRegex] = useState(false); const [caseSensitive, setCaseSensitive] = useState(false); const [results, setResults] = useState([]); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); const handleSearch = async () => { if (!query || !rootPath) return; setSubmitting(true); setError(null); const result = await ipc.file.search({ rootPath, query, isRegex, caseSensitive }); if (!result.ok) { setError(result.error.message); setSubmitting(false); return; } setResults(result.data ?? []); setSubmitting(false); }; const handleResultClick = (filePath: string) => { openFile(filePath); closeModal(); }; return ( !o && closeModal()}> Find in files {rootPath ? `Search in ${rootPath}` : 'No folder open'}
setQuery(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSearch()} />
{error && (
{error}
)} {results.length > 0 && (
{results.map((r, i) => ( ))}
)}
); }