@chat21/chat21-ionic 3.0.85 → 3.0.86-rc.2

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 (171) hide show
  1. package/CHANGELOG.md +121 -4
  2. package/README.md +2 -2
  3. package/package.json +4 -3
  4. package/src/app/app-routing.module.ts +7 -2
  5. package/src/app/app.component.html +7 -1
  6. package/src/app/app.component.scss +20 -2
  7. package/src/app/app.component.ts +131 -20
  8. package/src/app/app.module.ts +8 -3
  9. package/src/app/chatlib/conversation-detail/conversation-content/conversation-content.component.ts +11 -4
  10. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +86 -23
  11. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.scss +188 -88
  12. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.ts +42 -3
  13. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.html +11 -24
  14. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.scss +6 -10
  15. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.spec.ts +2 -2
  16. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +16 -26
  17. package/src/app/chatlib/conversation-detail/message/buttons/action-button/action-button.component.html +5 -1
  18. package/src/app/chatlib/conversation-detail/message/buttons/action-button/action-button.component.scss +22 -15
  19. package/src/app/chatlib/conversation-detail/message/buttons/action-button/action-button.component.ts +25 -5
  20. package/src/app/chatlib/conversation-detail/message/buttons/link-button/link-button.component.html +2 -1
  21. package/src/app/chatlib/conversation-detail/message/buttons/link-button/link-button.component.scss +14 -15
  22. package/src/app/chatlib/conversation-detail/message/buttons/link-button/link-button.component.ts +24 -5
  23. package/src/app/chatlib/conversation-detail/message/buttons/text-button/text-button.component.html +6 -1
  24. package/src/app/chatlib/conversation-detail/message/buttons/text-button/text-button.component.scss +12 -13
  25. package/src/app/chatlib/conversation-detail/message/buttons/text-button/text-button.component.ts +26 -5
  26. package/src/app/chatlib/conversation-detail/message/frame/frame.component.html +8 -2
  27. package/src/app/chatlib/conversation-detail/message/frame/frame.component.scss +36 -0
  28. package/src/app/chatlib/conversation-detail/message/frame/frame.component.ts +2 -2
  29. package/src/app/chatlib/conversation-detail/message/html/html.component.ts +0 -1
  30. package/src/app/chatlib/conversation-detail/message/image/image.component.html +3 -2
  31. package/src/app/chatlib/conversation-detail/message/image/image.component.scss +17 -5
  32. package/src/app/chatlib/conversation-detail/message/image/image.component.ts +1 -1
  33. package/src/app/chatlib/conversation-detail/message/info-message/info-message.component.scss +3 -2
  34. package/src/app/chatlib/conversation-detail/message/message-attachment/message-attachment.component.html +16 -6
  35. package/src/app/chatlib/conversation-detail/message/message-attachment/message-attachment.component.scss +1 -3
  36. package/src/app/chatlib/conversation-detail/message/message-attachment/message-attachment.component.ts +2 -0
  37. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +78 -52
  38. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.scss +63 -20
  39. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +14 -10
  40. package/src/app/components/canned-response/canned-response.component.html +9 -9
  41. package/src/app/components/canned-response/canned-response.component.scss +14 -7
  42. package/src/app/components/canned-response/canned-response.component.ts +5 -4
  43. package/src/app/components/contacts-directory/contacts-directory.component.html +22 -26
  44. package/src/app/components/contacts-directory/contacts-directory.component.scss +8 -6
  45. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +64 -47
  46. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.scss +98 -61
  47. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.ts +24 -44
  48. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component_2.html +116 -0
  49. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html +39 -42
  50. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.scss +67 -4
  51. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +82 -154
  52. package/src/app/components/conversation-info/info-content/info-content.component.html +23 -2
  53. package/src/app/components/conversation-info/info-content/info-content.component.ts +5 -6
  54. package/src/app/components/conversation-info/info-direct/info-direct.component.html +7 -14
  55. package/src/app/components/conversation-info/info-direct/info-direct.component.scss +23 -0
  56. package/src/app/components/conversation-info/info-direct/info-direct.component.ts +1 -6
  57. package/src/app/components/conversation-info/info-group/info-group.component.html +44 -108
  58. package/src/app/components/conversation-info/info-group/info-group.component.scss +101 -61
  59. package/src/app/components/conversation-info/info-group/info-group.component.ts +1 -0
  60. package/src/app/components/conversation-info/info-support-group/info-support-group.component.html +2 -1
  61. package/src/app/components/conversation-info/info-support-group/info-support-group.component.ts +0 -1
  62. package/src/app/components/{ddp-header/ddp-header.component.html → conversations-list/header-conversations-list/header-conversations-list.component.html} +3 -3
  63. package/src/app/components/{ddp-header/ddp-header.component.scss → conversations-list/header-conversations-list/header-conversations-list.component.scss} +16 -4
  64. package/src/app/components/{conversation-detail/bubble-my-message/bubble-my-message.component.spec.ts → conversations-list/header-conversations-list/header-conversations-list.component.spec.ts} +6 -6
  65. package/src/app/components/{ddp-header/ddp-header.component.ts → conversations-list/header-conversations-list/header-conversations-list.component.ts} +7 -16
  66. package/src/app/components/conversations-list/header-conversations-list-archived/header-conversations-list-archived.component.html +12 -0
  67. package/src/app/components/conversations-list/header-conversations-list-archived/header-conversations-list-archived.component.scss +14 -0
  68. package/src/app/components/{conversation-detail/option-header/option-header.component.spec.ts → conversations-list/header-conversations-list-archived/header-conversations-list-archived.component.spec.ts} +5 -5
  69. package/src/app/components/{conversation-detail/option-header/option-header.component.ts → conversations-list/header-conversations-list-archived/header-conversations-list-archived.component.ts} +5 -4
  70. package/src/app/components/navbar/navbar.component.html +103 -0
  71. package/src/app/components/navbar/navbar.component.scss +249 -0
  72. package/src/app/components/{ddp-header/ddp-header.component.spec.ts → navbar/navbar.component.spec.ts} +6 -6
  73. package/src/app/components/navbar/navbar.component.ts +195 -0
  74. package/src/app/components/project-item/project-item.component.html +98 -149
  75. package/src/app/components/project-item/project-item.component.scss +43 -35
  76. package/src/app/components/project-item/project-item.component.ts +16 -4
  77. package/src/app/components/sidebar-user-details/sidebar-user-details.component.html +5 -5
  78. package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +24 -13
  79. package/src/app/components/utils/user-presence/user-presence.component.html +7 -2
  80. package/src/app/components/utils/user-presence/user-presence.component.scss +35 -18
  81. package/src/app/components/utils/user-presence/user-presence.component.ts +6 -10
  82. package/src/app/{pages → modals}/create-canned-response/create-canned-response-routing.module.ts +0 -0
  83. package/src/app/{pages → modals}/create-canned-response/create-canned-response.module.ts +0 -0
  84. package/src/app/{pages → modals}/create-canned-response/create-canned-response.page.html +0 -0
  85. package/src/app/{pages → modals}/create-canned-response/create-canned-response.page.scss +0 -0
  86. package/src/app/{pages → modals}/create-canned-response/create-canned-response.page.spec.ts +0 -0
  87. package/src/app/{pages → modals}/create-canned-response/create-canned-response.page.ts +13 -13
  88. package/src/app/{pages → modals}/loader-preview/loader-preview-routing.module.ts +0 -0
  89. package/src/app/{pages → modals}/loader-preview/loader-preview.module.ts +0 -0
  90. package/src/app/{pages → modals}/loader-preview/loader-preview.page.html +1 -1
  91. package/src/app/{pages → modals}/loader-preview/loader-preview.page.scss +4 -0
  92. package/src/app/{pages → modals}/loader-preview/loader-preview.page.spec.ts +0 -0
  93. package/src/app/{pages → modals}/loader-preview/loader-preview.page.ts +1 -2
  94. package/src/app/modals/send-email/send-email-routing.module.ts +17 -0
  95. package/src/app/modals/send-email/send-email.module.ts +31 -0
  96. package/src/app/modals/send-email/send-email.page.html +46 -0
  97. package/src/app/modals/send-email/send-email.page.scss +161 -0
  98. package/src/app/modals/send-email/send-email.page.spec.ts +24 -0
  99. package/src/app/modals/send-email/send-email.page.ts +89 -0
  100. package/src/app/pages/contacts-directory/contacts-directory.page.html +1 -1
  101. package/src/app/pages/contacts-directory/contacts-directory.page.scss +47 -0
  102. package/src/app/pages/contacts-directory/contacts-directory.page.ts +2 -0
  103. package/src/app/pages/conversation-detail/conversation-detail.module.ts +0 -8
  104. package/src/app/pages/conversation-detail/conversation-detail.page.html +48 -27
  105. package/src/app/pages/conversation-detail/conversation-detail.page.scss +45 -254
  106. package/src/app/pages/conversation-detail/conversation-detail.page.ts +330 -138
  107. package/src/app/pages/conversations-list/conversations-list.page.html +11 -8
  108. package/src/app/pages/conversations-list/conversations-list.page.scss +18 -2
  109. package/src/app/pages/conversations-list/conversations-list.page.ts +26 -24
  110. package/src/app/pages/profile-info/profile-info.page.html +2 -4
  111. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.html +1 -1
  112. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.scss +42 -0
  113. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.ts +1 -0
  114. package/src/app/services/canned-responses/canned-responses.service.ts +26 -0
  115. package/src/app/services/projects/projects.service.spec.ts +12 -0
  116. package/src/app/services/projects/projects.service.ts +43 -0
  117. package/src/app/services/tiledesk/tiledesk.service.ts +33 -17
  118. package/src/app/shared/shared.module.ts +24 -33
  119. package/src/app/utils/toast.spec.ts +7 -0
  120. package/src/app/utils/toast.ts +48 -0
  121. package/src/assets/i18n/ar.json +288 -265
  122. package/src/assets/i18n/az.json +24 -1
  123. package/src/assets/i18n/de.json +25 -2
  124. package/src/assets/i18n/en.json +25 -2
  125. package/src/assets/i18n/es.json +26 -3
  126. package/src/assets/i18n/fr.json +24 -1
  127. package/src/assets/i18n/it.json +24 -1
  128. package/src/assets/i18n/kk.json +25 -2
  129. package/src/assets/i18n/pt.json +25 -2
  130. package/src/assets/i18n/ru.json +24 -1
  131. package/src/assets/i18n/sr.json +287 -264
  132. package/src/assets/i18n/sv.json +25 -2
  133. package/src/assets/i18n/tr.json +25 -2
  134. package/src/assets/i18n/uk.json +25 -2
  135. package/src/assets/i18n/uz.json +24 -1
  136. package/src/assets/js/chat21client.js +1 -1
  137. package/src/assets/sounds/interface-start.mp3 +0 -0
  138. package/src/assets/sounds/wheep-wheep.mp3 +0 -0
  139. package/src/chat-config-mqtt-localhost.json +2 -2
  140. package/src/chat-config-native-mqtt.json +3 -0
  141. package/src/chat21-core/models/conversation.ts +0 -1
  142. package/src/chat21-core/models/projects.ts +27 -0
  143. package/src/chat21-core/providers/firebase/firebase-typing.service.ts +7 -9
  144. package/src/chat21-core/providers/logger/customLogger.ts +1 -1
  145. package/src/chat21-core/providers/mqtt/mqtt-auth-service.ts +7 -8
  146. package/src/chat21-core/utils/constants.ts +7 -1
  147. package/src/chat21-core/utils/convertRequestToConversation.ts +41 -0
  148. package/src/chat21-core/utils/user-typing/user-typing.component.html +8 -5
  149. package/src/chat21-core/utils/user-typing/user-typing.component.scss +87 -17
  150. package/src/chat21-core/utils/user-typing/user-typing.component.ts +12 -94
  151. package/src/chat21-core/utils/utils.ts +41 -11
  152. package/src/global.scss +59 -255
  153. package/src/index.html +0 -9
  154. package/src/variables.scss +30 -10
  155. package/src/app/components/conversation-detail/bubble-day-message/bubble-day-message.component.html +0 -3
  156. package/src/app/components/conversation-detail/bubble-day-message/bubble-day-message.component.scss +0 -21
  157. package/src/app/components/conversation-detail/bubble-day-message/bubble-day-message.component.spec.ts +0 -24
  158. package/src/app/components/conversation-detail/bubble-day-message/bubble-day-message.component.ts +0 -14
  159. package/src/app/components/conversation-detail/bubble-my-message/bubble-my-message.component.html +0 -54
  160. package/src/app/components/conversation-detail/bubble-my-message/bubble-my-message.component.scss +0 -98
  161. package/src/app/components/conversation-detail/bubble-my-message/bubble-my-message.component.ts +0 -84
  162. package/src/app/components/conversation-detail/bubble-others-message/bubble-others-message.component.html +0 -30
  163. package/src/app/components/conversation-detail/bubble-others-message/bubble-others-message.component.scss +0 -83
  164. package/src/app/components/conversation-detail/bubble-others-message/bubble-others-message.component.spec.ts +0 -24
  165. package/src/app/components/conversation-detail/bubble-others-message/bubble-others-message.component.ts +0 -68
  166. package/src/app/components/conversation-detail/bubble-system-message/bubble-system-message.component.html +0 -3
  167. package/src/app/components/conversation-detail/bubble-system-message/bubble-system-message.component.scss +0 -10
  168. package/src/app/components/conversation-detail/bubble-system-message/bubble-system-message.component.spec.ts +0 -24
  169. package/src/app/components/conversation-detail/bubble-system-message/bubble-system-message.component.ts +0 -14
  170. package/src/app/components/conversation-detail/option-header/option-header.component.html +0 -13
  171. package/src/app/components/conversation-detail/option-header/option-header.component.scss +0 -0
