"use client"; import React, { useEffect, useState, useCallback } from "react"; import ManagerLayout from "@/components/manager-layout"; import Link from "next/link"; import { useRouter } from "next/navigation"; 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, MoreVertical, Loader2, } from "lucide-react"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { doctorsService } from "services/doctorsApi.mjs"; interface Doctor { id: number; full_name: string; specialty: string; crm: string; phone_mobile: string | null; city: string | null; state: string | null; } interface DoctorDetails { nome: string; crm: string; especialidade: string; contato: { celular?: string; telefone1?: string }; endereco: { cidade?: string; estado?: string }; convenio?: string; vip?: boolean; status?: string; ultimo_atendimento?: string; proximo_atendimento?: string; error?: string; } export default function DoctorsPage() { const router = useRouter(); const [doctors, setDoctors] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [detailsDialogOpen, setDetailsDialogOpen] = useState(false); const [doctorDetails, setDoctorDetails] = useState( null ); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [doctorToDeleteId, setDoctorToDeleteId] = useState(null); // --- Lógica de Paginação --- const [itemsPerPage, setItemsPerPage] = useState(10); const [currentPage, setCurrentPage] = useState(1); // Cálculo dos itens a serem exibidos na página atual const indexOfLastItem = currentPage * itemsPerPage; const indexOfFirstItem = indexOfLastItem - itemsPerPage; const currentItems = doctors.slice(indexOfFirstItem, indexOfLastItem); // Função para mudar de página const paginate = (pageNumber: number) => setCurrentPage(pageNumber); // Lógica para mudar itens por página, resetando para a página 1 const handleItemsPerPageChange = (value: string) => { setItemsPerPage(Number(value)); setCurrentPage(1); // Resetar para a primeira página }; // --- Fim da Lógica de Paginação --- const fetchDoctors = useCallback(async () => { setLoading(true); setError(null); try { const data: Doctor[] = await doctorsService.list(); setDoctors(data || []); setCurrentPage(1); // Resetar para a primeira página ao carregar novos dados } catch (e: any) { console.error("Erro ao carregar lista de médicos:", e); setError( "Não foi possível carregar a lista de médicos. Verifique a conexão com a API." ); setDoctors([]); } finally { setLoading(false); } }, []); useEffect(() => { fetchDoctors(); }, [fetchDoctors]); const openDetailsDialog = async (doctor: Doctor) => { setDetailsDialogOpen(true); setDoctorDetails({ nome: doctor.full_name, crm: doctor.crm, especialidade: doctor.specialty, contato: { celular: doctor.phone_mobile ?? undefined }, endereco: { cidade: doctor.city ?? undefined, estado: doctor.state ?? undefined, }, convenio: "Particular", vip: false, status: "Ativo", ultimo_atendimento: "N/A", proximo_atendimento: "N/A", }); }; const handleDelete = async () => { if (doctorToDeleteId === null) return; setLoading(true); try { await doctorsService.delete(doctorToDeleteId); setDeleteDialogOpen(false); setDoctorToDeleteId(null); await fetchDoctors(); } catch (e) { console.error("Erro ao excluir:", e); alert("Erro ao excluir médico."); } finally { setLoading(false); } }; const openDeleteDialog = (doctorId: number) => { setDoctorToDeleteId(doctorId); setDeleteDialogOpen(true); }; const handleEdit = (doctorId: number) => { router.push(`/manager/home/${doctorId}/editar`); }; return (
{/* Cabeçalho */}

Médicos Cadastrados

Gerencie todos os profissionais de saúde.

{/* Filtros e Itens por Página */}
{/* Select de Itens por Página Adicionado */}
{/* Tabela */}
{loading ? (
Carregando médicos...
) : error ? (
{error}
) : doctors.length === 0 ? (
Nenhum médico cadastrado.{" "} Adicione um novo .
) : (
{/* Usando currentItems para a paginação */} {currentItems.map((doctor) => ( ))}
Nome CRM Especialidade Celular Cidade/Estado Ações
{doctor.full_name} {doctor.crm} {doctor.specialty} {doctor.phone_mobile || "N/A"} {doctor.city || doctor.state ? `${doctor.city || ""}${ doctor.city && doctor.state ? "/" : "" }${doctor.state || ""}` : "N/A"}
Agendar Consulta
)}
{/* Paginação */} {doctors.length > itemsPerPage && (
{Array.from({ length: Math.ceil(doctors.length / itemsPerPage) }, (_, i) => ( ))}
)} {/* Dialogs */} Confirma a exclusão? Esta ação é irreversível e excluirá permanentemente o registro deste médico. Cancelar {loading && ( )} Excluir {doctorDetails?.nome} {doctorDetails && (

Informações Principais

CRM: {doctorDetails.crm}
Especialidade:{" "} {doctorDetails.especialidade}
Celular:{" "} {doctorDetails.contato.celular || "N/A"}
Localização:{" "} {`${doctorDetails.endereco.cidade || "N/A"}/${ doctorDetails.endereco.estado || "N/A" }`}

Atendimento e Convênio

Convênio:{" "} {doctorDetails.convenio || "N/A"}
VIP:{" "} {doctorDetails.vip ? "Sim" : "Não"}
Status:{" "} {doctorDetails.status || "N/A"}
Último atendimento:{" "} {doctorDetails.ultimo_atendimento || "N/A"}
Próximo atendimento:{" "} {doctorDetails.proximo_atendimento || "N/A"}
)}
Fechar
); }