@chat21/chat21-ionic 3.0.81-rc.2 → 3.0.81

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 (150) hide show
  1. package/CHANGELOG.md +4 -73
  2. package/README.md +2 -2
  3. package/package.json +2 -2
  4. package/src/app/app.component.html +1 -7
  5. package/src/app/app.component.scss +2 -18
  6. package/src/app/app.component.ts +17 -113
  7. package/src/app/app.module.ts +1 -3
  8. package/src/app/chatlib/conversation-detail/conversation-content/conversation-content.component.ts +1 -8
  9. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +23 -77
  10. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.scss +86 -168
  11. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.ts +2 -39
  12. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.html +24 -11
  13. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.scss +10 -6
  14. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.spec.ts +2 -2
  15. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +25 -16
  16. package/src/app/chatlib/conversation-detail/message/buttons/action-button/action-button.component.html +1 -5
  17. package/src/app/chatlib/conversation-detail/message/buttons/action-button/action-button.component.scss +15 -22
  18. package/src/app/chatlib/conversation-detail/message/buttons/action-button/action-button.component.ts +5 -25
  19. package/src/app/chatlib/conversation-detail/message/buttons/link-button/link-button.component.html +1 -2
  20. package/src/app/chatlib/conversation-detail/message/buttons/link-button/link-button.component.scss +15 -14
  21. package/src/app/chatlib/conversation-detail/message/buttons/link-button/link-button.component.ts +5 -24
  22. package/src/app/chatlib/conversation-detail/message/buttons/text-button/text-button.component.html +1 -6
  23. package/src/app/chatlib/conversation-detail/message/buttons/text-button/text-button.component.scss +13 -12
  24. package/src/app/chatlib/conversation-detail/message/buttons/text-button/text-button.component.ts +5 -26
  25. package/src/app/chatlib/conversation-detail/message/frame/frame.component.html +2 -8
  26. package/src/app/chatlib/conversation-detail/message/frame/frame.component.scss +0 -36
  27. package/src/app/chatlib/conversation-detail/message/frame/frame.component.ts +2 -2
  28. package/src/app/chatlib/conversation-detail/message/html/html.component.ts +1 -0
  29. package/src/app/chatlib/conversation-detail/message/image/image.component.html +1 -1
  30. package/src/app/chatlib/conversation-detail/message/image/image.component.scss +5 -17
  31. package/src/app/chatlib/conversation-detail/message/image/image.component.ts +1 -1
  32. package/src/app/chatlib/conversation-detail/message/info-message/info-message.component.scss +2 -3
  33. package/src/app/chatlib/conversation-detail/message/message-attachment/message-attachment.component.html +6 -16
  34. package/src/app/chatlib/conversation-detail/message/message-attachment/message-attachment.component.scss +3 -1
  35. package/src/app/chatlib/conversation-detail/message/message-attachment/message-attachment.component.ts +0 -2
  36. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +52 -78
  37. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.scss +20 -62
  38. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +10 -14
  39. package/src/app/components/canned-response/canned-response.component.html +7 -7
  40. package/src/app/components/canned-response/canned-response.component.scss +4 -10
  41. package/src/app/components/canned-response/canned-response.component.ts +1 -1
  42. package/src/app/components/contacts-directory/contacts-directory.component.html +26 -22
  43. package/src/app/components/contacts-directory/contacts-directory.component.scss +6 -8
  44. package/src/app/components/conversation-detail/bubble-day-message/bubble-day-message.component.html +3 -0
  45. package/src/app/components/conversation-detail/bubble-day-message/bubble-day-message.component.scss +21 -0
  46. package/src/app/components/conversation-detail/bubble-day-message/bubble-day-message.component.spec.ts +24 -0
  47. package/src/app/components/conversation-detail/bubble-day-message/bubble-day-message.component.ts +14 -0
  48. package/src/app/components/conversation-detail/bubble-my-message/bubble-my-message.component.html +54 -0
  49. package/src/app/components/conversation-detail/bubble-my-message/bubble-my-message.component.scss +98 -0
  50. package/src/app/components/{conversations-list/header-conversations-list/header-conversations-list.component.spec.ts → conversation-detail/bubble-my-message/bubble-my-message.component.spec.ts} +6 -6
  51. package/src/app/components/conversation-detail/bubble-my-message/bubble-my-message.component.ts +84 -0
  52. package/src/app/components/conversation-detail/bubble-others-message/bubble-others-message.component.html +30 -0
  53. package/src/app/components/conversation-detail/bubble-others-message/bubble-others-message.component.scss +83 -0
  54. package/src/app/components/conversation-detail/bubble-others-message/bubble-others-message.component.spec.ts +24 -0
  55. package/src/app/components/conversation-detail/bubble-others-message/bubble-others-message.component.ts +68 -0
  56. package/src/app/components/conversation-detail/bubble-system-message/bubble-system-message.component.html +3 -0
  57. package/src/app/components/conversation-detail/bubble-system-message/bubble-system-message.component.scss +10 -0
  58. package/src/app/components/conversation-detail/bubble-system-message/bubble-system-message.component.spec.ts +24 -0
  59. package/src/app/components/conversation-detail/bubble-system-message/bubble-system-message.component.ts +14 -0
  60. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +42 -61
  61. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.scss +61 -98
  62. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.ts +25 -9
  63. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html +6 -8
  64. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.scss +4 -4
  65. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +84 -24
  66. package/src/app/components/conversation-detail/option-header/option-header.component.html +13 -0
  67. package/src/app/components/conversation-detail/option-header/option-header.component.scss +0 -0
  68. package/src/app/components/{conversations-list/header-conversations-list-archived/header-conversations-list-archived.component.spec.ts → conversation-detail/option-header/option-header.component.spec.ts} +5 -5
  69. package/src/app/components/{conversations-list/header-conversations-list-archived/header-conversations-list-archived.component.ts → conversation-detail/option-header/option-header.component.ts} +4 -5
  70. package/src/app/components/conversation-info/info-content/info-content.component.html +1 -2
  71. package/src/app/components/conversation-info/info-content/info-content.component.ts +2 -3
  72. package/src/app/components/conversation-info/info-direct/info-direct.component.html +9 -1
  73. package/src/app/components/conversation-info/info-direct/info-direct.component.ts +2 -0
  74. package/src/app/components/conversation-info/info-group/info-group.component.html +108 -44
  75. package/src/app/components/conversation-info/info-group/info-group.component.scss +61 -101
  76. package/src/app/components/conversation-info/info-group/info-group.component.ts +0 -1
  77. package/src/app/components/{conversations-list/header-conversations-list/header-conversations-list.component.html → ddp-header/ddp-header.component.html} +3 -3
  78. package/src/app/components/{conversations-list/header-conversations-list/header-conversations-list.component.scss → ddp-header/ddp-header.component.scss} +4 -16
  79. package/src/app/components/{navbar/navbar.component.spec.ts → ddp-header/ddp-header.component.spec.ts} +6 -6
  80. package/src/app/components/{conversations-list/header-conversations-list/header-conversations-list.component.ts → ddp-header/ddp-header.component.ts} +16 -7
  81. package/src/app/components/project-item/project-item.component.html +149 -98
  82. package/src/app/components/project-item/project-item.component.scss +35 -42
  83. package/src/app/components/project-item/project-item.component.ts +4 -16
  84. package/src/app/components/sidebar-user-details/sidebar-user-details.component.html +3 -3
  85. package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +7 -2
  86. package/src/app/components/utils/user-presence/user-presence.component.html +2 -7
  87. package/src/app/components/utils/user-presence/user-presence.component.scss +18 -35
  88. package/src/app/components/utils/user-presence/user-presence.component.ts +10 -6
  89. package/src/app/pages/contacts-directory/contacts-directory.page.html +1 -1
  90. package/src/app/pages/contacts-directory/contacts-directory.page.scss +0 -41
  91. package/src/app/pages/contacts-directory/contacts-directory.page.ts +0 -2
  92. package/src/app/pages/conversation-detail/conversation-detail.module.ts +8 -0
  93. package/src/app/pages/conversation-detail/conversation-detail.page.html +23 -40
  94. package/src/app/pages/conversation-detail/conversation-detail.page.scss +250 -40
  95. package/src/app/pages/conversation-detail/conversation-detail.page.ts +110 -182
  96. package/src/app/pages/conversations-list/conversations-list.page.html +8 -11
  97. package/src/app/pages/conversations-list/conversations-list.page.scss +2 -11
  98. package/src/app/pages/conversations-list/conversations-list.page.ts +22 -25
  99. package/src/app/pages/create-canned-response/create-canned-response.page.ts +13 -13
  100. package/src/app/pages/loader-preview/loader-preview.page.html +1 -1
  101. package/src/app/pages/loader-preview/loader-preview.page.scss +0 -4
  102. package/src/app/pages/loader-preview/loader-preview.page.ts +2 -1
  103. package/src/app/pages/profile-info/profile-info.page.html +4 -2
  104. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.html +1 -1
  105. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.scss +0 -42
  106. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.ts +0 -1
  107. package/src/app/services/canned-responses/canned-responses.service.ts +0 -26
  108. package/src/app/services/tiledesk/tiledesk.service.ts +26 -2
  109. package/src/app/shared/shared.module.ts +33 -24
  110. package/src/assets/i18n/ar.json +265 -278
  111. package/src/assets/i18n/az.json +1 -14
  112. package/src/assets/i18n/de.json +2 -15
  113. package/src/assets/i18n/en.json +2 -15
  114. package/src/assets/i18n/es.json +2 -15
  115. package/src/assets/i18n/fr.json +1 -14
  116. package/src/assets/i18n/it.json +1 -14
  117. package/src/assets/i18n/kk.json +2 -15
  118. package/src/assets/i18n/pt.json +2 -15
  119. package/src/assets/i18n/ru.json +1 -14
  120. package/src/assets/i18n/sr.json +264 -277
  121. package/src/assets/i18n/sv.json +2 -15
  122. package/src/assets/i18n/tr.json +2 -15
  123. package/src/assets/i18n/uk.json +2 -15
  124. package/src/assets/i18n/uz.json +1 -14
  125. package/src/assets/js/chat21client.js +149 -177
  126. package/src/chat-config-native-mqtt.json +0 -3
  127. package/src/chat21-core/models/conversation.ts +1 -0
  128. package/src/chat21-core/providers/firebase/firebase-typing.service.ts +9 -7
  129. package/src/chat21-core/utils/constants.ts +1 -6
  130. package/src/chat21-core/utils/user-typing/user-typing.component.html +5 -8
  131. package/src/chat21-core/utils/user-typing/user-typing.component.scss +17 -87
  132. package/src/chat21-core/utils/user-typing/user-typing.component.ts +94 -12
  133. package/src/chat21-core/utils/utils.ts +10 -38
  134. package/src/global.scss +56 -52
  135. package/src/index.html +2 -2
  136. package/src/variables.scss +10 -30
  137. package/deploy_amazon_beta.sh +0 -29
  138. package/deploy_amazon_prod.sh +0 -30
  139. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component_2.html +0 -116
  140. package/src/app/components/conversations-list/header-conversations-list-archived/header-conversations-list-archived.component.html +0 -12
  141. package/src/app/components/conversations-list/header-conversations-list-archived/header-conversations-list-archived.component.scss +0 -14
  142. package/src/app/components/navbar/navbar.component.html +0 -103
  143. package/src/app/components/navbar/navbar.component.scss +0 -249
  144. package/src/app/components/navbar/navbar.component.ts +0 -189
  145. package/src/app/services/projects/projects.service.spec.ts +0 -12
  146. package/src/app/services/projects/projects.service.ts +0 -43
  147. package/src/assets/sounds/interface-start.mp3 +0 -0
  148. package/src/assets/sounds/wheep-wheep.mp3 +0 -0
  149. package/src/chat21-core/models/projects.ts +0 -27
  150. package/src/chat21-core/utils/convertRequestToConversation.ts +0 -41
