@@ -11,13 +11,11 @@ public struct ChatChannelListView<Factory: ViewFactory>: View {
11
11
@Injected ( \. colors) private var colors
12
12
13
13
@StateObject private var viewModel : ChatChannelListViewModel
14
- @StateObject private var channelHeaderLoader = ChannelHeaderLoader ( )
15
14
@State private var tabBar : UITabBar ?
16
15
17
16
private let viewFactory : Factory
18
17
private let title : String
19
18
private var onItemTap : ( ChatChannel ) -> Void
20
- private var channelDestination : ( ChannelSelectionInfo ) -> Factory . ChannelDestination
21
19
22
20
public init (
23
21
viewFactory: Factory ,
@@ -43,8 +41,6 @@ public struct ChatChannelListView<Factory: ViewFactory>: View {
43
41
channelListVM. selectedChannel = channel. channelSelectionInfo
44
42
}
45
43
}
46
-
47
- channelDestination = viewFactory. makeChannelDestination ( )
48
44
}
49
45
50
46
public var body : some View {
@@ -58,48 +54,14 @@ public struct ChatChannelListView<Factory: ViewFactory>: View {
58
54
ZStack {
59
55
ChannelDeepLink (
60
56
deeplinkChannel: $viewModel. deeplinkChannel,
61
- channelDestination: channelDestination
57
+ channelDestination: viewFactory . makeChannelDestination ( )
62
58
)
63
59
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
+ )
103
65
}
104
66
}
105
67
}
@@ -189,3 +151,69 @@ extension ChatChannelListView where Factory == DefaultViewFactory {
189
151
self . init ( viewFactory: DefaultViewFactory . shared)
190
152
}
191
153
}
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