Skip to content

Commit 3d7d8a6

Browse files
committed
feat(richtext): inline formula/table icons & strikethrough in message previews
1 parent 1110173 commit 3d7d8a6

15 files changed

Lines changed: 351 additions & 161 deletions

File tree

‎submodules/ChatListUI/Sources/Node/ChatListItem.swift‎

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,7 +1549,7 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
15491549
} else {
15501550
result += item.presentationData.strings.VoiceOver_ChatList_OutgoingMessage
15511551
}
1552-
let (_, initialHideAuthor, messageText, _, _, _) = chatListItemStrings(strings: item.presentationData.strings, nameDisplayOrder: item.presentationData.nameDisplayOrder, dateTimeFormat: item.presentationData.dateTimeFormat, contentSettings: item.context.currentContentSettings.with { $0 }, messages: messages, chatPeer: peer, accountPeerId: item.context.account.peerId, isPeerGroup: false)
1552+
let (_, initialHideAuthor, messageText, _, _, _, _) = chatListItemStrings(strings: item.presentationData.strings, nameDisplayOrder: item.presentationData.nameDisplayOrder, dateTimeFormat: item.presentationData.dateTimeFormat, contentSettings: item.context.currentContentSettings.with { $0 }, messages: messages, chatPeer: peer, accountPeerId: item.context.account.peerId, isPeerGroup: false)
15531553
if message.flags.contains(.Incoming), !initialHideAuthor, let author = message.author, case .user = author {
15541554
result += "\n\(item.presentationData.strings.VoiceOver_ChatList_MessageFrom(author.displayTitle(strings: item.presentationData.strings, displayOrder: item.presentationData.nameDisplayOrder)).string)"
15551555
}
@@ -1583,7 +1583,7 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
15831583
} else {
15841584
result += item.presentationData.strings.VoiceOver_ChatList_OutgoingMessage
15851585
}
1586-
let (_, initialHideAuthor, messageText, _, _, _) = chatListItemStrings(strings: item.presentationData.strings, nameDisplayOrder: item.presentationData.nameDisplayOrder, dateTimeFormat: item.presentationData.dateTimeFormat, contentSettings: item.context.currentContentSettings.with { $0 }, messages: peerData.messages, chatPeer: peerData.peer, accountPeerId: item.context.account.peerId, isPeerGroup: false)
1586+
let (_, initialHideAuthor, messageText, _, _, _, _) = chatListItemStrings(strings: item.presentationData.strings, nameDisplayOrder: item.presentationData.nameDisplayOrder, dateTimeFormat: item.presentationData.dateTimeFormat, contentSettings: item.context.currentContentSettings.with { $0 }, messages: peerData.messages, chatPeer: peerData.peer, accountPeerId: item.context.account.peerId, isPeerGroup: false)
15871587
if message.flags.contains(.Incoming), !initialHideAuthor, let author = message.author, case .user = author {
15881588
result += "\n\(item.presentationData.strings.VoiceOver_ChatList_MessageFrom(author.displayTitle(strings: item.presentationData.strings, displayOrder: item.presentationData.nameDisplayOrder)).string)"
15891589
}
@@ -2589,7 +2589,7 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
25892589
let leftInset: CGFloat = params.leftInset + avatarLeftInset
25902590

25912591
enum ContentData {
2592-
case chat(itemPeer: EngineRenderedPeer, threadInfo: ChatListItemContent.ThreadInfo?, peer: EnginePeer?, hideAuthor: Bool, messageText: String, messageEntities: [MessageTextEntity], spoilers: [NSRange]?, customEmojiRanges: [(NSRange, ChatTextInputTextCustomEmojiAttribute)]?)
2592+
case chat(itemPeer: EngineRenderedPeer, threadInfo: ChatListItemContent.ThreadInfo?, peer: EnginePeer?, hideAuthor: Bool, messageText: String, messageEntities: [MessageTextEntity], spoilers: [NSRange]?, customEmojiRanges: [(NSRange, ChatTextInputTextCustomEmojiAttribute)]?, richTextPreview: NSAttributedString?)
25932593
case group(peers: [EngineChatList.GroupItem.Item])
25942594
}
25952595

