import * as React from "react";
import { HTMLProps, useRef } from "react";
import { TreeItemChildren } from "../treeItem/TreeItemChildren";
import { useFocusWithin } from "./useFocusWithin";
import { useTreeKeyboardBindings } from "./useTreeKeyboardBindings";
import { SearchInput } from "../search/SearchInput";
import { useTree } from "./Tree";
import { useTreeEnvironment } from "../controlledEnvironment/ControlledTreeEnvironment";
import { useDragAndDrop } from "../controlledEnvironment/DragAndDropProvider";
import { MaybeLiveDescription } from "./MaybeLiveDescription";
const treeContainerStyle: React.CSSProperties = {
position: "relative",
};
export const TreeManager = (): JSX.Element => {
const { treeId, rootItem, renderers, treeInformation } = useTree();
const { setActiveTree, items, canSearch } = useTreeEnvironment();
const containerRef = useRef(null);
const { abortProgrammaticDrag, onDragLeaveTreeHandler } = useDragAndDrop();
useTreeKeyboardBindings();
useFocusWithin(
containerRef.current,
() => {
setActiveTree(treeId);
},
() => {
setActiveTree((oldTreeId) => (oldTreeId === treeId ? undefined : oldTreeId));
}
);
const rootChildren = items[rootItem].children;
const treeChildren = (
<>
{rootChildren ?? []}
{canSearch && }
>
);
const containerProps: HTMLProps = {
onDragLeave: onDragLeaveTreeHandler,
onMouseDown: abortProgrammaticDrag,
ref: containerRef,
style: treeContainerStyle,
role: "tree",
"aria-label": !treeInformation.treeLabelledBy ? treeInformation.treeLabel : undefined,
"aria-labelledby": treeInformation.treeLabelledBy,
// @ts-expect-error non-standard attribute.
"data-rct-tree": treeId,
};
return renderers.renderTreeContainer({
children: treeChildren,
info: treeInformation,
containerProps,
}) as JSX.Element;
};