@chat21/chat21-ionic 3.0.60 → 3.0.61-rc14

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 (162) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +2 -0
  3. package/angular.json +4 -0
  4. package/config.xml +5 -5
  5. package/deploy_pre.sh +10 -10
  6. package/deploy_prod.sh +5 -1
  7. package/env.sample +3 -1
  8. package/package.json +13 -7
  9. package/resources/{Android → android}/icon/drawable-hdpi-icon.png +0 -0
  10. package/resources/{Android → android}/icon/drawable-ldpi-icon.png +0 -0
  11. package/resources/{Android → android}/icon/drawable-mdpi-icon.png +0 -0
  12. package/resources/{Android → android}/icon/drawable-xhdpi-icon.png +0 -0
  13. package/resources/{Android → android}/icon/drawable-xxhdpi-icon.png +0 -0
  14. package/resources/{Android → android}/icon/drawable-xxxhdpi-icon.png +0 -0
  15. package/resources/{Android → android}/icon.png +0 -0
  16. package/resources/{Android → android}/splash/drawable-land-hdpi-screen.png +0 -0
  17. package/resources/{Android → android}/splash/drawable-land-ldpi-screen.png +0 -0
  18. package/resources/{Android → android}/splash/drawable-land-mdpi-screen.png +0 -0
  19. package/resources/{Android → android}/splash/drawable-land-xhdpi-screen.png +0 -0
  20. package/resources/{Android → android}/splash/drawable-land-xxhdpi-screen.png +0 -0
  21. package/resources/{Android → android}/splash/drawable-land-xxxhdpi-screen.png +0 -0
  22. package/resources/{Android → android}/splash/drawable-port-hdpi-screen.png +0 -0
  23. package/resources/{Android → android}/splash/drawable-port-ldpi-screen.png +0 -0
  24. package/resources/{Android → android}/splash/drawable-port-mdpi-screen.png +0 -0
  25. package/resources/{Android → android}/splash/drawable-port-xhdpi-screen.png +0 -0
  26. package/resources/{Android → android}/splash/drawable-port-xxhdpi-screen.png +0 -0
  27. package/resources/{Android → android}/splash/drawable-port-xxxhdpi-screen.png +0 -0
  28. package/resources/{Android → android}/splash.png +0 -0
  29. package/src/app/app-routing.module.ts +15 -0
  30. package/src/app/app.component.html +14 -4
  31. package/src/app/app.component.scss +18 -1
  32. package/src/app/app.component.ts +50 -16
  33. package/src/app/app.module.ts +12 -3
  34. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +23 -5
  35. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.scss +142 -49
  36. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.ts +101 -18
  37. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.html +20 -36
  38. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.scss +10 -0
  39. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +35 -40
  40. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +7 -2
  41. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +103 -12
  42. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +39 -36
  43. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.scss +7 -1
  44. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.ts +148 -63
  45. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html +59 -22
  46. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.scss +32 -9
  47. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +102 -23
  48. package/src/app/components/ddp-header/ddp-header.component.html +20 -6
  49. package/src/app/components/ddp-header/ddp-header.component.scss +4 -0
  50. package/src/app/components/ddp-header/ddp-header.component.ts +104 -10
  51. package/src/app/components/project-item/project-item.component.html +8 -7
  52. package/src/app/components/project-item/project-item.component.scss +7 -2
  53. package/src/app/components/project-item/project-item.component.ts +15 -2
  54. package/src/app/components/sidebar/sidebar.component.html +275 -0
  55. package/src/app/components/sidebar/sidebar.component.scss +79 -0
  56. package/src/app/components/sidebar/sidebar.component.spec.ts +24 -0
  57. package/src/app/components/sidebar/sidebar.component.ts +539 -0
  58. package/src/app/components/sidebar-user-details/sidebar-user-details.component.html +117 -0
  59. package/src/app/components/sidebar-user-details/sidebar-user-details.component.scss +330 -0
  60. package/src/app/components/sidebar-user-details/sidebar-user-details.component.spec.ts +24 -0
  61. package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +490 -0
  62. package/src/app/pages/conversation-detail/conversation-detail.module.ts +6 -1
  63. package/src/app/pages/conversation-detail/conversation-detail.page.html +20 -10
  64. package/src/app/pages/conversation-detail/conversation-detail.page.scss +28 -0
  65. package/src/app/pages/conversation-detail/conversation-detail.page.ts +1132 -784
  66. package/src/app/pages/conversations-list/conversations-list.module.ts +2 -1
  67. package/src/app/pages/conversations-list/conversations-list.page.html +18 -9
  68. package/src/app/pages/conversations-list/conversations-list.page.scss +9 -1
  69. package/src/app/pages/conversations-list/conversations-list.page.ts +738 -425
  70. package/src/app/pages/create-canned-response/create-canned-response-routing.module.ts +17 -0
  71. package/src/app/pages/create-canned-response/create-canned-response.module.ts +30 -0
  72. package/src/app/pages/create-canned-response/create-canned-response.page.html +150 -0
  73. package/src/app/pages/create-canned-response/create-canned-response.page.scss +55 -0
  74. package/src/app/pages/create-canned-response/create-canned-response.page.spec.ts +24 -0
  75. package/src/app/pages/create-canned-response/create-canned-response.page.ts +319 -0
  76. package/src/app/pages/create-requester/create-requester-routing.module.ts +17 -0
  77. package/src/app/pages/create-requester/create-requester.module.ts +28 -0
  78. package/src/app/pages/create-requester/create-requester.page.html +67 -0
  79. package/src/app/pages/create-requester/create-requester.page.scss +30 -0
  80. package/src/app/pages/create-requester/create-requester.page.spec.ts +24 -0
  81. package/src/app/pages/create-requester/create-requester.page.ts +138 -0
  82. package/src/app/pages/create-ticket/create-ticket-routing.module.ts +17 -0
  83. package/src/app/pages/create-ticket/create-ticket.module.ts +28 -0
  84. package/src/app/pages/create-ticket/create-ticket.page.html +171 -0
  85. package/src/app/pages/create-ticket/create-ticket.page.scss +52 -0
  86. package/src/app/pages/create-ticket/create-ticket.page.spec.ts +24 -0
  87. package/src/app/pages/create-ticket/create-ticket.page.ts +432 -0
  88. package/src/app/pages/loader-preview/loader-preview.page.ts +226 -166
  89. package/src/app/pages/profile-info/profile-info.page.html +4 -4
  90. package/src/app/pages/profile-info/profile-info.page.scss +13 -2
  91. package/src/app/pages/profile-info/profile-info.page.ts +23 -21
  92. package/src/app/services/tiledesk/tiledesk.service.ts +209 -0
  93. package/src/app/shared/shared.module.ts +14 -1
  94. package/src/app/utils/scrollbar-theme.directive.ts +58 -24
  95. package/src/assets/i18n/de.json +69 -13
  96. package/src/assets/i18n/en.json +62 -6
  97. package/src/assets/i18n/es.json +61 -5
  98. package/src/assets/i18n/fr.json +64 -8
  99. package/src/assets/i18n/it.json +61 -5
  100. package/src/assets/i18n/pt.json +61 -5
  101. package/src/assets/i18n/ru.json +62 -6
  102. package/src/assets/i18n/sr.json +265 -0
  103. package/src/assets/i18n/tr.json +61 -5
  104. package/src/assets/images/default-avatar-x-select.png +0 -0
  105. package/src/assets/images/language_flag/ar.png +0 -0
  106. package/src/assets/images/language_flag/bg.png +0 -0
  107. package/src/assets/images/language_flag/ca.png +0 -0
  108. package/src/assets/images/language_flag/cs.png +0 -0
  109. package/src/assets/images/language_flag/da.png +0 -0
  110. package/src/assets/images/language_flag/de.png +0 -0
  111. package/src/assets/images/language_flag/el.png +0 -0
  112. package/src/assets/images/language_flag/en.png +0 -0
  113. package/src/assets/images/language_flag/es.png +0 -0
  114. package/src/assets/images/language_flag/fa.png +0 -0
  115. package/src/assets/images/language_flag/fi.png +0 -0
  116. package/src/assets/images/language_flag/fr.png +0 -0
  117. package/src/assets/images/language_flag/he.png +0 -0
  118. package/src/assets/images/language_flag/hi.png +0 -0
  119. package/src/assets/images/language_flag/hr.png +0 -0
  120. package/src/assets/images/language_flag/hu.png +0 -0
  121. package/src/assets/images/language_flag/id.png +0 -0
  122. package/src/assets/images/language_flag/it.png +0 -0
  123. package/src/assets/images/language_flag/ja.png +0 -0
  124. package/src/assets/images/language_flag/ko.png +0 -0
  125. package/src/assets/images/language_flag/ml-IN.png +0 -0
  126. package/src/assets/images/language_flag/ne-NP.png +0 -0
  127. package/src/assets/images/language_flag/nl.png +0 -0
  128. package/src/assets/images/language_flag/no.png +0 -0
  129. package/src/assets/images/language_flag/pl.png +0 -0
  130. package/src/assets/images/language_flag/pt-BR.png +0 -0
  131. package/src/assets/images/language_flag/pt.png +0 -0
  132. package/src/assets/images/language_flag/ro.png +0 -0
  133. package/src/assets/images/language_flag/ru.png +0 -0
  134. package/src/assets/images/language_flag/sk.png +0 -0
  135. package/src/assets/images/language_flag/sl.png +0 -0
  136. package/src/assets/images/language_flag/sr.png +0 -0
  137. package/src/assets/images/language_flag/sv-SE.png +0 -0
  138. package/src/assets/images/language_flag/ta.png +0 -0
  139. package/src/assets/images/language_flag/th.png +0 -0
  140. package/src/assets/images/language_flag/tr.png +0 -0
  141. package/src/assets/images/language_flag/uk.png +0 -0
  142. package/src/assets/images/language_flag/vi.png +0 -0
  143. package/src/assets/images/language_flag/zh-CN.png +0 -0
  144. package/src/assets/images/language_flag/zh-TW.png +0 -0
  145. package/src/assets/images/no_image_user.png +0 -0
  146. package/src/assets/images/priority_icons/high.svg +3 -0
  147. package/src/assets/images/priority_icons/high_v2.svg +14 -0
  148. package/src/assets/images/priority_icons/low.svg +10 -0
  149. package/src/assets/images/priority_icons/low_v2.svg +14 -0
  150. package/src/assets/images/priority_icons/medium.svg +16 -0
  151. package/src/assets/images/priority_icons/medium_v2.svg +11 -0
  152. package/src/assets/images/priority_icons/urgent.svg +4 -0
  153. package/src/assets/images/priority_icons/urgent_v2.svg +16 -0
  154. package/src/assets/tiledesk-solo-logo.png +0 -0
  155. package/src/chat-config-pre-test.json +3 -1
  156. package/src/chat-config-template.json +3 -1
  157. package/src/chat-config.json +4 -2
  158. package/src/chat21-core/utils/constants.ts +6 -1
  159. package/src/global.scss +405 -3
  160. package/src/index.html +7 -0
  161. package/publish_pre.sh +0 -33
  162. package/publish_prod.sh +0 -33
