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 INodesRendererProperties { /** * Ast nodes. */ nodes?: Node[]; } export const NodesRenderer: React.FC = properties => { const { nodes } = properties; const { viewmodel } = useNodeRendererContext(); const rendererMap: Readonly = useStateValue(viewmodel.rendererMap$); if (!Array.isArray(nodes) || nodes.length <= 0) return ; return ; }; interface IProperties { nodes: Node[]; rendererMap: Readonly; } class NodesRendererInner extends React.Component { public override shouldComponentUpdate(nextProperties: Readonly): boolean { const properties = this.props; return !isEqual(properties.nodes, nextProperties.nodes) || properties.rendererMap !== nextProperties.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 ; })} ); } }