Skip to content

Commit e106121

Browse files
dlechlukasbach
authored andcommitted
useControlledTreeEnvironmentProps: don't use setTimeout
Using `setTimeout()` to defer setting state in React causes issues with testing, particularly with `@testing-library/react`. It prints errors to the console that an action is not wrapped in `act()`. This reworks the code to avoid the defered state update.
1 parent c209f19 commit e106121

File tree

1 file changed

+25
-33
lines changed

1 file changed

+25
-33
lines changed

packages/core/src/controlledEnvironment/useControlledTreeEnvironmentProps.ts

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import { useCallback, useEffect, useMemo, useState } from 'react';
1+
import { useCallback, useMemo, useState } from 'react';
22
import {
33
ControlledTreeEnvironmentProps,
4-
LinearItem,
54
TreeChangeHandlers,
65
TreeConfiguration,
76
TreeEnvironmentContextProps,
@@ -11,7 +10,6 @@ import { useRenderers } from '../renderers/useRenderers';
1110
import { buildMapForTrees, getDocument } from '../utils';
1211
import { getItemsLinearly } from '../tree/getItemsLinearly';
1312
import { useRefCopy } from '../useRefCopy';
14-
import { useStableHandler } from '../use-stable-handler';
1513

1614
export const useControlledTreeEnvironmentProps = ({
1715
onExpandItem: onExpandItemProp,
@@ -20,34 +18,29 @@ export const useControlledTreeEnvironmentProps = ({
2018
...props
2119
}: ControlledTreeEnvironmentProps): TreeEnvironmentContextProps => {
2220
const [trees, setTrees] = useState<Record<string, TreeConfiguration>>({});
23-
const [linearItems, setLinearItems] = useState<Record<string, LinearItem[]>>(
24-
{}
25-
);
2621
const [activeTreeId, setActiveTreeId] = useState<string>();
2722

28-
const viewStateRef = useRefCopy(props.viewState);
29-
3023
const treeIds = useMemo(() => Object.keys(trees), [trees]);
3124

32-
const { onFocusItem, autoFocus, onRegisterTree, onUnregisterTree, items } =
33-
props;
25+
const {
26+
onFocusItem,
27+
autoFocus,
28+
onRegisterTree,
29+
onUnregisterTree,
30+
items,
31+
viewState,
32+
} = props;
3433

3534
const onFocusItemRef = useRefCopy(onFocusItem);
36-
37-
const updateLinearItems = useStableHandler(() => {
38-
setTimeout(() => {
39-
setLinearItems(
40-
buildMapForTrees(treeIds, treeId =>
41-
getItemsLinearly(
42-
trees[treeId].rootItem,
43-
viewStateRef.current[treeId] ?? {},
44-
items
45-
)
46-
)
47-
);
48-
});
49-
});
50-
useEffect(() => updateLinearItems(), [items, treeIds, updateLinearItems]);
35+
const viewStateRef = useRefCopy(viewState);
36+
37+
const linearItems = useMemo(
38+
() =>
39+
buildMapForTrees(treeIds, treeId =>
40+
getItemsLinearly(trees[treeId].rootItem, viewState[treeId] ?? {}, items)
41+
),
42+
[trees, items, treeIds, viewState]
43+
);
5144

5245
const onFocusItemHandler = useCallback<
5346
Required<TreeChangeHandlers>['onFocusItem']
@@ -84,9 +77,8 @@ export const useControlledTreeEnvironmentProps = ({
8477
tree => {
8578
setTrees(trees => ({ ...trees, [tree.treeId]: tree }));
8679
onRegisterTree?.(tree);
87-
updateLinearItems();
8880
},
89-
[onRegisterTree, updateLinearItems]
81+
[onRegisterTree]
9082
);
9183

9284
const unregisterTree = useCallback(
@@ -101,25 +93,25 @@ export const useControlledTreeEnvironmentProps = ({
10193
const onCollapseItem = useCallback(
10294
(item, treeId) => {
10395
onCollapseProp?.(item, treeId);
104-
updateLinearItems();
96+
setTrees(trees => trees);
10597
},
106-
[onCollapseProp, updateLinearItems]
98+
[onCollapseProp]
10799
);
108100

109101
const onExpandItem = useCallback(
110102
(item, treeId) => {
111103
onExpandItemProp?.(item, treeId);
112-
updateLinearItems();
104+
setTrees(trees => trees);
113105
},
114-
[onExpandItemProp, updateLinearItems]
106+
[onExpandItemProp]
115107
);
116108

117109
const onDrop = useCallback(
118110
(items, target) => {
119111
onDropProp?.(items, target);
120-
updateLinearItems();
112+
setTrees(trees => trees);
121113
},
122-
[onDropProp, updateLinearItems]
114+
[onDropProp]
123115
);
124116

125117
const focusTree = useCallback((treeId: string) => {

0 commit comments

Comments
 (0)