@@ -0,0 +1,490 @@
1
+ import { Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnInit, Output } from '@angular/core';
2
+ import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
3
+ import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import { TiledeskAuthService } from 'src/chat21-core/providers/tiledesk/tiledesk-auth.service';
6
+ import { ImageRepoService } from 'src/chat21-core/providers/abstract/image-repo.service';
7
+ import { AppStorageService } from 'src/chat21-core/providers/abstract/app-storage.service';
8
+ import { MessagingAuthService } from 'src/chat21-core/providers/abstract/messagingAuth.service';
9
+ import { WebsocketService } from 'src/app/services/websocket/websocket.service';
10
+ import { skip } from 'rxjs/operators';
11
+ import { AppConfigProvider } from 'src/app/services/app-config';
12
+ import { EventsService } from 'src/app/services/events-service';
13
+ import { tranlatedLanguage } from '../../../chat21-core/utils/constants';
14
+ import { avatarPlaceholder, getColorBck } from 'src/chat21-core/utils/utils-user';
15
+ import * as PACKAGE from 'package.json';
16
+ @Component({
17
+ selector: 'app-sidebar-user-details',
18
+ templateUrl: './sidebar-user-details.component.html',
19
+ styleUrls: ['./sidebar-user-details.component.scss'],
20
+ })
21
+ export class SidebarUserDetailsComponent implements OnInit, OnChanges {
22
+ // HAS_CLICKED_OPEN_USER_DETAIL: boolean = false;
23
+ // @Output() onCloseUserDetailsSidebar = new EventEmitter();
24
+
25
+
26
+ public browserLang: string;
27
+ private logger: LoggerService = LoggerInstance.getInstance()
28
+ chat_lang: string
29
+ flag_url: string;
30
+ photo_profile_URL: string;
31
+ IS_BUSY: boolean;
32
+ IS_AVAILABLE: boolean;
33
+ USER_ROLE: boolean;
34
+ USER_ROLE_LABEL: string;
35
+ IS_BUSY_msg: string;
36
+ IS_AVAILABLE_msg: string;
37
+ IS_UNAVAILABLE_msg: string;
38
+ SUBSCRIPTION_PAYMENT_PROBLEM_msg: string;
39
+ THE_PLAN_HAS_EXPIRED_msg: string;
40
+ PAYD_PLAN_NAME_PRO_msg: string;
41
+ PAYD_PLAN_NAME_ENTERPRISE_msg: string;
42
+ PRO_PLAN_TRIAL_msg: string;
43
+ FREE_PLAN_msg: string;
44
+ profile_name_translated: string;
45
+ SubscriptionPaymentProblem: string;
46
+ user: any
47
+ projectID: any
48
+ tiledeskToken: string;
49
+ prjct_name: string;
50
+ plan_type: string;
51
+ _prjct_profile_name: string;
52
+
53
+ isVisiblePAY: boolean;
54
+ public_Key: any
55
+ plan_name: string;
56
+ plan_subscription_is_active: boolean;
57
+ USER_PHOTO_PROFILE_EXIST: boolean;
58
+ version: string
59
+ test: Date = new Date();
60
+ company_name: string = 'Tiledesk'
61
+ constructor(
62
+ private translate: TranslateService,
63
+ public tiledeskAuthService: TiledeskAuthService,
64
+ public imageRepoService: ImageRepoService,
65
+ public appStorageService: AppStorageService,
66
+ private messagingAuthService: MessagingAuthService,
67
+ public wsService: WebsocketService,
68
+ public appConfigProvider: AppConfigProvider,
69
+ public events: EventsService,
70
+ private eRef: ElementRef,
71
+ ) { }
72
+
73
+ ngOnInit() {
74
+ this.version = PACKAGE.version;
75
+ this.getCurrentChatLangAndTranslateLabels();
76
+ this.subcribeToAuthStateChanged();
77
+ this.listenTocurrentProjectUserUserAvailability$();
78
+ this.getCurrentStoredProject();
79
+ this.getOSCODE();
80
+ // this.listenOpenUserSidebarEvent();
81
+ }
82
+
83
+ subcribeToAuthStateChanged() {
84
+ this.messagingAuthService.BSAuthStateChanged.subscribe((state) => {
85
+ this.logger.log('[SIDEBAR-USER-DETAILS] BSAuthStateChanged ', state)
86
+
87
+ if (state === 'online') {
88
+ const currentUser = JSON.parse(this.appStorageService.getItem('currentUser'));
89
+ this.logger.log('[SIDEBAR-USER-DETAILS] currentUser ', currentUser)
90
+ if (currentUser) {
91
+ this.user = currentUser;
92
+ this.createUserAvatar(this.user)
93
+ this.photo_profile_URL = this.imageRepoService.getImagePhotoUrl(currentUser.uid)
94
+ this.logger.log('[SIDEBAR-USER-DETAILS] photo_profile_URL ', this.photo_profile_URL);
95
+ this.checkIfExistPhotoProfile(this.photo_profile_URL)
96
+ }
97
+ }
98
+ })
99
+ }
100
+
101
+ checkIfExistPhotoProfile(imageUrl) {
102
+ this.verifyImageURL(imageUrl, (imageExists) => {
103
+
104
+ if (imageExists === true) {
105
+ this.USER_PHOTO_PROFILE_EXIST = true;
106
+ this.logger.log('[SIDEBAR-USER-DETAILS] photo_profile_URL IMAGE EXIST ', imageExists)
107
+
108
+ } else {
109
+ this.USER_PHOTO_PROFILE_EXIST = false;
110
+ this.logger.log('[SIDEBAR-USER-DETAILS] photo_profile_URL IMAGE EXIST ', imageExists)
111
+ }
112
+ })
113
+ }
114
+
115
+
116
+ createUserAvatar(currentUser) {
117
+ this.logger.log('[SIDEBAR-USER-DETAILS] - createProjectUserAvatar ', currentUser)
118
+ let fullname = ''
119
+ if (currentUser && currentUser.firstname && currentUser.lastname) {
120
+ fullname = currentUser.firstname + ' ' + currentUser.lastname
121
+ currentUser['fullname_initial'] = avatarPlaceholder(fullname)
122
+ currentUser['fillColour'] = getColorBck(fullname)
123
+ } else if (currentUser && currentUser.firstname) {
124
+ fullname = currentUser.firstname
125
+ currentUser['fullname_initial'] = avatarPlaceholder(fullname)
126
+ currentUser['fillColour'] = getColorBck(fullname)
127
+ } else {
128
+ currentUser['fullname_initial'] = 'N/A'
129
+ currentUser['fillColour'] = 'rgb(98, 100, 167)'
130
+ }
131
+ }
132
+
133
+ verifyImageURL(image_url, callBack) {
134
+ const img = new Image();
135
+ img.src = image_url;
136
+ img.onload = function () {
137
+ callBack(true);
138
+ };
139
+ img.onerror = function () {
140
+ callBack(false);
141
+ };
142
+ }
143
+
144
+ // listenOpenUserSidebarEvent() {
145
+ // this.events.subscribe('userdetailsidebar:opened', (openUserDetailsSidebar) => {
146
+ // this.logger.log('[SIDEBAR-USER-DETAILS] - listenOpenUserSidebarEvent - openUserDetailsSidebar', openUserDetailsSidebar);
147
+ // this.HAS_CLICKED_OPEN_USER_DETAIL = true;
148
+ // });
149
+ // }
150
+
151
+ @HostListener('document:click', ['$event'])
152
+ clickout(event) {
153
+ this.logger.log('[SIDEBAR-USER-DETAILSS-CHAT] clickout event.target)', event.target)
154
+ this.logger.log('[SIDEBAR-USER-DETAILSS-CHAT] clickout event.target)', event.target.id)
155
+ const clicked_element_id = event.target.id
156
+ if (this.eRef.nativeElement.contains(event.target)) {
157
+ // this.logger.log('[SIDEBAR-USER-DETAILS] clicked inside')
158
+ } else {
159
+ if (!clicked_element_id.startsWith("sidebaravatar")) {
160
+ this.closeUserDetailSidePanel();
161
+ }
162
+ // this.logger.log('[SIDEBAR-USER-DETAILS] clicked outside')
163
+
164
+ }
165
+ }
166
+
167
+ closeUserDetailSidePanel() {
168
+ var element = document.getElementById('user-details');
169
+ element.classList.remove("active");
170
+ this.logger.log('[SIDEBAR-USER-DETAILS] element', element);
171
+ // this.HAS_CLICKED_OPEN_USER_DETAIL === true
172
+ // this.onCloseUserDetailsSidebar.emit(false);
173
+ }
174
+
175
+
176
+ getCurrentChatLangAndTranslateLabels() {
177
+ this.browserLang = this.translate.getBrowserLang();
178
+ const currentUser = JSON.parse(this.appStorageService.getItem('currentUser'));
179
+ this.logger.log('[SIDEBAR-USER-DETAILS] - ngOnInit - currentUser ', currentUser)
180
+ this.logger.log('[SIDEBAR-USER-DETAILS] - ngOnInit - browserLang ', this.browserLang)
181
+ let currentUserId = ''
182
+ if (currentUser) {
183
+ currentUserId = currentUser.uid
184
+ this.logger.log('[SIDEBAR-USER-DETAILS] - ngOnInit - currentUserId ', currentUserId)
185
+ }
186
+
187
+ const stored_preferred_lang = localStorage.getItem(currentUserId + '_lang');
188
+ this.logger.log('[SIDEBAR-USER-DETAILS] stored_preferred_lang: ', stored_preferred_lang);
189
+
190
+
191
+ this.chat_lang = ''
192
+ if (this.browserLang && !stored_preferred_lang) {
193
+ this.chat_lang = this.browserLang
194
+ // this.flag_url = "assets/images/language_flag/" + this.chat_lang + ".png"
195
+
196
+ this.logger.log('[SIDEBAR-USER-DETAILS] flag_url: ', this.flag_url);
197
+ this.logger.log('[SIDEBAR-USER-DETAILS] chat_lang: ', this.chat_lang);
198
+ } else if (this.browserLang && stored_preferred_lang) {
199
+ this.chat_lang = stored_preferred_lang
200
+ // this.flag_url = "assets/images/language_flag/" + this.chat_lang + ".png"
201
+ this.logger.log('[SIDEBAR-USER-DETAILS] flag_url: ', this.flag_url);
202
+ this.logger.log('[SIDEBAR-USER-DETAILS] chat_lang: ', this.chat_lang);
203
+ }
204
+
205
+
206
+ if (tranlatedLanguage.includes(this.chat_lang)) {
207
+ this.logger.log('[SIDEBAR-USER-DETAILS] tranlatedLanguage includes', this.chat_lang, ': ', tranlatedLanguage.includes(this.chat_lang))
208
+ this.translate.use(this.chat_lang);
209
+ this.flag_url = "assets/images/language_flag/" + this.chat_lang + ".png"
210
+ } else {
211
+ this.logger.log('[SIDEBAR-USER-DETAILS] tranlatedLanguage includes', this.chat_lang, ': ', tranlatedLanguage.includes(this.chat_lang))
212
+ this.translate.use('en');
213
+ this.flag_url = "assets/images/language_flag/en.png"
214
+ this.chat_lang = 'en'
215
+ }
216
+ this.translateLabels()
217
+ }
218
+
219
+ translateLabels() {
220
+ this.getAvailableTranslation();
221
+ this.getUnavailableTranslation();
222
+ this.getIsBusyTranslation();
223
+ this.getSubscriptionPaymentProblemTranslation();
224
+ this.getThePlanHasExpiredTranslation();
225
+ }
226
+
227
+
228
+ getOSCODE() {
229
+ this.public_Key = this.appConfigProvider.getConfig().t2y12PruGU9wUtEGzBJfolMIgK;
230
+ this.logger.log('[SIDEBAR-USER-DETAILS] AppConfigService getAppConfig public_Key', this.public_Key);
231
+ this.logger.log('[SIDEBAR-USER-DETAILS] AppConfigService getAppConfig', this.appConfigProvider.getConfig());
232
+ if (this.public_Key) {
233
+ let keys = this.public_Key.split("-");
234
+ this.logger.log('[SIDEBAR-USER-DETAILS] PUBLIC-KEY - public_Key keys', keys)
235
+
236
+ keys.forEach(key => {
237
+ if (key.includes("PAY")) {
238
+
239
+ let pay = key.split(":");
240
+
241
+ if (pay[1] === "F") {
242
+ this.isVisiblePAY = false;
243
+ } else {
244
+ this.isVisiblePAY = true;
245
+ }
246
+ }
247
+ });
248
+
249
+ if (!this.public_Key.includes("PAY")) {
250
+ this.isVisiblePAY = false;
251
+ }
252
+ } else {
253
+ this.isVisiblePAY = false;
254
+ }
255
+ }
256
+
257
+ getAvailableTranslation() {
258
+ this.translate.get('Available')
259
+ .subscribe((text: string) => {
260
+
261
+ // console.log('[SIDEBAR-USER-DETAILS] - GET GTTTTTN ', text)
262
+ this.IS_AVAILABLE_msg = text
263
+ });
264
+ }
265
+ getUnavailableTranslation() {
266
+ this.translate.get('Unavailable')
267
+ .subscribe((text: string) => {
268
+
269
+ // console.log('[SIDEBAR-USER-DETAILS] - GET GTTTTTN ', text)
270
+ this.IS_UNAVAILABLE_msg = text
271
+ });
272
+ }
273
+
274
+ getIsBusyTranslation() {
275
+ this.translate.get('Busy')
276
+ .subscribe((text: string) => {
277
+
278
+ // console.log('[SIDEBAR-USER-DETAILS] - GET GTTTTTN ', text)
279
+ this.IS_BUSY_msg = text
280
+ });
281
+ }
282
+
283
+ getSubscriptionPaymentProblemTranslation() {
284
+ this.translate.get('SubscriptionPaymentProblem')
285
+ .subscribe((text: string) => {
286
+
287
+ // console.log('[SIDEBAR-USER-DETAILS] - GET GTTTTTN ', text)
288
+ this.SUBSCRIPTION_PAYMENT_PROBLEM_msg = text
289
+ });
290
+ }
291
+
292
+ getThePlanHasExpiredTranslation() {
293
+ this.translate.get('ThePlanHasExpired')
294
+ .subscribe((text: string) => {
295
+
296
+ // console.log('[SIDEBAR-USER-DETAILS] - GET GTTTTTN ', text)
297
+ this.THE_PLAN_HAS_EXPIRED_msg = text
298
+ });
299
+ }
300
+
301
+
302
+ getCurrentStoredProject() {
303
+ try {
304
+ const project = localStorage.getItem('last_project')
305
+ if (project) {
306
+ const projectObjct = JSON.parse(localStorage.getItem('last_project'))
307
+ // console.log('[SIDEBAR-USER-DETAILS] - GET STORED PROJECT ', projectObjct)
308
+
309
+ this.projectID = projectObjct['id_project']['_id']
310
+ // console.log('[SIDEBAR-USER-DETAILS] - GET STORED PROJECT > PROJECT ID ', this.projectID);
311
+
312
+ this.prjct_name = projectObjct['id_project']['name']
313
+ // console.log('[SIDEBAR-USER-DETAILS] - GET STORED PROJECT > PROJECT NAME ', this.prjct_name);
314
+
315
+ this.plan_type = projectObjct['id_project']['profile']['type'];
316
+ // console.log('[SIDEBAR-USER-DETAILS] - GET STORED PROJECT > PLAN TYPE ', this.plan_type);
317
+
318
+ const trial_expired = projectObjct['id_project']['trialExpired']
319
+ // console.log('[SIDEBAR-USER-DETAILS] - GET STORED PROJECT > TRIAL EXPIRED ', trial_expired);
320
+
321
+ const profile_name = projectObjct['id_project']['profile']['name'];
322
+ // console.log('[SIDEBAR-USER-DETAILS] - GET STORED PROJECT > PROFILE NAME ', profile_name);
323
+
324
+ this.plan_name = projectObjct['id_project']['profile']['name'];
325
+ this.plan_subscription_is_active = projectObjct['id_project']['isActiveSubscription'];
326
+
327
+ if (this.plan_type === 'free') {
328
+
329
+ if (trial_expired === false) {
330
+ this.getProPlanTrialTranslation();
331
+ } else if (trial_expired === true) {
332
+ this.getFreePlanTranslation();
333
+ }
334
+ } else if (this.plan_type === 'payment' && profile_name === 'pro') {
335
+ this.getProPlanTranslation();
336
+ } else if (this.plan_type === 'payment' && profile_name === 'enterprise') {
337
+ this.getEnterprisePlanTranslation();
338
+ }
339
+
340
+ }
341
+
342
+ } catch (err) {
343
+ this.logger.error('[SIDEBAR-USER-DETAILS] - GET STORED PROJECT ERR ', err)
344
+ }
345
+
346
+ try {
347
+ this.tiledeskToken = this.appStorageService.getItem('tiledeskToken');
348
+ // console.log('[SIDEBAR-USER-DETAILS] - GET STORED TOKEN ', this.tiledeskToken)
349
+ } catch (err) {
350
+ this.logger.error('[SIDEBAR-USER-DETAILS] - GET STORED TOKEN ', err)
351
+ }
352
+ }
353
+
354
+
355
+ getProPlanTrialTranslation() {
356
+ // this.profile_name_translated = this.PRO_PLAN_TRIAL_msg;
357
+ this.translate.get('ProPlanTrial')
358
+ .subscribe((text: string) => {
359
+
360
+ // console.log('[SIDEBAR-USER-DETAILS] - GET GTTTTTN ', text)
361
+ this.profile_name_translated = text
362
+ });
363
+ }
364
+
365
+ getFreePlanTranslation() {
366
+ // this.profile_name_translated = this.FREE_PLAN_msg;
367
+ this.translate.get('FreePlan')
368
+ .subscribe((text: string) => {
369
+
370
+ // console.log('[SIDEBAR-USER-DETAILS] - GET GTTTTTN ', text)
371
+ this.profile_name_translated = text
372
+ });
373
+ }
374
+
375
+ getProPlanTranslation() {
376
+ // this.profile_name_translated = this.PAYD_PLAN_NAME_PRO_msg;
377
+ this.translate.get('PaydPlanNamePro')
378
+ .subscribe((text: string) => {
379
+ // this.deleteContact_msg = text;
380
+ // console.log('[SIDEBAR-USER-DETAILS] - GET GTTTTTN ', text)
381
+ this.profile_name_translated = text
382
+ });
383
+ }
384
+
385
+ getEnterprisePlanTranslation() {
386
+ // this.profile_name_translated = this.PAYD_PLAN_NAME_ENTERPRISE_msg;
387
+ this.translate.get('PaydPlanNameEnterprise')
388
+ .subscribe((text: string) => {
389
+ // this.deleteContact_msg = text;
390
+ // console.log('[SIDEBAR-USER-DETAILS] - GET GTTTTTN ', text)
391
+ this.profile_name_translated = text
392
+ });
393
+ }
394
+
395
+
396
+
397
+ listenTocurrentProjectUserUserAvailability$() {
398
+ this.wsService.currentProjectUserAvailability$
399
+ .pipe(skip(1))
400
+ .subscribe((projectUser) => {
401
+ this.logger.log('[SIDEBAR-USER-DETAILS] - $UBSC TO WS USER AVAILABILITY & BUSY STATUS RES ', projectUser);
402
+
403
+ if (projectUser) {
404
+ this.IS_AVAILABLE = projectUser['user_available']
405
+ this.IS_BUSY = projectUser['isBusy']
406
+ this.USER_ROLE = projectUser['role']
407
+ // console.log('[SIDEBAR-USER-DETAILS] -translateUserRole 1', this.USER_ROLE)
408
+ this.translateUserRole(this.USER_ROLE)
409
+ }
410
+
411
+
412
+
413
+ }, (error) => {
414
+ this.logger.error('[SIDEBAR-USER-DETAILS] - $UBSC TO WS USER AVAILABILITY & BUSY STATUS error ', error);
415
+ }, () => {
416
+ this.logger.log('[SIDEBAR-USER-DETAILS] - $UBSC TO WS USER AVAILABILITY & BUSY STATUS * COMPLETE *');
417
+ })
418
+ }
419
+
420
+ translateUserRole(role) {
421
+ // console.log('[SIDEBAR-USER-DETAILS] -translateUserRole ', role)
422
+ this.translate.get(role)
423
+ .subscribe((text: string) => {
424
+
425
+ // console.log('[SIDEBAR-USER-DETAILS] - GET GTTTTTN ', text)
426
+ this.USER_ROLE_LABEL = text
427
+ });
428
+
429
+
430
+ }
431
+
432
+
433
+ ngOnChanges() {
434
+ // console.log('[SIDEBAR-USER-DETAILS] HAS_CLICKED_OPEN_USER_DETAIL', this.HAS_CLICKED_OPEN_USER_DETAIL)
435
+ // var element = document.getElementById('user-details');
436
+ // // console.log('[SIDEBAR-USER-DETAILS] element', element)
437
+ // if (this.HAS_CLICKED_OPEN_USER_DETAIL === true) {
438
+ // element.classList.add("active");
439
+ // }
440
+ }
441
+
442
+
443
+
444
+ // closeUserDetailSidePanel() {
445
+ // var element = document.getElementById('user-details');
446
+ // element.classList.remove("active");
447
+ // this.logger.log('[SIDEBAR-USER-DETAILS] element', element);
448
+ // this.HAS_CLICKED_OPEN_USER_DETAIL === true
449
+ // // this.onCloseUserDetailsSidebar.emit(false);
450
+ // }
451
+
452
+
453
+
454
+ changeAvailabilityStateInUserDetailsSidebar(available) {
455
+ this.logger.log('[SIDEBAR-USER-DETAILS] - changeAvailabilityState projectid', this.projectID, ' available 1: ', available);
456
+
457
+ // available = !available
458
+ // console.log('[SIDEBAR-USER-DETAILS] - changeAvailabilityState projectid', this.projectID, ' available 2 : ', available);
459
+
460
+ this.wsService.updateCurrentUserAvailability(this.tiledeskToken, this.projectID, available)
461
+ .subscribe((projectUser: any) => {
462
+
463
+ this.logger.log('[SIDEBAR-USER-DETAILS] - PROJECT-USER UPDATED ', projectUser)
464
+
465
+ // NOTIFY TO THE USER SERVICE WHEN THE AVAILABLE / UNAVAILABLE BUTTON IS CLICKED
466
+ // this.usersService.availability_btn_clicked(true)
467
+
468
+ // if (this.project['id_project']._id === projectUser.id_project) {
469
+ // this.project['ws_projct_user_available'] = projectUser.user_available;
470
+ // // this.project['ws_projct_user_isBusy'] = projectUser['isBusy']
471
+ // }
472
+
473
+ }, (error) => {
474
+ this.logger.error('[SIDEBAR-USER-DETAILS] - PROJECT-USER UPDATED - ERROR ', error);
475
+
476
+ }, () => {
477
+ this.logger.log('[SIDEBAR-USER-DETAILS] - PROJECT-USER UPDATED * COMPLETE *');
478
+
479
+ });
480
+ }
481
+
482
+ public onLogout() {
483
+ // this.authService.logout();
484
+ this.closeUserDetailSidePanel()
485
+ // pubblico evento
486
+ this.events.publish('profileInfoButtonClick:logout', true);
487
+ }
488
+
489
+
490
+ }
@@ -34,6 +34,9 @@ import { InfoGroupComponent } from 'src/app/components/conversation-info/info-gr
34
34
  import { SharedModule } from 'src/app/shared/shared.module';
