diff --git a/app/doctor/medicos/page.tsx b/app/doctor/medicos/page.tsx index 4839c2e..348323c 100644 --- a/app/doctor/medicos/page.tsx +++ b/app/doctor/medicos/page.tsx @@ -1,298 +1,108 @@ "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) => ( - - - - - - - - - - - )) - )} - -
NomeCRMTelefoneCidadeEstadoÚltimo atendimentoPróximo atendimentoAçõ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 - -
-
-
-
- ); +interface Paciente { + id: string; + nome: string; + telefone: string; + cidade: string; + estado: string; + ultimoAtendimento?: string; + proximoAtendimento?: string; +} + +export default function PacientesPage() { + const [pacientes, setPacientes] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + async function fetchPacientes() { + try { + setLoading(true); + setError(null); + const res = await fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes"); + 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 ?? "", + 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 ?? "", + })); + + setPacientes(mapped); + } catch (e: any) { + setError(e?.message || "Erro ao carregar pacientes"); + } finally { + setLoading(false); + } + } + fetchPacientes(); + }, []); + + return ( + +
+
+

Pacientes

+

Lista de pacientes vinculados

+
+ +
+
+ + + + + + + + + + + + + {loading ? ( + + + + ) : error ? ( + + + + ) : pacientes.length === 0 ? ( + + + + ) : ( + pacientes.map((p) => ( + + + + + + + + + )) + )} + +
NomeTelefoneCidadeEstadoÚltimo atendimentoPróximo atendimento
+ Carregando pacientes... +
{`Erro: ${error}`}
+ Nenhum paciente encontrado +
{p.nome}{p.telefone}{p.cidade}{p.estado}{p.ultimoAtendimento}{p.proximoAtendimento}
+
+
+
+
+ ); }