Files
AI-CS/frontend/lib/constants/agent-pages.tsx
T
2026-02-02 21:41:47 +08:00

108 lines
2.6 KiB
TypeScript

"use client";
import dynamic from "next/dynamic";
import type { ComponentType } from "react";
import type { LucideIcon } from "lucide-react";
import {
MessageCircle,
Lightbulb,
BookOpen,
ClipboardList,
Users,
Settings,
} from "lucide-react";
/** 嵌入在 dashboard 内的页面组件(懒加载) */
const KnowledgePage = dynamic(
() => import("@/app/agent/knowledge/page").then((mod) => ({ default: mod.default })),
{ ssr: false }
);
const FAQsPage = dynamic(
() => import("@/app/agent/faqs/page").then((mod) => ({ default: mod.default })),
{ ssr: false }
);
const UsersPage = dynamic(
() => import("@/app/agent/users/page").then((mod) => ({ default: mod.default })),
{ ssr: false }
);
const SettingsPage = dynamic(
() => import("@/app/agent/settings/page").then((mod) => ({ default: mod.default })),
{ ssr: false }
);
export interface AgentPageItem {
id: string;
label: string;
title: string;
Icon: LucideIcon;
adminOnly?: boolean;
/** 对话类页面:展示会话列表 + 聊天区,无独立主内容 */
isChatPage?: boolean;
/** 非对话类页面的嵌入组件;对话类不填 */
component?: ComponentType<{ embedded?: boolean }>;
}
/**
* 客服端侧栏功能页配置(单一数据源)
* 新增功能:在此数组增加一项即可,无需改 NavigationSidebar / DashboardShell 的罗列逻辑
*/
export const AGENT_PAGES = [
{
id: "dashboard",
label: "对话",
title: "对话",
Icon: MessageCircle,
isChatPage: true,
},
{
id: "internal-chat",
label: "知识库测试",
title: "知识库测试",
Icon: Lightbulb,
isChatPage: true,
},
{
id: "knowledge",
label: "知识库",
title: "知识库",
Icon: BookOpen,
component: KnowledgePage,
},
{
id: "faqs",
label: "事件管理",
title: "事件管理",
Icon: ClipboardList,
component: FAQsPage,
},
{
id: "users",
label: "用户管理",
title: "用户管理",
Icon: Users,
adminOnly: true,
component: UsersPage,
},
{
id: "settings",
label: "AI 配置",
title: "AI 配置",
Icon: Settings,
component: SettingsPage,
},
] as const;
export type NavigationPage = (typeof AGENT_PAGES)[number]["id"];
const VALID_PAGE_IDS = new Set(AGENT_PAGES.map((p) => p.id));
export function getPageFromSearchParams(searchParams: URLSearchParams | null): NavigationPage {
const p = searchParams?.get("page") ?? null;
if (p && VALID_PAGE_IDS.has(p)) return p as NavigationPage;
return "dashboard";
}
export function getAgentPage(pageId: NavigationPage): AgentPageItem | undefined {
return AGENT_PAGES.find((p) => p.id === pageId);
}