import '@/assets/css/pages/tools/create.scss' import { DATABASE_DUPLICATE_KEY, DATABASE_INSERT_SUCCESS, DATABASE_SELECT_SUCCESS } from '@/constants/common.constants' import { r_tool_category_get, r_tool_create, r_tool_template_get, r_tool_template_get_one } from '@/services/tool' import { IImportMap } from '@/components/Playground/shared' import { base64ToFiles, base64ToStr, IMPORT_MAP_FILE_NAME } from '@/components/Playground/files' import compiler from '@/components/Playground/compiler' import FlexBox from '@/components/common/FlexBox' import Card from '@/components/common/Card' import FitFullscreen from '@/components/common/FitFullscreen' import HideScrollbar from '@/components/common/HideScrollbar' import Playground from '@/components/Playground' const Create = () => { const [form] = AntdForm.useForm() const formValues = AntdForm.useWatch([], form) const [templateData, setTemplateData] = useState() const [categoryData, setCategoryData] = useState() const [templateDetailData, setTemplateDetailData] = useState>({}) const [previewTemplate, setPreviewTemplate] = useState('') const [loadingTemplate, setLoadingTemplate] = useState(false) const [loadingCategory, setLoadingCategory] = useState(false) const [creating, setCreating] = useState(false) const [compiledCode, setCompiledCode] = useState('') const handleOnFinish = (toolAddParam: ToolCreateParam) => { setCreating(true) void r_tool_create(toolAddParam) .then((res) => { const response = res.data switch (response.code) { case DATABASE_INSERT_SUCCESS: void message.success( `创建工具 ${response.data!.name}<${response.data!.toolId}>:${response.data!.ver} 成功` ) break case DATABASE_DUPLICATE_KEY: void message.warning('已存在相同 ID 相同版本的应用') setCreating(false) break default: void message.error('创建失败,请稍后重试') setCreating(false) } }) .catch(() => { setCreating(false) }) } const handleOnTemplateChange = (value: string) => { setPreviewTemplate(value) if (templateDetailData[value]) { return } setLoadingTemplate(true) void r_tool_template_get_one(value) .then((res) => { const response = res.data switch (response.code) { case DATABASE_SELECT_SUCCESS: setTemplateDetailData({ ...templateDetailData, [value]: response.data! }) break default: void message.error('获取模板信息失败') } }) .finally(() => { setLoadingTemplate(false) }) } useEffect(() => { const template = templateDetailData[previewTemplate] if (!template) { return } try { const baseDist = base64ToStr(template.base.dist.data!) const files = base64ToFiles(template.source.data!) const importMap = JSON.parse(files[IMPORT_MAP_FILE_NAME].value) as IImportMap void compiler .compile(files, importMap, template.entryPoint) .then((result) => { const output = result.outputFiles[0].text setCompiledCode(`${output}\n${baseDist}`) }) .catch((reason) => { void message.error(`编译失败:${reason}`) }) } catch (e) { void message.error(`载入模板 ${templateDetailData[previewTemplate].name} 失败`) } }, [templateDetailData, previewTemplate]) useEffect(() => { const temp: string[] = [] formValues?.keywords.forEach((item) => { if (item.length <= 10) { temp.push(item) } }) form.setFieldValue('keyword', temp) }, [form, formValues?.keywords]) useEffect(() => { setLoadingTemplate(true) setLoadingCategory(true) void r_tool_template_get() .then((res) => { const response = res.data switch (response.code) { case DATABASE_SELECT_SUCCESS: setTemplateData(response.data!) break default: void message.error('获取模板列表失败,请稍后重试') } }) .finally(() => { setLoadingTemplate(false) }) void r_tool_category_get() .then((res) => { const response = res.data switch (response.code) { case DATABASE_SELECT_SUCCESS: setCategoryData(response.data!) break default: void message.error('获取类别列表失败,请稍后重试') } }) .finally(() => { setLoadingCategory(false) }) }, []) return ( 配置
.<数字>.<数字>', eg. 1.0.3` } ]} > ({ value: value.id, label: value.name }))} loading={loadingTemplate} disabled={loadingTemplate} onChange={handleOnTemplateChange} /> ({ value: value.id, label: value.name }))} loading={loadingCategory} disabled={loadingCategory} /> 创建
预览 {compiledCode && ( )}
) } export default Create