import { isEqual } from "@guanghechen/equal"; import { useStateValue } from "@guanghechen/react-viewmodel"; import type { Node } from "@yozora/ast"; import React from "react"; import type { INodeRenderer, INodeRendererMap } from "./context"; import { useNodeRendererContext } from "./context"; export interface INodesRendererProps { /** * Ast nodes. */ nodes?: Node[]; } export const NodesRenderer: React.FC = props => { const { nodes } = props; const { viewmodel } = useNodeRendererContext(); const rendererMap: Readonly = useStateValue(viewmodel.rendererMap$); if (!Array.isArray(nodes) || nodes.length <= 0) return ; return ; }; interface IProps { nodes: Node[]; rendererMap: Readonly; } class NodesRendererInner extends React.Component { public override shouldComponentUpdate(nextProps: Readonly): boolean { const props = this.props; return !isEqual(props.nodes, nextProps.nodes) || props.rendererMap !== nextProps.rendererMap; } public override render(): React.ReactElement { const { nodes, rendererMap } = this.props; return ( {nodes.map((node, index) => { const key = `${node.type}-${index}`; const Renderer: INodeRenderer = rendererMap[node.type] ?? rendererMap._fallback; return ; })} ); } }