diff --git a/src/PagesMedico/DoctorRelatorioManager.jsx b/src/PagesMedico/DoctorRelatorioManager.jsx index cf5d2c4..c15db0c 100644 --- a/src/PagesMedico/DoctorRelatorioManager.jsx +++ b/src/PagesMedico/DoctorRelatorioManager.jsx @@ -19,45 +19,59 @@ const DoctorRelatorioManager = () => { const [showModal, setShowModal] = useState(false); const [index, setIndex] = useState(); - // busca lista de relatórios useEffect(() => { + let mounted = true; + const fetchReports = async () => { try { var myHeaders = new Headers(); myHeaders.append('apikey', API_KEY); - myHeaders.append('Authorization', authHeader); + if (authHeader) myHeaders.append('Authorization', authHeader); var requestOptions = { method: 'GET', headers: myHeaders, redirect: 'follow' }; const res = await fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/reports?select=*", requestOptions); const data = await res.json(); - setRelatorios(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) setRelatorios(unique); } catch (err) { console.error('Erro listar relatórios', err); - setRelatorios([]); + if (mounted) setRelatorios([]); } }; + fetchReports(); + + const refreshHandler = () => fetchReports(); + window.addEventListener('reports:refresh', refreshHandler); + + return () => { + mounted = false; + window.removeEventListener('reports:refresh', refreshHandler); + }; }, [authHeader]); - // depois que RelatoriosFiltrados mudar, busca pacientes e médicos correspondentes useEffect(() => { const fetchRelData = async () => { const pacientes = []; const medicos = []; for (let i = 0; i < RelatoriosFiltrados.length; i++) { const rel = RelatoriosFiltrados[i]; - // paciente try { const pacienteRes = await GetPatientByID(rel.patient_id, authHeader); pacientes.push(Array.isArray(pacienteRes) ? pacienteRes[0] : pacienteRes); } catch (err) { pacientes.push(null); } - // médico: tenta created_by ou requested_by id se existir try { const doctorId = rel.created_by || rel.requested_by || null; if (doctorId) { - // se created_by é id (uuid) usamos GetDoctorByID, senão se requested_by for nome, guardamos nome const docRes = await GetDoctorByID(doctorId, authHeader); medicos.push(Array.isArray(docRes) ? docRes[0] : docRes); } else { @@ -77,54 +91,73 @@ const DoctorRelatorioManager = () => { } }, [RelatoriosFiltrados, authHeader]); - const BaixarPDFdoRelatorio = (nome_paciente) => { - const elemento = document.getElementById("folhaA4"); - const opt = { margin: 0, filename: `relatorio_${nome_paciente || "paciente"}.pdf`, html2canvas: { scale: 2 }, jsPDF: { unit: "mm", format: "a4", orientation: "portrait" } }; + 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(); }; return (
{showModal && ( -
-
+
setShowModal(false)}> + {/* aqui: classe modal-dialog-square para ficar quadrado */} +
e.stopPropagation()}>
-
-
Relatório de {PacientesComRelatorios[index]?.full_name}
- +
+
Relatório de {PacientesComRelatorios[index]?.full_name}
+
+
-
-
-

Clinica Rise up

-

Dr - CRM/SP 123456

-

Avenida - (79) 9 4444-4444

+
+
+

Clinica Rise up

+

Dr - CRM/SP 123456

+

Avenida - (79) 9 4444-4444

-
-

Paciente: {PacientesComRelatorios[index]?.full_name}

-

Data de nascimento: {PacientesComRelatorios[index]?.birth_date}

-

Data do exame: {RelatoriosFiltrados[index]?.due_at || ''}

- {/* Exibe conteúdo salvo (content_html) */} -

Conteúdo do Relatório:

- +
+

Paciente: {PacientesComRelatorios[index]?.full_name}

+

Data de nascimento: {PacientesComRelatorios[index]?.birth_date || '—'}

+

Data do exame: {RelatoriosFiltrados[index]?.due_at || '—'}

+ +

Conteúdo do Relatório:

+
+ +
-
+

Dr {MedicosComRelatorios[index]?.full_name || RelatoriosFiltrados[index]?.requested_by}

-

Emitido em: {RelatoriosFiltrados[index]?.created_at || '—'}

+

Emitido em: {RelatoriosFiltrados[index]?.created_at || '—'}

-
- - + +
+ +
)} + {/* restante da página (lista) permanece igual */}

