@chat21/chat21-ionic 3.0.60-rc6 → 3.0.61-rc2

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 (99) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/LICENSE +661 -21
  3. package/README.md +2 -0
  4. package/angular.json +2 -0
  5. package/env.sample +3 -1
  6. package/package.json +5 -1
  7. package/src/app/app.component.html +11 -2
  8. package/src/app/app.component.scss +13 -1
  9. package/src/app/app.component.ts +70 -23
  10. package/src/app/app.module.ts +3 -2
  11. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +62 -36
  12. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +2 -2
  13. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +64 -14
  14. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +2 -3
  15. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html +5 -2
  16. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.scss +4 -0
  17. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +2 -2
  18. package/src/app/components/conversation-info/info-content/info-content.component.html +2 -2
  19. package/src/app/components/ddp-header/ddp-header.component.html +14 -7
  20. package/src/app/components/ddp-header/ddp-header.component.scss +4 -0
  21. package/src/app/components/ddp-header/ddp-header.component.ts +21 -2
  22. package/src/app/components/project-item/project-item.component.html +37 -14
  23. package/src/app/components/project-item/project-item.component.scss +35 -15
  24. package/src/app/components/project-item/project-item.component.ts +17 -4
  25. package/src/app/components/sidebar/sidebar.component.html +210 -0
  26. package/src/app/components/sidebar/sidebar.component.scss +11 -0
  27. package/src/app/components/sidebar/sidebar.component.spec.ts +24 -0
  28. package/src/app/components/sidebar/sidebar.component.ts +400 -0
  29. package/src/app/components/sidebar-user-details/sidebar-user-details.component.html +102 -0
  30. package/src/app/components/sidebar-user-details/sidebar-user-details.component.scss +310 -0
  31. package/src/app/components/sidebar-user-details/sidebar-user-details.component.spec.ts +24 -0
  32. package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +423 -0
  33. package/src/app/pages/conversation-detail/conversation-detail.page.html +34 -45
  34. package/src/app/pages/conversation-detail/conversation-detail.page.ts +154 -84
  35. package/src/app/pages/conversations-list/conversations-list.page.html +11 -7
  36. package/src/app/pages/conversations-list/conversations-list.page.ts +34 -9
  37. package/src/app/pages/profile-info/profile-info.page.html +2 -2
  38. package/src/app/pages/profile-info/profile-info.page.ts +23 -21
  39. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.html +3 -3
  40. package/src/app/shared/shared.module.ts +16 -2
  41. package/src/assets/i18n/de.json +226 -0
  42. package/src/assets/i18n/en.json +25 -4
  43. package/src/assets/i18n/es.json +26 -5
  44. package/src/assets/i18n/fr.json +226 -0
  45. package/src/assets/i18n/it.json +26 -5
  46. package/src/assets/i18n/pt.json +226 -0
  47. package/src/assets/i18n/ru.json +226 -0
  48. package/src/assets/i18n/tr.json +227 -0
  49. package/src/assets/images/language_flag/ar.png +0 -0
  50. package/src/assets/images/language_flag/bg.png +0 -0
  51. package/src/assets/images/language_flag/ca.png +0 -0
  52. package/src/assets/images/language_flag/cs.png +0 -0
  53. package/src/assets/images/language_flag/da.png +0 -0
  54. package/src/assets/images/language_flag/de.png +0 -0
  55. package/src/assets/images/language_flag/el.png +0 -0
  56. package/src/assets/images/language_flag/en.png +0 -0
  57. package/src/assets/images/language_flag/es.png +0 -0
  58. package/src/assets/images/language_flag/fa.png +0 -0
  59. package/src/assets/images/language_flag/fi.png +0 -0
  60. package/src/assets/images/language_flag/fr.png +0 -0
  61. package/src/assets/images/language_flag/he.png +0 -0
  62. package/src/assets/images/language_flag/hi.png +0 -0
  63. package/src/assets/images/language_flag/hu.png +0 -0
  64. package/src/assets/images/language_flag/id.png +0 -0
  65. package/src/assets/images/language_flag/it.png +0 -0
  66. package/src/assets/images/language_flag/ja.png +0 -0
  67. package/src/assets/images/language_flag/ko.png +0 -0
  68. package/src/assets/images/language_flag/ml-IN.png +0 -0
  69. package/src/assets/images/language_flag/ne-NP.png +0 -0
  70. package/src/assets/images/language_flag/nl.png +0 -0
  71. package/src/assets/images/language_flag/no.png +0 -0
  72. package/src/assets/images/language_flag/pl.png +0 -0
  73. package/src/assets/images/language_flag/pt-BR.png +0 -0
  74. package/src/assets/images/language_flag/pt.png +0 -0
  75. package/src/assets/images/language_flag/ro.png +0 -0
  76. package/src/assets/images/language_flag/ru.png +0 -0
  77. package/src/assets/images/language_flag/sk.png +0 -0
  78. package/src/assets/images/language_flag/sl.png +0 -0
  79. package/src/assets/images/language_flag/sv-SE.png +0 -0
  80. package/src/assets/images/language_flag/ta.png +0 -0
  81. package/src/assets/images/language_flag/th.png +0 -0
  82. package/src/assets/images/language_flag/tr.png +0 -0
  83. package/src/assets/images/language_flag/uk.png +0 -0
  84. package/src/assets/images/language_flag/vi.png +0 -0
  85. package/src/assets/images/language_flag/zh-CN.png +0 -0
  86. package/src/assets/images/language_flag/zh-TW.png +0 -0
  87. package/src/assets/images/no_image_user.png +0 -0
  88. package/src/assets/js/chat21client.js +16 -3
  89. package/src/assets/tiledesk-solo-logo.png +0 -0
  90. package/src/chat-config-pre-test.json +3 -0
  91. package/src/chat-config-template.json +4 -1
  92. package/src/chat-config.json +4 -1
  93. package/src/chat21-core/providers/firebase/firebase-conversation-handler.ts +54 -43
  94. package/src/chat21-core/providers/firebase/firebase-conversations-handler.ts +23 -0
  95. package/src/chat21-core/providers/mqtt/mqtt-archivedconversations-handler.ts +1 -1
  96. package/src/chat21-core/utils/constants.ts +2 -0
  97. package/src/chat21-core/utils/utils.ts +12 -1
  98. package/src/global.scss +451 -3
  99. package/src/index.html +7 -0
