From e7360ff36d246b5b71cd6ede78f6a2c16f10f22e Mon Sep 17 00:00:00 2001 From: eps1lon Date: Fri, 20 Aug 2021 11:37:50 +0200 Subject: [PATCH 1/3] Current behavior for index change --- .../src/__tests__/treeContext-test.js | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/packages/react-devtools-shared/src/__tests__/treeContext-test.js b/packages/react-devtools-shared/src/__tests__/treeContext-test.js index 0db248c017861..13d0c56e52b58 100644 --- a/packages/react-devtools-shared/src/__tests__/treeContext-test.js +++ b/packages/react-devtools-shared/src/__tests__/treeContext-test.js @@ -2119,6 +2119,64 @@ describe('TreeListContext', () => { `); }); + it('should update correctly when elements are added/removed', () => { + const container = document.createElement('div'); + let errored = false; + function ErrorOnce() { + if (!errored) { + errored = true; + console.error('test-only:one-time-error'); + } + return null; + } + withErrorsOrWarningsIgnored(['test-only:'], () => + utils.act(() => + legacyRender( + + + , + container, + ), + ), + ); + + let renderer; + utils.act(() => (renderer = TestRenderer.create())); + expect(state).toMatchInlineSnapshot(` + ✕ 1, ⚠ 0 + [root] + ✕ + `); + + withErrorsOrWarningsIgnored(['test-only:'], () => + utils.act(() => + legacyRender( + + + + , + container, + ), + ), + ); + + utils.act(() => renderer.update()); + expect(state).toMatchInlineSnapshot(` + ✕ 1, ⚠ 0 + [root] + + ✕ + `); + + selectNextErrorOrWarning(); + expect(state).toMatchInlineSnapshot(` + ✕ 1, ⚠ 0 + [root] + → + ✕ + `); + }); + it('should update select and auto-expand parts components within hidden parts of the tree', () => { const Wrapper = ({children}) => children; From 8995c812dc810fb998193675543888d54a0e6b58 Mon Sep 17 00:00:00 2001 From: eps1lon Date: Fri, 20 Aug 2021 11:38:26 +0200 Subject: [PATCH 2/3] fix: update error indices when elements are added/removed --- .../src/__tests__/treeContext-test.js | 4 ++-- packages/react-devtools-shared/src/devtools/store.js | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/react-devtools-shared/src/__tests__/treeContext-test.js b/packages/react-devtools-shared/src/__tests__/treeContext-test.js index 13d0c56e52b58..30d21c0335ddb 100644 --- a/packages/react-devtools-shared/src/__tests__/treeContext-test.js +++ b/packages/react-devtools-shared/src/__tests__/treeContext-test.js @@ -2172,8 +2172,8 @@ describe('TreeListContext', () => { expect(state).toMatchInlineSnapshot(` ✕ 1, ⚠ 0 [root] - → - ✕ + + → ✕ `); }); diff --git a/packages/react-devtools-shared/src/devtools/store.js b/packages/react-devtools-shared/src/devtools/store.js index 16bc56ae64f07..7e96d7dd025b7 100644 --- a/packages/react-devtools-shared/src/devtools/store.js +++ b/packages/react-devtools-shared/src/devtools/store.js @@ -1187,6 +1187,15 @@ export default class Store extends EventEmitter<{| console.groupEnd(); } + const indicesOfCachedErrorsOrWarningsAreStale = + !haveErrorsOrWarningsChanged && + (addedElementIDs.length > 0 || removedElementIDs.length > 0); + if (indicesOfCachedErrorsOrWarningsAreStale) { + this._cachedErrorAndWarningTuples.forEach(entry => { + entry.index = this.getIndexOfElementID(entry.id); + }); + } + this.emit('mutated', [addedElementIDs, removedElementIDs]); }; From 42d4bd6507ed8aee8ba2c3b4dd7533274651aa39 Mon Sep 17 00:00:00 2001 From: eps1lon Date: Fri, 20 Aug 2021 11:48:35 +0200 Subject: [PATCH 3/3] get flow in line --- packages/react-devtools-shared/src/devtools/store.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/react-devtools-shared/src/devtools/store.js b/packages/react-devtools-shared/src/devtools/store.js index 7e96d7dd025b7..7cd5c41e8b0d7 100644 --- a/packages/react-devtools-shared/src/devtools/store.js +++ b/packages/react-devtools-shared/src/devtools/store.js @@ -1189,10 +1189,13 @@ export default class Store extends EventEmitter<{| const indicesOfCachedErrorsOrWarningsAreStale = !haveErrorsOrWarningsChanged && - (addedElementIDs.length > 0 || removedElementIDs.length > 0); + (addedElementIDs.length > 0 || removedElementIDs.size > 0); if (indicesOfCachedErrorsOrWarningsAreStale) { this._cachedErrorAndWarningTuples.forEach(entry => { - entry.index = this.getIndexOfElementID(entry.id); + const index = this.getIndexOfElementID(entry.id); + if (index !== null) { + entry.index = index; + } }); }