agent-pages.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. /** i18n:title 对应的 key(可选,未接入时回退 title) */
  50. titleKey?: import("@/lib/i18n/dict").I18nKey;
  51. Icon: LucideIcon;
  52. /** 需要的功能权限键(单级开关)。admin 视为全权限 */
  53. requiredPermission?: string;
  54. /** 对话类页面:展示会话列表 + 聊天区,无独立主内容 */
  55. isChatPage?: boolean;
  56. /** 非对话类页面的嵌入组件;对话类不填 */
  57. component?: ComponentType<{ embedded?: boolean }>;
  58. }
  59. /**
  60. * 客服端侧栏功能页配置(单一数据源)
  61. * 新增功能:在此数组增加一项即可,无需改 NavigationSidebar / DashboardShell 的罗列逻辑
  62. */
  63. export const AGENT_PAGES = [
  64. {
  65. id: "dashboard",
  66. label: "会话对话",
  67. title: "对话",
  68. titleKey: "agent.page.dashboard",
  69. Icon: MessageCircle,
  70. requiredPermission: "chat",
  71. isChatPage: true,
  72. },
  73. {
  74. id: "internal-chat",
  75. label: "知识测试",
  76. title: "知识库测试",
  77. titleKey: "agent.page.internalChat",
  78. Icon: Lightbulb,
  79. requiredPermission: "kb_test",
  80. isChatPage: true,
  81. },
  82. {
  83. id: "knowledge",
  84. label: "知识管理",
  85. title: "知识库",
  86. titleKey: "agent.page.knowledge",
  87. Icon: BookOpen,
  88. requiredPermission: "knowledge",
  89. component: KnowledgePage,
  90. },
  91. {
  92. id: "faqs",
  93. label: "事件管理",
  94. title: "事件管理",
  95. titleKey: "agent.page.faqs",
  96. Icon: ClipboardList,
  97. requiredPermission: "faqs",
  98. component: FAQsPage,
  99. },
  100. {
  101. id: "analytics",
  102. label: "数据报表",
  103. title: "数据报表",
  104. titleKey: "agent.page.analytics",
  105. Icon: BarChart3,
  106. requiredPermission: "analytics",
  107. component: AnalyticsPage,
  108. },
  109. {
  110. id: "logs",
  111. label: "日志中心",
  112. title: "日志中心",
  113. titleKey: "agent.page.logs",
  114. Icon: ScrollText,
  115. requiredPermission: "logs",
  116. component: LogsPage,
  117. },
  118. {
  119. id: "users",
  120. label: "用户管理",
  121. title: "用户管理",
  122. titleKey: "agent.page.users",
  123. Icon: Users,
  124. requiredPermission: "users",
  125. component: UsersPage,
  126. },
  127. {
  128. id: "prompts",
  129. label: "提示配置",
  130. title: "提示词",
  131. titleKey: "agent.page.prompts",
  132. Icon: FileText,
  133. requiredPermission: "prompts",
  134. component: PromptsPage,
  135. },
  136. {
  137. id: "settings",
  138. label: "AI配置",
  139. title: "AI 配置",
  140. titleKey: "agent.page.settings",
  141. Icon: Settings,
  142. requiredPermission: "settings",
  143. component: SettingsPage,
  144. },
  145. ] as const;
  146. export type NavigationPage = (typeof AGENT_PAGES)[number]["id"];
  147. const VALID_PAGE_IDS = new Set<string>(AGENT_PAGES.map((p) => p.id));
  148. export function getPageFromSearchParams(searchParams: URLSearchParams | null): NavigationPage {
  149. const p = searchParams?.get("page") ?? null;
  150. if (p != null && VALID_PAGE_IDS.has(p)) return p as NavigationPage;
  151. return "dashboard";
  152. }
  153. export function getAgentPage(pageId: NavigationPage): AgentPageItem | undefined {
  154. return AGENT_PAGES.find((p) => p.id === pageId);
  155. }