Skip to content

Commit 4a91aac

Browse files
authored
Merge pull request #860 from Adamant-im/trello.com/c/jKqpxiCa/12
[trello.com/c/jKqpxiCa/12] chat scroll and reading update
2 parents f79a265 + 0f8d217 commit 4a91aac

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

Adamant/Modules/Chat/View/ChatViewController.swift

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@ final class ChatViewController: MessagesViewController {
164164
super.viewDidAppear(animated)
165165
defer {
166166
state.isViewAppeared = true
167-
updateUnreadMessages()
168167
}
169168
inputBar.isUserInteractionEnabled = true
170169
chatMessagesCollectionView.fixedBottomOffset = nil
@@ -220,7 +219,9 @@ final class ChatViewController: MessagesViewController {
220219

221220
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
222221
super.scrollViewDidScroll(scrollView)
223-
updateUnreadMessages()
222+
if state.isInitialMessagesWereUpdated {
223+
updateUnreadMessages()
224+
}
224225
updateIsScrollPositionNearlyTheBottom()
225226
updateScrollDownButtonVisibility()
226227

@@ -340,6 +341,7 @@ extension ChatViewController {
340341
viewModel.messagesUpdated
341342
.sink { [weak self] _ in
342343
self?.updateMessagesPosition()
344+
self?.state.isInitialMessagesWereUpdated = true
343345
self?.updateUnreadMessages()
344346
}
345347
.store(in: &subscriptions)
@@ -796,8 +798,10 @@ extension ChatViewController {
796798
scrollDownOnNewMessageIfNeeded(previousBottomMessageId: bottomMessageId)
797799
bottomMessageId = viewModel.messages.last?.messageId
798800
if !state.isMessagesLoaded {
799-
viewModel.startPosition.map { scrollToPosition($0) }
800-
state.shouldScrollToNewMessages = false
801+
viewModel.startPosition.map {
802+
scrollToPosition($0)
803+
state.shouldScrollToNewMessages = false
804+
}
801805
}
802806
}
803807

@@ -806,10 +810,10 @@ extension ChatViewController {
806810
state.isMessagesLoaded = true
807811
if state.shouldScrollToNewMessages {
808812
if let unreadMessage = viewModel.unreadMessagesIds?.first {
813+
state.isAutoScrolling = true
809814
viewModel.animationType = MessageAnimationType.none
810815
let isFirstMessagesInChat = viewModel.unreadMessagesIds?.count == viewModel.messages.count
811816
scrollToPosition(.messageId(unreadMessage), setExtraOffset: !isFirstMessagesInChat, scrollAt: .top)
812-
813817
}
814818
}
815819
}
@@ -879,6 +883,22 @@ extension ChatViewController {
879883
break
880884
}
881885
}
886+
887+
fileprivate func markMessagesFromCurrentToBottomAsRead() {
888+
guard let unreadIndexes = viewModel.unreadMesaggesIndexes, !unreadIndexes.isEmpty else { return }
889+
890+
let visibleSections = messagesCollectionView.indexPathsForVisibleItems.map { $0.section }
891+
guard let minSection = visibleSections.min() else { return }
892+
893+
let totalSections = messagesCollectionView.numberOfSections
894+
guard totalSections > 0 else { return }
895+
896+
for section in minSection..<totalSections {
897+
if unreadIndexes.contains(section) {
898+
viewModel.markMessageAsRead(index: section)
899+
}
900+
}
901+
}
882902
}
883903

884904
// MARK: Making entities
@@ -890,6 +910,7 @@ extension ChatViewController {
890910
guard let self else { return }
891911
if viewModel.shouldScrollToBottom {
892912
state.isScrollingToBottom = true
913+
markMessagesFromCurrentToBottomAsRead()
893914
self.messagesCollectionView.scrollToBottom(animated: true)
894915
} else if let id = viewModel.unreadMessagesIds?.first {
895916
viewModel.animationType = MessageAnimationType.none
@@ -1012,6 +1033,7 @@ extension ChatViewController {
10121033
setExtraOffsetForNewMessages()
10131034
}
10141035
state.isAutoScrolling = false
1036+
updateUnreadMessages()
10151037
}
10161038

10171039
if viewModel.animationType != MessageAnimationType.none {

Adamant/Modules/Chat/View/ChatViewControllerState.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct ChatViewControllerState {
2020
var isAppActive = true
2121
var isScrollingToBottom = false
2222
var shouldScrollToNewMessages = true
23+
var isInitialMessagesWereUpdated = false
2324

2425
//calculation for animation, might use for something else in the future
2526
var isAnimationAllowed: Bool {

0 commit comments

Comments
 (0)