import { Fragment, Component, createElement } from 'rax'; // import { observer } from './obx-rax/observer'; import RaxEngine from '@ali/lowcode-rax-renderer/lib/index'; // import RaxEngine from '../../rax-render/lib/index'; import { SimulatorRenderer } from './renderer'; import { host } from './host'; import './renderer.less'; // patch cloneElement avoid lost keyProps const originCloneElement = (window as any).Rax.cloneElement; (window as any).Rax.cloneElement = (child: any, { _leaf, ...props }: any = {}, ...rest: any[]) => { if (child.ref && props.ref) { const dRef = props.ref; const cRef = child.ref; props.ref = (x: any) => { if (cRef) { if (typeof cRef === 'function') { cRef(x); } else { try { cRef.current = x; } catch (e) {} } } if (dRef) { if (typeof dRef === 'function') { dRef(x); } else { try { dRef.current = x; } catch (e) {} } } }; } return originCloneElement(child, props, ...rest); }; export default class SimulatorRendererView extends Component<{ renderer: SimulatorRenderer }> { render() { const { renderer } = this.props; return ( ); } } function ucfirst(s: string) { return s.charAt(0).toUpperCase() + s.substring(1); } function getDeviceView(view: any, device: string, mode: string) { if (!view || typeof view === 'string') { return view; } // compatible vision Mobile | Preview device = ucfirst(device); if (device === 'Mobile' && view.hasOwnProperty(device)) { view = view[device]; } mode = ucfirst(mode); if (mode === 'Preview' && view.hasOwnProperty(mode)) { view = view[mode]; } return view; } // @observer class Layout extends Component<{ renderer: SimulatorRenderer }> { shouldComponentUpdate() { return false; } render() { const { renderer, children } = this.props; const layout = renderer.layout; if (layout) { const { Component, props } = layout; return {children}; } return {children}; } } // @observer class Renderer extends Component<{ renderer: SimulatorRenderer }> { constructor(props: any) { super(props); this.props.renderer.onReRender(() => { this.forceUpdate(); }); } shouldComponentUpdate() { return false; } render() { const { renderer } = this.props; const { device, designMode } = renderer; return ( { renderer.mountInstance(schema.id, ref); }} customCreateElement={(Component: any, props: any, children: any) => { const { __id, __desingMode, ...viewProps } = props; viewProps.componentId = __id; const leaf = host.document.getNode(__id); viewProps._leaf = leaf; viewProps._componentName = leaf?.componentName; // if (viewProps._componentName === 'Menu') { // Object.assign(viewProps, { // _componentName: 'Menu', // className: '_css_pesudo_menu_kbrzyh0f', // context: { VE: (window as any).VisualLowCodeRenderer }, // direction: undefined, // events: { ignored: true }, // fieldId: 'menu_kbrzyh0f', // footer: '', // header: '', // mode: 'inline', // onItemClick: { ignored: true }, // onSelect: { ignored: true }, // popupAlign: 'follow', // selectMode: false, // triggerType: 'click', // }); // console.info('menuprops', viewProps); // } return createElement( getDeviceView(Component, device, designMode), viewProps, leaf?.isContainer() ? (children == null ? [] : Array.isArray(children) ? children : [children]) : null, ); }} /> ); } }