@@ -52,8 +52,19 @@
52
52
  <!-- ----------------------------------------------------------- -->
53
53
  <!-- nk - no tag ionic -->
54
54
  <!-- ----------------------------------------------------------- -->
55
+ <div class="manage_conversation_info_container" [ngClass]="{'close': !openInfoConversation, 'mobile': isMobile}">
56
+ <ion-button fill="clear" *ngIf="openInfoConversation" (click)="onOpenCloseInfoConversationFN()">
57
+ <ion-icon name="arrow-forward-outline"></ion-icon>
58
+ {{translationMap.get('LABEL_CLOSE_GROUP')}}
59
+ </ion-button>
60
+ <ion-button fill="clear" *ngIf="!openInfoConversation" (click)="onOpenCloseInfoConversationFN()">
61
+ <ion-icon name="arrow-back-outline"></ion-icon>
62
+ {{translationMap.get('LABEL_OPEN_INFO_CONVERSATION')}}
63
+ </ion-button>
64
+ </div>
55
65
 
56
66
  <div class="conversation-wpr" style="height: 100%;">
67
+
57
68
  <div *ngFor="let message of messages; let i = index; let first = first; trackBy: trackByFn">
58
69
 
59
70
  <ng-container *ngIf="first || (messages[i - 1].timestamp | date:'d') !== (message.timestamp | date:'d')">
