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 (
)
}