From 529779968f15b8b694926461d6dfe5a23e260681 Mon Sep 17 00:00:00 2001 From: Mauro <34335419+Velin92@users.noreply.github.com> Date: Wed, 19 Jul 2023 16:29:56 +0200 Subject: [PATCH] Better identification system for virtual items (#1361) * better identification system * better handling for unknown --- .../RoomScreen/View/MessageComposer.swift | 6 ++--- .../View/Style/TimelineStyler.swift | 14 +++++------ .../TimelineReadReceiptsView.swift | 2 +- .../View/Timeline/AudioRoomTimelineView.swift | 2 +- .../View/Timeline/EmoteRoomTimelineView.swift | 2 +- .../EncryptedHistoryRoomTimelineView.swift | 2 +- .../Timeline/EncryptedRoomTimelineView.swift | 2 +- .../View/Timeline/FileRoomTimelineView.swift | 6 ++--- .../View/Timeline/ImageRoomTimelineView.swift | 6 ++--- .../Timeline/LocationRoomTimelineView.swift | 4 ++-- .../Timeline/NoticeRoomTimelineView.swift | 2 +- .../Timeline/ReadMarkerRoomTimelineView.swift | 3 ++- .../Timeline/RedactedRoomTimelineView.swift | 2 +- .../View/Timeline/StateRoomTimelineView.swift | 2 +- .../Timeline/StickerRoomTimelineView.swift | 6 ++--- .../View/Timeline/TextRoomTimelineView.swift | 2 +- .../UnsupportedRoomTimelineView.swift | 2 +- .../View/Timeline/VideoRoomTimelineView.swift | 6 ++--- .../Fixtures/RoomTimelineItemFixtures.swift | 16 ++++++------- .../Timeline/RoomTimelineProvider.swift | 24 +++++++++---------- .../RoomTimelineController.swift | 7 +++--- .../Services/Timeline/TimelineItemProxy.swift | 11 +++++++-- .../Virtual/ReadMarkerRoomTimelineItem.swift | 2 +- UnitTests/Sources/LoggingTests.swift | 10 ++++---- .../Sources/RoomScreenViewModelTests.swift | 6 ++--- .../Sources/TextBasedRoomTimelineTests.swift | 10 ++++---- 26 files changed, 82 insertions(+), 75 deletions(-) diff --git a/ElementX/Sources/Screens/RoomScreen/View/MessageComposer.swift b/ElementX/Sources/Screens/RoomScreen/View/MessageComposer.swift index 6b3b8d3c1..292cdb40d 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/MessageComposer.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/MessageComposer.swift @@ -215,7 +215,7 @@ struct MessageComposer_Previews: PreviewProvider { MessageComposer(text: .constant("Some message"), focused: .constant(false), sendingDisabled: false, - mode: .edit(originalItemId: .init(timelineID: UUID().uuidString)), + mode: .edit(originalItemId: .random), sendAction: { }, pasteAction: { _ in }, replyCancellationAction: { }, @@ -224,7 +224,7 @@ struct MessageComposer_Previews: PreviewProvider { MessageComposer(text: .constant(""), focused: .constant(false), sendingDisabled: false, - mode: .reply(itemID: .init(timelineID: UUID().uuidString), + mode: .reply(itemID: .random, replyDetails: .loaded(sender: .init(id: "Kirk"), contentType: .text(.init(body: "Text: Where the wild things are")))), sendAction: { }, @@ -256,7 +256,7 @@ struct MessageComposer_Previews: PreviewProvider { MessageComposer(text: .constant(""), focused: .constant(false), sendingDisabled: false, - mode: .reply(itemID: .init(timelineID: UUID().uuidString), + mode: .reply(itemID: .random, replyDetails: replyDetails), sendAction: { }, pasteAction: { _ in }, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineStyler.swift b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineStyler.swift index e49c5bcc1..875921ab4 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineStyler.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineStyler.swift @@ -38,7 +38,7 @@ struct TimelineStyler: View { struct TimelineItemStyler_Previews: PreviewProvider { static let viewModel = RoomScreenViewModel.mock - static let base = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) + static let base = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) static let sentNonLast: TextRoomTimelineItem = { var result = base @@ -71,17 +71,17 @@ struct TimelineItemStyler_Previews: PreviewProvider { return result }() - static let ltrString = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "house!")) + static let ltrString = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "house!")) - static let rtlString = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "באמת!")) + static let rtlString = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "באמת!")) - static let ltrStringThatContainsRtl = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "house! -- באמת‏! -- house!")) + static let ltrStringThatContainsRtl = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "house! -- באמת‏! -- house!")) - static let rtlStringThatContainsLtr = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "באמת‏! -- house! -- באמת!")) + static let rtlStringThatContainsLtr = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "באמת‏! -- house! -- באמת!")) - static let ltrStringThatFinishesInRtl = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "house! -- באמת!")) + static let ltrStringThatFinishesInRtl = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "house! -- באמת!")) - static let rtlStringThatFinishesInLtr = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "באמת‏! -- house!")) + static let rtlStringThatFinishesInLtr = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "באמת‏! -- house!")) static var testView: some View { VStack { diff --git a/ElementX/Sources/Screens/RoomScreen/View/Supplementary/TimelineReadReceiptsView.swift b/ElementX/Sources/Screens/RoomScreen/View/Supplementary/TimelineReadReceiptsView.swift index aa01c4d32..c61ddcb0d 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Supplementary/TimelineReadReceiptsView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Supplementary/TimelineReadReceiptsView.swift @@ -78,7 +78,7 @@ struct TimelineReadReceiptsView_Previews: PreviewProvider { ReadReceipt(userID: RoomMemberProxyMock.mockDan.userID, formattedTimestamp: "Way, way before")] static func mockTimelineItem(with receipts: [ReadReceipt]) -> TextRoomTimelineItem { - TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "Test"), diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/AudioRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/AudioRoomTimelineView.swift index a7170a3ac..a0c0afea9 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/AudioRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/AudioRoomTimelineView.swift @@ -44,7 +44,7 @@ struct AudioRoomTimelineView_Previews: PreviewProvider { } static var body: some View { - AudioRoomTimelineView(timelineItem: AudioRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + AudioRoomTimelineView(timelineItem: AudioRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/EmoteRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/EmoteRoomTimelineView.swift index 4c85cea8d..849507fe2 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/EmoteRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/EmoteRoomTimelineView.swift @@ -55,7 +55,7 @@ struct EmoteRoomTimelineView_Previews: PreviewProvider { } private static func itemWith(text: String, timestamp: String, senderId: String) -> EmoteRoomTimelineItem { - EmoteRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + EmoteRoomTimelineItem(id: .random, timestamp: timestamp, isOutgoing: false, isEditable: false, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/EncryptedHistoryRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/EncryptedHistoryRoomTimelineView.swift index 07e73b01f..970d5f82f 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/EncryptedHistoryRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/EncryptedHistoryRoomTimelineView.swift @@ -55,7 +55,7 @@ private struct EncryptedHistoryLabelStyle: LabelStyle { struct EncryptedHistoryRoomTimelineView_Previews: PreviewProvider { static var previews: some View { - let item = EncryptedHistoryRoomTimelineItem(id: .init(timelineID: UUID().uuidString)) + let item = EncryptedHistoryRoomTimelineItem(id: .random) EncryptedHistoryRoomTimelineView(timelineItem: item) } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/EncryptedRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/EncryptedRoomTimelineView.swift index 053fc495d..7234e24fb 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/EncryptedRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/EncryptedRoomTimelineView.swift @@ -67,7 +67,7 @@ struct EncryptedRoomTimelineView_Previews: PreviewProvider { } private static func itemWith(text: String, timestamp: String, isOutgoing: Bool, senderId: String) -> EncryptedRoomTimelineItem { - EncryptedRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + EncryptedRoomTimelineItem(id: .random, body: text, encryptionType: .unknown, timestamp: timestamp, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/FileRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/FileRoomTimelineView.swift index 17497b91c..1f2574a91 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/FileRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/FileRoomTimelineView.swift @@ -45,21 +45,21 @@ struct FileRoomTimelineView_Previews: PreviewProvider { static var body: some View { VStack(spacing: 20.0) { - FileRoomTimelineView(timelineItem: FileRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + FileRoomTimelineView(timelineItem: FileRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, sender: .init(id: "Bob"), content: .init(body: "document.pdf", source: nil, thumbnailSource: nil, contentType: nil))) - FileRoomTimelineView(timelineItem: FileRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + FileRoomTimelineView(timelineItem: FileRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, sender: .init(id: "Bob"), content: .init(body: "document.docx", source: nil, thumbnailSource: nil, contentType: nil))) - FileRoomTimelineView(timelineItem: FileRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + FileRoomTimelineView(timelineItem: FileRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/ImageRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/ImageRoomTimelineView.swift index d8d581651..2cb6025fe 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/ImageRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/ImageRoomTimelineView.swift @@ -66,21 +66,21 @@ struct ImageRoomTimelineView_Previews: PreviewProvider { static var body: some View { VStack(spacing: 20.0) { - ImageRoomTimelineView(timelineItem: ImageRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + ImageRoomTimelineView(timelineItem: ImageRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, sender: .init(id: "Bob"), content: .init(body: "Some image", source: MediaSourceProxy(url: .picturesDirectory, mimeType: "image/png"), thumbnailSource: nil))) - ImageRoomTimelineView(timelineItem: ImageRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + ImageRoomTimelineView(timelineItem: ImageRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, sender: .init(id: "Bob"), content: .init(body: "Some other image", source: MediaSourceProxy(url: .picturesDirectory, mimeType: "image/png"), thumbnailSource: nil))) - ImageRoomTimelineView(timelineItem: ImageRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + ImageRoomTimelineView(timelineItem: ImageRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/LocationRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/LocationRoomTimelineView.swift index 29823e166..1cc1a874a 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/LocationRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/LocationRoomTimelineView.swift @@ -91,14 +91,14 @@ struct LocationRoomTimelineView_Previews: PreviewProvider { @ViewBuilder static var body: some View { - LocationRoomTimelineView(timelineItem: .init(id: .init(timelineID: UUID().uuidString), + LocationRoomTimelineView(timelineItem: .init(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, sender: .init(id: "Bob"), content: .init(body: "Fallback geo uri description"))) - LocationRoomTimelineView(timelineItem: .init(id: .init(timelineID: UUID().uuidString), + LocationRoomTimelineView(timelineItem: .init(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/NoticeRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/NoticeRoomTimelineView.swift index cab486f64..f4fd14336 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/NoticeRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/NoticeRoomTimelineView.swift @@ -66,7 +66,7 @@ struct NoticeRoomTimelineView_Previews: PreviewProvider { } private static func itemWith(text: String, timestamp: String, senderId: String) -> NoticeRoomTimelineItem { - NoticeRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + NoticeRoomTimelineItem(id: .random, timestamp: timestamp, isOutgoing: false, isEditable: false, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/ReadMarkerRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/ReadMarkerRoomTimelineView.swift index 532262cd4..4ebd0abc8 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/ReadMarkerRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/ReadMarkerRoomTimelineView.swift @@ -38,7 +38,8 @@ struct ReadMarkerRoomTimelineView: View { struct ReadMarkerRoomTimelineView_Previews: PreviewProvider { static let viewModel = RoomScreenViewModel.mock - static let item = ReadMarkerRoomTimelineItem() + static let item = ReadMarkerRoomTimelineItem(id: .init(timelineID: .init(UUID().uuidString))) + static var previews: some View { VStack(alignment: .leading, spacing: 0) { RoomTimelineItemView(viewModel: .init(type: .separator(.init(id: .init(timelineID: "Separator"), text: "Today")), groupStyle: .single)) diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/RedactedRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/RedactedRoomTimelineView.swift index 28386997e..9fd6facae 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/RedactedRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/RedactedRoomTimelineView.swift @@ -42,7 +42,7 @@ struct RedactedRoomTimelineView_Previews: PreviewProvider { } private static func itemWith(text: String, timestamp: String, senderId: String) -> RedactedRoomTimelineItem { - RedactedRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + RedactedRoomTimelineItem(id: .random, body: text, timestamp: timestamp, isOutgoing: false, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/StateRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/StateRoomTimelineView.swift index 7ff159ded..c661bf29d 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/StateRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/StateRoomTimelineView.swift @@ -41,7 +41,7 @@ struct StateRoomTimelineView_Previews: PreviewProvider { StateRoomTimelineView(timelineItem: item) } - static let item = StateRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + static let item = StateRoomTimelineItem(id: .random, body: "Alice joined", timestamp: "Now", isOutgoing: false, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/StickerRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/StickerRoomTimelineView.swift index a381696f7..7f98d6009 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/StickerRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/StickerRoomTimelineView.swift @@ -58,7 +58,7 @@ struct StickerRoomTimelineView_Previews: PreviewProvider { static var body: some View { VStack(spacing: 20.0) { - StickerRoomTimelineView(timelineItem: StickerRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + StickerRoomTimelineView(timelineItem: StickerRoomTimelineItem(id: .random, body: "Some image", timestamp: "Now", isOutgoing: false, @@ -66,7 +66,7 @@ struct StickerRoomTimelineView_Previews: PreviewProvider { sender: .init(id: "Bob"), imageURL: URL.picturesDirectory)) - StickerRoomTimelineView(timelineItem: StickerRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + StickerRoomTimelineView(timelineItem: StickerRoomTimelineItem(id: .random, body: "Some other image", timestamp: "Now", isOutgoing: false, @@ -74,7 +74,7 @@ struct StickerRoomTimelineView_Previews: PreviewProvider { sender: .init(id: "Bob"), imageURL: URL.picturesDirectory)) - StickerRoomTimelineView(timelineItem: StickerRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + StickerRoomTimelineView(timelineItem: StickerRoomTimelineItem(id: .random, body: "Blurhashed image", timestamp: "Now", isOutgoing: false, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/TextRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/TextRoomTimelineView.swift index 6da9a1fc0..14f359714 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/TextRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/TextRoomTimelineView.swift @@ -71,7 +71,7 @@ struct TextRoomTimelineView_Previews: PreviewProvider { } private static func itemWith(text: String, timestamp: String, isOutgoing: Bool, senderId: String) -> TextRoomTimelineItem { - TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + TextRoomTimelineItem(id: .random, timestamp: timestamp, isOutgoing: isOutgoing, isEditable: isOutgoing, diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/UnsupportedRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/UnsupportedRoomTimelineView.swift index 7fa30628d..b15f45b80 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/UnsupportedRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/UnsupportedRoomTimelineView.swift @@ -63,7 +63,7 @@ struct UnsupportedRoomTimelineView_Previews: PreviewProvider { } private static func itemWith(text: String, timestamp: String, isOutgoing: Bool, senderId: String) -> UnsupportedRoomTimelineItem { - UnsupportedRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + UnsupportedRoomTimelineItem(id: .random, body: text, eventType: "Some Event Type", error: "Something went wrong", diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/VideoRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/VideoRoomTimelineView.swift index 3e1bae03d..28c989cdd 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/VideoRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/VideoRoomTimelineView.swift @@ -77,21 +77,21 @@ struct VideoRoomTimelineView_Previews: PreviewProvider { static var body: some View { VStack(spacing: 20.0) { - VideoRoomTimelineView(timelineItem: VideoRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + VideoRoomTimelineView(timelineItem: VideoRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, sender: .init(id: "Bob"), content: .init(body: "Some video", duration: 21, source: nil, thumbnailSource: nil))) - VideoRoomTimelineView(timelineItem: VideoRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + VideoRoomTimelineView(timelineItem: VideoRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, sender: .init(id: "Bob"), content: .init(body: "Some other video", duration: 22, source: nil, thumbnailSource: nil))) - VideoRoomTimelineView(timelineItem: VideoRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + VideoRoomTimelineView(timelineItem: VideoRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: false, isEditable: false, diff --git a/ElementX/Sources/Services/Timeline/Fixtures/RoomTimelineItemFixtures.swift b/ElementX/Sources/Services/Timeline/Fixtures/RoomTimelineItemFixtures.swift index 200643374..1ca505d7b 100644 --- a/ElementX/Sources/Services/Timeline/Fixtures/RoomTimelineItemFixtures.swift +++ b/ElementX/Sources/Services/Timeline/Fixtures/RoomTimelineItemFixtures.swift @@ -20,14 +20,14 @@ enum RoomTimelineItemFixtures { /// The default timeline items used in Xcode previews etc. static var `default`: [RoomTimelineItemProtocol] = [ SeparatorRoomTimelineItem(id: .init(timelineID: "Yesterday"), text: "Yesterday"), - TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + TextRoomTimelineItem(id: .random, timestamp: "10:10 AM", isOutgoing: false, isEditable: false, sender: .init(id: "", displayName: "Jacob"), content: .init(body: "That looks so good!"), properties: RoomTimelineItemProperties(isEdited: true)), - TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + TextRoomTimelineItem(id: .random, timestamp: "10:11 AM", isOutgoing: false, isEditable: false, @@ -36,7 +36,7 @@ enum RoomTimelineItemFixtures { properties: RoomTimelineItemProperties(reactions: [ AggregatedReaction(accountOwnerID: "me", key: "🙌", senders: [ReactionSender(senderID: "me", timestamp: Date())]) ])), - TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + TextRoomTimelineItem(id: .random, timestamp: "10:11 AM", isOutgoing: false, isEditable: false, @@ -53,20 +53,20 @@ enum RoomTimelineItemFixtures { ]) ])), SeparatorRoomTimelineItem(id: .init(timelineID: "Today"), text: "Today"), - TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + TextRoomTimelineItem(id: .random, timestamp: "5 PM", isOutgoing: false, isEditable: false, sender: .init(id: "", displayName: "Helena"), content: .init(body: "Wow, cool. Ok, lets go the usual place tomorrow?! Is that too soon? Here’s the menu, let me know what you want it’s on me!"), properties: RoomTimelineItemProperties(orderedReadReceipts: [ReadReceipt(userID: "alice", formattedTimestamp: nil)])), - TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + TextRoomTimelineItem(id: .random, timestamp: "5 PM", isOutgoing: true, isEditable: true, sender: .init(id: "", displayName: "Bob"), content: .init(body: "And John's speech was amazing!")), - TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + TextRoomTimelineItem(id: .random, timestamp: "5 PM", isOutgoing: true, isEditable: true, @@ -77,7 +77,7 @@ enum RoomTimelineItemFixtures { ReadReceipt(userID: "bob", formattedTimestamp: nil), ReadReceipt(userID: "charlie", formattedTimestamp: nil), ReadReceipt(userID: "dan", formattedTimestamp: nil)])), - TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + TextRoomTimelineItem(id: .random, timestamp: "5 PM", isOutgoing: false, isEditable: false, @@ -216,7 +216,7 @@ enum RoomTimelineItemFixtures { private extension TextRoomTimelineItem { init(text: String, senderDisplayName: String) { - self.init(id: .init(timelineID: UUID().uuidString), + self.init(id: .random, timestamp: "10:47 am", isOutgoing: senderDisplayName == "Alice", isEditable: false, diff --git a/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift b/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift index c99a517d1..c517bd9ba 100644 --- a/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift +++ b/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift @@ -171,14 +171,14 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol { private extension TimelineItem { var debugIdentifier: DebugIdentifier { if let virtualTimelineItem = asVirtual() { - return virtualTimelineItem.debugIdentifier + return .virtual(timelineID: String(uniqueId()), dscription: virtualTimelineItem.description) } else if let eventTimelineItem = asEvent() { return .event(timelineID: String(uniqueId()), eventID: eventTimelineItem.eventId(), transactionID: eventTimelineItem.transactionId()) } - return .unknown + return .unknown(timelineID: String(uniqueId())) } } @@ -189,27 +189,27 @@ private extension TimelineItemProxy { return .event(timelineID: eventTimelineItem.id.timelineID, eventID: eventTimelineItem.id.eventID, transactionID: eventTimelineItem.id.transactionID) - case .virtual(let virtualTimelineItem): - return virtualTimelineItem.debugIdentifier - case .unknown: - return .unknown + case .virtual(let virtualTimelineItem, let timelineID): + return .virtual(timelineID: timelineID, dscription: virtualTimelineItem.description) + case .unknown(let item): + return .unknown(timelineID: String(item.uniqueId())) } } } private extension VirtualTimelineItem { - var debugIdentifier: DebugIdentifier { + var description: String { switch self { case .dayDivider(let timestamp): - return .virtual("DayDiviver(\(timestamp))") + return "DayDiviver(\(timestamp))" case .readMarker: - return .virtual("ReadMarker") + return "ReadMarker" } } } enum DebugIdentifier { - case event(timelineID: String?, eventID: String?, transactionID: String?) - case virtual(String) - case unknown + case event(timelineID: String, eventID: String?, transactionID: String?) + case virtual(timelineID: String, dscription: String) + case unknown(timelineID: String) } diff --git a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift index 7cbb078f2..b3e1d249d 100644 --- a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift +++ b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift @@ -349,16 +349,15 @@ class RoomTimelineController: RoomTimelineControllerProtocol { } return timelineItem - case .virtual(let virtualItem): + case .virtual(let virtualItem, let timelineID): switch virtualItem { case .dayDivider(let timestamp): let date = Date(timeIntervalSince1970: TimeInterval(timestamp / 1000)) let dateString = date.formatted(date: .complete, time: .omitted) - let identifier = date.formatted(.iso8601.dateSeparator(.dash)) - return SeparatorRoomTimelineItem(id: .init(timelineID: identifier), text: dateString) + return SeparatorRoomTimelineItem(id: .init(timelineID: timelineID), text: dateString) case .readMarker: - return ReadMarkerRoomTimelineItem() + return ReadMarkerRoomTimelineItem(id: .init(timelineID: timelineID)) } case .unknown: return nil diff --git a/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift b/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift index ba24f57e1..93fe15165 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift @@ -31,17 +31,24 @@ struct TimelineItemIdentifier: Hashable { var transactionID: String? } +extension TimelineItemIdentifier { + /// Use only for mocks/tests + static var random: Self { + .init(timelineID: UUID().uuidString) + } +} + /// A light wrapper around timeline items returned from Rust. enum TimelineItemProxy { case event(EventTimelineItemProxy) - case virtual(MatrixRustSDK.VirtualTimelineItem) + case virtual(MatrixRustSDK.VirtualTimelineItem, timelineID: String) case unknown(MatrixRustSDK.TimelineItem) init(item: MatrixRustSDK.TimelineItem) { if let eventItem = item.asEvent() { self = .event(EventTimelineItemProxy(item: eventItem, id: item.uniqueId())) } else if let virtualItem = item.asVirtual() { - self = .virtual(virtualItem) + self = .virtual(virtualItem, timelineID: String(item.uniqueId())) } else { self = .unknown(item) } diff --git a/ElementX/Sources/Services/Timeline/TimelineItems/Items/Virtual/ReadMarkerRoomTimelineItem.swift b/ElementX/Sources/Services/Timeline/TimelineItems/Items/Virtual/ReadMarkerRoomTimelineItem.swift index 591908171..4f62f24aa 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItems/Items/Virtual/ReadMarkerRoomTimelineItem.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItems/Items/Virtual/ReadMarkerRoomTimelineItem.swift @@ -17,5 +17,5 @@ import Foundation struct ReadMarkerRoomTimelineItem: DecorationTimelineItemProtocol, Equatable { - let id = TimelineItemIdentifier(timelineID: "readMarkerTimelineItemIdentifier") + let id: TimelineItemIdentifier } diff --git a/UnitTests/Sources/LoggingTests.swift b/UnitTests/Sources/LoggingTests.swift index 5c01cfba7..51c5a6c50 100644 --- a/UnitTests/Sources/LoggingTests.swift +++ b/UnitTests/Sources/LoggingTests.swift @@ -252,21 +252,21 @@ class LoggingTests: XCTestCase { func testTimelineContentIsRedacted() throws { // Given timeline items that contain text let textAttributedString = "TextAttributed" - let textMessage = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + let textMessage = TextRoomTimelineItem(id: .random, timestamp: "", isOutgoing: false, isEditable: false, sender: .init(id: "sender"), content: .init(body: "TextString", formattedBody: AttributedString(textAttributedString))) let noticeAttributedString = "NoticeAttributed" - let noticeMessage = NoticeRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + let noticeMessage = NoticeRoomTimelineItem(id: .random, timestamp: "", isOutgoing: false, isEditable: false, sender: .init(id: "sender"), content: .init(body: "NoticeString", formattedBody: AttributedString(noticeAttributedString))) let emoteAttributedString = "EmoteAttributed" - let emoteMessage = EmoteRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + let emoteMessage = EmoteRoomTimelineItem(id: .random, timestamp: "", isOutgoing: false, isEditable: false, @@ -278,13 +278,13 @@ class LoggingTests: XCTestCase { isEditable: false, sender: .init(id: "sender"), content: .init(body: "ImageString", source: MediaSourceProxy(url: .picturesDirectory, mimeType: "image/gif"), thumbnailSource: nil)) - let videoMessage = VideoRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + let videoMessage = VideoRoomTimelineItem(id: .random, timestamp: "", isOutgoing: false, isEditable: false, sender: .init(id: "sender"), content: .init(body: "VideoString", duration: 0, source: nil, thumbnailSource: nil)) - let fileMessage = FileRoomTimelineItem(id: .init(timelineID: UUID().uuidString), + let fileMessage = FileRoomTimelineItem(id: .random, timestamp: "", isOutgoing: false, isEditable: false, diff --git a/UnitTests/Sources/RoomScreenViewModelTests.swift b/UnitTests/Sources/RoomScreenViewModelTests.swift index 2b443a508..6cefb3e0a 100644 --- a/UnitTests/Sources/RoomScreenViewModelTests.swift +++ b/UnitTests/Sources/RoomScreenViewModelTests.swift @@ -309,7 +309,7 @@ class RoomScreenViewModelTests: XCTestCase { userIndicatorController: userIndicatorControllerMock) // Test - viewModel.context.send(viewAction: .retrySend(itemID: .init(timelineID: UUID().uuidString))) + viewModel.context.send(viewAction: .retrySend(itemID: .random)) await Task.yield() XCTAssert(roomProxyMock.retrySendTransactionIDCallsCount == 0) } @@ -346,7 +346,7 @@ class RoomScreenViewModelTests: XCTestCase { userIndicatorController: userIndicatorControllerMock) // Test - viewModel.context.send(viewAction: .cancelSend(itemID: .init(timelineID: UUID().uuidString))) + viewModel.context.send(viewAction: .cancelSend(itemID: .random)) await Task.yield() XCTAssert(roomProxyMock.cancelSendTransactionIDCallsCount == 0) } @@ -376,7 +376,7 @@ class RoomScreenViewModelTests: XCTestCase { private extension TextRoomTimelineItem { init(text: String, sender: String, addReactions: Bool = false) { let reactions = addReactions ? [AggregatedReaction(accountOwnerID: "bob", key: "🦄", senders: [ReactionSender(senderID: sender, timestamp: Date())])] : [] - self.init(id: .init(timelineID: UUID().uuidString), + self.init(id: .random, timestamp: "10:47 am", isOutgoing: sender == "bob", isEditable: sender == "bob", diff --git a/UnitTests/Sources/TextBasedRoomTimelineTests.swift b/UnitTests/Sources/TextBasedRoomTimelineTests.swift index 1e9c81873..376524b93 100644 --- a/UnitTests/Sources/TextBasedRoomTimelineTests.swift +++ b/UnitTests/Sources/TextBasedRoomTimelineTests.swift @@ -20,7 +20,7 @@ import XCTest final class TextBasedRoomTimelineTests: XCTestCase { func testTextRoomTimelineItemWhitespaceEnd() { let timestamp = "Now" - let timelineItem = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: timestamp, isOutgoing: true, isEditable: true, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) + let timelineItem = TextRoomTimelineItem(id: .random, timestamp: timestamp, isOutgoing: true, isEditable: true, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) let view = TextBasedRoomTimelineViewMock() view.underlyingTimelineItem = timelineItem view.timelineStyle = .bubbles @@ -30,7 +30,7 @@ final class TextBasedRoomTimelineTests: XCTestCase { func testTextRoomTimelineItemWhitespaceEndLonger() { let timestamp = "10:00 AM" - let timelineItem = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: timestamp, isOutgoing: true, isEditable: true, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) + let timelineItem = TextRoomTimelineItem(id: .random, timestamp: timestamp, isOutgoing: true, isEditable: true, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) let view = TextBasedRoomTimelineViewMock() view.underlyingTimelineItem = timelineItem view.timelineStyle = .bubbles @@ -39,7 +39,7 @@ final class TextBasedRoomTimelineTests: XCTestCase { } func testTextRoomTimelineItemWhitespaceEndPlain() { - let timelineItem = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: "Now", isOutgoing: true, isEditable: true, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) + let timelineItem = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: true, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) let view = TextBasedRoomTimelineViewMock() view.underlyingTimelineItem = timelineItem view.timelineStyle = .plain @@ -49,7 +49,7 @@ final class TextBasedRoomTimelineTests: XCTestCase { func testTextRoomTimelineItemWhitespaceEndWithEdit() { let timestamp = "Now" - var timelineItem = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: timestamp, isOutgoing: true, isEditable: true, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) + var timelineItem = TextRoomTimelineItem(id: .random, timestamp: timestamp, isOutgoing: true, isEditable: true, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) timelineItem.properties.isEdited = true let editedCount = L10n.commonEditedSuffix.count let view = TextBasedRoomTimelineViewMock() @@ -61,7 +61,7 @@ final class TextBasedRoomTimelineTests: XCTestCase { func testTextRoomTimelineItemWhitespaceEndWithEditAndAlert() { let timestamp = "Now" - var timelineItem = TextRoomTimelineItem(id: .init(timelineID: UUID().uuidString), timestamp: timestamp, isOutgoing: true, isEditable: true, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) + var timelineItem = TextRoomTimelineItem(id: .random, timestamp: timestamp, isOutgoing: true, isEditable: true, sender: .init(id: UUID().uuidString), content: .init(body: "Test")) timelineItem.properties.isEdited = true timelineItem.properties.deliveryStatus = .sendingFailed let editedCount = L10n.commonEditedSuffix.count