From d327b226c9380f4b9c38595b88d9aa620890e441 Mon Sep 17 00:00:00 2001 From: Jessica_Faro Date: Thu, 6 Nov 2025 09:37:27 -0300 Subject: [PATCH] apirelatorio --- src/PagesMedico/FormNovoRelatorio.jsx | 50 +++++++++-------- .../utils/Functions-Endpoints/General.js | 53 +++++++++++-------- 2 files changed, 58 insertions(+), 45 deletions(-) diff --git a/src/PagesMedico/FormNovoRelatorio.jsx b/src/PagesMedico/FormNovoRelatorio.jsx index b212a57..2f2aabe 100644 --- a/src/PagesMedico/FormNovoRelatorio.jsx +++ b/src/PagesMedico/FormNovoRelatorio.jsx @@ -1,11 +1,11 @@ -// src/PagesMedico/FormNovoRelatorio.jsx 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 { 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 = () => { @@ -18,7 +18,6 @@ const FormNovoRelatorio = () => { const [loadingPatients, setLoadingPatients] = useState(true); const [loadingDoctors, setLoadingDoctors] = useState(true); - // formulário const [form, setForm] = useState({ patient_id: '', patient_name: '', @@ -28,19 +27,14 @@ const FormNovoRelatorio = () => { 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 e médicos let mounted = true; const loadPatients = async () => { setLoadingPatients(true); @@ -69,7 +63,6 @@ const FormNovoRelatorio = () => { return () => { mounted = false; }; }, [authHeader]); - // fechar dropdowns quando clicar fora useEffect(() => { const handleClick = (e) => { if (patientRef.current && !patientRef.current.contains(e.target)) setShowPatientDropdown(false); @@ -103,7 +96,6 @@ const FormNovoRelatorio = () => { `; }; - // escolher paciente (clicando na lista) const choosePatient = async (patient) => { setForm(prev => ({ ...prev, @@ -127,7 +119,6 @@ const FormNovoRelatorio = () => { setShowDoctorDropdown(false); }; - // filtrar pela query (startsWith) const filteredPatients = patientQuery ? patients.filter(p => (p.full_name || '').toLowerCase().startsWith(patientQuery.toLowerCase())).slice(0, 40) : []; @@ -138,7 +129,7 @@ const FormNovoRelatorio = () => { const handleEditorChange = (html) => setForm(prev => ({ ...prev, contentHtml: html })); - // salvar novo relatório (agora com Prefer: return=representation e dispatch para refresh) + // 🔹 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.'); @@ -150,18 +141,34 @@ const FormNovoRelatorio = () => { if (authHeader) myHeaders.append('Authorization', authHeader); myHeaders.append('Content-Type', 'application/json'); myHeaders.append('Accept', 'application/json'); - // pedir que o Supabase retorne a representação do registro criado myHeaders.append('Prefer', 'return=representation'); - // monta o payload apenas com campos válidos const payload = { patient_id: form.patient_id, - content: form.contentHtml, content_html: form.contentHtml, requested_by: form.doctor_name || '' }; - // só inclui created_by se tiver um id válido - if (form.doctor_id) payload.created_by = form.doctor_id; + + // 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', { @@ -171,11 +178,10 @@ const FormNovoRelatorio = () => { }); if (!res.ok) { - // tenta ler JSON, se não for JSON lê o texto let txt; try { txt = await res.json(); - } catch (err) { + } catch { txt = await res.text(); } console.error('Erro POST criar relatório:', res.status, txt); @@ -185,9 +191,7 @@ const FormNovoRelatorio = () => { const created = await res.json(); console.log('Relatório criado:', created); - // dispara refresh global para a lista (DoctorRelatorioManager está escutando) window.dispatchEvent(new Event('reports:refresh')); - alert('Relatório criado com sucesso!'); navigate('/medico/relatorios'); } catch (err) { @@ -257,4 +261,4 @@ const FormNovoRelatorio = () => { ); }; -export default FormNovoRelatorio; +export default FormNovoRelatorio; \ No newline at end of file diff --git a/src/components/utils/Functions-Endpoints/General.js b/src/components/utils/Functions-Endpoints/General.js index 862375c..17b2711 100644 --- a/src/components/utils/Functions-Endpoints/General.js +++ b/src/components/utils/Functions-Endpoints/General.js @@ -1,32 +1,41 @@ import API_KEY from "../apiKeys"; - const UserInfos = async (access_token) => { +// Função para pegar as informações do usuário logado +const UserInfos = async (access_token) => { + if (!access_token) throw new Error("access_token é obrigatório em UserInfos"); - let Token = access_token.replace('bearer', 'Bearer') + // Normaliza o formato do token + const Token = access_token.replace(/^bearer/i, "Bearer"); - - var myHeaders = new Headers(); - myHeaders.append("apikey", API_KEY); + const myHeaders = new Headers(); + myHeaders.append("apikey", API_KEY); + myHeaders.append("Authorization", Token); - myHeaders.append("Authorization", Token); - - var requestOptions = { - method: 'GET', + const requestOptions = { + method: "GET", headers: myHeaders, - redirect: 'follow' - }; + redirect: "follow", + }; - + try { + const userInfo = await fetch( + `https://yuanqfswhberkoevtmfr.supabase.co/functions/v1/user-info`, + requestOptions + ); - const userInfo = await fetch(`https://yuanqfswhberkoevtmfr.supabase.co/functions/v1/user-info`, requestOptions) - const userInfoData = await userInfo.json() - console.log(userInfoData, "Dados do usuário") - return userInfoData -} + if (!userInfo.ok) { + const text = await userInfo.text(); + console.error("Erro em UserInfos:", userInfo.status, text); + throw new Error(`Erro ${userInfo.status} ao buscar informações do usuário`); + } -const UploadFotoAvatar = ( userID,access_token,file) => { + const userInfoData = await userInfo.json(); + console.log("Dados do usuário:", userInfoData); + return userInfoData; + } catch (error) { + console.error("Erro na função UserInfos:", error); + throw error; + } +}; - -} - -export {UserInfos} \ No newline at end of file +export { UserInfos }; \ No newline at end of file