114 lines
3.5 KiB
TypeScript
114 lines
3.5 KiB
TypeScript
import { Loader2, Settings2 } from "lucide-react";
|
|
import { useState } from "react";
|
|
import { Navigate, useParams, useSearchParams } from "react-router-dom";
|
|
|
|
import { Button } from "@/components/ui/button";
|
|
import {
|
|
KNOWLEDGE_NORMAL_VIEW_VALUE,
|
|
KnowledgeProductNav,
|
|
useKnowledgeBaseProductVersion,
|
|
} from "@/components/workspace/knowledge-product-nav";
|
|
import {
|
|
Dialog,
|
|
DialogContent,
|
|
DialogHeader,
|
|
DialogTitle,
|
|
} from "@/components/ui/dialog";
|
|
import { getStoredAuth } from "@/core/auth";
|
|
import { buildWeKnoraWikiPagePath } from "@/core/llmwiki/source-links";
|
|
import { useLlmWikiRuntime } from "@/strategy-components/api/llmwiki";
|
|
import WeKnoraKnowledgeWorkspace, {
|
|
ConnectionSettings,
|
|
} from "@/strategy-components/components/resource-management/llmwiki/WeKnoraKnowledgeWorkspace";
|
|
import WeKnoraKnowledgeDetailPage from "@/strategy-components/components/resource-management/llmwiki/WeKnoraKnowledgeDetailPage";
|
|
|
|
import KnowledgeBasePage from "./KnowledgeBasePage";
|
|
import KnowledgeGraphPage from "./KnowledgeGraphPage";
|
|
|
|
type LlmWikiKnowledgePageMode = "list" | "detail" | "graph";
|
|
|
|
function RuntimeLoading() {
|
|
return (
|
|
<div className="flex h-full min-h-64 items-center justify-center text-sm text-muted-foreground">
|
|
<Loader2 className="mr-2 size-5 animate-spin" />
|
|
正在读取 LLMWiki 运行模式
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function AdminWeKnoraSettingsButton() {
|
|
const [open, setOpen] = useState(false);
|
|
|
|
return (
|
|
<>
|
|
<Button size="sm" variant="outline" onClick={() => setOpen(true)}>
|
|
<Settings2 className="mr-2 size-4" />
|
|
配置知识服务
|
|
</Button>
|
|
<Dialog open={open} onOpenChange={setOpen}>
|
|
<DialogContent className="max-w-4xl">
|
|
<DialogHeader>
|
|
<DialogTitle>LLMWiki 运行模式</DialogTitle>
|
|
</DialogHeader>
|
|
<ConnectionSettings />
|
|
</DialogContent>
|
|
</Dialog>
|
|
</>
|
|
);
|
|
}
|
|
|
|
function LegacyKnowledgePage() {
|
|
const isAdmin = getStoredAuth()?.system_role === "admin";
|
|
|
|
return (
|
|
<KnowledgeBasePage
|
|
headerExtraActions={isAdmin ? <AdminWeKnoraSettingsButton /> : undefined}
|
|
/>
|
|
);
|
|
}
|
|
|
|
export default function LlmWikiKnowledgePage({
|
|
mode = "list",
|
|
}: {
|
|
mode?: LlmWikiKnowledgePageMode;
|
|
}) {
|
|
const { noteId = "" } = useParams();
|
|
const [searchParams] = useSearchParams();
|
|
const runtime = useLlmWikiRuntime();
|
|
const productVersion = useKnowledgeBaseProductVersion();
|
|
const wikiSlug = searchParams.get("wikiSlug")?.trim() || "";
|
|
const explicitNormalView = searchParams.get("view") === KNOWLEDGE_NORMAL_VIEW_VALUE;
|
|
|
|
if (mode === "detail" && noteId && wikiSlug) {
|
|
return <Navigate to={buildWeKnoraWikiPagePath(noteId, wikiSlug)} replace />;
|
|
}
|
|
|
|
if (runtime.isLoading) {
|
|
return <RuntimeLoading />;
|
|
}
|
|
|
|
if (mode === "list" && productVersion.data === "v2" && !explicitNormalView) {
|
|
return <Navigate to="/page/workspace/knowledge/assistant" replace />;
|
|
}
|
|
|
|
if (runtime.isError || runtime.data?.provider !== "weknora" || !runtime.data?.api_base_url?.trim()) {
|
|
if (mode === "list" || mode === "detail") {
|
|
return <Navigate to="/page/workspace/knowledge/assistant" replace />;
|
|
}
|
|
if (mode === "graph") {
|
|
return <KnowledgeGraphPage />;
|
|
}
|
|
return <LegacyKnowledgePage />;
|
|
}
|
|
|
|
if (mode === "graph") {
|
|
return <Navigate to="/page/workspace/knowledge" replace />;
|
|
}
|
|
|
|
if (mode === "detail") {
|
|
return <WeKnoraKnowledgeDetailPage />;
|
|
}
|
|
|
|
return <div className="flex size-full min-h-0 flex-col"><KnowledgeProductNav /><div className="min-h-0 flex-1"><WeKnoraKnowledgeWorkspace /></div></div>;
|
|
}
|