@@ -77,20 +88,39 @@
77
88
  <!-- message SENDER:: -->
78
89
  <div role="messaggio" *ngIf="messageType(MESSAGE_TYPE_MINE, message)" class="msg_container base_sent">
79
90
 
91
+ <div class="message-date-hover"> {{message.timestamp | date:'HH:mm' }} </div>
92
+
93
+ <ng-container *ngIf="areVisibleCAR && supportMode">
94
+ <ion-button shape="round" size="small" class="btn-add-msg canned" ion-button fill="clear"
95
+ (click)="presentCreateCannedResponseModal(message)" [tooltip]="addAsCannedResponseTooltipText"
96
+ [options]="tooltipOptions" placement="bottom">
97
+ <ion-icon slot="icon-only" name="flash-outline" style="font-size: 1em;"> </ion-icon>
98
+ <span class="add-canned-response-add-icon">+</span>
99
+ </ion-button>
100
+ </ng-container>
101
+
80
102
  <!--backgroundColor non viene ancora usato -->
81
- <chat-bubble-message class="messages msg_sent" id="message_msg_sent" style="position: relative;"
103
+ <div style="display: contents;">
104
+
105
+ <div class="email-logo" *ngIf="message?.attributes?.channel && message?.attributes?.channel === TYPE_MSG_EMAIL">
106
+ <ion-icon name="mail"></ion-icon>
107
+ </div>
108
+
109
+ <chat-bubble-message class="messages msg_sent" id="message_msg_sent" style="position: relative;"
82
110
  [ngClass]="{'has-metadata': (isImage(message) || isFrame(message)), 'privateMsg': (message?.attributes && message?.attributes?.subtype === 'private')}"
