Skip to content

Commit a2242c6

Browse files
authored
Render Room and Message Pills (#3809)
* added a way to render the room and the message pills, but is WIP * permalinks now get converted into pills! * fixed an issue where room address mentions were not adding a URL properly but a string * updated tests * c * Revert "c" This reverts commit 5c80252. * updated tests * more tests * created APIs to get a specific RoomSummary given the id or the alias * small mention builder improvement * pr suggestions
1 parent 944fe37 commit a2242c6

File tree

100 files changed

+1015
-245
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+1015
-245
lines changed

ElementX/Sources/FlowCoordinators/MediaEventsTimelineFlowCoordinator.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ class MediaEventsTimelineFlowCoordinator: FlowCoordinatorProtocol {
9393
appMediator: appMediator,
9494
emojiProvider: emojiProvider,
9595
userIndicatorController: userIndicatorController,
96-
timelineControllerFactory: timelineControllerFactory)
96+
timelineControllerFactory: timelineControllerFactory,
97+
clientProxy: userSession.clientProxy)
9798

9899
let coordinator = MediaEventsTimelineScreenCoordinator(parameters: parameters)
99100

ElementX/Sources/FlowCoordinators/PinnedEventsTimelineFlowCoordinator.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ class PinnedEventsTimelineFlowCoordinator: FlowCoordinatorProtocol {
7878
voiceMessageMediaManager: userSession.voiceMessageMediaManager,
7979
appMediator: appMediator,
8080
emojiProvider: emojiProvider,
81-
timelineControllerFactory: timelineControllerFactory))
81+
timelineControllerFactory: timelineControllerFactory,
82+
clientProxy: userSession.clientProxy))
8283

8384
coordinator.actions
8485
.sink { [weak self] action in

ElementX/Sources/Mocks/Generated/GeneratedMocks.swift

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3225,6 +3225,146 @@ class ClientProxyMock: ClientProxyProtocol, @unchecked Sendable {
32253225
return roomPreviewForIdentifierViaReturnValue
32263226
}
32273227
}
3228+
//MARK: - roomSummaryForIdentifier
3229+
3230+
var roomSummaryForIdentifierUnderlyingCallsCount = 0
3231+
var roomSummaryForIdentifierCallsCount: Int {
3232+
get {
3233+
if Thread.isMainThread {
3234+
return roomSummaryForIdentifierUnderlyingCallsCount
3235+
} else {
3236+
var returnValue: Int? = nil
3237+
DispatchQueue.main.sync {
3238+
returnValue = roomSummaryForIdentifierUnderlyingCallsCount
3239+
}
3240+
3241+
return returnValue!
3242+
}
3243+
}
3244+
set {
3245+
if Thread.isMainThread {
3246+
roomSummaryForIdentifierUnderlyingCallsCount = newValue
3247+
} else {
3248+
DispatchQueue.main.sync {
3249+
roomSummaryForIdentifierUnderlyingCallsCount = newValue
3250+
}
3251+
}
3252+
}
3253+
}
3254+
var roomSummaryForIdentifierCalled: Bool {
3255+
return roomSummaryForIdentifierCallsCount > 0
3256+
}
3257+
var roomSummaryForIdentifierReceivedIdentifier: String?
3258+
var roomSummaryForIdentifierReceivedInvocations: [String] = []
3259+
3260+
var roomSummaryForIdentifierUnderlyingReturnValue: RoomSummary?
3261+
var roomSummaryForIdentifierReturnValue: RoomSummary? {
3262+
get {
3263+
if Thread.isMainThread {
3264+
return roomSummaryForIdentifierUnderlyingReturnValue
3265+
} else {
3266+
var returnValue: RoomSummary?? = nil
3267+
DispatchQueue.main.sync {
3268+
returnValue = roomSummaryForIdentifierUnderlyingReturnValue
3269+
}
3270+
3271+
return returnValue!
3272+
}
3273+
}
3274+
set {
3275+
if Thread.isMainThread {
3276+
roomSummaryForIdentifierUnderlyingReturnValue = newValue
3277+
} else {
3278+
DispatchQueue.main.sync {
3279+
roomSummaryForIdentifierUnderlyingReturnValue = newValue
3280+
}
3281+
}
3282+
}
3283+
}
3284+
var roomSummaryForIdentifierClosure: ((String) -> RoomSummary?)?
3285+
3286+
func roomSummaryForIdentifier(_ identifier: String) -> RoomSummary? {
3287+
roomSummaryForIdentifierCallsCount += 1
3288+
roomSummaryForIdentifierReceivedIdentifier = identifier
3289+
DispatchQueue.main.async {
3290+
self.roomSummaryForIdentifierReceivedInvocations.append(identifier)
3291+
}
3292+
if let roomSummaryForIdentifierClosure = roomSummaryForIdentifierClosure {
3293+
return roomSummaryForIdentifierClosure(identifier)
3294+
} else {
3295+
return roomSummaryForIdentifierReturnValue
3296+
}
3297+
}
3298+
//MARK: - roomSummaryForAlias
3299+
3300+
var roomSummaryForAliasUnderlyingCallsCount = 0
3301+
var roomSummaryForAliasCallsCount: Int {
3302+
get {
3303+
if Thread.isMainThread {
3304+
return roomSummaryForAliasUnderlyingCallsCount
3305+
} else {
3306+
var returnValue: Int? = nil
3307+
DispatchQueue.main.sync {
3308+
returnValue = roomSummaryForAliasUnderlyingCallsCount
3309+
}
3310+
3311+
return returnValue!
3312+
}
3313+
}
3314+
set {
3315+
if Thread.isMainThread {
3316+
roomSummaryForAliasUnderlyingCallsCount = newValue
3317+
} else {
3318+
DispatchQueue.main.sync {
3319+
roomSummaryForAliasUnderlyingCallsCount = newValue
3320+
}
3321+
}
3322+
}
3323+
}
3324+
var roomSummaryForAliasCalled: Bool {
3325+
return roomSummaryForAliasCallsCount > 0
3326+
}
3327+
var roomSummaryForAliasReceivedAlias: String?
3328+
var roomSummaryForAliasReceivedInvocations: [String] = []
3329+
3330+
var roomSummaryForAliasUnderlyingReturnValue: RoomSummary?
3331+
var roomSummaryForAliasReturnValue: RoomSummary? {
3332+
get {
3333+
if Thread.isMainThread {
3334+
return roomSummaryForAliasUnderlyingReturnValue
3335+
} else {
3336+
var returnValue: RoomSummary?? = nil
3337+
DispatchQueue.main.sync {
3338+
returnValue = roomSummaryForAliasUnderlyingReturnValue
3339+
}
3340+
3341+
return returnValue!
3342+
}
3343+
}
3344+
set {
3345+
if Thread.isMainThread {
3346+
roomSummaryForAliasUnderlyingReturnValue = newValue
3347+
} else {
3348+
DispatchQueue.main.sync {
3349+
roomSummaryForAliasUnderlyingReturnValue = newValue
3350+
}
3351+
}
3352+
}
3353+
}
3354+
var roomSummaryForAliasClosure: ((String) -> RoomSummary?)?
3355+
3356+
func roomSummaryForAlias(_ alias: String) -> RoomSummary? {
3357+
roomSummaryForAliasCallsCount += 1
3358+
roomSummaryForAliasReceivedAlias = alias
3359+
DispatchQueue.main.async {
3360+
self.roomSummaryForAliasReceivedInvocations.append(alias)
3361+
}
3362+
if let roomSummaryForAliasClosure = roomSummaryForAliasClosure {
3363+
return roomSummaryForAliasClosure(alias)
3364+
} else {
3365+
return roomSummaryForAliasReturnValue
3366+
}
3367+
}
32283368
//MARK: - loadUserDisplayName
32293369

