Skip to content

Commit 1d3ccf8

Browse files
Added support for custom reactions sorting
1 parent 60b9c87 commit 1d3ccf8

File tree

6 files changed

+72
-7
lines changed

6 files changed

+72
-7
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
33

44
# Upcoming
55

6-
### 🔄 Changed
6+
### ✅ Added
7+
- Possibility to customize message reactions top padding (for grid-based reaction containers)
8+
- Custom sorting of reactions
79

810
# [4.26.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.26.0)
911
_January 16, 2023_

Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayContainer.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import StreamChat
66
import SwiftUI
77

88
struct ReactionsOverlayContainer: View {
9+
@Injected(\.utils) private var utils
910
@Injected(\.colors) private var colors
1011
@Injected(\.images) private var images
1112

@@ -48,9 +49,7 @@ struct ReactionsOverlayContainer: View {
4849
private var reactions: [MessageReactionType] {
4950
images.availableReactions.keys
5051
.map { $0 }
51-
.sorted(by: { lhs, rhs in
52-
lhs.rawValue < rhs.rawValue
53-
})
52+
.sorted(by: utils.sortReactions)
5453
}
5554

5655
private var reactionsSize: CGFloat {

Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsView.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import StreamChat
66
import SwiftUI
77

88
struct ReactionsContainer: View {
9+
@Injected(\.utils) var utils
910
let message: ChatMessage
1011
var useLargeIcons = false
1112
var onTapGesture: () -> Void
@@ -43,9 +44,7 @@ struct ReactionsContainer: View {
4344
message.reactionScores.keys.filter { reactionType in
4445
(message.reactionScores[reactionType] ?? 0) > 0
4546
}
46-
.sorted(by: { lhs, rhs in
47-
lhs.rawValue < rhs.rawValue
48-
})
47+
.sorted(by: utils.sortReactions)
4948
}
5049

5150
private var reactionsSize: CGFloat {

Sources/StreamChatSwiftUI/Utils.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class Utils {
2525
public var shouldSyncChannelControllerOnAppear: (ChatChannelController) -> Bool
2626
public var snapshotCreator: SnapshotCreator
2727
public var messageIdBuilder: MessageIdBuilder
28+
public var sortReactions: (MessageReactionType, MessageReactionType) -> Bool
2829

2930
var messageCachingUtils = MessageCachingUtils()
3031
var messageListDateUtils: MessageListDateUtils
@@ -47,6 +48,7 @@ public class Utils {
4748
chatUserNamer: ChatUserNamer = DefaultChatUserNamer(),
4849
snapshotCreator: SnapshotCreator = DefaultSnapshotCreator(),
4950
messageIdBuilder: MessageIdBuilder = DefaultMessageIdBuilder(),
51+
sortReactions: @escaping (MessageReactionType, MessageReactionType) -> Bool = Utils.defaultSortReactions,
5052
shouldSyncChannelControllerOnAppear: @escaping (ChatChannelController) -> Bool = { _ in true }
5153
) {
5254
self.dateFormatter = dateFormatter
@@ -66,6 +68,11 @@ public class Utils {
6668
self.snapshotCreator = snapshotCreator
6769
self.messageIdBuilder = messageIdBuilder
6870
self.shouldSyncChannelControllerOnAppear = shouldSyncChannelControllerOnAppear
71+
self.sortReactions = sortReactions
6972
messageListDateUtils = MessageListDateUtils(messageListConfig: messageListConfig)
7073
}
74+
75+
public static var defaultSortReactions: (MessageReactionType, MessageReactionType) -> Bool {
76+
{ $0.rawValue < $1.rawValue }
77+
}
7178
}

StreamChatSwiftUI.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@
316316
84E04797284A444E00BAFA17 /* WebSocketPingControllerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847BA08627E0BACB00ED20C7 /* WebSocketPingControllerMock.swift */; };
317317
84E04798284A444E00BAFA17 /* InternetConnectionMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C94D23275794D3007FE2B9 /* InternetConnectionMock.swift */; };
318318
84E1D8262976B3F100060491 /* MessageViewMultiRowReactions_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E1D8252976B3F100060491 /* MessageViewMultiRowReactions_Tests.swift */; };
319+
84E1D8282976CCB000060491 /* SortReactions_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E1D8272976CCAF00060491 /* SortReactions_Tests.swift */; };
319320
84E4F7CF294C69F300DD4CE3 /* MessageIdBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4F7CE294C69F200DD4CE3 /* MessageIdBuilder.swift */; };
320321
84E57C5928103822002213C1 /* TestDataModel2.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 84E57C5328103822002213C1 /* TestDataModel2.xcdatamodeld */; };
321322
84E57C5B28103822002213C1 /* TestDataModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 84E57C5728103822002213C1 /* TestDataModel.xcdatamodeld */; };
@@ -723,6 +724,7 @@
723724
84DEC8E92761089A00172876 /* MessageThreadHeaderViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageThreadHeaderViewModifier.swift; sourceTree = "<group>"; };
724725
84DEC8EB27611CAE00172876 /* SendInChannelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendInChannelView.swift; sourceTree = "<group>"; };
725726
84E1D8252976B3F100060491 /* MessageViewMultiRowReactions_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageViewMultiRowReactions_Tests.swift; sourceTree = "<group>"; };
727+
84E1D8272976CCAF00060491 /* SortReactions_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SortReactions_Tests.swift; sourceTree = "<group>"; };
726728
84E4F7CE294C69F200DD4CE3 /* MessageIdBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageIdBuilder.swift; sourceTree = "<group>"; };
727729
84E57C46281037B2002213C1 /* AssertJSONEqual.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertJSONEqual.swift; sourceTree = "<group>"; };
728730
84E57C47281037B2002213C1 /* AssertResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertResult.swift; sourceTree = "<group>"; };
@@ -1476,6 +1478,7 @@
14761478
84C94D5F275A45D2007FE2B9 /* ViewFactory_Tests.swift */,
14771479
84C94D61275A5BB7007FE2B9 /* ChatChannelNamer_Tests.swift */,
14781480
91B79FD8284E7E9C005B6E4F /* ChatUserNamer_Tests.swift */,
1481+
84E1D8272976CCAF00060491 /* SortReactions_Tests.swift */,
14791482
);
14801483
path = Utils;
14811484
sourceTree = "<group>";
@@ -2047,6 +2050,7 @@
20472050
84C94D442757C704007FE2B9 /* MoreChannelActionsViewModel_Tests.swift in Sources */,
20482051
84C94D5127591DE2007FE2B9 /* ChatMessageIDs_Tests.swift in Sources */,
20492052
84F73F8728699FD7006A39C3 /* InstantCommandsView_Tests.swift in Sources */,
2053+
84E1D8282976CCB000060491 /* SortReactions_Tests.swift in Sources */,
20502054
847305BD28243D25004AC770 /* WebView_Tests.swift in Sources */,
20512055
84E04789284A444E00BAFA17 /* AnyEndpoint.swift in Sources */,
20522056
84E57C5928103822002213C1 /* TestDataModel2.xcdatamodeld in Sources */,
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//
2+
// Copyright © 2023 Stream.io Inc. All rights reserved.
3+
//
4+
5+
import StreamChat
6+
@testable import StreamChatSwiftUI
7+
import XCTest
8+
9+
final class SortReactions_Tests: StreamChatTestCase {
10+
11+
@Injected(\.utils) var utils
12+
@Injected(\.images) var images
13+
14+
func test_utils_defaultSorting() {
15+
// Given
16+
let reactions = images.availableReactions.keys
17+
.map { $0 }
18+
let expected: [MessageReactionType] = [
19+
.init(rawValue: "haha"),
20+
.init(rawValue: "like"),
21+
.init(rawValue: "love"),
22+
.init(rawValue: "sad"),
23+
.init(rawValue: "wow")
24+
]
25+
26+
// When
27+
let sorted = reactions.sorted(by: utils.sortReactions)
28+
29+
// Then
30+
XCTAssert(sorted == expected)
31+
}
32+
33+
func test_utils_customSorting() {
34+
// Given
35+
let reactions = images.availableReactions.keys
36+
.map { $0 }
37+
let expected: [MessageReactionType] = [
38+
.init(rawValue: "wow"),
39+
.init(rawValue: "sad"),
40+
.init(rawValue: "love"),
41+
.init(rawValue: "like"),
42+
.init(rawValue: "haha")
43+
]
44+
utils.sortReactions = { lhs, rhs in
45+
lhs.rawValue > rhs.rawValue
46+
}
47+
48+
// When
49+
let sorted = reactions.sorted(by: utils.sortReactions)
50+
51+
// Then
52+
XCTAssert(sorted == expected)
53+
}
54+
}

0 commit comments

Comments
 (0)