import type { FC } from 'react'
import type { FullDocumentDetail } from '@/models/datasets'
import type { RETRIEVE_METHOD } from '@/types/app'
import { buttonVariants } from '@langgenius/dify-ui/button'
import { cn } from '@langgenius/dify-ui/cn'
import { RiArrowRightLine, RiLoader2Fill, RiTerminalBoxLine } from '@remixicon/react'
import { useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import Divider from '@/app/components/base/divider'
import VectorSpaceAdmissionAlert from '@/app/components/datasets/common/vector-space-admission-alert'
import { useProviderContext } from '@/context/provider-context'
import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url'
import Link from '@/next/link'
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
documentsHref: string
onNavigateToDocuments: () => void
}> = ({ apiReferenceUrl, documentsHref, onNavigateToDocuments }) => {
const { t } = useTranslation()
return (
Access the API
{t(($) => $['stepThree.navTo'], { ns: 'datasetCreation' })}
)
}
const EmbeddingProcess: FC = ({
datasetId,
batchId,
documents = [],
indexingType,
retrievalMethod,
}) => {
const { enableBilling, plan } = useProviderContext()
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 documentsHref = `/datasets/${datasetId}/documents`
const showUpgradeBanner = enableBilling && plan.type !== 'team'
const showVectorSpaceUpgrade =
enableBilling && (plan.type === 'sandbox' || plan.type === 'professional')
const vectorSpaceAdmissionError = statusList.find(
(detail) => detail.error_code === 'vector_space_estimate_exceeded',
)
return (
<>
{vectorSpaceAdmissionError?.estimated_vector_space_mb != null &&
vectorSpaceAdmissionError.vector_space_limit_mb != null && (
)}
{showUpgradeBanner &&
}
{statusList.map((detail) => (
))}
>
)
}
export default EmbeddingProcess