import React, { useState } from 'react' import { useTranslation } from 'react-i18next' import PreviewContainer from '../../../preview/container' import { PreviewHeader } from '../../../preview/header' import type { CrawlResultItem, CustomFile, DocumentItem, FileIndexingEstimateResponse } from '@/models/datasets' import { ChunkingMode } from '@/models/datasets' import type { NotionPage } 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' import Button from '@/app/components/base/button' import { DatasourceType } from '@/models/pipeline' type ChunkPreviewProps = { dataSourceType: DatasourceType files: CustomFile[] onlineDocuments: NotionPage[] websitePages: CrawlResultItem[] isIdle: boolean isPending: boolean estimateData: FileIndexingEstimateResponse | undefined onPreview: () => void handlePreviewFileChange: (file: DocumentItem) => void handlePreviewOnlineDocumentChange: (page: NotionPage) => void handlePreviewWebsitePageChange: (page: CrawlResultItem) => void } const ChunkPreview = ({ dataSourceType, files, onlineDocuments, websitePages, isIdle, isPending, estimateData, onPreview, handlePreviewFileChange, handlePreviewOnlineDocumentChange, handlePreviewWebsitePageChange, }: ChunkPreviewProps) => { const { t } = useTranslation() const currentDocForm = useDatasetDetailContextWithSelector(s => s.dataset?.doc_form) const [previewFile, setPreviewFile] = useState(files[0] as DocumentItem) const [previewOnlineDocument, setPreviewOnlineDocument] = useState(onlineDocuments[0]) const [previewWebsitePage, setPreviewWebsitePage] = useState(websitePages[0]) return (
{dataSourceType === DatasourceType.localFile && >} onChange={(selected) => { setPreviewFile(selected) handlePreviewFileChange(selected) }} value={previewFile} /> } {dataSourceType === DatasourceType.onlineDocument && ({ id: page.page_id, name: page.page_name, extension: 'md', })) } onChange={(selected) => { const selectedPage = onlineDocuments.find(page => page.page_id === selected.id) setPreviewOnlineDocument(selectedPage!) handlePreviewOnlineDocumentChange(selectedPage!) }} value={{ id: previewOnlineDocument?.page_id || '', name: previewOnlineDocument?.page_name || '', extension: 'md', }} /> } {dataSourceType === DatasourceType.websiteCrawl && ({ id: page.source_url, name: page.title, extension: 'md', })) } onChange={(selected) => { const selectedPage = websitePages.find(page => page.source_url === selected.id) setPreviewWebsitePage(selectedPage!) handlePreviewWebsitePageChange(selectedPage!) }} value={ { id: previewWebsitePage?.source_url || '', name: previewWebsitePage?.title || '', extension: 'md', } } /> } { currentDocForm !== ChunkingMode.qa && }
} className='relative flex h-full w-full shrink-0' mainClassName='space-y-6' > {!isPending && currentDocForm === ChunkingMode.qa && estimateData?.qa_preview && ( estimateData?.qa_preview.map((item, index) => ( )) )} {!isPending && currentDocForm === ChunkingMode.text && estimateData?.preview && ( estimateData?.preview.map((item, index) => ( {item.content} )) )} {!isPending && currentDocForm === ChunkingMode.parentChild && estimateData?.preview && ( estimateData?.preview?.map((item, index) => { const indexForLabel = index + 1 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)