'use client' import React, { useEffect, useState } from 'react' import { RiCloseLine } from '@remixicon/react' import Modal from '@/app/components/base/modal' import Button from '@/app/components/base/button' import { addIntent, addIntentKeyword, delBatchIntentKeyword, editIntent, editIntentKeyword, fetchIntentKeyword, fetchIntentType, getIntent, } from '@/service/common' import 'react-multi-email/dist/style.css' import Input from '@/app/components/base/input' import { SimpleSelect } from '@/app/components/base/select' import useSWR from 'swr' import Checkbox from '@/app/components/base/checkbox' import cn from '@/utils/classnames' import { useContext } from 'use-context-selector' import { ToastContext } from '@/app/components/base/toast' import Confirm from '@/app/components/base/confirm' import { Textarea } from '@/app/components/base/textarea' const DetailModal = ({ transfer, onCancel, onSend, onRefresh, }: any) => { const { notify } = useContext(ToastContext) const [intentName, setIntentName] = useState(transfer.row?.intentName || '') const [intentType, setIntentType] = useState(transfer.row?.intentType || '') const [corpusList, setCorpusList] = useState([]) const [corpusFilter, setCorpusFilter] = useState('') const [keywordsList, setKeywordsList] = useState([]) const { data: dataOptionsIntentType }: any = useSWR( { url: '/intentions/types', params: { page: 1, limit: 99999, }, }, fetchIntentType, ) const optionsIntentType: any = dataOptionsIntentType?.data.map((v: any) => ({ name: v.name, value: v.id })) || [] useEffect(() => { if (transfer.row?.id) { getIntent({ url: `/intentions/${transfer.row.id}` }).then((res: any) => { setIntentType(res.type.id) setIntentName(res.name) setCorpusList(res.corpus) setKeywordsList(res.keywords) }) } }, []) const [keyword, setKeyword] = useState('') const [keywordFilter, setKeywordFilter] = useState('') const refreshKeywords = async () => { const res = await fetchIntentKeyword({ url: `/intentions/${transfer.row.id}/keywords`, params: { page: 1, limit: 99999, }, }) setKeywordsList(res) } const handleAddKeyword = async () => { if (!keyword) return if (keywordsList.some((v: any) => v.name === keyword)) { notify({ type: 'warning', message: '请勿新增重复数据!' }) return } const { id }: any = await addIntentKeyword({ url: `/intentions/${transfer.row.id}/keywords`, body: { name: keyword, }, }) if (id) { await refreshKeywords() setKeyword('') } } const [keywordSelectMap, setKeywordsSelectMap] = useState(new Map()) const addKeywordsSelectMap = (key: any, value: any) => { setKeywordsSelectMap((prevMap: any) => { const newMap = new Map(prevMap) newMap.set(key, value) return newMap }) } const delKeywordsSelectMap = (key: any) => { setKeywordsSelectMap((prevMap: any) => { const newMap = new Map(prevMap) newMap.delete(key) return newMap }) } const [keywordRow, setKeywordRow] = useState({}) const [showKeywordEdit, setShowKeywordEdit] = useState(false) const [editKeyword, setEditKeyword] = useState('') const handleSaveKeyword = async () => { if (keywordsList.some((v: any) => v.name === editKeyword)) { notify({ type: 'warning', message: '请勿新增重复数据!' }) return } const { id }: any = await editIntentKeyword({ url: `/intentions/keywords/${keywordRow.id}`, body: { name: editKeyword, intention_id: keywordRow.intention_id, }, }) if (id) { await refreshKeywords() setShowKeywordEdit(false) } } const [showConfirmDelete, setShowConfirmDelete] = useState(false) const [delBatch, setDelBatch] = useState(false) const handleDelKeyword = async () => { try { await delBatchIntentKeyword({ url: '/intentions/keywords/batch', body: { method: 'delete', delete_data: delBatch ? Array.from(keywordSelectMap.keys()) : [keywordRow.id], }, }) setShowConfirmDelete(false) setKeywordsSelectMap(new Map()) refreshKeywords() } catch (e) { } } const handleSave = async () => { try { let res if (transfer.mode === 'add') { res = await addIntent({ url: '/intentions', body: { type_id: intentType, name: intentName }, }) } else { res = await editIntent({ url: `/intentions/${transfer.row.id}`, body: { type_id: intentType, name: intentName }, }) } const { id }: any = res if (id) { if (transfer.mode === 'add') onRefresh(id) else onSend() } } catch (e) { } } const [similarityRow, setSimilarityRow] = useState({}) const [showSimilarityCorpus, setShowSimilarityCorpus] = useState(false) return (
{ }} className="p-[24px 32px] w-[800px] max-w-[800px]">
{transfer.mode === 'add' ? '新增' : '编辑'}意图
意图类型
{ setIntentType(i.value) }} items={optionsIntentType} allowSearch={false} placeholder="请选择意图类型" />
意图名称
setIntentName(e.target.value)} onClear={() => setIntentName('')} />
{ transfer.mode === 'edit' && (
关键词
setKeyword(e.target.value)} onClear={() => setKeyword('')} placeholder='输入后Enter以添加' onEnter={handleAddKeyword} />
) }
{ transfer.mode === 'edit' && (
e.stopPropagation()}> keywordSelectMap.has(v.id))} onCheck={() => { keywordsList.every((v: any) => keywordSelectMap.has(v.id)) ? setKeywordsSelectMap(new Map()) : keywordsList.forEach((v: any) => addKeywordsSelectMap(v.id, v)) }} disabled={keywordsList.length === 0} /> 全选
setKeywordFilter(e.target.value)} onClear={() => setKeywordFilter('')} placeholder='请输入关键词名称进行过滤' />
{ keywordsList.filter((v: any) => !keywordFilter || v.name.includes(keywordFilter)).map((item: any) => (
{ keywordSelectMap.has(item.id) ? delKeywordsSelectMap(item.id) : addKeywordsSelectMap(item.id, item) }} disabled={keywordsList.length === 0} />
{item.name}
)) }
共{keywordsList.length}条
已选择{keywordSelectMap.size}条
) } { transfer.mode === 'edit' && (
语料列表
setCorpusFilter(e.target.value)} onClear={() => setCorpusFilter('')} placeholder='请输入语料名称进行过滤' />
{ corpusList.filter((v: any) => !corpusFilter || v.question.includes(corpusFilter)).map((item: any) => (
{item.question}
)) }
共{corpusList.length}条
) }
{ showKeywordEdit && ( { }} className="p-[24px 32px] w-[400px]">
编辑关键词
setShowKeywordEdit(false)} />
关键词
setEditKeyword(e.target.value)} className='h-9' placeholder='请输入关键词' />
) } {showConfirmDelete && ( setShowConfirmDelete(false)} /> )} { showSimilarityCorpus && ( { }} className="p-[24px 32px] max-w-[800px]">
训练语料配置
setShowSimilarityCorpus(false)} />
当前标注问题:{similarityRow.question}