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 } from '../components/utils/Functions-Endpoints/Patient'; import { GetAllDoctors } from '../components/utils/Functions-Endpoints/Doctor'; import { UserInfos } from '../components/utils/Functions-Endpoints/General'; 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); const [form, setForm] = useState({ patient_id: '', patient_name: '', patient_birth: '', doctor_id: '', doctor_name: '', contentHtml: '', }); const [patientQuery, setPatientQuery] = useState(''); const [doctorQuery, setDoctorQuery] = useState(''); const [showPatientDropdown, setShowPatientDropdown] = useState(false); const [showDoctorDropdown, setShowDoctorDropdown] = useState(false); const patientRef = useRef(); const doctorRef = useRef(); useEffect(() => { 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]); 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

`; }; 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 || '', prev.doctor_name) })); setPatientQuery(''); setShowPatientDropdown(false); }; const chooseDoctor = (doctor) => { setForm(prev => ({ ...prev, doctor_id: doctor.id, doctor_name: doctor.full_name || '', contentHtml: generateTemplate(prev.patient_name, prev.patient_birth, doctor.full_name || '') })); setDoctorQuery(''); setShowDoctorDropdown(false); }; 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 })); // 🔹 Agora com created_by sendo o ID do usuário logado 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); if (authHeader) myHeaders.append('Authorization', authHeader); myHeaders.append('Content-Type', 'application/json'); myHeaders.append('Accept', 'application/json'); myHeaders.append('Prefer', 'return=representation'); const payload = { patient_id: form.patient_id, content_html: form.contentHtml, requested_by: form.doctor_name || '' }; // Busca o id do usuário logado (via token) let userId = null; try { const token = authHeader?.replace(/^Bearer\s+/i, '') || ''; const userInfo = await UserInfos(token); userId = userInfo?.id || userInfo?.user?.id || userInfo?.sub || userInfo?.data?.id; } catch (err) { console.warn('Não foi possível obter o ID do usuário logado:', err); } if (userId) { payload.created_by = userId; } else { console.warn('ID do usuário não encontrado, created_by não será incluído.'); } payload.status = 'draft'; const res = await fetch('https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/reports', { method: 'POST', headers: myHeaders, body: JSON.stringify(payload), }); if (!res.ok) { let txt; try { txt = await res.json(); } catch { txt = await res.text(); } console.error('Erro POST criar relatório:', res.status, txt); return alert(`Erro ao criar relatório (ver console). Status ${res.status}\nMensagem: ${JSON.stringify(txt)}`); } const created = await res.json(); console.log('Relatório criado:', created); window.dispatchEvent(new Event('reports:refresh')); alert('Relatório criado com sucesso!'); navigate('/medico/relatorios'); } catch (err) { console.error('Erro salvar relatório (catch):', 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;