@mui/x-tree-view 7.0.0-beta.6 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/CHANGELOG.md +311 -12
  2. package/README.md +1 -1
  3. package/RichTreeView/RichTreeView.js +34 -36
  4. package/RichTreeView/RichTreeView.types.d.ts +3 -2
  5. package/SimpleTreeView/SimpleTreeView.js +25 -26
  6. package/TreeItem/TreeItem.js +94 -82
  7. package/TreeItem/TreeItem.types.d.ts +13 -11
  8. package/TreeItem/TreeItemContent.d.ts +7 -7
  9. package/TreeItem/TreeItemContent.js +10 -10
  10. package/TreeItem/useTreeItemState.d.ts +1 -1
  11. package/TreeItem/useTreeItemState.js +13 -13
  12. package/TreeItem2/TreeItem2.d.ts +18 -0
  13. package/TreeItem2/TreeItem2.js +300 -0
  14. package/TreeItem2/TreeItem2.types.d.ts +64 -0
  15. package/TreeItem2/TreeItem2.types.js +1 -0
  16. package/TreeItem2/index.d.ts +2 -0
  17. package/TreeItem2/index.js +1 -0
  18. package/TreeItem2/package.json +6 -0
  19. package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
  20. package/TreeItem2Icon/TreeItem2Icon.js +67 -0
  21. package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
  22. package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
  23. package/TreeItem2Icon/index.d.ts +2 -0
  24. package/TreeItem2Icon/index.js +1 -0
  25. package/TreeItem2Icon/package.json +6 -0
  26. package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
  27. package/TreeItem2Provider/TreeItem2Provider.js +24 -0
  28. package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
  29. package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
  30. package/TreeItem2Provider/index.d.ts +2 -0
  31. package/TreeItem2Provider/index.js +1 -0
  32. package/TreeItem2Provider/package.json +6 -0
  33. package/TreeView/TreeView.d.ts +1 -1
  34. package/TreeView/TreeView.js +23 -23
  35. package/hooks/index.d.ts +1 -0
  36. package/hooks/index.js +2 -1
  37. package/hooks/useTreeItem2Utils/index.d.ts +1 -0
  38. package/hooks/useTreeItem2Utils/index.js +1 -0
  39. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
  40. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
  41. package/index.d.ts +5 -1
  42. package/index.js +9 -2
  43. package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
  44. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
  45. package/internals/hooks/useInstanceEventHandler.js +5 -10
  46. package/internals/hooks/useLazyRef.d.ts +1 -2
  47. package/internals/hooks/useLazyRef.js +1 -11
  48. package/internals/hooks/useOnMount.d.ts +1 -2
  49. package/internals/hooks/useOnMount.js +1 -7
  50. package/internals/hooks/useTimeout.d.ts +1 -11
  51. package/internals/hooks/useTimeout.js +1 -36
  52. package/internals/models/plugin.d.ts +19 -16
  53. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +31 -38
  54. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +14 -14
  55. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +67 -51
  56. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
  57. package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  58. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
  59. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -31
  60. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +2 -2
  61. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +75 -80
  62. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -1
  63. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +26 -31
  64. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +11 -11
  65. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +47 -50
  66. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -15
  67. package/internals/useTreeView/useTreeView.js +28 -27
  68. package/internals/useTreeView/useTreeView.utils.d.ts +2 -2
  69. package/internals/useTreeView/useTreeView.utils.js +22 -22
  70. package/internals/utils/extractPluginParamsFromProps.js +2 -2
  71. package/internals/utils/utils.js +1 -0
  72. package/modern/RichTreeView/RichTreeView.js +29 -29
  73. package/modern/SimpleTreeView/SimpleTreeView.js +23 -23
  74. package/modern/TreeItem/TreeItem.js +83 -70
  75. package/modern/TreeItem/TreeItemContent.js +10 -10
  76. package/modern/TreeItem/useTreeItemState.js +13 -13
  77. package/modern/TreeItem2/TreeItem2.js +300 -0
  78. package/modern/TreeItem2/TreeItem2.types.js +1 -0
  79. package/modern/TreeItem2/index.js +1 -0
  80. package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
  81. package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
  82. package/modern/TreeItem2Icon/index.js +1 -0
  83. package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
  84. package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
  85. package/modern/TreeItem2Provider/index.js +1 -0
  86. package/modern/TreeView/TreeView.js +23 -23
  87. package/modern/hooks/index.js +2 -1
  88. package/modern/hooks/useTreeItem2Utils/index.js +1 -0
  89. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
  90. package/modern/index.js +9 -2
  91. package/modern/internals/hooks/useLazyRef.js +1 -11
  92. package/modern/internals/hooks/useOnMount.js +1 -7
  93. package/modern/internals/hooks/useTimeout.js +1 -36
  94. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
  95. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
  96. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  97. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
  98. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
  99. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
  100. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
  101. package/modern/internals/useTreeView/useTreeView.js +28 -27
  102. package/modern/internals/useTreeView/useTreeView.utils.js +22 -22
  103. package/modern/internals/utils/utils.js +1 -0
  104. package/modern/useTreeItem2/index.js +1 -0
  105. package/modern/useTreeItem2/useTreeItem2.js +146 -0
  106. package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
  107. package/node/RichTreeView/RichTreeView.js +29 -29
  108. package/node/SimpleTreeView/SimpleTreeView.js +23 -23
  109. package/node/TreeItem/TreeItem.js +83 -70
  110. package/node/TreeItem/TreeItemContent.js +10 -10
  111. package/node/TreeItem/useTreeItemState.js +13 -13
  112. package/node/TreeItem2/TreeItem2.js +308 -0
  113. package/node/TreeItem2/TreeItem2.types.js +5 -0
  114. package/node/TreeItem2/index.js +42 -0
  115. package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
  116. package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
  117. package/node/TreeItem2Icon/index.js +12 -0
  118. package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
  119. package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
  120. package/node/TreeItem2Provider/index.js +12 -0
  121. package/node/TreeView/TreeView.js +23 -23
  122. package/node/hooks/index.js +8 -1
  123. package/node/hooks/useTreeItem2Utils/index.js +12 -0
  124. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
  125. package/node/index.js +61 -13
  126. package/node/internals/hooks/useLazyRef.js +7 -13
  127. package/node/internals/hooks/useOnMount.js +8 -10
  128. package/node/internals/hooks/useTimeout.js +7 -37
  129. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
  130. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
  131. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  132. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
  133. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
  134. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
  135. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
  136. package/node/internals/useTreeView/useTreeView.js +28 -27
  137. package/node/internals/useTreeView/useTreeView.utils.js +22 -22
  138. package/node/internals/utils/utils.js +1 -0
  139. package/node/useTreeItem2/index.js +12 -0
  140. package/node/useTreeItem2/useTreeItem2.js +154 -0
  141. package/node/useTreeItem2/useTreeItem2.types.js +5 -0
  142. package/package.json +5 -5
  143. package/themeAugmentation/components.d.ts +5 -0
  144. package/themeAugmentation/overrides.d.ts +1 -0
  145. package/themeAugmentation/props.d.ts +2 -0
  146. package/useTreeItem2/index.d.ts +2 -0
  147. package/useTreeItem2/index.js +1 -0
  148. package/useTreeItem2/package.json +6 -0
  149. package/useTreeItem2/useTreeItem2.d.ts +2 -0
  150. package/useTreeItem2/useTreeItem2.js +146 -0
  151. package/useTreeItem2/useTreeItem2.types.d.ts +115 -0
  152. package/useTreeItem2/useTreeItem2.types.js +1 -0
