import React, { useCallback, useEffect, useState } from 'react'; import { ExternalLinkIcon, FileTextIcon, Loader2Icon, X } from 'lucide-react'; import { useUserSession } from '@vertesia/ui/session'; import { Button, VTooltip } from '@vertesia/ui/core'; import { NavLink } from '@vertesia/ui/router'; import { MarkdownRenderer } from '@vertesia/ui/widgets'; import { useUITranslation } from '../../../i18n/index.js'; import { DocumentTabBar } from './DocumentTabBar.js'; import type { OpenDocument } from './types/document.js'; interface DocumentPanelProps { isOpen: boolean; documents: OpenDocument[]; activeDocumentId: string | null; onSelectDocument: (id: string) => void; onCloseDocument: (id: string) => void; onUpdateDocumentTitle?: (id: string, title: string) => void; refreshKey: number; runId?: string; } function DocumentPanelComponent({ isOpen, documents, activeDocumentId, onSelectDocument, onCloseDocument, onUpdateDocumentTitle, refreshKey, runId, }: DocumentPanelProps) { const { client } = useUserSession(); const { t } = useUITranslation(); const [content, setContent] = useState(null); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [docName, setDocName] = useState(null); const fetchContent = useCallback(async (docId: string) => { setIsLoading(true); setError(null); try { const [textResult, obj] = await Promise.all([ client.store.objects.getObjectText(docId), client.store.objects.retrieve(docId), ]); setContent(textResult.text ?? null); const name = obj.name; setDocName(name); if (name) onUpdateDocumentTitle?.(docId, name); } catch (err: unknown) { const message = err instanceof Error ? err.message : t('agent.failedToLoadDocument'); setError(message); setContent(null); } finally { setIsLoading(false); } }, [client, onUpdateDocumentTitle]); // Fetch content when active document changes or refreshKey bumps useEffect(() => { if (activeDocumentId && isOpen) { fetchContent(activeDocumentId); } }, [activeDocumentId, refreshKey, isOpen, fetchContent]); if (!isOpen || documents.length === 0) { return null; } return (
{/* Header */}

{docName || t('agent.document')}

{activeDocumentId && ( )}
{/* Content area */}
{isLoading ? (
{t('agent.loadingDocument')}
) : error ? (
{error}
) : content ? (
{content}
) : (
{t('agent.noContentAvailable')}
)}
); } export const DocumentPanel = React.memo(DocumentPanelComponent);