whistle.mock-plugins
Version:
Whistle 插件,用于快速创建 API 模拟数据
116 lines (107 loc) • 4.23 kB
JavaScript
import React, { useEffect, useState } from 'react';
import { Drawer, Form, Input, message, Button, Space } from 'antd';
import axios from 'axios';
import { ResponseContentEditor, PreviewModal, formatResponseContent, refreshCacheAfterUpdate } from '.';
const DataManagementDrawer = ({ visible, onCancel, interfaceItem, onSaved }) => {
const [form] = Form.useForm();
const [previewVisible, setPreviewVisible] = useState(false);
const [previewContent, setPreviewContent] = useState(null);
useEffect(() => {
if (visible && interfaceItem) {
let responses = Array.isArray(interfaceItem.responses) ? interfaceItem.responses : [];
let activeResponseId = interfaceItem.activeResponseId || (responses[0] && responses[0].id) || '';
form.setFieldsValue({ responses, activeResponseId });
}
}, [visible, interfaceItem]);
const handlePreview = () => {
const values = form.getFieldsValue(true);
const responses = Array.isArray(values.responses) ? values.responses : [];
const activeResponse = responses.find(r => r.id === values.activeResponseId) || responses[0];
if (!activeResponse) {
message.error('未找到有效的响应内容');
return;
}
const contentType = 'application/json; charset=utf-8';
const formatted = formatResponseContent(activeResponse.content || '', contentType);
setPreviewContent({ title: `预览: ${activeResponse.name || '未命名响应'}`, content: formatted, contentType, description: '' });
setPreviewVisible(true);
};
const handleOk = async () => {
try {
await form.validateFields();
const values = form.getFieldsValue(true);
const payload = {
responses: Array.isArray(values.responses) ? values.responses : [],
activeResponseId: values.activeResponseId || (values.responses && values.responses[0] && values.responses[0].id) || ''
};
if (!interfaceItem || !interfaceItem.id) {
message.error('缺少接口ID,无法保存');
return;
}
const res = await axios.patch(`/cgi-bin/interfaces/${interfaceItem.id}`, payload);
if (res.data && res.data.code === 0) {
message.success('保存成功');
await refreshCacheAfterUpdate();
if (onSaved) onSaved();
if (onCancel) onCancel();
} else {
throw new Error(res.data?.message || '保存失败');
}
} catch (err) {
if (err && err.errorFields) return; // 表单校验错误
console.error('保存失败', err);
message.error(err.response?.data?.message || err.message || '保存失败');
}
};
return (
<>
<Drawer
title="数据管理"
placement="right"
width={1040}
open={visible}
onClose={onCancel}
destroyOnClose
bodyStyle={{ paddingBottom: 80 }}
footer={
<div style={{ textAlign: 'right' }}>
<Space>
<Button onClick={onCancel}>取消</Button>
<Button type="primary" onClick={handleOk}>保存</Button>
</Space>
</div>
}
>
<Form form={form} layout="vertical" initialValues={{ responses: [], activeResponseId: '' }}>
<Form.Item name="responses" hidden>
<Input />
</Form.Item>
<Form.Item name="activeResponseId" hidden>
<Input />
</Form.Item>
<Form.Item noStyle shouldUpdate>
{({ getFieldValue }) => {
const responses = getFieldValue('responses') || [];
const activeResponseId = getFieldValue('activeResponseId') || (responses[0] && responses[0].id) || '';
return (
<ResponseContentEditor
form={form}
responses={responses}
activeResponseId={activeResponseId}
onPreview={handlePreview}
enableSorting={true}
/>
);
}}
</Form.Item>
</Form>
</Drawer>
<PreviewModal
visible={previewVisible}
onCancel={() => setPreviewVisible(false)}
previewContent={previewContent}
/>
</>
);
};
export default DataManagementDrawer;