From 279ba4235e2166e373c3ac51ea1bce4331851387 Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Fri, 17 Nov 2023 11:51:09 +1100 Subject: [PATCH 1/3] Fix resize observer loop limit --- .../virtualizer/src/ScrollView.tsx | 23 +++++++++++++++++-- .../list/test/ListView.test.js | 6 +++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/@react-aria/virtualizer/src/ScrollView.tsx b/packages/@react-aria/virtualizer/src/ScrollView.tsx index 348abd8b5a2..acd7cf270de 100644 --- a/packages/@react-aria/virtualizer/src/ScrollView.tsx +++ b/packages/@react-aria/virtualizer/src/ScrollView.tsx @@ -11,7 +11,7 @@ */ // @ts-ignore -import {flushSync} from 'react-dom'; +import ReactDOM, {flushSync} from 'react-dom'; import {getScrollLeft} from './utils'; import React, { CSSProperties, @@ -38,6 +38,8 @@ interface ScrollViewProps extends HTMLAttributes { scrollDirection?: 'horizontal' | 'vertical' | 'both' } +let isOldReact = React.version.startsWith('16.') || React.version.startsWith('17.'); + function ScrollView(props: ScrollViewProps, ref: RefObject) { let { contentSize, @@ -148,7 +150,24 @@ function ScrollView(props: ScrollViewProps, ref: RefObject) { useLayoutEffect(() => { updateSize(); }, [updateSize]); - useResizeObserver({ref, onResize: updateSize}); + let raf = useRef | null>(); + let onResize = () => { + if (isOldReact) { + raf.current ??= requestAnimationFrame(() => { + updateSize(); + }); + } else { + updateSize(); + } + }; + useResizeObserver({ref, onResize}); + useEffect(() => { + return () => { + if (raf.current) { + cancelAnimationFrame(raf.current); + } + }; + }, []); let style: React.CSSProperties = { // Reset padding so that relative positioning works correctly. Padding will be done in JS layout. diff --git a/packages/@react-spectrum/list/test/ListView.test.js b/packages/@react-spectrum/list/test/ListView.test.js index 84764c5f368..2ba182c84cf 100644 --- a/packages/@react-spectrum/list/test/ListView.test.js +++ b/packages/@react-spectrum/list/test/ListView.test.js @@ -1426,6 +1426,9 @@ describe('ListView', function () { act(() => { fireEvent(window, new Event('resize')); }); + act(() => { + jest.runAllTimers(); + }); await user.tab(); expect(grid.scrollTop).toBe(0); @@ -1475,6 +1478,9 @@ describe('ListView', function () { act(() => { fireEvent(window, new Event('resize')); }); + act(() => { + jest.runAllTimers(); + }); expect(grid.scrollTop).toBe(0); focusRow(tree, 'Item 1'); From f96f8586db6fa7ae3c22edf47237b434a04f1e1d Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Fri, 17 Nov 2023 11:55:11 +1100 Subject: [PATCH 2/3] fix scrolling --- packages/@react-aria/virtualizer/src/ScrollView.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@react-aria/virtualizer/src/ScrollView.tsx b/packages/@react-aria/virtualizer/src/ScrollView.tsx index acd7cf270de..82821240bf6 100644 --- a/packages/@react-aria/virtualizer/src/ScrollView.tsx +++ b/packages/@react-aria/virtualizer/src/ScrollView.tsx @@ -155,6 +155,7 @@ function ScrollView(props: ScrollViewProps, ref: RefObject) { if (isOldReact) { raf.current ??= requestAnimationFrame(() => { updateSize(); + raf.current = null; }); } else { updateSize(); From 6079b9ac0880b9e68f2cc640f39454ebfe8e5609 Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Fri, 17 Nov 2023 14:05:26 +1100 Subject: [PATCH 3/3] fix lint --- packages/@react-aria/virtualizer/src/ScrollView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@react-aria/virtualizer/src/ScrollView.tsx b/packages/@react-aria/virtualizer/src/ScrollView.tsx index 82821240bf6..b57347f9dd4 100644 --- a/packages/@react-aria/virtualizer/src/ScrollView.tsx +++ b/packages/@react-aria/virtualizer/src/ScrollView.tsx @@ -11,7 +11,7 @@ */ // @ts-ignore -import ReactDOM, {flushSync} from 'react-dom'; +import {flushSync} from 'react-dom'; import {getScrollLeft} from './utils'; import React, { CSSProperties,