diff --git a/InfiniteScrollView.js b/InfiniteScrollView.js index c26f716..81c2cd1 100644 --- a/InfiniteScrollView.js +++ b/InfiniteScrollView.js @@ -11,6 +11,7 @@ import ScrollableMixin from 'react-native-scrollable-mixin'; import cloneReferencedElement from 'react-clone-referenced-element'; import DefaultLoadingIndicator from './DefaultLoadingIndicator'; +import getDistanceFromEnd from './distanceFromEnd'; export default class InfiniteScrollView extends React.Component { static propTypes = { @@ -44,6 +45,7 @@ export default class InfiniteScrollView extends React.Component { this._handleScroll = this._handleScroll.bind(this); this._loadMoreAsync = this._loadMoreAsync.bind(this); + this._distanceFromEnd = getDistanceFromEnd.bind(this); } getScrollResponder() { @@ -125,33 +127,6 @@ export default class InfiniteScrollView extends React.Component { this.setState({isLoading: false}); } } - - _distanceFromEnd(event): number { - let { - contentSize, - contentInset, - contentOffset, - layoutMeasurement, - } = event.nativeEvent; - - let contentLength; - let trailingInset; - let scrollOffset; - let viewportLength; - if (this.props.horizontal) { - contentLength = contentSize.width; - trailingInset = contentInset.right; - scrollOffset = contentOffset.x; - viewportLength = layoutMeasurement.width; - } else { - contentLength = contentSize.height; - trailingInset = contentInset.bottom; - scrollOffset = contentOffset.y; - viewportLength = layoutMeasurement.height; - } - - return contentLength + trailingInset - scrollOffset - viewportLength; - } } Object.assign(InfiniteScrollView.prototype, ScrollableMixin); diff --git a/distanceFromEnd.android.js b/distanceFromEnd.android.js new file mode 100644 index 0000000..9bb8bfc --- /dev/null +++ b/distanceFromEnd.android.js @@ -0,0 +1,2 @@ +import distanceFromEnd from './distanceFromEnd.mobile'; +export default distanceFromEnd; diff --git a/distanceFromEnd.ios.js b/distanceFromEnd.ios.js new file mode 100644 index 0000000..9bb8bfc --- /dev/null +++ b/distanceFromEnd.ios.js @@ -0,0 +1,2 @@ +import distanceFromEnd from './distanceFromEnd.mobile'; +export default distanceFromEnd; diff --git a/distanceFromEnd.mobile.js b/distanceFromEnd.mobile.js new file mode 100644 index 0000000..969f9b9 --- /dev/null +++ b/distanceFromEnd.mobile.js @@ -0,0 +1,26 @@ +export default function getDistanceFromEnd(event): number { + let { + contentSize, + contentInset, + contentOffset, + layoutMeasurement, + } = event.nativeEvent; + + let contentLength; + let trailingInset; + let scrollOffset; + let viewportLength; + if (this.props.horizontal) { + contentLength = contentSize.width; + trailingInset = contentInset.right; + scrollOffset = contentOffset.x; + viewportLength = layoutMeasurement.width; + } else { + contentLength = contentSize.height; + trailingInset = contentInset.bottom; + scrollOffset = contentOffset.y; + viewportLength = layoutMeasurement.height; + } + + return contentLength + trailingInset - scrollOffset - viewportLength; +} diff --git a/distanceFromEnd.web.js b/distanceFromEnd.web.js new file mode 100644 index 0000000..1f91473 --- /dev/null +++ b/distanceFromEnd.web.js @@ -0,0 +1,11 @@ +import ReactDOM from 'react-dom'; + +export default function getDistanceFromEnd(event): number { + // from react-web's ListView + const isVertical = !this.props.horizontal; + const target = ReactDOM.findDOMNode(this._scrollComponent); + const visibleLength = target[isVertical ? 'offsetHeight' : 'offsetWidth']; + const contentLength = target[isVertical ? 'scrollHeight' : 'scrollWidth']; + const offset = target[isVertical ? 'scrollTop' : 'scrollLeft']; + return contentLength - visibleLength - offset; +}