agent-pages.tsx 3.6 KB

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