quickblox-react-ui-kit 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +3 -2
  2. package/dist/Data/repository/DialogsRepository.d.ts +1 -0
  3. package/dist/Data/repository/EventMessagesRepository.d.ts +1 -0
  4. package/dist/Data/repository/MessagesRepository.d.ts +2 -2
  5. package/dist/Domain/entity/NotificationTypes.d.ts +1 -0
  6. package/dist/Domain/repository/IDialogsRepository.d.ts +1 -0
  7. package/dist/Domain/repository/IMessagesRepository.d.ts +2 -2
  8. package/dist/Domain/use_cases/CreateDialogUseCase.d.ts +2 -1
  9. package/dist/Domain/use_cases/LeaveDialogUseCase.d.ts +2 -1
  10. package/dist/Domain/use_cases/RemoveUsersFromTheDialogUseCase.d.ts +2 -1
  11. package/dist/Domain/use_cases/SubscribeToDialogEventsUseCase.d.ts +1 -0
  12. package/dist/Domain/use_cases/UpdateDialogUseCase.d.ts +2 -1
  13. package/dist/Presentation/Views/Base/BaseViewModel.d.ts +1 -0
  14. package/dist/Presentation/components/UI/Dialogs/MessagesView/DefaultAttachmentComponent/DefaultAttachmentComponent.d.ts +1 -0
  15. package/dist/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/AvatarContentIncomingUser/AvatarContentIncomingUser.d.ts +3 -0
  16. package/dist/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/InComingMessage.d.ts +9 -2
  17. package/dist/Presentation/components/UI/Dialogs/MessagesView/MessagesView.d.ts +10 -0
  18. package/dist/Presentation/components/UI/Dialogs/MessagesView/MessagesViewModel.d.ts +2 -2
  19. package/dist/Presentation/components/UI/Dialogs/MessagesView/SystemDateBanner/SystemDateBanner.d.ts +7 -0
  20. package/dist/Presentation/components/UI/Dialogs/MessagesView/SystemMessageBanner/SystemMessageBanner.d.ts +7 -0
  21. package/dist/index-ui.d.ts +5 -1
  22. package/dist/index-ui.js +101 -35
  23. package/package.json +1 -1
  24. package/src/App.tsx +1 -1
  25. package/src/Data/repository/DialogsRepository.ts +4 -0
  26. package/src/Data/repository/EventMessagesRepository.ts +34 -0
  27. package/src/Data/repository/MessagesRepository.ts +16 -10
  28. package/src/Data/source/exception/MapperDTOException.ts +3 -0
  29. package/src/Data/source/remote/RemoteDataSource.ts +134 -112
  30. package/src/Domain/entity/NotificationTypes.ts +2 -0
  31. package/src/Domain/repository/IDialogsRepository.ts +2 -0
  32. package/src/Domain/repository/IMessagesRepository.ts +2 -2
  33. package/src/Domain/use_cases/CreateDialogUseCase.ts +8 -1
  34. package/src/Domain/use_cases/GetAllDialogsUseCaseWithMock.ts +1 -0
  35. package/src/Domain/use_cases/LeaveDialogUseCase.ts +8 -1
  36. package/src/Domain/use_cases/RemoveUsersFromTheDialogUseCase.ts +40 -17
  37. package/src/Domain/use_cases/SendTextMessageUseCase.ts +3 -2
  38. package/src/Domain/use_cases/SubscribeToDialogEventsUseCase.ts +21 -0
  39. package/src/Domain/use_cases/UpdateDialogUseCase.ts +8 -1
  40. package/src/Domain/use_cases/base/Subscribable/SubscriptionPerformer.ts +7 -10
  41. package/src/Presentation/Views/Base/BaseViewModel.ts +1 -0
  42. package/src/Presentation/Views/Dialogs/Dialogs.scss +3 -0
  43. package/src/Presentation/Views/Dialogs/useDialogsViewModel.ts +109 -48
  44. package/src/Presentation/assets/styles/_variables.scss +19 -0
  45. package/src/Presentation/components/UI/Buttons/MainButton/MainButton.scss +9 -0
  46. package/src/Presentation/components/UI/Dialogs/EditDialog/EditDialog.scss +3 -0
  47. package/src/Presentation/components/UI/Dialogs/InviteMembers/InviteMembers.scss +3 -0
  48. package/src/Presentation/components/UI/Dialogs/MembersList/MembersList.scss +3 -0
  49. package/src/Presentation/components/UI/Dialogs/MessagesView/AudioAttachmentComponent/AudioAttachmentComponent.tsx +1 -1
  50. package/src/Presentation/components/UI/Dialogs/MessagesView/DefaultAttachmentComponent/DefaultAttachmentComponent.tsx +20 -14
  51. package/src/Presentation/components/UI/Dialogs/MessagesView/ImageAttachmentComponent/ImageAttachmentComponent.tsx +8 -6
  52. package/src/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/AvatarContentIncomingUser/AvatarContentIncomingUser.tsx +6 -0
  53. package/src/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/InComingMessage.scss +1 -1
  54. package/src/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/InComingMessage.tsx +74 -29
  55. package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesView.scss +12 -23
  56. package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesView.tsx +101 -33
  57. package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesViewModel.ts +2 -2
  58. package/src/Presentation/components/UI/Dialogs/MessagesView/OutGoingMessage/OutGoingMessage.tsx +1 -1
  59. package/src/Presentation/components/UI/Dialogs/MessagesView/SystemDateBanner/SystemDateBanner.scss +23 -0
  60. package/src/Presentation/components/UI/Dialogs/MessagesView/SystemDateBanner/SystemDateBanner.tsx +17 -0
  61. package/src/Presentation/components/UI/Dialogs/MessagesView/SystemMessageBanner/SystemMessageBanner.scss +21 -0
  62. package/src/Presentation/components/UI/Dialogs/MessagesView/SystemMessageBanner/SystemMessageBanner.tsx +17 -0
  63. package/src/Presentation/components/UI/Dialogs/MessagesView/useMessagesViewModel.ts +124 -83
  64. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewDialog.scss +27 -1
  65. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewDialog.tsx +6 -3
  66. package/src/index-ui.ts +8 -1
  67. package/src/index.scss +0 -1
  68. package/src/package_artan_react_ui.json +1 -1
  69. package/src/package_original.json +1 -1
  70. package/src/Presentation/assets/styles/_reset-styles.scss +0 -435
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quickblox-react-ui-kit",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "main": "dist/index-ui.js",
5
5
  "license": "MIT",
