Files
ai-agent/web/components/app-sidebar.tsx
T

84 lines
2.4 KiB
TypeScript
Raw Normal View History

2026-04-09 10:01:23 +08:00
"use client"
import type { ComponentProps } from "react"
import { useMemo } from "react"
2026-05-25 12:06:15 +08:00
import { useI18n } from "@/i18n/provider"
2026-04-09 10:01:23 +08:00
import {
filterDashboardNavForSession,
filterDashboardSecondaryNavForSession,
} from "@/lib/navigation"
import { useAuth } from "@/components/auth-provider"
import { NavMain } from "@/components/nav-main"
import { NavSecondary } from "@/components/nav-secondary"
import { NavUser } from "@/components/nav-user"
import { WorkspaceSwitcher } from "@/components/workspace-switcher"
2026-04-09 10:01:23 +08:00
import {
Sidebar,
SidebarContent,
SidebarFooter,
SidebarHeader,
SidebarMenu,
SidebarMenuButton,
SidebarMenuItem,
} from "@/components/ui/sidebar"
export function AppSidebar({ ...props }: ComponentProps<typeof Sidebar>) {
2026-05-25 12:06:15 +08:00
const t = useI18n()
2026-04-09 10:01:23 +08:00
const { session } = useAuth()
const navSections = useMemo(
() => filterDashboardNavForSession(session?.permissions, session?.roles),
[session?.permissions, session?.roles]
)
const secondaryNavItems = useMemo(
() => filterDashboardSecondaryNavForSession(session?.permissions, session?.roles),
[session?.permissions, session?.roles]
)
const user = {
2026-05-25 12:06:15 +08:00
name: session?.user.nickname || session?.user.username || t("common.notSignedIn"),
email: session?.user.username || t("common.guest"),
2026-04-09 10:01:23 +08:00
avatar: session?.user.avatar || "",
}
return (
<Sidebar collapsible="icon" {...props}>
<SidebarHeader>
<SidebarMenu>
<SidebarMenuItem>
<WorkspaceSwitcher
currentWorkspace="dashboard"
variant="sidebar"
trigger={
<SidebarMenuButton
size="lg"
className="data-[slot=sidebar-menu-button]:p-1.5!"
/>
}
/>
2026-04-09 10:01:23 +08:00
</SidebarMenuItem>
</SidebarMenu>
</SidebarHeader>
<SidebarContent>
{navSections.map((section) => (
2026-05-25 12:06:15 +08:00
<NavMain
key={section.titleKey}
icon={section.icon}
sectionKey={section.titleKey}
2026-05-25 12:06:15 +08:00
title={t(section.titleKey)}
items={section.items.map((item) => ({
...item,
title: t(item.titleKey),
}))}
/>
2026-04-09 10:01:23 +08:00
))}
{secondaryNavItems.length > 0 ? (
<NavSecondary items={secondaryNavItems} className="mt-auto" />
) : null}
</SidebarContent>
<SidebarFooter>
<NavUser user={user} />
</SidebarFooter>
</Sidebar>
)
}