agent-pages.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. "use client";
  2. import dynamic from "next/dynamic";
  3. import type { ComponentType } from "react";
  4. import type { LucideIcon } from "lucide-react";
  5. import {
  6. MessageCircle,
  7. Lightbulb,
  8. BookOpen,
  9. ClipboardList,
  10. Users,
  11. Settings,
  12. FileText,
  13. BarChart3,
  14. ScrollText,
  15. } from "lucide-react";
  16. /** 嵌入在 dashboard 内的页面组件(懒加载) */
  17. const KnowledgePage = dynamic(
  18. () => import("@/app/agent/knowledge/page").then((mod) => ({ default: mod.default })),
  19. { ssr: false }
  20. );
  21. const FAQsPage = dynamic(
  22. () => import("@/app/agent/faqs/page").then((mod) => ({ default: mod.default })),
  23. { ssr: false }
  24. );
  25. const UsersPage = dynamic(
  26. () => import("@/app/agent/users/page").then((mod) => ({ default: mod.default })),
  27. { ssr: false }
  28. );
  29. const SettingsPage = dynamic(
  30. () => import("@/app/agent/settings/page").then((mod) => ({ default: mod.default })),
  31. { ssr: false }
  32. );
  33. const PromptsPage = dynamic(
  34. () => import("@/app/agent/prompts/page").then((mod) => ({ default: mod.default })),
  35. { ssr: false }
  36. );
  37. const AnalyticsPage = dynamic(
  38. () => import("@/app/agent/analytics/page").then((mod) => ({ default: mod.default })),
  39. { ssr: false }
  40. );
  41. const LogsPage = dynamic(
  42. () => import("@/app/agent/logs/page").then((mod) => ({ default: mod.default })),
  43. { ssr: false }
  44. );
  45. export interface AgentPageItem {
  46. id: string;
  47. label: string;
  48. title: string;
  49. Icon: LucideIcon;
  50. /** 需要的功能权限键(单级开关)。admin 视为全权限 */
  51. requiredPermission?: string;
  52. /** 对话类页面:展示会话列表 + 聊天区,无独立主内容 */
  53. isChatPage?: boolean;
  54. /** 非对话类页面的嵌入组件;对话类不填 */
  55. component?: ComponentType<{ embedded?: boolean }>;
  56. }
  57. /**
  58. * 客服端侧栏功能页配置(单一数据源)
  59. * 新增功能:在此数组增加一项即可,无需改 NavigationSidebar / DashboardShell 的罗列逻辑
  60. */
  61. export const AGENT_PAGES = [
  62. {
  63. id: "dashboard",
  64. label: "会话对话",
  65. title: "对话",
  66. Icon: MessageCircle,
  67. requiredPermission: "chat",
  68. isChatPage: true,
  69. },
  70. {
  71. id: "internal-chat",
  72. label: "知识测试",
  73. title: "知识库测试",
  74. Icon: Lightbulb,
  75. requiredPermission: "kb_test",
  76. isChatPage: true,
  77. },
  78. {
  79. id: "knowledge",
  80. label: "知识管理",
  81. title: "知识库",
  82. Icon: BookOpen,
  83. requiredPermission: "knowledge",
  84. component: KnowledgePage,
  85. },
  86. {
  87. id: "faqs",
  88. label: "事件管理",
  89. title: "事件管理",
  90. Icon: ClipboardList,
  91. requiredPermission: "faqs",
  92. component: FAQsPage,
  93. },
  94. {
  95. id: "analytics",
  96. label: "数据报表",
  97. title: "数据报表",
  98. Icon: BarChart3,
  99. requiredPermission: "analytics",
  100. component: AnalyticsPage,
  101. },
  102. {
  103. id: "logs",
  104. label: "日志中心",
  105. title: "日志中心",
  106. Icon: ScrollText,
  107. requiredPermission: "logs",
  108. component: LogsPage,
  109. },
  110. {
  111. id: "users",
  112. label: "用户管理",
  113. title: "用户管理",
  114. Icon: Users,
  115. requiredPermission: "users",
  116. component: UsersPage,
  117. },
  118. {
  119. id: "prompts",
  120. label: "提示配置",
  121. title: "提示词",
  122. Icon: FileText,
  123. requiredPermission: "prompts",
  124. component: PromptsPage,
  125. },
  126. {
  127. id: "settings",
  128. label: "AI配置",
  129. title: "AI 配置",
  130. Icon: Settings,
  131. requiredPermission: "settings",
  132. component: SettingsPage,
  133. },
  134. ] as const;
  135. export type NavigationPage = (typeof AGENT_PAGES)[number]["id"];
  136. const VALID_PAGE_IDS = new Set<string>(AGENT_PAGES.map((p) => p.id));
  137. export function getPageFromSearchParams(searchParams: URLSearchParams | null): NavigationPage {
  138. const p = searchParams?.get("page") ?? null;
  139. if (p != null && VALID_PAGE_IDS.has(p)) return p as NavigationPage;
  140. return "dashboard";
  141. }
  142. export function getAgentPage(pageId: NavigationPage): AgentPageItem | undefined {
  143. return AGENT_PAGES.find((p) => p.id === pageId);
  144. }