From 8a3d6e03057c82e6140a736dde0f36465ef8ccb0 Mon Sep 17 00:00:00 2001 From: joao_pedro Date: Mon, 27 Oct 2025 10:44:09 -0300 Subject: [PATCH] Impedimento de refetching e melhoria do filtro do medico --- .../TabelaAgendamentoSemana.jsx | 19 +- src/pages/Agendamento.jsx | 187 ++++++++++-------- 2 files changed, 112 insertions(+), 94 deletions(-) diff --git a/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx b/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx index 0f5979c5..84958f1c 100644 --- a/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx +++ b/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx @@ -67,9 +67,9 @@ const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes, setShowDeleteM break } } - + console.log(semanas) return semanas - }, [agendamentos, AnoAtual]) // Adicionei AnoAtual como dependência por segurança + }, [agendamentos, AnoAtual]) // --- EFEITO PARA POPULAR O ESTADO --- @@ -159,25 +159,26 @@ const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes, setShowDeleteM {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( - {/* Célula para Horário (Pode ser ajustado para mostrar o horário real) */} + -

{`${horario[0]}:${horario[1]}`}

+ {/*

{`${horario[0]}:${horario[1]}`}

*/} {/* Mapeamento de COLUNAS (dias) */} - {semanaParaRenderizar.segunda[indiceLinha] - ? + {semanaParaRenderizar?.segunda[indiceLinha] + ? : null } diff --git a/src/pages/Agendamento.jsx b/src/pages/Agendamento.jsx index 84b7b78e..505be047 100644 --- a/src/pages/Agendamento.jsx +++ b/src/pages/Agendamento.jsx @@ -23,10 +23,11 @@ import { Search } from 'lucide-react'; const Agendamento = ({setDictInfo}) => { const navigate = useNavigate(); - + + const [listaTodosAgendamentos, setListaTodosAgendamentos] = useState([]) const [selectedID, setSelectedId] = useState('0') - const [filaEsperaData, setfilaEsperaData] = useState([]) + const [filaEsperaData, setFilaEsperaData] = useState([]) const [FiladeEspera, setFiladeEspera] = useState(false); const [tabela, setTabela] = useState('diario'); const [PageNovaConsulta, setPageConsulta] = useState(false); @@ -42,72 +43,79 @@ const Agendamento = ({setDictInfo}) => { const [FiltredTodosMedicos, setFiltredTodosMedicos] = useState([]) const [searchTermDoctor, setSearchTermDoctor] = useState(''); + const [MedicoFiltrado, setMedicoFiltrado] = useState({id:"vazio"}) + 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) - - let dicionario = { - agendamento: agendamento, - Infos: { - nome_medico: 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 - } - }; - return dicionario; - }; - - let DictAgendamentosOrganizados = {}; - let ListaFilaDeEspera = []; - + +useMemo(() => { + if (!listaTodosAgendamentos.length) return { agendamentosOrganizados: {}, filaEsperaData: [] }; +console.log("recarregando") + const DictAgendamentosOrganizados = {}; + const ListaFilaDeEspera = []; + const fetchDados = async () => { for (const agendamento of listaTodosAgendamentos) { - if (agendamento.status === 'requested') { - let v = await ConfigurarFiladeEspera(agendamento.patient_id, agendamento.doctor_id, agendamento); - ListaFilaDeEspera.push(v); - } else { - const DiaAgendamento = agendamento.scheduled_at.split("T")[0]; - - if (DiaAgendamento in DictAgendamentosOrganizados) { - DictAgendamentosOrganizados[DiaAgendamento].push(agendamento); - } else { - DictAgendamentosOrganizados[DiaAgendamento] = [agendamento]; - } + 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); } - } - for (const DiaAgendamento in DictAgendamentosOrganizados) { - DictAgendamentosOrganizados[DiaAgendamento].sort((a, b) => { - if (a.scheduled_at < b.scheduled_at) return -1; - if (a.scheduled_at > b.scheduled_at) return 1; - return 0; + const medico = cacheMedicos[agendamento.doctor_id]; + const paciente = cachePacientes[agendamento.patient_id]; + + ListaFilaDeEspera.push({ + agendamento, + Infos: { + nome_medico: 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, + }, }); + } else { + const DiaAgendamento = agendamento.scheduled_at.split("T")[0]; + + if (DiaAgendamento in DictAgendamentosOrganizados) { + DictAgendamentosOrganizados[DiaAgendamento].push(agendamento); + } else { + DictAgendamentosOrganizados[DiaAgendamento] = [agendamento]; + } + } } + // Ordenar por data + for (const DiaAgendamento in DictAgendamentosOrganizados) { + DictAgendamentosOrganizados[DiaAgendamento].sort((a, b) => a.scheduled_at.localeCompare(b.scheduled_at)); + } - const chavesOrdenadas = Object.keys(DictAgendamentosOrganizados).sort((a, b) => { - if (a < b) return -1; - if (a > b) return 1; - return 0; - }); + const chavesOrdenadas = Object.keys(DictAgendamentosOrganizados).sort(); - let DictAgendamentosFinal = {}; + const DictAgendamentosFinal = {}; for (const data of chavesOrdenadas) { - DictAgendamentosFinal[data] = DictAgendamentosOrganizados[data]; + DictAgendamentosFinal[data] = DictAgendamentosOrganizados[data]; } - setAgendamentosOrganizados(DictAgendamentosFinal); - setfilaEsperaData(ListaFilaDeEspera); -}; + + setAgendamentosOrganizados(DictAgendamentosFinal); + setFilaEsperaData(ListaFilaDeEspera); + }; + + fetchDados(); + + return { agendamentosOrganizados: DictAgendamentosOrganizados, filaEsperaData: ListaFilaDeEspera }; +}, [listaTodosAgendamentos]); // 👉 só recalcula quando a lista muda + + useEffect(() => { var myHeaders = new Headers(); 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) .then(response => response.json()) - .then(result => {FiltrarAgendamentos(result);console.log(result)}) + .then(result => {setListaTodosAgendamentos(result);console.log(result)}) .catch(error => console.log('error', error)); const PegarTodosOsMedicos = async () => { @@ -135,24 +143,7 @@ const Agendamento = ({setDictInfo}) => { 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) => { 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(() => { @@ -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) => { setSearchTermDoctor(term); if (term.trim() === '') { setFiltredTodosMedicos([]); + setMedicoFiltrado({id:"vazio"}) + //2 FiltrarAgendamentos() return; } + if (FiltredTodosMedicos.length === 1){ + setMedicoFiltrado({...FiltredTodosMedicos[0]}) + } const filtered = ListaDeMedicos.filter(medico => medico.nomeMedico.toLowerCase().includes(term.toLowerCase()) @@ -252,8 +269,6 @@ const handleSearchMedicos = (term) => { }; - const handleClickCancel = () => setPageConsulta(false) - return (

Agendar nova consulta

@@ -306,6 +321,8 @@ const handleSearchMedicos = (term) => { className='dropdown-item' onClick={() => { setSearchTermDoctor(medico.nomeMedico); + setFiltredTodosMedicos([]); + setMedicoFiltrado(medico) }} >

{medico.nomeMedico}