import React, { useEffect, useState } from 'react'; import { Modal, Form, Input, Select, Space, Button, Message } from '@arco-design/web-react'; import { getComponentClassify } from '@/api/componentClassify'; import { copyAllMarket, copyDesignMarket } from '@/api/componentMarket'; import EditorSection from '@/components/EditorSection'; const FormItem = Form.Item; const Option = Select.Option; interface CopyComponentModalProps { visible: boolean; componentInfo: any; onCancel: () => void; onSuccess?: () => void; } const CopyComponentModal: React.FC = ({ visible, componentInfo, onCancel, onSuccess }) => { const [form] = Form.useForm(); const [classifyList, setClassifyList] = useState([]); const [loading, setLoading] = useState(false); const [description, setDescription] = useState(''); // 组件语言选项 const codeLanguageOptions = [ { label: 'Java:8', value: 'Java' }, { label: 'Python:3.10.12', value: 'Python' } ]; // 组件类型选项 const componentTypeOptions = [ { label: '普通组件', value: 'normal' }, { label: '监听组件', value: 'loop' } ]; // 获取组件分类列表 const getComponentClassifyList = async () => { try { const res: any = await getComponentClassify('component'); if (res.code === 200) { const data = res.data.map((item) => ({ label: item.classifyName, value: item.id })); setClassifyList(data); } } catch (error) { console.error('获取组件分类失败:', error); } }; useEffect(() => { getComponentClassifyList(); }, []); // 当弹窗打开时,设置表单初始值 useEffect(() => { if (visible && componentInfo) { form.setFieldsValue({ name: componentInfo.name || '', projectId: '', // 复制时项目标识需要重新填写 componentClassify: componentInfo.componentClassify || '', codeLanguage: componentInfo.codeLanguage || '', type: componentInfo.type || 'normal' }); setDescription(componentInfo.desc || ''); } }, [visible, componentInfo, form]); // 仅复制设计 const handleCopyDesign = async () => { try { await form.validate(); const formData = form.getFields(); setLoading(true); const params = { id: componentInfo.id, name: formData.name, projectId: formData.projectId, componentClassify: formData.componentClassify, codeLanguage: formData.codeLanguage, type: formData.type, desc: description }; const res: any = await copyDesignMarket(params); if (res.code === 200) { Message.success('仅复制设计成功'); onSuccess?.(); handleClose(); } else { Message.error(res.message || '复制失败'); } } catch (error) { console.error('复制失败:', error); Message.error('复制失败'); } finally { setLoading(false); } }; // 复制设计和代码 const handleCopyAll = async () => { try { await form.validate(); const formData = form.getFields(); setLoading(true); const params = { id: componentInfo.id, name: formData.name, projectId: formData.projectId, componentClassify: formData.componentClassify, codeLanguage: formData.codeLanguage, type: formData.type, desc: description }; const res: any = await copyAllMarket(params); if (res.code === 200) { Message.success('复制设计和代码成功'); onSuccess?.(); handleClose(); } else { Message.error(res.message || '复制失败'); } } catch (error) { console.error('复制失败:', error); Message.error('复制失败'); } finally { setLoading(false); } }; const handleClose = () => { form.resetFields(); onCancel(); }; return ( } style={{ width: '70%', maxWidth: 900 }} >
{ if (value && !/^[a-zA-Z][a-zA-Z0-9_]*$/.test(value)) { callback('组件标识必须以字母开头,只能包含字母、数字和下划线'); } else { callback(); } } } ]} >
); }; export default CopyComponentModal;