import React, { useEffect, useState, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; import API_KEY from '../components/utils/apiKeys'; import { useAuth } from '../components/utils/AuthProvider'; import TiptapEditor from './TiptapEditor'; import { GetAllPatients, GetPatientByID } from '../components/utils/Functions-Endpoints/Patient'; import { GetAllDoctors, GetDoctorByID } from '../components/utils/Functions-Endpoints/Doctor'; import './styleMedico/FormNovoRelatorio.css'; const FormNovoRelatorio = () => { const { getAuthorizationHeader } = useAuth(); const authHeader = getAuthorizationHeader(); const navigate = useNavigate(); const [patients, setPatients] = useState([]); const [doctors, setDoctors] = useState([]); const [loadingPatients, setLoadingPatients] = useState(true); const [loadingDoctors, setLoadingDoctors] = useState(true); // formulário const [form, setForm] = useState({ patient_id: '', patient_name: '', patient_birth: '', doctor_id: '', doctor_name: '', contentHtml: '', }); // campos de busca (texto) const [patientQuery, setPatientQuery] = useState(''); const [doctorQuery, setDoctorQuery] = useState(''); // dropdown control const [showPatientDropdown, setShowPatientDropdown] = useState(false); const [showDoctorDropdown, setShowDoctorDropdown] = useState(false); const patientRef = useRef(); const doctorRef = useRef(); useEffect(() => { // carregar pacientes let mounted = true; const loadPatients = async () => { setLoadingPatients(true); try { const list = await GetAllPatients(authHeader); if (mounted && Array.isArray(list)) setPatients(list); } catch (err) { console.error('Erro GetAllPatients:', err); } finally { if (mounted) setLoadingPatients(false); } }; const loadDoctors = async () => { setLoadingDoctors(true); try { const list = await GetAllDoctors(authHeader); if (mounted && Array.isArray(list)) setDoctors(list); } catch (err) { console.error('Erro GetAllDoctors:', err); } finally { if (mounted) setLoadingDoctors(false); } }; loadPatients(); loadDoctors(); return () => { mounted = false; }; }, [authHeader]); // fechar dropdowns quando clicar fora useEffect(() => { const handleClick = (e) => { if (patientRef.current && !patientRef.current.contains(e.target)) setShowPatientDropdown(false); if (doctorRef.current && !doctorRef.current.contains(e.target)) setShowDoctorDropdown(false); }; document.addEventListener('click', handleClick); return () => document.removeEventListener('click', handleClick); }, []); const generateTemplate = (patientName = '', birthDate = '', doctorName = '') => { return `

Clinica Rise up

Dr - CRM/SP 123456

Avenida - (79) 9 4444-4444


Paciente: ${patientName}

Data de nascimento: ${birthDate}

Data do exame:

Exame:


Diagnóstico:


Conclusão:


Dr ${doctorName}

Emitido em: 0

`; }; // escolher paciente (clicando na lista) const choosePatient = async (patient) => { setForm(prev => ({ ...prev, patient_id: patient.id, patient_name: patient.full_name || '', patient_birth: patient.birth_date || '', contentHtml: generateTemplate(patient.full_name || '', patient.birth_date || '', form.doctor_name) })); setPatientQuery(''); setShowPatientDropdown(false); }; const chooseDoctor = (doctor) => { setForm(prev => ({ ...prev, doctor_id: doctor.id, doctor_name: doctor.full_name || '', contentHtml: generateTemplate(form.patient_name, form.patient_birth, doctor.full_name || '') })); setDoctorQuery(''); setShowDoctorDropdown(false); }; // filtrar pela query (startsWith) const filteredPatients = patientQuery ? patients.filter(p => (p.full_name || '').toLowerCase().startsWith(patientQuery.toLowerCase())).slice(0, 40) : []; const filteredDoctors = doctorQuery ? doctors.filter(d => (d.full_name || '').toLowerCase().startsWith(doctorQuery.toLowerCase())).slice(0, 40) : []; const handleEditorChange = (html) => setForm(prev => ({ ...prev, contentHtml: html })); // salvar novo relatório const handleSubmit = async (e) => { e.preventDefault(); if (!form.patient_id) return alert('Selecione o paciente (clicando no item) antes de salvar.'); if (!form.doctor_id) return alert('Selecione o médico (clicando no item) antes de salvar.'); try { const myHeaders = new Headers(); myHeaders.append('apikey', API_KEY); myHeaders.append('Authorization', authHeader); myHeaders.append('Content-Type', 'application/json'); const body = JSON.stringify({ patient_id: form.patient_id, content: form.contentHtml, content_html: form.contentHtml, requested_by: form.doctor_name || '', created_by: form.doctor_id || null, status: 'draft' }); const res = await fetch('https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/reports', { method: 'POST', headers: myHeaders, body, }); if (!res.ok) { const txt = await res.text(); console.error('Erro POST criar relatório:', res.status, txt); // mostra mensagem mais útil return alert(`Erro ao criar relatório (ver console). Status ${res.status}`); } alert('Relatório criado com sucesso!'); navigate('/medico/relatorios'); } catch (err) { console.error('Erro salvar relatório:', err); alert('Erro ao salvar relatório. Veja console.'); } }; return (

Criar Novo Relatório

{ setPatientQuery(e.target.value); setShowPatientDropdown(true); }} onFocus={() => setShowPatientDropdown(true)} /> {showPatientDropdown && patientQuery && (
    {filteredPatients.length > 0 ? filteredPatients.map(p => (
  • choosePatient(p)}> {p.full_name} {p.cpf ? `- ${p.cpf}` : ''}
  • )) :
  • Nenhum paciente começando com "{patientQuery}"
  • }
)}
Clique no paciente desejado para selecioná-lo e preencher o template.
{ setDoctorQuery(e.target.value); setShowDoctorDropdown(true); }} onFocus={() => setShowDoctorDropdown(true)} /> {showDoctorDropdown && doctorQuery && (
    {filteredDoctors.length > 0 ? filteredDoctors.map(d => (
  • chooseDoctor(d)}> {d.full_name} {d.crm ? `- CRM ${d.crm}` : ''}
  • )) :
  • Nenhum médico começando com "{doctorQuery}"
  • }
)}
Clique no médico desejado para selecioná-lo.

Conteúdo do Relatório (edite tudo aqui)
); }; export default FormNovoRelatorio;