Compare commits

..

No commits in common. "c1d4e81acf7bdffdd6960fc0222abd17d772c326" and "a709dffde816b0b4cb9745eb80b233baf7fe4493" have entirely different histories.

21 changed files with 385 additions and 851 deletions

View File

@ -1,90 +0,0 @@
import React, { useState, useEffect } from 'react'
import FormNovaConsulta from '../components/AgendarConsulta/FormNovaConsulta'
import API_KEY from '../components/utils/apiKeys'
import { useAuth } from '../components/utils/AuthProvider'
import { UserInfos } from '../components/utils/Functions-Endpoints/General'
const DoctorAgendamentoEditPage = ({DictInfo, setDictInfo}) => {
const {getAuthorizationHeader} = useAuth();
const [consultaToPut, setConsultaToPUT] = useState({})
const [idUsuario, setIdUsuario] = useState("")
const authHeader = getAuthorizationHeader()
useEffect(() => {
//console.log(DictInfo.scheduled_at.split("T")[0])
setDictInfo({...DictInfo, dataAtendimento:DictInfo?.scheduled_at?.split("T")[0]})
const fetchUserInfo = async () => {
const InfosUser = await UserInfos(authHeader)
console.log("Informações", InfosUser)
setIdUsuario(InfosUser.id)
}
fetchUserInfo()
}, [])
const handleSave = (DictParaPatch) => {
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
myHeaders.append('apikey', API_KEY)
myHeaders.append("authorization", authHeader)
console.log(DictParaPatch)
var raw = JSON.stringify({"patient_id": DictParaPatch.patient_id,
"doctor_id": DictParaPatch.doctor_id,
"duration_minutes": 30,
"chief_complaint": "Dor de cabeça há 3 ",
"created_by": idUsuario,
"scheduled_at": `${DictParaPatch.dataAtendimento}T${DictParaPatch.horarioInicio}:00.000Z`,
"appointment_type": DictParaPatch.tipo_consulta,
"patient_notes": "Prefiro horário pela manhã",
"insurance_provider": DictParaPatch.convenio,
"status": DictParaPatch.status,
"created_by": idUsuario
});
// console.log(DictParaPatch)
//console.log(id)
var requestOptions = {
method: 'PATCH',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${DictInfo.id}`, requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
}
return (
<div>
<FormNovaConsulta agendamento={DictInfo} setAgendamento={setDictInfo} onSave={handleSave}/>
</div>
)
}
export default DoctorAgendamentoEditPage

View File

@ -13,7 +13,7 @@ import { useAuth } from '../components/utils/AuthProvider.js';
// NOVO: Caminho de importação corrigido com base na sua estrutura de pastas // NOVO: Caminho de importação corrigido com base na sua estrutura de pastas
import AgendamentosMes from '../components/AgendarConsulta/DadosConsultasMock.js'; import AgendamentosMes from '../components/AgendarConsulta/DadosConsultasMock.js';
import { UserInfos } from '../components/utils/Functions-Endpoints/General.js';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import "../pages/style/Agendamento.css"; import "../pages/style/Agendamento.css";
import '../pages/style/FilaEspera.css'; import '../pages/style/FilaEspera.css';
@ -35,15 +35,11 @@ const Agendamento = ({setDictInfo}) => {
const [DictAgendamentosOrganizados, setAgendamentosOrganizados ] = useState({}) const [DictAgendamentosOrganizados, setAgendamentosOrganizados ] = useState({})
const [showDeleteModal, setShowDeleteModal] = useState(false) const [showDeleteModal, setShowDeleteModal] = useState(false)
const [showConfirmModal, setShowConfirmModal] = useState(false) const [AgendamentoFiltrado, setAgendamentoFiltrado] = useState()
const [coresConsultas, setCoresConsultas] = useState([]) const [ListaDeMedicos, setListaDeMedicos] = useState([])
const [FiltredTodosMedicos, setFiltredTodosMedicos] = useState([])
const [listaConsultasID, setListaConsultaID] = useState([]) const [searchTermDoctor, setSearchTermDoctor] = useState('');
const [motivoCancelamento, setMotivoCancelamento] = useState("")
const [user, setUser] = useState({})
let authHeader = getAuthorizationHeader() let authHeader = getAuthorizationHeader()
@ -55,14 +51,14 @@ const Agendamento = ({setDictInfo}) => {
let paciente = await GetPatientByID(patient_id, authHeader); let paciente = await GetPatientByID(patient_id, authHeader);
let dicionario = { let dicionario = {
...agendamento, agendamento: agendamento,
Infos: {
nome_medico: medico[0].full_name, nome_nedico: medico.full_name,
doctor_id: medico.id, doctor_id: medico.id,
patient_id: paciente[0].id, patient_id: paciente[0].id,
paciente_nome: paciente[0].full_name, paciente_nome: paciente[0].full_name,
paciente_cpf: paciente[0].cpf paciente_cpf: paciente[0].cpf
}
}; };
return dicionario; return dicionario;
}; };
@ -73,19 +69,17 @@ const Agendamento = ({setDictInfo}) => {
// 1. Agrupamento (igual ao seu código original) // 1. Agrupamento (igual ao seu código original)
for (const agendamento of listaTodosAgendamentos) { for (const agendamento of listaTodosAgendamentos) {
if (agendamento.status === 'requested') { 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); let v = await ConfigurarFiladeEspera(agendamento.patient_id, agendamento.doctor_id, agendamento);
ListaFilaDeEspera.push(v); ListaFilaDeEspera.push(v);
} else { } 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) { if (DiaAgendamento in DictAgendamentosOrganizados) {
DictAgendamentosOrganizados[DiaAgendamento].push(novoAgendamento); DictAgendamentosOrganizados[DiaAgendamento].push(agendamento);
} else { } else {
DictAgendamentosOrganizados[DiaAgendamento] = [novoAgendamento]; DictAgendamentosOrganizados[DiaAgendamento] = [agendamento];
} }
} }
} }
@ -123,23 +117,8 @@ const Agendamento = ({setDictInfo}) => {
setfilaEsperaData(ListaFilaDeEspera); setfilaEsperaData(ListaFilaDeEspera);
}; };
useEffect(() => {
console.log(user, "usuario")
}, [user])
// Requisição inicial para mostrar os agendamentos do banco de dados // Requisição inicial para mostrar os agendamentos do banco de dados
useEffect(() => { useEffect(() => {
async function fetchDadosUser (){
let dado = await UserInfos(authHeader)
setUser(dado)
}
fetchDadosUser()
var myHeaders = new Headers(); var myHeaders = new Headers();
myHeaders.append("Authorization", authHeader); myHeaders.append("Authorization", authHeader);
myHeaders.append("apikey", API_KEY) myHeaders.append("apikey", API_KEY)
@ -150,42 +129,85 @@ console.log(user, "usuario")
redirect: 'follow' redirect: 'follow'
}; };
fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?doctor_id=eq.${"078d2a67-b4c1-43c8-ae32-c1e75bb5b3df"}`, requestOptions) fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?select&doctor_id&patient_id&status&scheduled_at&order&limit&offset", requestOptions)
.then(response => response.json()) .then(response => response.json())
.then(result => {FiltrarAgendamentos(result); console.log(result, "RESULTRADO DA API")}) .then(result => {FiltrarAgendamentos(result);})
.catch(error => console.log('error', error)); .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) => { const deleteConsulta = (selectedPatientId) => {
var myHeaders = new Headers(); console.log("tentando apagar")
myHeaders.append("Content-Type", "application/json"); var myHeaders = new Headers();
myHeaders.append('apikey', API_KEY) myHeaders.append("Authorization", authHeader);
myHeaders.append("authorization", authHeader) myHeaders.append("apikey", API_KEY)
var requestOptions = {
method: 'DELETE',
redirect: 'follow',
headers: myHeaders
};
var raw = JSON.stringify({ "status":"cancelled", fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${selectedPatientId}`, requestOptions)
"cancellation_reason": motivoCancelamento .then(response => response.json())
}); .then(result => console.log(result))
.catch(error => console.log('error', error));
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) // Lógica para filtrar os dados da AGENDA (AgendamentosMes)
const filteredAgendamentos = useMemo(() => { const filteredAgendamentos = useMemo(() => {
@ -227,30 +249,26 @@ const deleteConsulta = (selectedPatientId) => {
return ListaDiasDatas return ListaDiasDatas
} }
const handleClickAgendamento = (agendamento) => {
const confirmConsulta = (selectedPatientId) => { if (agendamento.status !== 'vazio') return
var myHeaders = new Headers(); else setPageConsulta(true)
myHeaders.append("Content-Type", "application/json"); };
myHeaders.append('apikey', API_KEY)
myHeaders.append("authorization", authHeader)
var raw = JSON.stringify({ "status":"confirmed" 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);
};
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));
}
const handleClickCancel = () => setPageConsulta(false) const handleClickCancel = () => setPageConsulta(false)
@ -271,10 +289,78 @@ const confirmConsulta = (selectedPatientId) => {
<div className='atendimento-eprocura'> <div className='atendimento-eprocura'>
<div className='busca-atendimento-container'> <div className='busca-atendimento-container'>
<div className='input-e-dropdown-wrapper'>
<div className='busca-atendimento'>
<div>
<i className="fa-solid fa-calendar-day"></i>
<input
type="text"
placeholder="Filtrar atendimento por médico..."
value={searchTermDoctor}
onChange={(e) => handleSearchMedicos(e.target.value)} // Chama a nova função de filtro
/>
</div>
</div>
{/* DROPDOWN (RENDERIZAÇÃO CONDICIONAL) */}
{searchTermDoctor && FiltredTodosMedicos.length > 0 && (
<div className='dropdown-medicos'>
{FiltredTodosMedicos.map((medico) => (
<div
key={medico.id}
className='dropdown-item'
onClick={() => {
// 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...
}}
>
<p>{medico.nomeMedico} </p>
</div>
))}
</div>
)}
</div>
</div> </div>
<section className='calendario-ou-filaespera'>
<div className='unidade-selecionarprofissional'>
<select>
<option value="" disabled selected >Unidade</option>
<option value="">Unidade Central</option>
<option value="">Unidade Zona Norte</option>
<option value="">Unidade Zona Oeste</option>
</select>
<input type="text" placeholder='Selecionar profissional' />
</div>
<div className='container-btns-agenda-fila_esepera'>
<button
className={`btn-agenda ${FiladeEspera === false ? "opc-agenda-ativo" : ""}`}
onClick={() => {
setFiladeEspera(false);
setSearchTerm('');
}}
>
Agenda
</button>
<button
className={`btn-fila-espera ${FiladeEspera === true ? "opc-filaespera-ativo" : ""}`}
onClick={() => {
setFiladeEspera(true);
setSearchTerm('');
}}
>
Fila de espera
</button>
</div>
<section className='calendario-ou-filaespera'>
{FiladeEspera === false ?
(
<div className='calendario'> <div className='calendario'>
<div> <div>
<section className='btns-e-legenda-container'> <section className='btns-e-legenda-container'>
@ -297,34 +383,80 @@ const confirmConsulta = (selectedPatientId) => {
</div> </div>
</section> </section>
{tabela === "diario" && <TabelaAgendamentoDia agendamentos={DictAgendamentosOrganizados} {tabela === "diario" && <TabelaAgendamentoDia handleClickAgendamento={handleClickAgendamento} agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo} />}
setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo} {tabela === 'semanal' && <TabelaAgendamentoSemana agendamentos={DictAgendamentosOrganizados} ListarDiasdoMes={ListarDiasdoMes} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo}/>}
listaConsultasID={listaConsultasID} {tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo} />}
setListaConsultaID={setListaConsultaID} coresConsultas={coresConsultas} setShowConfirmModal={setShowConfirmModal}
/>}
{tabela === 'semanal' && <TabelaAgendamentoSemana agendamentos={DictAgendamentosOrganizados} ListarDiasdoMes={ListarDiasdoMes}
setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo}
listaConsultasID={listaConsultasID} setListaConsultaID={setListaConsultaID} coresConsultas={coresConsultas} setShowConfirmModal={setShowConfirmModal} />}
{tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} agendamentos={DictAgendamentosOrganizados}
setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo} listaConsultasID={listaConsultasID}
setListaConsultaID={setListaConsultaID} coresConsultas={coresConsultas} setShowConfirmModal={setShowConfirmModal} />}
</div> </div>
</div> </div>
)
:
(
<div className="fila-container">
<div className="fila-header">
<input
type="text"
placeholder="Pesquisar na fila de espera..."
className="busca-fila-espera"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<h2 className="fila-titulo">Fila de Espera</h2>
</div>
<table className="fila-tabela">
<thead>
<tr>
<th>Nome</th>
<th>Telefone</th>
</section> <th>Telefone</th>
<th>Entrou na fila de espera</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
{filaEsperaData.map((item, index) => (
<tr key={index}>
<td> <p>{item.Infos?.paciente_nome} </p> </td>
<td><p>{} </p></td>
<td>{}</td>
<td>{}</td>
<td> <div className="d-flex gap-2">
<button className="btn btn-sm btn-edit"
onClick={() => {
console.log(item, 'item')
navigate(`${2}/edit`)
setDictInfo(item)
}}
>
<i className="bi bi-pencil me-1"></i> Editar
</button>
<button
className="btn btn-sm btn-delete"
onClick={() => {
setSelectedId(item.agendamento.id)
setShowDeleteModal(true);
}}
>
<i className="bi bi-trash me-1"></i> Excluir
</button>
</div></td>
</tr>
))}
</tbody>
</table>
</div>
)
}
</section>
</div> </div>
) : ( ) : (
<AgendamentoCadastroManager setPageConsulta={setPageConsulta} Dict={{nome_medico:user?.profile?.full_name}} <AgendamentoCadastroManager setPageConsulta={setPageConsulta} />
/>
)} )}
{showDeleteModal && (
{showConfirmModal &&(
<div <div
className="modal fade show" className="modal fade show"
style={{ style={{
@ -337,74 +469,11 @@ const confirmConsulta = (selectedPatientId) => {
} }
> >
<div className="modal-dialog modal-dialog-centered"> <div className="modal-dialog modal-dialog-centered">
<div className="modal-content">
<div className="modal-header bg-success">
<h5 className="modal-title">
Confirmação de edição
</h5>
</div>
<div className="modal-body">
<p className="mb-0 fs-5">
Tem certeza que deseja retirar o cancelamento ?
</p>
</div>
<div className="modal-footer">
<button
type="button"
className="btn btn-primary"
onClick={() => {setShowConfirmModal(false); setSelectedId("")}}
>
Cancelar
</button>
<button
type="button"
className="btn btn-success"
onClick={() => {confirmConsulta(selectedID);setShowConfirmModal(false)
let lista_cores = coresConsultas
let lista = listaConsultasID
lista.push(selectedID)
lista_cores.push("confirmed")
setCoresConsultas(lista_cores)
setListaConsultaID(lista)
}}
>
<i className="bi bi-trash me-1"></i> Confirmar
</button>
</div>
</div>
</div>
</div>)}
{showDeleteModal && (
<div
className="modal fade show"
style={{
display: "block",
backgroundColor: "rgba(0, 0, 0, 0.5)",
}}
tabIndex="-1"
onClick={(e) =>
e.target.classList.contains("modal") && setShowDeleteModal(false)
}
>
<div className="modal-dialog modal-dialog-centered">
<div className="modal-content"> <div className="modal-content">
<div className="modal-header bg-danger bg-opacity-25"> <div className="modal-header bg-danger bg-opacity-25">
<h5 className="modal-title text-danger"> <h5 className="modal-title text-danger">
Confirmação de Cancelamento Confirmação de Exclusão
</h5> </h5>
<button <button
type="button" type="button"
@ -415,12 +484,8 @@ const confirmConsulta = (selectedPatientId) => {
<div className="modal-body"> <div className="modal-body">
<p className="mb-0 fs-5"> <p className="mb-0 fs-5">
Qual o motivo do cancelamento? Tem certeza que deseja excluir este agendamento?
</p> </p>
<div className='campo-de-input'>
<textarea className='input-modal' value={motivoCancelamento} onChange={(e) => setMotivoCancelamento(e.target.value)} />
</div>
</div> </div>
<div className="modal-footer"> <div className="modal-footer">
@ -428,10 +493,7 @@ const confirmConsulta = (selectedPatientId) => {
<button <button
type="button" type="button"
className="btn btn-primary" className="btn btn-primary"
onClick={() => { onClick={() => setShowDeleteModal(false)}
setShowDeleteModal(false);
}}
> >
Cancelar Cancelar
</button> </button>
@ -440,24 +502,7 @@ const confirmConsulta = (selectedPatientId) => {
<button <button
type="button" type="button"
className="btn btn-danger" className="btn btn-danger"
onClick={() => { onClick={() => {deleteConsulta(selectedID);setShowDeleteModal(false)}}
deleteConsulta(selectedID)
setShowDeleteModal(false)
let lista_cores = coresConsultas
let lista = listaConsultasID
lista.push(selectedID)
lista_cores.push("cancelled")
setCoresConsultas(lista_cores)
setListaConsultaID(lista)
console.log("lista", lista)
}}
> >
<i className="bi bi-trash me-1"></i> Excluir <i className="bi bi-trash me-1"></i> Excluir
@ -468,8 +513,6 @@ const confirmConsulta = (selectedPatientId) => {
</div>)} </div>)}
</div> </div>
) )
} }

View File

@ -14,6 +14,7 @@ const CardConsultaPaciente = ({consulta, setConsulta, setSelectedId, setShowDel
const ids = useMemo(() => { const ids = useMemo(() => {
return { return {
doctor_id: consulta?.doctor_id, doctor_id: consulta?.doctor_id,
@ -44,6 +45,9 @@ const CardConsultaPaciente = ({consulta, setConsulta, setSelectedId, setShowDel
}, [ids, authHeader]); }, [ids, authHeader]);
console.log(consulta, "dento do card")
let horario = consulta.scheduled_at.split("T")[1] let horario = consulta.scheduled_at.split("T")[1]
let Data = consulta.scheduled_at.split("T")[0] let Data = consulta.scheduled_at.split("T")[0]

View File

@ -30,16 +30,14 @@ const ConsultaCadastroManager = () => {
}, []) }, [])
const handleSave = (Dict) => { const handleSave = (Dict) => {
let DataAtual = dayjs() let DataAtual = dayjs()
var myHeaders = new Headers(); var myHeaders = new Headers();
myHeaders.append("apikey", API_KEY); myHeaders.append("apikey", API_KEY);
myHeaders.append("Authorization", authHeader); myHeaders.append("Authorization", authHeader);
myHeaders.append("Content-Type", "application/json"); myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({ var raw = JSON.stringify({
"patient_id": "6e7f8829-0574-42df-9290-8dbb70f75ada", "patient_id": Dict.patient_id,
"doctor_id": Dict.doctor_id, "doctor_id": Dict.doctor_id,
"scheduled_at": `${Dict.dataAtendimento}T${Dict.horarioInicio}:00.000Z`, "scheduled_at": `${Dict.dataAtendimento}T${Dict.horarioInicio}:00.000Z`,
"duration_minutes": 30, "duration_minutes": 30,

View File

@ -9,7 +9,7 @@ import { GetPatientByID } from '../components/utils/Functions-Endpoints/Patient'
// 1. Importe o useNavigate // 1. Importe o useNavigate
import { useNavigate } from 'react-router-dom' import { useNavigate } from 'react-router-dom'
const ConsultaEditPage = ({ DictInfo }) => { const ConsultaEditPage = ({ dadosConsulta }) => {
// 2. Crie a instância do navigate // 2. Crie a instância do navigate
const navigate = useNavigate(); const navigate = useNavigate();
@ -17,23 +17,20 @@ const ConsultaEditPage = ({ DictInfo }) => {
const authHeader = getAuthorizationHeader(); const authHeader = getAuthorizationHeader();
const [idUsuario, setIDusuario] = useState(null); const [idUsuario, setIDusuario] = useState(null);
const [Dict, setDict] = useState({}); const [DictInfo, setDict] = useState({});
const [Medico, setMedico] = useState(null); const [Medico, setMedico] = useState(null);
const [Paciente, setPaciente] = useState(null); const [Paciente, setPaciente] = useState(null);
console.log("dentro do edit", DictInfo)
useEffect(() => { useEffect(() => {
setDict({ ...DictInfo }); setDict({ ...dadosConsulta });
const fetchInitialData = async () => { const fetchInitialData = async () => {
if (DictInfo.doctor_id) { if (dadosConsulta.doctor_id) {
const medicoData = await GetDoctorByID(DictInfo.doctor_id, authHeader); const medicoData = await GetDoctorByID(dadosConsulta.doctor_id, authHeader);
setMedico(medicoData[0]); setMedico(medicoData[0]);
} }
if (DictInfo.patient_id) { if (dadosConsulta.patient_id) {
const pacienteData = await GetPatientByID(DictInfo.patient_id, authHeader); const pacienteData = await GetPatientByID(dadosConsulta.patient_id, authHeader);
setPaciente(pacienteData[0]); setPaciente(pacienteData[0]);
} }
}; };
@ -46,17 +43,17 @@ const ConsultaEditPage = ({ DictInfo }) => {
fetchUserInfo(); fetchUserInfo();
fetchInitialData(); fetchInitialData();
}, [DictInfo, authHeader]); }, [dadosConsulta, authHeader]);
useEffect(() => { useEffect(() => {
if (Medico) { if (Medico) {
setDict(prevDict => ({ setDict(prevDict => ({
...prevDict, ...prevDict,
medico_nome: Medico?.full_name, medico_nome: Medico?.full_name,
dataAtendimento: DictInfo.scheduled_at?.split("T")[0] dataAtendimento: dadosConsulta.scheduled_at?.split("T")[0]
})); }));
} }
}, [Medico, DictInfo.scheduled_at]); }, [Medico, dadosConsulta.scheduled_at]);
const handleSave = async (DictParaPatch) => { const handleSave = async (DictParaPatch) => {
try { try {
@ -115,7 +112,7 @@ const ConsultaEditPage = ({ DictInfo }) => {
<div> <div>
{} {}
<FormConsultaPaciente <FormConsultaPaciente
agendamento={Dict} agendamento={DictInfo}
setAgendamento={setDict} setAgendamento={setDict}
onSave={handleSave} onSave={handleSave}
onCancel={handleCancel} onCancel={handleCancel}

View File

@ -2,107 +2,35 @@ import React from 'react'
import "./style.css" import "./style.css"
import CardConsultaPaciente from './CardConsultaPaciente' import CardConsultaPaciente from './CardConsultaPaciente'
import { useNavigate } from 'react-router-dom' import { useNavigate } from 'react-router-dom'
import { useEffect, useState, useMemo } from 'react' import { useEffect, useState } from 'react'
import API_KEY from '../components/utils/apiKeys' import API_KEY from '../components/utils/apiKeys'
import { useAuth } from '../components/utils/AuthProvider' 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' const ConsultasPaciente = ({ setConsulta }) => {
import dayjs from 'dayjs'
import TabelaAgendamentoDia from "../components/AgendarConsulta/TabelaAgendamentoDia"
const ConsultasPaciente = ({ setDictInfo }) => {
const { getAuthorizationHeader } = useAuth() const { getAuthorizationHeader } = useAuth()
const [agendamentosOrganizados, setAgendamentosOrganizados] = useState({})
const [listaTodasConsultas, setListaTodasConsultas] = useState([])
const [patientID, setPatientID] = useState("")
const [showDeleteModal, setShowDeleteModal] = useState(false) const [showDeleteModal, setShowDeleteModal] = useState(false)
const [selectedID, setSelectedId] = useState("") const [selectedID, setSelectedId] = useState("")
let authHeader = getAuthorizationHeader() let authHeader = getAuthorizationHeader()
const [motivoCancelamento, setMotivoCancelamento] = useState("")
const [consultas, setConsultas] = useState([]) const [consultas, setConsultas] = useState([])
const [consultasOrganizadas, setConsultasOrganizadas] = useState({}) const FiltrarAgendamentos = (agendamentos, id) => {
const [filaDeEspera, setFilaDeEspera] = useState([]) if (!agendamentos || !Array.isArray(agendamentos)) {
const [viewFila, setViewFila] = useState(false) console.error("A lista de agendamentos é inválida.");
setConsultas([]);
const [listaConsultasID, setListaConsultaID] = useState([]) return;
const [coresConsultas,setCoresConsultas] = useState([])
const [showConfirmModal, setShowConfirmModal] = useState(false)
useEffect(() => {
console.log(listaConsultasID, coresConsultas, "ojwhdofigewfey7few0fr74r")
}, [coresConsultas, listaConsultasID])
useMemo(() => {
let conjuntoConsultas = {}
let filaEspera = []
const fetchInfosConsultas = async (consulta) => {
//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")
for(let i = 0; listaTodasConsultas.length > i; i++){
let consulta = listaTodasConsultas[i]
let doctor = await GetDoctorByID(consulta.doctor_id, authHeader)
let paciente = await GetPatientByID(consulta.patient_id, authHeader)
consulta = {...consulta, medico_nome:doctor[0]?.full_name, paciente_nome:paciente[0]?.full_name}
if(consulta.status === "requested"){
filaEspera.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) console.log(consultasFiltradas)
setFilaDeEspera(filaEspera) setConsultas(consultasFiltradas);
}
}
console.log("so muda")
if(!listaTodasConsultas.length) return
console.log(filaEspera, "fila de espera")
fetchInfosConsultas();
}, [listaTodasConsultas])
useEffect(() => { useEffect(() => {
let userInfos = UserInfos(authHeader)
const fetchConsultas = async () => { const fetchConsultas = async () => {
try { try {
const myHeaders = new Headers(); const myHeaders = new Headers();
@ -115,45 +43,18 @@ const ConsultasPaciente = ({ setDictInfo }) => {
redirect: 'follow' redirect: 'follow'
}; };
const response = await fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?patient_id=eq.${"6e7f8829-0574-42df-9290-8dbb70f75ada"}`, requestOptions); const response = await fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?select=*", requestOptions);
const result = await response.json(); const result = await response.json();
setListaTodasConsultas(result); FiltrarAgendamentos(result, "6e7f8829-0574-42df-9290-8dbb70f75ada");
} catch (error) { } catch (error) {
console.log('error', error); console.log('error', error);
} }
}; };
fetchConsultas(); fetchConsultas();
}, []); }, [authHeader]);
const navigate = useNavigate() const navigate = useNavigate()
const confirmConsulta = (selectedPatientId) => {
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
myHeaders.append('apikey', API_KEY)
myHeaders.append("authorization", authHeader)
var raw = JSON.stringify({ "status":"confirmed"
});
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));
}
const deleteConsulta = async (ID) => { const deleteConsulta = async (ID) => {
try { try {
const myHeaders = new Headers(); const myHeaders = new Headers();
@ -161,7 +62,7 @@ const confirmConsulta = (selectedPatientId) => {
myHeaders.append('apikey', API_KEY); myHeaders.append('apikey', API_KEY);
myHeaders.append("authorization", authHeader); myHeaders.append("authorization", authHeader);
const raw = JSON.stringify({ "status": "cancelled", "cancellation_reason":motivoCancelamento }); const raw = JSON.stringify({ "status": "cancelled" });
const requestOptions = { const requestOptions = {
method: 'PATCH', method: 'PATCH',
@ -195,227 +96,50 @@ const confirmConsulta = (selectedPatientId) => {
<button className="btn btn-primary" onClick={() => { navigate("criar") }}> <button className="btn btn-primary" onClick={() => { navigate("criar") }}>
<i className="bi bi-plus-circle"></i> Adicionar Consulta <i className="bi bi-plus-circle"></i> Adicionar Consulta
</button> </button>
{!viewFila ?
<button onClick={() => setViewFila(true)}> Fila de espera</button>
:
<button onClick={() => setViewFila(false)}>Consultas </button>
}
<h2>Seus próximos atendimentos</h2> <h2>Seus próximos atendimentos</h2>
{viewFila ?
<div className="fila-container">
<div className="fila-header">
<input
type="text"
placeholder="Pesquisar na fila de espera..."
className="busca-fila-espera"
//value={searchTerm}
//onChange={(e) => setSearchTerm(e.target.value)}
/>
<h2 className="fila-titulo">Fila de Espera</h2>
</div>
<table className="fila-tabela">
<thead>
<tr>
<th>Nome do Paciente</th> {/* Ajustado o cabeçalho */}
<th>CPF</th> {/* Ajustado o cabeçalho */}
<th>Médico Solicitado</th> {/* Ajustado o cabeçalho */}
<th>Data da Solicitação</th> {/* Ajustado o cabeçalho */}
<th>Ações</th>
</tr>
</thead>
<tbody>
{filaDeEspera.map((item, index) => (
<tr key={index}>
<td> <p>{item?.paciente_nome} </p> </td>
<td><p>{item?.paciente_cpf} </p></td>
<td><p>{item?.medico_nome} </p></td>
<td>{dayjs(item?.created_at).format('DD/MM/YYYY HH:mm')}</td>
<td> <div className="d-flex gap-2">
<button className="btn btn-sm btn-edit" {consultas.map((consulta) => (
onClick={() => { <CardConsultaPaciente key={consulta.id} consulta={consulta} setConsulta={setConsulta} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} />
console.log(item, 'item')
navigate(`${2}/edit`)
}}
>
<i className="bi bi-pencil me-1"></i> Editar
</button>
<button
className="btn btn-sm btn-delete"
onClick={() => {
setSelectedId(item.id)
setShowDeleteModal(true);
}}
>
<i className="bi bi-trash me-1"></i> Excluir
</button>
</div></td>
</tr>
))} ))}
</tbody>
</table>
</div>
:
<TabelaAgendamentoDia agendamentos={consultasOrganizadas} listaConsultasID={[]} setDictInfo={setDictInfo} {showDeleteModal &&
selectedID={selectedID} setSelectedId={setSelectedId} setShowDeleteModal={setShowDeleteModal} <div className="modal-dialog modal-dialog-centered">
coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} <div className="modal-content">
listaConsultasID={listaConsultasID} setShowConfirmModal={setShowConfirmModal} <div className="modal-header bg-danger bg-opacity-25">
<h5 className="modal-title text-danger">
/> Confirmação de Exclusão
} </h5>
<button
{showDeleteModal && ( type="button"
<div className="btn-close"
className="modal fade show" onClick={() => setShowDeleteModal(false)}
style={{ ></button>
display: "block", </div>
backgroundColor: "rgba(0, 0, 0, 0.5)", <div className="modal-body">
}} <p className="mb-0 fs-5">
tabIndex="-1" Tem certeza que deseja excluir este agendamento?
onClick={(e) => </p>
e.target.classList.contains("modal") && setShowDeleteModal(false) </div>
} <div className="modal-footer">
> <button
<div className="modal-dialog modal-dialog-centered"> type="button"
<div className="modal-content"> className="btn btn-primary"
onClick={() => setShowDeleteModal(false)}
<div className="modal-header bg-danger bg-opacity-25"> >
<h5 className="modal-title text-danger"> Cancelar
Confirmação de Cancelamento </button>
</h5> <button
<button type="button"
type="button" className="btn btn-danger"
className="btn-close" onClick={() => { deleteConsulta(selectedID); setShowDeleteModal(false) }}
onClick={() => setShowDeleteModal(false)} >
></button> <i className="bi bi-trash me-1"></i> Excluir
</div> </button>
</div>
<div className="modal-body"> </div>
<p className="mb-0 fs-5"> </div>}
Qual o motivo do cancelamento?
</p>
<div className='campo-de-input'>
<textarea className='input-modal' value={motivoCancelamento} onChange={(e) => setMotivoCancelamento(e.target.value)} />
</div>
</div>
<div className="modal-footer">
<button
type="button"
className="btn btn-primary"
onClick={() => {setShowDeleteModal(false);
}}
>
Cancelar
</button>
<button
type="button"
className="btn btn-danger"
onClick={() => {
deleteConsulta(selectedID)
setShowDeleteModal(false)
let lista_cores = coresConsultas
let lista = listaConsultasID
lista.push(selectedID)
lista_cores.push("cancelled")
setCoresConsultas(lista_cores)
setListaConsultaID(lista)
console.log("lista", lista)
}}
>
<i className="bi bi-trash me-1"></i> Excluir
</button>
</div>
</div> </div>
</div>
</div>)}
{showConfirmModal &&(
<div
className="modal fade show"
style={{
display: "block",
backgroundColor: "rgba(0, 0, 0, 0.5)",
}}
tabIndex="-1"
onClick={(e) =>
e.target.classList.contains("modal") && setShowDeleteModal(false)
}
>
<div className="modal-dialog modal-dialog-centered">
<div className="modal-content">
<div className="modal-header bg-success">
<h5 className="modal-title">
Confirmação de edição
</h5>
</div>
<div className="modal-body">
<p className="mb-0 fs-5">
Tem certeza que deseja retirar o cancelamento ?
</p>
</div>
<div className="modal-footer">
<button
type="button"
className="btn btn-primary"
onClick={() => {setShowConfirmModal(false); setSelectedId("")}}
>
Cancelar
</button>
<button
type="button"
className="btn btn-success"
onClick={() => {confirmConsulta(selectedID);setShowConfirmModal(false)
let lista_cores = coresConsultas
let lista = listaConsultasID
lista.push(selectedID)
lista_cores.push("confirmed")
setCoresConsultas(lista_cores)
setListaConsultaID(lista)
}}
>
<i className="bi bi-trash me-1"></i> Confirmar
</button>
</div>
</div>
</div>
</div>)
}
</div>
</div> </div>
) )
} }

View File

@ -169,7 +169,7 @@ const formatarHora = (datetimeString) => {
const handleSubmit = (e) => { const handleSubmit = (e) => {
e.preventDefault(); e.preventDefault();
alert("Agendamento salvo!"); alert("Agendamento salvo!");
navigate("/paciente/agendamento")
onSave({...agendamento, horarioInicio:horarioInicio}) onSave({...agendamento, horarioInicio:horarioInicio})
}; };

View File

@ -8,6 +8,7 @@ const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal, se
const navigate = useNavigate(); const navigate = useNavigate();
const {getAuthorizationHeader} = useAuth() const {getAuthorizationHeader} = useAuth()
const authHeader = getAuthorizationHeader() const authHeader = getAuthorizationHeader()
const [Paciente, setPaciente] = useState() const [Paciente, setPaciente] = useState()
@ -16,15 +17,16 @@ const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal, se
const [decidirBotton, setDecidirBotton] = useState("") const [decidirBotton, setDecidirBotton] = useState("")
/* const ids = useMemo(() => {
const ids = useMemo(() => {
return { return {
doctor_id: DadosConsulta?.doctor_id, doctor_id: DadosConsulta?.doctor_id,
patient_id: DadosConsulta?.patient_id, patient_id: DadosConsulta?.patient_id,
status: DadosConsulta?.status status: DadosConsulta?.status
}; };
}, [DadosConsulta]); }, [DadosConsulta]);
*/
/*
useEffect(() => { useEffect(() => {
const BuscarMedicoEPaciente = async () => { const BuscarMedicoEPaciente = async () => {
if (!ids.doctor_id || !ids.patient_id || ids.status === 'nada') return; if (!ids.doctor_id || !ids.patient_id || ids.status === 'nada') return;
@ -43,16 +45,25 @@ const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal, se
}; };
BuscarMedicoEPaciente(); BuscarMedicoEPaciente();
}, [ids, authHeader]);*/ }, [ids, authHeader]);
let nameArrayPaciente = Paciente?.full_name.split(' ')
let nameArrayMedico = Medico?.full_name.split(' ')
let nameArrayPaciente = DadosConsulta?.paciente_nome?.split(' ')
let nameArrayMedico = DadosConsulta?.medico_nome?.split(' ')
let indice_cor = listaConsultasID.indexOf(DadosConsulta.id) let indice_cor = listaConsultasID.indexOf(DadosConsulta.id)
// console.log(coresConsultas)
//console.log(indice_cor,"indice no cores")
return ( return (
<div className={`container-cardconsulta container-cardconsulta-${TabelaAgendamento} ` }> <div className={`container-cardconsulta container-cardconsulta-${TabelaAgendamento} ` }>
{DadosConsulta.id? {DadosConsulta.id?
<div className={`cardconsulta`} id={indice_cor !== -1 ? `status-card-consulta-${coresConsultas[indice_cor]}` : `status-card-consulta-${DadosConsulta.status}`}> <div className={`cardconsulta`} id={indice_cor !== -1 ? `status-card-consulta-${coresConsultas[indice_cor]}` : `status-card-consulta-${DadosConsulta.status}`}>
@ -75,10 +86,8 @@ const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal, se
<div className='actions-container'> <div className='actions-container'>
<button className="btn btn-sm btn-edit-custom" <button className="btn btn-sm btn-edit-custom"
onClick={() => {navigate(`edit`) onClick={() => {navigate(`2/edit`)
setDictInfo({...DadosConsulta,paciente_cpf:Paciente.cpf, paciente_nome:Paciente.full_name, nome_medico:Medico.full_name})
console.log(DadosConsulta)
setDictInfo({...DadosConsulta,paciente_cpf:DadosConsulta?.paciente_cpf, paciente_nome:DadosConsulta?.paciente_nome, nome_medico:DadosConsulta?.nome_medico})
}} }}
> >

View File

@ -69,16 +69,8 @@ const FormNovaConsulta = ({ onCancel, onSave, setAgendamento, agendamento }) =>
}, [authHeader]); }, [authHeader]);
useEffect(() => { useEffect(() => {
<<<<<<< HEAD
ChamarMedicos(); ChamarMedicos();
}, [ChamarMedicos]); }, [ChamarMedicos]);
=======
console.log("Horario","tessssste" )
if (agendamento?.scheduled_at) {
setHorarioInicio(formatarHora(agendamento.scheduled_at));
}
}, [])
>>>>>>> melhoriasAgendamentos
useEffect(() => { useEffect(() => {
if (!agendamento.dataAtendimento || !agendamento.doctor_id) return; if (!agendamento.dataAtendimento || !agendamento.doctor_id) return;
@ -332,35 +324,7 @@ const FormNovaConsulta = ({ onCancel, onSave, setAgendamento, agendamento }) =>
</div> </div>
</div> </div>
</div> </div>
<<<<<<< HEAD
</section> </section>
=======
</div>
<div className="linha">
{/* Dropdown de Início (Não modificado) */}
<div className="campo-de-input">
<label htmlFor="inicio">Início *</label>
<select
id="inicio"
name="inicio"
value={horarioInicio}
onChange={(e) => setHorarioInicio(e.target.value)}
>
<option value="" disabled>Selecione a hora de início</option>
{opcoesDeHorario?.map((opcao, index) => (
<option
key={index}
value={opcao.value}
disabled={opcao.disabled}
>
{opcao.label}
{opcao.disabled && " (Indisponível)"}
</option>
))}
</select>
</div>
>>>>>>> melhoriasAgendamentos
<section className="informacoes-atendimento-segunda-linha-direita"> <section className="informacoes-atendimento-segunda-linha-direita">
<div className="campo-de-input"> <div className="campo-de-input">

View File

@ -2,30 +2,14 @@ import React, { useState, useEffect } from 'react';
import CardConsulta from './CardConsulta'; import CardConsulta from './CardConsulta';
import "./style/styleTabelas/tabeladia.css"; import "./style/styleTabelas/tabeladia.css";
import Spinner from '../Spinner'; const TabelaAgendamentoDia = ({ handleClickAgendamento, agendamentos, setShowDeleteModal, setDictInfo,selectedID, setSelectedId, setShowConfirmModal, coresConsultas, setListaConsultaID, listaConsultasID }) => {
const [indiceAcesso, setIndiceAcesso] = useState(0)
const TabelaAgendamentoDia = ({ agendamentos, setShowDeleteModal, setDictInfo,selectedID, setSelectedId, setShowConfirmModal, coresConsultas, setListaConsultaID, listaConsultasID }) => {
const [indiceAcesso, setIndiceAcesso] = useState(null)
const [Dia, setDia] = useState() const [Dia, setDia] = useState()
const agendamentosDoDia = agendamentos?.semana1?.segunda || []; const agendamentosDoDia = agendamentos?.semana1?.segunda || [];
const nomeMedico = agendamentosDoDia.find(item => item.medico)?.medico || 'Profissional'; const nomeMedico = agendamentosDoDia.find(item => item.medico)?.medico || 'Profissional';
let ListaDiasComAgendamentos = Object.keys(agendamentos) let ListaDiasComAgendamentos = Object.keys(agendamentos)
const [showSpinner, setShowSpinner] = useState(true);
useEffect(() => {
if (!agendamentos) return;
const dias = Object.keys(agendamentos);
if (dias.length > 0) {
setIndiceAcesso(0); // começa no primeiro dia disponível
setDia(dias[0]); // seta o Dia inicial
setShowSpinner(false)
}
}, [agendamentos]);
//console.log(Dia, "hshdhshhsdhs") //console.log(Dia, "hshdhshhsdhs")
@ -87,20 +71,12 @@ useEffect(() => {
<td className='coluna-horario'><p className='horario-texto'>{`${horario[0]}:${horario[1]}`}</p></td> <td className='coluna-horario'><p className='horario-texto'>{`${horario[0]}:${horario[1]}`}</p></td>
<td className='mostrar-horario'> <td className='mostrar-horario'>
<div> <div onClick={() => handleClickAgendamento(agendamento)}>
<CardConsulta DadosConsulta={agendamento} TabelaAgendamento={'dia'} setShowDeleteModal={setShowDeleteModal} setDictInfo={setDictInfo} setSelectedId={setSelectedId} selectedID={selectedID} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID}/> <CardConsulta DadosConsulta={agendamento} TabelaAgendamento={'dia'} setShowDeleteModal={setShowDeleteModal} setDictInfo={setDictInfo} setSelectedId={setSelectedId} selectedID={selectedID} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID}/>
</div> </div>
</td> </td>
</tr> </tr>
)})} )})}
{showSpinner &&
<tr>
<td colspan='2'>
<Spinner/>
</td>
</tr>
}
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@ -6,23 +6,15 @@ import "./style/styleTabelas/tabelames.css";
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useMemo } from 'react'; import { useMemo } from 'react';
import Spinner from '../Spinner';
const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos, setShowDeleteModal, setSelectedId ,setDictInfo, setShowConfirmModal, coresConsultas ,setListaConsultaID, listaConsultasID }) => { const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos, setShowDeleteModal, setSelectedId ,setDictInfo, setShowConfirmModal, coresConsultas ,setListaConsultaID, listaConsultasID }) => {
const dataHoje = dayjs(); const dataHoje = dayjs();
const AnoAtual = dataHoje.year(); const AnoAtual = dataHoje.year();
const mes = dataHoje.month() + 1; const mes = dataHoje.month() + 1;
const [showSpinner, setShowSpinner] = useState(true)
console.log(agendamentos)
let ListaDiasDatas = ListarDiasdoMes(AnoAtual, mes); let ListaDiasDatas = ListarDiasdoMes(AnoAtual, mes);
const [AgendamentosSemanaisOrganizados, setAgendamentosSemanaisOrganizados] = useState({}) const [AgendamentosSemanaisOrganizados, setAgendamentosSemanaisOrganizados] = useState({})
const [indice, setIndice] = useState(mes.toString()) const [indice, setIndice] = useState("10")
const [AgendamentosMensaisOrganizados, setAgendamentosMensaisOrganizados] = useState({ const [AgendamentosMensaisOrganizados, setAgendamentosMensaisOrganizados] = useState({
"01": { "nomeDoMes": "janeiro" }, "01": { "nomeDoMes": "janeiro" },
@ -41,17 +33,6 @@ const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos, setShowDeleteModa
useEffect(() => {
if (!agendamentos) return;
const meses = Object.keys(agendamentos);
if (meses.length > 0) {
// começa no primeiro dia disponível
setIndice(mes.toString()); // seta o Dia inicial
setShowSpinner(false)
}
}, [agendamentos]);
const OrganizarAgendamentosSemanais = useMemo(() => { const OrganizarAgendamentosSemanais = useMemo(() => {
if (!agendamentos || Object.keys(agendamentos).length === 0) return {}; if (!agendamentos || Object.keys(agendamentos).length === 0) return {};
@ -59,6 +40,7 @@ const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos, setShowDeleteModa
const DiasComAtendimentos = Object.keys(agendamentos) const DiasComAtendimentos = Object.keys(agendamentos)
const semanas = {} const semanas = {}
for (let i = 0; i < DiasComAtendimentos.length; i++) { for (let i = 0; i < DiasComAtendimentos.length; i++) {
const DiaComAtendimento = DiasComAtendimentos[i] const DiaComAtendimento = DiasComAtendimentos[i]
const [_, MesDoAgendamento, DiaDoAgendamento] = DiaComAtendimento.split("-") const [_, MesDoAgendamento, DiaDoAgendamento] = DiaComAtendimento.split("-")
@ -233,16 +215,8 @@ const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos, setShowDeleteModa
)) ))
} }
</tr> </tr>
)})} )})}
{showSpinner &&
<tr>
<td colspan='5'>
<Spinner/>
</td>
</tr>
}
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@ -4,11 +4,6 @@ import "./style/styleTabelas/tabelasemana.css";
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { useEffect, useState, useMemo } from 'react'; import { useEffect, useState, useMemo } from 'react';
import weekOfYear from 'dayjs/plugin/weekOfYear' import weekOfYear from 'dayjs/plugin/weekOfYear'
import Spinner from '../Spinner';
dayjs.extend(weekOfYear) dayjs.extend(weekOfYear)
const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes, setShowDeleteModal ,setSelectedId ,setDictInfo, setShowConfirmModal, coresConsultas ,setListaConsultaID, listaConsultasID}) => { const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes, setShowDeleteModal ,setSelectedId ,setDictInfo, setShowConfirmModal, coresConsultas ,setListaConsultaID, listaConsultasID}) => {
@ -17,21 +12,6 @@ const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes, setShowDeleteM
const [semanasOrganizadas, setSemanasOrganizadas] = useState({}); const [semanasOrganizadas, setSemanasOrganizadas] = useState({});
// Controla qual semana está sendo exibida (o índice da chave no objeto) // Controla qual semana está sendo exibida (o índice da chave no objeto)
const [Indice, setIndice] = useState(0); const [Indice, setIndice] = useState(0);
const [showSpinner, setShowSpinner] = useState(true)
useEffect(() => {
if (!agendamentos) return;
const semanas = Object.keys(agendamentos);
if (semanas.length > 0) {
setIndice(0)
setShowSpinner(false)
}
}, [agendamentos]);
console.log(agendamentos, "agendamentos diarios") console.log(agendamentos, "agendamentos diarios")
@ -149,10 +129,10 @@ const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes, setShowDeleteM
? `Semana ${chaveDaSemanaAtual.replace('semana', '')} / ${AnoAtual}` ? `Semana ${chaveDaSemanaAtual.replace('semana', '')} / ${AnoAtual}`
: 'Nenhuma semana encontrada'; : 'Nenhuma semana encontrada';
// --- RENDERIZAÇÃO ---
return ( return (
<div> <div>
{/* Container de Navegação */}
<div id='tabela-seletor-container'> <div id='tabela-seletor-container'>
<button <button
@ -234,16 +214,6 @@ const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes, setShowDeleteM
</td> </td>
</tr> </tr>
)})} )})}
{showSpinner &&
<tr>
<td colspan='6'>
<Spinner/>
</td>
</tr>
}
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@ -1,15 +0,0 @@
import React from 'react'
const Spinner = () => {
return (
<div>
<div className="d-flex justify-content-center align-items-center" style={{ height: "100%" }}>
<div className="spinner-border text-primary" role="status">
<span className="visually-hidden">Carregando...</span>
</div>
</div>
</div>
)
}
export default Spinner

