| // src/components/admin/AdminHeader.tsx | |
| import { Link, useNavigate } from "react-router-dom"; | |
| import { Bell, Settings, LogOut, Shield, Sun, Moon, User, Menu } from "lucide-react"; | |
| import { useAuth } from "@/context/AuthContext"; | |
| import { useTheme } from "@/hooks/useTheme"; | |
| import { useState } from "react"; | |
| export function AdminHeader() { | |
| const { user, logout } = useAuth(); | |
| const { isDark, toggleTheme } = useTheme(); | |
| const navigate = useNavigate(); | |
| const [mobileMenuOpen, setMobileMenuOpen] = useState(false); | |
| const handleLogout = async () => { | |
| await logout(); | |
| navigate("/login"); | |
| }; | |
| return ( | |
| <header className="h-16 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800 px-4 flex items-center justify-between sticky top-0 z-30"> | |
| <div className="flex items-center gap-3"> | |
| <button | |
| onClick={() => setMobileMenuOpen(!mobileMenuOpen)} | |
| className="lg:hidden p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition" | |
| > | |
| <Menu className="w-5 h-5" /> | |
| </button> | |
| <div className="flex items-center gap-2"> | |
| <Shield className="w-6 h-6 text-primary" /> | |
| <span className="font-bold text-lg hidden sm:inline">Admin Panel</span> | |
| </div> | |
| </div> | |
| <div className="flex items-center gap-3"> | |
| <button | |
| onClick={toggleTheme} | |
| className="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition" | |
| aria-label="Toggle theme" | |
| > | |
| {isDark ? <Sun className="w-5 h-5" /> : <Moon className="w-5 h-5" />} | |
| </button> | |
| <Link | |
| to="/notifications" | |
| className="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition relative" | |
| aria-label="Notifications" | |
| > | |
| <Bell className="w-5 h-5" /> | |
| <span className="absolute top-1 right-1 w-2 h-2 bg-red-500 rounded-full" /> | |
| </Link> | |
| <Link | |
| to="/settings" | |
| className="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition" | |
| aria-label="Settings" | |
| > | |
| <Settings className="w-5 h-5" /> | |
| </Link> | |
| <div className="flex items-center gap-2 pl-3 border-l border-gray-200 dark:border-gray-700"> | |
| <div className="text-right hidden sm:block"> | |
| <div className="text-sm font-medium">{user?.username || user?.email}</div> | |
| <div className="text-xs text-gray-500">Administrator</div> | |
| </div> | |
| <div className="w-8 h-8 rounded-full bg-gradient-to-br from-primary to-secondary text-white flex items-center justify-center font-bold"> | |
| {user?.username?.[0]?.toUpperCase() || user?.email?.[0]?.toUpperCase() || "A"} | |
| </div> | |
| <button | |
| onClick={handleLogout} | |
| className="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition" | |
| title="Logout" | |
| > | |
| <LogOut className="w-5 h-5 text-gray-500 hover:text-red-500 transition" /> | |
| </button> | |
| </div> | |
| </div> | |
| {/* Mobile menu */} | |
| {mobileMenuOpen && ( | |
| <div className="absolute top-16 left-0 right-0 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800 p-4 lg:hidden"> | |
| <div className="flex flex-col gap-3"> | |
| <div className="flex items-center gap-3 pb-3 border-b border-gray-200 dark:border-gray-700"> | |
| <div className="w-10 h-10 rounded-full bg-gradient-to-br from-primary to-secondary text-white flex items-center justify-center font-bold"> | |
| {user?.username?.[0]?.toUpperCase() || "A"} | |
| </div> | |
| <div> | |
| <div className="font-medium">{user?.username || user?.email}</div> | |
| <div className="text-xs text-gray-500">Administrator</div> | |
| </div> | |
| </div> | |
| <Link | |
| to="/profile" | |
| onClick={() => setMobileMenuOpen(false)} | |
| className="flex items-center gap-2 p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition" | |
| > | |
| <User className="w-4 h-4" /> Profile | |
| </Link> | |
| <Link | |
| to="/notifications" | |
| onClick={() => setMobileMenuOpen(false)} | |
| className="flex items-center gap-2 p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition" | |
| > | |
| <Bell className="w-4 h-4" /> Notifications | |
| </Link> | |
| <Link | |
| to="/settings" | |
| onClick={() => setMobileMenuOpen(false)} | |
| className="flex items-center gap-2 p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition" | |
| > | |
| <Settings className="w-4 h-4" /> Settings | |
| </Link> | |
| <button | |
| onClick={handleLogout} | |
| className="flex items-center gap-2 p-2 rounded-lg hover:bg-gray-100 transition text-red-600" | |
| > | |
| <LogOut className="w-4 h-4" /> Logout | |
| </button> | |
| </div> | |
| </div> | |
| )} | |
| </header> | |
| ); | |
| } | |
Xet Storage Details
- Size:
- 5.12 kB
- Xet hash:
- 84687c100395bd8213d34609ab062582d628354f6e5aa14138050a2bfbdf3b0e
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.