* Re-factor postlist with VirtualizedList * Remove react-native-invertible-scroll-view dependency * Fix navigator not being pass to post * Feedback review * Feedback second review
54 lines
2.5 KiB
JavaScript
54 lines
2.5 KiB
JavaScript
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
|
|
// See License.txt for license information.
|
|
|
|
import {VirtualizedList} from 'react-native';
|
|
|
|
/* eslint-disable */
|
|
|
|
export default class Virtualized extends VirtualizedList {
|
|
_onScroll = (e) => {
|
|
if (this.props.onScroll) {
|
|
this.props.onScroll(e);
|
|
}
|
|
const timestamp = e.timeStamp;
|
|
const visibleLength = this._selectLength(e.nativeEvent.layoutMeasurement);
|
|
const contentLength = this._selectLength(e.nativeEvent.contentSize);
|
|
const offset = this._selectOffset(e.nativeEvent.contentOffset);
|
|
const dt = Math.max(1, timestamp - this._scrollMetrics.timestamp);
|
|
const dOffset = offset - this._scrollMetrics.offset;
|
|
const velocity = dOffset / dt;
|
|
this._scrollMetrics = {contentLength, dt, offset, timestamp, velocity, visibleLength};
|
|
const {data, getItemCount, onEndReached, onEndReachedThreshold, windowSize} = this.props;
|
|
this._updateViewableItems(data);
|
|
if (!data) {
|
|
return;
|
|
}
|
|
const distanceFromEnd = contentLength - visibleLength - offset;
|
|
const itemCount = getItemCount(data);
|
|
if (this.state.last === itemCount - 1 &&
|
|
distanceFromEnd <= onEndReachedThreshold &&
|
|
(this._hasDataChangedSinceEndReached ||
|
|
this._scrollMetrics.contentLength !== this._sentEndForContentLength)) {
|
|
// Only call onEndReached once for a given dataset + content length.
|
|
this._hasDataChangedSinceEndReached = false;
|
|
this._sentEndForContentLength = this._scrollMetrics.contentLength;
|
|
onEndReached({distanceFromEnd});
|
|
}
|
|
const {first, last} = this.state;
|
|
if ((first > 0 && velocity < 0) || (last < itemCount - 1 && velocity > 0)) {
|
|
const distanceToContentEdge = Math.min(
|
|
Math.abs(this._getFrameMetricsApprox(first).offset - offset),
|
|
Math.abs(this._getFrameMetricsApprox(last).offset - (offset + visibleLength)),
|
|
);
|
|
const hiPri = distanceToContentEdge < (windowSize * visibleLength / 4);
|
|
if (hiPri) {
|
|
// Don't worry about interactions when scrolling quickly; focus on filling content as fast
|
|
// as possible.
|
|
this._updateCellsToRenderBatcher.dispose({abort: true});
|
|
this._updateCellsToRender();
|
|
return;
|
|
}
|
|
}
|
|
this._updateCellsToRenderBatcher.schedule();
|
|
};
|
|
}
|