{"ast":null,"code":"var _jsxFileName = \"/Users/max_liu/max_liu/company/tools_auto_pt/src/pages/ToolsLibraryDetail.js\",\n _s = $RefreshSig$();\nimport React, { useState, useEffect } from 'react';\nimport { Form, Input, Select, Button, Card, Descriptions, Tag, message, Spin } from 'antd';\nimport { useParams, useNavigate, useLocation } from 'react-router-dom';\nimport { ArrowLeftOutlined } from '@ant-design/icons';\nimport { toolsLibraryApi } from '../services/api';\nimport moment from 'moment';\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nconst {\n TextArea\n} = Input;\nconst {\n Option\n} = Select;\nconst ToolsLibraryDetail = () => {\n _s();\n const [form] = Form.useForm();\n const [data, setData] = useState(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const {\n id\n } = useParams();\n const navigate = useNavigate();\n const location = useLocation();\n const isEditMode = location.search.includes('mode=edit');\n const getStatusColor = status => {\n const statusMap = {\n 'normal': 'success',\n 'offline': 'default'\n };\n return statusMap[status] || 'warning';\n };\n const getStatusText = status => {\n const statusMap = {\n 'normal': '正常',\n 'offline': '已下线'\n };\n return statusMap[status] || status;\n };\n const getCallTypeText = type => {\n const typeMap = {\n 'api': 'API调用',\n 'browser_auto_operate': '浏览器自动操作'\n };\n return typeMap[type] || type;\n };\n const getApiProviderText = provider => {\n const providerMap = {\n 'official': '官方',\n '302ai': '302AI',\n 'official_api': '官方API'\n };\n return providerMap[provider] || provider;\n };\n const fetchData = async () => {\n try {\n const response = await toolsLibraryApi.getDetail(id);\n setData(response.data);\n form.setFieldsValue(response.data);\n } catch (error) {\n message.error('获取详情失败');\n } finally {\n setLoading(false);\n }\n };\n const handleSave = async values => {\n setSaving(true);\n try {\n await toolsLibraryApi.update(id, values);\n message.success('更新成功');\n navigate('/tools-library');\n } catch (error) {\n message.error('更新失败');\n } finally {\n setSaving(false);\n }\n };\n useEffect(() => {\n fetchData();\n }, [id]);\n if (loading) {\n return /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n textAlign: 'center',\n padding: '50px'\n },\n children: /*#__PURE__*/_jsxDEV(Spin, {\n size: \"large\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 86,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 85,\n columnNumber: 7\n }, this);\n }\n if (!data) {\n return /*#__PURE__*/_jsxDEV(\"div\", {\n children: \"\\u6570\\u636E\\u4E0D\\u5B58\\u5728\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 92,\n columnNumber: 12\n }, this);\n }\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"detail-container\",\n children: [/*#__PURE__*/_jsxDEV(Button, {\n icon: /*#__PURE__*/_jsxDEV(ArrowLeftOutlined, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 98,\n columnNumber: 15\n }, this),\n onClick: () => navigate('/tools-library'),\n style: {\n marginBottom: 16\n },\n children: \"\\u8FD4\\u56DE\\u5217\\u8868\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 97,\n columnNumber: 7\n }, this), isEditMode ? /*#__PURE__*/_jsxDEV(Card, {\n title: \"\\u7F16\\u8F91\\u5DE5\\u5177\",\n style: {\n marginBottom: 24\n },\n children: /*#__PURE__*/_jsxDEV(Form, {\n form: form,\n layout: \"vertical\",\n onFinish: handleSave,\n className: \"form-container\",\n children: [/*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"\\u5DE5\\u5177\\u540D\\u79F0\",\n name: \"tools_name\",\n rules: [{\n required: true,\n message: '请输入工具名称'\n }],\n children: /*#__PURE__*/_jsxDEV(Input, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 118,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 113,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"\\u5DE5\\u5177\\u529F\\u80FD\\u540D\\u79F0\",\n name: \"tools_function_name\",\n rules: [{\n required: true,\n message: '请输入工具功能名称'\n }],\n children: /*#__PURE__*/_jsxDEV(Input, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 126,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 121,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"\\u5DE5\\u5177\\u5168\\u79F0\",\n name: \"tools_full_name\",\n children: /*#__PURE__*/_jsxDEV(Input, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 133,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 129,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"\\u5DE5\\u5177\\u63CF\\u8FF0\",\n name: \"tools_desc\",\n children: /*#__PURE__*/_jsxDEV(TextArea, {\n rows: 4\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 140,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 136,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"\\u5DE5\\u5177\\u7248\\u672C\",\n name: \"tools_version\",\n children: /*#__PURE__*/_jsxDEV(Input, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 147,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 143,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"\\u81EA\\u52A8\\u63A5\\u5165\\u4EFB\\u52A1ID\",\n name: \"access_task_id\",\n children: /*#__PURE__*/_jsxDEV(Input, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 154,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 150,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"\\u72B6\\u6001\",\n name: \"status\",\n rules: [{\n required: true,\n message: '请选择状态'\n }],\n children: /*#__PURE__*/_jsxDEV(Select, {\n children: [/*#__PURE__*/_jsxDEV(Option, {\n value: \"normal\",\n children: \"\\u6B63\\u5E38\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 163,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(Option, {\n value: \"offline\",\n children: \"\\u5DF2\\u4E0B\\u7EBF\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 164,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 162,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 157,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"\\u8C03\\u7528\\u65B9\\u5F0F\",\n name: \"call_type\",\n children: /*#__PURE__*/_jsxDEV(Select, {\n children: [/*#__PURE__*/_jsxDEV(Option, {\n value: \"api\",\n children: \"API\\u8C03\\u7528\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 173,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(Option, {\n value: \"browser_auto_operate\",\n children: \"\\u6D4F\\u89C8\\u5668\\u81EA\\u52A8\\u64CD\\u4F5C\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 174,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 172,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 168,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"API\\u63D0\\u4F9B\\u65B9\",\n name: \"api_provider\",\n children: /*#__PURE__*/_jsxDEV(Select, {\n children: [/*#__PURE__*/_jsxDEV(Option, {\n value: \"official\",\n children: \"\\u5B98\\u65B9\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 183,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(Option, {\n value: \"302ai\",\n children: \"302AI\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 184,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(Option, {\n value: \"official_api\",\n children: \"\\u5B98\\u65B9API\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 185,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 182,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 178,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"API\\u8DEF\\u5F84\",\n name: \"api_url_path\",\n children: /*#__PURE__*/_jsxDEV(Input, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 193,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 189,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"\\u64CD\\u4F5C\\u8DEF\\u5F84\\u6570\\u636E\",\n name: \"operate_path_data\",\n children: /*#__PURE__*/_jsxDEV(TextArea, {\n rows: 4\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 200,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 196,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"\\u53C2\\u6570\\u5B9A\\u4E49\",\n name: \"params_definition\",\n children: /*#__PURE__*/_jsxDEV(TextArea, {\n rows: 6\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 207,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 203,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Form.Item, {\n label: \"\\u54CD\\u5E94\\u6570\\u636E\\u8BF4\\u660E\",\n name: \"response_desc\",\n children: /*#__PURE__*/_jsxDEV(TextArea, {\n rows: 4\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 214,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 210,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"button-group\",\n children: [/*#__PURE__*/_jsxDEV(Button, {\n onClick: () => navigate('/tools-library'),\n children: \"\\u53D6\\u6D88\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 218,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(Button, {\n type: \"primary\",\n htmlType: \"submit\",\n loading: saving,\n children: \"\\u4FDD\\u5B58\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 221,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 217,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 107,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 106,\n columnNumber: 9\n }, this) : /*#__PURE__*/_jsxDEV(Card, {\n title: \"\\u5DE5\\u5177\\u8BE6\\u60C5\",\n children: /*#__PURE__*/_jsxDEV(Descriptions, {\n column: 2,\n bordered: true,\n children: [/*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u5DE5\\u5177ID\",\n children: data.tools_id\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 230,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u5DE5\\u5177\\u540D\\u79F0\",\n children: data.tools_name\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 233,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u5DE5\\u5177\\u529F\\u80FD\\u540D\\u79F0\",\n children: data.tools_function_name\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 236,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u5DE5\\u5177\\u5168\\u79F0\",\n children: data.tools_full_name\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 239,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u5DE5\\u5177\\u7248\\u672C\",\n children: /*#__PURE__*/_jsxDEV(Tag, {\n color: \"geekblue\",\n children: data.tools_version\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 243,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 242,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u81EA\\u52A8\\u63A5\\u5165\\u4EFB\\u52A1ID\",\n children: data.access_task_id\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 245,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u72B6\\u6001\",\n children: /*#__PURE__*/_jsxDEV(Tag, {\n color: getStatusColor(data.status),\n children: getStatusText(data.status)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 249,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 248,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u8C03\\u7528\\u65B9\\u5F0F\",\n children: /*#__PURE__*/_jsxDEV(Tag, {\n color: \"blue\",\n children: getCallTypeText(data.call_type)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 254,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 253,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"API\\u63D0\\u4F9B\\u65B9\",\n children: /*#__PURE__*/_jsxDEV(Tag, {\n color: \"purple\",\n children: getApiProviderText(data.api_provider)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 257,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 256,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"API\\u8DEF\\u5F84\",\n children: data.api_url_path\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 259,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u5DE5\\u5177\\u63CF\\u8FF0\",\n span: 2,\n children: data.tools_desc\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 262,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u64CD\\u4F5C\\u8DEF\\u5F84\\u6570\\u636E\",\n span: 2,\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n maxHeight: '200px',\n overflow: 'auto'\n },\n children: /*#__PURE__*/_jsxDEV(\"pre\", {\n style: {\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word'\n },\n children: data.operate_path_data || '无'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 267,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 266,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 265,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u53C2\\u6570\\u5B9A\\u4E49\",\n span: 2,\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n maxHeight: '200px',\n overflow: 'auto'\n },\n children: /*#__PURE__*/_jsxDEV(\"pre\", {\n style: {\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word'\n },\n children: data.params_definition || '无'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 274,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 273,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 272,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u54CD\\u5E94\\u6570\\u636E\\u8BF4\\u660E\",\n span: 2,\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n maxHeight: '200px',\n overflow: 'auto'\n },\n children: /*#__PURE__*/_jsxDEV(\"pre\", {\n style: {\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word'\n },\n children: data.response_desc || '无'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 281,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 280,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 279,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u521B\\u5EFA\\u65F6\\u95F4\",\n children: moment(data.create_time).format('YYYY-MM-DD HH:mm:ss')\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 286,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Descriptions.Item, {\n label: \"\\u66F4\\u65B0\\u65F6\\u95F4\",\n children: moment(data.update_time).format('YYYY-MM-DD HH:mm:ss')\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 289,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 229,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 228,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 96,\n columnNumber: 5\n }, this);\n};\n_s(ToolsLibraryDetail, \"zaoVSOc9hXK/wTbAg7QOfM3lMK4=\", false, function () {\n return [Form.useForm, useParams, useNavigate, useLocation];\n});\n_c = ToolsLibraryDetail;\nexport default ToolsLibraryDetail;\nvar _c;\n$RefreshReg$(_c, \"ToolsLibraryDetail\");","map":{"version":3,"names":["React","useState","useEffect","Form","Input","Select","Button","Card","Descriptions","Tag","message","Spin","useParams","useNavigate","useLocation","ArrowLeftOutlined","toolsLibraryApi","moment","jsxDEV","_jsxDEV","TextArea","Option","ToolsLibraryDetail","_s","form","useForm","data","setData","loading","setLoading","saving","setSaving","id","navigate","location","isEditMode","search","includes","getStatusColor","status","statusMap","getStatusText","getCallTypeText","type","typeMap","getApiProviderText","provider","providerMap","fetchData","response","getDetail","setFieldsValue","error","handleSave","values","update","success","style","textAlign","padding","children","size","fileName","_jsxFileName","lineNumber","columnNumber","className","icon","onClick","marginBottom","title","layout","onFinish","Item","label","name","rules","required","rows","value","htmlType","column","bordered","tools_id","tools_name","tools_function_name","tools_full_name","color","tools_version","access_task_id","call_type","api_provider","api_url_path","span","tools_desc","maxHeight","overflow","whiteSpace","wordBreak","operate_path_data","params_definition","response_desc","create_time","format","update_time","_c","$RefreshReg$"],"sources":["/Users/max_liu/max_liu/company/tools_auto_pt/src/pages/ToolsLibraryDetail.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { Form, Input, Select, Button, Card, Descriptions, Tag, message, Spin } from 'antd';\nimport { useParams, useNavigate, useLocation } from 'react-router-dom';\nimport { ArrowLeftOutlined } from '@ant-design/icons';\nimport { toolsLibraryApi } from '../services/api';\nimport moment from 'moment';\n\nconst { TextArea } = Input;\nconst { Option } = Select;\n\nconst ToolsLibraryDetail = () => {\n const [form] = Form.useForm();\n const [data, setData] = useState(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const { id } = useParams();\n const navigate = useNavigate();\n const location = useLocation();\n const isEditMode = location.search.includes('mode=edit');\n\n const getStatusColor = (status) => {\n const statusMap = {\n 'normal': 'success',\n 'offline': 'default',\n };\n return statusMap[status] || 'warning';\n };\n\n const getStatusText = (status) => {\n const statusMap = {\n 'normal': '正常',\n 'offline': '已下线',\n };\n return statusMap[status] || status;\n };\n\n const getCallTypeText = (type) => {\n const typeMap = {\n 'api': 'API调用',\n 'browser_auto_operate': '浏览器自动操作',\n };\n return typeMap[type] || type;\n };\n\n const getApiProviderText = (provider) => {\n const providerMap = {\n 'official': '官方',\n '302ai': '302AI',\n 'official_api': '官方API',\n };\n return providerMap[provider] || provider;\n };\n\n const fetchData = async () => {\n try {\n const response = await toolsLibraryApi.getDetail(id);\n setData(response.data);\n form.setFieldsValue(response.data);\n } catch (error) {\n message.error('获取详情失败');\n } finally {\n setLoading(false);\n }\n };\n\n const handleSave = async (values) => {\n setSaving(true);\n try {\n await toolsLibraryApi.update(id, values);\n message.success('更新成功');\n navigate('/tools-library');\n } catch (error) {\n message.error('更新失败');\n } finally {\n setSaving(false);\n }\n };\n\n useEffect(() => {\n fetchData();\n }, [id]);\n\n if (loading) {\n return (\n
\n {data.operate_path_data || '无'}\n\n
\n {data.params_definition || '无'}\n\n
\n {data.response_desc || '无'}\n\n