123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- 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
|