Impedimento de refetching e melhoria do filtro do medico

This commit is contained in:
joao_pedro 2025-10-27 10:44:09 -03:00
parent a5cd4d3447
commit 8a3d6e0305
2 changed files with 112 additions and 94 deletions

View File

@ -67,9 +67,9 @@ const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes, setShowDeleteM
break break
} }
} }
console.log(semanas)
return semanas return semanas
}, [agendamentos, AnoAtual]) // Adicionei AnoAtual como dependência por segurança }, [agendamentos, AnoAtual])
// --- EFEITO PARA POPULAR O ESTADO --- // --- EFEITO PARA POPULAR O ESTADO ---
@ -159,25 +159,26 @@ const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes, setShowDeleteM
<tbody> <tbody>
{indicesDeLinha.map((indiceLinha) => { {indicesDeLinha.map((indiceLinha) => {
let schedulet_at = semanaParaRenderizar.segunda[indiceLinha].scheduled_at.split("T") //let schedulet_at = semanaParaRenderizar.segunda[indiceLinha].scheduled_at.split("T")
let horario = schedulet_at[1].split(":") // let horario = schedulet_at[1].split(":")
console.log(horario)
console.log(semanaParaRenderizar, "aqui")
return( return(
<tr key={indiceLinha}> <tr key={indiceLinha}>
{/* Célula para Horário (Pode ser ajustado para mostrar o horário real) */}
<td> <td>
<p className='horario-texto'> {`${horario[0]}:${horario[1]}`} </p> {/* <p className='horario-texto'> {`${horario[0]}:${horario[1]}`} </p>*/}
</td> </td>
{/* Mapeamento de COLUNAS (dias) */} {/* Mapeamento de COLUNAS (dias) */}
<td> <td>
{semanaParaRenderizar.segunda[indiceLinha] {semanaParaRenderizar?.segunda[indiceLinha]
? <CardConsulta DadosConsulta={semanaParaRenderizar.segunda[indiceLinha]} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo} /> ? <CardConsulta DadosConsulta={semanaParaRenderizar?.segunda[indiceLinha]} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo} />
: null : null
} }
</td> </td>

View File

@ -24,9 +24,10 @@ import { Search } from 'lucide-react';
const Agendamento = ({setDictInfo}) => { const Agendamento = ({setDictInfo}) => {
const navigate = useNavigate(); const navigate = useNavigate();
const [listaTodosAgendamentos, setListaTodosAgendamentos] = useState([])
const [selectedID, setSelectedId] = useState('0') const [selectedID, setSelectedId] = useState('0')
const [filaEsperaData, setfilaEsperaData] = useState([]) const [filaEsperaData, setFilaEsperaData] = useState([])
const [FiladeEspera, setFiladeEspera] = useState(false); const [FiladeEspera, setFiladeEspera] = useState(false);
const [tabela, setTabela] = useState('diario'); const [tabela, setTabela] = useState('diario');
const [PageNovaConsulta, setPageConsulta] = useState(false); const [PageNovaConsulta, setPageConsulta] = useState(false);
@ -42,39 +43,46 @@ const Agendamento = ({setDictInfo}) => {
const [FiltredTodosMedicos, setFiltredTodosMedicos] = useState([]) const [FiltredTodosMedicos, setFiltredTodosMedicos] = useState([])
const [searchTermDoctor, setSearchTermDoctor] = useState(''); const [searchTermDoctor, setSearchTermDoctor] = useState('');
const [MedicoFiltrado, setMedicoFiltrado] = useState({id:"vazio"})
let authHeader = getAuthorizationHeader() let authHeader = getAuthorizationHeader()
const cacheMedicos = {};
const cachePacientes = {};
const FiltrarAgendamentos = async (listaTodosAgendamentos) => {
const ConfigurarFiladeEspera = async (patient_id, doctor_id, agendamento) => {
let medico = await GetDoctorByID(doctor_id, authHeader);
let paciente = await GetPatientByID(patient_id, authHeader);
console.log(medico) useMemo(() => {
if (!listaTodosAgendamentos.length) return { agendamentosOrganizados: {}, filaEsperaData: [] };
console.log("recarregando")
const DictAgendamentosOrganizados = {};
const ListaFilaDeEspera = [];
let dicionario = { const fetchDados = async () => {
agendamento: agendamento, for (const agendamento of listaTodosAgendamentos) {
if (agendamento.status === "requested") {
// Cache de médico e paciente
if (!cacheMedicos[agendamento.doctor_id]) {
cacheMedicos[agendamento.doctor_id] = await GetDoctorByID(agendamento.doctor_id, authHeader);
}
if (!cachePacientes[agendamento.patient_id]) {
cachePacientes[agendamento.patient_id] = await GetPatientByID(agendamento.patient_id, authHeader);
}
const medico = cacheMedicos[agendamento.doctor_id];
const paciente = cachePacientes[agendamento.patient_id];
ListaFilaDeEspera.push({
agendamento,
Infos: { Infos: {
nome_medico: medico[0]?.full_name, nome_medico: medico[0]?.full_name,
doctor_id: medico[0]?.id, doctor_id: medico[0]?.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;
};
let DictAgendamentosOrganizados = {};
let ListaFilaDeEspera = [];
for (const agendamento of listaTodosAgendamentos) {
if (agendamento.status === 'requested') {
let v = await ConfigurarFiladeEspera(agendamento.patient_id, agendamento.doctor_id, agendamento);
ListaFilaDeEspera.push(v);
} else { } else {
const DiaAgendamento = agendamento.scheduled_at.split("T")[0]; const DiaAgendamento = agendamento.scheduled_at.split("T")[0];
@ -86,28 +94,28 @@ const Agendamento = ({setDictInfo}) => {
} }
} }
// Ordenar por data
for (const DiaAgendamento in DictAgendamentosOrganizados) { for (const DiaAgendamento in DictAgendamentosOrganizados) {
DictAgendamentosOrganizados[DiaAgendamento].sort((a, b) => { DictAgendamentosOrganizados[DiaAgendamento].sort((a, b) => a.scheduled_at.localeCompare(b.scheduled_at));
if (a.scheduled_at < b.scheduled_at) return -1;
if (a.scheduled_at > b.scheduled_at) return 1;
return 0;
});
} }
const chavesOrdenadas = Object.keys(DictAgendamentosOrganizados).sort();
const chavesOrdenadas = Object.keys(DictAgendamentosOrganizados).sort((a, b) => { const DictAgendamentosFinal = {};
if (a < b) return -1;
if (a > b) return 1;
return 0;
});
let DictAgendamentosFinal = {};
for (const data of chavesOrdenadas) { for (const data of chavesOrdenadas) {
DictAgendamentosFinal[data] = DictAgendamentosOrganizados[data]; DictAgendamentosFinal[data] = DictAgendamentosOrganizados[data];
} }
setAgendamentosOrganizados(DictAgendamentosFinal); setAgendamentosOrganizados(DictAgendamentosFinal);
setfilaEsperaData(ListaFilaDeEspera); setFilaEsperaData(ListaFilaDeEspera);
}; };
fetchDados();
return { agendamentosOrganizados: DictAgendamentosOrganizados, filaEsperaData: ListaFilaDeEspera };
}, [listaTodosAgendamentos]); // 👉 só recalcula quando a lista muda
useEffect(() => { useEffect(() => {
var myHeaders = new Headers(); var myHeaders = new Headers();
myHeaders.append("Authorization", authHeader); myHeaders.append("Authorization", authHeader);
@ -121,7 +129,7 @@ const Agendamento = ({setDictInfo}) => {
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?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)}) .then(result => {setListaTodosAgendamentos(result);console.log(result)})
.catch(error => console.log('error', error)); .catch(error => console.log('error', error));
const PegarTodosOsMedicos = async () => { const PegarTodosOsMedicos = async () => {
@ -135,24 +143,7 @@ const Agendamento = ({setDictInfo}) => {
PegarTodosOsMedicos() 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(); var myHeaders = new Headers();
@ -179,17 +170,6 @@ const deleteConsulta = (selectedPatientId) => {
} }
const filtrarAgendamentosPorMedico = (dictAgendamentos, idMedicoFiltrado) => {
const todasAsListasDeAgendamentos = Object.values(dictAgendamentos);
const todosOsAgendamentos = todasAsListasDeAgendamentos.flat();
const agendamentosFiltrados = todosOsAgendamentos.filter(agendamento =>
agendamento.doctor_id === idMedicoFiltrado
);
return agendamentosFiltrados;
};
const filteredAgendamentos = useMemo(() => { const filteredAgendamentos = useMemo(() => {
@ -238,12 +218,49 @@ const filtrarAgendamentosPorMedico = (dictAgendamentos, idMedicoFiltrado) => {
}; };
useEffect(() => {
console.log("mudou FiltredTodosMedicos:", FiltredTodosMedicos);
if (MedicoFiltrado.id != "vazio" ) {
const unicoMedico = MedicoFiltrado;
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, MedicoFiltrado]);
const filtrarAgendamentosPorMedico = (dictAgendamentos, idMedicoFiltrado) => {
const todasAsListasDeAgendamentos = Object.values(dictAgendamentos);
const todosOsAgendamentos = todasAsListasDeAgendamentos.flat();
const agendamentosFiltrados = todosOsAgendamentos.filter(agendamento =>
agendamento.doctor_id === idMedicoFiltrado
);
return agendamentosFiltrados;
};
const handleSearchMedicos = (term) => { const handleSearchMedicos = (term) => {
setSearchTermDoctor(term); setSearchTermDoctor(term);
if (term.trim() === '') { if (term.trim() === '') {
setFiltredTodosMedicos([]); setFiltredTodosMedicos([]);
setMedicoFiltrado({id:"vazio"})
//2 FiltrarAgendamentos()
return; return;
} }
if (FiltredTodosMedicos.length === 1){
setMedicoFiltrado({...FiltredTodosMedicos[0]})
}
const filtered = ListaDeMedicos.filter(medico => const filtered = ListaDeMedicos.filter(medico =>
medico.nomeMedico.toLowerCase().includes(term.toLowerCase()) medico.nomeMedico.toLowerCase().includes(term.toLowerCase())
@ -252,8 +269,6 @@ const handleSearchMedicos = (term) => {
}; };
const handleClickCancel = () => setPageConsulta(false)
return ( return (
<div> <div>
<h1>Agendar nova consulta</h1> <h1>Agendar nova consulta</h1>
@ -306,6 +321,8 @@ const handleSearchMedicos = (term) => {
className='dropdown-item' className='dropdown-item'
onClick={() => { onClick={() => {
setSearchTermDoctor(medico.nomeMedico); setSearchTermDoctor(medico.nomeMedico);
setFiltredTodosMedicos([]);
setMedicoFiltrado(medico)
}} }}
> >
<p>{medico.nomeMedico} </p> <p>{medico.nomeMedico} </p>