import { useCallback, useMemo, useRef, useState } from 'react' import type { CrawlResultItem, CustomFile, FileIndexingEstimateResponse } from '@/models/datasets' import type { NotionPage } from '@/models/common' import { useTranslation } from 'react-i18next' import AppUnavailable from '@/app/components/base/app-unavailable' import ChunkPreview from '../../../create-from-pipeline/preview/chunk-preview' import Loading from '@/app/components/base/loading' import ProcessDocuments from './process-documents' import LeftHeader from './left-header' import { usePipelineExecutionLog, useRunPublishedPipeline } from '@/service/use-pipeline' import type { PublishedPipelineRunPreviewResponse } from '@/models/pipeline' import { DatasourceType } from '@/models/pipeline' import { noop } from 'lodash-es' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { useRouter } from 'next/navigation' import { useInvalidDocumentList } from '@/service/knowledge/use-document' type PipelineSettingsProps = { datasetId: string documentId: string } const PipelineSettings = ({ datasetId, documentId, }: PipelineSettingsProps) => { const { t } = useTranslation() const { push } = useRouter() const [estimateData, setEstimateData] = useState(undefined) const pipelineId = useDatasetDetailContextWithSelector(state => state.dataset?.pipeline_id) const isPreview = useRef(false) const formRef = useRef(null) const { data: lastRunData, isFetching: isFetchingLastRunData, isError } = usePipelineExecutionLog({ dataset_id: datasetId, document_id: documentId, }) const files = useMemo(() => { const files: CustomFile[] = [] if (lastRunData?.datasource_type === DatasourceType.localFile) { const { related_id, name, extension } = lastRunData.datasource_info files.push({ id: related_id, name, extension, } as CustomFile) } return files }, [lastRunData]) const websitePages = useMemo(() => { const websitePages: CrawlResultItem[] = [] if (lastRunData?.datasource_type === DatasourceType.websiteCrawl) { const { content, description, source_url, title } = lastRunData.datasource_info websitePages.push({ markdown: content, description, source_url, title, }) } return websitePages }, [lastRunData]) const onlineDocuments = useMemo(() => { const onlineDocuments: NotionPage[] = [] if (lastRunData?.datasource_type === DatasourceType.onlineDocument) { const { workspace_id, page } = lastRunData.datasource_info onlineDocuments.push({ workspace_id, ...page, }) } return onlineDocuments }, [lastRunData]) const { mutateAsync: runPublishedPipeline, isIdle, isPending } = useRunPublishedPipeline() const handlePreviewChunks = useCallback(async (data: Record) => { if (!lastRunData) return const datasourceInfoList: Record[] = [] const documentInfo = lastRunData.datasource_info datasourceInfoList.push(documentInfo) await runPublishedPipeline({ pipeline_id: pipelineId!, inputs: data, start_node_id: lastRunData.datasource_node_id, datasource_type: lastRunData.datasource_type, datasource_info_list: datasourceInfoList, is_preview: true, }, { onSuccess: (res) => { setEstimateData((res as PublishedPipelineRunPreviewResponse).data.outputs) }, }) }, [lastRunData, pipelineId, runPublishedPipeline]) const invalidDocumentList = useInvalidDocumentList(datasetId) const handleProcess = useCallback(async (data: Record) => { if (!lastRunData) return const datasourceInfoList: Record[] = [] const documentInfo = lastRunData.datasource_info datasourceInfoList.push(documentInfo) await runPublishedPipeline({ pipeline_id: pipelineId!, inputs: data, start_node_id: lastRunData.datasource_node_id, datasource_type: lastRunData.datasource_type, datasource_info_list: datasourceInfoList, is_preview: false, }, { onSuccess: () => { invalidDocumentList() push(`/datasets/${datasetId}/documents/${documentId}`) }, }) }, [datasetId, documentId, invalidDocumentList, lastRunData, pipelineId, push, runPublishedPipeline]) const onClickProcess = useCallback(() => { isPreview.current = false formRef.current?.submit() }, []) const onClickPreview = useCallback(() => { isPreview.current = true formRef.current?.submit() }, []) const handleSubmit = useCallback((data: Record) => { isPreview.current ? handlePreviewChunks(data) : handleProcess(data) }, [handlePreviewChunks, handleProcess]) if (isFetchingLastRunData) { return ( ) } if (isError) return return (
{/* Preview */}
) } export default PipelineSettings