@@ -1,5 +1,5 @@
1
1
  import { TYPE_DIRECT } from 'src/chat21-core/utils/constants';
2
- import { URL_SOUND_LIST_CONVERSATION } from './../../../chat21-core/utils/constants'
2
+ import { TYPE_SUPPORT_GROUP, URL_SOUND_LIST_CONVERSATION } from './../../../chat21-core/utils/constants'
3
3
  import {
4
4
  Component,
5
5
  OnInit,
@@ -115,14 +115,16 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
115
115
  public lastConnectionDate: string
116
116
  public showMessageWelcome: boolean
117
117
  public openInfoConversation = false
118
+ public openInfoMessage: boolean // check is open info message
118
119
  public isMobile = false
119
120
  public isLessThan991px = false // nk added
121
+ public isTyping = false
122
+ public nameUserTypingNow: string
120
123
 
121
124
  public heightMessageTextArea = ''
122
- public translationsMap: Map<string, string> = new Map()
123
- public translationsHeaderMap: Map<string, string> = new Map()
124
- public translationsContentMap: Map<string, string> = new Map()
125
+ public translationMap: Map<string, string>
125
126
  public conversationAvatar: any
127
+ public membersConversation: any
126
128
  public member: UserModel
127
129
  public urlConversationSupportGroup: any
128
130
  public isFileSelected: boolean
@@ -148,6 +150,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
148
150
  //SOUND
149
151
  setTimeoutSound: any;
150
152
  audio: any;
153
+ isOpenInfoConversation: boolean;
151
154
  USER_HAS_OPENED_CLOSE_INFO_CONV: boolean = false;
152
155
  isHovering: boolean = false;
153
156
  conversation_count: number;
@@ -169,15 +172,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
169
172
  public disableTextarea: boolean;
170
173
  appsidebarIsWide: boolean;
171
174
 
172
- // ========== begin:: typying =======
173
- public isTypings = false;
174
- public isDirect = false;
175
- public idUserTypingNow: string;
176
- public nameUserTypingNow: string;
177
- private setTimeoutWritingMessages;
178
- membersConversation = ['SYSTEM'];
179
- // ========== end:: typying =======
180
-
181
175
  /**
182
176
  * Constructor
183
177
  * @param route
@@ -246,7 +240,21 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
246
240
  // -----------------------------------------------------------
247
241
  ngOnInit() {
248
242
  this.logger.log('[CONVS-DETAIL] > ngOnInit - window.location: ', window.location);
249
-
243
+ // this.logger.log('[CONVS-DETAIL] > ngOnInit - fileUploadAccept: ', this.appConfigProvider.getConfig().fileUploadAccept);
244
+ // const accept_files = this.appConfigProvider.getConfig().fileUploadAccept;
245
+ // this.logger.log('[CONVS-DETAIL] > ngOnInit - fileUploadAccept typeof accept_files ', typeof accept_files);
246
+ // const accept_files_array = accept_files.split(',')
247
+ // this.logger.log('[CONVS-DETAIL] > ngOnInit - fileUploadAccept accept_files_array ', accept_files_array);
248
+ // this.logger.log('[CONVS-DETAIL] > ngOnInit - fileUploadAccept accept_files_array typeof: ', typeof accept_files_array);
249
+
250
+ // accept_files_array.forEach(accept_file => {
251
+ // this.logger.log('[CONVS-DETAIL] > ngOnInit - fileUploadAccept accept_file ', accept_file);
252
+ // const accept_file_segment = accept_file.split('/')
253
+ // this.logger.log('[CONVS-DETAIL] > ngOnInit - fileUploadAccept accept_file_segment ', accept_file_segment);
254
+ // if (accept_file_segment[1] === '*') {
255
+
256
+ // }
257
+ // });
250
258
  this.getConversations();
251
259
  this.watchToConnectionStatus();
252
260
  this.getOSCODE();
@@ -267,21 +275,21 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
267
275
  // console.log('[CONVS-DETAIL] HAS CLICKED ENLARGE SIDEBAR WIDE chatAreaEle ', chatAreaEle)
268
276
 
269
277
  if (event && event.data && event.data.action && event.data.action === 'openAppsSidebarWideMode' && event.data.parameter === true) {
270
- this.logger.log('[CONVS-DETAIL] openAppsSidebarWideMode EVENT-> open' )
278
+ this.logger.log('[CONVS-DETAIL] HERE YES 1')
271
279
  this.appsidebarIsWide = true
272
280
  // chat21InfoConversationEle.classList.add("info-convs-apps-sidebar-wide");
273
281
  // chatAreaEle.classList.add("chat-area-apps-sidebar-wide");
274
282
  }
275
283
 
276
284
  if (event && event.data && event.data.action && event.data.action === 'openAppsSidebarWideMode' && event.data.parameter === false) {
277
- this.logger.log('[CONVS-DETAIL] openAppsSidebarWideMode EVENT-> close')
285
+ this.logger.log('[CONVS-DETAIL] HERE YES 2')
278
286
  this.appsidebarIsWide = false
279
287
  // chat21InfoConversationEle.classList.remove("info-convs-apps-sidebar-wide");
280
288
  // chatAreaEle.classList.remove("chat-area-apps-sidebar-wide");
281
289
  }
282
290
 
283
291
  if (event && event.data && event.data.action && event.data.action === 'closeAppsSidebarWideMode' && event.data.parameter === true) {
284
- this.logger.log('[CONVS-DETAIL] closeAppsSidebarWideMode EVENT-> close')
292
+ this.logger.log('[CONVS-DETAIL] HERE YES 3')
285
293
  this.appsidebarIsWide = false
286
294
  // chat21InfoConversationEle.classList.remove("info-convs-apps-sidebar-wide");
287
295
  // chatAreaEle.classList.remove("chat-area-apps-sidebar-wide");
@@ -331,12 +339,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
331
339
  // this.updateConversationBadge()
332
340
  // }
333
341
  if(conv.uid && conv.uid === this.conversationWith){
334
- this.conversationAvatar = setConversationAvatar(
335
- conv.conversation_with,
336
- conv.conversation_with_fullname,
337
- conv.channel_type,
338
- conv.attributes['projectId'],
339
- conv.attributes['project_name'])
342
+ this.conversationAvatar = setConversationAvatar(conv.conversation_with,conv.conversation_with_fullname,conv.channel_type)
340
343
  }
341
344
 
342
345
  }
@@ -474,7 +477,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
474
477
  this.loggedUser = this.tiledeskAuthService.getCurrentUser()
475
478
  this.logger.log('[CONVS-DETAIL] - initialize -> loggedUser: ', this.loggedUser)
476
479
  this.translations()
477
- this.setStyleMap()
478
480
  // this.conversationSelected = localStorage.getItem('conversationSelected');
479
481
  this.showButtonToBottom = false
480
482
  this.showMessageWelcome = false
@@ -489,6 +491,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
489
491
 
490
492
  this.messages = [] // list messages of conversation
491
493
  this.isFileSelected = false // indicates if a file has been selected (image to upload)
494
+ this.openInfoMessage = false // indicates whether the info message panel is open
492
495
 
493
496
  if (checkPlatformIsMobile()) {
494
497
  this.isMobile = true
@@ -504,11 +507,13 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
504
507
  if (checkWindowWidthIsLessThan991px()) {
505
508
  this.logger.log('[CONVS-DETAIL] - initialize -> checkWindowWidthIsLessThan991px ', checkWindowWidthIsLessThan991px())
506
509
  this.openInfoConversation = false // indica se è aperto il box info conversazione
507
- this.logger.log('[CONVS-DETAIL] - initialize -> openInfoConversation ', this.openInfoConversation)
510
+ this.isOpenInfoConversation = false
511
+ this.logger.log('[CONVS-DETAIL] - initialize -> openInfoConversation ', this.openInfoConversation, ' -> isOpenInfoConversation ', this.isOpenInfoConversation)
508
512
  } else {
509
513
  this.logger.log('[CONVS-DETAIL] - initialize -> checkWindowWidthIsLessThan991px ', checkWindowWidthIsLessThan991px())
510
514
  this.openInfoConversation = true
511
- this.logger.log('[CONVS-DETAIL] - initialize -> openInfoConversation ', this.openInfoConversation)
515
+ this.isOpenInfoConversation = true
516
+ this.logger.log('[CONVS-DETAIL] - initialize -> openInfoConversation ', this.openInfoConversation, ' -> isOpenInfoConversation ', this.isOpenInfoConversation)
512
517
  }
513
518
  }
514
519
 
@@ -527,8 +532,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
527
532
  this.addEventsKeyboard()
528
533
  this.startConversation()
529
534
  this.updateConversationBadge() // AGGIORNO STATO DELLA CONVERSAZIONE A 'LETTA' (is_new = false)
530
-
531
- this.initializeTyping();
532
535
  }
533
536
 
534
537
  _getProjectIdByConversationWith(conversationWith: string) {
@@ -563,12 +566,22 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
563
566
  })
564
567
  }
565
568
 
569
+ returnOpenCloseInfoConversation(openInfoConversation: boolean) {
570
+ this.logger.log('[CONVS-DETAIL] returnOpenCloseInfoConversation - openInfoConversation ', openInfoConversation)
571
+ this.resizeTextArea()
572
+ this.openInfoMessage = false
573
+ this.openInfoConversation = openInfoConversation
574
+ this.isOpenInfoConversation = openInfoConversation
575
+ this.USER_HAS_OPENED_CLOSE_INFO_CONV = true
576
+ }
577
+
566
578
  @HostListener('window:resize', ['$event'])
567
579
  onResize(event: any) {
568
580
  const newInnerWidth = event.target.innerWidth
569
581
  if (newInnerWidth < 991) {
570
582
  if (this.USER_HAS_OPENED_CLOSE_INFO_CONV === false) {
571
583
  this.openInfoConversation = false
584
+ this.isOpenInfoConversation = false
572
585
  }
573
586
  }
574
587
  }
@@ -587,7 +600,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
587
600
  'LABEL_TO',
588
601
  'LABEL_LAST_ACCESS',
589
602
  'ARRAY_DAYS',
590
-
603
+ 'LABEL_IS_WRITING',
591
604
  'LABEL_INFO_ADVANCED',
592
605
  'ID_CONVERSATION',
593
606
  'UPLOAD_FILE_ERROR',
@@ -606,35 +619,11 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
606
619
  'THERE_ARE_NO_CANNED_RESPONSES_AVAILABLE',
607
620
  'TO_CREATE_THEM_GO_TO_THE_PROJECT',
608
621
  "AddNewCannedResponse",
609
- "LABEL_LOADING",
610
- "DIRECT_CHAT",
611
- "GROUP_CHAT",
612
- ]
613
-
614
- const keysHeader = [
615
- 'DIRECT_CHAT',
616
- 'GROUP_CHAT',
617
- 'LABEL_IS_WRITING',
618
- 'LABEL_ONLINE',
619
- 'LABEL_OFFLINE',
620
- 'LABEL_TODAY',
621
- 'LABEL_TOMORROW',
622
- 'LABEL_TO',
623
- 'LABEL_LAST_ACCESS',
624
- 'ARRAY_DAYS',
625
- 'Resolve',
626
- ]
627
-
628
- const keysContentDetail = [
629
- 'LABEL_OPEN_INFO_CONVERSATION',
630
- 'LABEL_CLOSE_GROUP',
631
- 'LABEL_IS_WRITING',
622
+ "LABEL_LOADING"
632
623
  ]
633
624
 
634
- this.translationsMap = this.customTranslateService.translateLanguage(keys)
635
- this.translationsHeaderMap = this.customTranslateService.translateLanguage(keysHeader)
636
- this.translationsContentMap = this.customTranslateService.translateLanguage(keysContentDetail)
637
- this.logger.log('[CONVS-DETAIL] x this.translationMap ',this.translationsMap)
625
+ this.translationMap = this.customTranslateService.translateLanguage(keys)
626
+ this.logger.log('[CONVS-DETAIL] x this.translationMap ',this.translationMap)
638
627
  }
639
628
 
640
629
  // --------------------------------------------------------
@@ -661,19 +650,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
661
650
  return this.customTranslateService.translateLanguage(keys)
662
651
  }
663
652
 
664
- private setStyleMap(){
665
- this.styleMap.set('themeColor', 'var(--basic-blue)')
666
- .set('bubbleReceivedBackground','var(--bck-msg-received)')
667
- .set('bubbleReceivedTextColor', 'var(--col-msg-received)')
668
- .set('bubbleSentBackground', 'var(--bck-msg-sent)')
669
- .set('bubbleSentTextColor', 'var(--col-msg-sent)')
670
- .set('buttonFontSize','var(--button-in-msg-font-size)')
671
- .set('buttonBackgroundColor', 'var(--buttonBackgroundColor)')
672
- .set('buttonTextColor', 'var(--buttonTextColor)')
673
- .set('buttonHoverBackgroundColor', 'var(--buttonHoverBackgroundColor)')
674
- .set('buttonHoverTextColor', 'var(--buttonHoverTextColor)')
675
-
676
- }
677
653
  // -------------------------------------------------------------------------------------
678
654
  // * retrieving the handler from chatManager
679
655
  // * if it DOESN'T EXIST I create a handler and connect and store it in the chatmanager
@@ -759,18 +735,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
759
735
  }
760
736
  }
761
737
 
762
- onConversationLoaded(conversation): ConversationModel{
763
- if(conversation.attributes && conversation.attributes['projectId']){
764
- let project = localStorage.getItem(conversation.attributes['projectId'])
765
- if(project){
766
- project = JSON.parse(project)
767
- conversation.attributes.project_name = project['name']
768
- }
769
-
770
- }
771
- return conversation
772
- }
773
-
774
738
  setHeaderContent() {
775
739
  // this.logger.log('[CONVS-DETAIL] - setHeaderContent conversationWith', this.conversationWith)
776
740
  // this.logger.log('[CONVS-DETAIL] - setHeaderContent conversationsHandlerService', this.conversationsHandlerService)
@@ -785,8 +749,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
785
749
  conv.conversation_with,
786
750
  conv.conversation_with_fullname,
787
751
  conv.channel_type,
788
- conv.attributes['projectId'],
789
- conv.attributes['project_name']
790
752
  )
791
753
  }
792
754
  if(!conv){
@@ -800,8 +762,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
800
762
  conv.conversation_with,
801
763
  conv.conversation_with_fullname,
802
764
  conv.channel_type,
803
- conv.attributes['projectId'],
804
- conv.attributes['project_name']
805
765
  )
806
766
  let duration = getDateDifference(conv.timestamp, Date.now())
807
767
  duration.days > 10? this.disableTextarea = true: this.disableTextarea = false
@@ -820,8 +780,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
820
780
  conv.conversation_with,
821
781
  conv.conversation_with_fullname,
822
782
  conv.channel_type,
823
- conv.attributes['projectId'],
824
- conv.attributes['project_name']
825
783
  )
826
784
  let duration = getDateDifference(conv.timestamp, Date.now())
827
785
  duration.days > 10? this.disableTextarea = true: this.disableTextarea = false
@@ -834,8 +792,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
834
792
  conv.conversation_with,
835
793
  conv.conversation_with_fullname,
836
794
  conv.channel_type,
837
- conv.attributes['projectId'],
838
- conv.attributes['project_name']
839
795
  )
840
796
  }
841
797
  this.logger.log('[CONVS-DETAIL] - setHeaderContent > conversationAvatar: ', this.conversationAvatar)
@@ -945,6 +901,37 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
945
901
  let subscription: any
946
902
  let subscriptionKey: string
947
903
 
904
+ // subscriptionKey = 'BSConversationsChanged'
905
+ // subscription = this.subscriptions.find((item) => item.key === subscriptionKey)
906
+ // if (!subscription) {
907
+ // subscription = this.conversationsHandlerService.conversationChanged.subscribe((data: ConversationModel) => {
908
+ // this.logger.log('[CONVS-DETAIL] subscribe BSConversationsChanged data ', data, ' this.loggedUser.uid:', this.loggedUser.uid)
909
+
910
+ // if (data && data.sender !== this.loggedUser.uid) {
911
+ // this.logger.log('[CONVS-DETAIL] subscribe to BSConversationsChange data sender ', data.sender)
912
+ // this.logger.log('[CONVS-DETAIL] subscribe to BSConversationsChange this.loggedUser.uid ', this.loggedUser.uid)
913
+ // this.logger.log('[CONVS-DETAIL] subscribe to BSConversationsChange is_new ', data.is_new)
914
+ // this.logger.log('[CONVS-DETAIL] subscribe to BSConversationsChange showButtonToBottom ', this.showButtonToBottom)
915
+ // // UPDATE THE CONVERSATION TO 'READ' IF IT IS ME WHO WRITES THE LAST MESSAGE OF THE CONVERSATION
916
+ // // AND IF THE POSITION OF THE SCROLL IS AT THE END
917
+ // if (!this.showButtonToBottom && data.is_new) {
918
+ // // ARE AT THE END
919
+ // this.updateConversationBadge()
920
+ // }
921
+ // if(data.uid === this.conversationWith){
922
+ // this.conversationAvatar = setConversationAvatar(
923
+ // data.conversation_with,
924
+ // data.conversation_with_fullname,
925
+ // data.channel_type,
926
+ // )
927
+ // }
928
+
929
+ // }
930
+ // })
931
+ // const subscribe = { key: subscriptionKey, value: subscription }
932
+ // this.subscriptions.push(subscribe)
933
+ // }
934
+
948
935
  subscriptionKey = 'messageAdded'
949
936
  subscription = this.subscriptions.find((item) => item.key === subscriptionKey)
950
937
  if (!subscription) {
@@ -994,22 +981,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
994
981
  this.subscriptions.push(subscribe)
995
982
  }
996
983
 
997
- subscriptionKey = 'conversationTyping';
998
- subscription = this.subscriptions.find(item => item.key === subscriptionKey);
999
- if (!subscription) {
1000
- subscription = this.typingService.BSIsTyping.pipe(takeUntil(this.unsubscribe$)).subscribe((data: any) => {
1001
- this.logger.debug('[CONVS-DETAIL] ***** BSIsTyping *****', data);
1002
- if (data) {
1003
- const isTypingUid = data.uid; //support-group-...
1004
- if (this.conversationWith === isTypingUid) {
1005
- that.subscribeTypings(data);
1006
- }
1007
- }
1008
- });
1009
- const subscribe = {key: subscriptionKey, value: subscription };
1010
- this.subscriptions.push(subscribe);
1011
- }
1012
-
1013
984
  // subscriptionKey = 'onGroupChange';
1014
985
  // subscription = this.subscriptions.find(item => item.key === subscriptionKey);
1015
986
  // if (!subscription) {
@@ -1030,6 +1001,18 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1030
1001
  // }
1031
1002
  }
1032
1003
 
1004
+ onConversationLoaded(conversation): ConversationModel{
1005
+ if(conversation.attributes && conversation.attributes['projectId']){
1006
+ let project = localStorage.getItem(conversation.attributes['projectId'])
1007
+ if(project){
1008
+ project = JSON.parse(project)
1009
+ conversation.attributes.project_name = project['name']
1010
+ }
1011
+ }
1012
+ return conversation
1013
+ }
1014
+
1015
+
1033
1016
  // -------------------------------------------------
1034
1017
  // addEventsKeyboard
1035
1018
  // -------------------------------------------------
@@ -1057,9 +1040,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1057
1040
  this.conversationAvatar = setConversationAvatar(
1058
1041
  this.conversationWith,
1059
1042
  this.conversationWithFullname,
1060
- this.channelType,
1061
- this.conversation.attributes['projectId'],
1062
- this.conversation.attributes['project_name']
1043
+ this.channelType
1063
1044
  )
1064
1045
 
1065
1046
  }
@@ -1236,6 +1217,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1236
1217
  this.logger.log('[CONVS-DETAIL] - returnChangeTextArea --> beforeSlash', beforeSlash)
1237
1218
  this.logger.log('[CONVS-DETAIL] - returnChangeTextArea --> afterSlash', afterSlash)
1238
1219
 
1220
+
1239
1221
  if(beforeSlash[beforeSlash.length-1].indexOf(' ') >= 0 && afterSlash === ''){
1240
1222
  this.HIDE_CANNED_RESPONSES = false
1241
1223
  } else if(beforeSlash[beforeSlash.length-1].indexOf(' ') < 0 && afterSlash === '' ){
@@ -1283,7 +1265,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1283
1265
 
1284
1266
  replaceTagInMessage(canned, event?) {
1285
1267
  const elTextArea = this.rowTextArea['el']
1286
- const textArea = elTextArea.getElementsByTagName('ion-textarea')[0] as HTMLInputElement;
1268
+ const textArea = elTextArea.getElementsByTagName('ion-textarea')[0]
1287
1269
  // console.log('[CONVS-DETAIL] replaceTagInMessage textArea ', textArea)
1288
1270
  // console.log('[CONVS-DETAIL] replaceTagInMessage textArea value', textArea.value,)
1289
1271
 
@@ -1298,17 +1280,20 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1298
1280
  // replace text
1299
1281
  var strTEMP = textArea.value.replace(/\/.*/ig, canned.text)
