Skip to content

Commit db3a362

Browse files
Made some ChannelList parameters optional
1 parent 36947ff commit db3a362

File tree

8 files changed

+44
-17
lines changed

8 files changed

+44
-17
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
66
### ✅ Added
77
- Add message preview with attachments in channel list
88

9+
### 🐞 Fixed
10+
- Made some `ChannelList` parameters optional
11+
912
# [4.39.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.39.0)
1013
_October 06, 2023_
1114

Sources/StreamChatSwiftUI/ChatChannel/ChannelHeader/ChatChannelHeaderViewModifier.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public struct DefaultChatChannelHeader: ToolbarContent {
9393

9494
/// The default header modifier.
9595
public struct DefaultChannelHeaderModifier: ChatChannelHeaderViewModifier {
96-
@StateObject private var channelHeaderLoader = ChannelHeaderLoader()
96+
@ObservedObject private var channelHeaderLoader = InjectedValues[\.utils].channelHeaderLoader
9797
@State private var isActive: Bool = false
9898

9999
public var channel: ChatChannel

Sources/StreamChatSwiftUI/ChatChannelList/ChannelHeaderLoader.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ open class ChannelHeaderLoader: ObservableObject {
3636
willSet {
3737
if !scheduledUpdate {
3838
scheduledUpdate = true
39-
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
39+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
4040
self?.objectWillChange.send()
4141
self?.scheduledUpdate = false
4242
}

Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelList.swift

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import SwiftUI
1010
public struct ChannelList<Factory: ViewFactory>: View {
1111

1212
@Injected(\.colors) private var colors
13-
13+
1414
private var factory: Factory
1515
var channels: LazyCachedMapCollection<ChatChannel>
1616
@Binding var selectedChannel: ChannelSelectionInfo?
@@ -32,24 +32,41 @@ public struct ChannelList<Factory: ViewFactory>: View {
3232
selectedChannel: Binding<ChannelSelectionInfo?>,
3333
swipedChannelId: Binding<String?>,
3434
scrollable: Bool = true,
35-
onlineIndicatorShown: @escaping (ChatChannel) -> Bool,
36-
imageLoader: @escaping (ChatChannel) -> UIImage,
35+
onlineIndicatorShown: ((ChatChannel) -> Bool)? = nil,
36+
imageLoader: ((ChatChannel) -> UIImage)? = nil,
3737
onItemTap: @escaping (ChatChannel) -> Void,
3838
onItemAppear: @escaping (Int) -> Void,
39-
channelNaming: @escaping (ChatChannel) -> String,
39+
channelNaming: ((ChatChannel) -> String)? = nil,
4040
channelDestination: @escaping (ChannelSelectionInfo) -> Factory.ChannelDestination,
41-
trailingSwipeRightButtonTapped: @escaping (ChatChannel) -> Void,
42-
trailingSwipeLeftButtonTapped: @escaping (ChatChannel) -> Void,
43-
leadingSwipeButtonTapped: @escaping (ChatChannel) -> Void
41+
trailingSwipeRightButtonTapped: @escaping (ChatChannel) -> Void = { _ in },
42+
trailingSwipeLeftButtonTapped: @escaping (ChatChannel) -> Void = { _ in },
43+
leadingSwipeButtonTapped: @escaping (ChatChannel) -> Void = { _ in }
4444
) {
4545
self.factory = factory
4646
self.channels = channels
4747
self.onItemTap = onItemTap
4848
self.onItemAppear = onItemAppear
49-
self.channelNaming = channelNaming
49+
if let channelNaming = channelNaming {
50+
self.channelNaming = channelNaming
51+
} else {
52+
let channelNamer = InjectedValues[\.utils].channelNamer
53+
self.channelNaming = { channel in
54+
channelNamer(channel, InjectedValues[\.chatClient].currentUserId) ?? ""
55+
}
56+
}
5057
self.channelDestination = channelDestination
51-
self.imageLoader = imageLoader
52-
self.onlineIndicatorShown = onlineIndicatorShown
58+
if let imageLoader = imageLoader {
59+
self.imageLoader = imageLoader
60+
} else {
61+
self.imageLoader = InjectedValues[\.utils].channelHeaderLoader.image(for:)
62+
}
63+
if let onlineIndicatorShown = onlineIndicatorShown {
64+
self.onlineIndicatorShown = onlineIndicatorShown
65+
} else {
66+
self.onlineIndicatorShown = { channel in
67+
channel.shouldShowOnlineIndicator
68+
}
69+
}
5370
self.trailingSwipeRightButtonTapped = trailingSwipeRightButtonTapped
5471
self.trailingSwipeLeftButtonTapped = trailingSwipeLeftButtonTapped
5572
self.leadingSwipeButtonTapped = leadingSwipeButtonTapped

Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListItem.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,13 @@ extension ChatChannel {
230230
currentUserId: InjectedValues[\.chatClient].currentUserId
231231
).isEmpty && config.typingEventsEnabled
232232
}
233+
234+
public var shouldShowOnlineIndicator: Bool {
235+
!lastActiveMembers.filter { member in
236+
member.isOnline && member.id != InjectedValues[\.chatClient].currentUserId
237+
}
238+
.isEmpty
239+
}
233240

234241
public var subtitleText: String {
235242
if isMuted {

Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ public struct ChatChannelListContentView<Factory: ViewFactory>: View {
176176

177177
private var viewFactory: Factory
178178
@ObservedObject private var viewModel: ChatChannelListViewModel
179-
@StateObject private var channelHeaderLoader = ChannelHeaderLoader()
179+
@ObservedObject private var channelHeaderLoader = InjectedValues[\.utils].channelHeaderLoader
180180
private var onItemTap: (ChatChannel) -> Void
181181

182182
public init(

Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListViewModel.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,7 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
181181
/// - Parameter channel: the provided channel.
182182
/// - Returns: Boolean whether the indicator is shown.
183183
public func onlineIndicatorShown(for channel: ChatChannel) -> Bool {
184-
!channel.lastActiveMembers.filter { member in
185-
member.isOnline && member.id != chatClient.currentUserId
186-
}
187-
.isEmpty
184+
channel.shouldShowOnlineIndicator
188185
}
189186

190187
public func onDeleteTapped(channel: ChatChannel) {

Sources/StreamChatSwiftUI/Utils.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class Utils {
2626
public var snapshotCreator: SnapshotCreator
2727
public var messageIdBuilder: MessageIdBuilder
2828
public var sortReactions: (MessageReactionType, MessageReactionType) -> Bool
29+
public var channelHeaderLoader: ChannelHeaderLoader
2930

3031
var messageCachingUtils = MessageCachingUtils()
3132
var messageListDateUtils: MessageListDateUtils
@@ -48,6 +49,7 @@ public class Utils {
4849
chatUserNamer: ChatUserNamer = DefaultChatUserNamer(),
4950
snapshotCreator: SnapshotCreator = DefaultSnapshotCreator(),
5051
messageIdBuilder: MessageIdBuilder = DefaultMessageIdBuilder(),
52+
channelHeaderLoader: ChannelHeaderLoader = ChannelHeaderLoader(),
5153
sortReactions: @escaping (MessageReactionType, MessageReactionType) -> Bool = Utils.defaultSortReactions,
5254
shouldSyncChannelControllerOnAppear: @escaping (ChatChannelController) -> Bool = { _ in true }
5355
) {
@@ -69,6 +71,7 @@ public class Utils {
6971
self.messageIdBuilder = messageIdBuilder
7072
self.shouldSyncChannelControllerOnAppear = shouldSyncChannelControllerOnAppear
7173
self.sortReactions = sortReactions
74+
self.channelHeaderLoader = channelHeaderLoader
7275
messageListDateUtils = MessageListDateUtils(messageListConfig: messageListConfig)
7376
}
7477

0 commit comments

Comments
 (0)