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

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

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

Loading…
Cancel
Save