1300
1282
  strTEMP = this.replacePlaceholderInCanned(strTEMP)
1301
- this.logger.log('[CONVS-DETAIL] replaceTagInMessage strSearch ', strTEMP)
1283
+ this.logger.log('[CONVS-DETAIL] replaceTagInMessage strSearch before', strTEMP, textArea)
1302
1284
  // strTEMP = this.replacePlaceholderInCanned(strTEMP);
1303
1285
  // textArea.value = '';
1304
1286
  // that.messageString = strTEMP;
1305
1287
  textArea.value = strTEMP
1288
+ this.logger.log('[CONVS-DETAIL] replaceTagInMessage strSearch after', strTEMP, textArea)
1306
1289
  this.insertAtCursor(textArea, '')
1307
1290
  this.setCaretPosition(textArea)
1308
1291
  // setTimeout(() => {
1309
1292
  // // textArea.focus();
1293
+ // textArea.selectionEnd = textArea.value.length;
1310
1294
  // textArea.setFocus()
1311
1295
  // // this.resizeTextArea()
1296
+ // // this.setCaretPosition(textArea)
1312
1297
  // }, 200)
1313
1298
 
1314
1299
  }
@@ -1352,7 +1337,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1352
1337
  if(elTextArea){
1353
1338
  // console.log("[CONVS-DETAIL] onClickOpenCannedResponses textArea value", textArea.value)
1354
1339
  var lastChar = textArea.value[textArea.value.length - 1]
1355
- this.logger.log('[CONVS-DETAIL] onClickOpenCannedResponses lastChar --- textArea ', lastChar, textArea)
1340
+ this.logger.log('[CONVS-DETAIL] onClickOpenCannedResponses lastChar --- textArea ', lastChar, textArea)
1356
1341
  if (lastChar !== '/') {
1357
1342
  this.insertAtCursor(textArea, '/')
1358
1343
  }
@@ -1532,13 +1517,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1532
1517
  }
