import { memo, useState } from 'react' import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' import { useParams } from 'next/navigation' import { RiCloseLine, RiExpandDiagonalLine } from '@remixicon/react' import { useKeyPress } from 'ahooks' import { SegmentIndexTag, useSegmentListContext } from './completed' import Drawer from '@/app/components/base/drawer' import Button from '@/app/components/base/button' import AutoHeightTextarea from '@/app/components/base/auto-height-textarea/common' import { ToastContext } from '@/app/components/base/toast' import type { SegmentUpdater } from '@/models/datasets' import { addSegment } from '@/service/datasets' import TagInput from '@/app/components/base/tag-input' import classNames from '@/utils/classnames' import { formatNumber } from '@/utils/format' import { getKeyboardKeyCodeBySystem, getKeyboardKeyNameBySystem } from '@/app/components/workflow/utils' import Divider from '@/app/components/base/divider' type NewSegmentModalProps = { isShow: boolean onCancel: () => void docForm: string onSave: () => void } const NewSegmentModal: FC = ({ isShow, onCancel, docForm, onSave, }) => { const { t } = useTranslation() const { notify } = useContext(ToastContext) const [question, setQuestion] = useState('') const [answer, setAnswer] = useState('') const { datasetId, documentId } = useParams<{ datasetId: string; documentId: string }>() const [keywords, setKeywords] = useState([]) const [loading, setLoading] = useState(false) const [fullScreen, toggleFullScreen] = useSegmentListContext(s => [s.fullScreen, s.toggleFullScreen]) const handleCancel = () => { onCancel() setQuestion('') setAnswer('') setKeywords([]) } const handleSave = async () => { const params: SegmentUpdater = { content: '' } if (docForm === 'qa_model') { if (!question.trim()) return notify({ type: 'error', message: t('datasetDocuments.segment.questionEmpty') }) if (!answer.trim()) return notify({ type: 'error', message: t('datasetDocuments.segment.answerEmpty') }) params.content = question params.answer = answer } else { if (!question.trim()) return notify({ type: 'error', message: t('datasetDocuments.segment.contentEmpty') }) params.content = question } if (keywords?.length) params.keywords = keywords setLoading(true) try { await addSegment({ datasetId, documentId, body: params }) notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') }) handleCancel() onSave() } finally { setLoading(false) } } useKeyPress(['esc'], (e) => { e.preventDefault() handleCancel() }) useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.s`, (e) => { e.preventDefault() handleSave() } , { exactMatch: true, useCapture: true }) const renderContent = () => { if (docForm === 'qa_model') { return ( <>
QUESTION
setQuestion(e.target.value)} autoFocus />
ANSWER
setAnswer(e.target.value)} /> ) } return ( setQuestion(e.target.value)} autoFocus /> ) } const renderActionButtons = () => { return (
) } const renderKeywords = () => { return (
{t('datasetDocuments.segment.keywords')}
setKeywords(newKeywords)} />
) } return ( {}} panelClassname={`!p-0 ${fullScreen ? '!max-w-full !w-full' : 'mt-16 mr-2 mb-2 !max-w-[560px] !w-[560px] border-[0.5px] border-components-panel-border rounded-xl'}`} mask={false} unmount footer={null} >
{ docForm === 'qa_model' ? t('datasetDocuments.segment.newQaSegment') : t('datasetDocuments.segment.addChunk') }
ยท {formatNumber(question.length)} {t('datasetDocuments.segment.characters')}
{fullScreen && ( <> {renderActionButtons()} )}
{renderContent()}
{renderKeywords()}
{!fullScreen && (
{renderActionButtons()}
)}
) } export default memo(NewSegmentModal)