import React, { useState } from "react" import { Link, useLocation } from "@tanstack/react-router" import { Home, Clock, Users, FolderKanban, Calendar, ShieldCheck, Sun, Moon, Settings, ListTree, Menu, X, Zap, CreditCard, Languages, LogOut, FileText, LayoutTemplate, Bell } from "lucide-react" import { useQuery } from "@tanstack/react-query" import { api } from "../lib/api" import { useTheme } from "../lib/theme" import Avatar from "./Avatar" function NotificationBell() { const { data: notifications, isLoading } = useQuery({ queryKey: ['notifications', 'unread'], queryFn: async () => { const res = await api.get('/notifications/unread'); return res; } }) const unreadCount = notifications?.length || 0 return (
) } export default function Nav() { const location = useLocation() const { theme, toggleTheme } = useTheme() const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false) const [lang, setLang] = useState<'en' | 'de'>('en') const { data: user } = useQuery({ queryKey: ['me'], queryFn: api.getMe }) const { data: settings } = useQuery({ queryKey: ['settings'], queryFn: api.getSettings }) const navItems = [ { label: "Dashboard", to: "/", icon: Home }, { label: "Time Entries", to: "/time-entries", icon: Clock }, { label: "Calendar", to: "/calendar", icon: Calendar }, { label: "Customers", to: "/customers", icon: Users }, { label: "Projects", to: "/projects", icon: FolderKanban }, { label: "Invoices", to: "/invoices", icon: FileText }, { label: "Templates", to: "/templates", icon: LayoutTemplate }, { label: "Integrations", to: "/integrations", icon: Zap }, { label: "Billing", to: "/billing", icon: CreditCard }, ] const adminItems = [ { label: "Admin", to: "/admin", icon: ShieldCheck }, { label: "Audit Log", to: "/admin/audit-log", icon: ListTree }, { label: "Webhooks", to: "/admin/webhooks", icon: Zap }, ] const allItems = user?.role === 'admin' ? [...navItems, ...adminItems] : navItems const NavLink = ({ item }: { item: typeof navItems[0] }) => { const isActive = location.pathname === item.to const Icon = item.icon const baseClasses = "flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors" const activeClasses = "bg-indigo-50 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-300" const inactiveClasses = "text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-slate-100" return ( setIsMobileMenuOpen(false)} aria-current={isActive ? 'page' : undefined} className={`${baseClasses} ${isActive ? activeClasses : inactiveClasses}`} > {item.label} ) } return ( ) }