Auto-load more message if user scrolls near the top of the conversation.

// FREEBIE
pull/1/head
Matthew Chen 7 years ago
parent 7249a04a80
commit 45ba79d296

@ -464,7 +464,6 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
[self createScrollButtons];
[self createHeaderViews];
[self addNotificationListeners];
[self updateShowLoadMoreHeader];
}
- (void)createContents
@ -1421,6 +1420,22 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
[self showConversationSettings];
}
#pragma mark - Load More
- (void)autoLoadMoreIfNecessary
{
if (self.isUserScrolling || !self.isViewVisible || self.isAppInBackground) {
return;
}
if (!self.showLoadMoreHeader) {
return;
}
static const CGFloat kThreshold = 50.f;
if (self.collectionView.contentOffset.y < kThreshold) {
[self loadMoreMessages];
}
}
- (void)loadMoreHeaderTapped:(id)sender
{
if (self.isUserScrolling) {
@ -1428,6 +1443,11 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
return;
}
[self loadMoreMessages];
}
- (void)loadMoreMessages
{
BOOL hasEarlierUnseenMessages = self.dynamicInteractions.hasMoreUnseenMessages;
// We want to restore the current scroll state after we update the range, update
@ -1448,29 +1468,22 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
if (hasEarlierUnseenMessages) {
[self scrollToUnreadIndicatorAnimated];
}
[self updateShowLoadMoreHeader];
}
- (BOOL)shouldShowLoadEarlierMessages
- (void)updateShowLoadMoreHeader
{
if (self.page == kYapDatabaseMaxPageCount - 1) {
return NO;
self.showLoadMoreHeader = NO;
return;
}
__block BOOL show = YES;
NSUInteger loadWindowSize = [self.messageMappings numberOfItemsInGroup:self.thread.uniqueId];
__block NSUInteger totalMessageCount;
[self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
show = [self.messageMappings numberOfItemsInGroup:self.thread.uniqueId] <
totalMessageCount =
[[transaction ext:TSMessageDatabaseViewExtensionName] numberOfItemsInGroup:self.thread.uniqueId];
}];
return show;
}
- (void)updateShowLoadMoreHeader
{
[self setShowLoadMoreHeader:[self shouldShowLoadEarlierMessages]];
self.showLoadMoreHeader = loadWindowSize < totalMessageCount;
}
- (void)setShowLoadMoreHeader:(BOOL)showLoadMoreHeader
@ -1534,6 +1547,7 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
rangeOptions.minLength = kYapDatabaseRangeMinLength;
[self.messageMappings setRangeOptions:rangeOptions forGroup:self.thread.uniqueId];
[self updateShowLoadMoreHeader];
[self reloadViewItems];
}
@ -3524,6 +3538,7 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
[self updateLastVisibleTimestamp];
[self autoLoadMoreIfNecessary];
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
@ -3734,6 +3749,13 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
#pragma mark - Database Observation
- (void)setIsUserScrolling:(BOOL)isUserScrolling
{
_isUserScrolling = isUserScrolling;
[self autoLoadMoreIfNecessary];
}
- (void)setIsViewVisible:(BOOL)isViewVisible
{
_isViewVisible = isViewVisible;
@ -3815,7 +3837,6 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
[self reloadViewItems];
[self resetContentAndLayout];
[self updateShowLoadMoreHeader];
[self ensureDynamicInteractions];
[self updateBackButtonUnreadCount];
[self updateNavigationBarSubtitleLabel];

Loading…
Cancel
Save