Skip to content

Commit 10bbb0f

Browse files
Moved bubble related methods as ChatMessage extension
1 parent 94231a6 commit 10bbb0f

File tree

3 files changed

+162
-30
lines changed

3 files changed

+162
-30
lines changed

Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageBubble.swift

Lines changed: 49 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -63,42 +63,20 @@ public struct MessageBubbleModifier: ViewModifier {
6363
content
6464
.modifier(
6565
BubbleModifier(
66-
corners: corners,
67-
backgroundColors: background,
66+
corners: message.bubbleCorners(
67+
isFirst: isFirst,
68+
forceLeftToRight: forceLeftToRight
69+
),
70+
backgroundColors: message.bubbleBackground(
71+
colors: colors,
72+
injectedBackgroundColor: injectedBackgroundColor
73+
),
6874
cornerRadius: cornerRadius
6975
)
7076
)
7177
.padding(.top, topPadding)
7278
.padding(.bottom, bottomPadding)
7379
}
74-
75-
private var corners: UIRectCorner {
76-
if !isFirst {
77-
return [.topLeft, .topRight, .bottomLeft, .bottomRight]
78-
}
79-
80-
if message.isSentByCurrentUser && !forceLeftToRight {
81-
return [.topLeft, .topRight, .bottomLeft]
82-
} else {
83-
return [.topLeft, .topRight, .bottomRight]
84-
}
85-
}
86-
87-
private var background: [Color] {
88-
if let injectedBackgroundColor = injectedBackgroundColor {
89-
return [Color(injectedBackgroundColor)]
90-
}
91-
var colors = colors
92-
if message.isSentByCurrentUser {
93-
if message.type == .ephemeral {
94-
return colors.messageCurrentUserEmphemeralBackground.map { Color($0) }
95-
} else {
96-
return colors.messageCurrentUserBackground.map { Color($0) }
97-
}
98-
} else {
99-
return colors.messageOtherUserBackground.map { Color($0) }
100-
}
101-
}
10280
}
10381

10482
/// Modifier that enables bubble container.
@@ -212,3 +190,44 @@ extension View {
212190
)
213191
}
214192
}
193+
194+
extension ChatMessage {
195+
196+
/// Returns the default corners that will be rounded by the message bubble modifier.
197+
/// - Parameters:
198+
/// - isFirst: whether the message is first.
199+
/// - forceLeftToRight: whether left to right should be forced.
200+
/// - Returns: the corners to be rounded in the message cell.
201+
public func bubbleCorners(isFirst: Bool, forceLeftToRight: Bool) -> UIRectCorner {
202+
if !isFirst {
203+
return [.topLeft, .topRight, .bottomLeft, .bottomRight]
204+
}
205+
206+
if isSentByCurrentUser && !forceLeftToRight {
207+
return [.topLeft, .topRight, .bottomLeft]
208+
} else {
209+
return [.topLeft, .topRight, .bottomRight]
210+
}
211+
}
212+
213+
/// Returns the bubble background(s) for a given message.
214+
/// - Parameters:
215+
/// - colors: The color pallete.
216+
/// - injectedBackgroundColor: If you need a custom background color injected.
217+
/// - Returns: The background colors (can be many for gradients) for the message cell.
218+
public func bubbleBackground(colors: ColorPalette, injectedBackgroundColor: UIColor? = nil) -> [Color] {
219+
if let injectedBackgroundColor = injectedBackgroundColor {
220+
return [Color(injectedBackgroundColor)]
221+
}
222+
var colors = colors
223+
if isSentByCurrentUser {
224+
if type == .ephemeral {
225+
return colors.messageCurrentUserEmphemeralBackground.map { Color($0) }
226+
} else {
227+
return colors.messageCurrentUserBackground.map { Color($0) }
228+
}
229+
} else {
230+
return colors.messageOtherUserBackground.map { Color($0) }
231+
}
232+
}
233+
}

