Skip to content

Commit fe7f6bb

Browse files
Added additional content view for the channel list
1 parent da4b616 commit fe7f6bb

File tree

1 file changed

+72
-44
lines changed

1 file changed

+72
-44
lines changed

Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListView.swift

Lines changed: 72 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,11 @@ public struct ChatChannelListView<Factory: ViewFactory>: View {
1111
@Injected(\.colors) private var colors
1212

1313
@StateObject private var viewModel: ChatChannelListViewModel
14-
@StateObject private var channelHeaderLoader = ChannelHeaderLoader()
1514
@State private var tabBar: UITabBar?
1615

1716
private let viewFactory: Factory
1817
private let title: String
1918
private var onItemTap: (ChatChannel) -> Void
20-
private var channelDestination: (ChannelSelectionInfo) -> Factory.ChannelDestination
2119

2220
public init(
2321
viewFactory: Factory,
@@ -43,8 +41,6 @@ public struct ChatChannelListView<Factory: ViewFactory>: View {
4341
channelListVM.selectedChannel = channel.channelSelectionInfo
4442
}
4543
}
46-
47-
channelDestination = viewFactory.makeChannelDestination()
4844
}
4945

5046
public var body: some View {
@@ -58,48 +54,14 @@ public struct ChatChannelListView<Factory: ViewFactory>: View {
5854
ZStack {
5955
ChannelDeepLink(
6056
deeplinkChannel: $viewModel.deeplinkChannel,
61-
channelDestination: channelDestination
57+
channelDestination: viewFactory.makeChannelDestination()
6258
)
6359

64-
VStack {
65-
viewFactory.makeChannelListTopView(
66-
searchText: $viewModel.searchText
67-
)
68-
69-
if viewModel.isSearching {
70-
SearchResultsView(
71-
factory: viewFactory,
72-
selectedChannel: $viewModel.selectedChannel,
73-
searchResults: viewModel.searchResults,
74-
loadingSearchResults: viewModel.loadingSearchResults,
75-
onlineIndicatorShown: viewModel.onlineIndicatorShown(for:),
76-
channelNaming: viewModel.name(forChannel:),
77-
imageLoader: channelHeaderLoader.image(for:),
78-
onSearchResultTap: { searchResult in
79-
viewModel.selectedChannel = searchResult
80-
},
81-
onItemAppear: viewModel.loadAdditionalSearchResults(index:)
82-
)
83-
} else {
84-
ChannelList(
85-
factory: viewFactory,
86-
channels: viewModel.channels,
87-
selectedChannel: $viewModel.selectedChannel,
88-
swipedChannelId: $viewModel.swipedChannelId,
89-
onlineIndicatorShown: viewModel.onlineIndicatorShown(for:),
90-
imageLoader: channelHeaderLoader.image(for:),
91-
onItemTap: onItemTap,
92-
onItemAppear: viewModel.checkForChannels(index:),
93-
channelNaming: viewModel.name(forChannel:),
94-
channelDestination: channelDestination,
95-
trailingSwipeRightButtonTapped: viewModel.onDeleteTapped(channel:),
96-
trailingSwipeLeftButtonTapped: viewModel.onMoreTapped(channel:),
97-
leadingSwipeButtonTapped: { _ in }
98-
)
99-
}
100-
101-
viewFactory.makeChannelListStickyFooterView()
102-
}
60+
ChatChannelListContentView(
61+
viewFactory: viewFactory,
62+
viewModel: viewModel,
63+
onItemTap: onItemTap
64+
)
10365
}
10466
}
10567
}
@@ -189,3 +151,69 @@ extension ChatChannelListView where Factory == DefaultViewFactory {
189151
self.init(viewFactory: DefaultViewFactory.shared)
190152
}
191153
}
154+
155+
public struct ChatChannelListContentView<Factory: ViewFactory>: View {
156+
157+
private var viewFactory: Factory
158+
@ObservedObject private var viewModel: ChatChannelListViewModel
159+
@StateObject private var channelHeaderLoader = ChannelHeaderLoader()
160+
private var onItemTap: (ChatChannel) -> Void
161+
162+
public init(
163+
viewFactory: Factory,
164+
viewModel: ChatChannelListViewModel,
165+
onItemTap: ((ChatChannel) -> Void)? = nil
166+
) {
167+
self.viewFactory = viewFactory
168+
self.viewModel = viewModel
169+
if let onItemTap = onItemTap {
170+
self.onItemTap = onItemTap
171+
} else {
172+
self.onItemTap = { channel in
173+
viewModel.selectedChannel = channel.channelSelectionInfo
174+
}
175+
}
176+
}
177+
178+
public var body: some View {
179+
VStack {
180+
viewFactory.makeChannelListTopView(
181+
searchText: $viewModel.searchText
182+
)
183+
184+
if viewModel.isSearching {
185+
SearchResultsView(
186+
factory: viewFactory,
187+
selectedChannel: $viewModel.selectedChannel,
188+
searchResults: viewModel.searchResults,
189+
loadingSearchResults: viewModel.loadingSearchResults,
190+
onlineIndicatorShown: viewModel.onlineIndicatorShown(for:),
191+
channelNaming: viewModel.name(forChannel:),
192+
imageLoader: channelHeaderLoader.image(for:),
193+
onSearchResultTap: { searchResult in
194+
viewModel.selectedChannel = searchResult
195+
},
196+
onItemAppear: viewModel.loadAdditionalSearchResults(index:)
197+
)
198+
} else {
199+
ChannelList(
200+
factory: viewFactory,
201+
channels: viewModel.channels,
202+
selectedChannel: $viewModel.selectedChannel,
203+
swipedChannelId: $viewModel.swipedChannelId,
204+
onlineIndicatorShown: viewModel.onlineIndicatorShown(for:),
205+
imageLoader: channelHeaderLoader.image(for:),
206+
onItemTap: onItemTap,
207+
onItemAppear: viewModel.checkForChannels(index:),
208+
channelNaming: viewModel.name(forChannel:),
209+
channelDestination: viewFactory.makeChannelDestination(),
210+
trailingSwipeRightButtonTapped: viewModel.onDeleteTapped(channel:),
211+
trailingSwipeLeftButtonTapped: viewModel.onMoreTapped(channel:),
212+
leadingSwipeButtonTapped: { _ in }
213+
)
214+
}
215+
216+
viewFactory.makeChannelListStickyFooterView()
217+
}
218+
}
219+
}

0 commit comments

Comments
 (0)