siderba dinh cao cua nhan loai

import React, { useState, useEffect, memo } from 'react'; import { Link, useLocation, useNavigate } from 'react-router-dom'; import { Home, DollarSign, Briefcase, Settings, LogOut, Menu, X, AlertCircle } from 'lucide-react'; import toast from 'react-hot-toast'; // Modern, glassmorphism, smooth UX 2025 Sidebar const Sidebar = memo(() => { const [isCollapsed, setIsCollapsed] = useState(localStorage.getItem('sidebarCollapsed') === 'true'); const [isDarkMode, setIsDarkMode] = useState(localStorage.getItem('darkMode') === 'true'); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const location = useLocation(); const navigate = useNavigate(); // Color palette for 2025 look const colors = { primary: '#2563eb', // blue-600 secondary: '#60a5fa', // blue-400 tertiary: '#f1f5f9', // slate-100 background: isDarkMode ? 'rgba(30,41,59,0.85)' : 'rgba(255,255,255,0.85)', glass: isDarkMode ? 'bg-gradient-to-br from-gray-900/80 via-gray-800/70 to-gray-900/60' : 'bg-gradient-to-br from-white/80 via-blue-50/70 to-white/60', border: isDarkMode ? 'border-gray-700/60' : 'border-blue-200/60', shadow: isDarkMode ? 'shadow-blue-900/30' : 'shadow-blue-200/40', navItemActiveBg: isDarkMode ? 'bg-gradient-to-r from-blue-700 via-blue-800 to-blue-900' : 'bg-gradient-to-r from-blue-600 to-blue-400', navItemInactiveBg: isDarkMode ? 'hover:bg-gray-800/80' : 'hover:bg-blue-100/80', navItemInactiveText: isDarkMode ? 'text-gray-200' : 'text-gray-700', navItemActiveText: 'text-white', navItemHoverText: isDarkMode ? 'hover:text-blue-300' : 'hover:text-blue-700', }; useEffect(() => { localStorage.setItem('sidebarCollapsed', isCollapsed); }, [isCollapsed]); useEffect(() => { localStorage.setItem('darkMode', isDarkMode); }, [isDarkMode]); const menuItems = [ { path: '/home', label: 'Trang chủ', icon: Home }, { path: '/expenses', label: 'Chi tiêu', icon: DollarSign }, { path: '/investments', label: 'Đầu tư', icon: Briefcase }, { path: '/settings', label: 'Cài đặt', icon: Settings }, ]; const handleLogout = async () => { try { const token = localStorage.getItem('token'); if (token) { await fetch('https://rockefeller-finance-backend.onrender.com/api/logout', { method: 'POST', headers: { Authorization: `Bearer ${token}` }, }); } localStorage.removeItem('token'); navigate('/login'); toast.success('Đăng xuất thành công!'); } catch (err) { toast.error('Lỗi khi đăng xuất'); } }; const toggleSidebar = () => setIsCollapsed((c) => !c); const toggleMobileMenu = () => setIsMobileMenuOpen((m) => !m); // Helper: close sidebar on mobile when navigating const handleMenuItemClick = () => { if (window.innerWidth < 768) setIsMobileMenuOpen(false); }; // Close sidebar on route change (mobile) useEffect(() => { if (isMobileMenuOpen) setIsMobileMenuOpen(false); // eslint-disable-next-line }, [location.pathname]); // Prevent scroll when sidebar is open on mobile useEffect(() => { if (isMobileMenuOpen) { document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = ''; } return () => { document.body.style.overflow = ''; }; }, [isMobileMenuOpen]); // Animation classes for 2025 feel const sidebarAnim = ` transition-all duration-500 ease-[cubic-bezier(.77,0,.18,1)] will-change-transform backdrop-blur-xl ${colors.glass} ${colors.shadow} border-r-2 ${colors.border} `; // Modern nav item style const navItemBase = 'group flex items-center gap-3 px-4 py-3 rounded-xl font-medium text-base transition-all duration-200 cursor-pointer select-none'; // Use explicit bg/text for dark mode fix const navItemActive = ` ${colors.navItemActiveBg} ${colors.navItemActiveText} shadow-lg scale-[1.04] border border-blue-300/30 `; const navItemInactive = ` ${colors.navItemInactiveText} ${colors.navItemInactiveBg} ${colors.navItemHoverText} transition-colors `; // Modern mobile menu button const mobileMenuBtn = 'md:hidden fixed top-4 left-4 z-[100] p-2 rounded-full bg-white/80 dark:bg-gray-900/80 shadow-lg border border-blue-200/40 dark:border-gray-700/40 backdrop-blur-lg transition-all duration-200 hover:scale-110'; // Modern collapse/expand button const collapseBtn = 'p-1.5 rounded-full hover:bg-blue-100/80 dark:hover:bg-gray-800/80 text-blue-600 dark:text-blue-300 transition-all duration-200 shadow-sm border border-blue-200/40 dark:border-gray-700/40'; // Modern dark mode button const darkModeBtn = 'w-full p-2 mb-2 rounded-xl font-semibold text-white bg-gradient-to-r from-blue-600 to-blue-400 hover:from-blue-700 hover:to-blue-500 transition-all duration-200 shadow-md hover:scale-105'; // Modern logout button const logoutBtn = 'flex items-center gap-3 p-2 rounded-xl w-full transition-all duration-200 bg-gradient-to-r from-red-500/90 to-pink-500/90 text-white hover:from-red-600 hover:to-pink-600 shadow-md hover:scale-105'; // Sidebar width const sidebarWidth = isCollapsed ? 72 : 270; return ( <> {/* Mobile menu button */} {/* Sidebar */} {/* Overlay for mobile */} {isMobileMenuOpen && (
)} ); }); export default Sidebar;
Huyền

Một Blog Anime chia sẻ những bộ anime hay download về để xem chất lượng cao nhất. neyuhv.blogspot.com does not host any files, it merely links to 3rd party services. Legal issues should be taken up with the file hosts and providers. neyuhv.blogspot.com is not responsible for any media files shown by the video providers.

Mới hơn Cũ hơn