32303370
var loadUserDisplayNameUnderlyingCallsCount = 0

ElementX/Sources/Mocks/RoomSummaryProviderMock.swift

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,31 @@ extension RoomSummaryProviderMock {
6767
}
6868
}
6969

70+
extension RoomSummary {
71+
static func mock(id: String,
72+
name: String,
73+
canonicalAlias: String? = nil) -> RoomSummary {
74+
RoomSummary(roomListItem: RoomListItemSDKMock(),
75+
id: id,
76+
joinRequestType: nil,
77+
name: name,
78+
isDirect: false,
79+
avatarURL: nil,
80+
heroes: [],
81+
lastMessage: AttributedString("I do not wish to take the trouble to understand mysticism"),
82+
lastMessageFormattedTimestamp: "14:56",
83+
unreadMessagesCount: 0,
84+
unreadMentionsCount: 0,
85+
unreadNotificationsCount: 0,
86+
notificationMode: .allMessages,
87+
canonicalAlias: canonicalAlias,
88+
alternativeAliases: [],
89+
hasOngoingCall: false,
90+
isMarkedUnread: false,
91+
isFavourite: false)
92+
}
93+
}
94+
7095
extension Array where Element == RoomSummary {
7196
static let mockRooms: [Element] = [
7297
RoomSummary(roomListItem: RoomListItemSDKMock(),
@@ -83,6 +108,7 @@ extension Array where Element == RoomSummary {
83108
unreadNotificationsCount: 0,
84109
notificationMode: .allMessages,
85110
canonicalAlias: nil,
111+
alternativeAliases: [],
86112
hasOngoingCall: false,
87113
isMarkedUnread: false,
88114
isFavourite: false),
@@ -99,7 +125,8 @@ extension Array where Element == RoomSummary {
99125
unreadMentionsCount: 0,
100126
unreadNotificationsCount: 2,
101127
notificationMode: .mute,
102-
canonicalAlias: nil,
128+
canonicalAlias: "#foundation-and-empire:matrix.org",
129+
alternativeAliases: [],
103130
hasOngoingCall: false,
104131
isMarkedUnread: false,
105132
isFavourite: false),
@@ -117,6 +144,7 @@ extension Array where Element == RoomSummary {
117144
unreadNotificationsCount: 0,
118145
notificationMode: .mentionsAndKeywordsOnly,
119146
canonicalAlias: nil,
147+
alternativeAliases: [],
120148
hasOngoingCall: false,
121149
isMarkedUnread: false,
122150
isFavourite: false),
@@ -134,6 +162,7 @@ extension Array where Element == RoomSummary {
134162
unreadNotificationsCount: 2,
135163
notificationMode: .allMessages,
136164
canonicalAlias: nil,
165+
alternativeAliases: [],
137166
hasOngoingCall: false,
138167
isMarkedUnread: false,
139168
isFavourite: false),
@@ -151,6 +180,7 @@ extension Array where Element == RoomSummary {
151180
unreadNotificationsCount: 1,
152181
notificationMode: .allMessages,
153182
canonicalAlias: nil,
183+
alternativeAliases: [],
154184
hasOngoingCall: true,
155185
isMarkedUnread: false,
156186
isFavourite: false),
@@ -168,6 +198,7 @@ extension Array where Element == RoomSummary {
168198
unreadNotificationsCount: 0,
169199
notificationMode: .mute,
170200
canonicalAlias: nil,
201+
alternativeAliases: [],
171202
hasOngoingCall: true,
172203
isMarkedUnread: false,
173204
isFavourite: false),
@@ -185,6 +216,7 @@ extension Array where Element == RoomSummary {
185216
unreadNotificationsCount: 0,
186217
notificationMode: nil,
187218
canonicalAlias: nil,
219+
alternativeAliases: [],
188220
hasOngoingCall: false,
189221
isMarkedUnread: false,
190222
isFavourite: false)
@@ -235,6 +267,7 @@ extension Array where Element == RoomSummary {
235267
unreadNotificationsCount: 0,
236268
notificationMode: nil,
237269
canonicalAlias: "#footest:somewhere.org",
270+
alternativeAliases: [],
238271
hasOngoingCall: false,
239272
isMarkedUnread: false,
240273
isFavourite: false),
@@ -252,6 +285,7 @@ extension Array where Element == RoomSummary {
252285
unreadNotificationsCount: 0,
253286
notificationMode: nil,
254287
canonicalAlias: nil,
288+
alternativeAliases: [],
255289
hasOngoingCall: false,
256290
isMarkedUnread: false,
257291
isFavourite: false)

ElementX/Sources/Other/HTMLParsing/AttributedStringBuilder.swift

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,8 @@ struct AttributedStringBuilder: AttributedStringBuilderProtocol {
224224
case .atRoom:
225225
attributedString.addAttribute(.MatrixAllUsersMention, value: true, range: match.range)
226226
case .roomAlias(let alias):
227-
if let url = try? matrixToRoomAliasPermalink(roomAlias: alias) {
227+
if let urlString = try? matrixToRoomAliasPermalink(roomAlias: alias),
228+
let url = URL(string: urlString) {
228229
attributedString.addAttribute(.link, value: url, range: match.range)
229230
}
230231
case .matrixURI(let uri):
@@ -282,13 +283,13 @@ struct AttributedStringBuilder: AttributedStringBuilderProtocol {
282283
case .user(let userID):
283284
mentionBuilder.handleUserMention(for: attributedString, in: range, url: url, userID: userID, userDisplayName: nil)
284285
case .room(let roomID):
285-
attributedString.addAttributes([.MatrixRoomID: roomID], range: range)
286+
mentionBuilder.handleRoomIDMention(for: attributedString, in: range, url: url, roomID: roomID)
286287
case .roomAlias(let alias):
287-
attributedString.addAttributes([.MatrixRoomAlias: alias], range: range)
288+
mentionBuilder.handleRoomAliasMention(for: attributedString, in: range, url: url, roomAlias: alias)
288289
case .eventOnRoomId(let roomID, let eventID):
289-
attributedString.addAttributes([.MatrixEventOnRoomID: EventOnRoomIDAttribute.Value(roomID: roomID, eventID: eventID)], range: range)
290+
mentionBuilder.handleEventOnRoomIDMention(for: attributedString, in: range, url: url, eventID: eventID, roomID: roomID)
290291
case .eventOnRoomAlias(let alias, let eventID):
291-
attributedString.addAttributes([.MatrixEventOnRoomAlias: EventOnRoomAliasAttribute.Value(alias: alias, eventID: eventID)], range: range)
292+
mentionBuilder.handleEventOnRoomAliasMention(for: attributedString, in: range, url: url, eventID: eventID, roomAlias: alias)
292293
}
293294
}
294295
}
@@ -364,6 +365,10 @@ extension NSAttributedString.Key {
364365

365366
protocol MentionBuilderProtocol {
366367
func handleUserMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, userID: String, userDisplayName: String?)
368+
func handleRoomIDMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, roomID: String)
369+
func handleRoomAliasMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, roomAlias: String)
370+
func handleEventOnRoomAliasMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, eventID: String, roomAlias: String)
371+
func handleEventOnRoomIDMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, eventID: String, roomID: String)
367372
func handleAllUsersMention(for attributedString: NSMutableAttributedString, in range: NSRange)
368373
}
369374

0 commit comments

Comments
 (0)