Skip to content

Commit 69b7357

Browse files
authored
Merge pull request #10208 from Expensify/neil-visual-viewport-lib
Add cross platform VisualViewport lib for visual viewport resize
2 parents b0f80a4 + 04f48f7 commit 69b7357

File tree

3 files changed

+32
-7
lines changed

3 files changed

+32
-7
lines changed

src/libs/VisualViewport/index.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* Add a visual viewport resize listener if available. Return a function to remove the listener.
3+
*
4+
* @param {Function} onViewportResize
5+
* @returns {Function}
6+
*/
7+
function addViewportResizeListener(onViewportResize) {
8+
if (!window.visualViewport) {
9+
return () => {};
10+
}
11+
12+
window.visualViewport.addEventListener('resize', onViewportResize);
13+
return () => window.visualViewport.removeEventListener('resize', onViewportResize);
14+
}
15+
16+
export default addViewportResizeListener;
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
/**
3+
* Visual Viewport is not available on native, so return an empty function.
4+
*
5+
* @returns {Function}
6+
*/
7+
function addViewportResizeListener() {
8+
return () => {};
9+
}
10+
11+
export default addViewportResizeListener;

src/pages/home/ReportScreen.js

+5-7
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import ReportActionsSkeletonView from '../../components/ReportActionsSkeletonVie
2222
import reportActionPropTypes from './report/reportActionPropTypes';
2323
import ArchivedReportFooter from '../../components/ArchivedReportFooter';
2424
import toggleReportActionComposeView from '../../libs/toggleReportActionComposeView';
25+
import addViewportResizeListener from '../../libs/VisualViewport';
2526
import {withNetwork} from '../../components/OnyxProvider';
2627
import compose from '../../libs/compose';
2728
import networkPropTypes from '../../components/networkPropTypes';
@@ -118,7 +119,8 @@ class ReportScreen extends React.Component {
118119
super(props);
119120

120121
this.onSubmitComment = this.onSubmitComment.bind(this);
121-
this.viewportOffsetTop = this.updateViewportOffsetTop.bind(this);
122+
this.updateViewportOffsetTop = this.updateViewportOffsetTop.bind(this);
123+
this.removeViewportResizeListener = () => {};
122124

123125
this.state = {
124126
skeletonViewContainerHeight: 0,
@@ -128,9 +130,7 @@ class ReportScreen extends React.Component {
128130

129131
componentDidMount() {
130132
this.storeCurrentlyViewedReport();
131-
if (window.visualViewport) {
132-
window.visualViewport.addEventListener('resize', this.viewportOffsetTop);
133-
}
133+
this.removeViewportResizeListener = addViewportResizeListener(this.updateViewportOffsetTop);
134134
}
135135

136136
componentDidUpdate(prevProps) {
@@ -142,9 +142,7 @@ class ReportScreen extends React.Component {
142142

143143
componentWillUnmount() {
144144
clearTimeout(this.loadingTimerId);
145-
if (window.visualViewport) {
146-
window.visualViewport.removeEventListener('resize', this.viewportOffsetTop);
147-
}
145+
this.removeViewportResizeListener();
148146
}
149147

150148
/**

0 commit comments

Comments
 (0)