mirror of
https://github.com/element-hq/element-x-ios.git
synced 2025-03-10 21:39:12 +00:00
Simplify how we build bubbles for previewing purposes, make use of the new bubbleBackground modifier.
This commit is contained in:
parent
681daf50ea
commit
c97dcc18f2
@ -21,9 +21,7 @@ struct AudioMediaEventsTimelineView: View {
|
|||||||
isAudioFile: true)
|
isAudioFile: true)
|
||||||
.accessibilityLabel(L10n.commonAudio)
|
.accessibilityLabel(L10n.commonAudio)
|
||||||
.frame(maxWidth: .infinity, alignment: .leading)
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
.bubbleBackground(isOutgoing: timelineItem.isOutgoing,
|
.bubbleBackground(isOutgoing: timelineItem.isOutgoing)
|
||||||
insets: .init(top: 8, leading: 12, bottom: 8, trailing: 12),
|
|
||||||
color: .compound.bgSubtleSecondary)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,9 +20,7 @@ struct FileMediaEventsTimelineView: View {
|
|||||||
additionalWhitespaces: timelineItem.additionalWhitespaces())
|
additionalWhitespaces: timelineItem.additionalWhitespaces())
|
||||||
.accessibilityLabel(L10n.commonFile)
|
.accessibilityLabel(L10n.commonFile)
|
||||||
.frame(maxWidth: .infinity, alignment: .leading)
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
.bubbleBackground(isOutgoing: timelineItem.isOutgoing,
|
.bubbleBackground(isOutgoing: timelineItem.isOutgoing)
|
||||||
insets: .init(top: 8, leading: 12, bottom: 8, trailing: 12),
|
|
||||||
color: .compound.bgSubtleSecondary)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,9 +17,7 @@ struct VoiceMessageMediaEventsTimelineView: View {
|
|||||||
playerState: playerState)
|
playerState: playerState)
|
||||||
.accessibilityLabel(L10n.commonVoiceMessage)
|
.accessibilityLabel(L10n.commonVoiceMessage)
|
||||||
.frame(maxWidth: .infinity, alignment: .leading)
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
.bubbleBackground(isOutgoing: timelineItem.isOutgoing,
|
.bubbleBackground(isOutgoing: timelineItem.isOutgoing)
|
||||||
insets: .init(top: 8, leading: 12, bottom: 8, trailing: 12),
|
|
||||||
color: .compound.bgSubtleSecondary)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,7 +137,8 @@ struct SwipeRightAction_Previews: PreviewProvider, TestablePreview {
|
|||||||
NavigationStack {
|
NavigationStack {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack(alignment: .leading, spacing: 2) {
|
VStack(alignment: .leading, spacing: 2) {
|
||||||
mockBubble("This is a message from somebody with a couple of lines of text.")
|
Text("This is a message from somebody with a couple of lines of text.")
|
||||||
|
.bubbleBackground()
|
||||||
.swipeRightAction {
|
.swipeRightAction {
|
||||||
Image(systemName: "flame")
|
Image(systemName: "flame")
|
||||||
} shouldStartAction: {
|
} shouldStartAction: {
|
||||||
@ -156,12 +157,5 @@ struct SwipeRightAction_Previews: PreviewProvider, TestablePreview {
|
|||||||
.presentationDetents([.medium])
|
.presentationDetents([.medium])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func mockBubble(_ body: String) -> some View {
|
|
||||||
Text(body)
|
|
||||||
.padding(.horizontal, 12)
|
|
||||||
.padding(.vertical, 4)
|
|
||||||
.background(Color.compound._bgBubbleOutgoing, in: RoundedRectangle(cornerRadius: 12))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,9 +95,7 @@ struct LongPressWithFeedback_Previews: PreviewProvider, TestablePreview {
|
|||||||
|
|
||||||
func mockBubble(_ body: String) -> some View {
|
func mockBubble(_ body: String) -> some View {
|
||||||
Text(body)
|
Text(body)
|
||||||
.padding(.horizontal, 12)
|
.bubbleBackground()
|
||||||
.padding(.vertical, 4)
|
|
||||||
.background(Color.compound._bgBubbleOutgoing, in: RoundedRectangle(cornerRadius: 12))
|
|
||||||
.contentShape(.contextMenuPreview, RoundedRectangle(cornerRadius: 12))
|
.contentShape(.contextMenuPreview, RoundedRectangle(cornerRadius: 12))
|
||||||
.onTapGesture { /* Fix long press gesture blocking the scroll view */ }
|
.onTapGesture { /* Fix long press gesture blocking the scroll view */ }
|
||||||
}
|
}
|
||||||
|
@ -5,12 +5,13 @@
|
|||||||
// Please see LICENSE in the repository root for full details.
|
// Please see LICENSE in the repository root for full details.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
import Compound
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
extension View {
|
extension View {
|
||||||
func bubbleBackground(isOutgoing: Bool,
|
func bubbleBackground(isOutgoing: Bool = true,
|
||||||
insets: EdgeInsets,
|
insets: EdgeInsets = .init(top: 8, leading: 12, bottom: 8, trailing: 12),
|
||||||
color: Color? = nil) -> some View {
|
color: Color? = .compound.bgSubtleSecondary) -> some View {
|
||||||
modifier(TimelineItemBubbleBackgroundModifier(isOutgoing: isOutgoing,
|
modifier(TimelineItemBubbleBackgroundModifier(isOutgoing: isOutgoing,
|
||||||
insets: insets,
|
insets: insets,
|
||||||
color: color))
|
color: color))
|
||||||
|
@ -189,18 +189,18 @@ struct FormattedBodyText_Previews: PreviewProvider, TestablePreview {
|
|||||||
ForEach(htmlStrings, id: \.self) { htmlString in
|
ForEach(htmlStrings, id: \.self) { htmlString in
|
||||||
if let attributedString = attributedStringBuilder.fromHTML(htmlString) {
|
if let attributedString = attributedStringBuilder.fromHTML(htmlString) {
|
||||||
FormattedBodyText(attributedString: attributedString)
|
FormattedBodyText(attributedString: attributedString)
|
||||||
.previewBubble()
|
.bubbleBackground()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FormattedBodyText(attributedString: AttributedString("Some plain text wrapped in an AttributedString."))
|
FormattedBodyText(attributedString: AttributedString("Some plain text wrapped in an AttributedString."))
|
||||||
.previewBubble()
|
.bubbleBackground()
|
||||||
FormattedBodyText(text: "Some plain text that's not an attributed component.")
|
FormattedBodyText(text: "Some plain text that's not an attributed component.")
|
||||||
.previewBubble()
|
.bubbleBackground()
|
||||||
FormattedBodyText(text: "Some plain text that's not an attributed component. This one is really long.")
|
FormattedBodyText(text: "Some plain text that's not an attributed component. This one is really long.")
|
||||||
.previewBubble()
|
.bubbleBackground()
|
||||||
|
|
||||||
FormattedBodyText(text: "❤️", boostEmojiSize: true)
|
FormattedBodyText(text: "❤️", boostEmojiSize: true)
|
||||||
.previewBubble()
|
.bubbleBackground()
|
||||||
}
|
}
|
||||||
.padding()
|
.padding()
|
||||||
}
|
}
|
||||||
@ -208,19 +208,3 @@ struct FormattedBodyText_Previews: PreviewProvider, TestablePreview {
|
|||||||
.snapshotPreferences(delay: 0.25)
|
.snapshotPreferences(delay: 0.25)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private struct PreviewBubbleModifier: ViewModifier {
|
|
||||||
func body(content: Content) -> some View {
|
|
||||||
content
|
|
||||||
.padding(8)
|
|
||||||
.background(Color.compound._bgBubbleOutgoing)
|
|
||||||
.cornerRadius(12)
|
|
||||||
.environmentObject(TimelineViewModel.mock.context)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private extension View {
|
|
||||||
func previewBubble() -> some View {
|
|
||||||
modifier(PreviewBubbleModifier())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user