licenses-management/components/dashboard-nav.tsx
2025-09-28 22:42:48 +01:00

133 lines
4.4 KiB
TypeScript

'use client';
import {
CreditCard,
Gift,
Key,
LayoutDashboard,
LogOut,
Menu,
Monitor,
Package,
Settings,
Shield,
Users
} from 'lucide-react';
import Link from 'next/link';
import { usePathname } from 'next/navigation';
import { useState } from 'react';
import { Button } from '@/components/ui/button';
import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet';
import { useAuthStore } from '@/lib/auth-store';
import { cn } from '@/lib/utils';
const navigation = [
{ name: 'Dashboard', href: '/dashboard', icon: LayoutDashboard },
{ name: 'Users', href: '/dashboard/users', icon: Users },
{ name: 'Products', href: '/dashboard/products', icon: Package },
{ name: 'Licenses', href: '/dashboard/licenses', icon: Key },
{ name: 'Machines', href: '/dashboard/machines', icon: Monitor },
{ name: 'Policies', href: '/dashboard/policies', icon: Shield },
{ name: 'Tokens', href: '/dashboard/tokens', icon: CreditCard },
{ name: 'Entitlements', href: '/dashboard/entitlements', icon: Gift },
];
export function DashboardNav() {
const [isOpen, setIsOpen] = useState(false);
const pathname = usePathname();
const { logout, user } = useAuthStore();
const handleLogout = () => {
logout();
window.location.href = '/';
};
const NavContent = () => (
<div className="flex h-full flex-col">
<div className="flex h-14 items-center border-b px-4">
<div className="flex items-center space-x-2">
<div className="flex items-center justify-center w-8 h-8 bg-blue-600 rounded-lg">
<Settings className="w-4 h-4 text-white" />
</div>
<span className="font-semibold">Keygen Dashboard</span>
</div>
</div>
<nav className="flex-1 space-y-2 p-4">
{navigation.map((item) => {
const isActive = pathname === item.href;
return (
<Link
key={item.name}
href={item.href}
className={cn(
'flex items-center space-x-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors',
isActive
? 'bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-100'
: 'text-gray-600 hover:bg-gray-100 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-800'
)}
onClick={() => setIsOpen(false)}
>
<item.icon className="h-5 w-5" />
<span>{item.name}</span>
</Link>
);
})}
</nav>
<div className="border-t p-4">
<div className="flex items-center justify-between">
<div className="flex items-center space-x-3">
<div className="flex items-center justify-center w-8 h-8 bg-gray-200 rounded-full">
<Users className="w-4 h-4 text-gray-600" />
</div>
<div>
<p className="text-sm font-medium">{user?.email}</p>
<p className="text-xs text-gray-500">Admin</p>
</div>
</div>
<Button
variant="ghost"
size="sm"
onClick={handleLogout}
className="text-gray-500 hover:text-gray-700"
>
<LogOut className="h-4 w-4" />
</Button>
</div>
</div>
</div>
);
return (
<>
{/* Desktop Sidebar */}
<div className="hidden md:flex md:w-64 md:flex-col md:fixed md:inset-y-0">
<div className="flex flex-col flex-grow border-r border-gray-200 bg-white shadow-sm">
<NavContent />
</div>
</div>
{/* Mobile Navigation */}
<div className="md:hidden">
<div className="flex items-center justify-between h-14 px-4 border-b bg-white">
<div className="flex items-center space-x-2">
<div className="flex items-center justify-center w-8 h-8 bg-blue-600 rounded-lg">
<Settings className="w-4 h-4 text-white" />
</div>
<span className="font-semibold">Keygen</span>
</div>
<Sheet open={isOpen} onOpenChange={setIsOpen}>
<SheetTrigger asChild>
<Button variant="ghost" size="sm">
<Menu className="h-5 w-5" />
</Button>
</SheetTrigger>
<SheetContent side="left" className="p-0 w-64">
<NavContent />
</SheetContent>
</Sheet>
</div>
</div>
</>
);
}