diff --git a/app/manager/dashboard/page.tsx b/app/manager/dashboard/page.tsx index 6e1dd10..df56541 100644 --- a/app/manager/dashboard/page.tsx +++ b/app/manager/dashboard/page.tsx @@ -1,41 +1,105 @@ -import ManagerLayout from "@/components/manager-layout" -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" -import { Button } from "@/components/ui/button" -import { Calendar, Clock, User, Plus } from "lucide-react" -import Link from "next/link" +"use client"; + +import ManagerLayout from "@/components/manager-layout"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { Calendar, Clock, Plus, User } from "lucide-react"; +import Link from "next/link"; +import React, { useState, useEffect } from "react"; +import { usersService } from "services/usersApi.mjs"; +import { doctorsService } from "services/doctorsApi.mjs"; export default function ManagerDashboard() { + // 🔹 Estados para usuários + const [firstUser, setFirstUser] = useState(null); + const [loadingUser, setLoadingUser] = useState(true); + + // 🔹 Estados para médicos + const [doctors, setDoctors] = useState([]); + const [loadingDoctors, setLoadingDoctors] = useState(true); + + // 🔹 Buscar primeiro usuário + useEffect(() => { + async function fetchFirstUser() { + try { + const data = await usersService.list_roles(); + if (Array.isArray(data) && data.length > 0) { + setFirstUser(data[0]); + } + } catch (error) { + console.error("Erro ao carregar usuário:", error); + } finally { + setLoadingUser(false); + } + } + + fetchFirstUser(); + }, []); + + // 🔹 Buscar 3 primeiros médicos + useEffect(() => { + async function fetchDoctors() { + try { + const data = await doctorsService.list(); // ajuste se seu service tiver outro método + if (Array.isArray(data)) { + setDoctors(data.slice(0, 3)); // pega os 3 primeiros + } + } catch (error) { + console.error("Erro ao carregar médicos:", error); + } finally { + setLoadingDoctors(false); + } + } + + fetchDoctors(); + }, []); + return (
+ {/* Cabeçalho */}

Dashboard

Bem-vindo ao seu portal de consultas médicas

+ {/* Cards principais */}
+ {/* Card 1 */} Relatórios gerenciais -
3
-

2 não lidos, 1 lido

+
0
+

Relatórios disponíveis

+ {/* Card 2 — Gestão de usuários */} Gestão de usuários -
João Marques
-

fez login a 13min

+ {loadingUser ? ( +
Carregando usuário...
+ ) : firstUser ? ( + <> +
{firstUser.full_name || "Sem nome"}
+

+ {firstUser.email || "Sem e-mail cadastrado"} +

+ + ) : ( +
Nenhum usuário encontrado
+ )}
+ {/* Card 3 — Perfil */} Perfil @@ -48,66 +112,79 @@ export default function ManagerDashboard() {
+ {/* Cards secundários */}
+ {/* Card — Ações rápidas */} Ações Rápidas Acesse rapidamente as principais funcionalidades - + - - - - + + + + + + + + {/* Card — Gestão de Médicos */} Gestão de Médicos - Médicos online + Médicos cadastrados recentemente -
-
-
-

Dr. Silva

-

Cardiologia

-
-
-

On-line

-

-
+ {loadingDoctors ? ( +

Carregando médicos...

+ ) : doctors.length === 0 ? ( +

Nenhum médico cadastrado.

+ ) : ( +
+ {doctors.map((doc, index) => ( +
+
+

{doc.full_name || "Sem nome"}

+

+ {doc.specialty || "Sem especialidade"} +

+
+
+

+ {doc.active ? "Ativo" : "Inativo"} +

+
+
+ ))}
-
-
-

Dra. Santos

-

Dermatologia

-
-
-

Off-line

-

Visto as 8:33

-
-
-
+ )}
- ) + ); } diff --git a/app/secretary/dashboard/page.tsx b/app/secretary/dashboard/page.tsx index 7171aa8..e37141c 100644 --- a/app/secretary/dashboard/page.tsx +++ b/app/secretary/dashboard/page.tsx @@ -1,41 +1,207 @@ -import SecretaryLayout from "@/components/secretary-layout" -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" -import { Button } from "@/components/ui/button" -import { Calendar, Clock, User, Plus } from "lucide-react" -import Link from "next/link" +"use client"; + +import SecretaryLayout from "@/components/secretary-layout"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { Calendar, Clock, User, Plus } from "lucide-react"; +import Link from "next/link"; +import React, { useState, useEffect } from "react"; +import { patientsService } from "@/services/patientsApi.mjs"; +import { appointmentsService } from "@/services/appointmentsApi.mjs"; export default function SecretaryDashboard() { + // Estados + const [patients, setPatients] = useState([]); + const [loadingPatients, setLoadingPatients] = useState(true); + + const [firstConfirmed, setFirstConfirmed] = useState(null); + const [nextAgendada, setNextAgendada] = useState(null); + const [loadingAppointments, setLoadingAppointments] = useState(true); + + // 🔹 Buscar pacientes + useEffect(() => { + async function fetchPatients() { + try { + const data = await patientsService.list(); + if (Array.isArray(data)) { + setPatients(data.slice(0, 3)); + } + } catch (error) { + console.error("Erro ao carregar pacientes:", error); + } finally { + setLoadingPatients(false); + } + } + fetchPatients(); + }, []); + + // 🔹 Buscar consultas (confirmadas + 1ª do mês) + useEffect(() => { + async function fetchAppointments() { + try { + const hoje = new Date(); + const inicioMes = new Date(hoje.getFullYear(), hoje.getMonth(), 1); + const fimMes = new Date(hoje.getFullYear(), hoje.getMonth() + 1, 0); + + // Mesmo parâmetro de ordenação da página /secretary/appointments + const queryParams = "order=scheduled_at.desc"; + const data = await appointmentsService.search_appointment(queryParams); + + if (!Array.isArray(data) || data.length === 0) { + setFirstConfirmed(null); + setNextAgendada(null); + return; + } + + // 🩵 1️⃣ Consultas confirmadas (para o card “Próxima Consulta Confirmada”) + const confirmadas = data.filter((apt: any) => { + const dataConsulta = new Date(apt.scheduled_at || apt.date); + return apt.status === "confirmed" && dataConsulta >= hoje; + }); + + confirmadas.sort( + (a: any, b: any) => + new Date(a.scheduled_at || a.date).getTime() - + new Date(b.scheduled_at || b.date).getTime() + ); + + setFirstConfirmed(confirmadas[0] || null); + + // 💙 2️⃣ Consultas deste mês — pegar sempre a 1ª (mais próxima) + const consultasMes = data.filter((apt: any) => { + const dataConsulta = new Date(apt.scheduled_at); + return dataConsulta >= inicioMes && dataConsulta <= fimMes; + }); + + if (consultasMes.length > 0) { + consultasMes.sort( + (a: any, b: any) => + new Date(a.scheduled_at).getTime() - + new Date(b.scheduled_at).getTime() + ); + setNextAgendada(consultasMes[0]); + } else { + setNextAgendada(null); + } + } catch (error) { + console.error("Erro ao carregar consultas:", error); + } finally { + setLoadingAppointments(false); + } + } + + fetchAppointments(); + }, []); + return (
+ {/* Cabeçalho */}

