Skip to content

Commit 95c404f

Browse files
committed
fix: handle possibilities of double fetching
1 parent dff97d5 commit 95c404f

File tree

2 files changed

+41
-25
lines changed

2 files changed

+41
-25
lines changed

packages/pluggableWidgets/tree-node-web/src/components/TreeNodeBranch.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,18 @@ export function TreeNodeBranch({
9393

9494
const loadChildNodes = useCallback(() => {
9595
if (isInfiniteTreeNodesEnabled && !isUserDefinedLeafNode) {
96-
fetchChildren(item).then(result => {
97-
if (Array.isArray(result) && result.length > 0) {
98-
// append children to the localized item
99-
appendChildren(result, item);
100-
} else {
101-
setIsActualLeafNode(true);
102-
}
103-
});
96+
fetchChildren(item)
97+
.then(result => {
98+
if (Array.isArray(result) && result.length > 0) {
99+
// append children to the localized item
100+
appendChildren(result, item);
101+
} else {
102+
setIsActualLeafNode(true);
103+
}
104+
})
105+
.catch(() => {
106+
// TODO handle error state
107+
});
104108
}
105109
}, [fetchChildren, item, appendChildren, isInfiniteTreeNodesEnabled, isUserDefinedLeafNode]);
106110

packages/pluggableWidgets/tree-node-web/src/components/hooks/useInfiniteTreeNodes.ts

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export function useInfiniteTreeNodes(props: TreeNodeContainerProps): {
5858
// trigger fetch children via datasource.setFilter
5959
const fetchChildren = useCallback(
6060
(item?: ItemType) => {
61-
return new Promise<TreeNodeItem[]>(resolve => {
61+
return new Promise<TreeNodeItem[]>((resolve, reject) => {
6262
if (isInfiniteTreeNodesEnabled && fetchingItem.current === undefined) {
6363
resolvePromise.current = resolve;
6464
if (Array.isArray(item)) {
@@ -67,6 +67,12 @@ export function useInfiniteTreeNodes(props: TreeNodeContainerProps): {
6767
fetchingItem.current = item;
6868
}
6969
datasource.setFilter(filterContent(item));
70+
} else {
71+
reject(
72+
new Error("Infinite Tree Nodes is not enabled or already fetching children", {
73+
cause: { code: 1 }
74+
})
75+
);
7076
}
7177
});
7278
},
@@ -175,23 +181,29 @@ export function useLocalizedTreeNode(
175181
useEffect(() => {
176182
if (isInfiniteTreeNodesEnabled) {
177183
if (Array.isArray(items)) {
178-
fetchChildren(items).then(childItems => {
179-
const newLocalizedItems = items.map(localItem => {
180-
const currentChildItems = childItems.filter(childItem => childItem.parentId === localItem.id);
181-
if (currentChildItems.length > 0) {
182-
return {
183-
...localItem,
184-
children: currentChildItems
185-
};
186-
} else {
187-
return {
188-
...localItem,
189-
isUserDefinedLeafNode: true
190-
};
191-
}
184+
fetchChildren(items)
185+
.then(childItems => {
186+
const newLocalizedItems = items.map(localItem => {
187+
const currentChildItems = childItems.filter(
188+
childItem => childItem.parentId === localItem.id
189+
);
190+
if (currentChildItems.length > 0) {
191+
return {
192+
...localItem,
193+
children: currentChildItems
194+
};
195+
} else {
196+
return {
197+
...localItem,
198+
isUserDefinedLeafNode: true
199+
};
200+
}
201+
});
202+
setLocalizedItems(newLocalizedItems);
203+
})
204+
.catch(() => {
205+
// TODO: handle error state
192206
});
193-
setLocalizedItems(newLocalizedItems);
194-
});
195207
}
196208
}
197209
}, [items, isInfiniteTreeNodesEnabled]);

0 commit comments

Comments
 (0)