diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index fc3d0a210..486c205ca 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -398,11 +398,12 @@ 18C5744727E1D84000D70937 /* Room */ = { isa = PBXGroup; children = ( - 18DF7C5127E4753A00291672 /* Members */, - 18C5744927E1D84000D70937 /* Messages */, 18C5744827E1D84000D70937 /* RoomProxyProtocol.swift */, 18C5744A27E1D84000D70937 /* RoomProxy.swift */, 18C5744B27E1D84000D70937 /* MockRoomProxy.swift */, + 18C5745527E1DCA800D70937 /* RoomMessageFactory.swift */, + 18DF7C5127E4753A00291672 /* Members */, + 18C5744927E1D84000D70937 /* Messages */, ); path = Room; sourceTree = ""; @@ -410,12 +411,11 @@ 18C5744927E1D84000D70937 /* Messages */ = { isa = PBXGroup; children = ( - 18920C0D27F233FF00A717B5 /* EmoteRoomMessage.swift */, - 18C5745127E1D88600D70937 /* ImageRoomMessage.swift */, - 18920C0C27F233FF00A717B5 /* NoticeRoomMessage.swift */, - 18C5745527E1DCA800D70937 /* RoomMessageFactory.swift */, 18C5744F27E1D87800D70937 /* RoomMessageProtocol.swift */, 18C5745327E1D88E00D70937 /* TextRoomMessage.swift */, + 18C5745127E1D88600D70937 /* ImageRoomMessage.swift */, + 18920C0D27F233FF00A717B5 /* EmoteRoomMessage.swift */, + 18920C0C27F233FF00A717B5 /* NoticeRoomMessage.swift */, ); path = Messages; sourceTree = ""; @@ -437,8 +437,8 @@ 18DF7C3827E4670600291672 /* RoomTimelineViewFactory.swift */, 18DF7C3527E4670600291672 /* RoomTimelineViewProvider.swift */, 18DF7C3727E4670600291672 /* RoomTimelineItemProtocol.swift */, - 18DF7C4B27E4672C00291672 /* EventBasedTimelineItemProtocol.swift */, 18DF7C4D27E4673E00291672 /* DecorationTimelineItemProtocol.swift */, + 18DF7C4B27E4672C00291672 /* EventBasedTimelineItemProtocol.swift */, 18DF7C3927E4670600291672 /* Items */, ); path = TimelineItems; diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/EmoteRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/EmoteRoomTimelineView.swift index 74788c788..5b15a13e5 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/EmoteRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/EmoteRoomTimelineView.swift @@ -30,7 +30,13 @@ struct EmoteRoomTimelineView: View { struct EmoteRoomTimelineView_Previews: PreviewProvider { static var previews: some View { - VStack(spacing: 20.0) { + body + body.preferredColorScheme(.dark) + } + + @ViewBuilder + static var body: some View { + VStack(alignment: .leading, spacing: 20.0) { let timelineItem = EmoteRoomTimelineItem(id: UUID().uuidString, text: "Short loin ground round tongue hamburger, fatback salami shoulder. Beef turkey sausage kielbasa strip steak. Alcatra capicola pig tail pancetta chislic.", timestamp: "Now", @@ -45,6 +51,5 @@ struct EmoteRoomTimelineView_Previews: PreviewProvider { senderId: "Anne") EmoteRoomTimelineView(timelineItem: timelineItem) } - .padding() } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/EventBasedTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/EventBasedTimelineView.swift index e56924173..43105cc29 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/EventBasedTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/EventBasedTimelineView.swift @@ -51,7 +51,13 @@ struct EventBasedTimelineView: View { struct EventBasedTimelineView_Previews: PreviewProvider { static var previews: some View { - VStack(spacing: 20.0) { + body + body.preferredColorScheme(.dark) + } + + @ViewBuilder + static var body: some View { + VStack(alignment: .leading, spacing: 20.0) { let timelineItem = TextRoomTimelineItem(id: UUID().uuidString, text: "Short loin ground round tongue hamburger, fatback salami shoulder. Beef turkey sausage kielbasa strip steak. Alcatra capicola pig tail pancetta chislic.", timestamp: "Now", @@ -66,6 +72,5 @@ struct EventBasedTimelineView_Previews: PreviewProvider { senderId: "Anne") EventBasedTimelineView(timelineItem: timelineItem) } - .padding() } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/FormattedBodyText.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/FormattedBodyText.swift index 11bba6ae1..7c3bc217a 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/FormattedBodyText.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/FormattedBodyText.swift @@ -35,21 +35,43 @@ struct FormattedBodyText: View { struct FormattedBodyText_Previews: PreviewProvider { static var previews: some View { - let htmlString = """ + body + body.preferredColorScheme(.dark) + + } + + @ViewBuilder + static var body: some View { + let htmlStrings = [ +""" Text before blockquote
bold italic
Text after blockquote +""", """ +
First blockquote with a link in it
+
Second blockquote with a link in it
+
Third blockquote with a link in it
+""", +""" +Hello world +

Text

+Hello world +

Text

+Hello world +"""] let attributedStringBuilder = AttributedStringBuilder() - let attributedString = attributedStringBuilder.fromHTML(htmlString) - - if let components = attributedStringBuilder.blockquoteCoalescedComponentsFrom(attributedString) { - VStack { - FormattedBodyText(attributedComponents: components) - .fixedSize() + VStack(alignment: .leading, spacing: 24.0) { + ForEach(htmlStrings, id: \.self) { htmlString in + let attributedString = attributedStringBuilder.fromHTML(htmlString) + + if let components = attributedStringBuilder.blockquoteCoalescedComponentsFrom(attributedString) { + FormattedBodyText(attributedComponents: components) + .fixedSize() + } } } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/ImageRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/ImageRoomTimelineView.swift index 57627a59f..c931e13b9 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/ImageRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/ImageRoomTimelineView.swift @@ -35,7 +35,13 @@ struct ImageRoomTimelineView: View { struct ImageRoomTimelineView_Previews: PreviewProvider { static var previews: some View { - VStack { + body + body.preferredColorScheme(.dark) + } + + @ViewBuilder + static var body: some View { + VStack(spacing: 20.0) { let timelineItem = ImageRoomTimelineItem(id: UUID().uuidString, text: "Some image", timestamp: "Now", diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/NoticeRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/NoticeRoomTimelineView.swift index 2865d9400..2eaa9aea3 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/NoticeRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/NoticeRoomTimelineView.swift @@ -30,7 +30,13 @@ struct NoticeRoomTimelineView: View { struct NoticeRoomTimelineView_Previews: PreviewProvider { static var previews: some View { - VStack(spacing: 20.0) { + body + body.preferredColorScheme(.dark) + } + + @ViewBuilder + static var body: some View { + VStack(alignment: .leading, spacing: 20.0) { let timelineItem = NoticeRoomTimelineItem(id: UUID().uuidString, text: "Short loin ground round tongue hamburger, fatback salami shoulder. Beef turkey sausage kielbasa strip steak. Alcatra capicola pig tail pancetta chislic.", timestamp: "Now", diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/PlaceholderAvatarImage.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/PlaceholderAvatarImage.swift index 83e40198b..3d8d1eb53 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/PlaceholderAvatarImage.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/PlaceholderAvatarImage.swift @@ -36,6 +36,12 @@ struct PlaceholderAvatarImage: View { struct PlaceholderAvatarImage_Previews: PreviewProvider { static var previews: some View { + body + body.preferredColorScheme(.dark) + } + + @ViewBuilder + static var body: some View { PlaceholderAvatarImage(firstCharacter: "X") .clipShape(Circle()) .frame(width: 150, height: 100) diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/SeparatorRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/SeparatorRoomTimelineView.swift index f4bc9db5b..0c46bc01a 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/SeparatorRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/SeparatorRoomTimelineView.swift @@ -44,8 +44,13 @@ struct LabelledDivider: View { struct SeparatorRoomTimelineView_Previews: PreviewProvider { static var previews: some View { + body + body.preferredColorScheme(.dark) + } + + @ViewBuilder + static var body: some View { let item = SeparatorRoomTimelineItem(id: UUID().uuidString, text: "This is a separator") - SeparatorRoomTimelineView(timelineItem: item) } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/TextRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/TextRoomTimelineView.swift index a9dc808e5..c9b4ccb1b 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/TextRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/TextRoomTimelineView.swift @@ -27,7 +27,13 @@ struct TextRoomTimelineView: View { struct TextRoomTimelineView_Previews: PreviewProvider { static var previews: some View { - VStack(spacing: 20.0) { + body + body.preferredColorScheme(.dark) + } + + @ViewBuilder + static var body: some View { + VStack(alignment: .leading, spacing: 20.0) { let timelineItem = TextRoomTimelineItem(id: UUID().uuidString, text: "Short loin ground round tongue hamburger, fatback salami shoulder. Beef turkey sausage kielbasa strip steak. Alcatra capicola pig tail pancetta chislic.", timestamp: "Now", @@ -42,6 +48,5 @@ struct TextRoomTimelineView_Previews: PreviewProvider { senderId: "Anne") TextRoomTimelineView(timelineItem: timelineItem) } - .padding() } } diff --git a/ElementX/Sources/Services/Room/Messages/RoomMessageFactory.swift b/ElementX/Sources/Services/Room/RoomMessageFactory.swift similarity index 100% rename from ElementX/Sources/Services/Room/Messages/RoomMessageFactory.swift rename to ElementX/Sources/Services/Room/RoomMessageFactory.swift