@@ -164,7 +164,6 @@ final class ChatViewController: MessagesViewController {
164
164
super. viewDidAppear ( animated)
165
165
defer {
166
166
state. isViewAppeared = true
167
- updateUnreadMessages ( )
168
167
}
169
168
inputBar. isUserInteractionEnabled = true
170
169
chatMessagesCollectionView. fixedBottomOffset = nil
@@ -220,7 +219,9 @@ final class ChatViewController: MessagesViewController {
220
219
221
220
override func scrollViewDidScroll( _ scrollView: UIScrollView ) {
222
221
super. scrollViewDidScroll ( scrollView)
223
- updateUnreadMessages ( )
222
+ if state. isInitialMessagesWereUpdated {
223
+ updateUnreadMessages ( )
224
+ }
224
225
updateIsScrollPositionNearlyTheBottom ( )
225
226
updateScrollDownButtonVisibility ( )
226
227
@@ -340,6 +341,7 @@ extension ChatViewController {
340
341
viewModel. messagesUpdated
341
342
. sink { [ weak self] _ in
342
343
self ? . updateMessagesPosition ( )
344
+ self ? . state. isInitialMessagesWereUpdated = true
343
345
self ? . updateUnreadMessages ( )
344
346
}
345
347
. store ( in: & subscriptions)
@@ -796,8 +798,10 @@ extension ChatViewController {
796
798
scrollDownOnNewMessageIfNeeded ( previousBottomMessageId: bottomMessageId)
797
799
bottomMessageId = viewModel. messages. last? . messageId
798
800
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
+ }
801
805
}
802
806
}
803
807
@@ -806,10 +810,10 @@ extension ChatViewController {
806
810
state. isMessagesLoaded = true
807
811
if state. shouldScrollToNewMessages {
808
812
if let unreadMessage = viewModel. unreadMessagesIds? . first {
813
+ state. isAutoScrolling = true
809
814
viewModel. animationType = MessageAnimationType . none
810
815
let isFirstMessagesInChat = viewModel. unreadMessagesIds? . count == viewModel. messages. count
811
816
scrollToPosition ( . messageId( unreadMessage) , setExtraOffset: !isFirstMessagesInChat, scrollAt: . top)
812
-
813
817
}
814
818
}
815
819
}
@@ -879,6 +883,22 @@ extension ChatViewController {
879
883
break
880
884
}
881
885
}
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
+ }
882
902
}
883
903
884
904
// MARK: Making entities
@@ -890,6 +910,7 @@ extension ChatViewController {
890
910
guard let self else { return }
891
911
if viewModel. shouldScrollToBottom {
892
912
state. isScrollingToBottom = true
913
+ markMessagesFromCurrentToBottomAsRead ( )
893
914
self . messagesCollectionView. scrollToBottom ( animated: true )
894
915
} else if let id = viewModel. unreadMessagesIds? . first {
895
916
viewModel. animationType = MessageAnimationType . none
@@ -1012,6 +1033,7 @@ extension ChatViewController {
1012
1033
setExtraOffsetForNewMessages ( )
1013
1034
}
1014
1035
state. isAutoScrolling = false
1036
+ updateUnreadMessages ( )
1015
1037
}
1016
1038
1017
1039
if viewModel. animationType != MessageAnimationType . none {
0 commit comments