@@ -31,6 +31,7 @@ extension SizingCell {
3131 }
3232}
3333
34+ // swiftlint:disable type_body_length file_length
3435final class MessagesViewController : RocketChatViewController {
3536
3637 @objc override var bottomHeight : CGFloat {
@@ -46,7 +47,6 @@ final class MessagesViewController: RocketChatViewController {
4647 let viewSizingModel = MessagesSizingManager ( )
4748 let composerViewModel = MessagesComposerViewModel ( )
4849
49- // TODO: Move to another view model
5050 let socketHandlerToken = String . random ( 5 )
5151
5252 var chatTitleView : ChatTitleView ? {
@@ -137,54 +137,10 @@ final class MessagesViewController: RocketChatViewController {
137137
138138 registerCells ( )
139139 setupScrollToBottom ( )
140+ setupKeyboardNotifications ( )
140141 setupAnnouncementBanner ( )
141- NotificationCenter . default. addObserver (
142- self ,
143- selector: #selector( keyboardWillShow ( _: ) ) ,
144- name: UIResponder . keyboardWillShowNotification,
145- object: nil
146- )
147-
148- NotificationCenter . default. addObserver (
149- self ,
150- selector: #selector( keyboardWillHide ( _: ) ) ,
151- name: UIResponder . keyboardWillHideNotification,
152- object: nil
153- )
154-
155- dataUpdateDelegate = self
156- viewModel. controllerContext = self
157- viewModel. onDataChanged = { [ weak self] in
158- guard let self = self else { return }
159- Log . debug ( " [VIEW MODEL] dataChanged with \( self . viewModel. dataNormalized. count) values. " )
160-
161- if self . viewModel. dataNormalized. first? . model. differenceIdentifier == AnyHashable ( HeaderChatItem . globalIdentifier) {
162- self . isInverted = false
163- } else {
164- self . isInverted = true
165- }
166-
167- // Update dataset with the new data normalized
168- self . updateData ( with: self . viewModel. dataNormalized)
169- self . markAsRead ( )
170- }
171-
172- viewSubscriptionModel. onDataChanged = { [ weak self] in
173- guard let self = self else { return }
174- self . chatTitleView? . subscription = self . viewSubscriptionModel. subscription
175- self . updateJoinedView ( )
176-
177- if self . viewSubscriptionModel. subscription? . managedObject == nil {
178- self . navigationController? . popToRootViewController ( animated: true )
179- self . subscription = nil
180- }
181- }
182-
183- viewSubscriptionModel. onTypingChanged = { [ weak self] usernames in
184- DispatchQueue . main. async {
185- self ? . chatTitleView? . updateTypingStatus ( usernames: usernames)
186- }
187- }
142+ setupSubscriptionViewModel ( )
143+ setupMessagesViewModel ( )
188144
189145 composerViewModel. getRecentSenders = { [ weak self] in
190146 guard let self = self else {
@@ -248,6 +204,68 @@ final class MessagesViewController: RocketChatViewController {
248204 }
249205 }
250206
207+ // MARK: Notifications
208+
209+ private func setupKeyboardNotifications( ) {
210+ NotificationCenter . default. addObserver (
211+ self ,
212+ selector: #selector( keyboardWillShow ( _: ) ) ,
213+ name: UIResponder . keyboardWillShowNotification,
214+ object: nil
215+ )
216+
217+ NotificationCenter . default. addObserver (
218+ self ,
219+ selector: #selector( keyboardWillHide ( _: ) ) ,
220+ name: UIResponder . keyboardWillHideNotification,
221+ object: nil
222+ )
223+ }
224+
225+ // MARK: View Models
226+
227+ private func setupSubscriptionViewModel( ) {
228+ viewSubscriptionModel. onTypingChanged = { [ weak self] usernames in
229+ DispatchQueue . main. async {
230+ self ? . chatTitleView? . updateTypingStatus ( usernames: usernames)
231+ }
232+ }
233+
234+ viewSubscriptionModel. onDataChanged = { [ weak self] in
235+ guard let self = self else { return }
236+ self . chatTitleView? . subscription = self . viewSubscriptionModel. subscription
237+ self . updateJoinedView ( )
238+
239+ if self . viewSubscriptionModel. subscription? . managedObject == nil {
240+ self . navigationController? . popToRootViewController ( animated: true )
241+ self . subscription = nil
242+ }
243+ }
244+ }
245+
246+ private func setupMessagesViewModel( ) {
247+ dataUpdateDelegate = self
248+ viewModel. controllerContext = self
249+ viewModel. onDataChanged = { [ weak self] in
250+ guard let self = self else { return }
251+ Log . debug ( " [VIEW MODEL] dataChanged with \( self . viewModel. dataNormalized. count) values. " )
252+
253+ // If first item is the header (list is empty) then we don't use the inverted mode
254+ // because we want the header to appear in the bottom.
255+ let first = self . viewModel. dataNormalized. first
256+ if first? . model. differenceIdentifier == AnyHashable ( HeaderChatItem . globalIdentifier) {
257+ self . isInverted = false
258+ } else {
259+ self . isInverted = true
260+ }
261+
262+ // Update dataset with the new data normalized
263+ self . updateData ( with: self . viewModel. dataNormalized)
264+ self . markAsRead ( )
265+ }
266+
267+ }
268+
251269 // MARK: Cells
252270
253271 private func registerCells( ) {
0 commit comments