import React, { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { PreviewContainer } from '../../../preview/container' import { PreviewHeader } from '../../../preview/header' import type { Datasource } from '@/app/components/rag-pipeline/components/panel/test-run/types' import type { CrawlResultItem, CustomFile, DocumentItem, FileIndexingEstimateResponse } from '@/models/datasets' import { ChunkingMode, DataSourceType } from '@/models/datasets' import type { NotionPage } from '@/models/common' import { DataSourceProvider } from '@/models/common' import PreviewDocumentPicker from '../../../common/document-picker/preview-document-picker' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { ChunkContainer, QAPreview } from '../../../chunk' import { FormattedText } from '../../../formatted-text/formatted' import { PreviewSlice } from '../../../formatted-text/flavours/preview-slice' import { SkeletonContainer, SkeletonPoint, SkeletonRectangle, SkeletonRow } from '@/app/components/base/skeleton' import { RiSearchEyeLine } from '@remixicon/react' import Badge from '@/app/components/base/badge' type ChunkPreviewProps = { datasource: Datasource files: CustomFile[] notionPages: NotionPage[] websitePages: CrawlResultItem[] isIdle: boolean isPending: boolean estimateData: FileIndexingEstimateResponse | undefined } const ChunkPreview = ({ datasource, files, notionPages, websitePages, isIdle, isPending, estimateData, }: ChunkPreviewProps) => { const { t } = useTranslation() const currentDocForm = useDatasetDetailContextWithSelector(s => s.dataset?.doc_form) const [previewFile, setPreviewFile] = useState(files[0] as DocumentItem) const [previewNotionPage, setPreviewNotionPage] = useState(notionPages[0]) const [previewWebsitePage, setPreviewWebsitePage] = useState(websitePages[0]) const dataSourceType = useMemo(() => { const type = datasource.type if (type === DataSourceProvider.fireCrawl || type === DataSourceProvider.jinaReader || type === DataSourceProvider.waterCrawl) return DataSourceType.WEB return type }, [datasource.type]) return (
{dataSourceType === DataSourceType.FILE && >} onChange={(selected) => { setPreviewFile(selected) }} value={previewFile} /> } {dataSourceType === DataSourceType.NOTION && ({ id: page.page_id, name: page.page_name, extension: 'md', })) } onChange={(selected) => { const selectedPage = notionPages.find(page => page.page_id === selected.id) setPreviewNotionPage(selectedPage!) }} value={{ id: previewNotionPage?.page_id || '', name: previewNotionPage?.page_name || '', extension: 'md', }} /> } {dataSourceType === DataSourceType.WEB && ({ id: page.source_url, name: page.title, extension: 'md', })) } onChange={(selected) => { const selectedPage = websitePages.find(page => page.source_url === selected.id) setPreviewWebsitePage(selectedPage!) }} value={ { id: previewWebsitePage?.source_url || '', name: previewWebsitePage?.title || '', extension: 'md', } } /> } { currentDocForm !== ChunkingMode.qa && }
} className='relative flex h-full w-1/2 shrink-0 p-4 pr-0' mainClassName='space-y-6' > {currentDocForm === ChunkingMode.qa && estimateData?.qa_preview && ( estimateData?.qa_preview.map((item, index) => ( )) )} {currentDocForm === ChunkingMode.text && estimateData?.preview && ( estimateData?.preview.map((item, index) => ( {item.content} )) )} {currentDocForm === ChunkingMode.parentChild && estimateData?.preview && ( estimateData?.preview?.map((item, index) => { const indexForLabel = index + 1 // const childChunks = parentChildConfig.chunkForContext === 'full-doc' // ? item.child_chunks.slice(0, FULL_DOC_PREVIEW_LENGTH) // : item.child_chunks return ( {item.child_chunks.map((child, index) => { const indexForLabel = index + 1 return ( ) })} ) }) )} {!isIdle && (

{t('datasetCreation.stepTwo.previewChunkTip')}

)} {isPending && (
{Array.from({ length: 10 }, (_, i) => ( ))}
)}
) } export default React.memo(ChunkPreview)