Simplify how we build bubbles for previewing purposes, make use of the new bubbleBackground modifier.

This commit is contained in:
Stefan Ceriu 2024-12-13 15:38:23 +02:00 committed by Stefan Ceriu
parent 681daf50ea
commit c97dcc18f2
7 changed files with 15 additions and 44 deletions

View File

@ -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)
} }
} }

View File

@ -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)
} }
} }

View File

@ -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)
} }
} }

View File

@ -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))
}
} }
} }

View File

@ -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 */ }
} }

View File

@ -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))

View File

@ -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())
}
}