@itwin/presentation-hierarchies-react 2.0.0-alpha.52 → 2.0.0-alpha.54

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 (98) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/lib/esm/presentation-hierarchies-react/Renderers.d.ts +62 -55
  3. package/lib/esm/presentation-hierarchies-react/Renderers.d.ts.map +1 -1
  4. package/lib/esm/presentation-hierarchies-react/TreeNode.d.ts +33 -29
  5. package/lib/esm/presentation-hierarchies-react/TreeNode.d.ts.map +1 -1
  6. package/lib/esm/presentation-hierarchies-react/UseIModelTree.d.ts +27 -16
  7. package/lib/esm/presentation-hierarchies-react/UseIModelTree.d.ts.map +1 -1
  8. package/lib/esm/presentation-hierarchies-react/UseIModelTree.js +181 -54
  9. package/lib/esm/presentation-hierarchies-react/UseIModelTree.js.map +1 -1
  10. package/lib/esm/presentation-hierarchies-react/UseNodeHighlighting.d.ts +12 -6
  11. package/lib/esm/presentation-hierarchies-react/UseNodeHighlighting.d.ts.map +1 -1
  12. package/lib/esm/presentation-hierarchies-react/UseNodeHighlighting.js +54 -49
  13. package/lib/esm/presentation-hierarchies-react/UseNodeHighlighting.js.map +1 -1
  14. package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.d.ts +7 -30
  15. package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.d.ts.map +1 -1
  16. package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.js +116 -74
  17. package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.js.map +1 -1
  18. package/lib/esm/presentation-hierarchies-react/UseTree.d.ts +67 -54
  19. package/lib/esm/presentation-hierarchies-react/UseTree.d.ts.map +1 -1
  20. package/lib/esm/presentation-hierarchies-react/UseTree.js +283 -226
  21. package/lib/esm/presentation-hierarchies-react/UseTree.js.map +1 -1
  22. package/lib/esm/presentation-hierarchies-react/Utils.js +44 -27
  23. package/lib/esm/presentation-hierarchies-react/Utils.js.map +1 -1
  24. package/lib/esm/presentation-hierarchies-react/internal/DisposePolyfill.js +6 -7
  25. package/lib/esm/presentation-hierarchies-react/internal/DisposePolyfill.js.map +1 -1
  26. package/lib/esm/presentation-hierarchies-react/internal/TreeActions.js +271 -298
  27. package/lib/esm/presentation-hierarchies-react/internal/TreeActions.js.map +1 -1
  28. package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.js +91 -82
  29. package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.js.map +1 -1
  30. package/lib/esm/presentation-hierarchies-react/internal/TreeModel.d.ts +3 -47
  31. package/lib/esm/presentation-hierarchies-react/internal/TreeModel.js +114 -151
  32. package/lib/esm/presentation-hierarchies-react/internal/TreeModel.js.map +1 -1
  33. package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts +32 -37
  34. package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts.map +1 -1
  35. package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.js +128 -101
  36. package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.js.map +1 -1
  37. package/lib/esm/presentation-hierarchies-react/internal/Utils.js +29 -44
  38. package/lib/esm/presentation-hierarchies-react/internal/Utils.js.map +1 -1
  39. package/lib/esm/presentation-hierarchies-react/stratakit/ErrorItemRenderer.d.ts +24 -13
  40. package/lib/esm/presentation-hierarchies-react/stratakit/ErrorItemRenderer.d.ts.map +1 -1
  41. package/lib/esm/presentation-hierarchies-react/stratakit/ErrorItemRenderer.js +344 -67
  42. package/lib/esm/presentation-hierarchies-react/stratakit/ErrorItemRenderer.js.map +1 -1
  43. package/lib/esm/presentation-hierarchies-react/stratakit/FlatTreeNode.d.ts +16 -15
  44. package/lib/esm/presentation-hierarchies-react/stratakit/FlatTreeNode.d.ts.map +1 -1
  45. package/lib/esm/presentation-hierarchies-react/stratakit/FlatTreeNode.js +78 -60
  46. package/lib/esm/presentation-hierarchies-react/stratakit/FlatTreeNode.js.map +1 -1
  47. package/lib/esm/presentation-hierarchies-react/stratakit/LocalizationContext.d.ts +122 -117
  48. package/lib/esm/presentation-hierarchies-react/stratakit/LocalizationContext.d.ts.map +1 -1
  49. package/lib/esm/presentation-hierarchies-react/stratakit/LocalizationContext.js +59 -38
  50. package/lib/esm/presentation-hierarchies-react/stratakit/LocalizationContext.js.map +1 -1
  51. package/lib/esm/presentation-hierarchies-react/stratakit/RootErrorRenderer.d.ts +16 -5
  52. package/lib/esm/presentation-hierarchies-react/stratakit/RootErrorRenderer.d.ts.map +1 -1
  53. package/lib/esm/presentation-hierarchies-react/stratakit/RootErrorRenderer.js +161 -35
  54. package/lib/esm/presentation-hierarchies-react/stratakit/RootErrorRenderer.js.map +1 -1
  55. package/lib/esm/presentation-hierarchies-react/stratakit/TreeAction.d.ts +21 -17
  56. package/lib/esm/presentation-hierarchies-react/stratakit/TreeAction.d.ts.map +1 -1
  57. package/lib/esm/presentation-hierarchies-react/stratakit/TreeAction.js +84 -31
  58. package/lib/esm/presentation-hierarchies-react/stratakit/TreeAction.js.map +1 -1
  59. package/lib/esm/presentation-hierarchies-react/stratakit/TreeErrorRenderer.d.ts +22 -14
  60. package/lib/esm/presentation-hierarchies-react/stratakit/TreeErrorRenderer.d.ts.map +1 -1
  61. package/lib/esm/presentation-hierarchies-react/stratakit/TreeErrorRenderer.js +61 -26
  62. package/lib/esm/presentation-hierarchies-react/stratakit/TreeErrorRenderer.js.map +1 -1
  63. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.d.ts +15 -6
  64. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.d.ts.map +1 -1
  65. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.js +75 -25
  66. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.js.map +1 -1
  67. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.d.ts +16 -40
  68. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.d.ts.map +1 -1
  69. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.js +140 -61
  70. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.js.map +1 -1
  71. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenderer.d.ts +14 -42
  72. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenderer.d.ts.map +1 -1
  73. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenderer.js +489 -121
  74. package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenderer.js.map +1 -1
  75. package/lib/esm/presentation-hierarchies-react/stratakit/TreeRenderer.d.ts +58 -55
  76. package/lib/esm/presentation-hierarchies-react/stratakit/TreeRenderer.d.ts.map +1 -1
  77. package/lib/esm/presentation-hierarchies-react/stratakit/TreeRenderer.js +412 -181
  78. package/lib/esm/presentation-hierarchies-react/stratakit/TreeRenderer.js.map +1 -1
  79. package/lib/esm/presentation-hierarchies-react.d.ts +17 -17
  80. package/lib/esm/presentation-hierarchies-react.js +15 -18
  81. package/package.json +17 -14
  82. package/lib/esm/presentation-hierarchies-react/Renderers.js +0 -6
  83. package/lib/esm/presentation-hierarchies-react/Renderers.js.map +0 -1
  84. package/lib/esm/presentation-hierarchies-react/TreeNode.js +0 -6
  85. package/lib/esm/presentation-hierarchies-react/TreeNode.js.map +0 -1
  86. package/lib/esm/presentation-hierarchies-react/Utils.d.ts +0 -8
  87. package/lib/esm/presentation-hierarchies-react/Utils.d.ts.map +0 -1
  88. package/lib/esm/presentation-hierarchies-react/internal/DisposePolyfill.d.ts +0 -2
  89. package/lib/esm/presentation-hierarchies-react/internal/DisposePolyfill.d.ts.map +0 -1
  90. package/lib/esm/presentation-hierarchies-react/internal/TreeActions.d.ts +0 -53
  91. package/lib/esm/presentation-hierarchies-react/internal/TreeActions.d.ts.map +0 -1
  92. package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.d.ts +0 -62
  93. package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.d.ts.map +0 -1
  94. package/lib/esm/presentation-hierarchies-react/internal/TreeModel.d.ts.map +0 -1
  95. package/lib/esm/presentation-hierarchies-react/internal/Utils.d.ts +0 -23
  96. package/lib/esm/presentation-hierarchies-react/internal/Utils.d.ts.map +0 -1
  97. package/lib/esm/presentation-hierarchies-react.d.ts.map +0 -1
  98. package/lib/esm/presentation-hierarchies-react.js.map +0 -1
@@ -1,241 +1,298 @@
1
- /*---------------------------------------------------------------------------------------------
2
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
- * See LICENSE.md in the project root for license terms and full copyright notice.
4
- *--------------------------------------------------------------------------------------------*/
5
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
6
- import { HierarchyNode } from "@itwin/presentation-hierarchies";
7
- import { TreeActions } from "./internal/TreeActions.js";
1
+ import { safeDispose } from "./internal/Utils.js";
8
2
  import { TreeModel } from "./internal/TreeModel.js";
