Skip to content

Commit 9fe4ec1

Browse files
authored
fix(useTreeData): insert items into a child node with StrictMode (adobe#9824)
* fix(useTreeData): insert items into a child node with StrictMode * fix 17/16
1 parent 3e9dac7 commit 9fe4ec1

File tree

3 files changed

+45
-4
lines changed

3 files changed

+45
-4
lines changed

packages/dev/test-utils/src/renderOverride.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ function customRender(ui: Parameters<typeof render>[0], options?: Parameters<typ
2525
let reactTestingLibrary = require('@testing-library/react');
2626
// export renderHook and actHook from testing-library/react-hooks library if they don't exist in @testing-library/react
2727
// (i.e. renderHook is only in v13+ of testing library)
28-
export let renderHook = reactTestingLibrary.renderHook as typeof originalRenderHook;
28+
export let renderHook: typeof originalRenderHook = (render, options) => reactTestingLibrary.renderHook(render, {wrapper: StrictModeWrapper, ...options});
2929
export let actHook = reactTestingLibrary.act as typeof originalAct;
30-
if (!renderHook) {
30+
if (!reactTestingLibrary.renderHook) {
3131
let rhtl = require('@testing-library/react-hooks');
32-
renderHook = rhtl.renderHook;
32+
renderHook = (render, options) => rhtl.renderHook(render, {wrapper: StrictModeWrapper, ...options});
3333
actHook = rhtl.act;
3434
}
3535

packages/react-stately/src/data/useTreeData.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ export function useTreeData<T extends object>(options: TreeOptions<T>): TreeData
261261
},
262262
insert(parentKey: Key | null, index: number, ...values: T[]) {
263263
setItems(({items, nodeMap: originalMap}) => {
264-
let {items: newNodes, nodeMap: newMap} = buildTree(values, originalMap, parentKey);
264+
let {items: newNodes, nodeMap: newMap} = buildTree(values, new Map(originalMap), parentKey);
265265

266266
// If parentKey is null, insert into the root.
267267
if (parentKey == null) {

packages/react-stately/test/data/useTreeData.test.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,26 @@ describe('useTreeData', function () {
6969
expect(result.current.items[0].children[0].children[1].value).toEqual({name: 'Devon'});
7070
expect(result.current.items[0].children[1]).toBe(initialResult.items[0].children[1]);
7171
expect(result.current.items[0].children[2]).toBe(initialResult.items[0].children[2]);
72+
73+
({result} = renderHook(() => useTreeData({initialItems: [], getChildren, getKey})));
74+
75+
expect(result.current.items).toHaveLength(0);
76+
77+
act(() => {
78+
result.current.insert(null, 0, {name: 'John'});
79+
});
80+
81+
expect(result.current.items).toHaveLength(1);
82+
expect(result.current.items[0].value).toEqual({name: 'John'});
83+
84+
act(() => {
85+
result.current.insert('John', 0, {name: 'Devon'});
86+
});
87+
88+
expect(result.current.items).toHaveLength(1);
89+
expect(result.current.items[0].value).toEqual({name: 'John'});
90+
expect(result.current.items[0].children).toHaveLength(1);
91+
expect(result.current.items[0].children[0].value).toEqual({name: 'Devon'});
7292
});
7393

7494
it('should insert multiple items into a child node', function () {
@@ -90,6 +110,27 @@ describe('useTreeData', function () {
90110
expect(result.current.items[0].children[0].children[2].value).toEqual({name: 'Danni'});
91111
expect(result.current.items[0].children[1]).toBe(initialResult.items[0].children[1]);
92112
expect(result.current.items[0].children[2]).toBe(initialResult.items[0].children[2]);
113+
114+
({result} = renderHook(() => useTreeData({initialItems: [], getChildren, getKey})));
115+
116+
expect(result.current.items).toHaveLength(0);
117+
118+
act(() => {
119+
result.current.insert(null, 0, {name: 'John'});
120+
});
121+
122+
expect(result.current.items).toHaveLength(1);
123+
expect(result.current.items[0].value).toEqual({name: 'John'});
124+
125+
act(() => {
126+
result.current.insert('John', 0, {name: 'Devon'}, {name: 'Danni'});
127+
});
128+
129+
expect(result.current.items).toHaveLength(1);
130+
expect(result.current.items[0].value).toEqual({name: 'John'});
131+
expect(result.current.items[0].children).toHaveLength(2);
132+
expect(result.current.items[0].children[0].value).toEqual({name: 'Devon'});
133+
expect(result.current.items[0].children[1].value).toEqual({name: 'Danni'});
93134
});
94135

95136
it('should insert an item into the root', function () {

0 commit comments

Comments
 (0)