Dashboard

Bem-vindo ao seu portal de consultas médicas

+ {/* Cards principais */}
+ {/* Próxima Consulta Confirmada */} - Próxima Consulta + + Próxima Consulta Confirmada + -
15 Jan
-

Dr. Silva - 14:30

+ {loadingAppointments ? ( +
+ Carregando próxima consulta... +
+ ) : firstConfirmed ? ( + <> +
+ {new Date( + firstConfirmed.scheduled_at || firstConfirmed.date + ).toLocaleDateString("pt-BR")} +
+

+ {firstConfirmed.doctor_name + ? `Dr(a). ${firstConfirmed.doctor_name}` + : "Médico não informado"}{" "} + -{" "} + {new Date( + firstConfirmed.scheduled_at + ).toLocaleTimeString("pt-BR", { + hour: "2-digit", + minute: "2-digit", + })} +

+ + ) : ( +
+ Nenhuma consulta confirmada encontrada +
+ )}
+ {/* Consultas Este Mês */} - Consultas Este Mês + + Consultas Este Mês + -
3
-

2 realizadas, 1 agendada

+ {loadingAppointments ? ( +
+ Carregando consultas... +
+ ) : nextAgendada ? ( + <> +
+ {new Date( + nextAgendada.scheduled_at + ).toLocaleDateString("pt-BR", { + day: "2-digit", + month: "2-digit", + year: "numeric", + })}{" "} + às{" "} + {new Date( + nextAgendada.scheduled_at + ).toLocaleTimeString("pt-BR", { + hour: "2-digit", + minute: "2-digit", + })} +
+

+ {nextAgendada.doctor_name + ? `Dr(a). ${nextAgendada.doctor_name}` + : "Médico não informado"} +

+

+ {nextAgendada.patient_name + ? `Paciente: ${nextAgendada.patient_name}` + : ""} +

+ + ) : ( +
+ Nenhuma consulta agendada neste mês +
+ )}
+ {/* Perfil */} Perfil @@ -48,11 +214,15 @@ export default function SecretaryDashboard() {
+ {/* Cards Secundários */}
+ {/* Ações rápidas */} Ações Rápidas - Acesse rapidamente as principais funcionalidades + + Acesse rapidamente as principais funcionalidades + @@ -62,52 +232,73 @@ export default function SecretaryDashboard() { - - - + {/* Pacientes */} - Próximas Consultas - Suas consultas agendadas + Pacientes + + Últimos pacientes cadastrados + -
-
-
-

Dr. Silva

-

Cardiologia

-
-
-

15 Jan

-

14:30

-
+ {loadingPatients ? ( +

+ Carregando pacientes... +

+ ) : patients.length === 0 ? ( +

+ Nenhum paciente cadastrado. +

+ ) : ( +
+ {patients.map((patient, index) => ( +
+
+

+ {patient.full_name || "Sem nome"} +

+

+ {patient.phone_mobile || + patient.phone1 || + "Sem telefone"} +

+
+
+

+ {patient.convenio || "Particular"} +

+
+
+ ))}
-
-
-

Dra. Santos

-

Dermatologia

-
-
-

22 Jan

-

10:00

-
-
-
+ )}
- ) + ); }