diff --git a/packages/dev/test-utils/src/renderOverride.tsx b/packages/dev/test-utils/src/renderOverride.tsx index 16992acf2c8..aa0de262dc4 100644 --- a/packages/dev/test-utils/src/renderOverride.tsx +++ b/packages/dev/test-utils/src/renderOverride.tsx @@ -25,11 +25,11 @@ function customRender(ui: Parameters[0], options?: Parameters reactTestingLibrary.renderHook(render, {wrapper: StrictModeWrapper, ...options}); export let actHook = reactTestingLibrary.act as typeof originalAct; -if (!renderHook) { +if (!reactTestingLibrary.renderHook) { let rhtl = require('@testing-library/react-hooks'); - renderHook = rhtl.renderHook; + renderHook = (render, options) => rhtl.renderHook(render, {wrapper: StrictModeWrapper, ...options}); actHook = rhtl.act; } diff --git a/packages/react-stately/src/data/useTreeData.ts b/packages/react-stately/src/data/useTreeData.ts index 2efd5082eec..1d11b612a7f 100644 --- a/packages/react-stately/src/data/useTreeData.ts +++ b/packages/react-stately/src/data/useTreeData.ts @@ -261,7 +261,7 @@ export function useTreeData(options: TreeOptions): TreeData }, insert(parentKey: Key | null, index: number, ...values: T[]) { setItems(({items, nodeMap: originalMap}) => { - let {items: newNodes, nodeMap: newMap} = buildTree(values, originalMap, parentKey); + let {items: newNodes, nodeMap: newMap} = buildTree(values, new Map(originalMap), parentKey); // If parentKey is null, insert into the root. if (parentKey == null) { diff --git a/packages/react-stately/test/data/useTreeData.test.js b/packages/react-stately/test/data/useTreeData.test.js index 513d213c17b..187bd247d5d 100644 --- a/packages/react-stately/test/data/useTreeData.test.js +++ b/packages/react-stately/test/data/useTreeData.test.js @@ -69,6 +69,26 @@ describe('useTreeData', function () { expect(result.current.items[0].children[0].children[1].value).toEqual({name: 'Devon'}); expect(result.current.items[0].children[1]).toBe(initialResult.items[0].children[1]); expect(result.current.items[0].children[2]).toBe(initialResult.items[0].children[2]); + + ({result} = renderHook(() => useTreeData({initialItems: [], getChildren, getKey}))); + + expect(result.current.items).toHaveLength(0); + + act(() => { + result.current.insert(null, 0, {name: 'John'}); + }); + + expect(result.current.items).toHaveLength(1); + expect(result.current.items[0].value).toEqual({name: 'John'}); + + act(() => { + result.current.insert('John', 0, {name: 'Devon'}); + }); + + expect(result.current.items).toHaveLength(1); + expect(result.current.items[0].value).toEqual({name: 'John'}); + expect(result.current.items[0].children).toHaveLength(1); + expect(result.current.items[0].children[0].value).toEqual({name: 'Devon'}); }); it('should insert multiple items into a child node', function () { @@ -90,6 +110,27 @@ describe('useTreeData', function () { expect(result.current.items[0].children[0].children[2].value).toEqual({name: 'Danni'}); expect(result.current.items[0].children[1]).toBe(initialResult.items[0].children[1]); expect(result.current.items[0].children[2]).toBe(initialResult.items[0].children[2]); + + ({result} = renderHook(() => useTreeData({initialItems: [], getChildren, getKey}))); + + expect(result.current.items).toHaveLength(0); + + act(() => { + result.current.insert(null, 0, {name: 'John'}); + }); + + expect(result.current.items).toHaveLength(1); + expect(result.current.items[0].value).toEqual({name: 'John'}); + + act(() => { + result.current.insert('John', 0, {name: 'Devon'}, {name: 'Danni'}); + }); + + expect(result.current.items).toHaveLength(1); + expect(result.current.items[0].value).toEqual({name: 'John'}); + expect(result.current.items[0].children).toHaveLength(2); + expect(result.current.items[0].children[0].value).toEqual({name: 'Devon'}); + expect(result.current.items[0].children[1].value).toEqual({name: 'Danni'}); }); it('should insert an item into the root', function () {