1533
1518
  }
1534
1519
 
1535
- onOpenCloseInfoConversation(event){
1536
- this.logger.log('[CONVS-DETAIL] onOpenCloseInfoConversation - openInfoConversation ', event)
1537
- this.resizeTextArea()
1538
- this.openInfoConversation = event
1539
- this.USER_HAS_OPENED_CLOSE_INFO_CONV = true
1540
- }
1541
-
1542
1520
  // -------------- START SCROLL/RESIZE -------------- //
1543
1521
  /** */
1544
1522
  resizeTextArea() {
@@ -1640,7 +1618,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1640
1618
  this.heightMessageTextArea = '57' // NK edited
1641
1619
  }
1642
1620
  }
1643
-
1644
1621
  checkAcceptedFile(draggedFileMimeType) {
1645
1622
  let isAcceptFile = false
1646
1623
  this.logger.log('[CONVS-DETAIL] > checkAcceptedFile - fileUploadAccept: ',this.appConfigProvider.getConfig().fileUploadAccept)
@@ -1662,17 +1639,26 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1662
1639
  if (accept_file_segment[1] === '*') {
1663
1640
  if (draggedFileMimeType.startsWith(accept_file_segment[0])) {
1664
1641
  isAcceptFile = true
1665
- this.logger.log('[CONVS-DETAIL] > checkAcceptedFile - fileUploadAccept isAcceptFile',isAcceptFile)
1642
+ this.logger.log(
1643
+ '[CONVS-DETAIL] > checkAcceptedFile - fileUploadAccept isAcceptFile',
1644
+ isAcceptFile,
1645
+ )
1666
1646
  return isAcceptFile
1667
1647
  } else {
1668
1648
  isAcceptFile = false
1669
- this.logger.log('[CONVS-DETAIL] > checkAcceptedFile - fileUploadAccept isAcceptFile',isAcceptFile)
1649
+ this.logger.log(
1650
+ '[CONVS-DETAIL] > checkAcceptedFile - fileUploadAccept isAcceptFile',
1651
+ isAcceptFile,
1652
+ )
1670
1653
  return isAcceptFile
1671
1654
  }
1672
1655
  } else if (accept_file_segment[1] !== '*') {
1673
1656
  if (draggedFileMimeType === accept_file) {
1674
1657
  isAcceptFile = true
1675
- this.logger.log('[CONVS-DETAIL] > checkAcceptedFile - fileUploadAccept isAcceptFile',isAcceptFile)
1658
+ this.logger.log(
1659
+ '[CONVS-DETAIL] > checkAcceptedFile - fileUploadAccept isAcceptFile',
1660
+ isAcceptFile,
1661
+ )
1676
1662
  return isAcceptFile
1677
1663
  }
1678
1664
  }
@@ -1682,64 +1668,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1682
1668
  }
