@@ -11,6 +11,7 @@ import 'package:unn_mobile/core/misc/date_time_utilities/date_time_extensions.da
1111import 'package:unn_mobile/core/misc/objects_with_pagination.dart' ;
1212import 'package:unn_mobile/core/misc/user/current_user_sync_storage.dart' ;
1313import 'package:unn_mobile/core/models/common/file_data.dart' ;
14+ import 'package:unn_mobile/core/models/dialog/base_dialog_info.dart' ;
1415import 'package:unn_mobile/core/models/dialog/dialog.dart' ;
1516import 'package:unn_mobile/core/models/dialog/message/enum/message_state.dart' ;
1617import 'package:unn_mobile/core/models/dialog/message/message.dart' ;
@@ -25,7 +26,9 @@ class ChatInsideViewModel extends BaseViewModel {
2526
2627 ChatScreenViewModel ? _dialogsViewModel;
2728
28- Dialog ? _dialog;
29+ BaseDialogInfo ? _dialog;
30+
31+ int ? chatId;
2932
3033 bool _hasError = false ;
3134
@@ -55,7 +58,10 @@ class ChatInsideViewModel extends BaseViewModel {
5558 );
5659 int ? get currentUserId => _currentUserSyncStorage.currentUserData? .bitrixId;
5760
58- Dialog ? get dialog => _dialog;
61+ int get unreadMessagesCount =>
62+ (_dialog is Dialog ) ? (_dialog! as Dialog ).unreadMessagesCount : 0 ;
63+
64+ BaseDialogInfo ? get dialog => _dialog;
5965 bool get hasError => _hasError;
6066
6167 bool get hasMessagesAfter => _hasMessagesAfter;
@@ -71,21 +77,38 @@ class ChatInsideViewModel extends BaseViewModel {
7177 notifyListeners ();
7278 }
7379
80+ Future <PaginatedResult <Message >?> getMessagesByDialogId (
81+ String dialogId,
82+ ) async {
83+ final messages =
84+ await _messagesAggregator.fetchByDialogId (dialogId: dialogId);
85+ if (messages == null ) {
86+ return null ;
87+ }
88+ if (messages is PaginatedResultWithChatId <Message >) {
89+ chatId = messages.chatId;
90+ }
91+ return messages;
92+ }
93+
7494 FutureOr <void > getNewMessages () async {
7595 if (_dialog == null ) {
7696 return ;
7797 }
7898
7999 final messages = await tryLoginAndRetrieveData <PaginatedResult <Message >>(
80- () => _messagesAggregator.fetchByChatId (chatId: _dialog! .chatId),
100+ () => chatId == null
101+ ? getMessagesByDialogId (_dialog! .dialogId.stringValue)
102+ : _messagesAggregator.fetchByChatId (chatId: chatId! ),
81103 () => null ,
82104 );
83105 if (messages == null ) {
84106 _hasError = true ;
85107 return ;
86108 }
87- await _readMessages (_dialog! .chatId, messages.items);
88-
109+ if (chatId != null ) {
110+ await _readMessages (chatId! , messages.items);
111+ }
89112 final messagesToRemove = messages.items.length -
90113 messages.items.reversed
91114 .takeWhile (
@@ -97,8 +120,7 @@ class ChatInsideViewModel extends BaseViewModel {
97120 if (refreshLoopRunning && ! refreshLoopStopFlag) {
98121 await _dialogsViewModel! .init ();
99122
100- _dialog = _dialogsViewModel! .dialogs
101- .firstWhere ((d) => d.chatId == _dialog! .chatId);
123+ fetchDialogFromRoot (chatId);
102124
103125 _dialogsViewModel! .notifyListeners ();
104126 }
@@ -114,7 +136,14 @@ class ChatInsideViewModel extends BaseViewModel {
114136 ..addAll (_partitionMessages (_unpartitionedMessages));
115137 }
116138
117- FutureOr <void > init (int chatId) async {
139+ void fetchDialogFromRoot (int ? chatId) {
140+ _dialog = _dialogsViewModel! .dialogs.cast <BaseDialogInfo >().firstWhere (
141+ (d) => d is Dialog && d.chatId == chatId,
142+ orElse: () => _dialogsViewModel! .storedDialogInfo! ,
143+ );
144+ }
145+
146+ FutureOr <void > init (int ? chatId) async {
118147 _isInitializing = true ;
119148 try {
120149 await busyCallAsync (() => _init (chatId));
@@ -135,17 +164,21 @@ class ChatInsideViewModel extends BaseViewModel {
135164 }
136165 final messages =
137166 await tryLoginAndRetrieveData <PaginatedResult <Message >?>(
138- () => _messagesAggregator.fetchByChatId (
139- chatId: _dialog! .chatId,
140- lastMessageId: _unpartitionedMessages.last.messageId,
141- ),
167+ () => chatId == null
168+ ? getMessagesByDialogId (_dialog! .dialogId.stringValue)
169+ : _messagesAggregator.fetchByChatId (
170+ chatId: chatId! ,
171+ lastMessageId: _unpartitionedMessages.last.messageId,
172+ ),
142173 () => null ,
143174 );
144175 if (messages == null ) {
145176 _hasError = true ;
146177 return ;
147178 }
148- await _readMessages (_dialog! .chatId, messages.items);
179+ if (chatId != null ) {
180+ await _readMessages (chatId! , messages.items);
181+ }
149182 _unpartitionedMessages.addAll (messages.items);
150183 _messages
151184 ..clear ()
@@ -167,7 +200,6 @@ class ChatInsideViewModel extends BaseViewModel {
167200 await Future .delayed (const Duration (seconds: 5 ));
168201 if (! _isInitializing) {
169202 await getNewMessages ();
170-
171203 notifyListeners ();
172204 }
173205 await refreshLoop (checkStartConditions: false );
@@ -176,7 +208,7 @@ class ChatInsideViewModel extends BaseViewModel {
176208 FutureOr <bool > sendFiles (Iterable <String > uris, {String ? text}) =>
177209 _sendMessageWrapper <List <FileData >>(
178210 () => _messagesAggregator.sendFiles (
179- chatId: _dialog ! . chatId,
211+ chatId: chatId! ,
180212 files: [for (final uri in uris) File (uri)],
181213 text: text,
182214 ),
@@ -196,26 +228,29 @@ class ChatInsideViewModel extends BaseViewModel {
196228 ),
197229 );
198230
199- FutureOr <void > _init (int chatId) async {
231+ FutureOr <void > _init (int ? chatId) async {
200232 _hasError = false ;
201233 _hasMessagesBefore = false ;
202234 _hasMessagesAfter = false ;
235+ this .chatId = chatId;
203236 _messages.clear ();
204237 _unpartitionedMessages.clear ();
205238 _dialogsViewModel =
206239 _routesViewModelFactory.getViewModelByType <ChatScreenViewModel >();
207- _dialog = _dialogsViewModel! .dialogs.firstWhere ((d) => d.chatId == chatId);
208-
240+ fetchDialogFromRoot (chatId);
209241 final messages = await tryLoginAndRetrieveData <PaginatedResult <Message >>(
210- () => _messagesAggregator.fetchByChatId (chatId: chatId),
242+ () => this .chatId == null
243+ ? getMessagesByDialogId (_dialog! .dialogId.stringValue)
244+ : _messagesAggregator.fetchByChatId (chatId: this .chatId! ),
211245 () => null ,
212246 );
213247 if (messages == null ) {
214248 _hasError = true ;
215249 return ;
216250 }
217- await _readMessages (chatId, messages.items);
218-
251+ if (this .chatId != null ) {
252+ await _readMessages (this .chatId! , messages.items);
253+ }
219254 _unpartitionedMessages.addAll (messages.items.reversed);
220255 _messages.addAll (_partitionMessages (messages.items.reversed));
221256 _hasMessagesBefore = messages.hasPreviousPage;
@@ -226,7 +261,6 @@ class ChatInsideViewModel extends BaseViewModel {
226261
227262 List <List <List <Message >>> _partitionMessages (Iterable <Message > messages) {
228263 const maxTimeDifference = 5 ;
229- final unreadMessagesCount = _dialog? .unreadMessagesCount ?? 0 ;
230264 final List <List <List <Message >>> partitions = [];
231265 for (final (index, message) in messages.indexed) {
232266 final lastDatePartition = partitions.lastOrNull;
@@ -282,7 +316,9 @@ class ChatInsideViewModel extends BaseViewModel {
282316 if (_dialog == null ) {
283317 return false ;
284318 }
285-
319+ if (chatId == null ) {
320+ return false ;
321+ }
286322 final result = await tryLoginAndRetrieveData <T >(
287323 sendFunction,
288324 () => null ,
0 commit comments