111
+ [class.no-background]="(isImage(message) || isFrame(message)) && message?.text.trim() === '' "
83
112
  [class.emoticon]="isEmojii(message?.text)"
113
+ [ngStyle]="{'background': stylesMap.get('bubbleSentBackground'), 'color': stylesMap.get('bubbleSentTextColor')}"
84
114
  [ngClass]="{'button-in-msg' : message.metadata && message.metadata.button}"
85
115
  [message]="message"
86
- [textColor]="'col-msg-sent'"
87
- [addAsCannedResponseTooltipText]="addAsCannedResponseTooltipText"
88
- [areVisibleCAR]="areVisibleCAR"
89
- [supportMode]="supportMode"
116
+ [fontColor]="stylesMap.get('bubbleSentTextColor')"
117
+ [fontSize]="stylesMap.get('fontSize')"
118
+ [fontFamily]="stylesMap.get('fontFamily')"
90
119
  (onBeforeMessageRender)="onBeforeMessageRenderFN($event)"
91
120
  (onAfterMessageRender)="onAfterMessageRenderFN($event)"
92
121
  (onElementRendered)="onElementRenderedFN($event)">
93
122
  </chat-bubble-message>
123
+ </div>
94
124
 
95
125
  <!-- icon status message -->
96
126
  <chat-return-receipt
@@ -99,15 +129,18 @@
99
129
  [senderId]="senderId">
100
130
  </chat-return-receipt>
101
131
 
102
- </div>
132
+
103
133
 
104
- <!-- message RECIPIENT:: -->
105
- <div role="messaggio" *ngIf="messageType(MESSAGE_TYPE_OTHERS, message) && isChannelTypeGroup(channelType) && !isSameSender(message?.sender, i)"
106
- class="message_sender_fullname">
107
- {{message.sender_fullname}}
108
134
  </div>
109
135
 
110
-
136
+ <!-- message RECIPIENT + TIME :: -->
137
+ <!-- <div class="msg_container base_receive" *ngIf="messageType(MESSAGE_TYPE_OTHERS, message) && isChannelTypeGroup(channelType) && !isSameSender(message?.sender, i)">
138
+ <div role="messaggio" class="message_sender_fullname">
139
+ {{message.sender_fullname}}
140
+ </div>
141
+ <div class="message-date"> {{message.timestamp | date:'HH:mm' }} </div>
142
+ </div> -->
143
+ <!-- message RECIPIENT :: -->
111
144
  <div role="messaggio" *ngIf="messageType(MESSAGE_TYPE_OTHERS, message)" class="msg_container base_receive">
112
145
 
113
146
  <!-- <chat-avatar-image class="slide-in-left"
@@ -117,19 +150,38 @@
117
150
  </chat-avatar-image> -->
118
151
 
119
152
  <!--backgroundColor non viene ancora usato -->
120
-
121
- <chat-bubble-message class="messages msg_receive" id="message_msg_receive" style="position: relative;"
153
+ <chat-bubble-message class="messages msg_receive" id="message_msg_receive"
122
154
  [ngClass]="{'has-metadata': (isImage(message) || isFrame(message)), 'privateMsg': (message?.attributes && message?.attributes?.subtype === 'private')}"
155
+ [class.no-background]="(isImage(message) || isFrame(message)) && message?.text.trim() === '' "
123
156
  [class.emoticon]="isEmojii(message?.text)"
157
+ [ngStyle]="{'background': stylesMap?.get('bubbleReceivedBackground'), 'color': stylesMap.get('bubbleReceivedTextColor')}"
158
+ [isSameSender]="isSameSender(message?.sender, i)"
124
159
  [message]="message"
125
- [textColor]="'black'"
126
- [addAsCannedResponseTooltipText]="addAsCannedResponseTooltipText"
127
- [areVisibleCAR]="areVisibleCAR"
128
- [supportMode]="supportMode"
160
+ [fontColor]="stylesMap?.get('bubbleReceivedTextColor')"
161
+ [fontSize]="stylesMap?.get('fontSize')"
162
+ [fontFamily]="stylesMap?.get('fontFamily')"
129
163
  (onBeforeMessageRender)="onBeforeMessageRenderFN($event)"
130
164
  (onAfterMessageRender)="onAfterMessageRenderFN($event)"
131
165
  (onElementRendered)="onElementRenderedFN($event)">
132
166
  </chat-bubble-message>
