import type { FC } from 'react' import type { FullDocumentDetail } from '@/models/datasets' import type { RETRIEVE_METHOD } from '@/types/app' import { RiArrowRightLine, RiLoader2Fill, RiTerminalBoxLine, } from '@remixicon/react' import Link from 'next/link' import { useRouter } from 'next/navigation' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import Divider from '@/app/components/base/divider' import { Plan } from '@/app/components/billing/type' import { useProviderContext } from '@/context/provider-context' import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url' import { useProcessRule } from '@/service/knowledge/use-dataset' import { useInvalidDocumentList } from '@/service/knowledge/use-document' import IndexingProgressItem from './indexing-progress-item' import RuleDetail from './rule-detail' import UpgradeBanner from './upgrade-banner' import { useIndexingStatusPolling } from './use-indexing-status-polling' import { createDocumentLookup } from './utils' type EmbeddingProcessProps = { datasetId: string batchId: string documents?: FullDocumentDetail[] indexingType?: string retrievalMethod?: RETRIEVE_METHOD } // Status header component const StatusHeader: FC<{ isEmbedding: boolean, isCompleted: boolean }> = ({ isEmbedding, isCompleted, }) => { const { t } = useTranslation() return (
{isEmbedding && ( <> {t('embedding.processing', { ns: 'datasetDocuments' })} )} {isCompleted && t('embedding.completed', { ns: 'datasetDocuments' })}
) } // Action buttons component const ActionButtons: FC<{ apiReferenceUrl: string onNavToDocuments: () => void }> = ({ apiReferenceUrl, onNavToDocuments }) => { const { t } = useTranslation() return (
) } const EmbeddingProcess: FC = ({ datasetId, batchId, documents = [], indexingType, retrievalMethod, }) => { const { enableBilling, plan } = useProviderContext() const router = useRouter() const invalidDocumentList = useInvalidDocumentList() const apiReferenceUrl = useDatasetApiAccessUrl() // Polling hook for indexing status const { statusList, isEmbedding, isEmbeddingCompleted } = useIndexingStatusPolling({ datasetId, batchId, }) // Get process rule for the first document const firstDocumentId = documents[0]?.id const { data: ruleDetail } = useProcessRule(firstDocumentId) // Document lookup utilities - memoized for performance const documentLookup = useMemo( () => createDocumentLookup(documents), [documents], ) const handleNavToDocuments = () => { invalidDocumentList() router.push(`/datasets/${datasetId}/documents`) } const showUpgradeBanner = enableBilling && plan.type !== Plan.team return ( <>
{showUpgradeBanner && }
{statusList.map(detail => ( ))}
) } export default EmbeddingProcess