133 lines
4.4 KiB
TypeScript
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>
|
|
</>
|
|
);
|
|
} |