'use client'; import { useEffect, useState } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/dialog'; import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, } from '@/components/ui/sidebar'; import { Button } from '@/components/ui/button'; import { useTranslation } from 'react-i18next'; import { httpClient } from '@/app/infra/http/HttpClient'; import { KnowledgeBase } from '@/app/infra/entities/api'; import { CustomApiError } from '@/app/infra/entities/common'; import { toast } from 'sonner'; import KBForm from '@/app/home/knowledge/components/kb-form/KBForm'; import KBDoc from '@/app/home/knowledge/components/kb-docs/KBDoc'; import KBRetrieveGeneric from '@/app/home/knowledge/components/kb-retrieve/KBRetrieveGeneric'; interface KBDetailDialogProps { open: boolean; onOpenChange: (open: boolean) => void; kbId?: string; onFormCancel: () => void; onKbDeleted: () => void; onNewKbCreated: (kbId: string) => void; onKbUpdated: (kbId: string) => void; } export default function KBDetailDialog({ open, onOpenChange, kbId: propKbId, onFormCancel, onKbDeleted, onNewKbCreated, onKbUpdated, }: KBDetailDialogProps) { const { t } = useTranslation(); const [kbId, setKbId] = useState(propKbId); const [activeMenu, setActiveMenu] = useState('metadata'); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const [kbInfo, setKbInfo] = useState(null); useEffect(() => { setKbId(propKbId); setActiveMenu('metadata'); if (propKbId) { loadKbInfo(propKbId); } else { setKbInfo(null); } }, [propKbId, open]); async function loadKbInfo(id: string) { try { const resp = await httpClient.getKnowledgeBase(id); setKbInfo(resp.base); } catch (e) { console.error('Failed to load KB info:', e); toast.error( t('knowledge.loadKnowledgeBaseFailed') + (e as CustomApiError).msg, ); } } // Check if this KB supports document management const hasDocumentCapability = (): boolean => { if (!kbInfo || !kbInfo.knowledge_engine) { return false; } return ( kbInfo.knowledge_engine.capabilities?.includes('doc_ingestion') ?? false ); }; // Build menu based on KB capabilities const menu = [ { key: 'metadata', label: t('knowledge.metadata'), icon: ( ), }, // Show documents only if capability is present ...(hasDocumentCapability() ? [ { key: 'documents', label: t('knowledge.documents'), icon: ( ), }, ] : []), { key: 'retrieve', label: t('knowledge.retrieve'), icon: ( ), }, ]; const confirmDelete = async () => { try { await httpClient.deleteKnowledgeBase(kbId ?? ''); onKbDeleted(); } catch (e) { console.error('Failed to delete KB:', e); toast.error( t('knowledge.deleteKnowledgeBaseFailed') + (e as CustomApiError).msg, ); } finally { setShowDeleteConfirm(false); } }; // Retrieve function const retrieveFunction = async (id: string, query: string) => { return await httpClient.retrieveKnowledgeBase(id, query); }; if (!kbId) { // New KB creation return (
{t('knowledge.createKnowledgeBase')}
); } return ( <> {menu.map((item) => ( setActiveMenu(item.key)} > {item.icon} {item.label} ))}
{activeMenu === 'metadata' ? t('knowledge.editKnowledgeBase') : activeMenu === 'documents' ? t('knowledge.editDocument') : t('knowledge.retrieveTest')}
{activeMenu === 'metadata' && ( )} {activeMenu === 'documents' && hasDocumentCapability() && ( )} {activeMenu === 'retrieve' && ( )}
{activeMenu === 'metadata' && (
)}
{/* Delete confirmation dialog */} {t('common.confirmDelete')}
{t('knowledge.deleteKnowledgeBaseConfirmation')}
); }