"use client"; // -> ADICIONADO: useMemo para otimizar a criação da lista de especialidades import React, { useEffect, useState, useCallback, useMemo } 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; // -> ADICIONADO: Campo 'status' para que o filtro funcione. Sua API precisa retornar este dado. status?: string; } 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); // -> PASSO 1: Criar estados para os filtros const [specialtyFilter, setSpecialtyFilter] = useState("all"); const [statusFilter, setStatusFilter] = useState("all"); const fetchDoctors = useCallback(async () => { setLoading(true); setError(null); try { const data: Doctor[] = await doctorsService.list(); // Exemplo: Adicionando um status fake para o filtro funcionar. O ideal é que isso venha da API. const dataWithStatus = data.map((doc, index) => ({ ...doc, status: index % 3 === 0 ? "Inativo" : index % 2 === 0 ? "Férias" : "Ativo" })); setDoctors(dataWithStatus || []); } 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 }, status: doctor.status || "Ativo", // Usa o status do médico convenio: "Particular", vip: false, 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`); }; // -> MELHORIA: Gera a lista de especialidades dinamicamente const uniqueSpecialties = useMemo(() => { const specialties = doctors.map(doctor => doctor.specialty).filter(Boolean); return [...new Set(specialties)]; }, [doctors]); // -> PASSO 3: Aplicar a lógica de filtragem const filteredDoctors = doctors.filter(doctor => { const specialtyMatch = specialtyFilter === "all" || doctor.specialty === specialtyFilter; const statusMatch = statusFilter === "all" || doctor.status === statusFilter; return specialtyMatch && statusMatch; }); return (

Médicos Cadastrados

Gerencie todos os profissionais de saúde.

{/* -> PASSO 2: Conectar os estados aos componentes Select <- */}
Especialidades Status
{loading ? (
Carregando médicos...
) : error ? (
{error}
// -> Atualizado para usar a lista filtrada ) : filteredDoctors.length === 0 ? (
{doctors.length === 0 ? <>Nenhum médico cadastrado. Adicione um novo. : "Nenhum médico encontrado com os filtros aplicados." }
) : (
{/* -> ATUALIZADO para mapear a lista filtrada */} {filteredDoctors.map((doctor) => ( {/* Coluna de Status adicionada para visualização */} ))}
Nome CRM Especialidade Status Celular Cidade/Estado Ações
{doctor.full_name} {doctor.crm} {doctor.specialty}{doctor.status} {doctor.phone_mobile || "N/A"} {(doctor.city || doctor.state) ? `${doctor.city || ''}${doctor.city && doctor.state ? '/' : ''}${doctor.state || ''}` : "N/A"}
Ações
openDetailsDialog(doctor)}> Ver detalhes handleEdit(doctor.id)}> Editar openDeleteDialog(doctor.id)} > Excluir
)}
{/* ... O resto do seu código (AlertDialogs) permanece o mesmo ... */} Confirma a exclusão? Esta ação é irreversível e excluirá permanentemente o registro deste médico. Cancelar {loading ? : null} 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'}
)} {doctorDetails === null && !loading && (
Detalhes não disponíveis.
)}
Fechar
); }