import { useState } from "react"; import { Button } from "@/components/ui/button"; import { SortAsc, Filter, Circle } from "lucide-react"; import ResultCard from "./result-card"; import { type SearchResponse, type DocumentWithContext } from "@shared/schema"; interface SearchResultsProps { results?: SearchResponse; expandedResults: Set; savedDocuments?: Set; onToggleExpanded: (resultId: number) => void; onAddCitation: (documentId: number, citationText: string, section?: string, pageNumber?: number) => void; onSaveDocument?: (documentId: number) => void; isLoading?: boolean; error?: Error | null; } export default function SearchResults({ results, expandedResults, savedDocuments, onToggleExpanded, onAddCitation, onSaveDocument, isLoading, error }: SearchResultsProps) { const [sortBy, setSortBy] = useState<"relevance" | "date" | "title">("relevance"); if (error) { return null; // Error is handled in parent component } if (isLoading) { return (
{[...Array(3)].map((_, i) => (
))}
); } const sortedResults = results?.results ? [...results.results].sort((a, b) => { switch (sortBy) { case "relevance": return b.relevanceScore - a.relevanceScore; case "date": return new Date(b.createdAt || 0).getTime() - new Date(a.createdAt || 0).getTime(); case "title": return a.title.localeCompare(b.title); default: return 0; } }) : []; if (!results) { return null; } return (
{/* Results Statistics */}
{results?.totalCount || 0} results found in{" "} {results?.searchTime?.toFixed(2) || '0.00'} seconds
Vector index active
{/* Search Results */}
{sortedResults.map((result) => ( onToggleExpanded(result.id)} onAddCitation={onAddCitation} onSaveDocument={onSaveDocument} /> ))}
{/* Load More */} {results?.results && results.results.length > 0 && results.totalCount > results.results.length && (
)}
); }