import React, { type FC, useState } from 'react' import { useTranslation } from 'react-i18next' import { RiCloseLine, RiEditLine, } from '@remixicon/react' import { StatusItem } from '../../list' import s from './style.module.css' import { SegmentIndexTag } from '.' import type { SegmentDetailModel } from '@/models/datasets' import { useEventEmitterContextContext } from '@/context/event-emitter' import AutoHeightTextarea from '@/app/components/base/auto-height-textarea/common' import Switch from '@/app/components/base/switch' import Button from '@/app/components/base/button' import TagInput from '@/app/components/base/tag-input' import cn from '@/utils/classnames' import { formatNumber } from '@/utils/format' import Divider from '@/app/components/base/divider' type ISegmentDetailProps = { embeddingAvailable: boolean segInfo?: Partial & { id: string } onChangeSwitch?: (enabled: boolean, segId?: string) => Promise onUpdate: (segmentId: string, q: string, a: string, k: string[]) => void onCancel: () => void archived?: boolean isEditing?: boolean } /** * Show all the contents of the segment */ const SegmentDetail: FC = ({ embeddingAvailable, segInfo, archived, onChangeSwitch, onUpdate, onCancel, isEditing: initialIsEditing, }) => { const { t } = useTranslation() const [isEditing, setIsEditing] = useState(initialIsEditing) const [question, setQuestion] = useState(segInfo?.content || '') const [answer, setAnswer] = useState(segInfo?.answer || '') const [keywords, setKeywords] = useState(segInfo?.keywords || []) const { eventEmitter } = useEventEmitterContextContext() const [loading, setLoading] = useState(false) eventEmitter?.useSubscription((v) => { if (v === 'update-segment') setLoading(true) else setLoading(false) }) const handleCancel = () => { setIsEditing(false) setQuestion(segInfo?.content || '') setAnswer(segInfo?.answer || '') setKeywords(segInfo?.keywords || []) } const handleSave = () => { onUpdate(segInfo?.id || '', question, answer, keywords) } const renderContent = () => { if (segInfo?.answer) { return ( <>
QUESTION
setQuestion(e.target.value)} disabled={!isEditing} />
ANSWER
setAnswer(e.target.value)} disabled={!isEditing} autoFocus /> ) } return ( setQuestion(e.target.value)} disabled={!isEditing} autoFocus /> ) } return (
{isEditing && ( <> )} {!isEditing && !archived && embeddingAvailable && ( <>
{t('common.operation.edit')}
setIsEditing(true)} />
)}
{renderContent()}
{t('datasetDocuments.segment.keywords')}
{!segInfo?.keywords?.length ? '-' : ( setKeywords(newKeywords)} disableAdd={!isEditing} disableRemove={!isEditing || (keywords.length === 1)} /> ) }
{formatNumber(segInfo?.word_count as number)} {t('datasetDocuments.segment.characters')}
{formatNumber(segInfo?.hit_count as number)} {t('datasetDocuments.segment.hitCount')}
{t('datasetDocuments.segment.vectorHash')}{segInfo?.index_node_hash}
{embeddingAvailable && ( <> { await onChangeSwitch?.(val, segInfo?.id || '') }} disabled={archived} /> )}
) } SegmentDetail.displayName = 'SegmentDetail' export default React.memo(SegmentDetail)