Skip to content

Commit d9a2d06

Browse files
author
Isaac
committed
Various improvements
1 parent 4fdbe44 commit d9a2d06

File tree

4 files changed

+103
-4
lines changed

4 files changed

+103
-4
lines changed

Telegram/Telegram-iOS/en.lproj/Localizable.strings

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14410,3 +14410,5 @@ Sorry for the inconvenience.";
1441014410
"Stars.SendMessage.AdjustmentSectionFooterValue" = "You will receive **%@ Stars**.";
1441114411
"Stars.SendMessage.AdjustmentSectionFooterEmpty" = "You will receive **80%**.";
1441214412
"Stars.SendMessage.AdjustmentAction" = "OK";
14413+
14414+
"Stars.SendMessage.PriceFree" = "Free";

submodules/Postbox/Sources/MessageHistoryView.swift

Lines changed: 97 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

submodules/Postbox/Sources/MessageHistoryViewState.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,7 @@ final class HistoryViewLoadedState {
13081308
let halfLimit: Int
13091309
let seedConfiguration: SeedConfiguration
13101310
var orderedEntriesBySpace: [PeerIdAndNamespace: OrderedHistoryViewEntries]
1311+
var threadSummaries: [Int64: Int32]
13111312
var holes: HistoryViewHoles
13121313
var spacesWithRemovals = Set<PeerIdAndNamespace>()
13131314

@@ -1321,6 +1322,7 @@ final class HistoryViewLoadedState {
13211322
self.halfLimit = halfLimit
13221323
self.seedConfiguration = postbox.seedConfiguration
13231324
self.orderedEntriesBySpace = [:]
1325+
self.threadSummaries = [:]
13241326
self.holes = holes
13251327

13261328
var peerIds: [PeerId] = []
@@ -1854,6 +1856,7 @@ final class HistoryViewLoadedState {
18541856
var holesToLower = false
18551857
var holesToHigher = false
18561858
var result: [MessageHistoryMessageEntry] = []
1859+
18571860
if combinedSpacesAndIndicesByDirection.lowerOrAtAnchor.isEmpty && combinedSpacesAndIndicesByDirection.higherThanAnchor.isEmpty {
18581861
if !clipRanges.isEmpty {
18591862
holesToLower = true

submodules/TelegramUI/Components/PeerInfo/MessagePriceItem/Sources/MessagePriceItem.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,7 @@ private class MessagePriceItemNode: ListViewItemNode {
368368
strongSelf.leftTextNode.attributedText = NSAttributedString(string: "\(item.minValue)", font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor)
369369
strongSelf.rightTextNode.attributedText = NSAttributedString(string: "\(item.maxValue)", font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor)
370370

371-
//TODO:localize
372-
let centralLeftText = item.value == 0 ? "Free" : item.strings.Privacy_Messages_Stars(Int32(item.value))
371+
let centralLeftText = item.value == 0 ? item.strings.Stars_SendMessage_PriceFree : item.strings.Privacy_Messages_Stars(Int32(item.value))
373372

374373
strongSelf.centerLeftTextNode.attributedText = NSAttributedString(string: centralLeftText, font: textFont, textColor: item.openSetCustom != nil ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor)
375374
strongSelf.centerRightTextNode.attributedText = NSAttributedString(string: item.price, font: smallTextFont, textColor: item.openSetCustom != nil ? item.theme.list.itemAccentColor.withMultipliedAlpha(0.5) : item.theme.list.itemSecondaryTextColor)

0 commit comments

Comments
 (0)