3
+ import { TreeActions } from "./internal/TreeActions.js";
9
4
  import { useUnifiedTreeSelection } from "./internal/UseUnifiedSelection.js";
10
- import { safeDispose } from "./internal/Utils.js";
11
5
  import { useLatest } from "./Utils.js";
6
+ import { c } from "react-compiler-runtime";
7
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
8
+ import { HierarchyNode } from "@itwin/presentation-hierarchies";
9
+
10
+ //#region src/presentation-hierarchies-react/UseTree.ts
12
11
  /**
13
- * A React hook that creates state for a tree component.
14
- *
15
- * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
16
- * component-agnostic result which may be used to render the hierarchy using any UI framework.
17
- *
18
- * See `README.md` for an example
19
- *
20
- * @see `useUnifiedSelectionTree`
21
- * @see `useIModelTree`
22
- * @public
23
- */
24
- export function useTree(props) {
25
- const { getTreeModelNode: _, ...rest } = useTreeInternal(props);
26
- return rest;
12
+ * A React hook that creates state for a tree component.
13
+ *
14
+ * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
15
+ * component-agnostic result which may be used to render the hierarchy using any UI framework.
16
+ *
17
+ * See `README.md` for an example
18
+ *
19
+ * @see `useUnifiedSelectionTree`
20
+ * @see `useIModelTree`
21
+ * @public
22
+ */
23
+ function useTree(props) {
24
+ const $ = c(2);
25
+ const t0 = useTreeInternal(props);
26
+ let rest;
27
+ if ($[0] !== t0) {
28
+ const { getTreeModelNode: _, ...t1 } = t0;
29
+ rest = t1;
30
+ $[0] = t0;
31
+ $[1] = rest;
32
+ } else rest = $[1];
33
+ return rest;
27
34
  }
28
35
  /**
29
- * A React hook that creates state for a tree component, that is integrated with unified selection
30
- * through the given selection storage (previously the storage was provided through the, now
31
- * deprecated, `UnifiedSelectionProvider`).
32
- *
33
- * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
34
- * component-agnostic result which may be used to render the hierarchy using any UI framework.
35
- *
36
- * See `README.md` for an example
37
- *
38
- * @see `useTree`
39
- * @see `useIModelUnifiedSelectionTree`
40
- * @see `UnifiedSelectionProvider`
41
- * @public
42
- */
43
- export function useUnifiedSelectionTree({ sourceName, selectionStorage, createSelectableForGenericNode, ...props }) {
44
- const { getTreeModelNode, ...rest } = useTreeInternal(props);
45
- const selectionProps = useUnifiedTreeSelection({ sourceName, selectionStorage, getTreeModelNode, createSelectableForGenericNode });
46
- if (rest.rootErrorRendererProps === undefined && rest.treeRendererProps?.rootNodes) {
47
- return {
48
- ...rest,
49
- treeRendererProps: {
50
- ...rest.treeRendererProps,
51
- ...selectionProps,
52
- },
53
- };
54
- }
55
- return rest;
36
+ * A React hook that creates state for a tree component, that is integrated with unified selection
37
+ * through the given selection storage (previously the storage was provided through the, now
38
+ * deprecated, `UnifiedSelectionProvider`).
39
+ *
40
+ * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
41
+ * component-agnostic result which may be used to render the hierarchy using any UI framework.
42
+ *
43
+ * See `README.md` for an example
44
+ *
45
+ * @see `useTree`
46
+ * @see `useIModelUnifiedSelectionTree`
47
+ * @see `UnifiedSelectionProvider`
48
+ * @public
49
+ */
50
+ function useUnifiedSelectionTree(t0) {
51
+ const $ = c(19);
52
+ let createSelectableForGenericNode;
53
+ let props;
54
+ let selectionStorage;
55
+ let sourceName;
56
+ if ($[0] !== t0) {
57
+ ({sourceName, selectionStorage, createSelectableForGenericNode, ...props} = t0);
58
+ $[0] = t0;
59
+ $[1] = createSelectableForGenericNode;
60
+ $[2] = props;
61
+ $[3] = selectionStorage;
62
+ $[4] = sourceName;
63
+ } else {
64
+ createSelectableForGenericNode = $[1];
65
+ props = $[2];
66
+ selectionStorage = $[3];
67
+ sourceName = $[4];
68
+ }
69
+ const t1 = useTreeInternal(props);
70
+ let getTreeModelNode;
71
+ let rest;
72
+ if ($[5] !== t1) {
73
+ ({getTreeModelNode, ...rest} = t1);
74
+ $[5] = t1;
75
+ $[6] = getTreeModelNode;
76
+ $[7] = rest;
77
+ } else {
78
+ getTreeModelNode = $[6];
79
+ rest = $[7];
80
+ }
81
+ let t2;
82
+ if ($[8] !== createSelectableForGenericNode || $[9] !== getTreeModelNode || $[10] !== selectionStorage || $[11] !== sourceName) {
83
+ t2 = {
84
+ sourceName,
85
+ selectionStorage,
86
+ getTreeModelNode,
87
+ createSelectableForGenericNode
88
+ };
89
+ $[8] = createSelectableForGenericNode;
90
+ $[9] = getTreeModelNode;
91
+ $[10] = selectionStorage;
92
+ $[11] = sourceName;
93
+ $[12] = t2;
94
+ } else t2 = $[12];
95
+ const selectionProps = useUnifiedTreeSelection(t2);
96
+ if (rest.rootErrorRendererProps === void 0 && rest.treeRendererProps?.rootNodes) {
97
+ let t3;
98
+ if ($[13] !== rest.treeRendererProps || $[14] !== selectionProps) {
99
+ t3 = {
100
+ ...rest.treeRendererProps,
101
+ ...selectionProps
102
+ };
103
+ $[13] = rest.treeRendererProps;
104
+ $[14] = selectionProps;
105
+ $[15] = t3;
106
+ } else t3 = $[15];
107
+ let t4;
108
+ if ($[16] !== rest || $[17] !== t3) {
109
+ t4 = {
110
+ ...rest,
111
+ treeRendererProps: t3
112
+ };
113
+ $[16] = rest;
114
+ $[17] = t3;
115
+ $[18] = t4;
116
+ } else t4 = $[18];
117
+ return t4;
118
+ }
119
+ return rest;
56
120
  }
57
- function useTreeInternal({ getHierarchyProvider, getSearchPaths, onPerformanceMeasured, onHierarchyLimitExceeded, onHierarchyLoadError, }) {
58
- const [state, setState] = useState({
59
- model: { idToNode: new Map(), parentChildMap: new Map(), rootNode: { id: undefined, nodeData: undefined } },
60
- rootNodes: undefined,
61
- });
62
- const onPerformanceMeasuredRef = useLatest(onPerformanceMeasured);
63
- const onHierarchyLimitExceededRef = useLatest(onHierarchyLimitExceeded);
64
- const onHierarchyLoadErrorRef = useLatest(onHierarchyLoadError);
65
- const [actions] = useState(() => new TreeActions((model) => {
66
- const rootNodes = model.parentChildMap.get(undefined) !== undefined ? generateTreeStructure(undefined, model) : undefined;
67
- setState({
68
- model,
69
- rootNodes,
70
- });
71
- }, (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration), (props) => onHierarchyLimitExceededRef.current?.(props), (props) => onHierarchyLoadErrorRef.current?.(props)));
72
- const currentFormatter = useRef();
73
- const [hierarchyProvider, setHierarchyProvider] = useState();
74
- useEffect(() => {
75
- const provider = getHierarchyProvider();
76
- provider.setFormatter(currentFormatter.current);
77
- const removeHierarchyChangedListener = provider.hierarchyChanged.addListener((hierarchyChangeArgs) => {
78
- const shouldDiscardState = hierarchyChangeArgs?.searchChange?.newSearch !== undefined;
79
- actions.reloadTree({ state: shouldDiscardState ? "discard" : "keep" });
80
- });
81
- actions.setHierarchyProvider(provider);
82
- setHierarchyProvider(provider);
83
- return () => {
84
- removeHierarchyChangedListener();
85
- actions.reset();
86
- safeDispose(provider);
87
- };
88
- }, [actions, getHierarchyProvider]);
89
- const [isSearching, setIsSearching] = useState(false);
90
- useEffect(() => {
91
- let disposed = false;
92
- const controller = new AbortController();
93
- void (async () => {
94
- if (!hierarchyProvider) {
95
- return;
96
- }
97
- if (!getSearchPaths) {
98
- hierarchyProvider.setHierarchySearch(undefined);
99
- // reload tree in case hierarchy provider does not use hierarchy search to load initial nodes
100
- actions.reloadTree({ state: "keep" });
101
- setIsSearching(false);
102
- return;
103
- }
104
- setIsSearching(true);
105
- let paths;
106
- try {
107
- paths = await getSearchPaths({ abortSignal: controller.signal });
108
- }
109
- catch {
110
- }
111
- finally {
112
- if (!disposed) {
113
- hierarchyProvider.setHierarchySearch(paths ? { paths } : undefined);
114
- setIsSearching(false);
115
- }
116
- }
117
- })();
118
- return () => {
119
- controller.abort();
120
- disposed = true;
121
- };
122
- }, [hierarchyProvider, getSearchPaths, actions]);
123
- const getTreeModelNode = useCallback((nodeId) => {
124
- return actions.getNode(nodeId);
125
- }, [actions]);
126
- const getNode = useCallback((nodeId) => {
127
- const node = actions.getNode(nodeId);
128
- if (!node || node.id === undefined) {
129
- return undefined;
130
- }
131
- return createTreeNode(node, state.model);
132
- }, [actions, state.model]);
133
- const expandNode = useCallback((nodeId, isExpanded) => {
134
- actions.expandNode(nodeId, isExpanded);
135
- }, [actions]);
136
- const reloadTree = useCallback((options) => {
137
- actions.reloadTree(options);
138
- }, [actions]);
139
- const selectNodes = useCallback((nodeIds, changeType) => {
140
- actions.selectNodes(nodeIds, changeType);
141
- }, [actions]);
142
- const isNodeSelected = useCallback((nodeId) => TreeModel.isNodeSelected(state.model, nodeId), [state]);
143
- const setFormatter = useCallback((formatter) => {
144
- currentFormatter.current = formatter;
145
- /* c8 ignore next 3 */
146
- if (!hierarchyProvider) {
147
- return;
148
- }
149
- hierarchyProvider.setFormatter(formatter);
150
- }, [hierarchyProvider]);
151
- const getHierarchyLevelDetails = useCallback((nodeId) => {
152
- const node = actions.getNode(nodeId);
153
- if (!hierarchyProvider || !node) {
154
- return undefined;
155
- }
156
- const hierarchyNode = node.nodeData;
157
- if (hierarchyNode && HierarchyNode.isGroupingNode(hierarchyNode)) {
158
- return undefined;
159
- }
160
- return {
161
- hierarchyNode,
162
- getInstanceKeysIterator: (props) => hierarchyProvider.getNodeInstanceKeys({
163
- parentNode: hierarchyNode,
164
- instanceFilter: props?.instanceFilter,
165
- hierarchyLevelSizeLimit: props?.hierarchyLevelSizeLimit,
166
- }),
167
- instanceFilter: node.instanceFilter,
168
- setInstanceFilter: (filter) => actions.setInstanceFilter(nodeId, filter),
169
- sizeLimit: node.hierarchyLimit,
170
- setSizeLimit: (value) => actions.setHierarchyLimit(nodeId, value),
171
- };
172
- }, [actions, hierarchyProvider]);
173
- const renderProps = useMemo(() => {
174
- if (state.model.rootNode.error) {
175
- return {
176
- rootErrorRendererProps: {
177
- error: state.model.rootNode.error,
178
- reloadTree,
179
- getHierarchyLevelDetails,
180
- },
181
- };
182
- }
183
- return {
184
- rootErrorRendererProps: undefined,
185
- treeRendererProps: state.rootNodes
186
- ? {
187
- rootNodes: state.rootNodes,
188
- expandNode,
189
- selectNodes,
190
- isNodeSelected,
191
- reloadTree,
192
- getHierarchyLevelDetails,
193
- }
194
- : undefined,
195
- };
196
- }, [expandNode, getHierarchyLevelDetails, isNodeSelected, reloadTree, selectNodes, state.model.rootNode.error, state.rootNodes]);
197
- return {
198
- ...renderProps,
199
- isReloading: !!state.model.rootNode.isLoading || isSearching,
200
- getTreeModelNode,
201
- getNode,
202
- setFormatter,
203
- };
121
+ function useTreeInternal({ getHierarchyProvider, getSearchPaths, onPerformanceMeasured, onHierarchyLimitExceeded, onHierarchyLoadError }) {
122
+ const [state, setState] = useState({
123
+ model: {
124
+ idToNode: /* @__PURE__ */ new Map(),
125
+ parentChildMap: /* @__PURE__ */ new Map(),
126
+ rootNode: {
127
+ id: void 0,
128
+ nodeData: void 0
129
+ }
130
+ },
131
+ rootNodes: void 0
132
+ });
133
+ const onPerformanceMeasuredRef = useLatest(onPerformanceMeasured);
134
+ const onHierarchyLimitExceededRef = useLatest(onHierarchyLimitExceeded);
135
+ const onHierarchyLoadErrorRef = useLatest(onHierarchyLoadError);
136
+ const [actions] = useState(() => new TreeActions((model) => {
137
+ setState({
138
+ model,
139
+ rootNodes: model.parentChildMap.get(void 0) !== void 0 ? generateTreeStructure(void 0, model) : void 0
140
+ });
141
+ }, (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration), (props) => onHierarchyLimitExceededRef.current?.(props), (props_0) => onHierarchyLoadErrorRef.current?.(props_0)));
142
+ const currentFormatter = useRef();
143
+ const [hierarchyProvider, setHierarchyProvider] = useState();
144
+ useEffect(() => {
145
+ const provider = getHierarchyProvider();
146
+ provider.setFormatter(currentFormatter.current);
147
+ const removeHierarchyChangedListener = provider.hierarchyChanged.addListener((hierarchyChangeArgs) => {
148
+ const shouldDiscardState = hierarchyChangeArgs.searchChange?.newSearch !== void 0;
149
+ actions.reloadTree({ state: shouldDiscardState ? "discard" : "keep" });
150
+ });
151
+ actions.setHierarchyProvider(provider);
152
+ setHierarchyProvider(provider);
153
+ return () => {
154
+ removeHierarchyChangedListener();
155
+ actions.reset();
156
+ safeDispose(provider);
157
+ };
158
+ }, [actions, getHierarchyProvider]);
159
+ const [isSearching, setIsSearching] = useState(false);
160
+ useEffect(() => {
161
+ let disposed = false;
162
+ const controller = new AbortController();
163
+ (async () => {
164
+ if (!hierarchyProvider) return;
165
+ if (!getSearchPaths) {
166
+ hierarchyProvider.setHierarchySearch(void 0);
167
+ actions.reloadTree({ state: "keep" });
168
+ setIsSearching(false);
169
+ return;
170
+ }
171
+ setIsSearching(true);
172
+ let paths;
173
+ try {
174
+ paths = await getSearchPaths({ abortSignal: controller.signal });
175
+ } catch {} finally {
176
+ if (!disposed) {
177
+ hierarchyProvider.setHierarchySearch(paths ? { paths } : void 0);
178
+ setIsSearching(false);
179
+ }
180
+ }
181
+ })();
182
+ return () => {
183
+ controller.abort();
184
+ disposed = true;
185
+ };
186
+ }, [
187
+ hierarchyProvider,
188
+ getSearchPaths,
189
+ actions
190
+ ]);
191
+ const getTreeModelNode = useCallback((nodeId) => {
192
+ return actions.getNode(nodeId);
193
+ }, [actions]);
194
+ const getNode = useCallback((nodeId_0) => {
195
+ const node = actions.getNode(nodeId_0);
196
+ if (!node || node.id === void 0) return;
197
+ return createTreeNode(node, state.model);
198
+ }, [actions, state.model]);
199
+ const expandNode = useCallback((nodeId_1, isExpanded) => {
200
+ actions.expandNode(nodeId_1, isExpanded);
201
+ }, [actions]);
202
+ const reloadTree = useCallback((options) => {
203
+ actions.reloadTree(options);
204
+ }, [actions]);
205
+ const selectNodes = useCallback((nodeIds, changeType) => {
206
+ actions.selectNodes(nodeIds, changeType);
207
+ }, [actions]);
208
+ const isNodeSelected = useCallback((nodeId_2) => TreeModel.isNodeSelected(state.model, nodeId_2), [state]);
209
+ const setFormatter = useCallback((formatter) => {
210
+ currentFormatter.current = formatter;
211
+ /* c8 ignore next 3 */
212
+ if (!hierarchyProvider) return;
213
+ hierarchyProvider.setFormatter(formatter);
214
+ }, [hierarchyProvider]);
215
+ const getHierarchyLevelDetails = useCallback((nodeId_3) => {
216
+ const node_0 = actions.getNode(nodeId_3);
217
+ if (!hierarchyProvider || !node_0) return;
218
+ const hierarchyNode = node_0.nodeData;
219
+ if (hierarchyNode && HierarchyNode.isGroupingNode(hierarchyNode)) return;
220
+ return {
221
+ hierarchyNode,
222
+ getInstanceKeysIterator: (props_1) => hierarchyProvider.getNodeInstanceKeys({
223
+ parentNode: hierarchyNode,
224
+ instanceFilter: props_1?.instanceFilter,
225
+ hierarchyLevelSizeLimit: props_1?.hierarchyLevelSizeLimit
226
+ }),
227
+ instanceFilter: node_0.instanceFilter,
228
+ setInstanceFilter: (filter) => actions.setInstanceFilter(nodeId_3, filter),
229
+ sizeLimit: node_0.hierarchyLimit,
230
+ setSizeLimit: (value) => actions.setHierarchyLimit(nodeId_3, value)
231
+ };
232
+ }, [actions, hierarchyProvider]);
233
+ return {
234
+ ...useMemo(() => {
235
+ if (state.model.rootNode.error) return { rootErrorRendererProps: {
236
+ error: state.model.rootNode.error,
237
+ reloadTree,
238
+ getHierarchyLevelDetails
239
+ } };
240
+ return {
241
+ rootErrorRendererProps: void 0,
242
+ treeRendererProps: state.rootNodes ? {
243
+ rootNodes: state.rootNodes,
244
+ expandNode,
245
+ selectNodes,
246
+ isNodeSelected,
247
+ reloadTree,
248
+ getHierarchyLevelDetails
249
+ } : void 0
250
+ };
251
+ }, [
252
+ expandNode,
253
+ getHierarchyLevelDetails,
254
+ isNodeSelected,
255
+ reloadTree,
256
+ selectNodes,
257
+ state.model.rootNode.error,
258
+ state.rootNodes
259
+ ]),
260
+ isReloading: !!state.model.rootNode.isLoading || isSearching,
261
+ getTreeModelNode,
262
+ getNode,
263
+ setFormatter
264
+ };
204
265
  }
205
266
  function generateTreeStructure(parentNodeId, model) {
206
- const currentChildren = model.parentChildMap.get(parentNodeId);
207
- if (!currentChildren) {
208
- return undefined;
209
- }
210
- return currentChildren
211
- .map((childId) => model.idToNode.get(childId))
212
- .filter((node) => !!node)
213
- .map((node) => {
214
- return createTreeNode(node, model);
215
- });
267
+ const currentChildren = model.parentChildMap.get(parentNodeId);
268
+ if (!currentChildren) return;
269
+ return currentChildren.map((childId) => model.idToNode.get(childId)).filter((node) => !!node).map((node) => {
270
+ return createTreeNode(node, model);
271
+ });
216
272
  }
217
273
  function createTreeNode(modelNode, model) {
218
- let children;
219
- return {
220
- ...toTreeNodeBase(modelNode),
221
- get children() {
222
- if (!children) {
223
- children = generateTreeStructure(modelNode.id, model);
224
- }
225
- return children ? children : modelNode.children === true ? true : [];
226
- },
227
- };
274
+ let children;
275
+ return {
276
+ ...toTreeNodeBase(modelNode),
277
+ get children() {
278
+ if (!children) children = generateTreeStructure(modelNode.id, model);
279
+ return children ? children : modelNode.children === true ? true : [];
280
+ }
281
+ };
228
282
  }
229
283
  function toTreeNodeBase(node) {
230
- return {
231
- id: node.id,
232
- label: node.label,
233
- nodeData: node.nodeData,
234
- isLoading: !!node.isLoading,
235
- isExpanded: !!node.isExpanded,
236
- isFilterable: !HierarchyNode.isGroupingNode(node.nodeData) && !!node.nodeData.supportsFiltering && node.children,
237
- isFiltered: !!node.instanceFilter,
238
- error: node.error,
239
- };
284
+ return {
285
+ id: node.id,
286
+ label: node.label,
287
+ nodeData: node.nodeData,
288
+ isLoading: !!node.isLoading,
289
+ isExpanded: !!node.isExpanded,
290
+ isFilterable: !HierarchyNode.isGroupingNode(node.nodeData) && !!node.nodeData.supportsFiltering && node.children,
291
+ isFiltered: !!node.instanceFilter,
292
+ error: node.error
293
+ };
240
294
  }
295
+
296
+ //#endregion
297
+ export { useTree, useUnifiedSelectionTree };
241
298
  //# sourceMappingURL=UseTree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UseTree.js","sourceRoot":"","sources":["../../../src/presentation-hierarchies-react/UseTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { GenericInstanceFilter, HierarchyNode, HierarchyProvider, HierarchySearchPath } from \"@itwin/presentation-hierarchies\";\nimport { IPrimitiveValueFormatter } from \"@itwin/presentation-shared\";\nimport { TreeActions } from \"./internal/TreeActions.js\";\nimport { TreeModel, TreeModelHierarchyNode, TreeModelRootNode } from \"./internal/TreeModel.js\";\nimport { useUnifiedTreeSelection, UseUnifiedTreeSelectionProps } from \"./internal/UseUnifiedSelection.js\";\nimport { safeDispose } from \"./internal/Utils.js\";\nimport { RootErrorRendererProps, TreeRendererProps } from \"./Renderers.js\";\nimport { TreeNode } from \"./TreeNode.js\";\nimport { SelectionChangeType } from \"./UseSelectionHandler.js\";\nimport { useLatest } from \"./Utils.js\";\n\n/**\n * A React hook that creates state for a tree component.\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useUnifiedSelectionTree`\n * @see `useIModelTree`\n * @public\n */\nexport function useTree(props: UseTreeProps): UseTreeResult {\n const { getTreeModelNode: _, ...rest } = useTreeInternal(props);\n return rest;\n}\n\n/**\n * A React hook that creates state for a tree component, that is integrated with unified selection\n * through the given selection storage (previously the storage was provided through the, now\n * deprecated, `UnifiedSelectionProvider`).\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useTree`\n * @see `useIModelUnifiedSelectionTree`\n * @see `UnifiedSelectionProvider`\n * @public\n */\nexport function useUnifiedSelectionTree({\n sourceName,\n selectionStorage,\n createSelectableForGenericNode,\n ...props\n}: UseTreeProps & UseUnifiedTreeSelectionProps): UseTreeResult {\n const { getTreeModelNode, ...rest } = useTreeInternal(props);\n const selectionProps = useUnifiedTreeSelection({ sourceName, selectionStorage, getTreeModelNode, createSelectableForGenericNode });\n if (rest.rootErrorRendererProps === undefined && rest.treeRendererProps?.rootNodes) {\n return {\n ...rest,\n treeRendererProps: {\n ...rest.treeRendererProps,\n ...selectionProps,\n },\n };\n }\n return rest;\n}\n\n/** @public */\nexport interface UseTreeProps {\n /** Provides the hierarchy provider for the tree. */\n getHierarchyProvider: () => HierarchyProvider;\n /** Provides paths to search nodes. */\n getSearchPaths?: ({ abortSignal }: { abortSignal: AbortSignal }) => Promise<HierarchySearchPath[] | undefined>;\n /**\n * Callback that is called just after a certain action is finished.\n * Can be used for performance tracking.\n */\n onPerformanceMeasured?: (action: \"initial-load\" | \"hierarchy-level-load\" | \"reload\", duration: number) => void;\n /** Action to perform when hierarchy level contains more items that the specified limit. */\n onHierarchyLimitExceeded?: (props: { parentId?: string; filter?: GenericInstanceFilter; limit?: number | \"unbounded\" }) => void;\n /** Action to perform when an error occurs while loading hierarchy. */\n onHierarchyLoadError?: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void;\n}\n\n/** @public */\nexport type UseTreeResult = {\n /**\n * Specifies whether tree is reloading or not. It is set to `false` when initial tree load is in progress to check if\n * or tree is reloading.\n */\n isReloading: boolean;\n /** Get a tree node by id */\n getNode: (nodeId: string) => TreeNode | undefined;\n /** Sets a formatter for the primitive values that are displayed in the hierarchy. */\n setFormatter: (formatter: IPrimitiveValueFormatter | undefined) => void;\n} & RendererProps;\n\n/**.\n * @alpha\n */\ntype RendererProps =\n | {\n /**\n * An object containing information used to render root error handling UI.\n * Use in combination with `RootErrorRenderer` or your custom implementation.\n * Defined when root nodes fail to load.\n */\n rootErrorRendererProps: RootErrorRendererProps;\n }\n | {\n /** Is undefined when rootNodes where successfully loaded or are in initial loading process */\n rootErrorRendererProps: undefined;\n /**\n * An object containing information used to render tree.\n * Use with `TreeRenderer` or your custom implementation.\n * Is undefined on initial loading process.\n */\n treeRendererProps?: TreeRendererProps;\n };\n\ninterface TreeState {\n model: TreeModel;\n rootNodes: Array<TreeNode> | undefined;\n}\n\nfunction useTreeInternal({\n getHierarchyProvider,\n getSearchPaths,\n onPerformanceMeasured,\n onHierarchyLimitExceeded,\n onHierarchyLoadError,\n}: UseTreeProps): UseTreeResult & {\n getTreeModelNode: (nodeId: string) => TreeModelRootNode | TreeModelHierarchyNode | undefined;\n} {\n const [state, setState] = useState<TreeState>({\n model: { idToNode: new Map(), parentChildMap: new Map(), rootNode: { id: undefined, nodeData: undefined } },\n rootNodes: undefined,\n });\n const onPerformanceMeasuredRef = useLatest(onPerformanceMeasured);\n const onHierarchyLimitExceededRef = useLatest(onHierarchyLimitExceeded);\n const onHierarchyLoadErrorRef = useLatest(onHierarchyLoadError);\n\n const [actions] = useState<TreeActions>(\n () =>\n new TreeActions(\n (model) => {\n const rootNodes = model.parentChildMap.get(undefined) !== undefined ? generateTreeStructure(undefined, model) : undefined;\n setState({\n model,\n rootNodes,\n });\n },\n (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration),\n (props) => onHierarchyLimitExceededRef.current?.(props),\n (props) => onHierarchyLoadErrorRef.current?.(props),\n ),\n );\n const currentFormatter = useRef<IPrimitiveValueFormatter>();\n\n const [hierarchyProvider, setHierarchyProvider] = useState<HierarchyProvider | undefined>();\n useEffect(() => {\n const provider = getHierarchyProvider();\n provider.setFormatter(currentFormatter.current);\n const removeHierarchyChangedListener = provider.hierarchyChanged.addListener((hierarchyChangeArgs) => {\n const shouldDiscardState = hierarchyChangeArgs?.searchChange?.newSearch !== undefined;\n actions.reloadTree({ state: shouldDiscardState ? \"discard\" : \"keep\" });\n });\n actions.setHierarchyProvider(provider);\n setHierarchyProvider(provider);\n return () => {\n removeHierarchyChangedListener();\n actions.reset();\n safeDispose(provider);\n };\n }, [actions, getHierarchyProvider]);\n\n const [isSearching, setIsSearching] = useState(false);\n useEffect(() => {\n let disposed = false;\n const controller = new AbortController();\n void (async () => {\n if (!hierarchyProvider) {\n return;\n }\n\n if (!getSearchPaths) {\n hierarchyProvider.setHierarchySearch(undefined);\n // reload tree in case hierarchy provider does not use hierarchy search to load initial nodes\n actions.reloadTree({ state: \"keep\" });\n setIsSearching(false);\n return;\n }\n\n setIsSearching(true);\n let paths: HierarchySearchPath[] | undefined;\n try {\n paths = await getSearchPaths({ abortSignal: controller.signal });\n } catch {\n } finally {\n if (!disposed) {\n hierarchyProvider.setHierarchySearch(paths ? { paths } : undefined);\n setIsSearching(false);\n }\n }\n })();\n return () => {\n controller.abort();\n disposed = true;\n };\n }, [hierarchyProvider, getSearchPaths, actions]);\n\n const getTreeModelNode = useCallback<(nodeId: string) => TreeModelRootNode | TreeModelHierarchyNode | undefined>(\n (nodeId: string) => {\n return actions.getNode(nodeId);\n },\n [actions],\n );\n\n const getNode = useCallback(\n (nodeId: string): TreeNode | undefined => {\n const node = actions.getNode(nodeId);\n if (!node || node.id === undefined) {\n return undefined;\n }\n return createTreeNode(node, state.model);\n },\n [actions, state.model],\n );\n\n const expandNode = useCallback<TreeRendererProps[\"expandNode\"]>(\n (nodeId: string, isExpanded: boolean) => {\n actions.expandNode(nodeId, isExpanded);\n },\n [actions],\n );\n\n const reloadTree = useCallback<TreeRendererProps[\"reloadTree\"]>(\n (options) => {\n actions.reloadTree(options);\n },\n [actions],\n );\n\n const selectNodes = useCallback<TreeRendererProps[\"selectNodes\"]>(\n (nodeIds: Array<string>, changeType: SelectionChangeType) => {\n actions.selectNodes(nodeIds, changeType);\n },\n [actions],\n );\n\n const isNodeSelected = useCallback<TreeRendererProps[\"isNodeSelected\"]>((nodeId: string) => TreeModel.isNodeSelected(state.model, nodeId), [state]);\n\n const setFormatter = useCallback<UseTreeResult[\"setFormatter\"]>(\n (formatter: IPrimitiveValueFormatter | undefined) => {\n currentFormatter.current = formatter;\n /* c8 ignore next 3 */\n if (!hierarchyProvider) {\n return;\n }\n\n hierarchyProvider.setFormatter(formatter);\n },\n [hierarchyProvider],\n );\n\n const getHierarchyLevelDetails = useCallback<TreeRendererProps[\"getHierarchyLevelDetails\"]>(\n (nodeId) => {\n const node = actions.getNode(nodeId);\n if (!hierarchyProvider || !node) {\n return undefined;\n }\n const hierarchyNode = node.nodeData;\n if (hierarchyNode && HierarchyNode.isGroupingNode(hierarchyNode)) {\n return undefined;\n }\n\n return {\n hierarchyNode,\n getInstanceKeysIterator: (props) =>\n hierarchyProvider.getNodeInstanceKeys({\n parentNode: hierarchyNode,\n instanceFilter: props?.instanceFilter,\n hierarchyLevelSizeLimit: props?.hierarchyLevelSizeLimit,\n }),\n instanceFilter: node.instanceFilter,\n setInstanceFilter: (filter) => actions.setInstanceFilter(nodeId, filter),\n sizeLimit: node.hierarchyLimit,\n setSizeLimit: (value) => actions.setHierarchyLimit(nodeId, value),\n };\n },\n [actions, hierarchyProvider],\n );\n\n const renderProps: RendererProps = useMemo(() => {\n if (state.model.rootNode.error) {\n return {\n rootErrorRendererProps: {\n error: state.model.rootNode.error,\n reloadTree,\n getHierarchyLevelDetails,\n },\n };\n }\n return {\n rootErrorRendererProps: undefined,\n treeRendererProps: state.rootNodes\n ? {\n rootNodes: state.rootNodes,\n expandNode,\n selectNodes,\n isNodeSelected,\n reloadTree,\n getHierarchyLevelDetails,\n }\n : undefined,\n };\n }, [expandNode, getHierarchyLevelDetails, isNodeSelected, reloadTree, selectNodes, state.model.rootNode.error, state.rootNodes]);\n\n return {\n ...renderProps,\n isReloading: !!state.model.rootNode.isLoading || isSearching,\n getTreeModelNode,\n getNode,\n setFormatter,\n };\n}\n\nfunction generateTreeStructure(parentNodeId: string | undefined, model: TreeModel): Array<TreeNode> | undefined {\n const currentChildren = model.parentChildMap.get(parentNodeId);\n if (!currentChildren) {\n return undefined;\n }\n\n return currentChildren\n .map((childId) => model.idToNode.get(childId))\n .filter((node): node is TreeModelHierarchyNode => !!node)\n .map<TreeNode>((node) => {\n return createTreeNode(node, model);\n });\n}\n\nfunction createTreeNode(modelNode: TreeModelHierarchyNode, model: TreeModel): TreeNode {\n let children: Array<TreeNode> | undefined;\n return {\n ...toTreeNodeBase(modelNode),\n get children() {\n if (!children) {\n children = generateTreeStructure(modelNode.id, model);\n }\n return children ? children : modelNode.children === true ? true : [];\n },\n };\n}\n\nfunction toTreeNodeBase(node: TreeModelHierarchyNode): Omit<TreeNode, \"children\"> {\n return {\n id: node.id,\n label: node.label,\n nodeData: node.nodeData,\n isLoading: !!node.isLoading,\n isExpanded: !!node.isExpanded,\n isFilterable: !HierarchyNode.isGroupingNode(node.nodeData) && !!node.nodeData.supportsFiltering && node.children,\n isFiltered: !!node.instanceFilter,\n error: node.error,\n };\n}\n"]}
1
+ {"version":3,"file":"UseTree.js","names":["useCallback","useEffect","useMemo","useRef","useState","HierarchyNode","TreeActions","TreeModel","useUnifiedTreeSelection","safeDispose","useLatest","GenericInstanceFilter","HierarchyProvider","HierarchySearchPath","IPrimitiveValueFormatter","TreeModelHierarchyNode","TreeModelRootNode","UseUnifiedTreeSelectionProps","RootErrorRendererProps","TreeRendererProps","TreeNode","SelectionChangeType","useTree","props","$","_c","t0","useTreeInternal","rest","getTreeModelNode","_","t1","useUnifiedSelectionTree","createSelectableForGenericNode","selectionStorage","sourceName","t2","selectionProps","rootErrorRendererProps","undefined","treeRendererProps","rootNodes","t3","t4","UseTreeProps","getHierarchyProvider","getSearchPaths","abortSignal","AbortSignal","Promise","onPerformanceMeasured","action","duration","onHierarchyLimitExceeded","parentId","filter","limit","onHierarchyLoadError","type","error","UseTreeResult","isReloading","getNode","nodeId","setFormatter","formatter","RendererProps","TreeState","model","Array","state","setState","idToNode","Map","parentChildMap","rootNode","id","nodeData","onPerformanceMeasuredRef","onHierarchyLimitExceededRef","onHierarchyLoadErrorRef","actions","get","generateTreeStructure","actionType","current","currentFormatter","hierarchyProvider","setHierarchyProvider","provider","removeHierarchyChangedListener","hierarchyChanged","addListener","hierarchyChangeArgs","shouldDiscardState","searchChange","newSearch","reloadTree","reset","isSearching","setIsSearching","disposed","controller","AbortController","setHierarchySearch","paths","signal","abort","node","createTreeNode","expandNode","isExpanded","options","selectNodes","nodeIds","changeType","isNodeSelected","getHierarchyLevelDetails","hierarchyNode","isGroupingNode","getInstanceKeysIterator","getNodeInstanceKeys","parentNode","instanceFilter","hierarchyLevelSizeLimit","setInstanceFilter","sizeLimit","hierarchyLimit","setSizeLimit","value","setHierarchyLimit","renderProps","isLoading","parentNodeId","currentChildren","map","childId","modelNode","children","toTreeNodeBase","Omit","label","isFilterable","supportsFiltering","isFiltered"],"sources":["../../../src/presentation-hierarchies-react/UseTree.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { TreeActions } from \"./internal/TreeActions.js\";\nimport { TreeModel } from \"./internal/TreeModel.js\";\nimport { useUnifiedTreeSelection } from \"./internal/UseUnifiedSelection.js\";\nimport { safeDispose } from \"./internal/Utils.js\";\nimport { useLatest } from \"./Utils.js\";\n\nimport type { GenericInstanceFilter, HierarchyProvider, HierarchySearchPath } from \"@itwin/presentation-hierarchies\";\nimport type { IPrimitiveValueFormatter } from \"@itwin/presentation-shared\";\nimport type { TreeModelHierarchyNode, TreeModelRootNode } from \"./internal/TreeModel.js\";\nimport type { UseUnifiedTreeSelectionProps } from \"./internal/UseUnifiedSelection.js\";\nimport type { RootErrorRendererProps, TreeRendererProps } from \"./Renderers.js\";\nimport type { TreeNode } from \"./TreeNode.js\";\nimport type { SelectionChangeType } from \"./UseSelectionHandler.js\";\n\n/**\n * A React hook that creates state for a tree component.\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useUnifiedSelectionTree`\n * @see `useIModelTree`\n * @public\n */\nexport function useTree(props: UseTreeProps): UseTreeResult {\n const { getTreeModelNode: _, ...rest } = useTreeInternal(props);\n return rest;\n}\n\n/**\n * A React hook that creates state for a tree component, that is integrated with unified selection\n * through the given selection storage (previously the storage was provided through the, now\n * deprecated, `UnifiedSelectionProvider`).\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useTree`\n * @see `useIModelUnifiedSelectionTree`\n * @see `UnifiedSelectionProvider`\n * @public\n */\nexport function useUnifiedSelectionTree({\n sourceName,\n selectionStorage,\n createSelectableForGenericNode,\n ...props\n}: UseTreeProps & UseUnifiedTreeSelectionProps): UseTreeResult {\n const { getTreeModelNode, ...rest } = useTreeInternal(props);\n const selectionProps = useUnifiedTreeSelection({ sourceName, selectionStorage, getTreeModelNode, createSelectableForGenericNode });\n if (rest.rootErrorRendererProps === undefined && rest.treeRendererProps?.rootNodes) {\n return {\n ...rest,\n treeRendererProps: {\n ...rest.treeRendererProps,\n ...selectionProps,\n },\n };\n }\n return rest;\n}\n\n/** @public */\nexport interface UseTreeProps {\n /** Provides the hierarchy provider for the tree. */\n getHierarchyProvider: () => HierarchyProvider;\n /** Provides paths to search nodes. */\n getSearchPaths?: ({ abortSignal }: { abortSignal: AbortSignal }) => Promise<HierarchySearchPath[] | undefined>;\n /**\n * Callback that is called just after a certain action is finished.\n * Can be used for performance tracking.\n */\n onPerformanceMeasured?: (action: \"initial-load\" | \"hierarchy-level-load\" | \"reload\", duration: number) => void;\n /** Action to perform when hierarchy level contains more items that the specified limit. */\n onHierarchyLimitExceeded?: (props: { parentId?: string; filter?: GenericInstanceFilter; limit?: number | \"unbounded\" }) => void;\n /** Action to perform when an error occurs while loading hierarchy. */\n onHierarchyLoadError?: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void;\n}\n\n/** @public */\nexport type UseTreeResult = {\n /**\n * Specifies whether tree is reloading or not. It is set to `false` when initial tree load is in progress to check if\n * or tree is reloading.\n */\n isReloading: boolean;\n /**\n * Get a tree node by id\n */\n getNode: (nodeId: string) => TreeNode | undefined;\n /**\n * Sets a formatter for the primitive values that are displayed in the hierarchy.\n */\n setFormatter: (formatter: IPrimitiveValueFormatter | undefined) => void;\n} & RendererProps;\n\n/**.\n * @alpha\n */\ntype RendererProps =\n | {\n /**\n * An object containing information used to render root error handling UI.\n * Use in combination with `RootErrorRenderer` or your custom implementation.\n * Defined when root nodes fail to load.\n */\n rootErrorRendererProps: RootErrorRendererProps;\n }\n | {\n /** Is undefined when rootNodes where successfully loaded or are in initial loading process */\n rootErrorRendererProps: undefined;\n /**\n * An object containing information used to render tree.\n * Use with `TreeRenderer` or your custom implementation.\n * Is undefined on initial loading process.\n */\n treeRendererProps?: TreeRendererProps;\n };\n\ninterface TreeState {\n model: TreeModel;\n rootNodes: Array<TreeNode> | undefined;\n}\n\nfunction useTreeInternal({\n getHierarchyProvider,\n getSearchPaths,\n onPerformanceMeasured,\n onHierarchyLimitExceeded,\n onHierarchyLoadError,\n}: UseTreeProps): UseTreeResult & {\n getTreeModelNode: (nodeId: string) => TreeModelRootNode | TreeModelHierarchyNode | undefined;\n} {\n const [state, setState] = useState<TreeState>({\n model: { idToNode: new Map(), parentChildMap: new Map(), rootNode: { id: undefined, nodeData: undefined } },\n rootNodes: undefined,\n });\n const onPerformanceMeasuredRef = useLatest(onPerformanceMeasured);\n const onHierarchyLimitExceededRef = useLatest(onHierarchyLimitExceeded);\n const onHierarchyLoadErrorRef = useLatest(onHierarchyLoadError);\n\n const [actions] = useState<TreeActions>(\n () =>\n new TreeActions(\n (model) => {\n const rootNodes = model.parentChildMap.get(undefined) !== undefined ? generateTreeStructure(undefined, model) : undefined;\n setState({\n model,\n rootNodes,\n });\n },\n (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration),\n (props) => onHierarchyLimitExceededRef.current?.(props),\n (props) => onHierarchyLoadErrorRef.current?.(props),\n ),\n );\n const currentFormatter = useRef<IPrimitiveValueFormatter>();\n\n const [hierarchyProvider, setHierarchyProvider] = useState<HierarchyProvider | undefined>();\n useEffect(() => {\n const provider = getHierarchyProvider();\n provider.setFormatter(currentFormatter.current);\n const removeHierarchyChangedListener = provider.hierarchyChanged.addListener((hierarchyChangeArgs) => {\n const shouldDiscardState = hierarchyChangeArgs.searchChange?.newSearch !== undefined;\n actions.reloadTree({ state: shouldDiscardState ? \"discard\" : \"keep\" });\n });\n actions.setHierarchyProvider(provider);\n setHierarchyProvider(provider);\n return () => {\n removeHierarchyChangedListener();\n actions.reset();\n safeDispose(provider);\n };\n }, [actions, getHierarchyProvider]);\n\n const [isSearching, setIsSearching] = useState(false);\n useEffect(() => {\n let disposed = false as boolean;\n const controller = new AbortController();\n void (async () => {\n if (!hierarchyProvider) {\n return;\n }\n\n if (!getSearchPaths) {\n hierarchyProvider.setHierarchySearch(undefined);\n // reload tree in case hierarchy provider does not use hierarchy search to load initial nodes\n actions.reloadTree({ state: \"keep\" });\n setIsSearching(false);\n return;\n }\n\n setIsSearching(true);\n let paths: HierarchySearchPath[] | undefined;\n try {\n paths = await getSearchPaths({ abortSignal: controller.signal });\n } catch {\n } finally {\n if (!disposed) {\n hierarchyProvider.setHierarchySearch(paths ? { paths } : undefined);\n setIsSearching(false);\n }\n }\n })();\n return () => {\n controller.abort();\n disposed = true;\n };\n }, [hierarchyProvider, getSearchPaths, actions]);\n\n const getTreeModelNode = useCallback<(nodeId: string) => TreeModelRootNode | TreeModelHierarchyNode | undefined>(\n (nodeId: string) => {\n return actions.getNode(nodeId);\n },\n [actions],\n );\n\n const getNode = useCallback(\n (nodeId: string): TreeNode | undefined => {\n const node = actions.getNode(nodeId);\n if (!node || node.id === undefined) {\n return undefined;\n }\n return createTreeNode(node, state.model);\n },\n [actions, state.model],\n );\n\n const expandNode = useCallback<TreeRendererProps[\"expandNode\"]>(\n (nodeId: string, isExpanded: boolean) => {\n actions.expandNode(nodeId, isExpanded);\n },\n [actions],\n );\n\n const reloadTree = useCallback<TreeRendererProps[\"reloadTree\"]>(\n (options) => {\n actions.reloadTree(options);\n },\n [actions],\n );\n\n const selectNodes = useCallback<TreeRendererProps[\"selectNodes\"]>(\n (nodeIds: Array<string>, changeType: SelectionChangeType) => {\n actions.selectNodes(nodeIds, changeType);\n },\n [actions],\n );\n\n const isNodeSelected = useCallback<TreeRendererProps[\"isNodeSelected\"]>((nodeId: string) => TreeModel.isNodeSelected(state.model, nodeId), [state]);\n\n const setFormatter = useCallback<UseTreeResult[\"setFormatter\"]>(\n (formatter: IPrimitiveValueFormatter | undefined) => {\n currentFormatter.current = formatter;\n /* c8 ignore next 3 */\n if (!hierarchyProvider) {\n return;\n }\n\n hierarchyProvider.setFormatter(formatter);\n },\n [hierarchyProvider],\n );\n\n const getHierarchyLevelDetails = useCallback<TreeRendererProps[\"getHierarchyLevelDetails\"]>(\n (nodeId) => {\n const node = actions.getNode(nodeId);\n if (!hierarchyProvider || !node) {\n return undefined;\n }\n const hierarchyNode = node.nodeData;\n if (hierarchyNode && HierarchyNode.isGroupingNode(hierarchyNode)) {\n return undefined;\n }\n\n return {\n hierarchyNode,\n getInstanceKeysIterator: (props) =>\n hierarchyProvider.getNodeInstanceKeys({\n parentNode: hierarchyNode,\n instanceFilter: props?.instanceFilter,\n hierarchyLevelSizeLimit: props?.hierarchyLevelSizeLimit,\n }),\n instanceFilter: node.instanceFilter,\n setInstanceFilter: (filter) => actions.setInstanceFilter(nodeId, filter),\n sizeLimit: node.hierarchyLimit,\n setSizeLimit: (value) => actions.setHierarchyLimit(nodeId, value),\n };\n },\n [actions, hierarchyProvider],\n );\n\n const renderProps: RendererProps = useMemo(() => {\n if (state.model.rootNode.error) {\n return {\n rootErrorRendererProps: {\n error: state.model.rootNode.error,\n reloadTree,\n getHierarchyLevelDetails,\n },\n };\n }\n return {\n rootErrorRendererProps: undefined,\n treeRendererProps: state.rootNodes\n ? {\n rootNodes: state.rootNodes,\n expandNode,\n selectNodes,\n isNodeSelected,\n reloadTree,\n getHierarchyLevelDetails,\n }\n : undefined,\n };\n }, [expandNode, getHierarchyLevelDetails, isNodeSelected, reloadTree, selectNodes, state.model.rootNode.error, state.rootNodes]);\n\n return {\n ...renderProps,\n isReloading: !!state.model.rootNode.isLoading || isSearching,\n getTreeModelNode,\n getNode,\n setFormatter,\n };\n}\n\nfunction generateTreeStructure(parentNodeId: string | undefined, model: TreeModel): Array<TreeNode> | undefined {\n const currentChildren = model.parentChildMap.get(parentNodeId);\n if (!currentChildren) {\n return undefined;\n }\n\n return currentChildren\n .map((childId) => model.idToNode.get(childId))\n .filter((node): node is TreeModelHierarchyNode => !!node)\n .map<TreeNode>((node) => {\n return createTreeNode(node, model);\n });\n}\n\nfunction createTreeNode(modelNode: TreeModelHierarchyNode, model: TreeModel): TreeNode {\n let children: Array<TreeNode> | undefined;\n return {\n ...toTreeNodeBase(modelNode),\n get children() {\n if (!children) {\n children = generateTreeStructure(modelNode.id, model);\n }\n return children ? children : modelNode.children === true ? true : [];\n },\n };\n}\n\nfunction toTreeNodeBase(node: TreeModelHierarchyNode): Omit<TreeNode, \"children\"> {\n return {\n id: node.id,\n label: node.label,\n nodeData: node.nodeData,\n isLoading: !!node.isLoading,\n isExpanded: !!node.isExpanded,\n isFilterable: !HierarchyNode.isGroupingNode(node.nodeData) && !!node.nodeData.supportsFiltering && node.children,\n isFiltered: !!node.instanceFilter,\n error: node.error,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAiCA,SAAOsB,QAAAC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CACoC,MAAAC,KAAAC,gBAAgBJ,MAAM;CAAA,IAAAK;AAAA,KAAAJ,EAAA,OAAAE,IAAA;EAA/D,MAAA,EAAAG,kBAAAC,GAAA,GAAAC,OAAyCL;AAAzCE,SAAAG;AAAgEP,IAAA,KAAAE;AAAAF,IAAA,KAAAI;OAAAA,QAAAJ,EAAA;AAAA,QACzDI;;;;;;;;;;;;;;;;;AAkBT,SAAOI,wBAAAN,IAAA;CAAA,MAAAF,IAAAC,EAAA,GAAA;CAAA,IAAAQ;CAAA,IAAAV;CAAA,IAAAW;CAAA,IAAAC;AAAA,KAAAX,EAAA,OAAAE,IAAA;AAAiC,GAAA,CAAAS,YAAAD,kBAAAD,mCAAAV,SAAAG;AAKMF,IAAA,KAAAE;AAAAF,IAAA,KAAAS;AAAAT,IAAA,KAAAD;AAAAC,IAAA,KAAAU;AAAAV,IAAA,KAAAW;QAAA;AAAAF,mCAAAT,EAAA;AAAAD,UAAAC,EAAA;AAAAU,qBAAAV,EAAA;AAAAW,eAAAX,EAAA;;CACN,MAAAO,KAAAJ,gBAAgBJ,MAAM;CAAA,IAAAM;CAAA,IAAAD;AAAA,KAAAJ,EAAA,OAAAO,IAAA;AAA5D,GAAA,CAAAF,qBAAAD,QAAsCG;AAAuBP,IAAA,KAAAO;AAAAP,IAAA,KAAAK;AAAAL,IAAA,KAAAI;QAAA;AAAAC,qBAAAL,EAAA;AAAAI,SAAAJ,EAAA;;CAAA,IAAAY;AAAA,KAAAZ,EAAA,OAAAS,kCAAAT,EAAA,OAAAK,oBAAAL,EAAA,QAAAU,oBAAAV,EAAA,QAAAW,YAAA;AACdC,OAAA;GAAAD;GAAAD;GAAAL;GAAAI;GAAkF;AAAAT,IAAA,KAAAS;AAAAT,IAAA,KAAAK;AAAAL,IAAA,MAAAU;AAAAV,IAAA,MAAAW;AAAAX,IAAA,MAAAY;OAAAA,MAAAZ,EAAA;CAAjI,MAAAa,iBAAuB7B,wBAAwB4B,GAAmF;AAClI,KAAIR,KAAIU,2BAA4BC,UAAaX,KAAIY,mBAA6BC,WAAA;EAAA,IAAAC;AAAA,MAAAlB,EAAA,QAAAI,KAAAY,qBAAAhB,EAAA,QAAAa,gBAAA;AAG3DK,QAAA;IAAA,GACdd,KAAIY;IAAkB,GACtBH;IACJ;AAAAb,KAAA,MAAAI,KAAAY;AAAAhB,KAAA,MAAAa;AAAAb,KAAA,MAAAkB;QAAAA,MAAAlB,EAAA;EAAA,IAAAmB;AAAA,MAAAnB,EAAA,QAAAI,QAAAJ,EAAA,QAAAkB,IAAA;AALIC,QAAA;IAAA,GACFf;IAAIY,mBACYE;IAIpB;AAAAlB,KAAA,MAAAI;AAAAJ,KAAA,MAAAkB;AAAAlB,KAAA,MAAAmB;QAAAA,MAAAnB,EAAA;AAAA,SANMmB;;AAOR,QACMf;;AAiET,SAASD,gBAAgB,EACvBkB,sBACAC,gBACAI,uBACAG,0BACAI,wBAGA;CACA,MAAM,CAACa,OAAOC,YAAYnE,SAAoB;EAC5CgE,OAAO;GAAEI,0BAAU,IAAIC,KAAK;GAAEC,gCAAgB,IAAID,KAAK;GAAEE,UAAU;IAAEC,IAAIrC;IAAWsC,UAAUtC;IAAU;GAAG;EAC3GE,WAAWF;EACZ,CAAC;CACF,MAAMuC,2BAA2BpE,UAAUwC,sBAAsB;CACjE,MAAM6B,8BAA8BrE,UAAU2C,yBAAyB;CACvE,MAAM2B,0BAA0BtE,UAAU+C,qBAAqB;CAE/D,MAAM,CAACwB,WAAW7E,eAEd,IAAIE,aACD8D,UAAU;AAETG,WAAS;GACPH;GACA3B,WAHgB2B,MAAMM,eAAeQ,IAAI3C,OAAU,KAAKA,SAAY4C,sBAAsB5C,QAAW6B,MAAM,GAAG7B;GAI/G,CAAC;KAEH6C,YAAYhC,aAAa0B,yBAAyBO,UAAUD,YAAYhC,SAAS,GACjF7B,UAAUwD,4BAA4BM,UAAU9D,MAAM,GACtDA,YAAUyD,wBAAwBK,UAAU9D,QAC/C,CACJ,CAAC;CACD,MAAM+D,mBAAmBnF,QAAkC;CAE3D,MAAM,CAACoF,mBAAmBC,wBAAwBpF,UAAyC;AAC3FH,iBAAgB;EACd,MAAMwF,WAAW5C,sBAAsB;AACvC4C,WAASzB,aAAasB,iBAAiBD,QAAQ;EAC/C,MAAMK,iCAAiCD,SAASE,iBAAiBC,aAAaC,wBAAwB;GACpG,MAAMC,qBAAqBD,oBAAoBE,cAAcC,cAAczD;AAC3E0C,WAAQgB,WAAW,EAAE3B,OAAOwB,qBAAqB,YAAY,QAAQ,CAAC;IACtE;AACFb,UAAQO,qBAAqBC,SAAS;AACtCD,uBAAqBC,SAAS;AAC9B,eAAa;AACXC,mCAAgC;AAChCT,WAAQiB,OAAO;AACfzF,eAAYgF,SAAS;;IAEtB,CAACR,SAASpC,qBAAqB,CAAC;CAEnC,MAAM,CAACsD,aAAaC,kBAAkBhG,SAAS,MAAM;AACrDH,iBAAgB;EACd,IAAIoG,WAAW;EACf,MAAMC,aAAa,IAAIC,iBAAiB;AACxC,GAAM,YAAY;AAChB,OAAI,CAAChB,kBACH;AAGF,OAAI,CAACzC,gBAAgB;AACnByC,sBAAkBiB,mBAAmBjE,OAAU;AAE/C0C,YAAQgB,WAAW,EAAE3B,OAAO,QAAQ,CAAC;AACrC8B,mBAAe,MAAM;AACrB;;AAGFA,kBAAe,KAAK;GACpB,IAAIK;AACJ,OAAI;AACFA,YAAQ,MAAM3D,eAAe,EAAEC,aAAauD,WAAWI,QAAQ,CAAC;WAC1D,WACE;AACR,QAAI,CAACL,UAAU;AACbd,uBAAkBiB,mBAAmBC,QAAQ,EAAEA,OAAO,GAAGlE,OAAU;AACnE6D,oBAAe,MAAM;;;MAGvB;AACJ,eAAa;AACXE,cAAWK,OAAO;AAClBN,cAAW;;IAEZ;EAACd;EAAmBzC;EAAgBmC;EAAQ,CAAC;CAEhD,MAAMpD,mBAAmB7B,aACtB+D,WAAmB;AAClB,SAAOkB,QAAQnB,QAAQC,OAAO;IAEhC,CAACkB,QACH,CAAC;CAED,MAAMnB,UAAU9D,aACb+D,aAAyC;EACxC,MAAM6C,OAAO3B,QAAQnB,QAAQC,SAAO;AACpC,MAAI,CAAC6C,QAAQA,KAAKhC,OAAOrC,OACvB;AAEF,SAAOsE,eAAeD,MAAMtC,MAAMF,MAAM;IAE1C,CAACa,SAASX,MAAMF,MAClB,CAAC;CAED,MAAM0C,aAAa9G,aAChB+D,UAAgBgD,eAAwB;AACvC9B,UAAQ6B,WAAW/C,UAAQgD,WAAW;IAExC,CAAC9B,QACH,CAAC;CAED,MAAMgB,aAAajG,aAChBgH,YAAY;AACX/B,UAAQgB,WAAWe,QAAQ;IAE7B,CAAC/B,QACH,CAAC;CAED,MAAMgC,cAAcjH,aACjBkH,SAAwBC,eAAoC;AAC3DlC,UAAQgC,YAAYC,SAASC,WAAW;IAE1C,CAAClC,QACH,CAAC;CAED,MAAMmC,iBAAiBpH,aAAkD+D,aAAmBxD,UAAU6G,eAAe9C,MAAMF,OAAOL,SAAO,EAAE,CAACO,MAAM,CAAC;CAEnJ,MAAMN,eAAehE,aAClBiE,cAAoD;AACnDqB,mBAAiBD,UAAUpB;;AAE3B,MAAI,CAACsB,kBACH;AAGFA,oBAAkBvB,aAAaC,UAAU;IAE3C,CAACsB,kBACH,CAAC;CAED,MAAM8B,2BAA2BrH,aAC9B+D,aAAW;EACV,MAAM6C,SAAO3B,QAAQnB,QAAQC,SAAO;AACpC,MAAI,CAACwB,qBAAqB,CAACqB,OACzB;EAEF,MAAMU,gBAAgBV,OAAK/B;AAC3B,MAAIyC,iBAAiBjH,cAAckH,eAAeD,cAAc,CAC9D;AAGF,SAAO;GACLA;GACAE,0BAA0BjG,YACxBgE,kBAAkBkC,oBAAoB;IACpCC,YAAYJ;IACZK,gBAAgBpG,SAAOoG;IACvBC,yBAAyBrG,SAAOqG;IACjC,CAAC;GACJD,gBAAgBf,OAAKe;GACrBE,oBAAoBtE,WAAW0B,QAAQ4C,kBAAkB9D,UAAQR,OAAO;GACxEuE,WAAWlB,OAAKmB;GAChBC,eAAeC,UAAUhD,QAAQiD,kBAAkBnE,UAAQkE,MAAK;GACjE;IAEH,CAAChD,SAASM,kBACZ,CAAC;AA2BD,QAAO;EACL,GA1BiCrF,cAAc;AAC/C,OAAIoE,MAAMF,MAAMO,SAAShB,MACvB,QAAO,EACLrB,wBAAwB;IACtBqB,OAAOW,MAAMF,MAAMO,SAAShB;IAC5BsC;IACAoB;IACF,EACD;AAEH,UAAO;IACL/E,wBAAwBC;IACxBC,mBAAmB8B,MAAM7B,YACrB;KACEA,WAAW6B,MAAM7B;KACjBqE;KACAG;KACAG;KACAnB;KACAoB;KACD,GACD9E;IACL;KACA;GAACuE;GAAYO;GAA0BD;GAAgBnB;GAAYgB;GAAa3C,MAAMF,MAAMO,SAAShB;GAAOW,MAAM7B;GAAU,CAAC;EAI9HoB,aAAa,CAAC,CAACS,MAAMF,MAAMO,SAASyD,aAAajC;EACjDtE;EACAiC;EACAE;EACD;;AAGH,SAASmB,sBAAsBkD,cAAkCjE,OAA+C;CAC9G,MAAMkE,kBAAkBlE,MAAMM,eAAeQ,IAAImD,aAAa;AAC9D,KAAI,CAACC,gBACH;AAGF,QAAOA,gBACJC,KAAKC,YAAYpE,MAAMI,SAASU,IAAIsD,QAAQ,CAAC,CAC7CjF,QAAQqD,SAAyC,CAAC,CAACA,KAAK,CACxD2B,KAAe3B,SAAS;AACvB,SAAOC,eAAeD,MAAMxC,MAAM;GAClC;;AAGN,SAASyC,eAAe4B,WAAmCrE,OAA4B;CACrF,IAAIsE;AACJ,QAAO;EACL,GAAGC,eAAeF,UAAU;EAC5B,IAAIC,WAAW;AACb,OAAI,CAACA,SACHA,YAAWvD,sBAAsBsD,UAAU7D,IAAIR,MAAM;AAEvD,UAAOsE,WAAWA,WAAWD,UAAUC,aAAa,OAAO,OAAO,EAAE;;EAEvE;;AAGH,SAASC,eAAe/B,MAA0D;AAChF,QAAO;EACLhC,IAAIgC,KAAKhC;EACTiE,OAAOjC,KAAKiC;EACZhE,UAAU+B,KAAK/B;EACfuD,WAAW,CAAC,CAACxB,KAAKwB;EAClBrB,YAAY,CAAC,CAACH,KAAKG;EACnB+B,cAAc,CAACzI,cAAckH,eAAeX,KAAK/B,SAAS,IAAI,CAAC,CAAC+B,KAAK/B,SAASkE,qBAAqBnC,KAAK8B;EACxGM,YAAY,CAAC,CAACpC,KAAKe;EACnBhE,OAAOiD,KAAKjD;EACb"}