| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 | 
                        - import { useBatchUpdateDocMetadata, useDatasetMetaData, useDocumentMetaData } from '@/service/knowledge/use-metadata'
 - import { useDatasetDetailContext } from '@/context/dataset-detail'
 - import type { BuiltInMetadataItem } from '../types'
 - import { DataType, type MetadataItemWithValue } from '../types'
 - import { useCallback, useState } from 'react'
 - import Toast from '@/app/components/base/toast'
 - import type { FullDocumentDetail } from '@/models/datasets'
 - import { useTranslation } from 'react-i18next'
 - import { useLanguages, useMetadataMap } from '@/hooks/use-metadata'
 - import { get } from 'lodash-es'
 - import { useCreateMetaData } from '@/service/knowledge/use-metadata'
 - import useCheckMetadataName from './use-check-metadata-name'
 - 
 - type Props = {
 -   datasetId: string
 -   documentId: string
 -   docDetail: FullDocumentDetail
 - }
 - 
 - const useMetadataDocument = ({
 -   datasetId,
 -   documentId,
 -   docDetail,
 - }: Props) => {
 -   const { t } = useTranslation()
 - 
 -   const { dataset } = useDatasetDetailContext()
 -   const embeddingAvailable = !!dataset?.embedding_available
 - 
 -   const { mutateAsync } = useBatchUpdateDocMetadata()
 -   const { checkName } = useCheckMetadataName()
 - 
 -   const [isEdit, setIsEdit] = useState(false)
 -   const { data: documentDetail } = useDocumentMetaData({
 -     datasetId,
 -     documentId,
 -   })
 - 
 -   const allList = documentDetail?.doc_metadata || []
 -   const list = allList.filter(item => item.id !== 'built-in')
 -   const builtList = allList.filter(item => item.id === 'built-in')
 -   const [tempList, setTempList] = useState<MetadataItemWithValue[]>(list)
 -   const { mutateAsync: doAddMetaData } = useCreateMetaData(datasetId)
 -   const handleSelectMetaData = useCallback((metaData: MetadataItemWithValue) => {
 -     setTempList((prev) => {
 -       const index = prev.findIndex(item => item.id === metaData.id)
 -       if (index === -1)
 -         return [...prev, metaData]
 - 
 -       return prev
 -     })
 -   }, [])
 -   const handleAddMetaData = useCallback(async (payload: BuiltInMetadataItem) => {
 -     const errorMsg = checkName(payload.name).errorMsg
 -     if (errorMsg) {
 -       Toast.notify({
 -         message: errorMsg,
 -         type: 'error',
 -       })
 -       return Promise.reject(new Error(errorMsg))
 -     }
 -     await doAddMetaData(payload)
 -     Toast.notify({
 -       type: 'success',
 -       message: t('common.api.actionSuccess'),
 -     })
 -   }, [checkName, doAddMetaData, t])
 - 
 -   const hasData = list.length > 0
 -   const handleSave = async () => {
 -     await mutateAsync({
 -       dataset_id: datasetId,
 -       metadata_list: [{
 -         document_id: documentId,
 -         metadata_list: tempList,
 -       }],
 -     })
 -     setIsEdit(false)
 -     Toast.notify({
 -       type: 'success',
 -       message: t('common.api.actionSuccess'),
 -     })
 -   }
 - 
 -   const handleCancel = () => {
 -     setTempList(list)
 -     setIsEdit(false)
 -   }
 - 
 -   const startToEdit = () => {
 -     setTempList(list)
 -     setIsEdit(true)
 -   }
 - 
 -   // built in enabled is set in dataset
 -   const { data: datasetMetaData } = useDatasetMetaData(datasetId)
 -   const builtInEnabled = datasetMetaData?.built_in_field_enabled
 - 
 -   // old metadata and technical params
 -   const metadataMap = useMetadataMap()
 -   const languageMap = useLanguages()
 - 
 -   const getReadOnlyMetaData = (mainField: 'originInfo' | 'technicalParameters') => {
 -     const fieldMap = metadataMap[mainField]?.subFieldsMap
 -     const sourceData = docDetail
 -     const getTargetMap = (field: string) => {
 -       if (field === 'language')
 -         return languageMap
 - 
 -       return {} as any
 -     }
 - 
 -     const getTargetValue = (field: string) => {
 -       const val = get(sourceData, field, '')
 -       if (!val && val !== 0)
 -         return '-'
 -       if (fieldMap[field]?.inputType === 'select')
 -         return getTargetMap(field)[val]
 -       if (fieldMap[field]?.render)
 -         return fieldMap[field]?.render?.(val, field === 'hit_count' ? get(sourceData, 'segment_count', 0) as number : undefined)
 -       return val
 -     }
 -     const fieldList = Object.keys(fieldMap).map((key) => {
 -       const field = fieldMap[key]
 -       return {
 -         id: field?.label,
 -         type: DataType.string,
 -         name: field?.label,
 -         value: getTargetValue(key),
 -       }
 -     })
 - 
 -     return fieldList
 -   }
 - 
 -   const originInfo = getReadOnlyMetaData('originInfo')
 -   const technicalParameters = getReadOnlyMetaData('technicalParameters')
 - 
 -   return {
 -     embeddingAvailable,
 -     isEdit,
 -     setIsEdit,
 -     list,
 -     tempList,
 -     setTempList,
 -     handleSelectMetaData,
 -     handleAddMetaData,
 -     hasData,
 -     builtList,
 -     builtInEnabled,
 -     startToEdit,
 -     handleSave,
 -     handleCancel,
 -     originInfo,
 -     technicalParameters,
 -   }
 - }
 - 
 - export default useMetadataDocument
 
 
  |