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