tahamajs/IE / Projects /front /src /components /admin /AdminHeader.tsx
tahamajs's picture
download
raw
5.12 kB
// 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.