import React from 'react'; import ReactDom from 'react-dom'; import classnames from 'classnames/bind'; import {connect} from 'react-redux'; import styles from './PlinkArchDiagram.module.scss'; import {getState, Block} from './blockDiagramSlice'; const cx = classnames.bind(styles); const layerCls = cx('layer'); const blockCls = cx('block'); const diagramTableCls = cx('diagramTable'); export type PlinkArchDiagramProps = React.PropsWithChildren<{ containerDom: Element; dataKey: string; }>; const PlinkArchDiagram: React.FC>> = function(props) { // const props = props0 as ReturnType>; const diagram = (
{props.data.map(row => { return renderBlock(row); })}
); return ReactDom.createPortal(diagram, props.containerDom); }; function mapToPropsFactory() { return function mapToProps(rootState: unknown, ownProps: PlinkArchDiagramProps) { const blocks = getState()[ownProps.dataKey]; return { ...ownProps, data: blocks || ([] as Block[]) }; }; } const Connected = connect(mapToPropsFactory)(PlinkArchDiagram); export {Connected as PlinkArchDiagram}; function renderBlock(block: Block | string) { if (typeof block === 'string') { return
{block}
; } if (block.type === 'layer') return
{block.title} { block.children ? block.children.map(child => renderBlock(child)) : '' }
; else return
{ block.content ? ')}}>: {block.children ? block.children.map(child => renderBlock(child)): ''} }
; } function block2Class(block: Block) { if (block.children) { return 'has-children'; } else if (block.content) { return 'has-content'; } else { return 'empty'; } }