package/README.md CHANGED
@@ -61,6 +61,8 @@ In progress git
61
61
  fileUploadAccept:"*/*",
62
62
  logLevel":"<YOUR-PREFERRED-LOG-LEVEL>",
63
63
  supportMode: false,
64
+ teammatesButton: false,
65
+ archivedButton: false,
64
66
  firebaseConfig: {
65
67
  tenant:"tilechat",
66
68
  apiKey: '123ABC..',
package/angular.json CHANGED
@@ -41,6 +41,8 @@
41
41
  "src/chat-config-dev.json"
42
42
  ],
43
43
  "styles": [
44
+ "node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css",
45
+ "node_modules/roboto-fontface/css/roboto/roboto-fontface.css",
44
46
  {
45
47
  "input": "src/theme/variables.scss"
46
48
  },
package/env.sample CHANGED
@@ -3,7 +3,7 @@ DASHBOARD_URL=https://YOUR_DASHBOARD_URL
3
3
  WS_URL=wss://YOUR_TILEDESK_SERVER_URL?token=
4
4
  WS_URL_RELATIVE=********
5
5
  SERVER_BASE_URL=http://localhost:3000/
6
-
6
+ FEATURES_TOKEN=CAR:F-PAY:F-ANA:F-ACT:F-APP:F
7
7
  CHAT21_ENGINE=mqtt
8
8
  UPLOAD_ENGINE=native
9
9
  PUSH_ENGINE=none
@@ -11,6 +11,8 @@ FILE_UPLOAD_ACCEPT=*/*
11
11
  TENANT=tilechat
12
12
  LOG_LEVEL=INFO
13
13
  SUPPORT_MODE=false
14
+ TEAMMATES_BUTTON=false,
15
+ ARCHIVED_BUTTON=false,
14
16
 
15
17
  # For MQTT Chat Engine
16
18
  MQTT_APPID=tilechat
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chat21/chat21-ionic",
3
- "version": "3.0.60-rc6",
3
+ "version": "3.0.61-rc2",
4
4
  "author": "Tiledesk SRL",
5
5
  "homepage": "https://ionicframework.com/",
6
6
  "scripts": {
@@ -13,10 +13,13 @@
13
13
  },
14
14
  "private": false,
15
15
  "dependencies": {
16
+ "@angular/animations": "^8.2.14",
17
+ "@angular/cdk": "^8.2.3",
16
18
  "@angular/common": "~8.2.14",
17
19
  "@angular/core": "~8.2.14",
18
20
  "@angular/forms": "~8.2.14",
19
21
  "@angular/http": "^7.2.16",
22
+ "@angular/material": "^8.2.3",
20
23
  "@angular/platform-browser": "~8.2.14",
21
24
  "@angular/platform-browser-dynamic": "~8.2.14",
22
25
  "@angular/router": "~8.2.14",
@@ -59,6 +62,7 @@
59
62
  "ngx-logger": "^4.2.1",
60
63
  "ngx-perfect-scrollbar": "^9.0.0",
61
64
  "perfect-scrollbar": "^1.5.0",
65
+ "roboto-fontface": "^0.10.0",
62
66
  "rxjs": "~6.5.1",
63
67
  "tslib": "^1.9.0",
64
68
  "zone.js": "~0.9.1"
@@ -1,10 +1,19 @@
1
1
  <ion-app>
2
2
  <div>
3
- <!-- (click)="hideAlert()" -->
3
+
4
4
  <app-image-viewer></app-image-viewer>
5
+
6
+ <div class="sidebar" [ngClass]="{'hide-sidebar': IS_ONLINE === false || IS_ON_MOBILE_DEVICE === true || SUPPORT_MODE === false}">
7
+ <app-sidebar></app-sidebar>
8
+ </div>
9
+
10
+ <div class="user-details-sidebar" [ngClass]="{'hide-sidebar': IS_ONLINE === false || IS_ON_MOBILE_DEVICE === true || SUPPORT_MODE === false}">
11
+ <app-sidebar-user-details> </app-sidebar-user-details>
12
+ </div>
13
+
5
14
  <ion-split-pane when="md" contentId="main">
6
15
 
7
- <ion-nav #sidebarNav [root]="sidebarPage"></ion-nav>
16
+ <ion-nav #sidebarNav [root]="sidebarPage" [ngClass]="{'sidebar-visible': IS_ONLINE === true && SUPPORT_MODE === true, 'sidebar-hidden': IS_ON_MOBILE_DEVICE === true || SUPPORT_MODE === false}"></ion-nav>
8
17
  <!-- our side menu -->
9
18
  <!-- <ion-router-outlet id="sidebar" name='sidebar' animated="false" #masterNav> -->
10
19
  <!-- <app-conversations-list></app-conversations-list> -->
@@ -1,8 +1,20 @@
1
- .split-pane-md.split-pane-visible > .split-pane-side {
1
+ .split-pane-md.split-pane-visible > .split-pane-side {
2
2
  min-width: 312px;
3
3
  display: block; // Safari bug fix
4
4
  }
5
5
 
6
+ .sidebar-visible {
7
+ margin-left: 60px;
8
+ }
9
+
10
+ .sidebar-hidden {
11
+ margin-left: 0px;
12
+ }
13
+
14
+ .hide-sidebar {
15
+ display: none;
16
+ }
17
+
6
18
  // @media (min-width: 768px) {
7
19
  // .split-pane-md.split-pane-visible > .split-pane-side {
8
20
  // min-width: 312px;
@@ -58,6 +58,7 @@ import * as PACKAGE from 'package.json';
58
58
  import { filter } from 'rxjs/operators'
59
59
  import { WebSocketJs } from './services/websocket/websocket-js';
60
60
  import { Location } from '@angular/common'
61
+
61
62
  // import { filter } from 'rxjs/operators';
62
63
 
63
64
  @Component({
@@ -98,7 +99,9 @@ export class AppComponent implements OnInit {
98
99
  public missingConnectionToast: any
99
100
  public executedInitializeAppByWatchConnection: boolean = false;
100
101
  private version: string;
101
-
102
+ IS_ONLINE: boolean;
103
+ IS_ON_MOBILE_DEVICE: boolean;
104
+ SUPPORT_MODE: boolean;
102
105
  // private isOnline: boolean = false;
103
106
 
104
107
  wsService: WebSocketJs;
@@ -145,11 +148,20 @@ export class AppComponent implements OnInit {
145
148
 
146
149
  this.saveInStorageNumberOfOpenedChatTab();
147
150
  this.listenChatAlreadyOpenWithoutParamsInMobileMode()
148
-
151
+ this.isOnMobileDevice()
149
152
  // this.listenToUrlChanges();
150
153
  // this.getPageState();
151
154
  }
152
155
 
156
+ isOnMobileDevice() {
157
+ this.IS_ON_MOBILE_DEVICE = false;
158
+ if (/Android|iPhone/i.test(window.navigator.userAgent)) {
159
+ this.IS_ON_MOBILE_DEVICE = true;
160
+ }
161
+ console.log('[APP-COMP] IS_ON_MOBILE_DEVICE', this.IS_ON_MOBILE_DEVICE)
162
+ return this.IS_ON_MOBILE_DEVICE;
163
+ }
164
+
153
165
 
154
166
 
155
167
  listenChatAlreadyOpenWithoutParamsInMobileMode() {
@@ -286,6 +298,13 @@ export class AppComponent implements OnInit {
286
298
  */
287
299
  ngOnInit() {
288
300
  const appconfig = this.appConfigProvider.getConfig();
301
+ console.log('[APP-COMP] appconfig', appconfig)
302
+ if (appconfig && appconfig.supportMode) {
303
+ this.SUPPORT_MODE = appconfig.supportMode
304
+ console.log('[APP-COMP] appconfig > SUPPORT_MODE', this.SUPPORT_MODE)
305
+ } else {
306
+ this.SUPPORT_MODE = false;
307
+ }
289
308
  this.persistence = appconfig.authPersistence;
290
309
  this.appStorageService.initialize(environment.storage_prefix, this.persistence, '')
291
310
  // this.logger.log('[APP-COMP] HELLO ngOnInit !!!!!!!')
@@ -416,9 +435,9 @@ export class AppComponent implements OnInit {
416
435
  // this.logger.log('[APP-COMP] - X - initializeApp !!! CALLED-BY: ', calledby);
417
436
  // console.log('[APP-COMP] appconfig platform is cordova: ', this.platform.is('cordova'))
418
437
 
419
- // if (!this.platform.is('cordova')) {
420
- this.splashScreen.show();
421
- // }
438
+ if (!this.platform.is('cordova')) {
439
+ this.splashScreen.show();
440
+ }
422
441
  this.tabTitle = document.title;
423
442
 
424
443
  this.getRouteParamsAndSetLoggerConfig();
@@ -443,11 +462,11 @@ export class AppComponent implements OnInit {
443
462
  // console.log("Check platform");
444
463
  this.getPlatformName();
445
464
 
446
- this.setLanguage();
465
+ // this.setLanguage();
447
466
 
448
- // if (this.splashScreen) {
449
- this.splashScreen.hide();
450
- // }
467
+ if (this.splashScreen) {
468
+ this.splashScreen.hide();
469
+ }
451
470
  this.statusBar.styleDefault();
452
471
  this.navService.init(this.sidebarNav, this.detailNav);
453
472
  // this.persistence = appconfig.authPersistence;
@@ -521,19 +540,42 @@ export class AppComponent implements OnInit {
521
540
  }
522
541
 
523
542
  /** */
524
- setLanguage() {
543
+ setLanguage(currentUser) {
544
+ // const currentUser = JSON.parse(this.appStorageService.getItem('currentUser'));
545
+ this.logger.log('[APP-COMP] - setLanguage current_user uid: ', currentUser);
546
+
547
+ let currentUserId = ''
548
+ if (currentUser) {
549
+ currentUserId = currentUser.uid;
550
+ this.logger.log('[APP-COMP] - setLanguage current_user uid: ', currentUserId);
551
+ }
525
552
  this.translate.setDefaultLang('en');
526
553
  this.translate.use('en');
527
- this.logger.debug('[APP-COMP] navigator.language: ', navigator.language);
528
- let language;
529
- if (navigator.language.indexOf('-') !== -1) {
530
- language = navigator.language.substring(0, navigator.language.indexOf('-'));
531
- } else if (navigator.language.indexOf('_') !== -1) {
532
- language = navigator.language.substring(0, navigator.language.indexOf('_'));
533
- } else {
534
- language = navigator.language;
554
+
555
+ const browserLang = this.translate.getBrowserLang();
556
+ this.logger.log('[APP-COMP] browserLang: ', browserLang);
557
+ const stored_preferred_lang = localStorage.getItem(currentUserId + '_lang');
558
+ this.logger.log('[APP-COMP] stored_preferred_lang: ', stored_preferred_lang);
559
+
560
+ let chat_lang = ''
561
+ if (browserLang && !stored_preferred_lang) {
562
+ chat_lang = browserLang
563
+ } else if (browserLang && stored_preferred_lang) {
564
+ chat_lang = stored_preferred_lang
535
565
  }
536
- this.translate.use(language);
566
+
567
+ this.translate.use(chat_lang);
568
+
569
+ // this.logger.debug('[APP-COMP] navigator.language: ', navigator.language);
570
+ // let language;
571
+ // if (navigator.language.indexOf('-') !== -1) {
572
+ // language = navigator.language.substring(0, navigator.language.indexOf('-'));
573
+ // } else if (navigator.language.indexOf('_') !== -1) {
574
+ // language = navigator.language.substring(0, navigator.language.indexOf('_'));
575
+ // } else {
576
+ // language = navigator.language;
577
+ // }
578
+ // this.translate.use(language);
537
579
  }
538
580
 
539
581
 
@@ -624,7 +666,7 @@ export class AppComponent implements OnInit {
624
666
  })
625
667
  } else {
626
668
  this.logger.warn('[APP-COMP] >>> I AM NOT LOGGED IN <<<')
627
-
669
+ this.IS_ONLINE = false;
628
670
  // clearTimeout(this.timeModalLogin);
629
671
  // this.timeModalLogin = setTimeout(() => {
630
672
  if (!this.hadBeenCalledOpenModal) {
@@ -802,15 +844,19 @@ export class AppComponent implements OnInit {
802
844
  .pipe(filter((state) => state !== null))
803
845
  .subscribe((state: any) => {
804
846
  this.logger.log('initialize FROM [APP-COMP] - [APP-COMP] ***** BSAuthStateChanged state', state);
805
-
847
+
806
848
  if (state && state === AUTH_STATE_ONLINE) {
807
849
  // const user = this.tiledeskAuthService.getCurrentUser();
808
850
  // if (this.isOnline === false) {
809
851
  // if (AUTH_STATE_ONLINE) {
852
+ this.IS_ONLINE = true;
853
+ console.log('[APP-COMP] IS_ONLINE', this.IS_ONLINE)
810
854
  this.goOnLine();
811
855
  // }
812
856
  } else if (state === AUTH_STATE_OFFLINE) {
813
857
  // this.checkTokenAndGoOffline() //se c'è un tiledeskToken salvato, allora aspetta, altrimenti vai offline
858
+ this.IS_ONLINE = false;
859
+ console.log('[APP-COMP] IS_ONLINE', this.IS_ONLINE)
814
860
  this.goOffLine()
815
861
  }
816
862
  }, error => {
@@ -868,6 +914,7 @@ export class AppComponent implements OnInit {
868
914
  // }
869
915
  this.events.publish('go:online', true);
870
916
  const currentUser = this.tiledeskAuthService.getCurrentUser();
917
+ this.setLanguage(currentUser);
871
918
  // this.logger.printDebug('APP-COMP - goOnLine****', currentUser);
872
919
  this.logger.log('[APP-COMP] - GO-ONLINE - currentUser ', currentUser);
873
920
  this.chatManager.setTiledeskToken(tiledeskToken);
@@ -907,7 +954,7 @@ export class AppComponent implements OnInit {
907
954
  const supportmode = this.appConfigProvider.getConfig().supportMode;
908
955
  this.logger.log('[APP-COMP] - GO-OFFINE - supportmode ', supportmode);
909
956
  if (supportmode === true) {
910
- this.webSocketClose()
957
+ this.webSocketClose()
911
958
  }
912
959
  // this.isOnline = false;
913
960
  // this.conversationsHandlerService.conversations = [];
@@ -1088,7 +1135,7 @@ export class AppComponent implements OnInit {
1088
1135
  }
1089
1136
 
1090
1137
  private initConversationsHandler(userId: string) {
1091
- const keys = ['YOU'];
1138
+ const keys = ['YOU', 'INFO_A_NEW_SUPPORT_REQUEST_HAS_BEEN_ASSIGNED_TO_YOU'];
1092
1139
  const translationMap = this.translateService.translateLanguage(keys);
1093
1140
 
1094
1141
  this.logger.log('[APP-COMP] initConversationsHandler ------------->', userId, this.tenant);
@@ -90,13 +90,13 @@ import { ConversationInfoModule } from 'src/app/components/conversation-info/con
90
90
 
91
91
 
92
92
  // Directives
93
- import { TooltipModule } from 'ng2-tooltip-directive';
93
+
94
94
  import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
95
95
  import { Network } from '@ionic-native/network/ngx';
96
96
  import { ConnectionService } from 'ng-connection-service';
97
97
  import { WebSocketJs } from './services/websocket/websocket-js';
98
98
  import { UnassignedConversationsPageModule } from './pages/unassigned-conversations/unassigned-conversations.module';
99
-
99
+ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
100
100
  // FACTORIES
101
101
  export function createTranslateLoader(http: HttpClient) {
102
102
  return new TranslateHttpLoader(http, './assets/i18n/', '.json');
@@ -251,6 +251,7 @@ const appInitializerFn = (appConfig: AppConfigProvider, logger: NGXLogger) => {
251
251
  ],
252
252
  imports: [
253
253
  BrowserModule,
254
+ BrowserAnimationsModule,
254
255
  FormsModule,
255
256
  ReactiveFormsModule,
256
257
  IonicModule.forRoot(),
@@ -6,6 +6,7 @@ import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service
6
6
  import { isFile, isFrame, isImage } from 'src/chat21-core/utils/utils-message';
7
7
  import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
8
8
  import { TranslateService } from '@ngx-translate/core';
9
+ import { TiledeskAuthService } from 'src/chat21-core/providers/tiledesk/tiledesk-auth.service';
9
10
  import * as moment from 'moment';
10
11
  @Component({
11
12
  selector: 'chat-bubble-message',
@@ -36,53 +37,78 @@ export class BubbleMessageComponent implements OnInit, OnChanges {
36
37
  };
37
38
 
38
39
  private logger: LoggerService = LoggerInstance.getInstance()
40
+
39
41
  constructor(
40
42
  public sanitizer: DomSanitizer,
41
- private translate: TranslateService) {
43
+ private translate: TranslateService,
44
+ public tiledeskAuthService: TiledeskAuthService
45
+
46
+ ) {
42
47
  // console.log('BUBBLE-MSG Hello !!!!')
43
48
  }
44
49
 
45
50
  ngOnInit() {
51
+
52
+ this.setMomentLocale()
53
+ // this.browserLang = this.translate.getBrowserLang();
54
+
55
+ // if (this.browserLang) {
56
+ // if (this.browserLang === 'it') {
57
+
58
+
59
+ // moment.locale('it', {
60
+ // calendar: {
61
+ // lastDay: '[Ieri alle] LT',
62
+ // sameDay: '[Oggi alle] LT',
63
+ // nextDay: '[Domani alle] LT',
64
+ // lastWeek: '[Ultimo] dddd [alle] LT',
65
+ // nextWeek: 'dddd [alle] LT',
66
+ // sameElse: 'lll'
67
+ // }
68
+ // });
69
+
70
+ // } else {
71
+ // moment.locale('en', {
72
+ // calendar: {
73
+ // lastDay: '[Yesterday at] LT',
74
+ // sameDay: '[Today at] LT',
75
+ // nextDay: '[Tomorrow at] LT',
76
+ // lastWeek: '[last] dddd [at] LT',
77
+ // nextWeek: 'dddd [at] LT',
78
+ // sameElse: 'lll'
79
+ // }
80
+ // });
81
+ // }
82
+ // }
83
+
84
+ }
85
+
86
+
87
+ setMomentLocale() {
46
88
  this.browserLang = this.translate.getBrowserLang();
47
- // console.log('BUBBLE-MSG ngOnInit browserLang ', this.browserLang)
48
- if (this.browserLang) {
49
- if (this.browserLang === 'it') {
50
- // console.log('BUBBLE-MSG browserLang ', this.browserLang)
51
- // moment.locale('it')
52
-
53
- moment.locale('it', {
54
- calendar: {
55
- lastDay: '[Ieri alle] LT',
56
- sameDay: '[Oggi alle] LT',
57
- nextDay: '[Domani alle] LT',
58
- lastWeek: '[Ultimo] dddd [alle] LT',
59
- nextWeek: 'dddd [alle] LT',
60
- sameElse: 'lll'
61
- }
62
- });
63
-
64
- } else {
65
- // console.log('BUBBLE-MSG browserLang ', this.browserLang)
66
- // moment.locale('en')
67
-
68
- moment.locale('en', {
69
- calendar: {
70
- lastDay: '[Yesterday at] LT',
71
- sameDay: '[Today at] LT',
72
- nextDay: '[Tomorrow at] LT',
73
- lastWeek: '[last] dddd [at] LT',
74
- nextWeek: 'dddd [at] LT',
75
- sameElse: 'lll'
76
- }
77
- });
78
- }
89
+ const currentUser = this.tiledeskAuthService.getCurrentUser();
90
+ this.logger.log('[BUBBLE-MESSAGE] - ngOnInit - currentUser ', currentUser)
91
+ let currentUserId = ''
92
+ if (currentUser) {
93
+ currentUserId = currentUser.uid
94
+ this.logger.log('[BUBBLE-MESSAGE] - ngOnInit - currentUserId ', currentUserId)
79
95
  }
80
96
 
97
+ const stored_preferred_lang = localStorage.getItem(currentUserId + '_lang');
98
+ this.logger.log('[BUBBLE-MESSAGE] stored_preferred_lang: ', stored_preferred_lang);
81
99
 
82
100
 
83
- // const yesterday = moment().subtract(1, 'day')
84
- // console.log('BUBBLE-MSG yesterday ', yesterday)
85
-
101
+ let chat_lang = ''
102
+ if (this.browserLang && !stored_preferred_lang) {
103
+ chat_lang = this.browserLang
104
+ } else if (this.browserLang && stored_preferred_lang) {
105
+ chat_lang = stored_preferred_lang
106
+ }
107
+ moment.locale(chat_lang , {
108
+ calendar: {
109
+ sameElse: 'LLLL'
110
+ }
111
+ });
86
112
  }
87
113
 
88
114
  ngOnChanges() {
@@ -118,7 +118,7 @@
118
118
  <ion-note *ngIf="!conversation.archived" class="conversation_time">{{conversation.timestamp | amTimeAgo}}</ion-note>
119
119
 
120
120
  <ion-buttons slot="end">
121
- <ion-button *ngIf="!conversation.archived"
121
+ <ion-button *ngIf="!conversation.archived" tooltip="{{ archive_btn_tooltip }}" [options]="tooltipOptions" placement="bottom"
122
122
  [ngClass]="{'hide': !isApp, 'button-on-desktop': !isApp, 'button-on-mobile': isApp }"
123
123
  id="{{ 'close_conversation_button' + conversation.uid }}" class="close-conversation-button" ion-button clear
124
124
  item-end (click)="closeConversation(conversation);$event.stopPropagation();" padding>
@@ -142,7 +142,7 @@
142
142
  {{browserLang === 'en' ? (conversation.timestamp | amDateFormat:'MMM DD YYYY') : (conversation.timestamp| amDateFormat:'DD MMM YYYY') }}
143
143
  <!-- {{conversation.timestamp | amDateFormat:'DD MMM YYYY'}} -->
144
144
  </span>
145
- <i class="material-icons" item-end style="font-size: 15px;font-weight: 400;color: #666666;"> history </i>
145
+ <!-- <i class="material-icons" item-end style="font-size: 15px;font-weight: 400;color: #666666;"> history </i> -->
146
146
  </div>
147
147
 
148
148
  <!-- && !conversation?.archived -->
@@ -14,6 +14,7 @@ import * as moment from 'moment';
14
14
  import { NetworkService } from '../../../services/network-service/network.service';
15
15
  import { AppConfigProvider } from 'src/app/services/app-config';
16
16
  import { DomSanitizer } from '@angular/platform-browser'
17
+ import { TiledeskAuthService } from 'src/chat21-core/providers/tiledesk/tiledesk-auth.service';
17
18
  // import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
18
19
  // import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
19
20
 
@@ -32,9 +33,19 @@ export class IonListConversationsComponent extends ListConversationsComponent im
32
33
  public logger: LoggerService = LoggerInstance.getInstance();
33
34
  public currentYear: any;
34
35
  public browserLang: string;
35
-
36
- public PROJECT_FOR_PANEL: any;
37
36
 
37
+ public PROJECT_FOR_PANEL: any;
38
+ public archive_btn_tooltip: string;
39
+
40
+ tooltipOptions = {
41
+ 'show-delay': 1500,
42
+ 'tooltip-class': 'chat-tooltip',
43
+ 'theme': 'light',
44
+ 'shadow': false,
45
+ 'hide-delay-mobile': 0,
46
+ 'hideDelayAfterClick': 3000,
47
+ 'hide-delay': 200
48
+ };
38
49
  /**
39
50
  *
40
51
  * @param iterableDiffers
@@ -51,21 +62,24 @@ export class IonListConversationsComponent extends ListConversationsComponent im
51
62
  private networkService: NetworkService,
52
63
  private appConfigProvider: AppConfigProvider,
53
64
  private sanitizer: DomSanitizer,
65
+ public tiledeskAuthService: TiledeskAuthService
54
66
  ) {
55
67
  super(iterableDiffers, kvDiffers)
56
- this.browserLang = this.translate.getBrowserLang();
57
- if (this.browserLang) {
68
+ this.setMomentLocale();
58
69
 
59
- moment.locale(this.browserLang)
60
- // if (this.browserLang === 'it') {
61
- // // this.translate.use('it');
62
- // moment.locale('it')
63
70
 
64
- // } else {
65
- // // this.translate.use('en');
66
- // moment.locale('en')
67
- // }
68
- }
71
+ // if (this.browserLang) {
72
+
73
+ // moment.locale(this.browserLang)
74
+ // // if (this.browserLang === 'it') {
75
+ // // // this.translate.use('it');
76
+ // // moment.locale('it')
77
+
78
+ // // } else {
79
+ // // // this.translate.use('en');
80
+ // // moment.locale('en')
81
+ // // }
82
+ // }
69
83
 
70
84
  this.currentYear = moment().format('YYYY');
71
85
  this.logger.log('[ION-LIST-CONVS-COMP] - currentYear ', this.currentYear)
@@ -74,6 +88,42 @@ export class IonListConversationsComponent extends ListConversationsComponent im
74
88
 
75
89
  // console.log('[ION-LIST-CONVS-COMP] - DASHBOARD_BASE_URL ', DASHBOARD_BASE_URL)
76
90
  this.PROJECT_FOR_PANEL = this.sanitizer.bypassSecurityTrustResourceUrl(DASHBOARD_BASE_URL + '#/project-for-panel');
91
+ this.translateLbl();
92
+ }
93
+
94
+ translateLbl() {
95
+ this.translate.get('Resolve')
96
+ .subscribe((text: string) => {
97
+ // this.deleteContact_msg = text;
98
+
99
+
100
+ this.archive_btn_tooltip = text;
101
+ console.log('[ION-LIST-CONVS-COMP] getTranslations Resolve : ', text)
102
+
103
+ });
104
+ }
105
+
106
+ setMomentLocale() {
107
+ this.browserLang = this.translate.getBrowserLang();
108
+ const currentUser = this.tiledeskAuthService.getCurrentUser();
109
+ this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - currentUser ', currentUser)
110
+ let currentUserId = ''
111
+ if (currentUser) {
112
+ currentUserId = currentUser.uid
113
+ this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - currentUserId ', currentUserId)
114
+ }
115
+
116
+ const stored_preferred_lang = localStorage.getItem(currentUserId + '_lang');
117
+ this.logger.log('[ION-LIST-CONVS-COMP] stored_preferred_lang: ', stored_preferred_lang);
118
+
119
+
120
+ let chat_lang = ''
121
+ if (this.browserLang && !stored_preferred_lang) {
122
+ chat_lang = this.browserLang
123
+ } else if (this.browserLang && stored_preferred_lang) {
124
+ chat_lang = stored_preferred_lang
125
+ }
126
+ moment.locale(chat_lang)
77
127
  }
78
128
 
79
129
  ngOnInit() {
@@ -82,7 +132,7 @@ export class IonListConversationsComponent extends ListConversationsComponent im
82
132
  this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - Platform', this.platform.platforms());
83
133
  }
84
134
 
85
-
135
+
86
136
 
87
137
 
88
138
 
@@ -1,8 +1,7 @@
1
1
 
2
2
  <ion-header no-border class="ion-no-border">
3
- <ion-toolbar>
4
-
5
- <ion-buttons slot="start">
3
+ <ion-toolbar style="height:60px">
4
+ <ion-buttons slot="start" style="height:60px">
6
5
  <!-- (click)="pushPage('conversations-list')" defaultHref="/conversations-list" -->
7
6
  <ion-back-button style="display: block;" text="" *ngIf="isMobile" (click)="goBackToConversationList()">
8
7
  </ion-back-button>
@@ -39,7 +39,8 @@
39
39
  <ion-col col-auto>
40
40
 
41
41
  <div class="start-buttons" style="position: absolute;display: flex;">
42
-
42
+
43
+ <ng-container *ngIf="areVisibleCAR">
43
44
  <div class="canned-responses-btn-wpr" style="margin-left: -5px;" tooltip="{{translationMap?.get('CANNED_RESPONSES')}}" [options]="tooltipOptions" placement="top">
44
45
  <ion-button ion-button fill="clear" class="canned-responses-btn" (click)="openCannedResponses()" [disabled]="!IS_SUPPORT_GROUP_CONVERSATION">
45
46
  <ion-icon slot="icon-only" lazy="true" name="flash-outline" style="font-size: 24px;"></ion-icon>
@@ -51,6 +52,8 @@
51
52
  <div *ngIf="IS_SUPPORT_GROUP_CONVERSATION && tagsCannedCount > 0" tooltip="{{translationMap?.get('YES_CANNED_RESPONSES')}}" [options]="tooltipOptions" placement="top" class="canned-responses-btn-badge">
52
53
  <ion-icon name="information-sharp" style="vertical-align: middle;"></ion-icon>
53
54
  </div>
55
+ </ng-container>
56
+
54
57
 
55
58
  <div class="upload-image-btn-wpr" tooltip="{{translationMap?.get('UPLOAD')}}" [options]="tooltipOptions" placement="top">
56
59
  <ion-button ion-button fill="clear" class="upload-image-btn">
@@ -64,7 +67,7 @@
64
67
  </div>
65
68
  </div>
66
69
 
67
- <div class="text-message">
70
+ <div class="text-message" [ngClass]="{'text-message-no-cr': areVisibleCAR === false}">
68
71
  <ion-textarea id="ion-textarea" #messageTextArea #message_text_area #textArea rows="1"
69
72
  [placeholder]="TEXAREA_PLACEHOLDER" autosize="false" auto-grow="true" autofocus="true" [value]=""
70
73
  [(ngModel)]="messageString" (ionChange)="ionChange($event);"
@@ -67,6 +67,10 @@
67
67
  font-size: 15px;
68
68
  }
69
69
  }
70
+ .text-message-no-cr {
71
+ margin: 0 35px !important;
72
+ width: calc(100% - 70px) !important;
73
+ }
70
74
  }
71
75
 
72
76
  #fileInput {
@@ -44,7 +44,7 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
44
44
  @Input() conversationWith: string;
45
45
  @Input() tagsCannedFilter: any = [];
46
46
  @Input() tagsCannedCount: number;
47
-
47
+ @Input() areVisibleCAR: boolean;
48
48
  @Input() events: Observable<void>;
49
49
  @Input() fileUploadAccept: string
50
50
  @Input() isOpenInfoConversation: boolean;
@@ -133,7 +133,7 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
133
133
 
134
134
  this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] ngOnChanges DROP EVENT ", this.dropEvent);
135
135
  this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] ngOnChanges tagsCannedFilter ", this.tagsCannedFilter);
136
- // console.log("[CONVS-DETAIL][MSG-TEXT-AREA] ngOnChanges tagsCannedCount ", this.tagsCannedCount);
136
+ this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] ngOnChanges areVisibleCAR; ", this.areVisibleCAR);
137
137
 
138
138
 
139
139
  this.logger.log('[CONVS-DETAIL] - returnChangeTextArea ngOnChanges in [MSG-TEXT-AREA] this.tagsCannedFilter.length ', this.tagsCannedFilter.length)