import React, {Key, useState} from 'react'; import {useControlledState} from '@react-stately/utils'; import {FocusScope} from '@react-aria/focus'; import {TreeContext, TreeContextValue} from './tree-context'; import {TreeItemRenderer} from './tree-item'; import {renderTree} from './render-tree'; export interface TreeNode { id: number | string; children: TreeNode[]; } interface TreeProps { children: TreeItemRenderer; nodes: T[]; selectedKeys?: Key[]; expandedKeys?: Key[]; defaultExpandedKeys?: Key[]; onExpandedKeysChange?: (value: Key[]) => void; defaultSelectedKeys?: Key[]; onSelectedKeysChange?: (value: Key[]) => void; } export function Tree({ children, nodes, ...props }: TreeProps) { const [expandedKeys, setExpandedKeys] = useControlledState( props.expandedKeys, props.defaultSelectedKeys, props.onExpandedKeysChange ); const [selectedKeys, setSelectedKeys] = useControlledState( props.selectedKeys, props.defaultSelectedKeys, props.onSelectedKeysChange ); const [focusedNode, setFocusedNode] = useState(); const value: TreeContextValue = { expandedKeys, setExpandedKeys, selectedKeys, setSelectedKeys, focusedNode, setFocusedNode, }; return ( ); } interface TreeRootProps { nodes: TreeNode[]; itemRenderer: TreeItemRenderer; } function TreeRoot(props: TreeRootProps) { return (
    {renderTree(props)}
); }