35
35
  // import { SharedConversationInfoModule } from 'src/app/shared/shared-conversation-info.module';
36
36
  import { NgxLinkifyjsModule } from 'ngx-linkifyjs';
37
+ import { ScrollbarThemeModule } from '../../utils/scrollbar-theme.directive';
38
+ import { PickerModule } from '@ctrl/ngx-emoji-mart';
39
+
37
40
 
38
41
  @NgModule({
39
42
  imports: [
@@ -42,6 +45,8 @@ import { NgxLinkifyjsModule } from 'ngx-linkifyjs';
42
45
  IonicModule,
43
46
  TooltipModule,
44
47
  ConversationDetailPageRoutingModule,
48
+ ScrollbarThemeModule,
49
+ PickerModule,
45
50
  TranslateModule.forChild({
46
51
  loader: {
47
52
  provide: TranslateLoader,
@@ -57,7 +62,7 @@ import { NgxLinkifyjsModule } from 'ngx-linkifyjs';
57
62
  declarations: [
58
63
  ConversationDetailPage,
59
64
  HeaderConversationDetailComponent,
60
- MessageTextAreaComponent,
65
+ MessageTextAreaComponent
61
66
  // BubbleDayMessageComponent,
62
67
  // BubbleSystemMessageComponent,
63
68
  // BubbleMyMessageComponent,
@@ -9,7 +9,8 @@
9
9
 
10
10
  <ion-grid style="height: 100%;">
11
11
  <ion-row class="ion-justify-content-center ion-align-items-center" style="height: 100%; flex-direction: column">
12
- <span *ngIf="isOnline === true && !showSpinner" style="color: #92949c; font-size: 16px;line-height: 18px;margin-top: -160px;">
12
+ <span *ngIf="isOnline === true && !showSpinner"
13
+ style="color: #92949c; font-size: 16px;line-height: 18px;margin-top: -160px;">
13
14
  <span *ngIf="conversation_count > 0 ">
14
15
  {{'PleaseSelectChatToStartMessaging' | translate }}
15
16
  </span>
@@ -34,10 +35,10 @@
34
35
  <app-header-conversation-detail [isMobile]="isMobile" [idLoggedUser]="loggedUser.uid"
35
36
  [conversationAvatar]="conversationAvatar" [translationMap]="translationMap"
36
37
  (eventOpenCloseInfoConversation)="returnOpenCloseInfoConversation($event)"
37
- [isOpenInfoConversation]="isOpenInfoConversation">
38
+ [isOpenInfoConversation]="isOpenInfoConversation" [conv_type]="conv_type">
38
39
  </app-header-conversation-detail>
39
40
 
40
- <ion-content>
41
+ <ion-content id="conv-details">
41
42
  <ion-grid class="grid_content">
42
43
  <ion-row class="row_content">
43
44
  <ion-col id="chatArea" [class.mobile]="isMobile" [class.open]="openInfoConversation">
@@ -91,7 +92,7 @@
91
92
  </ng-template>
92
93
 
93
94
  <ng-template #content_messages>
94
- <ion-content #ionContentChatArea class="ionContentChatArea" (drop)="drop($event)"
95
+ <ion-content #ionContentChatArea appScrollbarTheme class="ionContentChatArea" (drop)="drop($event)"
95
96
  (dragover)="allowDrop($event)" (dragleave)="drag($event)" [scrollEvents]="true"
96
97
  (ionScrollStart)="logScrollStart($event)" (ionScroll)="logScrolling($event)"
97
98
  (ionScrollEnd)="logScrollEnd($event)" [class.active]="showIonContent">
@@ -136,15 +137,24 @@
136
137
  <!-- ----------------------------------------------------------- -->
137
138
  <!-- Canned responses -->
138
139
  <!-- ----------------------------------------------------------- -->
139
-
140
- <div id="canned" *ngIf="tagsCannedFilter.length > 0 && HIDE_CANNED_RESPONSES === false">
141
- <ion-list class="canned-list">
140
+ <div id="canned">
141
+ <ion-list class="canned-list" *ngIf="tagsCannedFilter.length > 0 && HIDE_CANNED_RESPONSES === false">
142
142
  <ion-item button="true" [ngClass]="{'is_active_item': i == arrowkeyLocation}" lines="none"
143
143
  class="canned-item" id="{{'canned-item_'+ i }}"
144
144
  *ngFor="let canned of tagsCannedFilter; let i = index;" [innerHtml]="canned.title"
145
145
  (click)="replaceTagInMessage(canned, $event)">
146
146
  </ion-item>
147
+ <ion-item class="canned-item add-canned-response-wpr" button="true" lines="none" (click)="presentCreateCannedResponseModal()">
148
+ <ion-icon class="add-canned-response-icon" name="flash-outline"></ion-icon>
149
+ <span class="add-canned-response-add-icon">+</span>
150
+ <label class="add-canned-response-label" >{{translationMap?.get('AddNewCannedResponse')}}</label>
151
+ </ion-item>
147
152
  </ion-list>
153
+ <!-- <ion-list class="canned-list" *ngIf="tagsCannedFilter.length === 0 && HIDE_CANNED_RESPONSES === false">
154
+ <ion-item button="true" >
155
+ There are no canned responses available
156
+ </ion-item>
157
+ </ion-list> -->
148
158
  </div>
149
159
 
150
160
 
@@ -155,14 +165,14 @@
155
165
  <!-- openInfoConversation {{openInfoConversation}} - isMobile {{isMobile}} -->
156
166
  <app-message-text-area
157
167
  *ngIf="(openInfoConversation === false && isMobile === true) || (openInfoConversation === true && isMobile === false) || (openInfoConversation === false && isMobile === false)"
158
- [tagsCannedCount]="tagsCannedCount" [areVisibleCAR]="areVisibleCAR" [loggedUser]="loggedUser"
159
- [conversationWith]="conversationWith" [tagsCannedFilter]="tagsCannedFilter"
168
+ [tagsCannedCount]="tagsCannedCount" [areVisibleCAR]="areVisibleCAR" [support_mode]="support_mode"
169
+ [loggedUser]="loggedUser" [conversationWith]="conversationWith" [tagsCannedFilter]="tagsCannedFilter"
160
170
  (eventChangeTextArea)="returnChangeTextArea($event)"
161
171
  (hasClickedOpenCannedResponses)="hasClickedOpenCannedResponses($event)"
162
172
  (eventSendMessage)="returnSendMessage($event)" [translationMap]="translationMap"
163
173
  [fileUploadAccept]="appConfigProvider.getConfig().fileUploadAccept"
164
174
  [isOpenInfoConversation]="isOpenInfoConversation" [dropEvent]="dropEvent"
165
- (onPresentModalScrollToBottom)="onPresentModalScrollToBottom($event)">
175
+ (onPresentModalScrollToBottom)="onPresentModalScrollToBottom($event)" [disableTextarea]="disableTextarea">
166
176
  </app-message-text-area>
167
177
  <!-- [events]="eventsReplaceTexareaText.asObservable()" -->
168
178
  </ion-row>
@@ -25,6 +25,34 @@
25
25
  font-size: 24px;
26
26
  }
27
27
 
28
+ .add-canned-response-icon {
29
+ color: #b3bfd0;
30
+ cursor: pointer;
31
+ font-size: 18px;
32
+ }
33
+ .add-canned-response-label {
34
+ color: #b3bfd0;
35
+ cursor: pointer;
36
+ }
37
+ .add-canned-response-add-icon {
38
+ color: #b3bfd0;
39
+ cursor: pointer;
40
+ position: relative;
41
+ top: 4px;
42
+ left: -6px;
43
+ }
44
+
45
+ #canned > ion-list > ion-item.canned-item.add-canned-response-wpr:hover > span {
46
+ color: #1877f2;
47
+ }
48
+
49
+ #canned > ion-list > ion-item.canned-item.add-canned-response-wpr:hover > ion-icon {
50
+ color: #1877f2;
51
+ }
52
+ #canned > ion-list > ion-item.canned-item.add-canned-response-wpr:hover > label {
53
+ color: #1877f2;
54
+ }
55
+
28
56
  // ion-back-button{
29
57
  // display: none!important;
30
58
  // }