diff --git a/components/doctor-layout.tsx b/components/doctor-layout.tsx index 2dd2300..4415b4f 100644 --- a/components/doctor-layout.tsx +++ b/components/doctor-layout.tsx @@ -11,352 +11,459 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; -import { Search, Bell, Calendar, Clock, User, LogOut, Menu, X, Home, FileText, ChevronLeft, ChevronRight } from "lucide-react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { + Search, + Bell, + Calendar, + Clock, + User, + LogOut, + Menu, + X, + Home, + FileText, + ChevronLeft, + ChevronRight, +} from "lucide-react"; interface DoctorData { - id: string; - name: string; - email: string; - phone: string; - cpf: string; - crm: string; - specialty: string; - department: string; - permissions: object; + id: string; + name: string; + email: string; + phone: string; + cpf: string; + crm: string; + specialty: string; + department: string; + permissions: object; } interface PatientLayoutProps { - children: React.ReactNode; + children: React.ReactNode; } export default function DoctorLayout({ children }: PatientLayoutProps) { - const [doctorData, setDoctorData] = useState(null); - const [sidebarCollapsed, setSidebarCollapsed] = useState(false); - const [showLogoutDialog, setShowLogoutDialog] = useState(false); - const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); - const [windowWidth, setWindowWidth] = useState(0); - const isMobile = windowWidth < 1024; - const router = useRouter(); - const pathname = usePathname(); + const [doctorData, setDoctorData] = useState(null); + const [sidebarCollapsed, setSidebarCollapsed] = useState(false); + const [showLogoutDialog, setShowLogoutDialog] = useState(false); + const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); + const [windowWidth, setWindowWidth] = useState(0); + const isMobile = windowWidth < 1024; + const router = useRouter(); + const pathname = usePathname(); - useEffect(() => { - const userInfoString = localStorage.getItem("user_info"); - // --- ALTERAÇÃO PRINCIPAL AQUI --- - // Procurando o token no localStorage, onde ele foi realmente salvo. - const token = localStorage.getItem("token"); + useEffect(() => { + const userInfoString = localStorage.getItem("user_info"); + // --- ALTERAÇÃO PRINCIPAL AQUI --- + // Procurando o token no localStorage, onde ele foi realmente salvo. + const token = localStorage.getItem("token"); - if (userInfoString && token) { - const userInfo = JSON.parse(userInfoString); + if (userInfoString && token) { + const userInfo = JSON.parse(userInfoString); - setDoctorData({ - id: userInfo.id || "", - name: userInfo.user_metadata?.full_name || "Doutor(a)", - email: userInfo.email || "", - specialty: userInfo.user_metadata?.specialty || "Especialidade", - phone: userInfo.phone || "", - cpf: "", - crm: "", - department: "", - permissions: {}, - }); - } else { - // Se não encontrar, aí sim redireciona. - router.push("/login"); - } - }, [router]); - - // O restante do seu código permanece exatamente o mesmo... - useEffect(() => { - const handleResize = () => setWindowWidth(window.innerWidth); - handleResize(); - window.addEventListener("resize", handleResize); - return () => window.removeEventListener("resize", handleResize); - }, []); - - useEffect(() => { - if (isMobile) { - setSidebarCollapsed(true); - } else { - setSidebarCollapsed(false); - } - }, [isMobile]); - - const handleLogout = () => { - setShowLogoutDialog(true); - }; - - // --- ALTERAÇÃO 2: A função de logout agora é MUITO mais simples --- - const confirmLogout = async () => { - try { - // Chama a função centralizada para fazer o logout no servidor - await api.logout(); - } catch (error) { - // O erro já é logado dentro da função api.logout, não precisamos fazer nada aqui - } finally { - // A responsabilidade do componente é apenas limpar o estado local e redirecionar - localStorage.removeItem("user_info"); - localStorage.removeItem("token"); - Cookies.remove("access_token"); // Limpeza de segurança - - setShowLogoutDialog(false); - router.push("/"); // Redireciona para a home - } - }; - - const cancelLogout = () => { - setShowLogoutDialog(false); - }; - - const toggleMobileMenu = () => { - setIsMobileMenuOpen(!isMobileMenuOpen); - }; - - const menuItems = [ - { - href: "/doctor/dashboard", - icon: Home, - label: "Dashboard", - // Botão para o dashboard do médico - }, - { - href: "/doctor/consultas", - icon: Calendar, - label: "Consultas", - // Botão para página de consultas marcadas do médico atual - }, - { - href: "/doctor/medicos/editorlaudo", - icon: Clock, - label: "Editor de Laudo", - // Botão para página do editor de laudo - }, - { - href: "/doctor/medicos", - icon: User, - label: "Pacientes", - // Botão para a página de visualização de todos os pacientes - }, - { - href: "/doctor/disponibilidade", - icon: Calendar, - label: "Disponibilidade", - // Botão para o dashboard do médico - }, - ]; - - if (!doctorData) { - return
Carregando...
; + setDoctorData({ + id: userInfo.id || "", + name: userInfo.user_metadata?.full_name || "Doutor(a)", + email: userInfo.email || "", + specialty: userInfo.user_metadata?.specialty || "Especialidade", + phone: userInfo.phone || "", + cpf: "", + crm: "", + department: "", + permissions: {}, + }); + } else { + // Se não encontrar, aí sim redireciona. + router.push("/login"); } + }, [router]); - return ( - // O restante do seu código JSX permanece exatamente o mesmo -
-
-
-
- {!sidebarCollapsed && ( -
-
-
-
- MediConnect -
- )} - -
+ // O restante do seu código permanece exatamente o mesmo... + useEffect(() => { + const handleResize = () => setWindowWidth(window.innerWidth); + handleResize(); + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); + }, []); + + useEffect(() => { + if (isMobile) { + setSidebarCollapsed(true); + } else { + setSidebarCollapsed(false); + } + }, [isMobile]); + + const handleLogout = () => { + setShowLogoutDialog(true); + }; + + // --- ALTERAÇÃO 2: A função de logout agora é MUITO mais simples --- + const confirmLogout = async () => { + try { + // Chama a função centralizada para fazer o logout no servidor + await api.logout(); + } catch (error) { + // O erro já é logado dentro da função api.logout, não precisamos fazer nada aqui + } finally { + // A responsabilidade do componente é apenas limpar o estado local e redirecionar + localStorage.removeItem("user_info"); + localStorage.removeItem("token"); + Cookies.remove("access_token"); // Limpeza de segurança + + setShowLogoutDialog(false); + router.push("/"); // Redireciona para a home + } + }; + + const cancelLogout = () => { + setShowLogoutDialog(false); + }; + + const toggleMobileMenu = () => { + setIsMobileMenuOpen(!isMobileMenuOpen); + }; + + const menuItems = [ + { + href: "/doctor/dashboard", + icon: Home, + label: "Dashboard", + // Botão para o dashboard do médico + }, + { + href: "/doctor/consultas", + icon: Calendar, + label: "Consultas", + // Botão para página de consultas marcadas do médico atual + }, + { + href: "/doctor/medicos/editorlaudo", + icon: Clock, + label: "Editor de Laudo", + // Botão para página do editor de laudo + }, + { + href: "/doctor/medicos", + icon: User, + label: "Pacientes", + // Botão para a página de visualização de todos os pacientes + }, + { + href: "/doctor/disponibilidade", + icon: Calendar, + label: "Disponibilidade", + // Botão para o dashboard do médico + }, + ]; + + if (!doctorData) { + return
Carregando...
; + } + + return ( + // O restante do seu código JSX permanece exatamente o mesmo +
+
+
+
+ {!sidebarCollapsed && ( +
+
+
- - // ... (seu código anterior) - {/* Sidebar para desktop */} -
-
-
- {!sidebarCollapsed && ( -
-
-
-
- MediConnect -
- )} - -
-
- - - -
-
- {!sidebarCollapsed && ( - <> - - - - {doctorData.name - .split(" ") - .map((n) => n[0]) - .join("")} - - -
-

{doctorData.name}

-

{doctorData.specialty}

-
- - )} - {sidebarCollapsed && ( - - - - {doctorData.name - .split(" ") - .map((n) => n[0]) - .join("")} - - - )} -
- -
- - {!sidebarCollapsed && Sair} -
-
-
-
- {isMobileMenuOpen &&
} -
-
-
-
-
-
- Hospital System -
- -
- - - -
-
- - - - {doctorData.name - .split(" ") - .map((n) => n[0]) - .join("")} - - -
-

{doctorData.name}

-

{doctorData.specialty}

-
-
- -
-
- -
-
-
-
-
- - -
-
- -
- -
-
-
- -
{children}
-
- - - - - Confirmar Saída - Deseja realmente sair do sistema? Você precisará fazer login novamente para acessar sua conta. - - - - - - - + MediConnect +
+ )} + +
- ); + + // ... (seu código anterior) + {/* Sidebar para desktop */} +
+
+
+ {!sidebarCollapsed && ( +
+
+
+
+ + MediConnect + +
+ )} + +
+
+ + + +
+
+ {!sidebarCollapsed && ( + <> + + + + {doctorData.name + .split(" ") + .map((n) => n[0]) + .join("")} + + +
+

+ {doctorData.name} +

+

+ {doctorData.specialty} +

+
+ + )} + {sidebarCollapsed && ( + + + + {doctorData.name + .split(" ") + .map((n) => n[0]) + .join("")} + + + )} +
+ +
+ + {!sidebarCollapsed && Sair} +
+
+
+
+ {isMobileMenuOpen && ( +
+ )} +
+
+
+
+
+
+ Hospital System +
+ +
+ + + +
+
+ + + + {doctorData.name + .split(" ") + .map((n) => n[0]) + .join("")} + + +
+