6
6
  "dependencies": {
package/src/App.tsx CHANGED
@@ -28,7 +28,7 @@ function App() {
28
28
  const { connectionRepository } = useQBConnection();
29
29
 
30
30
  const initLoginData: LoginData = {
31
- login: 'artimed', // vit1
31
+ login: 'anruaav2', // vit1
32
32
  password: 'quickblox',
33
33
  };
34
34
 
@@ -52,6 +52,10 @@ export default class DialogsRepository implements IDialogsRepository {
52
52
  this.dialogLocalDTOMapper = new DialogLocalDTOMapper();
53
53
  }
54
54
 
55
+ release() {
56
+ this.localDataStorage.clearAll();
57
+ }
58
+
55
59
  subscribeLocalSync(subscriber: FunctionTypeVoidToVoid): void {
56
60
  this.localDataStorage.subscribe(subscriber);
57
61
  }
@@ -47,6 +47,8 @@ export default class EventMessagesRepository
47
47
  new SubscriptionPerformer<MessageEntity>();
48
48
  this.subscriptionOnSystemMessages[NotificationTypes.DELETE_LEAVE_DIALOG] =
49
49
  new SubscriptionPerformer<MessageEntity>();
50
+ this.subscriptionOnSystemMessages[NotificationTypes.REMOVE_USER] =
51
+ new SubscriptionPerformer<MessageEntity>();
50
52
  this.subscriptionOnSystemMessages[NotificationTypes.NEW_DIALOG] =
51
53
  new SubscriptionPerformer<MessageEntity>();
52
54
  this.remoteDs.subscribeOnSystemMessaging(
@@ -61,6 +63,10 @@ export default class EventMessagesRepository
61
63
  NotificationTypes.DELETE_LEAVE_DIALOG,
62
64
  this.DeleteLeaveDialogEventHandler.bind(this),
63
65
  );
66
+ this.remoteDs.subscribeOnSystemMessaging(
67
+ NotificationTypes.REMOVE_USER,
68
+ this.RemoteUserDialogEventHandler.bind(this),
69
+ );
64
70
  this.remoteDs.subscribeOnMessaging(this.NewMessageEventHandler.bind(this));
65
71
  this.remoteDs.subscribeOnUpdateMessageStatus(
66
72
  this.UpdateMessageStatusEventHandler.bind(this),
@@ -158,6 +164,31 @@ export default class EventMessagesRepository
158
164
  });
159
165
  }
160
166
 
