import React, { useState } from 'react'; import { Business } from '../../types/business'; interface Props { businesses: Business[]; onExport: (format: 'csv' | 'json') => void; onSearch: (query: string) => void; } export const BusinessResults: React.FC = ({ businesses, onExport, onSearch }) => { const [error, setError] = useState(null); const [loading, setLoading] = useState(false); const [progress, setProgress] = useState({ status: '', percent: 0 }); const [searchResults, setSearchResults] = useState([]); const handleSearchResponse = (data: any) => { console.log('Received search response:', data); if (data.type === 'error') { setError(data.error); setLoading(false); return; } if (data.type === 'progress') { setProgress({ status: data.status, percent: data.progress }); return; } if (data.type === 'results') { console.log('Setting results:', data.results); setSearchResults(data.results); onSearch(data.results); // Pass results up to parent setLoading(false); } }; const handleSearch = async (query: string) => { setLoading(true); setError(null); setProgress({ status: 'Starting search...', percent: 0 }); try { const response = await fetch( `http://localhost:3000/api/search?q=${encodeURIComponent(query)}`, { headers: { Accept: 'application/json', 'Cache-Control': 'no-cache' } } ); const reader = response.body?.getReader(); if (!reader) throw new Error('No response body'); const decoder = new TextDecoder(); let buffer = ''; while (true) { const { done, value } = await reader.read(); if (done) break; buffer += decoder.decode(value, { stream: true }); const lines = buffer.split('\n'); buffer = lines.pop() || ''; for (const line of lines) { try { if (line.trim()) { const data = JSON.parse(line); handleSearchResponse(data); } } catch (e) { console.error('Error parsing JSON:', e, 'Line:', line); } } } } catch (error) { console.error('Search error:', error); setError('Failed to fetch results'); setLoading(false); } }; return (
{ if (e.key === 'Enter') { handleSearch(e.currentTarget.value); } }} /> {loading && (
{progress.status} ({progress.percent}%)
)} {error && (
{error}
)}
{(searchResults.length ? searchResults : businesses).map(business => ( ))}
Business Name Contact Address Rating Website
{business.name} {business.phone}
{business.email}
{business.address} {business.rating}/5 {business.website && ( Visit Website )}
); };