@@ -2598,11 +2598,12 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
25982598
var hideAuthor = false
25992599
switch contentPeer {
26002600
case let .chat(itemPeer):
2601-
var (peer, initialHideAuthor, messageText, messageEntities, spoilers, customEmojiRanges) = chatListItemStrings(strings: item.presentationData.strings, nameDisplayOrder: item.presentationData.nameDisplayOrder, dateTimeFormat: item.presentationData.dateTimeFormat, contentSettings: item.context.currentContentSettings.with { $0 }, messages: messages, chatPeer: itemPeer, accountPeerId: item.context.account.peerId, enableMediaEmoji: !enableChatListPhotos, isPeerGroup: isPeerGroup)
2601+
var (peer, initialHideAuthor, messageText, messageEntities, spoilers, customEmojiRanges, richTextPreview) = chatListItemStrings(strings: item.presentationData.strings, nameDisplayOrder: item.presentationData.nameDisplayOrder, dateTimeFormat: item.presentationData.dateTimeFormat, contentSettings: item.context.currentContentSettings.with { $0 }, messages: messages, chatPeer: itemPeer, accountPeerId: item.context.account.peerId, enableMediaEmoji: !enableChatListPhotos, isPeerGroup: isPeerGroup)
26022602

26032603
if case let .psa(_, maybePsaText) = promoInfo, let psaText = maybePsaText {
26042604
initialHideAuthor = true
26052605
messageText = psaText
2606+
richTextPreview = nil
26062607
}
26072608

26082609
switch itemPeer.peer {
@@ -2613,6 +2614,7 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
26132614
switch recentPeer.value {
26142615
case let .builtin(value):
26152616
messageText = item.presentationData.strings.ChatList_UserReacted(value).string
2617+
richTextPreview = nil
26162618
case .custom:
26172619
break
26182620
case .stars:
@@ -2626,7 +2628,7 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
26262628
break
26272629
}
26282630

2629-
contentData = .chat(itemPeer: itemPeer, threadInfo: threadInfo, peer: peer, hideAuthor: hideAuthor, messageText: messageText, messageEntities: messageEntities, spoilers: spoilers, customEmojiRanges: customEmojiRanges)
2631+
contentData = .chat(itemPeer: itemPeer, threadInfo: threadInfo, peer: peer, hideAuthor: hideAuthor, messageText: messageText, messageEntities: messageEntities, spoilers: spoilers, customEmojiRanges: customEmojiRanges, richTextPreview: richTextPreview)
26302632
hideAuthor = initialHideAuthor
26312633
case let .group(groupPeers):
26322634
contentData = .group(peers: groupPeers)
@@ -2645,7 +2647,7 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
26452647
forumTopicData = nil
26462648
topForumTopicItems = []
26472649

2648-
if case let .chat(itemPeer, _, _, _, _, _, _, _) = contentData {
2650+
if case let .chat(itemPeer, _, _, _, _, _, _, _, _) = contentData {
26492651
if let messagePeer = itemPeer.chatMainPeer {
26502652
switch messagePeer {
26512653
case let .channel(channel):
@@ -2710,7 +2712,7 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
27102712
var ignoreForwardedIcon = false
27112713

27122714
switch contentData {
2713-
case let .chat(itemPeer, _, _, _, text, entities, spoilers, customEmojiRanges):
2715+
case let .chat(itemPeer, _, _, _, text, entities, spoilers, customEmojiRanges, richTextPreview):
27142716
var isUser = false
27152717
if case .user = itemPeer.chatMainPeer {
27162718
isUser = true
@@ -2784,6 +2786,7 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
27842786
}
27852787

27862788
let messageText: String
2789+
let foldedRichTextPreview: NSAttributedString?
27872790
if let currentChatListText = currentChatListText, currentChatListText.0 == text {
27882791
messageText = currentChatListText.1
27892792
chatListText = currentChatListText
@@ -2797,6 +2800,12 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
27972800
}
27982801
chatListText = (text, messageText)
27992802
}
2803+
if let richTextPreview {
2804+
let foldedPreview = foldLineBreaks(richTextPreview)
2805+
foldedRichTextPreview = foldedPreview.string == messageText ? foldedPreview : nil
2806+
} else {
2807+
foldedRichTextPreview = nil
2808+
}
28002809

28012810
if inlineAuthorPrefix == nil, let mediaDraftContentType {
28022811
hasDraft = true
@@ -2895,6 +2904,13 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
28952904
}
28962905
}
28972906
messageString = mutableString
2907+
} else if let foldedRichTextPreview {
2908+
let mutableString = NSMutableAttributedString(attributedString: foldedRichTextPreview)
2909+
mutableString.addAttributes([
2910+
.font: textFont,
2911+
.foregroundColor: theme.messageTextColor
2912+
], range: NSRange(location: 0, length: mutableString.length))
2913+
messageString = mutableString
28982914
} else {
28992915
messageString = NSAttributedString(string: messageText, font: textFont, textColor: theme.messageTextColor)
29002916
}
@@ -3274,7 +3290,7 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
32743290
}
32753291

32763292
switch contentData {
3277-
case let .chat(itemPeer, threadInfo, _, _, _, _, _, _):
3293+
case let .chat(itemPeer, threadInfo, _, _, _, _, _, _, _):
32783294
if case let .peer(peerData) = item.content, let customMessageListData = peerData.customMessageListData {
32793295
if customMessageListData.commandPrefix != nil {
32803296
titleAttributedString = nil
@@ -3325,6 +3341,7 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
33253341
titleAttributedString = NSAttributedString(string: item.presentationData.strings.ChatList_ArchivedChatsTitle, font: titleFont, textColor: theme.titleColor)
33263342
}
33273343

3344+
attributedText = renderInstantPagePreviewIcons(attributedText, font: textFont, textColor: theme.messageTextColor)
33283345
textAttributedString = attributedText
33293346

33303347
let dateText: String

‎submodules/ChatListUI/Sources/Node/ChatListItemStrings.swift‎

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,23 +77,24 @@ private func paidContentGroupType(paidContent: TelegramMediaPaidContent) -> Mess
7777
return currentType
7878
}
7979

80-
public func chatListItemStrings(strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, dateTimeFormat: PresentationDateTimeFormat, contentSettings: ContentSettings, messages: [EngineMessage], chatPeer: EngineRenderedPeer, accountPeerId: EnginePeer.Id, enableMediaEmoji: Bool = true, isPeerGroup: Bool = false) -> (peer: EnginePeer?, hideAuthor: Bool, messageText: String, messageEntities: [MessageTextEntity], spoilers: [NSRange]?, customEmojiRanges: [(NSRange, ChatTextInputTextCustomEmojiAttribute)]?) {
80+
public func chatListItemStrings(strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, dateTimeFormat: PresentationDateTimeFormat, contentSettings: ContentSettings, messages: [EngineMessage], chatPeer: EngineRenderedPeer, accountPeerId: EnginePeer.Id, enableMediaEmoji: Bool = true, isPeerGroup: Bool = false) -> (peer: EnginePeer?, hideAuthor: Bool, messageText: String, messageEntities: [MessageTextEntity], spoilers: [NSRange]?, customEmojiRanges: [(NSRange, ChatTextInputTextCustomEmojiAttribute)]?, richTextPreview: NSAttributedString?) {
8181
let peer: EnginePeer?
8282

8383
let message = messages.last
8484

8585
if let restrictionReason = message?._asMessage().restrictionReason(platform: "ios", contentSettings: contentSettings) {
86-
return (nil, false, restrictionReason, [], nil, nil)
86+
return (nil, false, restrictionReason, [], nil, nil, nil)
8787
}
8888
if let restrictionReason = chatPeer.chatMainPeer?.restrictionText(platform: "ios", contentSettings: contentSettings) {
89-
return (nil, false, restrictionReason, [], nil, nil)
89+
return (nil, false, restrictionReason, [], nil, nil, nil)
9090
}
9191

9292
var hideAuthor = false
9393
var messageText: String
9494
var messageEntities: [MessageTextEntity] = []
9595
var spoilers: [NSRange]?
9696
var customEmojiRanges: [(NSRange, ChatTextInputTextCustomEmojiAttribute)]?
97+
var richTextPreview: NSAttributedString?
9798
if let message = message {
9899
if let messageMain = messageMainPeer(message) {
99100
peer = messageMain
@@ -104,10 +105,13 @@ public func chatListItemStrings(strings: PresentationStrings, nameDisplayOrder:
104105
messageText = ""
105106
for message in messages {
106107
if let richText = message.richText {
107-
messageText = richText.instantPage.previewText(strings: strings)
108+
let preview = richText.instantPage.previewAttributedText(strings: strings)
109+
messageText = preview.string
110+
richTextPreview = preview
108111
messageEntities = []
109112
} else if !message.text.isEmpty {
110113
messageText = message.text
114+
richTextPreview = nil
111115
messageEntities = message._asMessage().textEntitiesAttribute?.entities ?? []
112116
for entity in messageEntities {
113117
if case let .CustomEmoji(_, fileId) = entity.type {
@@ -480,5 +484,8 @@ public func chatListItemStrings(strings: PresentationStrings, nameDisplayOrder:
480484
}
481485
}
482486

483-
return (peer, hideAuthor, messageText, messageEntities, spoilers, customEmojiRanges)
487+
if richTextPreview?.string != messageText {
488+
richTextPreview = nil
489+
}
490+
return (peer, hideAuthor, messageText, messageEntities, spoilers, customEmojiRanges, richTextPreview)
484491
}

0 commit comments

Comments
 (0)