import React, { useState, useEffect, useCallback } from 'react'; import dayjs from 'dayjs'; import FormCriarExcecao from '../components/FormCriarExcecao'; import "../components/AgendarConsulta/style/formagendamentos.css"; import "./style/Agendamento.css"; import './style/FilaEspera.css'; const ENDPOINT_LISTAR = "https://mock.apidog.com/m1/1053378-0-default/rest/v1/doctor_exceptions"; const ENDPOINT_DELETAR = "https://mock.apidog.com/m1/1053378-0-default/rest/v1/doctor_exceptions/"; const ExcecoesDisponibilidade = () => { const [pageNovaExcecao, setPageNovaExcecao] = useState(false); const [excecoes, setExcecoes] = useState([]); const [loading, setLoading] = useState(false); // Filtros const [filtroMedicoId, setFiltroMedicoId] = useState(''); const [filtroData, setFiltroData] = useState(dayjs().format('YYYY-MM-DD')); // Estado para controlar a visualização (Diário, Semanal) const [visualizacao, setVisualizacao] = useState('diario'); // Função para buscar as exceções const fetchExcecoes = useCallback(async (doctorId, date) => { setLoading(true); let url = `${ENDPOINT_LISTAR}?select=*`; if (doctorId) { url += `&doctor_id=eq.${doctorId}`; // Assume filtro por igualdade de ID } if (date) { url += `&date=eq.${date}`; // Assume filtro por igualdade de data } try { const requestOptions = { method: 'GET', redirect: 'follow' }; const response = await fetch(url, requestOptions); const result = await response.json(); if (response.ok && Array.isArray(result)) { setExcecoes(result); } else { setExcecoes([]); console.error("Erro ao listar exceções:", result); alert("Erro ao carregar lista de exceções."); } } catch (error) { console.error('Erro na requisição de listagem de exceções:', error); setExcecoes([]); alert("Erro de comunicação com o servidor ao listar exceções."); } finally { setLoading(false); } }, []); // Função para deletar uma exceção const deletarExcecao = async (id) => { if (!window.confirm(`Tem certeza que deseja deletar a exceção com ID: ${id}?`)) return; try { const requestOptions = { method: 'DELETE', redirect: 'follow' }; const response = await fetch(`${ENDPOINT_DELETAR}${id}`, requestOptions); if (response.ok || response.status === 204) { alert(`Exceção ${id} deletada com sucesso.`); fetchExcecoes(filtroMedicoId, filtroData); // Recarrega a lista } else { const result = await response.json(); alert(`Erro ao deletar exceção. Detalhes: ${result.message || JSON.stringify(result)}`); } } catch (error) { console.error('Erro na requisição de deleção:', error); alert('Erro de comunicação ao tentar deletar a exceção.'); } }; // Efeito para carregar exceções quando os filtros mudam useEffect(() => { fetchExcecoes(filtroMedicoId, filtroData); }, [fetchExcecoes, filtroMedicoId, filtroData]); // Handler de cancelamento do formulário de criação const handleCancelForm = (recarregar = false) => { setPageNovaExcecao(false); if (recarregar) { fetchExcecoes(filtroMedicoId, filtroData); // Recarrega se a criação foi bem-sucedida } } // Se o formulário de criação estiver aberto, renderiza apenas ele if (pageNovaExcecao) { return ; } // Renderiza a tela de listagem (layout da agenda) return (

Gerenciar Exceções de Disponibilidade

{/* Filtros e Busca (Adaptados do Agendamento) */}
setFiltroMedicoId(e.target.value)} />
setFiltroData(e.target.value)} />
{/* Botões de Visualização (Dia/Semana/Mês) - Adaptados */}
{/* Tabela de Exceções (Simulando a Tabela de Agendamentos) */}

Exceções em {filtroData} ({excecoes.length})

{loading ? (

Carregando exceções...

) : excecoes.length === 0 ? (

Nenhuma exceção encontrada para os filtros aplicados.

) : ( {excecoes.map((excecao, index) => ( ))}
ID Exceção ID Médico Data Início Término Tipo Motivo Ações
{excecao.id || 'N/A'} {excecao.doctor_id} {excecao.date} {excecao.start_time ? excecao.start_time.substring(0, 5) : 'Dia Todo'} {excecao.end_time ? excecao.end_time.substring(0, 5) : 'Dia Todo'} {excecao.kind} {excecao.reason} {excecao.id && ( )}
)}
); } export default ExcecoesDisponibilidade;