forked from RiseUP/riseup-squad23
Updates de exceção
This commit is contained in:
parent
a996de3edd
commit
626fcc8124
@ -1,9 +1,6 @@
|
|||||||
// src/components/FormCriarExcecao.jsx
|
|
||||||
|
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { useAuth } from "./utils/AuthProvider"; // <-- added
|
import { useAuth } from "./utils/AuthProvider";
|
||||||
import API_KEY from "./utils/apiKeys"; // <-- added
|
import API_KEY from "./utils/apiKeys";
|
||||||
// Assumindo que você usa o mesmo estilo
|
|
||||||
import "./AgendarConsulta/style/formagendamentos.css";
|
import "./AgendarConsulta/style/formagendamentos.css";
|
||||||
|
|
||||||
|
|
||||||
@ -11,7 +8,7 @@ const ENDPOINT_CRIAR_EXCECAO = "https://yuanqfswhberkoevtmfr.supabase.co/rest/v1
|
|||||||
|
|
||||||
const FormCriarExcecao = ({ onCancel, doctorID }) => {
|
const FormCriarExcecao = ({ onCancel, doctorID }) => {
|
||||||
|
|
||||||
const { getAuthorizationHeader, user, getUserInfo } = useAuth(); // useAuth inside component
|
const { getAuthorizationHeader, user, getUserInfo } = useAuth();
|
||||||
const [dadosAtendimento, setDadosAtendimento] = useState({
|
const [dadosAtendimento, setDadosAtendimento] = useState({
|
||||||
profissional: doctorID || '',
|
profissional: doctorID || '',
|
||||||
tipoAtendimento: '',
|
tipoAtendimento: '',
|
||||||
@ -35,17 +32,14 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
|
|||||||
|
|
||||||
const { profissional, dataAtendimento, tipoAtendimento, inicio, termino, motivo } = dadosAtendimento;
|
const { profissional, dataAtendimento, tipoAtendimento, inicio, termino, motivo } = dadosAtendimento;
|
||||||
|
|
||||||
// Validação
|
|
||||||
if (!profissional || !dataAtendimento || !tipoAtendimento || !motivo) {
|
if (!profissional || !dataAtendimento || !tipoAtendimento || !motivo) {
|
||||||
alert("Por favor, preencha o ID do Profissional, Data, Tipo e Motivo.");
|
alert("Por favor, preencha o ID do Profissional, Data, Tipo e Motivo.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adiciona ":00" se o campo de hora estiver preenchido
|
|
||||||
const startTime = inicio ? inicio + ":00" : null;
|
const startTime = inicio ? inicio + ":00" : null;
|
||||||
const endTime = termino ? termino + ":00" : null;
|
const endTime = termino ? termino + ":00" : null;
|
||||||
|
|
||||||
// resolve authorization header and try to get current user id for created_by
|
|
||||||
let authHeader = "";
|
let authHeader = "";
|
||||||
try {
|
try {
|
||||||
authHeader = getAuthorizationHeader ? getAuthorizationHeader() : "";
|
authHeader = getAuthorizationHeader ? getAuthorizationHeader() : "";
|
||||||
@ -53,7 +47,6 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
|
|||||||
console.warn("Não foi possível obter Authorization header via useAuth()", err);
|
console.warn("Não foi possível obter Authorization header via useAuth()", err);
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to resolve created_by (se disponível no contexto)
|
|
||||||
let createdBy = user?.id || null;
|
let createdBy = user?.id || null;
|
||||||
if (!createdBy && typeof getUserInfo === "function") {
|
if (!createdBy && typeof getUserInfo === "function") {
|
||||||
try {
|
try {
|
||||||
@ -63,7 +56,7 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
|
|||||||
console.warn("getUserInfo falhou:", err);
|
console.warn("getUserInfo falhou:", err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// fallback localStorage (opcional)
|
|
||||||
if (!createdBy) {
|
if (!createdBy) {
|
||||||
try {
|
try {
|
||||||
const stored = localStorage.getItem("user");
|
const stored = localStorage.getItem("user");
|
||||||
@ -81,13 +74,13 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
|
|||||||
start_time: startTime,
|
start_time: startTime,
|
||||||
end_time: endTime,
|
end_time: endTime,
|
||||||
reason: motivo,
|
reason: motivo,
|
||||||
created_by: createdBy // pode ser null se não encontrado
|
created_by: createdBy
|
||||||
});
|
});
|
||||||
|
|
||||||
var myHeaders = new Headers();
|
var myHeaders = new Headers();
|
||||||
if (authHeader) myHeaders.append("Authorization", authHeader);
|
if (authHeader) myHeaders.append("Authorization", authHeader);
|
||||||
myHeaders.append("Content-Type", "application/json");
|
myHeaders.append("Content-Type", "application/json");
|
||||||
if (API_KEY) myHeaders.append("apikey", API_KEY); // <-- added
|
if (API_KEY) myHeaders.append("apikey", API_KEY);
|
||||||
|
|
||||||
var requestOptions = {
|
var requestOptions = {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@ -109,7 +102,7 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
|
|||||||
if (response.ok || response.status === 201) {
|
if (response.ok || response.status === 201) {
|
||||||
console.log("Exceção criada com sucesso:", result);
|
console.log("Exceção criada com sucesso:", result);
|
||||||
alert(`Exceção criada! Detalhes: ${result.id || JSON.stringify(result)}`);
|
alert(`Exceção criada! Detalhes: ${result.id || JSON.stringify(result)}`);
|
||||||
onCancel(true); // Indica sucesso para o componente pai recarregar
|
onCancel(true);
|
||||||
} else {
|
} else {
|
||||||
console.error("Erro ao criar exceção:", result);
|
console.error("Erro ao criar exceção:", result);
|
||||||
alert(`Erro ao criar exceção. Status: ${response.status}. Detalhes: ${result.message || JSON.stringify(result)}`);
|
alert(`Erro ao criar exceção. Status: ${response.status}. Detalhes: ${result.message || JSON.stringify(result)}`);
|
||||||
@ -186,10 +179,6 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
|
|||||||
onChange={handleAtendimentoChange}
|
onChange={handleAtendimentoChange}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="campo-de-input">
|
|
||||||
{/* Removendo o campo solicitante, pois não está no payload da API de exceções */}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
import React, { useState, useEffect, useCallback, useMemo } from 'react';
|
import React, { useState, useEffect, useCallback, useMemo } from 'react';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
// Adicionar locale e plugin se quiser exibir o nome do mês em português
|
|
||||||
import 'dayjs/locale/pt-br';
|
import 'dayjs/locale/pt-br';
|
||||||
import weekday from 'dayjs/plugin/weekday';
|
import weekday from 'dayjs/plugin/weekday';
|
||||||
import FormCriarExcecao from '../components/FormCriarExcecao';
|
import FormCriarExcecao from '../components/FormCriarExcecao';
|
||||||
@ -13,12 +12,8 @@ import API_KEY from '../components/utils/apiKeys';
|
|||||||
dayjs.extend(weekday);
|
dayjs.extend(weekday);
|
||||||
dayjs.locale('pt-br');
|
dayjs.locale('pt-br');
|
||||||
|
|
||||||
// --- Configurações da API Supabase ---
|
|
||||||
const ENDPOINT_BASE = "https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctor_exceptions";
|
const ENDPOINT_BASE = "https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctor_exceptions";
|
||||||
// const AUTH_TOKEN = "SEU_TOKEN_DE_AUTORIZACAO_AQUI"; // removed
|
|
||||||
// ------------------------------------
|
|
||||||
|
|
||||||
// Função auxiliar para calcular o range de datas
|
|
||||||
const getDateRange = (date, view) => {
|
const getDateRange = (date, view) => {
|
||||||
const startDayjs = dayjs(date);
|
const startDayjs = dayjs(date);
|
||||||
let fromDate, toDate, titleRange;
|
let fromDate, toDate, titleRange;
|
||||||
@ -36,8 +31,6 @@ const getDateRange = (date, view) => {
|
|||||||
weekStart = startDayjs.weekday(1); // Vai para a segunda-feira desta semana
|
weekStart = startDayjs.weekday(1); // Vai para a segunda-feira desta semana
|
||||||
}
|
}
|
||||||
|
|
||||||
// Se a data de filtro for hoje (quinta), weekStart é a segunda-feira.
|
|
||||||
// O Supabase filtra por dia. O range deve incluir a semana inteira.
|
|
||||||
const weekEnd = weekStart.add(6, 'day');
|
const weekEnd = weekStart.add(6, 'day');
|
||||||
|
|
||||||
fromDate = weekStart.format('YYYY-MM-DD');
|
fromDate = weekStart.format('YYYY-MM-DD');
|
||||||
@ -58,7 +51,7 @@ const getDateRange = (date, view) => {
|
|||||||
|
|
||||||
const ExcecoesDisponibilidade = () => {
|
const ExcecoesDisponibilidade = () => {
|
||||||
|
|
||||||
const { getAuthorizationHeader } = useAuth(); // hook must be at top level of component
|
const { getAuthorizationHeader } = useAuth();
|
||||||
const [pageNovaExcecao, setPageNovaExcecao] = useState(false);
|
const [pageNovaExcecao, setPageNovaExcecao] = useState(false);
|
||||||
const [excecoes, setExcecoes] = useState([]);
|
const [excecoes, setExcecoes] = useState([]);
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
@ -66,32 +59,27 @@ const ExcecoesDisponibilidade = () => {
|
|||||||
const [filtroMedicoId, setFiltroMedicoId] = useState('');
|
const [filtroMedicoId, setFiltroMedicoId] = useState('');
|
||||||
const [filtroData, setFiltroData] = useState(dayjs().format('YYYY-MM-DD'));
|
const [filtroData, setFiltroData] = useState(dayjs().format('YYYY-MM-DD'));
|
||||||
|
|
||||||
// Estado para controlar a visualização ('diario', 'semanal', 'mensal')
|
|
||||||
const [visualizacao, setVisualizacao] = useState('diario');
|
const [visualizacao, setVisualizacao] = useState('diario');
|
||||||
|
|
||||||
// helper to get Authorization header string (uses AuthProvider)
|
|
||||||
const resolveAuthHeader = () => {
|
const resolveAuthHeader = () => {
|
||||||
try {
|
try {
|
||||||
const h = getAuthorizationHeader(); // returns "Bearer <token>" or ''
|
const h = getAuthorizationHeader();
|
||||||
return h || '';
|
return h || '';
|
||||||
} catch {
|
} catch {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Função para buscar as exceções (ACEITA RANGE)
|
|
||||||
const fetchExcecoes = useCallback(async (fromDate, toDate, doctorId) => {
|
const fetchExcecoes = useCallback(async (fromDate, toDate, doctorId) => {
|
||||||
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
|
||||||
let url = `${ENDPOINT_BASE}?select=*`;
|
let url = `${ENDPOINT_BASE}?select=*`;
|
||||||
|
|
||||||
// Filtro por ID do Médico
|
|
||||||
if (doctorId) {
|
if (doctorId) {
|
||||||
url += `&doctor_id=eq.${doctorId}`;
|
url += `&doctor_id=eq.${doctorId}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FILTRO PRINCIPAL: INTERVALO DE DATAS USANDO gte (>=) e lte (<=)
|
|
||||||
url += `&date=gte.${fromDate}&date=lte.${toDate}`;
|
url += `&date=gte.${fromDate}&date=lte.${toDate}`;
|
||||||
|
|
||||||
const myHeaders = new Headers();
|
const myHeaders = new Headers();
|
||||||
@ -126,18 +114,15 @@ const ExcecoesDisponibilidade = () => {
|
|||||||
}
|
}
|
||||||
}, [getAuthorizationHeader]);
|
}, [getAuthorizationHeader]);
|
||||||
|
|
||||||
// Calcula o range de datas e o título a ser exibido
|
|
||||||
const { fromDate, toDate, titleRange } = useMemo(() =>
|
const { fromDate, toDate, titleRange } = useMemo(() =>
|
||||||
getDateRange(filtroData, visualizacao),
|
getDateRange(filtroData, visualizacao),
|
||||||
[filtroData, visualizacao]
|
[filtroData, visualizacao]
|
||||||
);
|
);
|
||||||
|
|
||||||
// Efeito para carregar exceções quando os filtros e a visualização mudam
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchExcecoes(fromDate, toDate, filtroMedicoId);
|
fetchExcecoes(fromDate, toDate, filtroMedicoId);
|
||||||
}, [fetchExcecoes, filtroMedicoId, fromDate, toDate]); // Dependências atualizadas
|
}, [fetchExcecoes, filtroMedicoId, fromDate, toDate]);
|
||||||
|
|
||||||
// Deleta uma exceção pelo id e atualiza a lista localmente
|
|
||||||
const deleteExcecao = async (id) => {
|
const deleteExcecao = async (id) => {
|
||||||
if (!window.confirm("Confirma exclusão desta exceção?")) return;
|
if (!window.confirm("Confirma exclusão desta exceção?")) return;
|
||||||
const myHeaders = new Headers();
|
const myHeaders = new Headers();
|
||||||
@ -153,7 +138,6 @@ const ExcecoesDisponibilidade = () => {
|
|||||||
redirect: 'follow'
|
redirect: 'follow'
|
||||||
});
|
});
|
||||||
if (res.ok) {
|
if (res.ok) {
|
||||||
// remove locally
|
|
||||||
setExcecoes(prev => prev.filter(x => x.id !== id));
|
setExcecoes(prev => prev.filter(x => x.id !== id));
|
||||||
} else {
|
} else {
|
||||||
const text = await res.text();
|
const text = await res.text();
|
||||||
@ -271,8 +255,6 @@ const ExcecoesDisponibilidade = () => {
|
|||||||
<button
|
<button
|
||||||
className="btn btn-sm btn-edit"
|
className="btn btn-sm btn-edit"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
// Implementar edição conforme fluxo do seu app.
|
|
||||||
// Aqui apenas abre o formulário pré-preenchendo o doctorID.
|
|
||||||
setFiltroMedicoId(exc.doctor_id || '');
|
setFiltroMedicoId(exc.doctor_id || '');
|
||||||
setPageNovaExcecao(true);
|
setPageNovaExcecao(true);
|
||||||
}}
|
}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user