167
+
168
+ <ng-container *ngIf="areVisibleCAR && supportMode">
169
+ <ion-button shape="round" size="small" class="btn-add-msg canned" ion-button fill="clear"
170
+ (click)="presentCreateCannedResponseModal(message)" [tooltip]="addAsCannedResponseTooltipText"
171
+ [options]="tooltipOptions" placement="bottom">
172
+ <ion-icon slot="icon-only" name="flash-outline" style="font-size: 1em;"> </ion-icon>
173
+ <span class="add-canned-response-add-icon">+</span>
174
+ </ion-button>
175
+ </ng-container>
176
+ <!-- <ng-container *ngIf="supportMode">
177
+ <ion-button shape="round" size="small" class="btn-add-msg emoji" ion-button fill="clear"
178
+ (click)="presentEmojiiModal()" tooltip="{{addAsCannedResponseTooltipText}}"
179
+ [options]="tooltipOptions" placement="bottom">
180
+ <ion-icon slot="icon-only" name="happy-outline" style="font-size: 1em;"> </ion-icon>
181
+ </ion-button>
182
+ </ng-container> -->
183
+
184
+ <div class="message-date-hover" *ngIf="isChannelTypeGroup(channelType)"> {{message.timestamp | date:'HH:mm' }} </div>
133
185
  </div>
134
186
 
135
187
  <!-- message type:: button && -->
@@ -147,15 +199,26 @@
147
199
 
148
200
  <!-- uploadProgress -> {{ uploadProgress }} -->
149
201
  <div *ngIf="uploadProgress !== 100" class="msg_container base_sent" style="margin-right: 20px;">
150
- <div class="messages msg_sent">
151
- <div class="spinner">
152
- <div class="bounce1"></div>
153
- <div class="bounce2"></div>
154
- <div class="bounce3"></div>
155
- </div>
202
+ <div class="chat21-spinner active" id="chat21-spinner" style="margin: 0px 6px 0px;">
203
+ <div class="chat21-bounce1" [ngStyle]="{'background-color': stylesMap.get('themeColor')}"></div>
204
+ <div class="chat21-bounce2" [ngStyle]="{'background-color': stylesMap.get('themeColor'), 'opacity': 0.4}"></div>
205
+ <div class="chat21-bounce3" [ngStyle]="{'background-color': stylesMap.get('themeColor'), 'opacity': 0.6}"></div>
206
+ <!-- <span [ngStyle]="{'color': stylesMap.get('themeColor')}">{{translationMap.get('LABEL_LOADING')}}</span> -->
156
207
  </div>
157
208
  </div>
158
209
 
210
+ <div *ngIf="isTypings" class="msg_container base_receive typing_container">
211
+ <!-- !isSameSender(idUserTypingNow, i) -->
212
+ <!-- <div *ngIf="nameUserTypingNow">{{nameUserTypingNow}}</div> -->
213
+ <user-typing
214
+ [themeColor]="stylesMap?.get('themeColor')"
215
+ [translationMap]="translationMap"
216
+ [idUserTypingNow]="idUserTypingNow"
217
+ [nameUserTypingNow]="nameUserTypingNow">
218
+ </user-typing>
219
+ <div class="typing_info" *ngIf="nameUserTypingNow"> {{nameUserTypingNow}} {{translationMap.get('LABEL_IS_WRITING')}}</div>
220
+ </div>
221
+
159
222
  </div>
160
223
 
161
224
  <!-- fileType > {{fileType }} uploadProgress {{uploadProgress}} -->
@@ -33,6 +33,60 @@
33
33
  }
34
34
  }
35
35
 
