import { useState, useEffect } from "react"; import { Search, FileText } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, } from "@/components/ui/pagination"; import { agentService, OpinionRecord } from "@/services/agent"; import { useToast } from "@/hooks/use-toast"; interface AgentSearchProps { onSelectOpinion: (opinion: OpinionRecord) => void; } export const AgentSearch = ({ onSelectOpinion }: AgentSearchProps) => { const [searchTerm, setSearchTerm] = useState(""); const [searchResults, setSearchResults] = useState([]); const [currentPage, setCurrentPage] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(10); const [isLoading, setIsLoading] = useState(false); const { toast } = useToast(); // Busca pareceres da API const handleSearch = async () => { setIsLoading(true); try { const data = await agentService.getOpinions({ page: currentPage, per_page: itemsPerPage, search: searchTerm, }); setSearchResults(data); } catch (error: any) { console.error('Erro ao buscar pareceres:', error); toast({ title: "Erro ao buscar pareceres", description: error.message || "Não foi possível buscar os pareceres.", variant: "destructive", }); setSearchResults([]); } finally { setIsLoading(false); } }; // Busca automaticamente quando a página ou itemsPerPage mudam useEffect(() => { if (searchTerm.trim()) { handleSearch(); } }, [currentPage, itemsPerPage]); // Debounce para busca automática useEffect(() => { if (!searchTerm.trim()) { setSearchResults([]); return; } const timer = setTimeout(() => { if (currentPage === 1) { handleSearch(); } else { setCurrentPage(1); // Volta para primeira página ao buscar } }, 500); return () => clearTimeout(timer); }, [searchTerm]); const totalPages = Math.ceil(searchResults.length / itemsPerPage); return (

Pesquisar Base de Pareceres

setSearchTerm(e.target.value)} placeholder="Digite título ou categoria..." onKeyDown={(e) => e.key === "Enter" && handleSearch()} />
{searchResults.length > 0 && (

{searchResults.length} {searchResults.length === 1 ? 'parecer encontrado' : 'pareceres encontrados'}

)}
{isLoading ? (

Buscando pareceres...

) : searchResults.length > 0 ? (
{searchResults.map((opinion) => (
onSelectOpinion(opinion)} >

{opinion.titulo}

{opinion.categoria || '-'} {new Date(opinion.created_at).toLocaleDateString('pt-BR')}

{opinion.instrucoes}

))}
) : searchTerm ? (

Nenhum parecer encontrado para "{searchTerm}"

) : (

Digite um termo para pesquisar na base de pareceres

)}
{searchResults.length > 0 && (
Itens por página:
Mostrando {startIndex + 1}-{Math.min(startIndex + itemsPerPage, searchResults.length)} de {searchResults.length}
setCurrentPage((prev) => Math.max(1, prev - 1))} className={currentPage === 1 ? "pointer-events-none opacity-50" : "cursor-pointer"} /> {Array.from({ length: totalPages }, (_, i) => i + 1).map((page) => ( setCurrentPage(page)} isActive={currentPage === page} className="cursor-pointer" > {page} ))} setCurrentPage((prev) => Math.min(totalPages, prev + 1))} className={currentPage === totalPages ? "pointer-events-none opacity-50" : "cursor-pointer"} />
)}
); };