import { BotMessageSquareIcon, BrainCircuitIcon, Building2Icon, CalendarClockIcon, FileTextIcon, GlobeIcon, KeyRoundIcon, LayoutDashboardIcon, MessageSquareCodeIcon, MessageSquareMoreIcon, ShieldCheckIcon, TagsIcon, UserCogIcon, UsersIcon, WorkflowIcon, } from "lucide-react"; import type { ReactNode } from "react"; /** Keep in sync with backend internal/pkg/constants/auth.go RoleCodeSuperAdmin. */ export const DASHBOARD_ROLE_SUPER_ADMIN = "super_admin"; export type DashboardNavMenuItem = { title: string; titleKey: string; url: string; icon: ReactNode; }; export type DashboardNavItemConfig = Omit & { /** * Keep in sync with backend Permission.Code. Missing value means any signed-in * admin can see the module. */ requiredPermission?: string; }; export type DashboardNavSectionConfig = { titleKey: string; icon: ReactNode; items: DashboardNavItemConfig[]; }; function navItemVisible( item: DashboardNavItemConfig, superAdmin: boolean, permissionSet: Set, ): boolean { if (superAdmin) { return true; } if (!item.requiredPermission) { return true; } return permissionSet.has(item.requiredPermission); } export function filterDashboardNavForSession( permissions: readonly string[] | undefined, roles: readonly string[] | undefined, ): { titleKey: string; icon: ReactNode; items: DashboardNavMenuItem[] }[] { const superAdmin = roles?.includes(DASHBOARD_ROLE_SUPER_ADMIN) ?? false; const permissionSet = new Set(permissions ?? []); return dashboardNavSections .map((section) => ({ titleKey: section.titleKey, icon: section.icon, items: section.items .filter((item) => navItemVisible(item, superAdmin, permissionSet)) .map(({ titleKey, url, icon }) => ({ title: titleKey, titleKey, url, icon })), })) .filter((section) => section.items.length > 0); } export function filterDashboardSecondaryNavForSession( permissions: readonly string[] | undefined, roles: readonly string[] | undefined, ): DashboardNavMenuItem[] { const superAdmin = roles?.includes(DASHBOARD_ROLE_SUPER_ADMIN) ?? false; const permissionSet = new Set(permissions ?? []); return dashboardSecondaryNav .filter((item) => navItemVisible(item, superAdmin, permissionSet)) .map(({ titleKey, url, icon }) => ({ title: titleKey, titleKey, url, icon })); } export const dashboardNavSections: DashboardNavSectionConfig[] = [ // { // title: "Overview", // items: [ // { // title: "Overview", // url: "/", // icon: , // }, // ], // }, { titleKey: "nav.receptionCenter", icon: , items: [ { titleKey: "nav.overview", url: "/dashboard", icon: , }, { titleKey: "nav.conversations", url: "/dashboard/conversations", icon: , requiredPermission: "conversation.view", }, { titleKey: "nav.tickets", url: "/dashboard/tickets", icon: , requiredPermission: "ticket.view", }, { titleKey: "nav.conversationMonitor", url: "/dashboard/conversation-monitor", icon: , requiredPermission: "conversation.view", }, { titleKey: "nav.customers", url: "/dashboard/customers", icon: , requiredPermission: "customer.view", }, { titleKey: "nav.companies", url: "/dashboard/companies", icon: , requiredPermission: "company.view", }, ], }, { titleKey: "nav.agentConfig", icon: , items: [ { titleKey: "nav.tags", url: "/dashboard/tags", icon: , requiredPermission: "tag.view", }, { titleKey: "nav.quickReplies", url: "/dashboard/quick-replies", icon: , requiredPermission: "quickReply.view", }, { titleKey: "nav.agents", url: "/dashboard/agents", icon: , requiredPermission: "agent.view", }, { titleKey: "nav.agentTeamSchedules", url: "/dashboard/agent-team-schedules", icon: , requiredPermission: "agentTeamSchedule.view", }, { titleKey: "nav.channels", url: "/dashboard/channels", icon: , requiredPermission: "channel.view", }, ], }, { titleKey: "nav.aiCapabilities", icon: , items: [ { titleKey: "nav.knowledge", url: "/dashboard/knowledge", icon: , requiredPermission: "knowledgeBase.view", }, { titleKey: "nav.aiConfigs", url: "/dashboard/ai-configs", icon: , requiredPermission: "aiConfig.view", }, { titleKey: "nav.aiAgents", url: "/dashboard/ai-agents", icon: , requiredPermission: "aiAgent.view", }, { titleKey: "nav.workflows", url: "/dashboard/ai-workflows", icon: , requiredPermission: "aiAgent.view", }, { titleKey: "nav.skillDefinition", url: "/dashboard/skill-definition", icon: , requiredPermission: "skillDefinition.view", }, { titleKey: "nav.mcp", url: "/dashboard/mcp", icon: , requiredPermission: "mcp.view", }, { titleKey: "nav.workflowRuns", url: "/dashboard/ai-workflow-runs", icon: , requiredPermission: "aiAgent.view", }, { titleKey: "nav.agentRuns", url: "/dashboard/agent-runs", icon: , requiredPermission: "aiAgent.view", }, ], }, { titleKey: "nav.system", icon: , items: [ { titleKey: "nav.users", url: "/dashboard/users", icon: , requiredPermission: "user.view", }, { titleKey: "nav.roles", url: "/dashboard/roles", icon: , requiredPermission: "role.view", }, { titleKey: "nav.permissions", url: "/dashboard/permissions", icon: , requiredPermission: "permission.view", }, ], }, ]; export const dashboardSecondaryNav: DashboardNavItemConfig[] = [ // { // title: "System Settings", // url: "/settings", // icon: , // }, // { // title: "Help Center", // url: "/help", // icon: , // }, ]; export const dashboardQuickActions = [ { title: "View Conversations", icon: , }, { title: "Invite Members", icon: , }, { title: "Connect Bot", icon: , }, ] as const; export function getPageTitle(pathname: string): string { return getPageTitleKey(pathname); } export function getPageTitleKey(pathname: string): string { let matchedTitle = "nav.dashboardHome"; let longestMatch = 0; for (const section of dashboardNavSections) { for (const item of section.items) { if (pathname === item.url || pathname.startsWith(item.url + "/")) { const matchLength = item.url.length; if (matchLength > longestMatch) { longestMatch = matchLength; matchedTitle = item.titleKey; } } } } for (const item of dashboardSecondaryNav) { if (pathname === item.url || pathname.startsWith(item.url + "/")) { const matchLength = item.url.length; if (matchLength > longestMatch) { longestMatch = matchLength; matchedTitle = item.titleKey; } } } return matchedTitle; }