import React from 'react'; import { TemplateDefinition } from '../models'; export const NodeTemplate = (props) => { // const [activeNode, setActiveNode] = useState({} as ActiveNode); const {activeNode} = props.manifest; // useEffect(() => { // const nodeSub = props.store.query('manifest.activeNode') // .pipe(skipWhile(x => !x)) // .subscribe(setActiveNode); // return () => { // nodeSub.unsubscribe(); // }; // }); let RenderTemplate; if (activeNode) { // COMPONENT AS STRING if (activeNode && typeof activeNode.component === 'function') { const Component = activeNode.component; RenderTemplate = ( ); } else { // COMPONENTS AS TEMPLATE DEFINITION let organisms: {component: any, inputs: any, outputs: any}[] = []; organisms = (activeNode.component as TemplateDefinition).children.map((def) => { const inps = def.inputs || {}; const outs = def.outputs || {}; const localInputs = Object.entries({...activeNode.inputs, ...inps}).reduce((acc, [prop, value]: [string, any]) => { if (!prop.endsWith('$')) { return { ...acc, [prop]: value, }; } return { ...acc, [prop]: props.store.query(value), }; }, {}); const localOutputs = Object.entries({...activeNode.outputs, ...outs}).reduce((acc, [prop, value]: [string, any]) => { return { ...acc, [prop]: value // function }; }, {}); return { component: def.component, inputs: localInputs, outputs: localOutputs // {...props.nodeOutputs, ...outs } }; }); RenderTemplate = ( <> {organisms.map((organism, idx) => ( ))} ); } } else { RenderTemplate = <> } return RenderTemplate; };