167
+ protected RemoteUserDialogEventHandler(messageInfo: RemoteMessageDTO): void {
168
+ this.messageDTOMapper
169
+ .toEntity<RemoteMessageDTO, MessageEntity>(messageInfo)
170
+ // eslint-disable-next-line promise/always-return
171
+ .then((currentMessage: MessageEntity) => {
172
+ console.log(
173
+ 'have system message new dialog',
174
+ JSON.stringify(currentMessage),
175
+ );
176
+ this.subscriptionOnSystemMessages[
177
+ NotificationTypes.REMOVE_USER
178
+ ].informSubscribers(currentMessage, EventMessageType.SystemMessage);
179
+ })
180
+ .catch((reason) => {
181
+ const errorMessage = stringifyError(reason);
182
+
183
+ console.log(
184
+ 'get system message with new dialog with exception:',
185
+ errorMessage,
186
+ );
187
+
188
+ throw new Error(errorMessage);
189
+ });
190
+ }
191
+
161
192
  protected UpdateDialogEventHandler(messageInfo: RemoteMessageDTO): void {
162
193
  console.log('call UpdateDialogEventHandler');
163
194
  if (this.messageDTOMapper) {
@@ -274,6 +305,9 @@ export default class EventMessagesRepository
274
305
  case NotificationTypes.DELETE_LEAVE_DIALOG:
275
306
  SystemMessageType = NotificationTypes.DELETE_LEAVE_DIALOG;
276
307
  break;
308
+ case NotificationTypes.REMOVE_USER:
309
+ SystemMessageType = NotificationTypes.REMOVE_USER;
310
+ break;
277
311
  case NotificationTypes.UPDATE_DIALOG:
278
312
  SystemMessageType = NotificationTypes.UPDATE_DIALOG;
279
313
  break;
@@ -225,7 +225,7 @@ export default class MessagesRepository implements IMessagesRepository {
225
225
  await this.remoteDataSource.typingMessageStop(remoteDialogDTO, senderId);
226
226
  }
227
227
 
228
- async saveMessageToLocal(entity: MessageEntity): Promise<boolean> {
228
+ async saveMessageToLocal(entity: MessageEntity): Promise<MessageEntity> {
229
229
  try {
230
230
  const dto: RemoteMessageDTO = await this.messageLocalDTOMapper.fromEntity(
231
231
  entity,
@@ -233,26 +233,32 @@ export default class MessagesRepository implements IMessagesRepository {
233
233
 
234
234
  await this.localDataStorage.saveMessage(dto);
235
235
 
236
- return Promise.resolve(true);
236
+ return Promise.resolve(entity);
237
237
  } catch (e) {
238
- return Promise.resolve(false);
238
+ // eslint-disable-next-line no-param-reassign
239
+ entity.delivered_ids = [];
240
+
241
+ return Promise.resolve(entity);
239
242
  }
240
243
  }
241
244
 
242
- async sendMessageToRemote(entity: MessageEntity): Promise<boolean> {
245
+ async sendMessageToRemote(entity: MessageEntity): Promise<MessageEntity> {
246
+ let messageResult: MessageEntity = entity;
247
+
243
248
  try {
244
- const dto: RemoteMessageDTO =
249
+ const dtoParam: RemoteMessageDTO =
245
250
  await this.messageRemoteDTOMapper.fromEntity(entity);
246
251
 
247
- await this.remoteDataSource.sendMessage(dto);
252
+ const dtoResult: RemoteMessageDTO =
253
+ await this.remoteDataSource.sendMessage(dtoParam);
248
254
 
249
- return Promise.resolve(true);
255
+ messageResult = await this.messageRemoteDTOMapper.toEntity(dtoResult);
256
+
257
+ return Promise.resolve(messageResult);
250
258
  } catch (e) {
251
259
  // eslint-disable-next-line prefer-promise-reject-errors
252
- return Promise.reject(false);
260
+ return Promise.reject(messageResult);
253
261
  }
254
-
255
- return Promise.resolve(false);
256
262
  }
257
263
 
258
264
  async updateMessageInLocal(entity: MessageEntity): Promise<boolean> {
@@ -15,5 +15,8 @@ export class MapperDTOException extends RepositoryException {
15
15
  constructor(message: string, code: number, description = '') {
16
16
  super(message, code);
17
17
  this._description = description;
18
+ if (this._description) {
19
+ this.message += ` ${this._description}`;
20
+ }
18
21
  }
19
22
  }
@@ -149,6 +149,8 @@ export class RemoteDataSource implements IRemoteDataSource {
149
149
  this.fileDTOMapper = new FileDTOMapper();
150
150
  this._needInit = true;
151
151
  this._authProcessed = false;
152
+ this.subscriptionOnSystemMessages[NotificationTypes.REMOVE_USER] =
153
+ new SubscriptionPerformer<RemoteMessageDTO>();
152
154
  this.subscriptionOnSystemMessages[NotificationTypes.UPDATE_DIALOG] =
153
155
  new SubscriptionPerformer<RemoteMessageDTO>();
154
156
  this.subscriptionOnSystemMessages[NotificationTypes.DELETE_LEAVE_DIALOG] =
@@ -270,6 +272,9 @@ export class RemoteDataSource implements IRemoteDataSource {
270
272
  let SystemMessageType: string = NotificationTypes.NEW_DIALOG;
271
273
 
272
274
  switch (notificationType) {
275
+ case NotificationTypes.REMOVE_USER:
276
+ SystemMessageType = NotificationTypes.REMOVE_USER;
277
+ break;
273
278
  case NotificationTypes.DELETE_LEAVE_DIALOG:
274
279
  SystemMessageType = NotificationTypes.DELETE_LEAVE_DIALOG;
275
280
  break;
@@ -348,26 +353,13 @@ export class RemoteDataSource implements IRemoteDataSource {
348
353
  message.extension.notification_type || NotificationTypes.UPDATE_DIALOG;
349
354
  resultMessage.dialogId = message?.extension?.dialog_id || '';
350
355
 
351
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
352
- function getEventNameFromNotification(notification_type: string) {
353
- let EventName = SubscriptionPerformer.DEFAULT_SUBSCRIPTION_NAME;
354
-
355
- if (
356
- notification_type === NotificationTypes.UPDATE_DIALOG ||
357
- notification_type === NotificationTypes.NEW_DIALOG
358
- ) {
359
- EventName = 'UPDATE_DIALOG_LIST_INFO';
360
- }
361
-
362
- return EventName;
363
- }
364
-
365
356
  this.subscriptionOnSystemMessages[
366
357
  resultMessage.notification_type
367
358
  ].informSubscribers(resultMessage, EventMessageType.SystemMessage);
368
359
  };
369
360
 
370
- function ToRemoteMessageDTO(message: QBChatXMPPMessage) {
361
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
362
+ function QBChatXMPPMessageToRemoteMessageDTO(message: QBChatXMPPMessage) {
371
363
  const resultMessage = new RemoteMessageDTO();
372
364
 
373
365
  resultMessage.id = message.id;
@@ -413,28 +405,104 @@ export class RemoteDataSource implements IRemoteDataSource {
413
405
  // нужно получить реализовать так как при обработке onDeliveredStatusListener
414
406
  const dialogId = message.dialog_id || message.extension.dialog_id || '-1';
415
407
 
416
- // eslint-disable-next-line promise/catch-or-return,@typescript-eslint/no-unused-vars,promise/always-return
417
- QBGetDialogById(dialogId).then((result) => {
418
- // const dialogs: QBChatDialog[] | undefined = result?.items.filter(
419
- // (v) => v._id === dialogId,
420
- // );
421
- // const current = dialogs && dialogs.length > 0 ? dialogs[0] : undefined;
422
-
408
+ //
409
+ qbChatGetMessagesExtended(dialogId, {
410
+ _id: message.id,
411
+ })
423
412
  // eslint-disable-next-line promise/always-return
424
- // if (current && current.type === DialogType.group)
425
- // eslint-disable-next-line no-lone-blocks
426
- {
427
- // const messageId = message.id;
428
- const resultMessage = ToRemoteMessageDTO(message);
429
-
430
- this.subscriptionOnChatMessages.informSubscribers(
431
- resultMessage,
432
- EventMessageType.RegularMessage,
413
+ .then((qbMessages: GetMessagesResult) => {
414
+ ///
415
+ qbMessages.items.map(async (currentItem) => {
416
+ const dtoMessage: RemoteMessageDTO =
417
+ await this.messageDTOMapper.toTDO<
418
+ QBChatMessage,
419
+ RemoteMessageDTO
420
+ >(currentItem);
421
+
422
+ dtoMessage.dialogId = dialogId;
423
+
424
+ this.subscriptionOnChatMessages.informSubscribers(
425
+ dtoMessage,
426
+ EventMessageType.RegularMessage,
427
+ );
428
+
429
+ return dtoMessage;
430
+ });
431
+
432
+ ///
433
+ })
434
+ .catch();
435
+ //
436
+ // // eslint-disable-next-line promise/catch-or-return,@typescript-eslint/no-unused-vars,promise/always-return
437
+ // QBGetDialogById(dialogId).then((result) => {
438
+ // // const dialogs: QBChatDialog[] | undefined = result?.items.filter(
439
+ // // (v) => v._id === dialogId,
440
+ // // );
441
+ // // const current = dialogs && dialogs.length > 0 ? dialogs[0] : undefined;
442
+ //
443
+ // // eslint-disable-next-line promise/always-return
444
+ // // if (current && current.type === DialogType.group)
445
+ // // eslint-disable-next-line no-lone-blocks
446
+ // {
447
+ // // const messageId = message.id;
448
+ // const resultMessage = QBChatXMPPMessageToRemoteMessageDTO(message);
449
+ //
450
+ // this.subscriptionOnChatMessages.informSubscribers(
451
+ // resultMessage,
452
+ // EventMessageType.RegularMessage,
453
+ // );
454
+ // }
455
+ //
456
+ // //
457
+ // });
458
+ };
459
+ QB.chat.onDeliveredStatusListener = (messageId, dialogId, userId) => {
460
+ console.log(
461
+ `EVENT: receive delivered message id: ${messageId}, dialogid: ${dialogId} userid: ${userId}`,
462
+ );
463
+
464
+ QBGetDialogById(dialogId)
465
+ .then((result) => {
466
+ //
467
+ const dialogs: QBChatDialog[] | undefined = result?.items.filter(
468
+ (v) => v._id === dialogId,
433
469
  );
434
- }
470
+ const current =
471
+ dialogs && dialogs.length > 0 ? dialogs[0] : undefined;
435
472
 
436
- //
437
- });
473
+ // eslint-disable-next-line promise/always-return
474
+ if (current && current.type === DialogType.private) {
475
+ //
476
+ qbChatGetMessagesExtended(dialogId, {
477
+ _id: messageId,
478
+ })
479
+ // eslint-disable-next-line promise/always-return
480
+ .then((qbMessages: GetMessagesResult) => {
481
+ ///
482
+ qbMessages.items.map(async (currentItem) => {
483
+ const dtoMessage: RemoteMessageDTO =
484
+ await this.messageDTOMapper.toTDO<
485
+ QBChatMessage,
486
+ RemoteMessageDTO
487
+ >(currentItem);
488
+
489
+ dtoMessage.dialogId = dialogId;
490
+
491
+ this.subscriptionOnChatMessages.informSubscribers(
492
+ dtoMessage,
493
+ EventMessageType.RegularMessage,
494
+ );
495
+
496
+ return dtoMessage;
497
+ });
498
+
499
+ ///
500
+ })
501
+ .catch();
502
+ //
503
+ }
504
+ })
505
+ .catch();
438
506
  };
439
507
  QB.chat.onMessageTypingListener = (isTyping, userId, dialogId) => {
440
508
  console.log(
@@ -492,54 +560,6 @@ export class RemoteDataSource implements IRemoteDataSource {
492
560
  );
493
561
  };
494
562
 
495
- QB.chat.onDeliveredStatusListener = (messageId, dialogId, userId) => {
496
- console.log(
497
- `EVENT: receive delivered message id: ${messageId}, dialogid: ${dialogId} userid: ${userId}`,
498
- );
499
-
500
- QBGetDialogById(dialogId)
501
- .then((result) => {
502
- //
503
- const dialogs: QBChatDialog[] | undefined = result?.items.filter(
504
- (v) => v._id === dialogId,
505
- );
506
- const current =
507
- dialogs && dialogs.length > 0 ? dialogs[0] : undefined;
508
-
509
- // eslint-disable-next-line promise/always-return
510
- if (current && current.type === DialogType.private) {
511
- //
512
- qbChatGetMessagesExtended(dialogId, {
513
- _id: messageId,
514
- })
515
- // eslint-disable-next-line promise/always-return
516
- .then((qbMessages: GetMessagesResult) => {
517
- ///
518
- qbMessages.items.map(async (currentItem) => {
519
- const dtoMessage: RemoteMessageDTO =
520
- await this.messageDTOMapper.toTDO<
521
- QBChatMessage,
522
- RemoteMessageDTO
523
- >(currentItem);
524
-
525
- dtoMessage.dialogId = dialogId;
526
-
527
- this.subscriptionOnChatMessages.informSubscribers(
528
- dtoMessage,
529
- EventMessageType.RegularMessage,
530
- );
531
-
532
- return dtoMessage;
533
- });
534
-
535
- ///
536
- })
537
- .catch();
538
- //
539
- }
540
- })
541
- .catch();
542
- };
543
563
  QB.chat.onReadStatusListener = (messageId, dialogId, userId) => {
544
564
  console.log(
545
565
  `EVENT: receive read message id: ${messageId}, dialogid: ${dialogId} userid: ${userId}`,
@@ -1153,32 +1173,32 @@ export class RemoteDataSource implements IRemoteDataSource {
1153
1173
  */
1154
1174
  // notification_type: 3,
1155
1175
  // dialog_updated_at: Date.now() / 1000,
1156
- let messageText = '';
1157
-
1158
- switch (dto.notification_type) {
1159
- case NotificationTypes.DELETE_LEAVE_DIALOG: {
1160
- messageText = `${
1161
- this.authInformation?.userName || 'owner'
1162
- } has left the chat.`;
1163
- break;
1164
- }
1165
- case NotificationTypes.NEW_DIALOG: {
1166
- messageText = `${
1167
- this.authInformation?.userName || 'owner'
1168
- } create the chat`;
1169
- break;
1170
- }
1171
- case NotificationTypes.UPDATE_DIALOG: {
1172
- messageText = `${
1173
- this.authInformation?.userName || 'owner'
1174
- } update the chat`;
1175
- break;
1176
- }
1177
- default: {
1178
- messageText = dto.message;
1179
- break;
1180
- }
1181
- }
1176
+ const messageText = dto.message;
1177
+
1178
+ // switch (dto.notification_type) {
1179
+ // case NotificationTypes.DELETE_LEAVE_DIALOG: {
1180
+ // messageText = `${
1181
+ // this.authInformation?.userName || 'owner'
1182
+ // } has left the chat.`;
1183
+ // break;
1184
+ // }
1185
+ // case NotificationTypes.NEW_DIALOG: {
1186
+ // messageText = `${
1187
+ // this.authInformation?.userName || 'owner'
1188
+ // } create the chat`;
1189
+ // break;
1190
+ // }
1191
+ // case NotificationTypes.UPDATE_DIALOG: {
1192
+ // messageText = `${
1193
+ // this.authInformation?.userName || 'owner'
1194
+ // } update the chat`;
1195
+ // break;
1196
+ // }
1197
+ // default: {
1198
+ // messageText = dto.message;
1199
+ // break;
1200
+ // }
1201
+ // }
1182
1202
  const qbEntity: QBChatNewMessage = {
1183
1203
  type: dto.dialog_type === DialogType.private ? 'chat' : 'groupchat',
1184
1204
  body: messageText,
@@ -1207,10 +1227,10 @@ export class RemoteDataSource implements IRemoteDataSource {
1207
1227
  qbEntity.extension.attachments?.push(chatMessageAttachment);
1208
1228
  });
1209
1229
  }
1210
- let qbMessages: QBChatMessage['_id'];
1230
+ let qbMessageId: QBChatMessage['_id'];
1211
1231
 
1212
1232
  if (dto.dialog_type === DialogType.private) {
1213
- qbMessages = await QBChatSendMessage(dto.recipient_id, qbEntity);
1233
+ qbMessageId = await QBChatSendMessage(dto.recipient_id, qbEntity);
1214
1234
  } else {
1215
1235
  await QBJoinGroupDialog(dto.dialogId).catch(() => {
1216
1236
  throw new RemoteDataSourceException(
@@ -1220,10 +1240,10 @@ export class RemoteDataSource implements IRemoteDataSource {
1220
1240
  });
1221
1241
  const dialogJid = QB.chat.helpers.getRoomJidFromDialogId(dto.dialogId);
1222
1242
 
1223
- qbMessages = await QBChatSendMessage(dialogJid, qbEntity);
1243
+ qbMessageId = await QBChatSendMessage(dialogJid, qbEntity);
1224
1244
  }
1225
1245
 
1226
- if (qbMessages === null || qbMessages === undefined) {
1246
+ if (qbMessageId === null || qbMessageId === undefined) {
1227
1247
  return Promise.reject(
1228
1248
  new RemoteDataSourceException(
1229
1249
  INCORRECT_REMOTE_DATASOURCE_DATA_EXCEPTION_MESSAGE,
@@ -1232,6 +1252,8 @@ export class RemoteDataSource implements IRemoteDataSource {
1232
1252
  );
1233
1253
  }
1234
1254
  console.log('regular message was sent');
1255
+ // eslint-disable-next-line no-param-reassign
1256
+ dto.id = qbMessageId;
1235
1257
 
1236
1258
  return Promise.resolve(dto);
1237
1259
  }
@@ -4,4 +4,6 @@ export class NotificationTypes {
4
4
  public static readonly UPDATE_DIALOG = '2';
5
5
 
6
6
  public static readonly DELETE_LEAVE_DIALOG = '3';
7
+
8
+ public static readonly REMOVE_USER = '4';
7
9
  }
@@ -37,4 +37,6 @@ export interface IDialogsRepository {
37
37
  isLocalSynced(): Promise<boolean>;
38
38
 
39
39
  setLocalSynced(synced: boolean): void;
40
+
41
+ release(): void;
40
42
  }
@@ -3,9 +3,9 @@ import { PaginatedResult, Pagination } from './Pagination';
3
3
  import { DialogEntity } from '../entity/DialogEntity'
4
4
 
5
5
  export interface IMessagesRepository {
6
- saveMessageToLocal(message: MessageEntity): Promise<boolean>;
6
+ saveMessageToLocal(message: MessageEntity): Promise<MessageEntity>;
7
7
 
8
- sendMessageToRemote(message: MessageEntity): Promise<boolean>;
8
+ sendMessageToRemote(message: MessageEntity): Promise<MessageEntity>;
9
9
 
10
10
  getMessagesFromLocal(dialogId: string): Promise<Array<MessageEntity>>;
11
11
 
@@ -15,16 +15,20 @@ export class CreateDialogUseCase implements IUseCase<void, DialogEntity> {
15
15
 
16
16
  private newDialog: GroupDialogEntity;
17
17
 
18
+ private textInformationMessage: string;
19
+
18
20
  // todo: delete synUseCase: BaseUseCase<boolean>, use only dialogRepository
19
21
  constructor(
20
22
  eventMessagesRepository: EventMessagesRepository,
21
23
  dialogRepository: DialogsRepository,
22
24
  newDialog: GroupDialogEntity,
25
+ textInformationMessage: string,
23
26
  ) {
24
27
  console.log('CONSTRUCTOR CreateDialogUseCase');
25
28
  this.dialogRepository = dialogRepository;
26
29
  this.newDialog = newDialog;
27
30
  this.eventMessagesRepository = eventMessagesRepository;
31
+ this.textInformationMessage = textInformationMessage;
28
32
  }
29
33
 
30
34
  async execute(): Promise<DialogEntity> {
@@ -60,7 +64,10 @@ export class CreateDialogUseCase implements IUseCase<void, DialogEntity> {
60
64
  remoteMessageDTO.dialogId = result.id;
61
65
  remoteMessageDTO.notification_type = NotificationTypes.NEW_DIALOG;
62
66
  remoteMessageDTO.date_sent = Date.now() / 1000;
63
- remoteMessageDTO.message = `User ${this.newDialog.ownerId} create new dialog ${this.newDialog.name}`;
67
+ remoteMessageDTO.message =
68
+ this.textInformationMessage && this.textInformationMessage.length > 0
69
+ ? this.textInformationMessage
70
+ : `User ${this.newDialog.ownerId} create new dialog ${this.newDialog.name}`;
64
71
 
65
72
  this.eventMessagesRepository.dispatchEvent<RemoteMessageDTO>(
66
73
  EventMessageType.RegularMessage,
@@ -21,6 +21,7 @@ export class GetAllDialogsUseCaseWithMock
21
21
  const fromRemote: PaginatedResult<DialogEntity> =
22
22
  await this.dialogRepository.getDialogsFromRemote(this.pagination);
23
23
 
24
+ this.dialogRepository.release();
24
25
  await Promise.all(
25
26
  fromRemote.ResultData.map(async (entity) => {
26
27
  // eslint-disable-next-line no-return-await
@@ -27,17 +27,21 @@ export class LeaveDialogUseCase implements IUseCase<void, boolean> {
27
27
 
28
28
  private leaveType: DialogLeaveTypeArcheType;
29
29
 
30
+ private textInformationMessage: string;
31
+
30
32
  constructor(
31
33
  eventMessagesRepository: EventMessagesRepository,
32
34
  dialogRepository: DialogsRepository,
33
35
  dialog: DialogEntity,
34
36
  leaveType: DialogLeaveTypeArcheType,
37
+ textInformationMessage: string,
35
38
  ) {
36
39
  console.log('CONSTRUCTOR LeaveDialogUseCase');
37
40
  this.eventMessagesRepository = eventMessagesRepository;
38
41
  this.dialogRepository = dialogRepository;
39
42
  this.dialogToLeave = dialog;
40
43
  this.leaveType = leaveType;
44
+ this.textInformationMessage = textInformationMessage;
41
45
  }
42
46
 
43
47
  async execute(): Promise<boolean> {
@@ -59,7 +63,10 @@ export class LeaveDialogUseCase implements IUseCase<void, boolean> {
59
63
  remoteMessageDTO.dialogId = this.dialogToLeave.id;
60
64
  remoteMessageDTO.notification_type = NotificationTypes.DELETE_LEAVE_DIALOG;
61
65
  remoteMessageDTO.date_sent = Date.now();
62
- remoteMessageDTO.message = `User ${this.dialogToLeave.ownerId} has left dialog.`;
66
+ remoteMessageDTO.message =
67
+ this.textInformationMessage && this.textInformationMessage.length > 0
68
+ ? this.textInformationMessage
69
+ : `User ${this.dialogToLeave.ownerId} has left dialog.`;
63
70
 
64
71
  this.eventMessagesRepository.dispatchEvent<RemoteMessageDTO>(
65
72
  EventMessageType.RegularMessage,
@@ -21,17 +21,21 @@ export class RemoveUsersFromTheDialogUseCase
21
21
 
22
22
  private usersIds: Array<number>;
23
23
 
24
+ private textInformationMessage: string;
25
+
24
26
  constructor(
25
27
  eventMessagesRepository: EventMessagesRepository,
26
28
  dialogRepository: DialogsRepository,
27
29
  dialog: DialogEntity,
28
30
  usersIds: Array<number>,
31
+ textInformationMessage: string,
29
32
  ) {
30
33
  console.log('CONSTRUCTOR LeaveDialogUseCase');
31
34
  this.eventMessagesRepository = eventMessagesRepository;
32
35
  this.dialogRepository = dialogRepository;
33
36
  this.dialogToLeave = dialog;
34
37
  this.usersIds = usersIds;
38
+ this.textInformationMessage = textInformationMessage;
35
39
  }
36
40
 
37
41
  async execute(): Promise<boolean> {
@@ -53,13 +57,25 @@ export class RemoveUsersFromTheDialogUseCase
53
57
  remoteMessageDTO.dialogId = this.dialogToLeave.id;
54
58
  remoteMessageDTO.notification_type = NotificationTypes.DELETE_LEAVE_DIALOG;
55
59
  remoteMessageDTO.date_sent = Date.now();
56
- remoteMessageDTO.message = `User ${this.dialogToLeave.ownerId} has left dialog.`;
57
-
58
- this.eventMessagesRepository.dispatchEvent<RemoteMessageDTO>(
59
- EventMessageType.RegularMessage,
60
- remoteMessageDTO,
61
- receivers,
62
- );
60
+ remoteMessageDTO.message =
61
+ this.textInformationMessage && this.textInformationMessage.length > 0
62
+ ? this.textInformationMessage
63
+ : `User ${this.dialogToLeave.ownerId} delete other users from dialog.`;
64
+
65
+ const updatedRecivers: number[] = [];
66
+
67
+ receivers.forEach((item) => {
68
+ if (!this.usersIds.includes(item)) {
69
+ updatedRecivers.push(item);
70
+ }
71
+ });
72
+
73
+ // send visual message
74
+ // this.eventMessagesRepository.dispatchEvent<RemoteMessageDTO>(
75
+ // EventMessageType.RegularMessage,
76
+ // remoteMessageDTO,
77
+ // updatedRecivers,
78
+ // );
63
79
  //
64
80
 
65
81
  await this.dialogRepository
@@ -81,21 +97,28 @@ export class RemoveUsersFromTheDialogUseCase
81
97
  console.log('try to delete dialog in local');
82
98
 
83
99
  remoteMessageDTO.dialogId = this.dialogToLeave.id;
84
- remoteMessageDTO.notification_type =
85
- NotificationTypes.DELETE_LEAVE_DIALOG;
86
-
87
- await this.dialogRepository.deleteDialogFromLocal(this.dialogToLeave.id);
88
- this.eventMessagesRepository.dispatchEvent<RemoteMessageDTO>(
89
- EventMessageType.LocalMessage,
90
- remoteMessageDTO,
91
- [],
92
- );
100
+ remoteMessageDTO.notification_type = NotificationTypes.REMOVE_USER;
93
101
 
94
102
  this.eventMessagesRepository.dispatchEvent<RemoteMessageDTO>(
95
103
  EventMessageType.SystemMessage,
96
104
  remoteMessageDTO,
97
- receivers,
105
+ [...this.usersIds], // receivers,
98
106
  );
107
+
108
+ //
109
+ remoteMessageDTO.notification_type = NotificationTypes.UPDATE_DIALOG;
110
+
111
+ if (updatedRecivers) {
112
+ if (updatedRecivers.length > 0) {
113
+ this.eventMessagesRepository.dispatchEvent<RemoteMessageDTO>(
114
+ EventMessageType.SystemMessage,
115
+ remoteMessageDTO,
116
+ updatedRecivers,
117
+ );
118
+ }
119
+ }
120
+
121
+ //
99
122
  }
100
123
 
101
124
  return resultOperation;