Replace onScrollToBottom with onLoadMore (#6615)
onScrollToBottom was a function to run instead of onScrollToTop and onScroll when scrolling to the bottom. The behavior to prevent onScrollToTop was inconvenient because the viewport can be at the bottom and at the top at the same time if the viewport is larger than the container. onScrollToBottom was also called when the button to load more is clicked on contray to the name suggests, which led notifications and status_list_container components to mark the scrolled location is not at the top mistakenly. onLoadMore is a replacement for onScrollToBottom. It will be called independently from onScrollToTop and onScroll.gh/stable
parent
a38dbd9c8a
commit
b0664a5e6c
|
@ -17,7 +17,7 @@ export default class ScrollableList extends PureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
scrollKey: PropTypes.string.isRequired,
|
scrollKey: PropTypes.string.isRequired,
|
||||||
onScrollToBottom: PropTypes.func,
|
onLoadMore: PropTypes.func.isRequired,
|
||||||
onScrollToTop: PropTypes.func,
|
onScrollToTop: PropTypes.func,
|
||||||
onScroll: PropTypes.func,
|
onScroll: PropTypes.func,
|
||||||
trackScroll: PropTypes.bool,
|
trackScroll: PropTypes.bool,
|
||||||
|
@ -45,9 +45,11 @@ export default class ScrollableList extends PureComponent {
|
||||||
const offset = scrollHeight - scrollTop - clientHeight;
|
const offset = scrollHeight - scrollTop - clientHeight;
|
||||||
this._oldScrollPosition = scrollHeight - scrollTop;
|
this._oldScrollPosition = scrollHeight - scrollTop;
|
||||||
|
|
||||||
if (400 > offset && this.props.onScrollToBottom && !this.props.isLoading) {
|
if (400 > offset && this.props.onLoadMore && !this.props.isLoading) {
|
||||||
this.props.onScrollToBottom();
|
this.props.onLoadMore();
|
||||||
} else if (scrollTop < 100 && this.props.onScrollToTop) {
|
}
|
||||||
|
|
||||||
|
if (scrollTop < 100 && this.props.onScrollToTop) {
|
||||||
this.props.onScrollToTop();
|
this.props.onScrollToTop();
|
||||||
} else if (this.props.onScroll) {
|
} else if (this.props.onScroll) {
|
||||||
this.props.onScroll();
|
this.props.onScroll();
|
||||||
|
@ -138,7 +140,7 @@ export default class ScrollableList extends PureComponent {
|
||||||
|
|
||||||
handleLoadMore = (e) => {
|
handleLoadMore = (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.props.onScrollToBottom();
|
this.props.onLoadMore();
|
||||||
}
|
}
|
||||||
|
|
||||||
_recentlyMoved () {
|
_recentlyMoved () {
|
||||||
|
|
|
@ -12,7 +12,7 @@ export default class StatusList extends ImmutablePureComponent {
|
||||||
scrollKey: PropTypes.string.isRequired,
|
scrollKey: PropTypes.string.isRequired,
|
||||||
statusIds: ImmutablePropTypes.list.isRequired,
|
statusIds: ImmutablePropTypes.list.isRequired,
|
||||||
featuredStatusIds: ImmutablePropTypes.list,
|
featuredStatusIds: ImmutablePropTypes.list,
|
||||||
onScrollToBottom: PropTypes.func,
|
onLoadMore: PropTypes.func,
|
||||||
onScrollToTop: PropTypes.func,
|
onScrollToTop: PropTypes.func,
|
||||||
onScroll: PropTypes.func,
|
onScroll: PropTypes.func,
|
||||||
trackScroll: PropTypes.bool,
|
trackScroll: PropTypes.bool,
|
||||||
|
|
|
@ -52,7 +52,7 @@ export default class AccountTimeline extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleScrollToBottom = () => {
|
handleLoadMore = () => {
|
||||||
if (!this.props.isLoading && this.props.hasMore) {
|
if (!this.props.isLoading && this.props.hasMore) {
|
||||||
this.props.dispatch(expandAccountTimeline(this.props.params.accountId, this.props.withReplies));
|
this.props.dispatch(expandAccountTimeline(this.props.params.accountId, this.props.withReplies));
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ export default class AccountTimeline extends ImmutablePureComponent {
|
||||||
featuredStatusIds={featuredStatusIds}
|
featuredStatusIds={featuredStatusIds}
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
hasMore={hasMore}
|
hasMore={hasMore}
|
||||||
onScrollToBottom={this.handleScrollToBottom}
|
onLoadMore={this.handleLoadMore}
|
||||||
/>
|
/>
|
||||||
</Column>
|
</Column>
|
||||||
);
|
);
|
||||||
|
|
|
@ -62,7 +62,7 @@ export default class Favourites extends ImmutablePureComponent {
|
||||||
this.column = c;
|
this.column = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
handleScrollToBottom = debounce(() => {
|
handleLoadMore = debounce(() => {
|
||||||
this.props.dispatch(expandFavouritedStatuses());
|
this.props.dispatch(expandFavouritedStatuses());
|
||||||
}, 300, { leading: true })
|
}, 300, { leading: true })
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ export default class Favourites extends ImmutablePureComponent {
|
||||||
scrollKey={`favourited_statuses-${columnId}`}
|
scrollKey={`favourited_statuses-${columnId}`}
|
||||||
hasMore={hasMore}
|
hasMore={hasMore}
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
onScrollToBottom={this.handleScrollToBottom}
|
onLoadMore={this.handleLoadMore}
|
||||||
/>
|
/>
|
||||||
</Column>
|
</Column>
|
||||||
);
|
);
|
||||||
|
|
|
@ -51,14 +51,13 @@ export default class Notifications extends React.PureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
componentWillUnmount () {
|
componentWillUnmount () {
|
||||||
this.handleScrollToBottom.cancel();
|
this.handleLoadMore.cancel();
|
||||||
this.handleScrollToTop.cancel();
|
this.handleScrollToTop.cancel();
|
||||||
this.handleScroll.cancel();
|
this.handleScroll.cancel();
|
||||||
this.props.dispatch(scrollTopNotifications(false));
|
this.props.dispatch(scrollTopNotifications(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
handleScrollToBottom = debounce(() => {
|
handleLoadMore = debounce(() => {
|
||||||
this.props.dispatch(scrollTopNotifications(false));
|
|
||||||
this.props.dispatch(expandNotifications());
|
this.props.dispatch(expandNotifications());
|
||||||
}, 300, { leading: true });
|
}, 300, { leading: true });
|
||||||
|
|
||||||
|
@ -143,7 +142,7 @@ export default class Notifications extends React.PureComponent {
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
hasMore={hasMore}
|
hasMore={hasMore}
|
||||||
emptyMessage={emptyMessage}
|
emptyMessage={emptyMessage}
|
||||||
onScrollToBottom={this.handleScrollToBottom}
|
onLoadMore={this.handleLoadMore}
|
||||||
onScrollToTop={this.handleScrollToTop}
|
onScrollToTop={this.handleScrollToTop}
|
||||||
onScroll={this.handleScroll}
|
onScroll={this.handleScroll}
|
||||||
shouldUpdateScroll={shouldUpdateScroll}
|
shouldUpdateScroll={shouldUpdateScroll}
|
||||||
|
|
|
@ -56,10 +56,7 @@ const makeMapStateToProps = () => {
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch, { timelineId, loadMore }) => ({
|
const mapDispatchToProps = (dispatch, { timelineId, loadMore }) => ({
|
||||||
|
|
||||||
onScrollToBottom: debounce(() => {
|
onLoadMore: debounce(loadMore, 300, { leading: true }),
|
||||||
dispatch(scrollTopTimeline(timelineId, false));
|
|
||||||
loadMore();
|
|
||||||
}, 300, { leading: true }),
|
|
||||||
|
|
||||||
onScrollToTop: debounce(() => {
|
onScrollToTop: debounce(() => {
|
||||||
dispatch(scrollTopTimeline(timelineId, true));
|
dispatch(scrollTopTimeline(timelineId, true));
|
||||||
|
|
Reference in New Issue