@@ -313,6 +313,7 @@ final class MutableMessageHistoryView: MutablePostboxView {
313313 private let clipHoles : Bool
314314 private let trackHoles : Bool
315315 private let anchor : HistoryViewInputAnchor
316+ fileprivate var mapReadStatesFromThreads : Bool = false
316317
317318 fileprivate var combinedReadStates : MessageHistoryViewReadState ?
318319 fileprivate var transientReadStates : MessageHistoryViewReadState ?
@@ -322,6 +323,7 @@ final class MutableMessageHistoryView: MutablePostboxView {
322323
323324 fileprivate var topTaggedMessages : [ MessageId . Namespace : MessageHistoryTopTaggedMessage ? ]
324325 fileprivate var additionalDatas : [ AdditionalMessageHistoryViewDataEntry ]
326+ fileprivate var threadMaxOutgoingReadId : [ Int64 : Int32 ] = [ : ]
325327
326328 fileprivate( set) var sampledState : HistoryViewSample
327329
@@ -373,8 +375,14 @@ final class MutableMessageHistoryView: MutablePostboxView {
373375 switch peerIds {
374376 case let . associated( peerId, _) :
375377 self . isAddedToChatList = postbox. chatListTable. getPeerChatListIndex ( peerId: peerId) != nil
376- case let . single( peerId, _ ) :
378+ case let . single( peerId, threadId ) :
377379 self . isAddedToChatList = postbox. chatListTable. getPeerChatListIndex ( peerId: peerId) != nil
380+ if threadId == nil , let peer = postbox. peerTable. get ( peerId) {
381+ let value = postbox. seedConfiguration. peerSummaryIsThreadBased ( peer, peer. associatedPeerId. flatMap ( postbox. peerTable. get) )
382+ if value. value && value. threadsArePeers {
383+ self . mapReadStatesFromThreads = true
384+ }
385+ }
378386 case let . external( input) :
379387 switch input. content {
380388 case let . thread( peerId, _, _) :
@@ -401,6 +409,8 @@ final class MutableMessageHistoryView: MutablePostboxView {
401409
402410 self . render ( postbox: postbox)
403411 let _ = self . updateStoryStats ( postbox: postbox)
412+
413+ let _ = self . updateThreadInfos ( postbox: postbox, updatedIds: nil )
404414 }
405415
406416 private func reset( postbox: PostboxImpl ) {
@@ -1023,9 +1033,81 @@ final class MutableMessageHistoryView: MutablePostboxView {
10231033 }
10241034 }
10251035
1036+ if !transaction. updatedPeerThreadInfos. isEmpty {
1037+ if self . updateThreadInfos ( postbox: postbox, updatedIds: transaction. updatedPeerThreadInfos) {
1038+ hasChanges = true
1039+ }
1040+ }
1041+
10261042 return hasChanges
10271043 }
10281044
1045+ private func updateThreadInfos( postbox: PostboxImpl , updatedIds: Set < MessageHistoryThreadsTable . ItemId > ? ) -> Bool {
1046+ if self . mapReadStatesFromThreads, case let . single( peerId, peerThreadId) = self . peerIds, peerThreadId == nil {
1047+ switch self . sampledState {
1048+ case . loading:
1049+ if !self . threadMaxOutgoingReadId. isEmpty {
1050+ self . threadMaxOutgoingReadId. removeAll ( )
1051+ return true
1052+ } else {
1053+ return false
1054+ }
1055+ case let . loaded( loaded) :
1056+ //TODO:release
1057+ let currentIds = Set < Int64 > ( self . threadMaxOutgoingReadId. keys)
1058+
1059+ var threadIds : Set < Int64 > = [ ]
1060+ for entry in loaded. entries {
1061+ if let threadId = entry. message. threadId {
1062+ threadIds. insert ( threadId)
1063+ }
1064+ }
1065+
1066+ var updated = false
1067+ if currentIds != threadIds {
1068+ updated = true
1069+
1070+ for id in currentIds. subtracting ( threadIds) {
1071+ self . threadMaxOutgoingReadId. removeValue ( forKey: id)
1072+ }
1073+ }
1074+
1075+ for threadId in threadIds {
1076+ var fetch = false
1077+ if let updatedIds {
1078+ if updatedIds. contains ( MessageHistoryThreadsTable . ItemId ( peerId: peerId, threadId: threadId) ) {
1079+ fetch = true
1080+ }
1081+ } else {
1082+ fetch = self . threadMaxOutgoingReadId [ threadId] == nil
1083+ }
1084+
1085+ if fetch {
1086+ var maxOutgoingReadId : Int32 ?
1087+ if let threadData = postbox. messageHistoryThreadIndexTable. get ( peerId: peerId, threadId: threadId) {
1088+ maxOutgoingReadId = threadData. summary. maxOutgoingReadId
1089+ }
1090+
1091+ let current = self . threadMaxOutgoingReadId [ threadId]
1092+ if let maxOutgoingReadId {
1093+ if current != maxOutgoingReadId {
1094+ self . threadMaxOutgoingReadId [ threadId] = maxOutgoingReadId
1095+ updated = true
1096+ }
1097+ } else if current != nil {
1098+ self . threadMaxOutgoingReadId. removeValue ( forKey: threadId)
1099+ updated = true
1100+ }
1101+ }
1102+ }
1103+
1104+ return updated
1105+ }
1106+ } else {
1107+ return false
1108+ }
1109+ }
1110+
10291111 private func render( postbox: PostboxImpl ) {
10301112 for namespace in self . topTaggedMessages. keys {
10311113 if let entry = self . topTaggedMessages [ namespace] !, case let . intermediate( message) = entry {
@@ -1166,7 +1248,20 @@ public final class MessageHistoryView: PostboxView {
11661248 }
11671249 self . isLoadingEarlier = isLoadingEarlier
11681250 entries = [ ]
1169- if let transientReadStates = mutableView. transientReadStates, case let . peer( states) = transientReadStates {
1251+ if mutableView. mapReadStatesFromThreads {
1252+ for entry in state. entries {
1253+ if mutableView. namespaces. contains ( entry. message. id. namespace) {
1254+ var read = false
1255+ if let threadId = entry. message. threadId {
1256+ if let maxId = mutableView. threadMaxOutgoingReadId [ threadId] {
1257+ read = entry. message. id. id <= maxId
1258+ }
1259+ }
1260+
1261+ entries. append ( MessageHistoryEntry ( message: entry. message, isRead: read, location: entry. location, monthLocation: entry. monthLocation, attributes: entry. attributes) )
1262+ }
1263+ }
1264+ } else if let transientReadStates = mutableView. transientReadStates, case let . peer( states) = transientReadStates {
11701265 for entry in state. entries {
11711266 if mutableView. namespaces. contains ( entry. message. id. namespace) {
11721267 let read : Bool
0 commit comments