@@ -5,6 +5,22 @@ import ownerDocument from '@mui/utils/ownerDocument';
5
5
  import { populateInstance, populatePublicAPI } from '../../useTreeView/useTreeView.utils';
6
6
  import { useInstanceEventHandler } from '../../hooks/useInstanceEventHandler';
7
7
  import { getActiveElement } from '../../utils/utils';
8
+ const useTabbableItemId = (instance, selectedItems) => {
9
+ const isItemVisible = itemId => {
10
+ const node = instance.getNode(itemId);
11
+ return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
12
+ };
13
+ let tabbableItemId;
14
+ if (Array.isArray(selectedItems)) {
15
+ tabbableItemId = selectedItems.find(isItemVisible);
16
+ } else if (selectedItems != null && isItemVisible(selectedItems)) {
17
+ tabbableItemId = selectedItems;
18
+ }
19
+ if (tabbableItemId == null) {
20
+ tabbableItemId = instance.getNavigableChildrenIds(null)[0];
21
+ }
22
+ return tabbableItemId;
23
+ };
8
24
  export const useTreeViewFocus = ({
9
25
  instance,
10
26
  publicAPI,
@@ -14,92 +30,92 @@ export const useTreeViewFocus = ({
14
30
  models,
15
31
  rootRef
16
32
  }) => {
17
- const setFocusedNodeId = useEventCallback(nodeId => {
18
- const cleanNodeId = typeof nodeId === 'function' ? nodeId(state.focusedNodeId) : nodeId;
19
- if (state.focusedNodeId !== cleanNodeId) {
33
+ const tabbableItemId = useTabbableItemId(instance, models.selectedItems.value);
34
+ const setFocusedItemId = useEventCallback(itemId => {
35
+ const cleanItemId = typeof itemId === 'function' ? itemId(state.focusedNodeId) : itemId;
36
+ if (state.focusedNodeId !== cleanItemId) {
20
37
  setState(prevState => _extends({}, prevState, {
21
- focusedNodeId: cleanNodeId
38
+ focusedNodeId: cleanItemId
22
39
  }));
23
40
  }
24
41
  });
25
- const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current === getActiveElement(ownerDocument(rootRef.current)), [rootRef]);
26
- const isNodeFocused = React.useCallback(nodeId => state.focusedNodeId === nodeId && isTreeViewFocused(), [state.focusedNodeId, isTreeViewFocused]);
27
- const isNodeVisible = nodeId => {
28
- const node = instance.getNode(nodeId);
42
+ const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current.contains(getActiveElement(ownerDocument(rootRef.current))), [rootRef]);
43
+ const isNodeFocused = React.useCallback(itemId => state.focusedNodeId === itemId && isTreeViewFocused(), [state.focusedNodeId, isTreeViewFocused]);
44
+ const isNodeVisible = itemId => {
45
+ const node = instance.getNode(itemId);
29
46
  return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
30
47
  };
31
- const focusNode = useEventCallback((event, nodeId) => {
32
- // if we receive a nodeId, and it is visible, the focus will be set to it
33
- if (nodeId && isNodeVisible(nodeId)) {
34
- if (!isTreeViewFocused()) {
35
- instance.focusRoot();
36
- }
37
- setFocusedNodeId(nodeId);
38
- if (params.onNodeFocus) {
39
- params.onNodeFocus(event, nodeId);
40
- }
48
+ const innerFocusItem = (event, itemId) => {
49
+ const node = instance.getNode(itemId);
50
+ const itemElement = document.getElementById(instance.getTreeItemId(itemId, node.idAttribute));
51
+ if (itemElement) {
52
+ itemElement.focus();
53
+ }
54
+ setFocusedItemId(itemId);
55
+ if (params.onItemFocus) {
56
+ params.onItemFocus(event, itemId);
57
+ }
58
+ };
59
+ const focusItem = useEventCallback((event, nodeId) => {
60
+ // If we receive a nodeId, and it is visible, the focus will be set to it
61
+ if (isNodeVisible(nodeId)) {
62
+ innerFocusItem(event, nodeId);
41
63
  }
42
64
  });
43
65
  const focusDefaultNode = useEventCallback(event => {
44
66
  let nodeToFocusId;
45
- if (Array.isArray(models.selectedNodes.value)) {
46
- nodeToFocusId = models.selectedNodes.value.find(isNodeVisible);
47
- } else if (models.selectedNodes.value != null && isNodeVisible(models.selectedNodes.value)) {
48
- nodeToFocusId = models.selectedNodes.value;
67
+ if (Array.isArray(models.selectedItems.value)) {
68
+ nodeToFocusId = models.selectedItems.value.find(isNodeVisible);
69
+ } else if (models.selectedItems.value != null && isNodeVisible(models.selectedItems.value)) {
70
+ nodeToFocusId = models.selectedItems.value;
49
71
  }
50
72
  if (nodeToFocusId == null) {
51
73
  nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
52
74
  }
53
- setFocusedNodeId(nodeToFocusId);
54
- if (params.onNodeFocus) {
55
- params.onNodeFocus(event, nodeToFocusId);
56
- }
75
+ innerFocusItem(event, nodeToFocusId);
57
76
  });
58
- const focusRoot = useEventCallback(() => {
59
- var _rootRef$current;
60
- (_rootRef$current = rootRef.current) == null || _rootRef$current.focus({
61
- preventScroll: true
62
- });
77
+ const removeFocusedItem = useEventCallback(() => {
78
+ if (state.focusedNodeId == null) {
79
+ return;
80
+ }
81
+ const node = instance.getNode(state.focusedNodeId);
82
+ const itemElement = document.getElementById(instance.getTreeItemId(state.focusedNodeId, node.idAttribute));
83
+ if (itemElement) {
84
+ itemElement.blur();
85
+ }
86
+ setFocusedItemId(null);
63
87
  });
88
+ const canItemBeTabbed = itemId => itemId === tabbableItemId;
64
89
  populateInstance(instance, {
65
90
  isNodeFocused,
66
- focusNode,
67
- focusRoot,
68
- focusDefaultNode
91
+ canItemBeTabbed,
92
+ focusItem,
93
+ focusDefaultNode,
94
+ removeFocusedItem
69
95
  });
70
96
  populatePublicAPI(publicAPI, {
71
- focusNode
97
+ focusItem
72
98
  });
73
99
  useInstanceEventHandler(instance, 'removeNode', ({
74
100
  id
75
101
  }) => {
76
- setFocusedNodeId(oldFocusedNodeId => {
77
- if (oldFocusedNodeId === id && rootRef.current === ownerDocument(rootRef.current).activeElement) {
78
- return instance.getChildrenIds(null)[0];
79
- }
80
- return oldFocusedNodeId;
81
- });
102
+ if (state.focusedNodeId === id) {
103
+ instance.focusDefaultNode(null);
104
+ }
82
105
  });
83
106
  const createHandleFocus = otherHandlers => event => {
84
- var _otherHandlers$onFocu;
85
- (_otherHandlers$onFocu = otherHandlers.onFocus) == null || _otherHandlers$onFocu.call(otherHandlers, event);
107
+ otherHandlers.onFocus?.(event);
86
108
  // if the event bubbled (which is React specific) we don't want to steal focus
87
109
  if (event.target === event.currentTarget) {
88
110
  instance.focusDefaultNode(event);
89
111
  }
90
112
  };
91
- const createHandleBlur = otherHandlers => event => {
92
- var _otherHandlers$onBlur;
93
- (_otherHandlers$onBlur = otherHandlers.onBlur) == null || _otherHandlers$onBlur.call(otherHandlers, event);
94
- setFocusedNodeId(null);
95
- };
96
113
  const focusedNode = instance.getNode(state.focusedNodeId);
97
114
  const activeDescendant = focusedNode ? instance.getTreeItemId(focusedNode.id, focusedNode.idAttribute) : null;
98
115
  return {
99
116
  getRootProps: otherHandlers => ({
100
117
  onFocus: createHandleFocus(otherHandlers),
101
- onBlur: createHandleBlur(otherHandlers),
102
- 'aria-activedescendant': activeDescendant != null ? activeDescendant : undefined
118
+ 'aria-activedescendant': activeDescendant ?? undefined
103
119
  })
104
120
  };
105
121
  };
@@ -107,5 +123,5 @@ useTreeViewFocus.getInitialState = () => ({
107
123
  focusedNodeId: null
108
124
  });
109
125
  useTreeViewFocus.params = {
110
- onNodeFocus: true
126
+ onItemFocus: true
111
127
  };
@@ -5,21 +5,22 @@ import type { UseTreeViewNodesSignature } from '../useTreeViewNodes';
5
5
  import type { UseTreeViewSelectionSignature } from '../useTreeViewSelection';
6
6
  import { UseTreeViewExpansionSignature } from '../useTreeViewExpansion';
7
7
  export interface UseTreeViewFocusInstance {
8
- isNodeFocused: (nodeId: string) => boolean;
9
- focusNode: (event: React.SyntheticEvent, nodeId: string | null) => void;
10
- focusDefaultNode: (event: React.SyntheticEvent) => void;
11
- focusRoot: () => void;
8
+ isNodeFocused: (itemId: string) => boolean;
9
+ canItemBeTabbed: (itemId: string) => boolean;
10
+ focusItem: (event: React.SyntheticEvent, nodeId: string) => void;
11
+ focusDefaultNode: (event: React.SyntheticEvent | null) => void;
12
+ removeFocusedItem: () => void;
12
13
  }
13
- export interface UseTreeViewFocusPublicAPI extends Pick<UseTreeViewFocusInstance, 'focusNode'> {
14
+ export interface UseTreeViewFocusPublicAPI extends Pick<UseTreeViewFocusInstance, 'focusItem'> {
14
15
  }
15
16
  export interface UseTreeViewFocusParameters {
16
17
  /**
17
18
  * Callback fired when tree items are focused.
18
19
  * @param {React.SyntheticEvent} event The event source of the callback **Warning**: This is a generic event not a focus event.
19
- * @param {string} nodeId The id of the node focused.
20
- * @param {string} value of the focused node.
20
+ * @param {string} itemId The id of the focused item.
21
+ * @param {string} value of the focused item.
21
22
  */
22
- onNodeFocus?: (event: React.SyntheticEvent, nodeId: string) => void;
23
+ onItemFocus?: (event: React.SyntheticEvent | null, itemId: string) => void;
23
24
  }
24
25
  export type UseTreeViewFocusDefaultizedParameters = UseTreeViewFocusParameters;
25
26
  export interface UseTreeViewFocusState {
@@ -6,7 +6,7 @@ export const useTreeViewId = ({
6
6
  params
7
7
  }) => {
8
8
  const treeId = useId(params.id);
9
- const getTreeItemId = React.useCallback((nodeId, idAttribute) => idAttribute != null ? idAttribute : `${treeId}-${nodeId}`, [treeId]);
9
+ const getTreeItemId = React.useCallback((itemId, idAttribute) => idAttribute ?? `${treeId}-${itemId}`, [treeId]);
10
10
  populateInstance(instance, {
11
11
  getTreeItemId
12
12
  });
@@ -1,6 +1,6 @@
1
1
  import { TreeViewPluginSignature } from '../../models';
2
2
  export interface UseTreeViewIdInstance {
3
- getTreeItemId: (nodeId: string, idAttribute: string | undefined) => string;
3
+ getTreeItemId: (itemId: string, idAttribute: string | undefined) => string;
4
4
  }
5
5
  export interface UseTreeViewIdParameters {
6
6
  /**
@@ -32,12 +32,12 @@ export const useTreeViewJSXNodes = ({
32
32
  });
33
33
  });
34
34
  });
35
- const removeJSXNode = useEventCallback(nodeId => {
35
+ const removeJSXNode = useEventCallback(itemId => {
36
36
  setState(prevState => {
37
37
  const newNodeMap = _extends({}, prevState.nodes.nodeMap);
38
38
  const newItemMap = _extends({}, prevState.nodes.itemMap);
39
- delete newNodeMap[nodeId];
40
- delete newItemMap[nodeId];
39
+ delete newNodeMap[itemId];
40
+ delete newItemMap[itemId];
41
41
  return _extends({}, prevState, {
42
42
  nodes: _extends({}, prevState.nodes, {
43
43
  nodeMap: newNodeMap,
@@ -46,18 +46,18 @@ export const useTreeViewJSXNodes = ({
46
46
  });
47
47
  });
48
48
  publishTreeViewEvent(instance, 'removeNode', {
49
- id: nodeId
49
+ id: itemId
50
50
  });
51
51
  });
52
- const mapFirstCharFromJSX = useEventCallback((nodeId, firstChar) => {
52
+ const mapFirstCharFromJSX = useEventCallback((itemId, firstChar) => {
53
53
  instance.updateFirstCharMap(firstCharMap => {
54
- firstCharMap[nodeId] = firstChar;
54
+ firstCharMap[itemId] = firstChar;
55
55
  return firstCharMap;
56
56
  });
57
57
  return () => {
58
58
  instance.updateFirstCharMap(firstCharMap => {
59
59
  const newMap = _extends({}, firstCharMap);
60
- delete newMap[nodeId];
60
+ delete newMap[itemId];
61
61
  return newMap;
62
62
  });
63
63
  };
@@ -70,15 +70,15 @@ export const useTreeViewJSXNodes = ({
70
70
  };
71
71
  const useTreeViewJSXNodesItemPlugin = ({
72
72
  props,
73
- ref
73
+ rootRef,
74
+ contentRef
74
75
  }) => {
75
76
  const {
76
77
  children,
77
78
  disabled = false,
78
79
  label,
79
- nodeId,
80
- id,
81
- ContentProps: inContentProps
80
+ itemId,
81
+ id
82
82
  } = props;
83
83
  const {
84
84
  instance
@@ -91,12 +91,13 @@ const useTreeViewJSXNodesItemPlugin = ({
91
91
  };
92
92
  const expandable = isExpandable(children);
93
93
  const [treeItemElement, setTreeItemElement] = React.useState(null);
94
- const contentRef = React.useRef(null);
95
- const handleRef = useForkRef(setTreeItemElement, ref);
94
+ const pluginContentRef = React.useRef(null);
95
+ const handleRootRef = useForkRef(setTreeItemElement, rootRef);
96
+ const handleContentRef = useForkRef(pluginContentRef, contentRef);
96
97
  const descendant = React.useMemo(() => ({
97
98
  element: treeItemElement,
98
- id: nodeId
99
- }), [nodeId, treeItemElement]);
99
+ id: itemId
100
+ }), [itemId, treeItemElement]);
100
101
  const {
101
102
  index,
102
103
  parentId
@@ -105,36 +106,34 @@ const useTreeViewJSXNodesItemPlugin = ({
105
106
  // On the first render a node's index will be -1. We want to wait for the real index.
106
107
  if (index !== -1) {
107
108
  instance.insertJSXNode({
108
- id: nodeId,
109
+ id: itemId,
109
110
  idAttribute: id,
110
111
  index,
111
112
  parentId,
112
113
  expandable,
113
114
  disabled
114
115
  });
115
- return () => instance.removeJSXNode(nodeId);
116
+ return () => instance.removeJSXNode(itemId);
116
117
  }
117
118
  return undefined;
118
- }, [instance, parentId, index, nodeId, expandable, disabled, id]);
119
+ }, [instance, parentId, index, itemId, expandable, disabled, id]);
119
120
  React.useEffect(() => {
120
121
  if (label) {
121
- var _contentRef$current$t, _contentRef$current;
122
- return instance.mapFirstCharFromJSX(nodeId, ((_contentRef$current$t = (_contentRef$current = contentRef.current) == null ? void 0 : _contentRef$current.textContent) != null ? _contentRef$current$t : '').substring(0, 1).toLowerCase());
122
+ return instance.mapFirstCharFromJSX(itemId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
123
123
  }
124
124
  return undefined;
125
- }, [instance, nodeId, label]);
125
+ }, [instance, itemId, label]);
126
126
  return {
127
- props: _extends({}, props, {
128
- ContentProps: _extends({}, inContentProps, {
129
- ref: contentRef
130
- })
131
- }),
132
- ref: handleRef,
133
- wrapItem: item => /*#__PURE__*/_jsx(DescendantProvider, {
134
- id: nodeId,
135
- children: item
136
- })
127
+ contentRef: handleContentRef,
128
+ rootRef: handleRootRef
137
129
  };
138
130
  };
139
131
  useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
132
+ useTreeViewJSXNodes.wrapItem = ({
133
+ children,
134
+ itemId
135
+ }) => /*#__PURE__*/_jsx(DescendantProvider, {
136
+ id: itemId,
137
+ children: children
138
+ });
140
139
  useTreeViewJSXNodes.params = {};
@@ -3,8 +3,8 @@ import { UseTreeViewNodesSignature } from '../useTreeViewNodes';
3
3
  import { UseTreeViewKeyboardNavigationSignature } from '../useTreeViewKeyboardNavigation';
4
4
  export interface UseTreeViewNodesInstance {
5
5
  insertJSXNode: (node: TreeViewNode) => void;
6
- removeJSXNode: (nodeId: string) => void;
7
- mapFirstCharFromJSX: (nodeId: string, firstChar: string) => () => void;
6
+ removeJSXNode: (itemId: string) => void;
7
+ mapFirstCharFromJSX: (itemId: string, firstChar: string) => () => void;
8
8
  }
9
9
  export interface UseTreeViewNodesParameters {
10
10
  }