Merge branch 'main' of https://git.popcode.com.br/RiseUP/riseup-squad23 into Disponibilidade5

This commit is contained in:
pedrofedericoo 2025-11-05 00:04:45 -03:00
commit 9f4e288a02

View File

@ -1,13 +1,13 @@
import React, { useState } from "react"; import React, { useState, useEffect } from "react";
import { useAuth } from "./utils/AuthProvider"; import { useAuth } from "./utils/AuthProvider";
import API_KEY from "./utils/apiKeys"; import API_KEY from "./utils/apiKeys";
import "./AgendarConsulta/style/formagendamentos.css"; import "./AgendarConsulta/style/formagendamentos.css";
import { GetAllDoctors } from './utils/Functions-Endpoints/Doctor';
const ENDPOINT_CRIAR_EXCECAO = "https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctor_exceptions"; const ENDPOINT_CRIAR_EXCECAO = "https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctor_exceptions";
const FormCriarExcecao = ({ onCancel, doctorID }) => { const FormCriarExcecao = ({ onCancel, doctorID }) => {
const { getAuthorizationHeader, user, getUserInfo } = useAuth(); const { getAuthorizationHeader, user, getUserInfo } = useAuth();
const [dadosAtendimento, setDadosAtendimento] = useState({ const [dadosAtendimento, setDadosAtendimento] = useState({
profissional: doctorID || '', profissional: doctorID || '',
@ -18,6 +18,13 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
motivo: '' motivo: ''
}); });
const [todosProfissionais, setTodosProfissionais] = useState([]);
const [profissionaisFiltrados, setProfissionaisFiltrados] = useState([]);
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
const [doctorSearchName, setDoctorSearchName] = useState('');
const [searchingDoctor, setSearchingDoctor] = useState(false);
const handleAtendimentoChange = (e) => { const handleAtendimentoChange = (e) => {
const { value, name } = e.target; const { value, name } = e.target;
setDadosAtendimento(prev => ({ setDadosAtendimento(prev => ({
@ -26,6 +33,52 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
})); }));
}; };
useEffect(() => {
const loadDoctors = async () => {
setSearchingDoctor(true);
let authHeader = '';
try { authHeader = getAuthorizationHeader ? getAuthorizationHeader() : ''; } catch {}
try {
const Medicos = await GetAllDoctors(authHeader);
setTodosProfissionais(Array.isArray(Medicos) ? Medicos : []);
} catch (err) {
console.error('Erro ao carregar médicos:', err);
setTodosProfissionais([]);
} finally {
setSearchingDoctor(false);
}
};
loadDoctors();
}, [getAuthorizationHeader]);
const handleSearchProfissional = (e) => {
const term = e.target.value;
setDoctorSearchName(term);
if (term.trim() === '') {
setProfissionaisFiltrados([]);
setIsDropdownOpen(false);
return;
}
const filtered = todosProfissionais.filter(p =>
(p.full_name || '').toLowerCase().includes(term.toLowerCase())
);
setProfissionaisFiltrados(filtered);
setIsDropdownOpen(filtered.length > 0);
};
const handleSelectProfissional = (profissional) => {
setDadosAtendimento(prev => ({
...prev,
profissional: profissional.id
}));
setDoctorSearchName(profissional.full_name || '');
setProfissionaisFiltrados([]);
setIsDropdownOpen(false);
};
// lista simples de valores permitidos
const ALLOWED_KINDS = ['disponibilidade_extra', 'bloqueio'];
const handleSubmitExcecao = async (e) => { const handleSubmitExcecao = async (e) => {
e.preventDefault(); e.preventDefault();
console.log("Tentando criar Exceção."); console.log("Tentando criar Exceção.");
@ -37,6 +90,13 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
return; return;
} }
// usa diretamente o value selecionado (já definido no <select>) e valida
const mappedKind = tipoAtendimento;
if (!ALLOWED_KINDS.includes(mappedKind)) {
alert(`Tipo inválido: "${tipoAtendimento}". Tipos aceitos: ${ALLOWED_KINDS.join(', ')}`);
return;
}
const startTime = inicio ? inicio + ":00" : null; const startTime = inicio ? inicio + ":00" : null;
const endTime = termino ? termino + ":00" : null; const endTime = termino ? termino + ":00" : null;
@ -70,7 +130,7 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
const raw = JSON.stringify({ const raw = JSON.stringify({
doctor_id: profissional, doctor_id: profissional,
date: dataAtendimento, date: dataAtendimento,
kind: tipoAtendimento, kind: mappedKind,
start_time: startTime, start_time: startTime,
end_time: endTime, end_time: endTime,
reason: motivo, reason: motivo,
@ -119,7 +179,30 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
<h2 className="section-title">Informações da Nova Exceção</h2> <h2 className="section-title">Informações da Nova Exceção</h2>
<div className="campo-informacoes-atendimento"> <div className="campo-informacoes-atendimento">
{/* Busca por nome usando filtragem local */}
<div className="campo-de-input campo-de-input-container">
<label>Nome do médico</label>
<input
type="text"
name="doctorSearchName"
placeholder="Digite o nome do médico"
value={doctorSearchName}
onChange={handleSearchProfissional}
autoComplete="off"
/>
{isDropdownOpen && profissionaisFiltrados.length > 0 && (
<div className="dropdown-profissionais">
{profissionaisFiltrados.map(p => (
<div key={p.id} className="dropdown-item" onClick={() => handleSelectProfissional(p)}>
{p.full_name}
</div>
))}
</div>
)}
{searchingDoctor && <small>Carregando médicos...</small>}
</div>
{/* ID do profissional (preenchido ao selecionar) */}
<div className="campo-de-input"> <div className="campo-de-input">
<label>ID do profissional *</label> <label>ID do profissional *</label>
<input <input
@ -134,12 +217,11 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
<div className="campo-de-input"> <div className="campo-de-input">
<label>Tipo de exceção *</label> <label>Tipo de exceção *</label>
<select name="tipoAtendimento" onChange={handleAtendimentoChange} value={dadosAtendimento.tipoAtendimento} required> <select name="tipoAtendimento" onChange={handleAtendimentoChange} value={dadosAtendimento.tipoAtendimento} required>
<option value="">Selecione o tipo de exceção</option> <option value="" disabled>Selecione o tipo de exceção</option>
<option value="liberacao" >Liberação (Criar Slot)</option> <option value="disponibilidade_extra" >Liberação</option>
<option value="bloqueio" >Bloqueio (Remover Slot)</option> <option value="bloqueio" >Bloqueio</option>
</select> </select>
</div> </div>
</div> </div>
<section id="informacoes-atendimento-segunda-linha"> <section id="informacoes-atendimento-segunda-linha">