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 TreeItem = (props: { itemIndex: TreeItemIndex; parentId: TreeItemIndex; depth: number }): JSX.Element => { 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, props.parentId, props.depth)!; if (item === undefined || renderContext === undefined) { if (!hasBeenRequested) { setHasBeenRequested(true); environment.onMissingItems?.([props.itemIndex]); } return null as any; } const children = item.isFolder && isExpanded && item.children && ( {item.children} ); const title = environment.getItemTitle(item); const titleComponent = renamingItem === props.itemIndex ? ( ) : ( renderers.renderItemTitle({ info: treeInformation, context: renderContext, title, item, }) ); return (renderers.renderItem({ item: environment.items[props.itemIndex], depth: props.depth, title: titleComponent, context: renderContext, info: treeInformation, parentId: props.parentId, children, }) ?? null) as any; // Type to use AllTreeRenderProps };