@@ -171,7 +171,6 @@ final class ChatViewController: MessagesViewController {
171171 defer { viewAppeared = true }
172172 inputBar. isUserInteractionEnabled = true
173173 chatMessagesCollectionView. fixedBottomOffset = nil
174-
175174 updateUnreadMessages ( )
176175 if !viewAppeared {
177176 viewModel. presentKeyboardOnStartIfNeeded ( )
@@ -330,6 +329,11 @@ private extension ChatViewController {
330329 . removeDuplicates ( )
331330 . sink { [ weak self] _ in
332331 self ? . updateMessages ( )
332+ }
333+ . store ( in: & subscriptions)
334+
335+ viewModel. messagesUpdated
336+ . sink { [ weak self] _ in
333337 self ? . updateMessagesPosition ( )
334338 }
335339 . store ( in: & subscriptions)
@@ -416,12 +420,14 @@ private extension ChatViewController {
416420 . sink { [ weak self] in self ? . processFileToolbarView ( $0) }
417421 . store ( in: & subscriptions)
418422
419- viewModel. $scrollToMessage
423+ viewModel. $scrollToIdAndPosition
420424 . sink { [ weak self] in
421- guard let toId = $0
425+ guard let idAndPosition = $0
422426 else { return }
423427
424- self ? . scrollToPosition ( . messageId( toId) , animated: false )
428+ self ? . scrollToPosition = idAndPosition. position
429+ self ? . scrollToPosition ( . messageId( idAndPosition. id) , animated: false , setExtraOffset: self ? . scrollToPosition == . top)
430+ self ? . viewModel. messageIdToShow = nil
425431 }
426432 . store ( in: & subscriptions)
427433
@@ -763,10 +769,12 @@ private extension ChatViewController {
763769 func updateMessagesPosition( ) {
764770 guard !messagesLoaded, !viewModel. messages. isEmpty else { return }
765771 messagesLoaded = true
766- if let position = viewModel. startPosition {
767- scrollToPosition ( position)
768- } else if let unreadMessage = viewModel. unreadMessagesIds? . first {
769- scrollToPosition ( . messageId( unreadMessage) , animated: false )
772+ if viewModel. messageIdToShow == nil {
773+ if let unreadMessage = viewModel. unreadMessagesIds? . first {
774+ scrollToPosition ( . messageId( unreadMessage) , setExtraOffset: true )
775+ } else if let position = viewModel. startPosition {
776+ scrollToPosition ( position)
777+ }
770778 }
771779 }
772780
@@ -922,7 +930,7 @@ private extension ChatViewController {
922930 }
923931
924932 @MainActor
925- func scrollToPosition( _ position: ChatStartPosition , animated: Bool = false ) {
933+ func scrollToPosition( _ position: ChatStartPosition , animated: Bool = false , setExtraOffset : Bool = false ) {
926934 chatMessagesCollectionView. fixedBottomOffset = nil
927935
928936 switch position {
@@ -946,6 +954,10 @@ private extension ChatViewController {
946954 animated: animated
947955 )
948956
957+ if setExtraOffset {
958+ setExtraOffsetForNewMessages ( )
959+ }
960+
949961 viewModel. needToAnimateCellIndex = needToAnimateCell
950962 ? index
951963 : nil
@@ -962,6 +974,17 @@ private extension ChatViewController {
962974 chatMessagesCollectionView. fixedBottomOffset = chatMessagesCollectionView. bottomOffset
963975 }
964976
977+ func setExtraOffsetForNewMessages( ) {
978+ //extra scroll to 120 to see newMessage line and 2 strings from previus message
979+ let newOffsetY = max (
980+ messagesCollectionView. contentOffset. y - 120 ,
981+ 0
982+ )
983+ let newOffset = CGPoint ( x: messagesCollectionView. contentOffset. x, y: newOffsetY)
984+
985+ messagesCollectionView. setContentOffset ( newOffset, animated: false )
986+ }
987+
965988 func scrollDownOnNewMessageIfNeeded( previousBottomMessageId: String ? ) {
966989 let messages = viewModel. messages
967990
0 commit comments