1683
1669
  }
1684
1670
 
1685
-
1686
- initializeTyping() {
1687
- this.logger.debug('[CONVS-DETAIL] membersconversation', this.membersConversation)
1688
- if(this.loggedUser){
1689
- this.membersConversation.push(this.loggedUser.uid)
1690
- //this.setSubscriptions();
1691
- this.typingService.isTyping(this.conversationWith, this.loggedUser.uid, this.isDirect);
1692
- }
1693
- }
1694
-
1695
- /** */
1696
- subscribeTypings(data: any) {
1697
- const that = this;
1698
- try {
1699
- const key = data.uidUserTypingNow;
1700
- const waitTime = data.waitTime
1701
- this.nameUserTypingNow = null;
1702
- this.idUserTypingNow = null;
1703
-
1704
- if (data.nameUserTypingNow) {
1705
- this.nameUserTypingNow = data.nameUserTypingNow;
1706
- }
1707
- if (data.uidUserTypingNow){
1708
- this.idUserTypingNow = data.uidUserTypingNow
1709
- }
1710
- this.logger.debug('[CONV-COMP] subscribeTypings data:', data);
1711
- const userTyping = this.membersConversation.includes(key);
1712
- if ( !userTyping && key) {
1713
- this.isTypings = true;
1714
- setTimeout(function () {
1715
- that.scrollBottom(0)
1716
- }, 0);
1717
- // clearTimeout(this.setTimeoutWritingMessages);
1718
- this.setTimeoutWritingMessages = setTimeout(() => {
1719
- that.isTypings = false;
1720
- }, waitTime);
1721
- // this.initiTimeout(waitTime)
1722
- }
1723
- } catch (error) {
1724
- this.logger.error('[CONV-COMP] error: ', error);
1725
- }
1726
-
1727
- }
1728
-
1729
- initiTimeout(waitTime){
1730
- const that = this;
1731
- this.setTimeoutWritingMessages = setTimeout(() => {
1732
- that.isTypings = false;
1733
- }, waitTime);
1734
- }
1735
-
1736
- resetTimeout(){
1737
- this.isTypings = false
1738
- this.setTimeoutWritingMessages = null;
1739
- clearTimeout(this.setTimeoutWritingMessages)
1740
- }
1741
-
1742
-
1743
1671
  segmentNewAgentMessage(conversation: ConversationModel){
1744
1672
  let user = this.loggedUser
1745
1673
  try {
@@ -1786,7 +1714,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1786
1714
  this.logger.error('Event:Message Sent [group] error', err);
1787
1715
  }
1788
1716
  }