36
+ .manage_conversation_info_container{
37
+ height: 34px;
38
+ display: flex;
39
+ -webkit-box-align: center;
40
+ align-items: center;
41
+ position: fixed;
42
+ transition: transform 300ms ease-in-out 0s;
43
+ transform: translate(0px);
44
+ right: 320px;
45
+ top: 60px;
46
+ z-index:2;
47
+ background: linear-gradient(to right, rgba(226, 232, 239, 0) 128px, rgb(226, 232, 239) 128px);
48
+
49
+ &.close{
50
+ right: var(--padding-conversation-detail);
51
+ border-top-right-radius: var(--border-radius-content);
52
+ &:not(.mobile){
53
+ top: calc(60px + var(--padding-conversation-detail));
54
+ }
55
+ }
56
+
57
+ &.mobile{
58
+ right: 0px;
59
+ }
60
+ &:not(.mobile):not(.close){
61
+ right: calc(320px + var(--padding-conversation-detail));
62
+ top: calc(60px + var(--padding-conversation-detail));
63
+ }
64
+ &::before{
65
+ content: "";
66
+ width: 102px;
67
+ height: 34px;
68
+ background-image: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjM0IiB2aWV3Qm94PSIwIDAgMTAyIDM0IiB3aWR0aD0iMTAyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgPHBhdGggZD0ibTEwMiAwaC0xMDJsLjA3MTQwOC40MTk3NTNjMTEuMzE5MTkyLS4wMTU1NTggMjIuMjg4MTkyIDMuOTIwMzM3IDMxLjAxMjA5MiAxMS4xMjc2NDdsNy40ODk0IDYuNTAyIDEuNjUwOCAxLjQyMjkgNi42OTU1IDUuNzhjNi41Mzc0IDUuNjQwNSAxNC44ODU3IDguNzQ1MSAyMy41MjI3IDguNzQ3N2gzMS41NTQxeiIKICAgICAgICAgIGZpbGw9IiNlMmU4ZWYiLz4KPC9zdmc+);
69
+ position: relative;
70
+ left: 50px;
71
+ z-index: -1;
72
+ }
73
+
74
+ ion-button {
75
+ text-transform: unset;
76
+ color: var(--basic-blue);
77
+ &:hover {
78
+ --background-hover: transparent;
79
+ text-decoration: underline;
80
+ text-decoration-color: var(--basic-blue);
81
+ }
82
+ }
83
+
84
+ ion-icon{
85
+ margin: 5px;
86
+ }
87
+ }
88
+
89
+
36
90
  ion-item {
37
91
  --padding-end: 0px;
38
92
  --inner-padding-end: 0px;
@@ -60,12 +114,33 @@ ion-item {
60
114
 
61
115
  .message_sender_fullname {
62
116
  font-size: 0.9em;
63
- margin: 0 0 1px 10px;
117
+ margin: 0px 10px 0px 10px;
64
118
  // color: var(--gray);
65
119
  font-weight: 500;
66
120
  color: #080f1a;
67
121
  }
68
122
 
123
+ .typing_container{
124
+ display:flex;
125
+ align-items: center;
126
+
127
+ user-typing {
128
+ text-align: right;
129
+ }
130
+ .typing_info{
131
+ color: var(--basic-gray);
132
+ margin-left: 10px;
133
+ font-size: 12px;
134
+ animation: blinker 1s linear infinite;
135
+
136
+ @keyframes blinker {
137
+ 50% {
138
+ opacity: 0;
139
+ }
140
+ }
141
+ }
142
+ }
143
+
69
144
  .messages {
70
145
  border-radius: 18px;
71
146
  padding: 0;
@@ -82,13 +157,17 @@ ion-item {
82
157
  align-items: flex-end;
83
158
  justify-content: flex-end;
84
159
  // padding: 2px 0px 4px 40px;
85
- padding: 2px 0px 14px 40px; // edited to display the date at the bottom of the "message bubble"
160
+ padding: 0px 0px 6px 40px;
161
+
162
+ &:hover .message-date-hover, &:hover .btn-add-msg{
163
+ display: block;
164
+ }
165
+
86
166
  .msg_sent {
87
167
  background-color: var(--bubble-blue);
88
168
  color: var(--col-msg-sent);
89
- margin-right: 4px;
90
- margin-left: 4px;
91
- max-width: calc(100% - 70px);
169
+ margin: 0px 0px 0px 0px;
170
+ max-width: calc(100% - 85px);
92
171
  min-width: 14px;
93
172
  border-top-right-radius: 8px;
94
173
  border-bottom-right-radius: 0px;
@@ -98,6 +177,9 @@ ion-item {
98
177
  color: var(--bubble-privateMsgColor)
99
178
  }
100
179
  }
180
+ .no-background{
181
+ background: transparent!important;
182
+ }
101
183
  .emoticon {
102
184
  background: unset !important;
103
185
  font-size: 4em;
@@ -108,12 +190,38 @@ ion-item {
108
190
  .has-metadata {
109
191
  max-width: 100% !important;
110
192
  }
193
+
194
+ .email-logo{
195
+ background-color: var(--list-bkg-color);
196
+ position: relative;
197
+ display: flex;
198
+ -webkit-box-align: center;
199
+ align-items: center;
200
+ -webkit-box-pack: center;
201
+ justify-content: center;
202
+ bottom: -5px;
203
+ left: 9px;
204
+ z-index: 2;
205
+ width: 20px;
206
+ height: 16px;
207
+ border-radius: 3px;
208
+ color: rgb(135, 150, 175);
209
+ }
111
210
  }
112
211
 
113
212
  /** recive message **/
114
213
  .base_receive {
115
- // padding: 0px 0px 6px 0px;
116
- padding: 0px 0px 15px 0px; // edited to display the date at the bottom of the "message bubble"
214
+ padding: 0px 20px 6px 0px;
215
+ .message-date{
216
+ color: #647491;
217
+ font-size: 12px;
218
+ align-self: center;
219
+ }
220
+
221
+
222
+ &:hover .message-date-hover, &:hover .btn-add-msg{
223
+ display: block;
224
+ }
117
225
  /* avatar */
118
226
  .content-avatar {
119
227
  position: relative;
@@ -142,12 +250,12 @@ ion-item {
142
250
  }
143
251
  /* message */
144
252
  .msg_receive {
145
- background-color: var(--light-white);
146
- color: #1a1a1a;
253
+ background-color: var(--bck-msg-received);
254
+ color: var(--col-msg-received);
147
255
  // max-width: 260px;
148
- max-width: calc(100% - 70px);
256
+ max-width: calc(100% - 85px);
149
257
  min-width: 14px;
150
- margin: 0 20px 4px 10px;
258
+ margin: 0 0px 0px 10px;
151
259
  height: fit-content;
152
260
  width: auto;
153
261
  border-top-left-radius: 8px;
@@ -158,7 +266,9 @@ ion-item {
158
266
  color: var(--bubble-privateMsgColor)
159
267
  }
160
268
  }
161
-
269
+ .no-background{
270
+ background: transparent!important;
271
+ }
162
272
  .emoticon {
163
273
  background: unset !important;
164
274
  font-size: 4em;
@@ -167,63 +277,93 @@ ion-item {
167
277
  .has-metadata {
168
278
  max-width: 100% !important;
169
279
  }
280
+
281
+ }
282
+
283
+ .message-date-hover{
284
+ color: #647491;
285
+ font-size: 12px;
286
+ align-self: center;
287
+
288
+ display: none;
289
+
170
290
  }
171
291
 
172
- .time {
173
- margin-bottom: 20px;
292
+ .btn-add-msg {
293
+ border-radius: 50%;
294
+ --padding-end: 5px;
295
+ --padding-start: 5px;
296
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.13);
297
+ display: none;
298
+ align-self: center;
299
+ margin: 0px 5px;
300
+
301
+ ion-icon{
302
+ font-size: 1.2em;
303
+ color: var(--basic-blue)
304
+ }
305
+
306
+ .add-canned-response-add-icon{
307
+ color: var(--basic-blue);
308
+ cursor: pointer;
309
+ position: relative;
310
+ top: 6px;
311
+ left: -6px;
312
+ font-size: 9px;
313
+ }
174
314
  }
175
315
 
176
- // Loading Spinner
177
- .spinner {
178
- // margin: 100px auto 0;
179
- width: 90px;
316
+ /* LOADING */
317
+ /*http://tobiasahlin.com/spinkit/*/
318
+ #chat21-spinner {
319
+ display: none;
320
+ width: 70px;
180
321
  min-height: 20px;
181
- padding: 7px;
322
+ margin: 20px auto 0;
182
323
  text-align: center;
183
324
  }
184
-
185
- .spinner > div {
186
- width: 10px;
187
- height: 10px;
188
- background-color: rgb(255, 255, 255);
189
-
325
+ #chat21-spinner.active {
326
+ display: block;
327
+ }
328
+ #chat21-spinner > div {
329
+ width: 12px;
330
+ height: 12px;
331
+ background-color: var(--bubble-blue);
190
332
  border-radius: 100%;
191
333
  display: inline-block;
192
334
  -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both;
193
335
  animation: sk-bouncedelay 1.4s infinite ease-in-out both;
194
336
  }
195
-
196
- .spinner .bounce1 {
337
+ #chat21-spinner .chat21-bounce1 {
197
338
  -webkit-animation-delay: -0.32s;
198
339
  animation-delay: -0.32s;
199
340
  }
200
-
201
- .spinner .bounce2 {
341
+ #chat21-spinner .chat21-bounce2 {
202
342
  -webkit-animation-delay: -0.16s;
203
343
  animation-delay: -0.16s;
204
344
  }
205
-
345
+ #chat21-spinner span {
346
+ display: block;
347
+ margin: 0.5em 0 0 0;
348
+ color: var(--col-msg-sent);
349
+ /* text-transform: uppercase; */
350
+ font-family: 'Roboto', sans-serif;
351
+ -webkit-animation: pulse 2000ms linear infinite;
352
+ -moz-animation: pulse 2000ms linear infinite;
353
+ animation: pulse 2000ms linear infinite;
354
+ text-align: center;
355
+ }
206
356
  @-webkit-keyframes sk-bouncedelay {
207
- 0%,
208
- 80%,
209
- 100% {
210
- -webkit-transform: scale(0);
211
- }
212
- 40% {
213
- -webkit-transform: scale(1);
214
- }
357
+ 0%, 80%, 100% { -webkit-transform: scale(0) }
358
+ 40% { -webkit-transform: scale(1.0) }
215
359
  }
216
-
217
360
  @keyframes sk-bouncedelay {
218
- 0%,
219
- 80%,
220
- 100% {
221
- -webkit-transform: scale(0);
222
- transform: scale(0);
223
- }
224
- 40% {
225
- -webkit-transform: scale(1);
226
- transform: scale(1);
361
+ 0%, 80%, 100% {
362
+ -webkit-transform: scale(0);
363
+ transform: scale(0);
364
+ } 40% {
365
+ -webkit-transform: scale(1.0);
366
+ transform: scale(1.0);
227
367
  }
228
368
  }
229
369
 
@@ -245,28 +385,6 @@ ion-item {
245
385
  // left: -26px;
246
386
  }
247
387
 
248
- :host .base_receive .msg_receive ::ng-deep div > div > div > ion-button.canned {
249
- display: none;
250
- position: absolute;
251
- top: -3px;
252
- right: -31px;
253
- }
254
-
255
- :host .base_receive .msg_receive ::ng-deep div > div > div >ion-button.emoji {
256
- display: none;
257
- position: absolute;
258
- top: -3px;
259
- right: -51px;
260
- }
261
-
262
- // :host .base_receive .msg_receive:hover ::ng-deep div > div > ion-button {
263
- :host .base_receive:hover .msg_receive ::ng-deep div > div > div > ion-button {
264
- display: block;
265
- // position: absolute;
266
- // top: -11px;
267
- // left: 91px;
268
- }
269
-
270
388
  // ---------------------------------------------------------
271
389
  // Long date divider
272
390
  // ---------------------------------------------------------
@@ -295,24 +413,6 @@ ion-item {
295
413
  color: #64748b;
296
414
  }
297
415
 
298
- // ---------------------------------------------------------
299
- // message date
300
- // ---------------------------------------------------------
301
- :host .base_sent .msg_sent ::ng-deep div > div > div > .message-date {
302
- position: absolute;
303
- bottom: -11px;
304
- color: #64748b;
305
- font-size: 10px;
306
- right: 0px;
307
- }
308
-
309
- :host .base_receive .msg_receive ::ng-deep div > div > .message-date {
310
- position: absolute;
311
- bottom: -11px;
312
- color: #64748b;
313
- font-size: 10px;
314
- left: 0px;
315
- }
316
416
  // ---------------------------------------------------------
317
417
  // emoticon
318
418
  // ---------------------------------------------------------
@@ -1,8 +1,9 @@
1
+ import { MessageModel } from 'src/chat21-core/models/message';
1
2
  import { ConversationContentComponent } from '../conversation-content/conversation-content.component';
2
- import { ChangeDetectorRef, Component, Input, OnInit, Output, EventEmitter } from '@angular/core';
3
+ import { ChangeDetectorRef, Component, Input, OnInit, Output, EventEmitter, SimpleChange, SimpleChanges } from '@angular/core';
3
4
 
4
5
 
5
- import { MESSAGE_TYPE_INFO, MESSAGE_TYPE_MINE, MESSAGE_TYPE_OTHERS } from 'src/chat21-core/utils/constants';
6
+ import { MESSAGE_TYPE_INFO, MESSAGE_TYPE_MINE, MESSAGE_TYPE_OTHERS, TYPE_MSG_EMAIL } from 'src/chat21-core/utils/constants';
6
7
  import { isChannelTypeGroup, isEmojii, isFirstMessage, isInfo, isMine, messageType } from 'src/chat21-core/utils/utils-message';
7
8
  import { UploadService } from 'src/chat21-core/providers/abstract/upload.service';
8
9
  import { isFile, isFrame, isImage } from 'src/chat21-core/utils/utils-message';
@@ -13,6 +14,8 @@ import { TiledeskAuthService } from 'src/chat21-core/providers/tiledesk/tiledesk
13
14
  import { TranslateService } from '@ngx-translate/core';
14
15
  import * as moment from 'moment';
15
16
  import { AppConfigProvider } from 'src/app/services/app-config';
17
+ import { ModalController } from '@ionic/angular';
18
+ import { CreateCannedResponsePage } from 'src/app/modals/create-canned-response/create-canned-response.page';
16
19
  @Component({
17
20
  selector: 'ion-conversation-detail',
18
21
  templateUrl: './ion-conversation-detail.component.html',
@@ -24,14 +27,18 @@ export class IonConversationDetailComponent extends ConversationContentComponent
24
27
  @Input() channelType: string;
25
28
  @Input() areVisibleCAR: boolean;
26
29
  @Input() supportMode: boolean;
30
+ @Input() isMobile: boolean;
31
+ @Input() openInfoConversation: boolean;
27
32
  @Output() onElementRendered = new EventEmitter<{element: string, status: boolean}>();
28
33
  @Output() onAddUploadingBubble = new EventEmitter<boolean>();
29
-
34
+ @Output() onOpenCloseInfoConversation = new EventEmitter<boolean>();
35
+
30
36
  public public_Key: any
31
37
  public uploadProgress: number = 100
32
38
  public fileType: any
33
39
  public browserLang: string;
34
40
  public addAsCannedResponseTooltipText: string;
41
+ // public openInfoConversation: boolean = true;
35
42
  isImage = isImage;
36
43
  isFile = isFile;
37
44
  isFrame = isFrame;
@@ -46,6 +53,7 @@ export class IonConversationDetailComponent extends ConversationContentComponent
46
53
  MESSAGE_TYPE_INFO = MESSAGE_TYPE_INFO;
47
54
  MESSAGE_TYPE_MINE = MESSAGE_TYPE_MINE;
48
55
  MESSAGE_TYPE_OTHERS = MESSAGE_TYPE_OTHERS;
56
+ TYPE_MSG_EMAIL = TYPE_MSG_EMAIL;
49
57
  logger: LoggerService = LoggerInstance.getInstance()
50
58
  /**
51
59
  * Constructor
@@ -58,6 +66,7 @@ export class IonConversationDetailComponent extends ConversationContentComponent
58
66
  public tiledeskAuthService: TiledeskAuthService,
59
67
  private translate: TranslateService,
60
68
  public appConfigProvider: AppConfigProvider,
69
+ public modalController: ModalController,
61
70
  ) {
62
71
  super(cdref, uploadService)
63
72
 
@@ -66,6 +75,11 @@ export class IonConversationDetailComponent extends ConversationContentComponent
66
75
  ngOnInit() {
67
76
  this.listenToUploadFileProgress();
68
77
  this.setMomentLocaleAndGetTranslation();
78
+
79
+ }
80
+
81
+ ngOnChanges(changes: SimpleChanges){
82
+ this.isMobile? this.openInfoConversation = false: null;
69
83
  }
70
84
 
71
85
 
@@ -136,6 +150,11 @@ export class IonConversationDetailComponent extends ConversationContentComponent
136
150
  this.onElementRendered.emit(event)
137
151
  }
138
152
 
153
+ onOpenCloseInfoConversationFN(){
154
+ this.openInfoConversation = !this.openInfoConversation
155
+ this.onOpenCloseInfoConversation.emit(this.openInfoConversation)
156
+ }
157
+
139
158
  /**
140
159
  * Track by function for ngFor loops
141
160
  *
@@ -147,4 +166,24 @@ export class IonConversationDetailComponent extends ConversationContentComponent
147
166
  // console.log('[CONVS-DETAIL][ION-CONVS-DETAIL] - trackByFn item', item)
148
167
  return item.uid || index;
149
168
  }
169
+
170
+
171
+ async presentCreateCannedResponseModal(message: MessageModel): Promise<any> {
172
+ this.logger.log('[BUBBLE-MESSAGE] PRESENT CREATE CANNED RESPONSE MODAL ')
173
+ const attributes = {
174
+ message: message,
175
+ }
176
+ const modal: HTMLIonModalElement = await this.modalController.create({
177
+ component: CreateCannedResponsePage,
178
+ componentProps: attributes,
179
+ swipeToClose: false,
180
+ backdropDismiss: false,
181
+ })
182
+ modal.onDidDismiss().then((dataReturned: any) => {
183
+ //
184
+ this.logger.log('[BUBBLE-MESSAGE] ', dataReturned.data)
185
+ })
186
+
187
+ return await modal.present()
188
+ }
150
189
  }