import React, { useState, useEffect } from 'react'; import { NavLink, useLocation, useNavigate } from 'react-router-dom'; import { LayoutDashboard, Users, UserCircle, Bell, Search, Menu, X, LogOut, Hexagon, Settings, Building2, Sun, Moon } from 'lucide-react'; import { getAttendances, getUsers, getUserById, logout } from '../services/dataService'; import { User } from '../types'; const SidebarItem = ({ to, icon: Icon, label, collapsed }: { to: string, icon: any, label: string, collapsed: boolean }) => ( `flex items-center gap-3 px-4 py-3 rounded-xl transition-all duration-200 group ${ isActive ? 'bg-brand-yellow text-zinc-950 font-semibold shadow-md shadow-brand-yellow/20' : 'text-zinc-500 dark:text-dark-muted hover:bg-zinc-100 dark:hover:bg-dark-border hover:text-zinc-900 dark:hover:text-dark-text' }` } > {!collapsed && {label}} ); export const Layout: React.FC<{ children: React.ReactNode }> = ({ children }) => { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [isDark, setIsDark] = useState(document.documentElement.classList.contains('dark')); const location = useLocation(); const navigate = useNavigate(); const [currentUser, setCurrentUser] = useState(null); useEffect(() => { const fetchCurrentUser = async () => { const storedUserId = localStorage.getItem('ctms_user_id'); if (!storedUserId) { navigate('/login'); return; } try { const user = await getUserById(storedUserId); if (user) { setCurrentUser(user); } else { navigate('/login'); } } catch (err) { console.error("Layout fetch failed:", err); } }; fetchCurrentUser(); }, [navigate]); const handleLogout = () => { logout(); navigate('/login'); }; const toggleDarkMode = () => { const newDark = !isDark; setIsDark(newDark); if (newDark) { document.documentElement.classList.add('dark'); document.cookie = "dark_mode=1; path=/; max-age=31536000"; } else { document.documentElement.classList.remove('dark'); document.cookie = "dark_mode=0; path=/; max-age=31536000"; } }; // Simple title mapping based on route const getPageTitle = () => { if (location.pathname === '/') return 'Dashboard'; if (location.pathname.includes('/admin/users')) return 'Membros'; if (location.pathname.includes('/admin/teams')) return 'Times'; if (location.pathname.includes('/users/')) return 'Histórico do Usuário'; if (location.pathname.includes('/attendances')) return 'Detalhes do Atendimento'; if (location.pathname.includes('/super-admin')) return 'Gestão de Organizações'; if (location.pathname.includes('/profile')) return 'Meu Perfil'; return 'CTMS'; }; if (!currentUser) return null; const isSuperAdmin = currentUser.role === 'super_admin'; return ( {/* Sidebar */} {/* Main Content */} {/* Header */} setIsMobileMenuOpen(true)} className="lg:hidden text-zinc-500 hover:text-zinc-900 dark:hover:text-white"> {/* Dark Mode Toggle */} {isDark ? : } {/* Search Bar */} {/* Notifications */} {/* Scrollable Content Area */} {children} {/* Overlay for mobile */} {isMobileMenuOpen && ( setIsMobileMenuOpen(false)} /> )} ); };