// src/PagesMedico/DoctorRelatorioManager.jsx import API_KEY from '../components/utils/apiKeys'; import { Link } from 'react-router-dom'; import { useState, useEffect } from 'react'; import { useAuth } from '../components/utils/AuthProvider'; import { GetPatientByID } from '../components/utils/Functions-Endpoints/Patient'; import { GetDoctorByID } from '../components/utils/Functions-Endpoints/Doctor'; import { UserInfos } from '../components/utils/Functions-Endpoints/General'; import { useNavigate } from 'react-router-dom'; import html2pdf from 'html2pdf.js'; import TiptapViewer from './TiptapViewer'; import './styleMedico/DoctorRelatorioManager.css'; const DoctorRelatorioManager = () => { const navigate = useNavigate(); const { getAuthorizationHeader } = useAuth(); const authHeader = getAuthorizationHeader(); const [relatoriosOriginais, setRelatoriosOriginais] = useState([]); const [relatoriosFiltrados, setRelatoriosFiltrados] = useState([]); const [relatoriosFinais, setRelatoriosFinais] = useState([]); const [pacientesComRelatorios, setPacientesComRelatorios] = useState([]); const [medicosComRelatorios, setMedicosComRelatorios] = useState([]); const [showModal, setShowModal] = useState(false); const [relatorioModal, setRelatorioModal] = useState(null); const [termoPesquisa, setTermoPesquisa] = useState(''); const [filtroExame, setFiltroExame] = useState(''); const [examesDisponiveis, setExamesDisponiveis] = useState([]); const [modalIndex, setModalIndex] = useState(0); const [paginaAtual, setPaginaAtual] = useState(1); const [itensPorPagina, setItensPorPagina] = useState(10); const totalPaginas = Math.max(1, Math.ceil(relatoriosFinais.length / itensPorPagina)); const indiceInicial = (paginaAtual - 1) * itensPorPagina; const indiceFinal = indiceInicial + itensPorPagina; const relatoriosPaginados = relatoriosFinais.slice(indiceInicial, indiceFinal); useEffect(() => { let mounted = true; const fetchReports = async () => { try { const myHeaders = new Headers(); myHeaders.append('apikey', API_KEY); if (authHeader) myHeaders.append('Authorization', authHeader); const requestOptions = { method: 'GET', headers: myHeaders, redirect: 'follow' }; let userId = null; let userFullName = null; try { const token = authHeader ? authHeader.replace(/^Bearer\s+/i, '') : ''; if (token) { const userInfo = await UserInfos(token); userId = userInfo?.id || userInfo?.user?.id || userInfo?.sub || null; userFullName = userInfo?.full_name || (userInfo?.user && userInfo.user.full_name) || null; } } catch (err) { console.warn('Não foi possível obter UserInfos (pode não estar logado):', err); } const baseUrl = "https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/reports?select=*"; let data = []; if (userId) { try { const res = await fetch(`${baseUrl}&doctor_id=eq.${userId}`, requestOptions); data = await res.json(); } catch (e) { console.warn('Erro ao buscar por doctor_id:', e); data = []; } if ((!Array.isArray(data) || data.length === 0) && userId) { try { const res2 = await fetch(`${baseUrl}&created_by=eq.${userId}`, requestOptions); data = await res2.json(); } catch (e) { console.warn('Erro ao buscar por created_by:', e); data = []; } } if ((!Array.isArray(data) || data.length === 0) && userFullName) { try { const encodedName = encodeURIComponent(userFullName); const res3 = await fetch(`${baseUrl}&requested_by=eq.${encodedName}`, requestOptions); data = await res3.json(); } catch (e) { console.warn('Erro ao buscar por requested_by:', e); data = []; } } } if (!userId || (!Array.isArray(data) || data.length === 0)) { try { const resAll = await fetch(baseUrl, requestOptions); data = await resAll.json(); } catch (e) { console.error('Erro listar relatórios (busca completa):', e); data = []; } } const uniqueMap = new Map(); (Array.isArray(data) ? data : []).forEach(r => { if (r && r.id) uniqueMap.set(r.id, r); }); const unique = Array.from(uniqueMap.values()) .sort((a, b) => new Date(b.created_at || 0) - new Date(a.created_at || 0)); if (mounted) { setRelatoriosOriginais(unique); setRelatoriosFiltrados(unique); setRelatoriosFinais(unique); } } catch (err) { console.error('Erro listar relatórios (catch):', err); if (mounted) { setRelatoriosOriginais([]); setRelatoriosFiltrados([]); setRelatoriosFinais([]); } } }; fetchReports(); const refreshHandler = () => fetchReports(); window.addEventListener('reports:refresh', refreshHandler); return () => { mounted = false; window.removeEventListener('reports:refresh', refreshHandler); }; }, [authHeader]); useEffect(() => { const fetchRelData = async () => { const pacientes = []; const medicos = []; for (let i = 0; i < relatoriosFinais.length; i++) { const rel = relatoriosFinais[i]; try { const pacienteRes = await GetPatientByID(rel.patient_id, authHeader); pacientes.push(Array.isArray(pacienteRes) ? pacienteRes[0] : pacienteRes); } catch (err) { pacientes.push(null); } try { if (rel.doctor_id) { const docRes = await GetDoctorByID(rel.doctor_id, authHeader); medicos.push(Array.isArray(docRes) ? docRes[0] : docRes); } else if (rel.created_by) { const docRes = await GetDoctorByID(rel.created_by, authHeader); medicos.push(Array.isArray(docRes) ? docRes[0] : docRes); } else if (rel.requested_by) { medicos.push({ full_name: rel.requested_by }); } else { medicos.push({ full_name: '' }); } } catch (err) { medicos.push({ full_name: rel.requested_by || '' }); } } setPacientesComRelatorios(pacientes); setMedicosComRelatorios(medicos); }; if (relatoriosFinais.length > 0) fetchRelData(); else { setPacientesComRelatorios([]); setMedicosComRelatorios([]); } }, [relatoriosFinais, authHeader]); const abrirModal = (relatorio, pageIndex) => { const globalIndex = relatoriosFinais.findIndex(r => r.id === relatorio.id); const indexToUse = globalIndex >= 0 ? globalIndex : (indiceInicial + pageIndex); setRelatorioModal(relatorio); setModalIndex(indexToUse); setShowModal(true); }; const limparFiltros = () => { setTermoPesquisa(''); setFiltroExame(''); setRelatoriosFinais(relatoriosOriginais); setPaginaAtual(1); }; const BaixarPDFdoRelatorio = (nome_paciente, idx) => { const elemento = document.getElementById(`folhaA4-${idx}`); if (!elemento) { console.error('Elemento para gerar PDF não encontrado:', `folhaA4-${idx}`); return; } const opt = { margin: 0, filename: `relatorio_${nome_paciente || "paciente"}.pdf`, html2canvas: { scale: 2 }, jsPDF: { unit: "mm", format: "a4", orientation: "portrait" } }; html2pdf().set(opt).from(elemento).save(); }; const irParaPagina = (pagina) => { setPaginaAtual(pagina); }; const avancarPagina = () => { if (paginaAtual < totalPaginas) { setPaginaAtual(paginaAtual + 1); } }; const voltarPagina = () => { if (paginaAtual > 1) { setPaginaAtual(paginaAtual - 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; }; return (
{showModal && (
Relatório de {pacientesComRelatorios[modalIndex]?.full_name}

Clinica Rise up

Dr - CRM/SP 123456

Avenida - (79) 9 4444-4444

Paciente: {pacientesComRelatorios[modalIndex]?.full_name}

Data de nascimento: {pacientesComRelatorios[modalIndex]?.birth_date || '—'}

Data do exame: {relatoriosFinais[modalIndex]?.due_at || '—'}

Conteúdo do Relatório:

Dr {medicosComRelatorios[modalIndex]?.full_name || relatoriosFinais[modalIndex]?.requested_by}

Emitido em: {relatoriosFinais[modalIndex]?.created_at || '—'}

)}

Lista de Relatórios

Relatórios Cadastrados

Filtros
setTermoPesquisa(e.target.value)} />
setFiltroExame(e.target.value)} />
{relatoriosFinais.length} DE {relatoriosOriginais.length} RELATÓRIOS ENCONTRADOS
{relatoriosPaginados.length > 0 ? ( relatoriosPaginados.map((relatorio, index) => { const globalIndex = relatoriosFinais.findIndex(r => r.id === relatorio.id); const paciente = pacientesComRelatorios[globalIndex]; return ( ); }) ) : ( )}
Paciente CPF Exame
{paciente?.full_name || 'Carregando...'} {paciente?.cpf || 'Carregando...'} {relatorio.exam}
Nenhum relatório encontrado.
{relatoriosFinais.length > 0 && (
Itens por página:
Página {paginaAtual} de {totalPaginas} • Mostrando {indiceInicial + 1}-{Math.min(indiceFinal, relatoriosFinais.length)} de {relatoriosFinais.length} itens
)}
); }; export default DoctorRelatorioManager;