'use client' import Link from 'next/link' import { usePathname } from 'next/navigation' import { useState } from 'react' import { cn } from '@/lib/utils' import { signOut } from '@/lib/auth-actions' import type { Tables } from '@/types/database' type SpaceMember = Tables<'space_members'> type Space = Tables<'spaces'> import { Menu, X, LayoutDashboard, ListChecks, FolderKanban, Settings2, MessageSquare, Users, CreditCard, BookUser, Download, LogOut, Vote, ShieldAlert, ScrollText, LineChart, UserCircle, UserSearch, MessagesSquare, } from 'lucide-react' interface NavLinkProps { href: string label: string icon: React.ElementType badge?: number active: boolean onClick?: () => void } function NavLink({ href, label, icon: Icon, badge, active, onClick }: NavLinkProps) { return ( {label} {badge && badge > 0 ? ( {badge} ) : null} ) } interface AppSidebarProps { member: SpaceMember & { spaces: Space | null } taskBadge?: number commsBadge?: number paymentBadge?: number } export function AppSidebar({ member, taskBadge = 0, commsBadge = 0, paymentBadge = 0 }: AppSidebarProps) { const pathname = usePathname() const space = member.spaces const initials = (member.display_name || 'U').split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2) const isAdmin = member.role === 'admin' || member.role === 'board' const [drawerOpen, setDrawerOpen] = useState(false) const isActive = (href: string) => pathname === href || pathname.startsWith(href + '/') const handleSignOut = async () => { await signOut() } const closeDrawer = () => setDrawerOpen(false) const renderNav = (onNav?: () => void) => ( <> {/* Logo */}
{'{'}hs{'}'}

{space?.name || 'My Space'}

{/* Nav */} {/* User */}
) return ( <> {/* Desktop sidebar */} {/* Mobile: top bar */}
hs
{space?.name}
{/* Mobile: drawer overlay */} {drawerOpen && (
Menu
{renderNav(closeDrawer)}
)} ) }