From f7cbc817a5a700a2e103b79e20ba8d8190f1ce37 Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Mon, 6 Nov 2023 09:07:08 +1100 Subject: [PATCH 1/2] Fix Table resize observer warning in React 16/17 --- .../virtualizer/src/Virtualizer.ts | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/@react-stately/virtualizer/src/Virtualizer.ts b/packages/@react-stately/virtualizer/src/Virtualizer.ts index 232827a2dd4..785fd9df374 100644 --- a/packages/@react-stately/virtualizer/src/Virtualizer.ts +++ b/packages/@react-stately/virtualizer/src/Virtualizer.ts @@ -24,6 +24,7 @@ import {Layout} from './Layout'; import {LayoutInfo} from './LayoutInfo'; import {OverscanManager} from './OverscanManager'; import {Point} from './Point'; +import React from 'react'; import {Rect} from './Rect'; import {ReusableView} from './ReusableView'; import {Size} from './Size'; @@ -184,11 +185,18 @@ export class Virtualizer { this._visibleRect = rect; if (shouldInvalidate) { - // We are already in a layout effect when this method is called, so relayoutNow is appropriate. - this.relayoutNow({ - offsetChanged: !rect.pointEquals(current), - sizeChanged: !rect.sizeEquals(current) - }); + if (React.version.startsWith('16.') || React.version.startsWith('17.')) { + this.relayout({ + offsetChanged: !rect.pointEquals(current), + sizeChanged: !rect.sizeEquals(current) + }); + } else { + // We are already in a layout effect when this method is called, so relayoutNow is appropriate. + this.relayoutNow({ + offsetChanged: !rect.pointEquals(current), + sizeChanged: !rect.sizeEquals(current) + }); + } } else { this.updateSubviews(forceUpdate); } @@ -460,6 +468,12 @@ export class Virtualizer { } this._invalidationContext = context; + if (React.version.startsWith('16.') || React.version.startsWith('17.')) { + this._relayoutRaf = requestAnimationFrame(() => { + this._relayoutRaf = null; + this.relayoutNow(); + }); + } } /** @@ -812,7 +826,7 @@ export class Virtualizer { afterRender() { if (this._transactionQueue.length > 0) { this._processTransactionQueue(); - } else if (this._invalidationContext) { + } else if (this._invalidationContext && !React.version.startsWith('16.') && !React.version.startsWith('17.')) { this.relayoutNow(); } From d8f1b8bf52e58bc2caf7ffa24b9af390cb31fb9b Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Thu, 16 Nov 2023 15:57:03 +1100 Subject: [PATCH 2/2] fix Listbox tests --- packages/@react-spectrum/listbox/test/ListBox.test.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/@react-spectrum/listbox/test/ListBox.test.js b/packages/@react-spectrum/listbox/test/ListBox.test.js index f60ea193012..4b474822cd3 100644 --- a/packages/@react-spectrum/listbox/test/ListBox.test.js +++ b/packages/@react-spectrum/listbox/test/ListBox.test.js @@ -968,6 +968,7 @@ describe('ListBox', function () { ); + act(() => jest.runAllTimers()); let items = getAllByRole('option'); for (let item of items) { @@ -992,6 +993,7 @@ describe('ListBox', function () { ); + act(() => jest.runAllTimers()); let items = getAllByRole('option'); for (let item of items) { @@ -1026,6 +1028,7 @@ describe('ListBox', function () { ); + act(() => jest.runAllTimers()); let items = getAllByRole('option'); trigger(items[0]);