Lista de Relatórios

@@ -173,7 +206,7 @@ const DoctorRelatorioManager = () => { )) ) : ( - Nenhum paciente encontrado. + Nenhum paciente encontrado. )} diff --git a/src/PagesMedico/EditPageRelatorio.jsx b/src/PagesMedico/EditPageRelatorio.jsx index 5459211..5e2c634 100644 --- a/src/PagesMedico/EditPageRelatorio.jsx +++ b/src/PagesMedico/EditPageRelatorio.jsx @@ -1,4 +1,4 @@ -// EditPageRelatorio.jsx +// src/PagesMedico/EditPageRelatorio.jsx import React, { useEffect, useState } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import API_KEY from '../components/utils/apiKeys'; @@ -7,7 +7,6 @@ import TiptapEditor from '../PagesMedico/TiptapEditor'; import { GetPatientByID } from '../components/utils/Functions-Endpoints/Patient'; import { GetDoctorByID } from '../components/utils/Functions-Endpoints/Doctor'; - const EditPageRelatorio = () => { const params = useParams(); const navigate = useNavigate(); @@ -19,7 +18,6 @@ const EditPageRelatorio = () => { const [doctor, setDoctor] = useState(null); const [html, setHtml] = useState(''); - const generateTemplate = (r = {}, p = {}, d = {}) => { const patientName = p?.full_name || '[NOME DO PACIENTE]'; const birthDate = p?.birth_date || ''; @@ -48,34 +46,29 @@ const EditPageRelatorio = () => { `; }; - useEffect(() => { const load = async () => { setLoading(true); try { const myHeaders = new Headers(); myHeaders.append("apikey", API_KEY); - myHeaders.append("Authorization", authHeader); + if (authHeader) myHeaders.append("Authorization", authHeader); const requestOptions = { method: 'GET', headers: myHeaders, redirect: 'follow' }; - // Pega relatório por id (supabase geralmente retorna array para ?id=eq.X) const resp = await fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/reports?id=eq.${params.id}`, requestOptions); const data = await resp.json(); const rep = Array.isArray(data) ? data[0] : data; if (!rep) throw new Error('Relatório não encontrado'); - setReport(rep); - // busca paciente if (rep.patient_id) { const p = await GetPatientByID(rep.patient_id, authHeader); setPatient(Array.isArray(p) ? p[0] : p); } - // busca doctor se tiver created_by/requested_by id (tentamos fallback) if (rep.created_by) { try { @@ -86,7 +79,6 @@ const EditPageRelatorio = () => { } } - // content_html preferencial let initial = rep.content_html || rep.content || rep.diagnosis || rep.conclusion || ''; if (!initial || initial.trim() === '') { @@ -104,16 +96,15 @@ const EditPageRelatorio = () => { // eslint-disable-next-line }, [params.id, authHeader]); - const handleSave = async () => { setLoading(true); try { const myHeaders = new Headers(); myHeaders.append('apikey', API_KEY); - myHeaders.append('Authorization', authHeader); + if (authHeader) myHeaders.append('Authorization', authHeader); myHeaders.append('Content-Type', 'application/json'); - - // Adicionado para que a API retorne o registro atualizado + myHeaders.append('Accept', 'application/json'); + // pedir que o Supabase retorne a representação do registro atualizado (opcional) myHeaders.append('Prefer', 'return=representation'); const body = JSON.stringify({ content_html: html }); @@ -125,15 +116,21 @@ const EditPageRelatorio = () => { }); if (!res.ok) { - const txt = await res.text(); + let txt; + try { txt = await res.text(); } catch (e) { txt = 'erro lendo resposta'; } console.error('Erro PATCH', res.status, txt); throw new Error('Erro na API'); } // Recebe o dado atualizado e atualiza o estado do componente - const updatedData = await res.json(); + let updatedData; + try { + updatedData = await res.json(); + } catch (e) { + updatedData = null; + } const updatedReport = Array.isArray(updatedData) ? updatedData[0] : updatedData; - + if (updatedReport) { setReport(updatedReport); setHtml(updatedReport.content_html || ''); @@ -150,21 +147,17 @@ const EditPageRelatorio = () => { } }; - if (loading) return
Carregando...
; - return (

Editar Relatório do Paciente: {patient?.full_name || '...'}

-
Conteúdo do Relatório
setHtml(newHtml)} />
-