View File

@ -12,7 +12,7 @@
{ {
"name": "Seus Agendamentos", "name": "Seus Agendamentos",
"icon": "calendar", "icon": "calendar",
"url": "/medico/agendamento" "url": "/medico/agendamentoMedico"
}, },
{ {

View File

@ -19,8 +19,6 @@ import "./style/Agendamento.css";
import './style/FilaEspera.css'; import './style/FilaEspera.css';
import { Search } from 'lucide-react'; import { Search } from 'lucide-react';
import Spinner from '../components/Spinner.jsx';
@ -50,15 +48,18 @@ const Agendamento = ({setDictInfo}) => {
const [MedicoFiltrado, setMedicoFiltrado] = useState({id:"vazio"}) const [MedicoFiltrado, setMedicoFiltrado] = useState({id:"vazio"})
const [cacheAgendamentos, setCacheAgendamentos] = useState([]) const [cacheAgendamentos, setCacheAgendamentos] = useState([])
const [showConfirmModal, setShowConfirmModal] = useState(false) const [showConfirmModal, setShowConfirmModal] = useState(false)
const [motivoCancelamento, setMotivoCancelamento] = useState("")
const [motivoCancelamento, setMotivoCancelamento] = useState("")
const [corModal, setCorModal] = useState("")
const [listaConsultasID, setListaConsultaID] = useState([])
const [coresConsultas,setCoresConsultas] = useState([])
const [listaConsultasID, setListaConsultaID] = useState([])
const [coresConsultas,setCoresConsultas] = useState([])
const [showSpinner,setShowSpinner] = useState(true)
let authHeader = getAuthorizationHeader() let authHeader = getAuthorizationHeader()
@ -75,7 +76,7 @@ console.log("recarregando")
const fetchDados = async () => { const fetchDados = async () => {
for (const agendamento of listaTodosAgendamentos) { for (const agendamento of listaTodosAgendamentos) {
if (agendamento.status === "requested") {
// Cache de médico e paciente // Cache de médico e paciente
if (!cacheMedicos[agendamento.doctor_id]) { if (!cacheMedicos[agendamento.doctor_id]) {
cacheMedicos[agendamento.doctor_id] = await GetDoctorByID(agendamento.doctor_id, authHeader); cacheMedicos[agendamento.doctor_id] = await GetDoctorByID(agendamento.doctor_id, authHeader);
@ -87,7 +88,6 @@ console.log("recarregando")
const medico = cacheMedicos[agendamento.doctor_id]; const medico = cacheMedicos[agendamento.doctor_id];
const paciente = cachePacientes[agendamento.patient_id]; const paciente = cachePacientes[agendamento.patient_id];
if (agendamento.status === "requested") {
ListaFilaDeEspera.push({ ListaFilaDeEspera.push({
agendamento, agendamento,
Infos: { Infos: {
@ -96,22 +96,15 @@ console.log("recarregando")
patient_id: paciente[0]?.id, patient_id: paciente[0]?.id,
paciente_nome: paciente[0]?.full_name, paciente_nome: paciente[0]?.full_name,
paciente_cpf: paciente[0]?.cpf, paciente_cpf: paciente[0]?.cpf,
}, },
}); });
} else { } else {
const DiaAgendamento = agendamento.scheduled_at.split("T")[0]; const DiaAgendamento = agendamento.scheduled_at.split("T")[0];
let agendamentoMelhorado = {...agendamento, medico_nome: medico[0]?.full_name,
doctor_id: medico[0]?.id,
patient_id: paciente[0]?.id,
paciente_nome: paciente[0]?.full_name,
paciente_cpf: paciente[0]?.cpf, }
if (DiaAgendamento in DictAgendamentosOrganizados) { if (DiaAgendamento in DictAgendamentosOrganizados) {
DictAgendamentosOrganizados[DiaAgendamento].push(agendamentoMelhorado); DictAgendamentosOrganizados[DiaAgendamento].push(agendamento);
} else { } else {
DictAgendamentosOrganizados[DiaAgendamento] = [agendamentoMelhorado]; DictAgendamentosOrganizados[DiaAgendamento] = [agendamento];
} }
} }
} }
@ -214,6 +207,7 @@ const confirmConsulta = (selectedPatientId) => {
.then(response => {if(response.status !== 200)(console.log(response))}) .then(response => {if(response.status !== 200)(console.log(response))})
.then(result => console.log(result)) .then(result => console.log(result))
.catch(error => console.log('error', error)); .catch(error => console.log('error', error));
} }
@ -258,6 +252,12 @@ const confirmConsulta = (selectedPatientId) => {
} }
const handleClickAgendamento = (agendamento) => {
if (agendamento.status !== 'vazio') return
else setPageConsulta(true)
};
useEffect(() => { useEffect(() => {
console.log("mudou FiltredTodosMedicos:", FiltredTodosMedicos); console.log("mudou FiltredTodosMedicos:", FiltredTodosMedicos);
if (MedicoFiltrado.id != "vazio" ) { if (MedicoFiltrado.id != "vazio" ) {
@ -319,15 +319,13 @@ const handleSearchMedicos = (term) => {
setFiltredTodosMedicos(filtered); setFiltredTodosMedicos(filtered);
}; };
useEffect(() => {
setShowSpinner(false)
},[filaEsperaData])
return ( return (
<div> <div>
<div className='spinner'></div> <div className='spinner'></div>
<h1>Agendar nova consulta</h1> <h1>Agendar nova consulta</h1>
<div className="btns-gerenciamento-e-consulta" style={{ display: 'flex', gap: '10px', marginBottom: '20px' }}> <div className="btns-gerenciamento-e-consulta" style={{ display: 'flex', gap: '10px', marginBottom: '20px' }}>
<button className="btn btn-primary" onClick={() => setPageConsulta(true)}> <button className="btn btn-primary" onClick={() => setPageConsulta(true)}>
<i className="bi bi-plus-circle"></i> Adicionar Consulta <i className="bi bi-plus-circle"></i> Adicionar Consulta
@ -438,7 +436,7 @@ useEffect(() => {
</section> </section>
{/* Componentes de Tabela - Adicionado props de delete da main */} {/* Componentes de Tabela - Adicionado props de delete da main */}
{tabela === "diario" && <TabelaAgendamentoDia agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID} />} {tabela === "diario" && <TabelaAgendamentoDia handleClickAgendamento={handleClickAgendamento} agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID} />}
{tabela === 'semanal' && <TabelaAgendamentoSemana agendamentos={DictAgendamentosOrganizados} ListarDiasdoMes={ListarDiasdoMes} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID}/>} {tabela === 'semanal' && <TabelaAgendamentoSemana agendamentos={DictAgendamentosOrganizados} ListarDiasdoMes={ListarDiasdoMes} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID}/>}
{tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID}/>} {tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID}/>}
</div> </div>
@ -499,15 +497,6 @@ useEffect(() => {
</div></td> </div></td>
</tr> </tr>
))} ))}
{showSpinner &&
<tr>
<td colspan='6'>
<Spinner/>
</td>
</tr>
}
</tbody> </tbody>
</table> </table>
</div> </div>
@ -597,6 +586,10 @@ useEffect(() => {
</div> </div>
</div>)} </div>)}
{showConfirmModal &&( {showConfirmModal &&(
<div <div
className="modal fade show" className="modal fade show"
@ -650,6 +643,8 @@ useEffect(() => {
setCoresConsultas(lista_cores) setCoresConsultas(lista_cores)
setListaConsultaID(lista) setListaConsultaID(lista)
}} }}
> >

View File

@ -5,7 +5,7 @@ import { useAuth } from '../components/utils/AuthProvider'
import { useEffect,useState } from 'react' import { useEffect,useState } from 'react'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { UserInfos } from '../components/utils/Functions-Endpoints/General' import { UserInfos } from '../components/utils/Functions-Endpoints/General'
const AgendamentoCadastroManager = ({setPageConsulta, Dict}) => { const AgendamentoCadastroManager = ({setPageConsulta}) => {
const {getAuthorizationHeader} = useAuth() const {getAuthorizationHeader} = useAuth()
const [agendamento, setAgendamento] = useState({status:'confirmed'}) const [agendamento, setAgendamento] = useState({status:'confirmed'})
@ -16,12 +16,6 @@ const AgendamentoCadastroManager = ({setPageConsulta, Dict}) => {
useEffect(() => { useEffect(() => {
if(!Dict){setAgendamento({})}
else{
console.log(Dict)
setAgendamento(Dict)
}
const ColherInfoUsuario =async () => { const ColherInfoUsuario =async () => {
const result = await UserInfos(authHeader) const result = await UserInfos(authHeader)
@ -49,7 +43,7 @@ const AgendamentoCadastroManager = ({setPageConsulta, Dict}) => {
"duration_minutes": 30, "duration_minutes": 30,
"appointment_type": Dict.tipo_consulta, "appointment_type": Dict.tipo_consulta,
"patient_notes": "", "patient_notes": "Prefiro horário pela manhã",
"insurance_provider": Dict.convenio, "insurance_provider": Dict.convenio,
"status": Dict.status, "status": Dict.status,
"created_by": idUsuario "created_by": idUsuario

View File

@ -16,12 +16,12 @@ const AgendamentoEditPage = ({setDictInfo, DictInfo}) => {
let id = params.id let id = params.id
console.log(DictInfo, "DENTRO DO EDITAR")
//console.log(DictInfo, 'aqui') //console.log(DictInfo, 'aqui')
useEffect(() => { useEffect(() => {
setDictInfo({...DictInfo, dataAtendimento:DictInfo.scheduled_at.split("T")[0]}) setDictInfo({...DictInfo, dataAtendimento:DictInfo.scheduled_at.split("T")[0]})
const ColherInfoUsuario =async () => { const ColherInfoUsuario =async () => {
const result = await UserInfos(authHeader) const result = await UserInfos(authHeader)
@ -51,7 +51,9 @@ const AgendamentoEditPage = ({setDictInfo, DictInfo}) => {
"doctor_id": DictParaPatch.doctor_id, "doctor_id": DictParaPatch.doctor_id,
"duration_minutes": 30, "duration_minutes": 30,
"chief_complaint": "Dor de cabeça há 3 ", "chief_complaint": "Dor de cabeça há 3 ",
"created_by": idUsuario, "created_by": idUsuario,
"scheduled_at": `${DictParaPatch.dataAtendimento}T${DictParaPatch.horarioInicio}:00.000Z`, "scheduled_at": `${DictParaPatch.dataAtendimento}T${DictParaPatch.horarioInicio}:00.000Z`,

View File

@ -127,8 +127,6 @@ function Login({ onEnterSystem }) {
navigate(`/medico/`); navigate(`/medico/`);
} else if (UserData?.roles?.includes("financeiro")) { } else if (UserData?.roles?.includes("financeiro")) {
navigate(`/financeiro/`); navigate(`/financeiro/`);
} else if (UserData?.roles?.includes("paciente")) {
navigate(`/paciente/`);
} }
}else{ }else{
console.log("ERROROROROROOR") console.log("ERROROROROROOR")

View File

@ -1,6 +1,6 @@
import { Routes, Route } from "react-router-dom"; import { Routes, Route } from "react-router-dom";
import Sidebar from "../../components/Sidebar"; import Sidebar from "../../components/Sidebar";
import { useState } from "react";
import DoctorRelatorioManager from "../../PagesMedico/DoctorRelatorioManager"; import DoctorRelatorioManager from "../../PagesMedico/DoctorRelatorioManager";
import Prontuario from "../../PagesMedico/prontuario"; import Prontuario from "../../PagesMedico/prontuario";
import Relatorio from "../../PagesMedico/relatorio"; import Relatorio from "../../PagesMedico/relatorio";
@ -11,13 +11,7 @@ import FormNovoRelatorio from "../../PagesMedico/FormNovoRelatorio";
import EditPageRelatorio from "../../PagesMedico/EditPageRelatorio"; import EditPageRelatorio from "../../PagesMedico/EditPageRelatorio";
import BotaoVideoChamada from '../../components/BotaoVideoChamada'; import BotaoVideoChamada from '../../components/BotaoVideoChamada';
import DoctorAgendamentoEditPage from "../../PagesMedico/DoctorAgendamentoEditPage";
function PerfilMedico() { function PerfilMedico() {
const [dictInfo, setDictInfo] = useState({})
return ( return (
<div id="app" className="active"> <div id="app" className="active">
@ -29,8 +23,7 @@ function PerfilMedico() {
<Route path="/relatorios/:id/edit" element={<EditPageRelatorio />} /> <Route path="/relatorios/:id/edit" element={<EditPageRelatorio />} />
<Route path="/prontuario" element={<Prontuario />} /> <Route path="/prontuario" element={<Prontuario />} />
<Route path="/relatorios" element={<DoctorRelatorioManager />} /> <Route path="/relatorios" element={<DoctorRelatorioManager />} />
<Route path="/agendamento" element={<DoctorAgendamentoManager setDictInfo={setDictInfo}/>} /> <Route path="/agendamentoMedico" element={<DoctorAgendamentoManager />} />
<Route path="/agendamento/edit" element={<DoctorAgendamentoEditPage DictInfo={dictInfo} setDictInfo={setDictInfo}/>} />
<Route path="/chat" element={<Chat />} /> <Route path="/chat" element={<Chat />} />
</Routes> </Routes>
</div> </div>

View File

@ -12,9 +12,7 @@ import BotaoVideoPaciente from "../../components/BotaoVideoPaciente";
function PerfilPaciente({ onLogout }) { function PerfilPaciente({ onLogout }) {
const [dadosConsulta, setConsulta] = useState({})
const [DictInfo, setDictInfo] = useState({})
return ( return (
@ -25,9 +23,9 @@ const [DictInfo, setDictInfo] = useState({})
<div id="main"> <div id="main">
<Routes> <Routes>
<Route path="/" element={<LaudoManager />} /> <Route path="/" element={<LaudoManager />} />
<Route path="agendamento" element={<ConsultasPaciente setDictInfo={setDictInfo}/>} /> <Route path="agendamento" element={<ConsultasPaciente setConsulta={setConsulta}/>} />
<Route path="agendamento/criar" element={<ConsultaCadastroManager />} /> <Route path="agendamento/criar" element={<ConsultaCadastroManager />} />
<Route path="agendamento/edit" element={<ConsultaEditPage DictInfo={DictInfo} />} /> <Route path="agendamento/edit" element={<ConsultaEditPage dadosConsulta={dadosConsulta} />} />
<Route path="laudo" element={<LaudoManager />} /> <Route path="laudo" element={<LaudoManager />} />
<Route path="*" element={<h2>Página não encontrada</h2>} /> <Route path="*" element={<h2>Página não encontrada</h2>} />
</Routes> </Routes>

View File

@ -37,7 +37,7 @@ function PerfilSecretaria({ onLogout }) {
<Route path="medicos/:id" element={<DoctorDetails />} /> <Route path="medicos/:id" element={<DoctorDetails />} />
<Route path="medicos/:id/edit" element={<DoctorEditPage />} /> <Route path="medicos/:id/edit" element={<DoctorEditPage />} />
<Route path="agendamento" element={<Agendamento setDictInfo={setDictInfo}/>} /> <Route path="agendamento" element={<Agendamento setDictInfo={setDictInfo}/>} />
<Route path="agendamento/edit" element={<AgendamentoEditPage setDictInfo={setDictInfo} DictInfo={DictInfo}/>} /> <Route path="agendamento/:id/edit" element={<AgendamentoEditPage setDictInfo={setDictInfo} DictInfo={DictInfo}/>} />
<Route path="laudo" element={<LaudoManager />} /> <Route path="laudo" element={<LaudoManager />} />
<Route path="disponibilidade" element={<DisponibilidadesDoctorPage />} /> <Route path="disponibilidade" element={<DisponibilidadesDoctorPage />} />
<Route path="horarios" element={<HorariosDisponibilidade/>}/> <Route path="horarios" element={<HorariosDisponibilidade/>}/>