You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

271 lines
7.3 KiB
TypeScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<CopyComponentModalProps> = ({
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 (
<Modal
title="复制组件到我的组件"
visible={visible}
onCancel={handleClose}
footer={
<Space>
<Button onClick={handleClose}></Button>
<Button
type="primary"
onClick={handleCopyDesign}
loading={loading}
>
</Button>
<Button
type="primary"
status="success"
onClick={handleCopyAll}
loading={loading}
>
</Button>
</Space>
}
style={{ width: '70%', maxWidth: 900 }}
>
<Form
form={form}
layout="vertical"
autoComplete="off"
>
<FormItem
label="组件名称"
field="name"
rules={[{ required: true, message: '请输入组件名称' }]}
>
<Input placeholder="请输入组件名称" />
</FormItem>
<FormItem
label="组件标识"
field="projectId"
rules={[
{ required: true, message: '请输入组件标识' },
{
validator: (value, callback) => {
if (value && !/^[a-zA-Z][a-zA-Z0-9_]*$/.test(value)) {
callback('组件标识必须以字母开头,只能包含字母、数字和下划线');
}
else {
callback();
}
}
}
]}
>
<Input placeholder="请输入组件标识my_component" />
</FormItem>
<FormItem
label="组件分类"
field="componentClassify"
rules={[{ required: true, message: '请选择组件分类' }]}
>
<Select placeholder="请选择组件分类">
{classifyList.map((item) => (
<Option key={item.value} value={item.label}>
{item.label}
</Option>
))}
</Select>
</FormItem>
<FormItem
label="代码语言"
field="codeLanguage"
rules={[{ required: true, message: '请选择代码语言' }]}
>
<Select placeholder="请选择代码语言" disabled>
{codeLanguageOptions.map((item) => (
<Option key={item.value} value={item.value}>
{item.label}
</Option>
))}
</Select>
</FormItem>
<FormItem
label="组件类型"
field="type"
rules={[{ required: true, message: '请选择组件类型' }]}
>
<Select placeholder="请选择组件类型">
{componentTypeOptions.map((item) => (
<Option key={item.value} value={item.value}>
{item.label}
</Option>
))}
</Select>
</FormItem>
<FormItem label="描述">
<EditorSection
visible={visible}
initialContent={description}
/>
</FormItem>
</Form>
</Modal>
);
};
export default CopyComponentModal;