From 65b7590bee510cbd70ca0439f79505d2cef4d9ef Mon Sep 17 00:00:00 2001 From: joao_pedro Date: Sat, 1 Nov 2025 16:17:33 -0300 Subject: [PATCH 1/9] Consegui trocar pela tabela --- src/PagesPaciente/ConsultasPaciente.jsx | 77 ++++++++++++++----- .../AgendarConsulta/TabelaAgendamentoDia.jsx | 2 +- src/pages/Login.jsx | 2 + 3 files changed, 60 insertions(+), 21 deletions(-) diff --git a/src/PagesPaciente/ConsultasPaciente.jsx b/src/PagesPaciente/ConsultasPaciente.jsx index fd7d312..1a732f1 100644 --- a/src/PagesPaciente/ConsultasPaciente.jsx +++ b/src/PagesPaciente/ConsultasPaciente.jsx @@ -2,35 +2,75 @@ import React from 'react' import "./style.css" import CardConsultaPaciente from './CardConsultaPaciente' import { useNavigate } from 'react-router-dom' -import { useEffect, useState } from 'react' +import { useEffect, useState, useMemo } from 'react' import API_KEY from '../components/utils/apiKeys' import { useAuth } from '../components/utils/AuthProvider' +import { UserInfos } from '../components/utils/Functions-Endpoints/General' + +import TabelaAgendamentoDia from "../components/AgendarConsulta/TabelaAgendamentoDia" + const ConsultasPaciente = ({ setConsulta }) => { const { getAuthorizationHeader } = useAuth() - + const [agendamentosOrganizados, setAgendamentosOrganizados] = useState({}) + const [listaTodasConsultas, setListaTodasConsultas] = useState([]) + const [patientID, setPatientID] = useState("") const [showDeleteModal, setShowDeleteModal] = useState(false) const [selectedID, setSelectedId] = useState("") let authHeader = getAuthorizationHeader() const [consultas, setConsultas] = useState([]) - const FiltrarAgendamentos = (agendamentos, id) => { - if (!agendamentos || !Array.isArray(agendamentos)) { - console.error("A lista de agendamentos é inválida."); - setConsultas([]); - return; + const [consultasOrganizadas, setConsultasOrganizadas] = useState({}) + + const [filaDeEspera, setFilaDeEspera] = useState([]) + + useMemo(() => { + let conjuntoConsultas = {} + let filaEspera = [] + + console.log("so muda") + if(!listaTodasConsultas.length) return + + for(let i = 0; listaTodasConsultas.length > i; i++){ + + let consulta = listaTodasConsultas[i] + if(consulta.status === "requested"){ + + filaDeEspera.push(consulta) + + + }else{ + + let data = consulta.scheduled_at.split("T")[0] + let chavesConsultas = Object.keys(conjuntoConsultas) + + if(chavesConsultas.includes(data)){ + let lista = conjuntoConsultas[data] + + lista.push(consulta) + + conjuntoConsultas = {...conjuntoConsultas, [data]:lista} + }else{ + conjuntoConsultas = {...conjuntoConsultas, [data]:[consulta] } + } + } } + - const consultasFiltradas = agendamentos.filter(agendamento => { - return agendamento.patient_id && agendamento.patient_id.toString() === id.toString(); - }); + setConsultasOrganizadas(conjuntoConsultas) + setFilaDeEspera(filaEspera) - console.log(consultasFiltradas) - setConsultas(consultasFiltradas); - } + console.log(conjuntoConsultas) + + + + }, [listaTodasConsultas]) + useEffect(() => { + let userInfos = UserInfos(authHeader) + const fetchConsultas = async () => { try { const myHeaders = new Headers(); @@ -43,16 +83,16 @@ const ConsultasPaciente = ({ setConsulta }) => { redirect: 'follow' }; - const response = await fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?select=*", requestOptions); + const response = await fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?patient_id=eq.${"6e7f8829-0574-42df-9290-8dbb70f75ada"}`, requestOptions); const result = await response.json(); - FiltrarAgendamentos(result, "6e7f8829-0574-42df-9290-8dbb70f75ada"); + setListaTodasConsultas(result); } catch (error) { console.log('error', error); } }; fetchConsultas(); - }, [authHeader]); + }, []); const navigate = useNavigate() const deleteConsulta = async (ID) => { @@ -99,10 +139,7 @@ const ConsultasPaciente = ({ setConsulta }) => {

Seus próximos atendimentos

- {consultas.map((consulta) => ( - - ))} - + {showDeleteModal &&
diff --git a/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx b/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx index a7d3ebf..cee2f9c 100644 --- a/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx +++ b/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx @@ -10,7 +10,7 @@ const TabelaAgendamentoDia = ({ handleClickAgendamento, agendamentos, setShowDel let ListaDiasComAgendamentos = Object.keys(agendamentos) - + console.log(agendamentos, "tentativa colocar consultas") //console.log(Dia, "hshdhshhsdhs") diff --git a/src/pages/Login.jsx b/src/pages/Login.jsx index 4245152..831b94a 100644 --- a/src/pages/Login.jsx +++ b/src/pages/Login.jsx @@ -127,6 +127,8 @@ function Login({ onEnterSystem }) { navigate(`/medico/`); } else if (UserData?.roles?.includes("financeiro")) { navigate(`/financeiro/`); + } else if (UserData?.roles?.includes("paciente")) { + navigate(`/paciente/`); } }else{ console.log("ERROROROROROOR") From 0f94fc444607caf3acbd60b353dc51ebb7f42704 Mon Sep 17 00:00:00 2001 From: joao_pedro Date: Sat, 1 Nov 2025 17:36:33 -0300 Subject: [PATCH 2/9] =?UTF-8?q?Altera=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PagesPaciente/ConsultasPaciente.jsx | 95 +++++++++++++++++++++++-- 1 file changed, 89 insertions(+), 6 deletions(-) diff --git a/src/PagesPaciente/ConsultasPaciente.jsx b/src/PagesPaciente/ConsultasPaciente.jsx index 1a732f1..d7f6305 100644 --- a/src/PagesPaciente/ConsultasPaciente.jsx +++ b/src/PagesPaciente/ConsultasPaciente.jsx @@ -5,9 +5,11 @@ import { useNavigate } from 'react-router-dom' import { useEffect, useState, useMemo } from 'react' import API_KEY from '../components/utils/apiKeys' 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 dayjs from 'dayjs' import TabelaAgendamentoDia from "../components/AgendarConsulta/TabelaAgendamentoDia" const ConsultasPaciente = ({ setConsulta }) => { @@ -25,21 +27,40 @@ const ConsultasPaciente = ({ setConsulta }) => { const [filaDeEspera, setFilaDeEspera] = useState([]) + const [viewFila, setViewFila] = useState(false) + useMemo(() => { let conjuntoConsultas = {} let filaEspera = [] + const fetchInfosConsultas = async (consulta) => { + let doctor = await GetDoctorByID(consulta.doctor_id, authHeader) + + let paciente = await GetPatientByID(consulta.patient_id, authHeader) + + console.log(doctor, "PACIENTE TRAZIDO PELO ") + + let consultaMelhorada = {...consulta, paciente_nome:paciente[0].full_name, medico_nome:doctor[0].full_name } + + console.log(consultaMelhorada,"ID DO MEDICO") + + + } + console.log("so muda") if(!listaTodasConsultas.length) return for(let i = 0; listaTodasConsultas.length > i; i++){ let consulta = listaTodasConsultas[i] + + fetchInfosConsultas(consulta); + + if(consulta.status === "requested"){ - filaDeEspera.push(consulta) - - + filaEspera.push(consulta) + }else{ let data = consulta.scheduled_at.split("T")[0] @@ -61,7 +82,7 @@ const ConsultasPaciente = ({ setConsulta }) => { setConsultasOrganizadas(conjuntoConsultas) setFilaDeEspera(filaEspera) - console.log(conjuntoConsultas) + console.log(filaEspera, "fila de espera") @@ -137,10 +158,72 @@ const ConsultasPaciente = ({ setConsulta }) => { Adicionar Consulta + +

Seus próximos atendimentos

+ {viewFila ? +
+
+ setSearchTerm(e.target.value)} + /> +

Fila de Espera

+
+ + + + {/* Ajustado o cabeçalho */} + {/* Ajustado o cabeçalho */} + {/* Ajustado o cabeçalho */} + {/* Ajustado o cabeçalho */} + + + + + {filaDeEspera.map((item, index) => ( + + + + + + + + ))} + +
Nome do PacienteCPFMédico SolicitadoData da SolicitaçãoAções

{item?.patient_id}

{item?.paciente_cpf}

{item.Infos?.nome_medico}

{dayjs(item.agendamento?.created_at).format('DD/MM/YYYY HH:mm')}
+ + + + + +
+
+ : - {showDeleteModal && + } + + {showDeleteModal &&
From 0b7e863461651c43b85a877ba1b531be7f8cd2cd Mon Sep 17 00:00:00 2001 From: joao_pedro Date: Sun, 2 Nov 2025 14:34:23 -0300 Subject: [PATCH 3/9] =?UTF-8?q?acesso=20de=20agendamento=20para=20o=20m?= =?UTF-8?q?=C3=A9dico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PagesMedico/DoctorAgendamentoManager.jsx | 313 +++++------------- src/PagesPaciente/ConsultasPaciente.jsx | 41 +-- .../AgendarConsulta/CardConsulta.jsx | 6 +- .../AgendarConsulta/FormNovaConsulta.jsx | 4 +- .../AgendarConsulta/TabelaAgendamentoDia.jsx | 1 - src/pages/Agendamento.jsx | 3 +- src/pages/AgendamentoCadastroManager.jsx | 9 +- 7 files changed, 118 insertions(+), 259 deletions(-) diff --git a/src/PagesMedico/DoctorAgendamentoManager.jsx b/src/PagesMedico/DoctorAgendamentoManager.jsx index 518f5c8..ac7f50a 100644 --- a/src/PagesMedico/DoctorAgendamentoManager.jsx +++ b/src/PagesMedico/DoctorAgendamentoManager.jsx @@ -41,6 +41,12 @@ const Agendamento = ({setDictInfo}) => { const [FiltredTodosMedicos, setFiltredTodosMedicos] = useState([]) const [searchTermDoctor, setSearchTermDoctor] = useState(''); + const [coresConsultas, setCoresConsultas] = useState([]) + + const [listaConsultasID, setListaConsultaID] = useState([]) + + const [motivoCancelamento, setMotivoCancelamento] = useState("") + let authHeader = getAuthorizationHeader() @@ -51,14 +57,14 @@ const Agendamento = ({setDictInfo}) => { let paciente = await GetPatientByID(patient_id, authHeader); let dicionario = { - agendamento: agendamento, - Infos: { - nome_nedico: medico.full_name, + ...agendamento, + + nome_medico: medico[0].full_name, doctor_id: medico.id, patient_id: paciente[0].id, paciente_nome: paciente[0].full_name, paciente_cpf: paciente[0].cpf - } + }; return dicionario; }; @@ -69,17 +75,19 @@ const Agendamento = ({setDictInfo}) => { // 1. Agrupamento (igual ao seu código original) for (const agendamento of listaTodosAgendamentos) { if (agendamento.status === 'requested') { - // Recomenda-se usar Promise.all para melhorar a performance - // mas, para manter a estrutura, mantemos o await no loop. + let v = await ConfigurarFiladeEspera(agendamento.patient_id, agendamento.doctor_id, agendamento); ListaFilaDeEspera.push(v); } else { - const DiaAgendamento = agendamento.scheduled_at.split("T")[0]; + + const DiaAgendamento = agendamento.scheduled_at?.split("T")[0]; + + let novoAgendamento = await ConfigurarFiladeEspera(agendamento.patient_id, agendamento.doctor_id, agendamento); if (DiaAgendamento in DictAgendamentosOrganizados) { - DictAgendamentosOrganizados[DiaAgendamento].push(agendamento); + DictAgendamentosOrganizados[DiaAgendamento].push(novoAgendamento); } else { - DictAgendamentosOrganizados[DiaAgendamento] = [agendamento]; + DictAgendamentosOrganizados[DiaAgendamento] = [novoAgendamento]; } } } @@ -129,84 +137,41 @@ const Agendamento = ({setDictInfo}) => { redirect: 'follow' }; - fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?select&doctor_id&patient_id&status&scheduled_at&order&limit&offset", requestOptions) + fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?doctor_id=eq.${"078d2a67-b4c1-43c8-ae32-c1e75bb5b3df"}`, requestOptions) .then(response => response.json()) - .then(result => {FiltrarAgendamentos(result);}) + .then(result => {FiltrarAgendamentos(result); console.log(result, "RESULTRADO DA API")}) .catch(error => console.log('error', error)); - const PegarTodosOsMedicos = async () => { - let lista = [] - const TodosOsMedicos = await GetAllDoctors(authHeader) - - for(let d = 0; TodosOsMedicos.length > d; d++){ - lista.push({nomeMedico: TodosOsMedicos[d].full_name, idMedico: TodosOsMedicos[d].id })} - setListaDeMedicos(lista) - } - PegarTodosOsMedicos() + }, []) - useEffect(() => { - console.log("mudou FiltredTodosMedicos:", FiltredTodosMedicos); - if (FiltredTodosMedicos.length === 1) { - const unicoMedico = FiltredTodosMedicos[0]; - console.log(unicoMedico) - const idMedicoFiltrado = unicoMedico.idMedico; - console.log(`Médico único encontrado: ${unicoMedico.nomeMedico}. ID: ${idMedicoFiltrado}`); - - const agendamentosDoMedico = filtrarAgendamentosPorMedico( - DictAgendamentosOrganizados, - idMedicoFiltrado - ); - console.log(`Total de agendamentos filtrados para este médico: ${agendamentosDoMedico.length}`); - console.log("Lista completa de Agendamentos do Médico:", agendamentosDoMedico); - FiltrarAgendamentos(agendamentosDoMedico) - - } - }, [FiltredTodosMedicos]); const deleteConsulta = (selectedPatientId) => { - console.log("tentando apagar") - var myHeaders = new Headers(); - myHeaders.append("Authorization", authHeader); - myHeaders.append("apikey", API_KEY) + var myHeaders = new Headers(); + myHeaders.append("Content-Type", "application/json"); + myHeaders.append('apikey', API_KEY) + myHeaders.append("authorization", authHeader) -var requestOptions = { - method: 'DELETE', - redirect: 'follow', - headers: myHeaders -}; -fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${selectedPatientId}`, requestOptions) - .then(response => response.json()) - .then(result => console.log(result)) - .catch(error => console.log('error', error)); - + var raw = JSON.stringify({ "status":"cancelled", + "cancellation_reason": motivoCancelamento + }); + + + var requestOptions = { + method: 'PATCH', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${selectedPatientId}`, requestOptions) + .then(response => {if(response.status !== 200)(console.log(response))}) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); } - -/** - * Filtra todos os agendamentos em um objeto aninhado (data -> [agendamentos]) - * com base no ID do médico. - * - * @param {Object} dictAgendamentos - O dicionário de agendamentos. - * @param {string} idMedicoFiltrado - O ID do médico (doctor_id) para ser usado como filtro. - * @returns {Array} Um array contendo todos os agendamentos que correspondem ao idMedicoFiltrado. - */ -const filtrarAgendamentosPorMedico = (dictAgendamentos, idMedicoFiltrado) => { - - // O corpo da função deve usar esses nomes de variáveis: - const todasAsListasDeAgendamentos = Object.values(dictAgendamentos); - - const todosOsAgendamentos = todasAsListasDeAgendamentos.flat(); - - const agendamentosFiltrados = todosOsAgendamentos.filter(agendamento => - agendamento.doctor_id === idMedicoFiltrado - ); - - return agendamentosFiltrados; -}; - // Lógica para filtrar os dados da AGENDA (AgendamentosMes) @@ -254,20 +219,6 @@ const filtrarAgendamentosPorMedico = (dictAgendamentos, idMedicoFiltrado) => { else setPageConsulta(true) }; - -const handleSearchMedicos = (term) => { - setSearchTermDoctor(term); - if (term.trim() === '') { - setFiltredTodosMedicos([]); - return; - } - - // Lógica simples de filtragem: - const filtered = ListaDeMedicos.filter(medico => - medico.nomeMedico.toLowerCase().includes(term.toLowerCase()) - ); - setFiltredTodosMedicos(filtered); -}; const handleClickCancel = () => setPageConsulta(false) @@ -289,78 +240,10 @@ const handleSearchMedicos = (term) => {
- -
- -
-
- - handleSearchMedicos(e.target.value)} // Chama a nova função de filtro - /> -
-
- - {/* DROPDOWN (RENDERIZAÇÃO CONDICIONAL) */} - {searchTermDoctor && FiltredTodosMedicos.length > 0 && ( -
- {FiltredTodosMedicos.map((medico) => ( -
{ - // Ação ao selecionar o médico - setSearchTermDoctor(medico.nomeMedico); // Preenche o input - //setFiltredTodosMedicos([]); // Fecha o dropdown - // Lógica adicional, como selecionar o ID do médico... - }} - > -

{medico.nomeMedico}

-
- ))} -
- )} -
- - -
- - -
- -
- - -
- +
- {FiladeEspera === false ? - ( +
@@ -383,74 +266,23 @@ const handleSearchMedicos = (term) => {
- {tabela === "diario" && } - {tabela === 'semanal' && } - {tabela === 'mensal' && } + {tabela === "diario" && } + + + {tabela === 'semanal' && } + + + {tabela === 'mensal' && }
- ) - : - ( -
-
- setSearchTerm(e.target.value)} - /> -

Fila de Espera

-
- - - - - - - - - - - - - {filaEsperaData.map((item, index) => ( - - - - - - - - ))} - -
NomeTelefoneTelefoneEntrou na fila de esperaAções

{item.Infos?.paciente_nome}

{}

{}{}
- - - - - -
-
- ) - } - + +
) : ( @@ -468,12 +300,12 @@ const handleSearchMedicos = (term) => { e.target.classList.contains("modal") && setShowDeleteModal(false) } > -
+
- Confirmação de Exclusão + Confirmação de Cancelamento