import * as React from 'react'; import { useContext, useEffect } from 'react'; import { ControlledTreeEnvironmentProps, TreeEnvironmentContextProps, TreeEnvironmentRef, } from '../types'; import { InteractionManagerProvider } from './InteractionManagerProvider'; import { DragAndDropProvider } from '../drag/DragAndDropProvider'; import { EnvironmentActionsProvider } from '../environmentActions/EnvironmentActionsProvider'; import { useControlledTreeEnvironmentProps } from './useControlledTreeEnvironmentProps'; const TreeEnvironmentContext = React.createContext( null as any ); export const useTreeEnvironment = () => useContext(TreeEnvironmentContext); export const ControlledTreeEnvironment = React.forwardRef< TreeEnvironmentRef, ControlledTreeEnvironmentProps >((props, ref) => { const environmentContextProps = useControlledTreeEnvironmentProps(props); const { viewState, onFocusItem } = props; // Make sure that every tree view state has a focused item useEffect(() => { for (const treeId of Object.keys(environmentContextProps.trees)) { const firstItemIndex = props.items[environmentContextProps.trees[treeId].rootItem] ?.children?.[0]; const firstItem = firstItemIndex && props.items[firstItemIndex]; if ( !viewState[treeId]?.focusedItem && environmentContextProps.trees[treeId] && firstItem ) { onFocusItem?.(firstItem, treeId, false); } } }, [environmentContextProps.trees, onFocusItem, props.items, viewState]); return ( {props.children} ); }) as ( p: ControlledTreeEnvironmentProps & { ref?: React.Ref>; } ) => React.ReactElement;