import React from 'react'; import type { ZoraBaseProps } from '../../../../types/base'; import type { TreeItemNode, TreeItemRenderProps } from '../../../../types/tree-view'; import { IconButton } from '../../../button/public'; import { Icon } from '../../../icon/public'; import { View } from '../../../layout/public'; import { ListItem } from '../../../list/public'; import { withZoraThemeScope } from '../../../theme/adapters/inbound/withZoraThemeScope'; interface TreeItemProps extends ZoraBaseProps { node: TreeItemNode; depth: number; expansionIndicator: 'chevron' | 'folder'; selectedId?: TId; expandedIds: readonly TId[]; onSelect?: (id: TId) => void; onToggleExpand: (id: TId) => void; renderItem?: (props: TreeItemRenderProps) => React.ReactNode; } /*** Render one recursive themed tree row and keep row selection separate from expansion controls. */ function TreeItemInner({ themeId: _themeId, mode: _mode, node, depth, expansionIndicator, selectedId, expandedIds, onSelect, onToggleExpand, renderItem, testID, interactionPolicy, }: TreeItemProps) { const hasChildren = node.children !== undefined && node.children.length > 0; const isExpanded = expandedIds.includes(node.id); const isSelected = selectedId === node.id; /*** Compose custom content or the selectable row independently of the expansion control. */ const renderContent = () => { if (renderItem) { return renderItem({ node, depth, selected: isSelected, expanded: isExpanded, hasChildren, }); } const listItemProps = { title: node.label, leading: expansionIndicator === 'folder' || node.icon === undefined ? undefined : ( ), meta: node.meta, disabled: node.disabled, selected: isSelected, trailing: node.actions, }; return onSelect === undefined ? ( ) : ( onSelect(node.id)} /> ); }; return ( {hasChildren ? ( onToggleExpand(node.id)} size="s" variant="ghost" /> ) : ( {expansionIndicator === 'folder' ? : null} )} {renderContent()} {hasChildren && isExpanded ? ( {node.children?.map((child) => ( ))} ) : null} ); } /*** Single tree node row used within `TreeView`. */ export const TreeItem = withZoraThemeScope(TreeItemInner);