StreamChatSwiftUI.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@
276276
84C94D66275A660B007FE2B9 /* MessageActionsViewModel_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C94D65275A660B007FE2B9 /* MessageActionsViewModel_Tests.swift */; };
277277
84C94D68275A6AFD007FE2B9 /* ChannelHeaderLoader_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C94D67275A6AFD007FE2B9 /* ChannelHeaderLoader_Tests.swift */; };
278278
84CAD77B284E5AAA00F28C17 /* MessageListViewLastGroupHeader_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CAD77A284E5AAA00F28C17 /* MessageListViewLastGroupHeader_Tests.swift */; };
279+
84D419BA28EAD20C00F574F9 /* ChatMessageBubbles_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D419B928EAD20C00F574F9 /* ChatMessageBubbles_Tests.swift */; };
279280
84D6B55A27DF6EC7009C6D07 /* LoadingView_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D6B55927DF6EC7009C6D07 /* LoadingView_Tests.swift */; };
280281
84D77B58289D3CF800C241CE /* MessageListViewAvatars_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D77B57289D3CF800C241CE /* MessageListViewAvatars_Tests.swift */; };
281282
84DA1C282837B73D000E4B6A /* MessageListPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DA1C272837B73D000E4B6A /* MessageListPage.swift */; };
@@ -685,6 +686,7 @@
685686
84C94D65275A660B007FE2B9 /* MessageActionsViewModel_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageActionsViewModel_Tests.swift; sourceTree = "<group>"; };
686687
84C94D67275A6AFD007FE2B9 /* ChannelHeaderLoader_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelHeaderLoader_Tests.swift; sourceTree = "<group>"; };
687688
84CAD77A284E5AAA00F28C17 /* MessageListViewLastGroupHeader_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageListViewLastGroupHeader_Tests.swift; sourceTree = "<group>"; };
689+
84D419B928EAD20C00F574F9 /* ChatMessageBubbles_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageBubbles_Tests.swift; sourceTree = "<group>"; };
688690
84D6B55927DF6EC7009C6D07 /* LoadingView_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView_Tests.swift; sourceTree = "<group>"; };
689691
84D77B57289D3CF800C241CE /* MessageListViewAvatars_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageListViewAvatars_Tests.swift; sourceTree = "<group>"; };
690692
84DA1C272837B73D000E4B6A /* MessageListPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageListPage.swift; sourceTree = "<group>"; };
@@ -1415,6 +1417,7 @@
14151417
84CAD77A284E5AAA00F28C17 /* MessageListViewLastGroupHeader_Tests.swift */,
14161418
844D1D672851DE58000CCCB9 /* ChannelControllerFactory_Tests.swift */,
14171419
842F036C288E93BF00496D49 /* ChatMessage_AdjustedText_Tests.swift */,
1420+
84D419B928EAD20C00F574F9 /* ChatMessageBubbles_Tests.swift */,
14181421
);
14191422
path = ChatChannel;
14201423
sourceTree = "<group>";
@@ -2047,6 +2050,7 @@
20472050
84E04798284A444E00BAFA17 /* InternetConnectionMock.swift in Sources */,
20482051
8413D90227A9654600A89432 /* SearchResultsView_Tests.swift in Sources */,
20492052
84C94D1527578BF3007FE2B9 /* TestDispatchQueue.swift in Sources */,
2053+
84D419BA28EAD20C00F574F9 /* ChatMessageBubbles_Tests.swift in Sources */,
20502054
84C2042327917B6A0024D616 /* MessageListView_Tests.swift in Sources */,
20512055
84C94D66275A660B007FE2B9 /* MessageActionsViewModel_Tests.swift in Sources */,
20522056
84C94D0827578BF2007FE2B9 /* MockFunc.swift in Sources */,
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
//
2+
// Copyright © 2022 Stream.io Inc. All rights reserved.
3+
//
4+
5+
@testable import StreamChat
6+
@testable import StreamChatSwiftUI
7+
import SwiftUI
8+
import XCTest
9+
10+
final class ChatMessageBubbles_Tests: StreamChatTestCase {
11+
12+
@Injected(\.colors) var colors
13+
14+
func test_messageBubbleCorners_notFirst() {
15+
// Given
16+
let message = ChatMessage.mock()
17+
let expected: UIRectCorner = [.topLeft, .topRight, .bottomLeft, .bottomRight]
18+
19+
// When
20+
let corners = message.bubbleCorners(isFirst: false, forceLeftToRight: false)
21+
22+
// Then
23+
XCTAssert(corners == expected)
24+
}
25+
26+
func test_messageBubbleCorners_firstCurrentUser() {
27+
// Given
28+
let message = ChatMessage.mock(isSentByCurrentUser: true)
29+
let expected: UIRectCorner = [.topLeft, .topRight, .bottomLeft]
30+
31+
// When
32+
let corners = message.bubbleCorners(isFirst: true, forceLeftToRight: false)
33+
34+
// Then
35+
XCTAssert(corners == expected)
36+
}
37+
38+
func test_messageBubbleCorners_firstOtherUser() {
39+
// Given
40+
let message = ChatMessage.mock(isSentByCurrentUser: false)
41+
let expected: UIRectCorner = [.topLeft, .topRight, .bottomRight]
42+
43+
// When
44+
let corners = message.bubbleCorners(isFirst: true, forceLeftToRight: false)
45+
46+
// Then
47+
XCTAssert(corners == expected)
48+
}
49+
50+
func test_messageBubbleCorners_firstCurrentUserForceLeft() {
51+
// Given
52+
let message = ChatMessage.mock(isSentByCurrentUser: true)
53+
let expected: UIRectCorner = [.topLeft, .topRight, .bottomRight]
54+
55+
// When
56+
let corners = message.bubbleCorners(isFirst: true, forceLeftToRight: true)
57+
58+
// Then
59+
XCTAssert(corners == expected)
60+
}
61+
62+
func test_bubbleBackgrounds_injected() {
63+
// Given
64+
let message = ChatMessage.mock()
65+
let injectedBackground = UIColor.red
66+
67+
// When
68+
let background = message.bubbleBackground(colors: colors, injectedBackgroundColor: injectedBackground)
69+
70+
// Then
71+
XCTAssert(background == [Color(injectedBackground)])
72+
}
73+
74+
func test_bubbleBackgrounds_currentUserRegular() {
75+
// Given
76+
let message = ChatMessage.mock(isSentByCurrentUser: true)
77+
let expected = colors.messageCurrentUserBackground.map { Color($0) }
78+
79+
// When
80+
let background = message.bubbleBackground(colors: colors)
81+
82+
// Then
83+
XCTAssert(background == expected)
84+
}
85+
86+
func test_bubbleBackgrounds_currentUserEphemeral() {
87+
// Given
88+
let message = ChatMessage.mock(type: MessageType.ephemeral, isSentByCurrentUser: true)
89+
let expected = colors.messageCurrentUserEmphemeralBackground.map { Color($0) }
90+
91+
// When
92+
let background = message.bubbleBackground(colors: colors)
93+
94+
// Then
95+
XCTAssert(background == expected)
96+
}
97+
98+
func test_bubbleBackgrounds_otherUser() {
99+
// Given
100+
let message = ChatMessage.mock(isSentByCurrentUser: false)
101+
let expected = colors.messageOtherUserBackground.map { Color($0) }
102+
103+
// When
104+
let background = message.bubbleBackground(colors: colors)
105+
106+
// Then
107+
XCTAssert(background == expected)
108+
}
109+
}

0 commit comments

Comments
 (0)