import React, { useState, useEffect } from "react"; import { Link, useNavigate } from "react-router-dom"; import API_KEY from "../components/utils/apiKeys"; import { useAuth } from "../components/utils/AuthProvider"; import "./style/TablePaciente.css"; import ModalErro from "../components/utils/fetchErros/ModalErro"; import manager from "../components/utils/fetchErros/ManagerFunction"; function TablePaciente({ setCurrentPage, setPatientID, setDictInfo }) { const { getAuthorizationHeader, isAuthenticated } = useAuth(); const navigate = useNavigate(); const [pacientes, setPacientes] = useState([]); const [search, setSearch] = useState(""); const [filtroConvenio, setFiltroConvenio] = useState("Todos"); const [filtroVIP, setFiltroVIP] = useState(false); const [filtroAniversariante, setFiltroAniversariante] = useState(false); const [showFiltrosAvancados, setShowFiltrosAvancados] = useState(false); const [filtroCidade, setFiltroCidade] = useState(""); const [filtroEstado, setFiltroEstado] = useState(""); const [idadeMinima, setIdadeMinima] = useState(""); const [idadeMaxima, setIdadeMaxima] = useState(""); const [dataInicial, setDataInicial] = useState(""); const [dataFinal, setDataFinal] = useState(""); const [sortKey, setSortKey] = useState(null); const [sortDir, setSortDir] = useState('asc'); const [paginaAtual, setPaginaAtual] = useState(1); const [itensPorPagina, setItensPorPagina] = useState(10); const [showDeleteModal, setShowDeleteModal] = useState(false); const [selectedPatientId, setSelectedPatientId] = useState(null); const [showModalError, setShowModalError] = useState(""); const [ErrorInfo, setErrorInfo] = useState({}); // Funções auxiliares const ehAniversariante = (dataNascimento) => { if (!dataNascimento) return false; const hoje = new Date(); const nascimento = new Date(dataNascimento); return ( hoje.getDate() === nascimento.getDate() && hoje.getMonth() === nascimento.getMonth() ); }; const calcularIdade = (dataNascimento) => { if (!dataNascimento) return 0; const hoje = new Date(); const nascimento = new Date(dataNascimento); let idade = hoje.getFullYear() - nascimento.getFullYear(); const mes = hoje.getMonth() - nascimento.getMonth(); if (mes < 0 || (mes === 0 && hoje.getDate() < nascimento.getDate())) { idade--; } return idade; }; const formatarData = (dataString) => { if (!dataString) return 'Nunca'; const data = new Date(dataString); return data.toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }); }; // Funções de API (mantidas do seu código original) const GetAnexos = async (id) => { var myHeaders = new Headers(); myHeaders.append("Authorization", "Bearer "); var requestOptions = { method: "GET", headers: myHeaders, redirect: "follow" }; try { const response = await fetch( `https://mock.apidog.com/m1/1053378-0-default/pacientes/${id}/anexos`, requestOptions ); const result = await response.json(); return result.data; } catch (error) { console.log("error", error); return []; } }; const DeleteAnexo = async (patientID) => { const RespostaGetAnexos = await GetAnexos(patientID); for (let i = 0; i < RespostaGetAnexos.length; i++) { const idAnexo = RespostaGetAnexos[i].id; var myHeaders = new Headers(); myHeaders.append("Authorization", "Bearer "); var requestOptions = { method: "DELETE", headers: myHeaders, redirect: "follow" }; fetch( `https://mock.apidog.com/m1/1053378-0-default/pacientes/${patientID}/anexos/${idAnexo}`, requestOptions ) .then((response) => response.text()) .then((result) => console.log("anexo excluido com sucesso", result)) .catch((error) => console.log("error", error)); } }; const deletePatient = async (id) => { const authHeader = getAuthorizationHeader(); var myHeaders = new Headers(); myHeaders.append('apikey', API_KEY); myHeaders.append("Authorization", authHeader); var requestOptions = { method: "DELETE", redirect: "follow", headers: myHeaders }; try { const result = await fetch( `https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/patients?id=eq.${id}`, requestOptions ); setPacientes((prev) => prev.filter((p) => p.id !== id)); } catch (error) { console.log("Deu problema", error); } finally { setShowDeleteModal(false); } }; const RefreshingToken = () => { console.log("Refreshing token..."); }; useEffect(() => { const authHeader = getAuthorizationHeader(); var myHeaders = new Headers(); myHeaders.append("apikey", API_KEY); myHeaders.append("Authorization", `${authHeader}`); var requestOptions = { method: 'GET', headers: myHeaders, redirect: 'follow' }; fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/patients", requestOptions) .then(response => { if (!response.ok) { return response.json().then(errorData => { const errorObject = { httpStatus: response.status, apiCode: errorData.code, message: errorData.message || response.statusText, details: errorData.details, hint: errorData.hint }; throw errorObject; }); } return response.json(); }) .then(result => { setPacientes(result); setShowModalError(false); }) .catch(error => { manager(setShowModalError, RefreshingToken, setErrorInfo, error); }); }, [isAuthenticated, getAuthorizationHeader]); // Filtragem const limparFiltros = () => { setSearch(""); setFiltroConvenio("Todos"); setFiltroVIP(false); setFiltroAniversariante(false); setFiltroCidade(""); setFiltroEstado(""); setIdadeMinima(""); setIdadeMaxima(""); setDataInicial(""); setDataFinal(""); setPaginaAtual(1); }; const pacientesFiltrados = Array.isArray(pacientes) ? pacientes.filter((paciente) => { const buscaNome = paciente.full_name?.toLowerCase().includes(search.toLowerCase()); const buscaCPF = paciente.cpf?.toLowerCase().includes(search.toLowerCase()); const buscaEmail = paciente.email?.toLowerCase().includes(search.toLowerCase()); const passaBusca = search === "" || buscaNome || buscaCPF || buscaEmail; const passaConvenio = filtroConvenio === "Todos" || paciente.insurance_plan === filtroConvenio; const passaVIP = filtroVIP ? paciente.vip === true : true; const passaAniversario = filtroAniversariante ? ehAniversariante(paciente.birth_date) : true; const passaCidade = filtroCidade ? paciente.city?.toLowerCase().includes(filtroCidade.toLowerCase()) : true; const passaEstado = filtroEstado ? paciente.state?.toLowerCase().includes(filtroEstado.toLowerCase()) : true; const idade = calcularIdade(paciente.birth_date); const passaIdadeMinima = idadeMinima ? idade >= parseInt(idadeMinima) : true; const passaIdadeMaxima = idadeMaxima ? idade <= parseInt(idadeMaxima) : true; const passaDataInicial = dataInicial ? paciente.last_appointment && new Date(paciente.last_appointment) >= new Date(dataInicial) : true; const passaDataFinal = dataFinal ? paciente.last_appointment && new Date(paciente.last_appointment) <= new Date(dataFinal) : true; return passaBusca && passaConvenio && passaVIP && passaAniversario && passaCidade && passaEstado && passaIdadeMinima && passaIdadeMaxima && passaDataInicial && passaDataFinal; }) : []; // Ordenação const aplicarOrdenacao = (arr) => { if (!Array.isArray(arr) || !sortKey) return arr; const copy = [...arr]; if (sortKey === 'nome') { copy.sort((a, b) => (a.full_name || '').localeCompare((b.full_name || ''), undefined, { sensitivity: 'base' })); } else if (sortKey === 'idade') { copy.sort((a, b) => calcularIdade(a.birth_date) - calcularIdade(b.birth_date)); } if (sortDir === 'desc') copy.reverse(); return copy; }; const pacientesOrdenados = aplicarOrdenacao(pacientesFiltrados); // Paginação const totalPaginas = Math.ceil(pacientesFiltrados.length / itensPorPagina); const indiceInicial = (paginaAtual - 1) * itensPorPagina; const indiceFinal = indiceInicial + itensPorPagina; const pacientesPaginados = pacientesOrdenados.slice(indiceInicial, indiceFinal); const irParaPagina = (pagina) => setPaginaAtual(pagina); const avancarPagina = () => paginaAtual < totalPaginas && setPaginaAtual(p => p + 1); const voltarPagina = () => paginaAtual > 1 && setPaginaAtual(p => p - 1); const gerarNumerosPaginas = () => { const paginas = []; const paginasParaMostrar = 5; let inicio = Math.max(1, paginaAtual - Math.floor(paginasParaMostrar / 2)); let fim = Math.min(totalPaginas, inicio + paginasParaMostrar - 1); inicio = Math.max(1, fim - paginasParaMostrar + 1); for (let i = inicio; i <= fim; i++) paginas.push(i); return paginas; }; useEffect(() => { setPaginaAtual(1); }, [search, filtroConvenio, filtroVIP, filtroAniversariante, filtroCidade, filtroEstado, idadeMinima, idadeMaxima, dataInicial, dataFinal, sortKey, sortDir]); return ( <>

Lista de Pacientes

Pacientes Cadastrados

{/* ===== FILTROS PADRONIZADOS ===== */}
Filtros
{/* Busca */}
setSearch(e.target.value)} />
{/* Linha de Filtros Básicos - TUDO EM UMA LINHA SÓ */}
{/* Convênio */}
{/* Status VIP */}
{/* Aniversariantes */}
{/* Separador */}
{/* Ordenação */}
{/* Linha de Ações */}
{/* Filtros Avançados */} {showFiltrosAvancados && (
Filtros Avançados
setFiltroCidade(e.target.value)} />
setFiltroEstado(e.target.value)} />
setIdadeMinima(e.target.value)} min="0" max="150" />
setIdadeMaxima(e.target.value)} min="0" max="150" />
setDataInicial(e.target.value)} />
setDataFinal(e.target.value)} />
)} {/* Contador */}
{pacientesFiltrados.length} DE {pacientes.length} PACIENTES ENCONTRADOS
{/* ===== TABELA SIMPLIFICADA ===== */}
{pacientesPaginados.length > 0 ? ( pacientesPaginados.map((paciente) => ( )) ) : ( )}
Nome CPF Convênio Email Ações
{paciente.full_name}
{ehAniversariante(paciente.birth_date) && ( )} {paciente.vip && ( VIP )}
{paciente.cpf} {paciente.insurance_plan || '-'} {paciente.email || 'Não informado'}

Nenhum paciente encontrado com os filtros aplicados.

{(search || filtroConvenio !== "Todos" || filtroVIP || filtroAniversariante || filtroCidade || filtroEstado || idadeMinima || idadeMaxima || dataInicial || dataFinal) && ( )}
{/* ===== PAGINAÇÃO ===== */} {pacientesFiltrados.length > 0 && (
Itens por página:
Página {paginaAtual} de {totalPaginas} • Mostrando {indiceInicial + 1}-{Math.min(indiceFinal, pacientesFiltrados.length)} de {pacientesFiltrados.length} pacientes
)}
{/* ===== MODAL DE EXCLUSÃO ===== */} {showDeleteModal && (
e.target.classList.contains("modal") && setShowDeleteModal(false)} >
Confirmação de Exclusão

Tem certeza que deseja excluir este paciente?

Esta ação não pode ser desfeita.

)} ); } export default TablePaciente;