import * as React from 'react'; import { observer } from 'mobx-react'; import { generatePath, useLocation, useParams } from 'react-router-dom'; import { Form, Input, Button, message, Upload, UploadProps } from 'antd'; import { apis } from '@/apis'; import router from '@/router'; import { ArrowLeftOutlined } from '@ant-design/icons'; import config, { getHeaders } from '@/apis/config'; const { TextArea } = Input; import { useState, useRef, useEffect } from 'react'; import { EyeOutlined, CloseOutlined } from '@ant-design/icons'; const FormItem = Form.Item; // 引入富文本 import MarkdownIt from "markdown-it"; import MdEditor from "react-markdown-editor-lite"; import "react-markdown-editor-lite/lib/index.css"; import './style.less'; // 初始化 markdown-it const mdParser = new MarkdownIt({ html: true, typographer: true }); const ar2 = [ { name:'我是图片1', url:'https://jkeckms.ryuiso.com/chat-bg.jpg' }, { name:'我是图片2', url:'https://jkeckms.ryuiso.com/chat-bg.jpg' }, { name:'我是图片3', url:'https://jkeckms.ryuiso.com/chat-bg.jpg' } ] interface MdImg { name: string; url: string; } const SliceDetail: React.FC = () => { const [form] = Form.useForm(); const params = useParams(); const location = useLocation(); // console.log('location------',location); const { text = '', page } = location.state??{}; const [listLoading, setListLoading] = React.useState(false); const [mdImgUrlList, setMdImgUrlList] = useState(); const appApi = { fetchList: async () => { setListLoading(true); try { if (!params.sliceId || !params.knowledgeId) { throw new Error('参数错误'); } const res = await apis.fetchTakaiSliceDetail(params.sliceId, params.knowledgeId); const info = res.data.data; form.setFieldsValue({ slice_id: info.slice_id, slice_text: info.slice_text, document_id: info.document_id, }) setContentMd(info.slice_text || ''); setMdImgUrlList(info.imageList || []); } catch (error) { console.error(error); } finally { setListLoading(false); } } }; const init = async () => { if (params.sliceId && params.sliceId !== 'new') { await appApi.fetchList(); } } React.useEffect(() => { init(); }, []) const [cursorEndPosition, setCursorEndPosition] = React.useState(0); // 上传图片配置 const uploadImageConfig: UploadProps = { name: 'files', action: config.baseURL + `/deepseek/api/uploadSliceImage/${params.knowledgeId}/${params.documentId}`, method: 'POST', headers: getHeaders(), accept: ['.png', '.jpg', '.jpeg'].join(','), multiple: true, maxCount: 5, showUploadList: false, }; // 处理markdown编辑器 const [contentMd, setContentMd] = React.useState(''); // 在这里做关键字替换 const customRender = (text: string)=> { let html = mdParser.render(text); // 比如:把 "我是图片" 替换成一张图片 mdImgUrlList?.forEach(item=>{ html = html.replace(new RegExp(item.name, 'g'), `${item.name}`); }) // html = html.replace(/我是图片/g, `我是图片`); // 你还可以做更多规则,比如匹配 [img:xxx] 这种自定义语法 // html = html.replace(/\[img:(.+?)\]/g, (_, name) => ``); form.setFieldsValue({ slice_text: text }); return html; } return (
setContentMd(text)} onBlur={(e: React.FocusEvent) => { const ta = e.target as HTMLTextAreaElement; const start = ta.selectionStart; const end = ta.selectionEnd; setCursorEndPosition(end); // setCursor({ start, end }); // console.log('blur cursor', start, end, ta.value); }} /> {false &&