Skip to content

Commit

Permalink
Merge pull request #41189 from janicduplessis/@janic/osr-improvement-…
Browse files Browse the repository at this point in the history
…patch
  • Loading branch information
francoisl authored Apr 29, 2024
2 parents 41ed79d + a6ff12b commit 7ca0dba
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
diff --git a/node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.js b/node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.js
index e338d90..70a59bf 100644
--- a/node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.js
+++ b/node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.js
@@ -1219,7 +1219,7 @@ class VirtualizedList extends StateSafePureComponent<Props, State> {
zoomScale: 1,
};
_scrollRef: ?React.ElementRef<any> = null;
- _sentStartForContentLength = 0;
+ _sentStartForFirstVisibleItemKey: ?string = null;
_sentEndForContentLength = 0;
_updateCellsToRenderBatcher: Batchinator;
_viewabilityTuples: Array<ViewabilityHelperCallbackTuple> = [];
@@ -1550,16 +1550,16 @@ class VirtualizedList extends StateSafePureComponent<Props, State> {
onStartReached != null &&
this.state.cellsAroundViewport.first === 0 &&
isWithinStartThreshold &&
- this._listMetrics.getContentLength() !== this._sentStartForContentLength
+ this.state.firstVisibleItemKey !== this._sentStartForFirstVisibleItemKey
) {
- this._sentStartForContentLength = this._listMetrics.getContentLength();
+ this._sentStartForFirstVisibleItemKey = this.state.firstVisibleItemKey;
onStartReached({distanceFromStart});
}

// If the user scrolls away from the start or end and back again,
// cause onStartReached or onEndReached to be triggered again
if (!isWithinStartThreshold) {
- this._sentStartForContentLength = 0;
+ this._sentStartForFirstVisibleItemKey = null;
}
if (!isWithinEndThreshold) {
this._sentEndForContentLength = 0;
70 changes: 70 additions & 0 deletions patches/react-native-web+0.19.9+007+osr-improvement.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
diff --git a/node_modules/react-native-web/dist/vendor/react-native/VirtualizedList/index.js b/node_modules/react-native-web/dist/vendor/react-native/VirtualizedList/index.js
index b05da08..80aea85 100644
--- a/node_modules/react-native-web/dist/vendor/react-native/VirtualizedList/index.js
+++ b/node_modules/react-native-web/dist/vendor/react-native/VirtualizedList/index.js
@@ -332,7 +332,7 @@ class VirtualizedList extends StateSafePureComponent {
zoomScale: 1
};
this._scrollRef = null;
- this._sentStartForContentLength = 0;
+ this._sentStartForFirstVisibleItemKey = null;
this._sentEndForContentLength = 0;
this._totalCellLength = 0;
this._totalCellsMeasured = 0;
@@ -1397,8 +1397,8 @@ class VirtualizedList extends StateSafePureComponent {
// Next check if the user just scrolled within the start threshold
// and call onStartReached only once for a given content length,
// and only if onEndReached is not being executed
- else if (onStartReached != null && this.state.cellsAroundViewport.first === 0 && isWithinStartThreshold && this._scrollMetrics.contentLength !== this._sentStartForContentLength) {
- this._sentStartForContentLength = this._scrollMetrics.contentLength;
+ else if (onStartReached != null && this.state.cellsAroundViewport.first === 0 && isWithinStartThreshold && this.state.firstVisibleItemKey !== this._sentStartForFirstVisibleItemKey) {
+ this._sentStartForFirstVisibleItemKey = this.state.firstVisibleItemKey;
onStartReached({
distanceFromStart
});
@@ -1407,7 +1407,7 @@ class VirtualizedList extends StateSafePureComponent {
// If the user scrolls away from the start or end and back again,
// cause onStartReached or onEndReached to be triggered again
else {
- this._sentStartForContentLength = isWithinStartThreshold ? this._sentStartForContentLength : 0;
+ this._sentStartForFirstVisibleItemKey = isWithinStartThreshold ? this._sentStartForFirstVisibleItemKey : null;
this._sentEndForContentLength = isWithinEndThreshold ? this._sentEndForContentLength : 0;
}
}
diff --git a/node_modules/react-native-web/src/vendor/react-native/VirtualizedList/index.js b/node_modules/react-native-web/src/vendor/react-native/VirtualizedList/index.js
index 459f017..799a6ee 100644
--- a/node_modules/react-native-web/src/vendor/react-native/VirtualizedList/index.js
+++ b/node_modules/react-native-web/src/vendor/react-native/VirtualizedList/index.js
@@ -1325,7 +1325,7 @@ class VirtualizedList extends StateSafePureComponent<Props, State> {
zoomScale: 1,
};
_scrollRef: ?React.ElementRef<any> = null;
- _sentStartForContentLength = 0;
+ _sentStartForFirstVisibleItemKey: ?string = null;
_sentEndForContentLength = 0;
_totalCellLength = 0;
_totalCellsMeasured = 0;
@@ -1675,18 +1675,18 @@ class VirtualizedList extends StateSafePureComponent<Props, State> {
onStartReached != null &&
this.state.cellsAroundViewport.first === 0 &&
isWithinStartThreshold &&
- this._scrollMetrics.contentLength !== this._sentStartForContentLength
+ this.state.firstVisibleItemKey !== this._sentStartForFirstVisibleItemKey
) {
- this._sentStartForContentLength = this._scrollMetrics.contentLength;
+ this._sentStartForFirstVisibleItemKey = this.state.firstVisibleItemKey;
onStartReached({distanceFromStart});
}

// If the user scrolls away from the start or end and back again,
// cause onStartReached or onEndReached to be triggered again
else {
- this._sentStartForContentLength = isWithinStartThreshold
- ? this._sentStartForContentLength
- : 0;
+ this._sentStartForFirstVisibleItemKey = isWithinStartThreshold
+ ? this._sentStartForFirstVisibleItemKey
+ : null;
this._sentEndForContentLength = isWithinEndThreshold
? this._sentEndForContentLength
: 0;

0 comments on commit 7ca0dba

Please sign in to comment.