import { Button, message, Modal } from 'antd'; import React, { useCallback, useEffect, useState } from 'react'; import ReactDOM from 'react-dom'; import ReactDOMClient from 'react-dom/client'; import '@chamn/engine/dist/style.css'; import customMaterial from '../meta'; import { Engine, EnginContext, InnerComponentMeta, plugins, LayoutPropsType, collectVariable, flatObject, } from '@chamn/engine'; import { RollbackOutlined } from '@ant-design/icons'; import { EmptyPage } from '@chamn/model'; import pkg from '../../package.json'; import { DesignerPluginInstance } from '@chamn/engine/dist/plugins/Designer/type'; import { getThirdLibs } from '@chamn/render'; import renderAsURL from '../../node_modules/@chamn/render/dist/index.umd.js?url'; import { loader } from '@monaco-editor/react'; loader.config({ paths: { vs: 'https://cdn.bootcdn.net/ajax/libs/monaco-editor/0.37.1/min/vs', }, }); loader.init(); const { DisplaySourceSchema, DEFAULT_PLUGIN_LIST } = plugins; const customRender: LayoutPropsType['customRender'] = async ({ iframe: iframeContainer, assets, page, pageModel, ready, }) => { await iframeContainer.loadUrl('/src/_dev_/render.html'); const iframeWindow = iframeContainer.getWindow()!; const iframeDoc = iframeContainer.getDocument()!; const IframeReact = iframeWindow.React!; const IframeReactDOM = iframeWindow.ReactDOMClient!; const CRender = iframeWindow.CRender!; // 从子窗口获取物料对象 const componentCollection = collectVariable(assets, iframeWindow); const components = flatObject(componentCollection); const thirdLibs = getThirdLibs(componentCollection, page?.thirdLibs || []); const App = IframeReact?.createElement(CRender.DesignRender, { adapter: CRender?.ReactAdapter, page: page, pageModel: pageModel, components, $$context: { thirdLibs, }, onMount: (designRenderInstance) => { ready(designRenderInstance); }, }); IframeReactDOM.createRoot(iframeDoc.getElementById('app')!).render(App); }; // console.log('customMaterial', customMaterial.setter); const win = window as any; win.React = React; win.ReactDOM = ReactDOM; win.ReactDOMClient = ReactDOMClient; const assetPackagesList = [ { package: pkg.name, globalName: 'AIDCFEMaterialDemo', resources: [], }, ]; export const Editor = () => { const [ready, setReady] = useState(false); const [page, setPage] = useState(EmptyPage); useEffect(() => { // 从本地获取 page schema const localPage = localStorage.getItem('pageSchema'); if (localPage) { setPage(JSON.parse(localPage)); } setReady(true); }, []); const onReady = useCallback(async (ctx: EnginContext) => { const designer = await ctx.pluginManager.get( 'Designer' ); const reloadPage = async () => { setTimeout(() => { const designerExports = designer?.export; designerExports?.reload(); }, 0); }; // 获取 引擎 工作台对象 const workbench = ctx.engine.getWorkbench(); workbench?.openLeftPanel('ComponentLib'); // 自定义顶部 bar workbench?.replaceTopBarView(
Chameleon EG
), content: (