"use client" import { Button } from "@/components/ui/button" import { Sheet, SheetContent, SheetHeader, SheetTitle, } from "@/components/ui/sheet" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import type { KnowledgeBase } from "@/lib/api/admin" import { exportKnowledgeFAQs } from "@/lib/api/admin" import { useI18n } from "@/i18n/provider" import { Bug, DownloadIcon, LayoutGridIcon, LayoutListIcon, PanelLeftCloseIcon, PanelLeftOpenIcon, PlusIcon, RefreshCwIcon, UploadIcon, } from "lucide-react" import { useEffect, useState, type PointerEvent } from "react" import { toast } from "sonner" import { DebugPanel } from "./_components/debug-panel" import { DocumentList, type DocumentListActionState } from "./_components/document-list" import { FAQList, type FAQListActionState } from "./_components/faq-list" import { KnowledgeBaseList } from "./_components/knowledge-base-list" import { RetrieveLogList } from "./_components/retrieve-log-list" const KNOWLEDGE_BASE_LIST_WIDTH_STORAGE_KEY = "knowledge-base-list-width" const KNOWLEDGE_BASE_LIST_MIN_WIDTH = 240 const KNOWLEDGE_BASE_LIST_MAX_WIDTH = 520 const KNOWLEDGE_BASE_LIST_DEFAULT_WIDTH = 320 export default function DashboardKnowledgeDocumentsPage() { const t = useI18n() const [selectedKnowledgeBase, setSelectedKnowledgeBase] = useState(null) const [sidebarCollapsed, setSidebarCollapsed] = useState(false) const [sidebarResizing, setSidebarResizing] = useState(false) const [sidebarWidth, setSidebarWidth] = useState(() => { if (typeof window === "undefined") { return KNOWLEDGE_BASE_LIST_DEFAULT_WIDTH } const saved = Number(localStorage.getItem(KNOWLEDGE_BASE_LIST_WIDTH_STORAGE_KEY)) if (!Number.isFinite(saved)) { return KNOWLEDGE_BASE_LIST_DEFAULT_WIDTH } return Math.min( KNOWLEDGE_BASE_LIST_MAX_WIDTH, Math.max(KNOWLEDGE_BASE_LIST_MIN_WIDTH, saved), ) }) const [debugPanelOpen, setDebugPanelOpen] = useState(false) const [activeTab, setActiveTab] = useState("documents") const [documentActionState, setDocumentActionState] = useState(null) const [faqActionState, setFAQActionState] = useState(null) const [exportingFAQ, setExportingFAQ] = useState(false) const isFAQKnowledgeBase = selectedKnowledgeBase?.knowledgeType === "faq" useEffect(() => { localStorage.setItem(KNOWLEDGE_BASE_LIST_WIDTH_STORAGE_KEY, String(sidebarWidth)) }, [sidebarWidth]) function handleSidebarResizePointerDown(event: PointerEvent) { event.preventDefault() const startX = event.clientX const startWidth = sidebarWidth function handlePointerMove(moveEvent: globalThis.PointerEvent) { const nextWidth = startWidth + moveEvent.clientX - startX setSidebarWidth( Math.min( KNOWLEDGE_BASE_LIST_MAX_WIDTH, Math.max(KNOWLEDGE_BASE_LIST_MIN_WIDTH, nextWidth), ), ) } function handlePointerEnd() { window.removeEventListener("pointermove", handlePointerMove) window.removeEventListener("pointerup", handlePointerEnd) window.removeEventListener("pointercancel", handlePointerEnd) document.body.style.cursor = "" document.body.style.userSelect = "" setSidebarResizing(false) } setSidebarResizing(true) document.body.style.cursor = "col-resize" document.body.style.userSelect = "none" window.addEventListener("pointermove", handlePointerMove) window.addEventListener("pointerup", handlePointerEnd) window.addEventListener("pointercancel", handlePointerEnd) } async function handleExportFAQ() { if (!selectedKnowledgeBase || exportingFAQ) { return } setExportingFAQ(true) try { await exportKnowledgeFAQs(selectedKnowledgeBase.id) toast.success(t("knowledge.exportFAQSuccess")) } catch (error) { toast.error(error instanceof Error ? error.message : t("knowledge.exportFAQFailed")) } finally { setExportingFAQ(false) } } return (
{!sidebarCollapsed ? (
) : null}
{isFAQKnowledgeBase ? t("knowledge.faq") : t("knowledge.document")} {t("knowledge.retrieveLogs")} {activeTab === "documents" && !isFAQKnowledgeBase && documentActionState ? (
) : null} {activeTab === "documents" && isFAQKnowledgeBase && faqActionState ? (
) : null}
{isFAQKnowledgeBase ? ( ) : ( )}
{t("knowledge.ragDebug")}
) }