+ {doctorData.name} +

+

+ {doctorData.specialty} +

+
+
+ +
+
+ +
+
+
+
+ +
+ +
+
+
+ +
{children}
+
+ + + + + Confirmar Saída + + Deseja realmente sair do sistema? Você precisará fazer login + novamente para acessar sua conta. + + + + + + + + +
+ ); } diff --git a/components/finance-layout.tsx b/components/finance-layout.tsx index d1904b7..5f1b07b 100644 --- a/components/finance-layout.tsx +++ b/components/finance-layout.tsx @@ -6,14 +6,34 @@ import type React from "react"; import { useState, useEffect } from "react"; import { useRouter, usePathname } from "next/navigation"; import Link from "next/link"; -import { api } from '@/services/api.mjs'; +import { api } from "@/services/api.mjs"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; -import { Search, Bell, Calendar, Clock, User, LogOut, Menu, X, Home, FileText, ChevronLeft, ChevronRight } from "lucide-react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { + Search, + Bell, + Calendar, + Clock, + User, + LogOut, + Menu, + X, + Home, + FileText, + ChevronLeft, + ChevronRight, +} from "lucide-react"; interface FinancierData { id: string; @@ -30,7 +50,9 @@ interface PatientLayoutProps { } export default function FinancierLayout({ children }: PatientLayoutProps) { - const [financierData, setFinancierData] = useState(null); + const [financierData, setFinancierData] = useState( + null + ); const [sidebarCollapsed, setSidebarCollapsed] = useState(false); const [showLogoutDialog, setShowLogoutDialog] = useState(false); const router = useRouter(); @@ -43,12 +65,13 @@ export default function FinancierLayout({ children }: PatientLayoutProps) { if (userInfoString && token) { const userInfo = JSON.parse(userInfoString); - + setFinancierData({ id: userInfo.id || "", name: userInfo.user_metadata?.full_name || "Financeiro", email: userInfo.email || "", - department: userInfo.user_metadata?.department || "Departamento Financeiro", + department: + userInfo.user_metadata?.department || "Departamento Financeiro", phone: userInfo.phone || "", cpf: "", permissions: {}, @@ -79,18 +102,18 @@ export default function FinancierLayout({ children }: PatientLayoutProps) { // --- ALTERAÇÃO 2: A função de logout agora é MUITO mais simples --- const confirmLogout = async () => { try { - // Chama a função centralizada para fazer o logout no servidor - await api.logout(); + // Chama a função centralizada para fazer o logout no servidor + await api.logout(); } catch (error) { - // O erro já é logado dentro da função api.logout, não precisamos fazer nada aqui + // O erro já é logado dentro da função api.logout, não precisamos fazer nada aqui } finally { - // A responsabilidade do componente é apenas limpar o estado local e redirecionar - localStorage.removeItem("user_info"); - localStorage.removeItem("token"); - Cookies.remove("access_token"); // Limpeza de segurança - - setShowLogoutDialog(false); - router.push("/"); // Redireciona para a home + // A responsabilidade do componente é apenas limpar o estado local e redirecionar + localStorage.removeItem("user_info"); + localStorage.removeItem("token"); + Cookies.remove("access_token"); // Limpeza de segurança + + setShowLogoutDialog(false); + router.push("/"); // Redireciona para a home } }; @@ -106,7 +129,11 @@ export default function FinancierLayout({ children }: PatientLayoutProps) { ]; if (!financierData) { - return
Carregando...
; + return ( +
+ Carregando... +
+ ); } return ( @@ -202,9 +229,7 @@ export default function FinancierLayout({ children }: PatientLayoutProps) { } onClick={handleLogout} > - + {!sidebarCollapsed && "Sair"}
@@ -217,15 +242,7 @@ export default function FinancierLayout({ children }: PatientLayoutProps) { >
-
-
- - -
-
+
); -} \ No newline at end of file +} diff --git a/components/manager-layout.tsx b/components/manager-layout.tsx index 7c1e3fe..40cf0df 100644 --- a/components/manager-layout.tsx +++ b/components/manager-layout.tsx @@ -6,14 +6,30 @@ import { useState, useEffect } from "react"; import { useRouter, usePathname } from "next/navigation"; import Link from "next/link"; import Cookies from "js-cookie"; // Mantido apenas para a limpeza de segurança no logout -import { api } from '@/services/api.mjs'; +import { api } from "@/services/api.mjs"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; -import { Search, Bell, Calendar, User, LogOut, ChevronLeft, ChevronRight, Home } from "lucide-react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { + Search, + Bell, + Calendar, + User, + LogOut, + ChevronLeft, + ChevronRight, + Home, +} from "lucide-react"; interface ManagerData { id: string; @@ -43,7 +59,7 @@ export default function ManagerLayout({ children }: ManagerLayoutProps) { if (userInfoString && token) { const userInfo = JSON.parse(userInfoString); - + setManagerData({ id: userInfo.id || "", name: userInfo.user_metadata?.full_name || "Gestor(a)", @@ -77,18 +93,18 @@ export default function ManagerLayout({ children }: ManagerLayoutProps) { // --- ALTERAÇÃO 2: A função de logout agora é MUITO mais simples --- const confirmLogout = async () => { try { - // Chama a função centralizada para fazer o logout no servidor - await api.logout(); + // Chama a função centralizada para fazer o logout no servidor + await api.logout(); } catch (error) { - // O erro já é logado dentro da função api.logout, não precisamos fazer nada aqui + // O erro já é logado dentro da função api.logout, não precisamos fazer nada aqui } finally { - // A responsabilidade do componente é apenas limpar o estado local e redirecionar - localStorage.removeItem("user_info"); - localStorage.removeItem("token"); - Cookies.remove("access_token"); // Limpeza de segurança - - setShowLogoutDialog(false); - router.push("/"); // Redireciona para a home + // A responsabilidade do componente é apenas limpar o estado local e redirecionar + localStorage.removeItem("user_info"); + localStorage.removeItem("token"); + Cookies.remove("access_token"); // Limpeza de segurança + + setShowLogoutDialog(false); + router.push("/"); // Redireciona para a home } }; @@ -103,13 +119,19 @@ export default function ManagerLayout({ children }: ManagerLayoutProps) { ]; if (!managerData) { - return
Carregando...
; + return ( +
+ Carregando... +
+ ); } return (
{!sidebarCollapsed && ( @@ -117,9 +139,7 @@ export default function ManagerLayout({ children }: ManagerLayoutProps) {
- - MediConnect - + MediConnect
)}
@@ -139,10 +163,16 @@ export default function ManagerLayout({ children }: ManagerLayoutProps) { return (
- {!sidebarCollapsed && {item.label}} + {!sidebarCollapsed && ( + {item.label} + )}
); @@ -153,19 +183,32 @@ export default function ManagerLayout({ children }: ManagerLayoutProps) {
- {managerData.name.split(" ").map((n) => n[0]).join("")} + + {managerData.name + .split(" ") + .map((n) => n[0]) + .join("")} + {!sidebarCollapsed && (
-

{managerData.name}

-

{managerData.department}

+

+ {managerData.name} +

+

+ {managerData.department} +

)}
-
+
-
-
- - -
-
+
@@ -196,14 +240,22 @@ export default function ManagerLayout({ children }: ManagerLayoutProps) { Confirmar Saída - Deseja realmente sair do sistema? Você precisará fazer login novamente para acessar sua conta. + + Deseja realmente sair do sistema? Você precisará fazer login + novamente para acessar sua conta. + - - + +
); -} \ No newline at end of file +} diff --git a/components/patient-layout.tsx b/components/patient-layout.tsx index 7ac9415..a7cc9fb 100644 --- a/components/patient-layout.tsx +++ b/components/patient-layout.tsx @@ -1,52 +1,70 @@ -"use client" +"use client"; import Cookies from "js-cookie"; -import type React from "react" -import { useState, useEffect } from "react" -import Link from "next/link" -import { useRouter, usePathname } from "next/navigation" +import type React from "react"; +import { useState, useEffect } from "react"; +import Link from "next/link"; +import { useRouter, usePathname } from "next/navigation"; import { api } from "@/services/api.mjs"; // Importando nosso cliente de API -import { Button } from "@/components/ui/button" -import { Input } from "@/components/ui/input" -import { Badge } from "@/components/ui/badge" -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" -import { Search, Bell, User, LogOut, FileText, Clock, Calendar, Home, ChevronLeft, ChevronRight } from "lucide-react" -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog" +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Badge } from "@/components/ui/badge"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { + Search, + Bell, + User, + LogOut, + FileText, + Clock, + Calendar, + Home, + ChevronLeft, + ChevronRight, +} from "lucide-react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; interface PatientData { - name: string - email: string - phone: string - cpf: string - birthDate: string - address: string + name: string; + email: string; + phone: string; + cpf: string; + birthDate: string; + address: string; } interface PatientLayoutProps { - children: React.ReactNode + children: React.ReactNode; } // --- ALTERAÇÃO 1: Renomeando o componente para maior clareza --- export default function PatientLayout({ children }: PatientLayoutProps) { - const [patientData, setPatientData] = useState(null) - const [sidebarCollapsed, setSidebarCollapsed] = useState(false) - const [showLogoutDialog, setShowLogoutDialog] = useState(false) - const router = useRouter() - const pathname = usePathname() + const [patientData, setPatientData] = useState(null); + const [sidebarCollapsed, setSidebarCollapsed] = useState(false); + const [showLogoutDialog, setShowLogoutDialog] = useState(false); + const router = useRouter(); + const pathname = usePathname(); useEffect(() => { const handleResize = () => { if (window.innerWidth < 1024) { - setSidebarCollapsed(true) + setSidebarCollapsed(true); } else { - setSidebarCollapsed(false) + setSidebarCollapsed(false); } - } - handleResize() - window.addEventListener("resize", handleResize) - return () => window.removeEventListener("resize", handleResize) - }, []) + }; + handleResize(); + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); + }, []); useEffect(() => { const userInfoString = localStorage.getItem("user_info"); @@ -55,12 +73,12 @@ export default function PatientLayout({ children }: PatientLayoutProps) { if (userInfoString && token) { const userInfo = JSON.parse(userInfoString); - + setPatientData({ name: userInfo.user_metadata?.full_name || "Paciente", email: userInfo.email || "", phone: userInfo.phone || "", - cpf: "", + cpf: "", birthDate: "", address: "", }); @@ -69,39 +87,47 @@ export default function PatientLayout({ children }: PatientLayoutProps) { router.push("/login"); } }, [router]); - - const handleLogout = () => setShowLogoutDialog(true) + + const handleLogout = () => setShowLogoutDialog(true); // --- ALTERAÇÃO 4: Função de logout completa e padronizada --- const confirmLogout = async () => { try { - // Chama a função centralizada para fazer o logout no servidor - await api.logout(); + // Chama a função centralizada para fazer o logout no servidor + await api.logout(); } catch (error) { - console.error("Erro ao tentar fazer logout no servidor:", error); + console.error("Erro ao tentar fazer logout no servidor:", error); } finally { - // Limpeza completa e consistente do estado local - localStorage.removeItem("user_info"); - localStorage.removeItem("token"); - Cookies.remove("access_token"); // Limpeza de segurança - - setShowLogoutDialog(false); - router.push("/"); // Redireciona para a página inicial + // Limpeza completa e consistente do estado local + localStorage.removeItem("user_info"); + localStorage.removeItem("token"); + Cookies.remove("access_token"); // Limpeza de segurança + + setShowLogoutDialog(false); + router.push("/"); // Redireciona para a página inicial } }; - const cancelLogout = () => setShowLogoutDialog(false) + const cancelLogout = () => setShowLogoutDialog(false); const menuItems = [ { href: "/patient/dashboard", icon: Home, label: "Dashboard" }, - { href: "/patient/appointments", icon: Calendar, label: "Minhas Consultas" }, + { + href: "/patient/appointments", + icon: Calendar, + label: "Minhas Consultas", + }, { href: "/patient/schedule", icon: Clock, label: "Agendar Consulta" }, { href: "/patient/reports", icon: FileText, label: "Meus Laudos" }, { href: "/patient/profile", icon: User, label: "Meus Dados" }, - ] + ]; if (!patientData) { - return
Carregando...
; + return ( +
+ Carregando... +
+ ); } return ( @@ -120,7 +146,9 @@ export default function PatientLayout({ children }: PatientLayoutProps) {
- MediConnect + + MediConnect +
)}
- ) + ); })} @@ -199,9 +227,7 @@ export default function PatientLayout({ children }: PatientLayoutProps) { } onClick={handleLogout} > - {" "} + {" "} {/* Remove margem quando colapsado */} {!sidebarCollapsed && "Sair"}{" "} {/* Mostra o texto apenas quando não está colapsado */} @@ -218,15 +244,7 @@ export default function PatientLayout({ children }: PatientLayoutProps) { {/* Header */}
-
-
- - -
-
+
- ) -} \ No newline at end of file + ); +} diff --git a/components/secretary-layout.tsx b/components/secretary-layout.tsx index 5bd51fd..edfc4b4 100644 --- a/components/secretary-layout.tsx +++ b/components/secretary-layout.tsx @@ -1,41 +1,60 @@ // Caminho: app/(secretary)/layout.tsx (ou o caminho do seu arquivo) -"use client" +"use client"; -import type React from "react" -import { useState, useEffect } from "react" -import { useRouter, usePathname } from "next/navigation" -import Link from "next/link" +import type React from "react"; +import { useState, useEffect } from "react"; +import { useRouter, usePathname } from "next/navigation"; +import Link from "next/link"; import Cookies from "js-cookie"; -import { api } from '@/services/api.mjs'; // Importando nosso cliente de API central +import { api } from "@/services/api.mjs"; // Importando nosso cliente de API central -import { Button } from "@/components/ui/button" -import { Input } from "@/components/ui/input" -import { Badge } from "@/components/ui/badge" -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog" -import { Search, Bell, Calendar, Clock, User, LogOut, Home, ChevronLeft, ChevronRight } from "lucide-react" +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Badge } from "@/components/ui/badge"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { + Search, + Bell, + Calendar, + Clock, + User, + LogOut, + Home, + ChevronLeft, + ChevronRight, +} from "lucide-react"; interface SecretaryData { - id: string - name: string - email: string - phone: string - cpf: string - employeeId: string - department: string - permissions: object + id: string; + name: string; + email: string; + phone: string; + cpf: string; + employeeId: string; + department: string; + permissions: object; } interface SecretaryLayoutProps { - children: React.ReactNode + children: React.ReactNode; } export default function SecretaryLayout({ children }: SecretaryLayoutProps) { - const [secretaryData, setSecretaryData] = useState(null); - const [sidebarCollapsed, setSidebarCollapsed] = useState(false) - const [showLogoutDialog, setShowLogoutDialog] = useState(false) - const router = useRouter() - const pathname = usePathname() + const [secretaryData, setSecretaryData] = useState( + null + ); + const [sidebarCollapsed, setSidebarCollapsed] = useState(false); + const [showLogoutDialog, setShowLogoutDialog] = useState(false); + const router = useRouter(); + const pathname = usePathname(); useEffect(() => { const userInfoString = localStorage.getItem("user_info"); @@ -44,7 +63,7 @@ export default function SecretaryLayout({ children }: SecretaryLayoutProps) { if (userInfoString && token) { const userInfo = JSON.parse(userInfoString); - + setSecretaryData({ id: userInfo.id || "", name: userInfo.user_metadata?.full_name || "Secretária", @@ -64,50 +83,53 @@ export default function SecretaryLayout({ children }: SecretaryLayoutProps) { useEffect(() => { const handleResize = () => { if (window.innerWidth < 1024) { - setSidebarCollapsed(true) + setSidebarCollapsed(true); } else { - setSidebarCollapsed(false) + setSidebarCollapsed(false); } - } - handleResize() - window.addEventListener("resize", handleResize) - return () => window.removeEventListener("resize", handleResize) - }, []) + }; + handleResize(); + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); + }, []); - const handleLogout = () => setShowLogoutDialog(true) + const handleLogout = () => setShowLogoutDialog(true); // --- ALTERAÇÃO 3: Função de logout completa e padronizada --- const confirmLogout = async () => { try { - // Chama a função centralizada para fazer o logout no servidor - await api.logout(); + // Chama a função centralizada para fazer o logout no servidor + await api.logout(); } catch (error) { - console.error("Erro ao tentar fazer logout no servidor:", error); + console.error("Erro ao tentar fazer logout no servidor:", error); } finally { - // Limpeza completa e consistente do estado local - localStorage.removeItem("user_info"); - localStorage.removeItem("token"); - Cookies.remove("access_token"); // Limpeza de segurança - - setShowLogoutDialog(false); - router.push("/"); // Redireciona para a página inicial + // Limpeza completa e consistente do estado local + localStorage.removeItem("user_info"); + localStorage.removeItem("token"); + Cookies.remove("access_token"); // Limpeza de segurança + + setShowLogoutDialog(false); + router.push("/"); // Redireciona para a página inicial } }; - const cancelLogout = () => setShowLogoutDialog(false) + const cancelLogout = () => setShowLogoutDialog(false); const menuItems = [ { href: "/secretary/dashboard", icon: Home, label: "Dashboard" }, { href: "/secretary/appointments", icon: Calendar, label: "Consultas" }, { href: "/secretary/schedule", icon: Clock, label: "Agendar Consulta" }, { href: "/secretary/pacientes", icon: User, label: "Pacientes" }, - ] + ]; if (!secretaryData) { - return
Carregando...
; + return ( +
+ Carregando... +
+ ); } - return (
{/* Sidebar */} @@ -123,7 +145,9 @@ export default function SecretaryLayout({ children }: SecretaryLayoutProps) {
- MediConnect + + MediConnect +
)}
)} @@ -193,9 +223,7 @@ export default function SecretaryLayout({ children }: SecretaryLayoutProps) { } onClick={handleLogout} > - + {!sidebarCollapsed && "Sair"} @@ -203,20 +231,13 @@ export default function SecretaryLayout({ children }: SecretaryLayoutProps) { {/* Main Content */}
-
-
- - -
-
+
- ) -} \ No newline at end of file + ); +}