import React, { useState, useEffect } from 'react'; import { useQuery } from 'react-query'; import { useNavigate } from 'react-router-dom'; import { PencilIcon } from '@heroicons/react/24/outline'; import api from '../../services/api'; import { formatCPF, formatTelefone } from '../../utils/formatters'; interface ClientesListProps { searchTerm: string; onEdit: (cliente: any) => void; } export const ClientesList: React.FC = ({ searchTerm, onEdit }) => { const navigate = useNavigate(); const [debouncedTerm, setDebouncedTerm] = useState(searchTerm); // Implementar debounce para a busca useEffect(() => { const timer = setTimeout(() => { setDebouncedTerm(searchTerm); }, 300); // 300ms de delay return () => clearTimeout(timer); }, [searchTerm]); const { data: clientes = [], isLoading } = useQuery( ['clientes', debouncedTerm], async () => { const response = await api.get('/clientes', { params: { search: debouncedTerm.toUpperCase() } }); // Filtrar localmente para melhor resposta let filteredClientes = response.data; if (debouncedTerm) { const searchTerms = debouncedTerm.toUpperCase().split(' '); filteredClientes = response.data.filter((cliente: any) => searchTerms.every(term => cliente.nome.includes(term) || cliente.cpfCnpj.includes(term) || cliente.email?.includes(term.toLowerCase()) ) ); } // Ordenar por nome return filteredClientes.sort((a: any, b: any) => a.nome.localeCompare(b.nome) ); }, { staleTime: 1000 * 60, // 1 minuto cacheTime: 1000 * 60 * 5, // 5 minutos keepPreviousData: true // Manter dados anteriores enquanto carrega novos } ); if (isLoading) { return (
); } return (
{clientes.length === 0 ? (
Nenhum cliente encontrado
) : ( {clientes.map((cliente: any) => ( navigate(`/clientes/${cliente.id}`)} > ))}
Nome CPF/CNPJ Telefone Email Ações
{cliente.nome}
{formatCPF(cliente.cpfCnpj)}
{formatTelefone(cliente.telefone)}
{cliente.email}
)}
); };