"use client"; 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"; import { usersService } from "@/services/usersApi.mjs"; // Importando usersService import { useAccessibility } from "@/app/context/AccessibilityContext"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { LogOut, ChevronLeft, ChevronRight, Home, CalendarCheck2, ClipboardPlus, CalendarClock, Users, SquareUser, ClipboardList, Stethoscope, } from "lucide-react"; import SidebarUserSection from "@/components/ui/userToolTip"; interface UserData { id: string; email: string; app_metadata: { user_role: string; }; user_metadata: { cpf: string; email_verified: boolean; full_name: string; phone_mobile: string; role: string; avatar_url?: string; }; identities: { identity_id: string; id: string; user_id: string; provider: string; }[]; is_anonymous: boolean; } interface MenuItem { href: string; icon: React.ElementType; label: string; } interface SidebarProps { children: React.ReactNode; } export default function Sidebar({ children }: SidebarProps) { const [userData, setUserData] = useState(); const [role, setRole] = useState(); const [sidebarCollapsed, setSidebarCollapsed] = useState(false); const [showLogoutDialog, setShowLogoutDialog] = useState(false); const [avatarFullUrl, setAvatarFullUrl] = useState(undefined); const router = useRouter(); const pathname = usePathname(); // Função auxiliar para construir URL const buildAvatarUrl = (path: string) => { if (!path) return undefined; const baseUrl = "https://yuanqfswhberkoevtmfr.supabase.co"; const cleanPath = path.startsWith('/') ? path.slice(1) : path; const separator = cleanPath.includes('?') ? '&' : '?'; return `${baseUrl}/storage/v1/object/avatars/${cleanPath}${separator}t=${new Date().getTime()}`; }; const { theme, contrast } = useAccessibility(); useEffect(() => { const userInfoString = localStorage.getItem("user_info"); const token = localStorage.getItem("token"); if (userInfoString && token) { try { const userInfo = JSON.parse(userInfoString); // 1. Tenta pegar o avatar do cache local let rawAvatarPath = userInfo.profile?.avatar_url || userInfo.user_metadata?.avatar_url || userInfo.app_metadata?.avatar_url || ""; // Configura estado inicial com o que tem no cache setUserData({ id: userInfo.id ?? "", email: userInfo.email ?? "", app_metadata: { user_role: userInfo.app_metadata?.user_role ?? "patient", }, user_metadata: { cpf: userInfo.user_metadata?.cpf ?? "", email_verified: userInfo.user_metadata?.email_verified ?? false, full_name: userInfo.user_metadata?.full_name || userInfo.profile?.full_name || "Usuário", phone_mobile: userInfo.user_metadata?.phone_mobile ?? "", role: userInfo.user_metadata?.role ?? "", avatar_url: rawAvatarPath, }, identities: userInfo.identities ?? [], is_anonymous: userInfo.is_anonymous ?? false, }); setRole(userInfo.user_metadata?.role); if (rawAvatarPath) { setAvatarFullUrl(buildAvatarUrl(rawAvatarPath)); } // 2. AUTO-REPARO: Se não tiver avatar ou profile no cache, busca na API e atualiza if (!rawAvatarPath || !userInfo.profile) { console.log("[Sidebar] Cache incompleto. Buscando dados frescos..."); usersService.getMe().then((freshData) => { if (freshData && freshData.profile) { const freshAvatar = freshData.profile.avatar_url; // Atualiza o objeto local const updatedUserInfo = { ...userInfo, profile: freshData.profile, // Injeta o profile completo user_metadata: { ...userInfo.user_metadata, avatar_url: freshAvatar || userInfo.user_metadata.avatar_url } }; // Salva no localStorage para a próxima vez localStorage.setItem("user_info", JSON.stringify(updatedUserInfo)); console.log("[Sidebar] LocalStorage sincronizado com sucesso."); // Atualiza visualmente se achou um avatar novo if (freshAvatar && freshAvatar !== rawAvatarPath) { setAvatarFullUrl(buildAvatarUrl(freshAvatar)); // Atualiza o userData também para refletir no tooltip setUserData(prev => prev ? ({ ...prev, user_metadata: { ...prev.user_metadata, avatar_url: freshAvatar } }) : undefined); } } }).catch(err => console.error("[Sidebar] Falha no auto-reparo:", err)); } } catch (e) { console.error("Erro ao processar dados do usuário na Sidebar:", e); } } else { router.push("/login"); } }, [router]); useEffect(() => { const handleResize = () => { if (window.innerWidth < 1024) { setSidebarCollapsed(true); } else { setSidebarCollapsed(false); } }; handleResize(); window.addEventListener("resize", handleResize); return () => window.removeEventListener("resize", handleResize); }, []); const handleLogout = () => setShowLogoutDialog(true); const confirmLogout = async () => { try { await api.logout(); } catch (error) { console.error("Erro ao fazer logout", error); } finally { localStorage.removeItem("user_info"); localStorage.removeItem("token"); Cookies.remove("access_token"); setShowLogoutDialog(false); router.push("/"); } }; const cancelLogout = () => setShowLogoutDialog(false); const SetMenuItems = (role: any) => { const patientItems: MenuItem[] = [ { href: "/patient/dashboard", icon: Home, label: "Dashboard" }, { href: "/patient/schedule", icon: CalendarClock, label: "Agendar Consulta", }, { href: "/patient/appointments", icon: CalendarCheck2, label: "Minhas Consultas", }, { href: "/patient/reports", icon: ClipboardPlus, label: "Meus Laudos" }, { href: "/patient/profile", icon: SquareUser, label: "Meus Dados" }, ]; const doctorItems: MenuItem[] = [ { href: "/doctor/dashboard", icon: Home, label: "Dashboard" }, { href: "/doctor/medicos", icon: Users, label: "Gestão de Pacientes" }, { href: "/doctor/consultas", icon: CalendarCheck2, label: "Consultas" }, { href: "/doctor/disponibilidade", icon: ClipboardList, label: "Disponibilidade", }, ]; const secretaryItems: MenuItem[] = [ { href: "/secretary/dashboard", icon: Home, label: "Dashboard" }, { href: "/secretary/appointments", icon: CalendarCheck2, label: "Consultas", }, { href: "/secretary/schedule", icon: CalendarClock, label: "Agendar Consulta", }, { href: "/secretary/pacientes", icon: Users, label: "Gestão de Pacientes", }, ]; const managerItems: MenuItem[] = [ { href: "/manager/dashboard", icon: Home, label: "Dashboard" }, { href: "/manager/usuario", icon: Users, label: "Gestão de Usuários" }, { href: "/manager/home", icon: Stethoscope, label: "Gestão de Médicos" }, { href: "/manager/pacientes", icon: Users, label: "Gestão de Pacientes" }, { href: "/secretary/appointments", icon: CalendarCheck2, label: "Consultas" }, { href: "/manager/disponibilidade", icon: ClipboardList, label: "Disponibilidade" }, ]; switch (role) { case "gestor": case "admin": return managerItems; case "medico": return doctorItems; case "secretaria": return secretaryItems; case "paciente": default: return patientItems; } }; const menuItems = SetMenuItems(role); const isDefaultMode = theme === "light" && contrast === "normal"; if (!userData) { return (
Carregando...
); } return (
{/* TOPO */}
{!sidebarCollapsed && (
Logo MedConnect
MedConnect
)}
{/* MENU */} {/* PERFIL ORIGINAL + NOME BRANCO - CORREÇÃO DE ALINHAMENTO AQUI */}
{children}
Confirmar Saída Deseja realmente sair do sistema? Você precisará fazer login novamente.
); }