|
import { |
|
memo, |
|
useMemo, |
|
} from 'react' |
|
import type { NodeProps } from 'reactflow' |
|
import type { Node } from '../types' |
|
import { CUSTOM_NODE } from '../constants' |
|
import { |
|
NodeComponentMap, |
|
PanelComponentMap, |
|
} from './constants' |
|
import BaseNode from './_base/node' |
|
import BasePanel from './_base/panel' |
|
|
|
const CustomNode = (props: NodeProps) => { |
|
const nodeData = props.data |
|
const NodeComponent = NodeComponentMap[nodeData.type] |
|
|
|
return ( |
|
<> |
|
<BaseNode { ...props }> |
|
<NodeComponent /> |
|
</BaseNode> |
|
</> |
|
) |
|
} |
|
CustomNode.displayName = 'CustomNode' |
|
|
|
export const Panel = memo((props: Node) => { |
|
const nodeClass = props.type |
|
const nodeData = props.data |
|
const PanelComponent = useMemo(() => { |
|
if (nodeClass === CUSTOM_NODE) |
|
return PanelComponentMap[nodeData.type] |
|
|
|
return () => null |
|
}, [nodeClass, nodeData.type]) |
|
|
|
if (nodeClass === CUSTOM_NODE) { |
|
return ( |
|
<BasePanel key={props.id} {...props}> |
|
<PanelComponent /> |
|
</BasePanel> |
|
) |
|
} |
|
|
|
return null |
|
}) |
|
|
|
Panel.displayName = 'Panel' |
|
|
|
export default memo(CustomNode) |
|
|