import "../../assets/css/index.css"; import { useState, useEffect } from "react"; import { Link } from "react-router-dom"; import supabase from "../../Supabase.js"; import Swal from "sweetalert2"; import { getAccessToken } from "../../utils/auth.js"; import { getUserRole } from "../../utils/userInfo.js"; const AvatarForm = "/img/AvatarForm.jpg"; function DoctorList() { const [search, setSearch] = useState(""); const [specialtyFilter, setSpecialtyFilter] = useState(""); // Filtro por especialidade const [doctors, setDoctors] = useState([]); const [openDropdown, setOpenDropdown] = useState(null); const tokenUsuario = getAccessToken() const role = getUserRole(); var myHeaders = new Headers(); const supabaseUrl = import.meta.env.VITE_SUPABASE_URL; const supabaseAK = import.meta.env.VITE_SUPABASE_ANON_KEY; myHeaders.append( "apikey", supabaseAK ); myHeaders.append("Authorization", `Bearer ${tokenUsuario}`); var requestOptions = { method: "GET", headers: myHeaders, redirect: "follow", }; // buscar médicos useEffect(() => { fetch(`${supabaseUrl}/rest/v1/doctors`, requestOptions) .then((response) => response.json()) .then((result) => setDoctors(Array.isArray(result) ? result : [])) .catch((error) => console.log("error", error)); }, []); const handleDelete = async (id) => { Swal.fire({ title: "Tem certeza?", text: "Tem certeza que deseja excluir este registro?", icon: "warning", showCancelButton: true, confirmButtonColor: "#3085d6", cancelButtonColor: "#d33", confirmButtonText: "Sim, excluir", cancelButtonText: "Cancelar" }).then(async (result) => { if (result.isConfirmed) { try { const tokenUsuario = getAccessToken(); // pega o token do usuário (mesmo que usa no form) var myHeaders = new Headers(); myHeaders.append("apikey", supabaseAK); myHeaders.append("Authorization", `Bearer ${tokenUsuario}`); myHeaders.append("Content-Type", "application/json"); const response = await fetch( `${supabaseUrl}/rest/v1/doctors?id=eq.${id}`, { method: "DELETE", headers: myHeaders, } ); if (!response.ok) { const err = await response.json(); console.error("Erro ao deletar médico:", err); Swal.fire("Erro!", err.message || "Não foi possível excluir o registro.", "error"); return; } // Atualiza a lista local setDoctors((prev) => prev.filter((doc) => doc.id !== id)); Swal.fire("Excluído!", "O registro foi removido com sucesso.", "success"); } catch (error) { console.error("Erro inesperado:", error); Swal.fire("Erro!", "Algo deu errado ao excluir.", "error"); } } }); }; const handleViewDetails = async (id) => { try { const tokenUsuario = getAccessToken(); const response = await fetch( `${supabaseUrl}/rest/v1/doctors?id=eq.${id}`, { method: "GET", headers: { apikey: supabaseAK, Authorization: `Bearer ${tokenUsuario}`, }, } ); const data = await response.json(); const doctor = data[0]; if (!doctor) { Swal.fire("Erro", "Não foi possível carregar os detalhes do médico.", "error"); return; } Swal.fire({ width: "800px", showConfirmButton: true, confirmButtonText: "Fechar", confirmButtonColor: "#4dabf7", background: document.body.classList.contains("dark-mode") ? "#1e1e2f" : "#fff", color: document.body.classList.contains("dark-mode") ? "#f5f5f5" : "#000", html: `
Perfil Médico
${doctor.full_name}
${doctor.full_name}

${doctor.specialty || "Especialidade não informada"}

Telefone: ${doctor.phone_mobile || "—"}

Email: ${doctor.email || "—"}

Data de nascimento: ${doctor.birth_date || "—"}

Sexo: ${doctor.gender || "—"}

Região: ${doctor.city || "—"}, ${doctor.state || "—"}, Brasil

CRM: ${doctor.crm || "—"}

Especialidade: ${doctor.specialty || "—"}

Experiência: ${doctor.experience_years || "—"} anos

Biografia

${doctor.biografia || "Este médico ainda não possui biografia cadastrada."}

`, didOpen: () => { document .getElementById("btn-close-modal") ?.addEventListener("click", () => Swal.close()); }, }); } catch (err) { console.error("Erro ao buscar médico:", err); Swal.fire("Erro!", err.message || "Erro ao buscar médico.", "error"); } }; // Função de filtragem (mesmo padrão do PatientList) const filteredDoctors = doctors.filter(doctor => { if (!doctor) return false; // Filtro por texto (nome, especialidade, CRM, email) const nome = (doctor.full_name || "").toLowerCase(); const crm = (doctor.crm || "").toLowerCase(); const email = (doctor.email || "").toLowerCase(); const cidade = (doctor.city || "").toLowerCase(); const q = search.toLowerCase(); const matchesSearch = nome.includes(q) || crm.includes(q) || email.includes(q) || cidade.includes(q); // Filtro por especialidade let matchesSpecialty = true; if (specialtyFilter) { const doctorSpecialty = (doctor.specialty || "").toLowerCase().trim(); matchesSpecialty = doctorSpecialty.includes(specialtyFilter.toLowerCase()); } return matchesSearch && matchesSpecialty; }); const permissoes = { admin: ['adddoctor'], secretaria: [""], paciente: [''] }; const pode = (acao) => permissoes[role]?.includes(acao); return (

Lista de Médicos

{pode('adddoctor') && ( Adicionar Médico )}
{/* Filtros em uma única linha (mesmo padrão do PatientList) */}
{/* Campo de busca */} setSearch(e.target.value)} style={{ minWidth: "300px", maxWidth: "450px" }} /> {/* Filtro por especialidade */} {/* Contador de resultados */} {filteredDoctors.length} médico(s) encontrado(s)
{filteredDoctors.length > 0 ? ( filteredDoctors.map((doctor) => (
{/* Dropdown estilizado */}
{openDropdown === doctor.id && (
{/* Ver Detalhes */} { e.stopPropagation(); setOpenDropdown(null); handleViewDetails(doctor.id); }} > Ver Detalhes {/* Edit */} Editar {/* Delete */}
)}

{doctor.full_name}

{doctor.specialty || 'Não informado'}
{doctor.city || 'Não informado'}
)) ) : (
Nenhum médico encontrado

{search || specialtyFilter ? "Tente ajustar os filtros de busca" : "Nenhum médico cadastrado no sistema"}

)}
{/* Modal delete (não alterado) */}
); } export default DoctorList;