"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Plus, Edit, Trash2, Eye, Calendar, Filter } from "lucide-react"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog"; import DoctorLayout from "@/components/doctor-layout"; export default function MedicosPage() { const [searchTerm, setSearchTerm] = useState(""); const [especialidadeFilter, setEspecialidadeFilter] = useState("all"); const [statusFilter, setStatusFilter] = useState("all"); const [doctors, setDoctors] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [doctorToDelete, setDoctorToDelete] = useState(null); const [detailsDialogOpen, setDetailsDialogOpen] = useState(false); const [doctorDetails, setDoctorDetails] = useState(null); const openDetailsDialog = async (doctorId: string) => { setDetailsDialogOpen(true); setDoctorDetails(null); try { const res = await fetch(`https://mock.apidog.com/m1/1053378-0-default/pacientes/${doctorId}`); if (!res.ok) throw new Error(`HTTP ${res.status}`); const json = await res.json(); setDoctorDetails(json?.data ?? null); } catch (e: any) { setDoctorDetails({ error: e?.message || "Erro ao buscar detalhes" }); } }; useEffect(() => { const controller = new AbortController(); async function fetchFromPacientes() { try { setLoading(true); setError(null); const res = await fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes", { signal: controller.signal, }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const json = await res.json(); const items = Array.isArray(json?.data) ? json.data : []; const mapped = items.map((p: any) => ({ id: String(p.id ?? ""), nome: p.nome ?? "", crm: "", especialidade: "", telefone: p?.contato?.celular ?? p?.contato?.telefone1 ?? p?.telefone ?? "", cidade: p?.endereco?.cidade ?? p?.cidade ?? "", estado: p?.endereco?.estado ?? p?.estado ?? "", ultimoAtendimento: p.ultimo_atendimento ?? p.ultimoAtendimento ?? "", proximoAtendimento: p.proximo_atendimento ?? p.proximoAtendimento ?? "", status: p.status ?? "", })); setDoctors(mapped); } catch (e: any) { const isAbort = e?.name === "AbortError" || /aborted/i.test(e?.message || ""); if (isAbort) return; setError(e?.message || "Erro ao carregar dados"); } finally { setLoading(false); } } fetchFromPacientes(); return () => controller.abort(); }, []); const handleDeleteDoctor = async (doctorId: string) => { try { await fetch(`https://mock.apidog.com/m1/1053378-0-default/pacientes/${doctorId}`, { method: "DELETE", }); } catch {} setDoctors((prev) => prev.filter((doctor) => String(doctor.id) !== String(doctorId))); setDeleteDialogOpen(false); setDoctorToDelete(null); }; const openDeleteDialog = (doctorId: string) => { setDoctorToDelete(doctorId); setDeleteDialogOpen(true); }; const filteredDoctors = doctors.filter((doctor) => { const matchesSearch = doctor.nome.toLowerCase().includes(searchTerm.toLowerCase()) || doctor.crm.toLowerCase().includes(searchTerm.toLowerCase()) || doctor.telefone.includes(searchTerm); const matchesEspecialidade = especialidadeFilter === "all" || doctor.especialidade === especialidadeFilter; const matchesStatus = statusFilter === "all" || doctor.status === statusFilter; return matchesSearch && matchesEspecialidade && matchesStatus; }); return (

Médicos

Gerencie as informações dos médicos

Especialidade
Status
{loading ? ( ) : error ? ( ) : filteredDoctors.length === 0 ? ( ) : ( filteredDoctors.map((doctor) => ( )) )}
Nome CRM Telefone Cidade Estado Último atendimento Próximo atendimento Ações
Carregando médicos...
{`Erro: ${error}`}
Nenhum registro encontrado
{doctor.nome?.charAt(0) || "?"}
{doctor.nome}
{doctor.crm} {doctor.telefone} {doctor.cidade} {doctor.estado} {doctor.ultimoAtendimento} {doctor.proximoAtendimento}
Ações
openDetailsDialog(String(doctor.id))}> Ver detalhes Editar Ver agenda openDeleteDialog(String(doctor.id))}> Excluir
Confirmar exclusão Tem certeza que deseja excluir este médico? Esta ação não pode ser desfeita. Cancelar doctorToDelete && handleDeleteDoctor(doctorToDelete)} className="bg-red-600 hover:bg-red-700"> Excluir {/* Modal de detalhes do médico */} Detalhes do Médico {doctorDetails === null ? (
Carregando...
) : doctorDetails?.error ? (
{doctorDetails.error}
) : (
Nome: {doctorDetails.nome}
Telefone: {doctorDetails?.contato?.celular ?? doctorDetails?.contato?.telefone1 ?? doctorDetails?.telefone ?? ""}
Cidade: {doctorDetails?.endereco?.cidade ?? doctorDetails?.cidade ?? ""}
Estado: {doctorDetails?.endereco?.estado ?? doctorDetails?.estado ?? ""}
Convênio: {doctorDetails.convenio ?? ""}
VIP: {doctorDetails.vip ? "Sim" : "Não"}
Status: {doctorDetails.status ?? ""}
Último atendimento: {doctorDetails.ultimo_atendimento ?? doctorDetails.ultimoAtendimento ?? ""}
Próximo atendimento: {doctorDetails.proximo_atendimento ?? doctorDetails.proximoAtendimento ?? ""}
)}
Fechar
); }