import { notEmpty } from '@difizen/mana-common'; import { ViewInstance } from '@difizen/mana-core'; import { useInject } from '@difizen/mana-observable'; import * as React from 'react'; import type { TreeNodeIconDecoratorProps } from '../tree'; import type { TreeViewDecoration } from '../tree-view-decoration'; import { IconOverlayPosition, TreeViewDecorationStyles } from '../tree-view-decoration'; import type { TreeView } from '../view/tree-view'; import { TreeViewDecorator } from '../view/tree-view-decorator'; export const TreeNodeIconDecorator: React.FC = ( props: TreeNodeIconDecoratorProps, ) => { const treeViewDecorator = useInject(TreeViewDecorator); const treeView = useInject(ViewInstance); const { icon, node } = props; if (icon === null) { return null; } const overlayIcons: React.ReactNode[] = []; new Map( treeViewDecorator .getDecorationData(node, 'iconOverlay') .reverse() .filter(notEmpty) .map( (overlay) => [overlay.position, overlay] as [ IconOverlayPosition, TreeViewDecoration.IconOverlay | TreeViewDecoration.IconClassOverlay, ], ), ).forEach((overlay, position) => { const iconClasses = [ TreeViewDecorationStyles.DECORATOR_SIZE_CLASS, IconOverlayPosition.getStyle(position), ]; const style = (color?: string) => (color === undefined ? {} : { color }); if (overlay.background) { overlayIcons.push( , ); } const overlayIcon = (overlay as TreeViewDecoration.IconOverlay).icon || (overlay as TreeViewDecoration.IconClassOverlay).iconClass; overlayIcons.push( , ); }); if (overlayIcons.length > 0) { return (
{icon} {overlayIcons}
); } return icon as React.ReactElement; };