1789
-
1717
+
1790
1718
  // -------------------------------------------------------------
1791
1719
  // DRAG FILE
1792
1720
  // -------------------------------------------------------------
@@ -1846,7 +1774,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
1846
1774
 
1847
1775
  async presentToastOnlyImageFilesAreAllowedToDrag() {
1848
1776
  const toast = await this.toastController.create({
1849
- message: this.translationsMap.get('FAILED_TO_UPLOAD_THE_FORMAT_IS_NOT_SUPPORTED'),
1777
+ message: this.translationMap.get('FAILED_TO_UPLOAD_THE_FORMAT_IS_NOT_SUPPORTED'),
1850
1778
  duration: 5000,
1851
1779
  color: 'danger',
1852
1780
  cssClass: 'toast-custom-class',
@@ -1,38 +1,35 @@
1
- <ion-header no-border class="ion-no-border" [class.mobile]="isMobile">
2
- <header-conversations-list *ngIf="conversationType ==='active'"
1
+ <ion-header no-border class="ion-no-border">
2
+ <app-ddp-header *ngIf="conversationType ==='active'"
3
3
  [numberOpenConv]="numberOpenConv"
4
4
  [supportMode]="supportMode"
5
5
  [archived_btn]="archived_btn"
6
6
  [writeto_btn]="writeto_btn"
7
7
  [sound_btn]="sound_btn"
8
- [isMobile]="isMobile"
9
8
  (onSoundChange)="onSoundChange($event)"
10
9
  (openContactsDirectory)=openContactsDirectory($event)
11
10
  (openProfileInfo)=openProfileInfo($event)>
12
- </header-conversations-list>
11
+ </app-ddp-header>
13
12
 
14
- <header-conversations-list-archived *ngIf="conversationType !=='active'"
13
+ <app-option-header *ngIf="conversationType !=='active'"
15
14
  [headerTitle]=headerTitle
16
- [isMobile]="isMobile"
17
15
  (onBackButton)=onBackButtonFN($event)>
18
- </header-conversations-list-archived>
16
+ </app-option-header>
19
17
  </ion-header>
20
-
21
18
  <!-- appScrollbarTheme -->
22
- <ion-content id="convs-list" #ioncontentconvlist class="list-avatar-page" [class.mobile]="isMobile">
19
+ <ion-content id="convs-list" #ioncontentconvlist class="list-avatar-page" >
23
20
  <!-- class="ps" style="position: relative; max-width: 600px; max-height: 100%;" [perfectScrollbar]="config" -->
24
21
  <div id="scrollbar2">
25
22
  <ion-list>
26
23
 
27
24
  <!-- supportMode && -->
28
- <ion-item *ngIf="displayNewConvsItem && conversationType !=='archived' && supportMode" class="ion-no-padding open-iframe-item" lines="none">
25
+ <ion-item *ngIf="displayNewConvsItem && conversationType !=='archived' && supportMode" class="ion-no-padding open-iframe-item">
29
26
  <div tabindex="0"></div>
30
27
  <!-- <ion-note class="pinned-project">
31
28
  {{ 'PINNED_PROJECT' | translate }}
32
29
  </ion-note> -->
33
30
 
34
31
  <app-project-item
35
- style="width: 100%; margin: 0px 8px; border-bottom: 1px dashed #d3dbe5;"
32
+ style="width: 100%;"
36
33
  (openUnsevedConvsEvent)="openUnsevedConversationIframe($event)"
37
34
  (projectIdEvent)="getLastProjectId($event)">
38
35
  </app-project-item>
@@ -4,10 +4,6 @@ ion-header {
4
4
  border-bottom-style: solid;
5
5
  border-color: var(--light-gray);
6
6
  border-bottom-width: thin;
7
- &:not(.mobile){
8
- border: none;
9
- background: var(--list-bkg-color);
10
- }
11
7
  }
12
8
 
13
9
  ion-content {
@@ -15,9 +11,6 @@ ion-content {
15
11
  --offset-bottom: auto!important;
16
12
  --overflow: hidden;
17
13
  overflow: scroll;
18
- &:not(.mobile){
19
- background: var(--list-bkg-color);
20
- }
21
14
 
22
15
  &::-webkit-scrollbar {
23
16
  width: 6px;
@@ -47,11 +40,10 @@ ion-list {
47
40
  list-style-type: none;
48
41
  margin: 0;
49
42
  padding: 0;
50
- background: transparent;
51
43
 
52
44
  ion-item {
53
45
  cursor: pointer;
54
- // height: 64px;
46
+ height: 64px;
55
47
  position: relative;
56
48
  display: flex;
57
49
  text-decoration: none;
@@ -59,7 +51,6 @@ ion-list {
59
51
  padding-right: 8px;
60
52
  --padding-start: 0;
61
53
  --inner-padding-end: 0;
62
- --background: transparent;
63
54
  .selected {
64
55
  border-radius: 10px;
65
56
  padding-left: 8px;
@@ -333,7 +324,7 @@ ion-list {
333
324
  padding-left: 0px !important ;
334
325
  padding-right: 0px !important;
335
326
  // height: 55px !important;
336
- // border-bottom: 1px solid rgba(0, 0, 0, 0.05);
327
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
337
328
  --background-hover: #ffffff;
338
329
  cursor:default !important;
339
330
  }