import React, { useMemo, useState } from 'react'; import { TreeItemIndex } from '../types'; import { TreeItemChildren } from './TreeItemChildren'; import { useViewState } from '../tree/useViewState'; import { useTree } from '../tree/Tree'; import { useTreeEnvironment } from '../controlledEnvironment/ControlledTreeEnvironment'; import { useTreeItemRenderContext } from './useTreeItemRenderContext'; import { TreeItemRenamingInput } from './TreeItemRenamingInput'; export const TreeItemElement = (props: { itemIndex: TreeItemIndex; depth: number; }): React.ReactElement => { const [hasBeenRequested, setHasBeenRequested] = useState(false); const { renderers, treeInformation, renamingItem } = useTree(); const environment = useTreeEnvironment(); const viewState = useViewState(); const item = environment.items[props.itemIndex]; const isExpanded = useMemo( () => viewState.expandedItems?.includes(props.itemIndex), [props.itemIndex, viewState.expandedItems] ); const renderContext = useTreeItemRenderContext(item)!; if (item === undefined || renderContext === undefined) { if (!hasBeenRequested) { setHasBeenRequested(true); environment.onMissingItems?.([props.itemIndex]); } return null as any; } const shouldRenderChildren = environment.shouldRenderChildren?.(item, renderContext) ?? (item.isFolder && isExpanded); const children = item.children && shouldRenderChildren && ( {item.children} ); const title = environment.getItemTitle(item); const titleComponent = renamingItem === props.itemIndex ? ( ) : ( renderers.renderItemTitle({ info: treeInformation, context: renderContext, title, item, }) ); const arrowComponent = renderers.renderItemArrow({ info: treeInformation, context: renderContext, item: environment.items[props.itemIndex], }); return (renderers.renderItem({ item: environment.items[props.itemIndex], depth: props.depth, title: titleComponent, arrow: arrowComponent, context: renderContext, info: treeInformation, children, }) ?? null) as any; // Type to use AllTreeRenderProps };