@chat21/chat21-ionic 3.0.59-rc1 → 3.0.59-rc10

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 (88) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +4 -0
  3. package/config.xml +11 -2
  4. package/env.sample +2 -0
  5. package/package.json +1 -1
  6. package/resources/Android/splash/drawable-land-hdpi-screen.png +0 -0
  7. package/resources/Android/splash/drawable-land-ldpi-screen.png +0 -0
  8. package/resources/Android/splash/drawable-land-mdpi-screen.png +0 -0
  9. package/resources/Android/splash/drawable-land-xhdpi-screen.png +0 -0
  10. package/resources/Android/splash/drawable-land-xxhdpi-screen.png +0 -0
  11. package/resources/Android/splash/drawable-land-xxxhdpi-screen.png +0 -0
  12. package/resources/Android/splash/drawable-port-hdpi-screen.png +0 -0
  13. package/resources/Android/splash/drawable-port-ldpi-screen.png +0 -0
  14. package/resources/Android/splash/drawable-port-mdpi-screen.png +0 -0
  15. package/resources/Android/splash/drawable-port-xhdpi-screen.png +0 -0
  16. package/resources/Android/splash/drawable-port-xxhdpi-screen.png +0 -0
  17. package/resources/Android/splash/drawable-port-xxxhdpi-screen.png +0 -0
  18. package/resources/Android/splash.png +0 -0
  19. package/src/app/app-routing.module.ts +21 -17
  20. package/src/app/app.component.html +6 -3
  21. package/src/app/app.component.ts +242 -51
  22. package/src/app/app.module.ts +16 -8
  23. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +4 -4
  24. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.scss +8 -2
  25. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.ts +6 -1
  26. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.html +1 -1
  27. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +1 -1
  28. package/src/app/chatlib/conversation-detail/message/image/image.component.html +7 -6
  29. package/src/app/chatlib/conversation-detail/message/image/image.component.ts +20 -1
  30. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +39 -9
  31. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.scss +8 -144
  32. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +14 -17
  33. package/src/app/components/authentication/login/login.component.html +2 -2
  34. package/src/app/components/authentication/login/login.component.ts +2 -1
  35. package/src/app/components/conversation-detail/bubble-my-message/bubble-my-message.component.ts +1 -1
  36. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +3 -2
  37. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.ts +3 -3
  38. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +46 -5
  39. package/src/app/components/ddp-header/ddp-header.component.html +1 -1
  40. package/src/app/components/ddp-header/ddp-header.component.ts +4 -2
  41. package/src/app/components/image-viewer/image-viewer.component.html +23 -0
  42. package/src/app/components/image-viewer/image-viewer.component.scss +107 -0
  43. package/src/app/components/image-viewer/image-viewer.component.spec.ts +24 -0
  44. package/src/app/components/image-viewer/image-viewer.component.ts +38 -0
  45. package/src/app/components/project-item/project-item.component.html +147 -0
  46. package/src/app/components/project-item/project-item.component.scss +669 -0
  47. package/src/app/components/project-item/project-item.component.spec.ts +24 -0
  48. package/src/app/components/project-item/project-item.component.ts +316 -0
  49. package/src/app/components/utils/avatar-profile/avatar-profile.component.html +9 -3
  50. package/src/app/components/utils/avatar-profile/avatar-profile.component.ts +6 -4
  51. package/src/app/pages/authentication/login/login.page.ts +1 -1
  52. package/src/app/pages/conversation-detail/conversation-detail.page.html +5 -3
  53. package/src/app/pages/conversation-detail/conversation-detail.page.ts +122 -30
  54. package/src/app/pages/conversations-list/conversations-list.page.html +40 -24
  55. package/src/app/pages/conversations-list/conversations-list.page.scss +146 -1
  56. package/src/app/pages/conversations-list/conversations-list.page.ts +87 -6
  57. package/src/app/pages/unassigned-conversations/unassigned-conversations-routing.module.ts +17 -0
  58. package/src/app/pages/unassigned-conversations/unassigned-conversations.module.ts +22 -0
  59. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.html +22 -0
  60. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.scss +79 -0
  61. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.spec.ts +24 -0
  62. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.ts +108 -0
  63. package/src/app/services/nav-proxy.service.ts +1 -1
  64. package/src/app/services/tiledesk/tiledesk.service.ts +22 -1
  65. package/src/app/services/websocket/websocket-js.ts +559 -0
  66. package/src/app/services/websocket/websocket.service.spec.ts +12 -0
  67. package/src/app/services/websocket/websocket.service.ts +274 -0
  68. package/src/app/shared/shared.module.ts +7 -1
  69. package/src/assets/i18n/en.json +9 -1
  70. package/src/assets/i18n/it.json +9 -1
  71. package/src/assets/js/chat21client.js +141 -67
  72. package/src/assets/transparent.png +0 -0
  73. package/src/chat-config-pre-test.json +3 -1
  74. package/src/chat-config-template.json +3 -1
  75. package/src/chat-config.json +3 -1
  76. package/src/chat21-core/providers/chat-manager.ts +3 -3
  77. package/src/chat21-core/providers/firebase/firebase-archivedconversations-handler.ts +1 -1
  78. package/src/chat21-core/providers/firebase/firebase-auth-service.ts +3 -3
  79. package/src/chat21-core/providers/firebase/firebase-conversation-handler.ts +1 -1
  80. package/src/chat21-core/providers/firebase/firebase-notifications.ts +1 -1
  81. package/src/chat21-core/providers/firebase/firebase-presence.service.ts +2 -2
  82. package/src/chat21-core/providers/firebase/firebase-typing.service.ts +1 -1
  83. package/src/chat21-core/providers/firebase/firebase-upload.service.ts +1 -1
  84. package/src/chat21-core/providers/mqtt/mqtt-auth-service.ts +27 -27
  85. package/src/chat21-core/providers/mqtt/mqtt-conversations-handler.ts +13 -5
  86. package/src/chat21-core/providers/mqtt/mqtt-notifications.ts +101 -11
  87. package/src/chat21-core/providers/tiledesk/tiledesk-auth.service.ts +1 -1
  88. package/src/chat21-core/utils/utils.ts +1 -1
@@ -55,9 +55,8 @@ import { getImageUrlThumbFromFirebasestorage } from 'src/chat21-core/utils/utils
55
55
  import { TiledeskService } from './services/tiledesk/tiledesk.service';
56
56
  import { NetworkService } from './services/network-service/network.service';
57
57
  import * as PACKAGE from 'package.json';
58
-
59
- import { Subject } from 'rxjs';
60
- import { filter, takeUntil } from 'rxjs/operators'
58
+ import { filter } from 'rxjs/operators'
59
+ import { WebSocketJs } from './services/websocket/websocket-js';
61
60
 
62
61
  // import { filter } from 'rxjs/operators';
63
62
 
@@ -99,9 +98,11 @@ export class AppComponent implements OnInit {
99
98
  public missingConnectionToast: any
100
99
  public executedInitializeAppByWatchConnection: boolean = false;
101
100
  private version: string;
102
- private unsubscribe$: Subject<any> = new Subject<any>();
101
+
103
102
  // private isOnline: boolean = false;
104
103
 
104
+ wsService: WebSocketJs;
105
+
105
106
  constructor(
106
107
  private platform: Platform,
107
108
  private splashScreen: SplashScreen,
@@ -136,34 +137,105 @@ export class AppComponent implements OnInit {
136
137
  public toastController: ToastController,
137
138
  // private network: Network,
138
139
  // private tiledeskService: TiledeskService,
139
- private networkService: NetworkService
140
+ private networkService: NetworkService,
141
+ public webSocketJs: WebSocketJs,
140
142
  ) {
141
- this.logger.log('[APP-COMP] HELLO Constuctor !!!!!!!')
142
- // HACK: fix toast not presented when offline, due to lazy loading the toast controller.
143
- // this.toastController.create({ animated: false }).then(t => {
144
- // console.log('[APP-COMP] toastController create')
145
- // t.present();
146
- // t.dismiss();
147
- // });
143
+
144
+ // this.saveInStorageChatOpenedTab();
145
+ // FOR TEST
146
+ // const last_project = { "user_available": true, "number_assigned_requests": 59, "last_login_at": "2021-08-09T17:30:55.234Z", "status": "active", "_id": "6112bc8f58c958003495a2cb", "id_project": { "status": 100, "_id": "60ffe291f725db00347661ef", "name": "27-LUGLIO-21-STRIPE-TEST", "activeOperatingHours": false, "createdBy": "608ad02d3a4dc000344ade17", "profile": { "name": "pro", "trialDays": 30, "agents": 5, "type": "payment", "subStart": "2021-11-18T10:42:41.000Z", "subEnd": "2021-11-19T10:42:41.000Z", "subscriptionId": "sub_Jvf4kABe9t8JvX", "last_stripe_event": "invoice.payment_succeeded" }, "versions": 20115, "channels": [{ "name": "chat21" }], "createdAt": "2021-07-27T10:40:17.752Z", "updatedAt": "2021-11-18T11:55:01.346Z", "__v": 0, "widget": { "preChatForm": true, "preChatFormJson": [{ "name": "userFullname", "type": "text", "mandatory": true, "label": { "en": "Your name", "it": "Il tuo nome" } }, { "name": "userEmail", "type": "text", "mandatory": true, "regex": "/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)+$/", "label": { "en": "Your email", "it": "La tua email" }, "errorLabel": { "en": "Invalid email address", "it": "Indirizzo email non valido" } }, { "name": "tel", "mandatory": true, "label": { "en": "Your phone number", "it": "Il tuo numero di telefono" } }], "preChatFormCustomFieldsEnabled": true }, "trialExpired": true, "trialDaysLeft": 84, "isActiveSubscription": true, "id": "60ffe291f725db00347661ef" }, "id_user": "60aa0fef1482fe00346854a7", "role": "admin", "createdBy": "608ad02d3a4dc000344ade17", "createdAt": "2021-08-10T17:51:11.318Z", "updatedAt": "2021-11-19T08:08:21.437Z", "__v": 0, "presence": { "status": "online", "changedAt": "2021-11-19T08:08:21.432Z" }, "isAuthenticated": true, "id": "6112bc8f58c958003495a2cb" }
147
+ // localStorage.setItem('last_project', JSON.stringify(last_project))
148
148
  }
149
+ saveInStorageChatOpenedTab() {
150
+ // if (+localStorage.tabCount > 0) {
151
+ // alert('Already open!');
152
+ // } else {
153
+ // localStorage.tabCount = 0;
154
+ // }
155
+
156
+ // window.addEventListener('load', (event) => {
157
+ // console.log('[CONVS-LIST-PAGE] page is fully loaded', event);
158
+ // // let tab = + localStorage.getItem('tab')
159
+ // // console.log('[CONVS-LIST-PAGE] page is fully loaded getItem tab', + tab);
160
+ // // localStorage.setItem('tab', "1" )
161
+ // localStorage.tabCount = +localStorage.tabCount + 1;
162
+ // });
163
+
164
+ // // https://developers.google.com/web/updates/2018/07/page-lifecycle-api#the-beforeunload-event
165
+ // const terminationEvent = 'onpagehide' in self ? 'pagehide' : 'unload';
166
+ // window.addEventListener(terminationEvent, (event) => {
167
+ // console.log('[CONVS-LIST-PAGE] page is terminationEvent', event);
168
+ // localStorage.tabCount = +localStorage.tabCount - 1;
169
+ // }, { capture: true });
170
+ const getState = () => {
171
+ if (document.visibilityState === 'hidden') {
172
+ return 'hidden';
173
+ }
174
+ if (document.hasFocus()) {
175
+ return 'active';
176
+ }
177
+ return 'passive';
178
+ };
179
+
180
+ let state = getState();
181
+ console.log('[CONVS-LIST-PAGE] page state ', state)
182
+ if (state === 'hidden') {
183
+ localStorage.setItem('hidden', 'true')
184
+ }
185
+
186
+ const logStateChange = (nextState) => {
187
+ const prevState = state;
188
+ if (nextState !== prevState) {
189
+ console.log(`State change: ${prevState} >>> ${nextState}`);
190
+ state = nextState;
191
+ }
192
+ };
193
+
194
+ ['pageshow', 'focus', 'blur', 'visibilitychange', 'resume'].forEach((type) => {
195
+ window.addEventListener(type, () => logStateChange(getState()), { capture: true });
196
+ });
197
+
198
+ // The next two listeners, on the other hand, can determine the next
199
+ // state from the event itself.
200
+ window.addEventListener('freeze', () => {
201
+ // In the freeze event, the next state is always frozen.
202
+ logStateChange('frozen');
203
+ }, { capture: true });
204
+
205
+ window.addEventListener('pagehide', (event) => {
206
+ if (event.persisted) {
207
+ // If the event's persisted property is `true` the page is about
208
+ // to enter the Back-Forward Cache, which is also in the frozen state.
209
+ logStateChange('frozen');
210
+ localStorage.setItem('terminated', 'true')
211
+ } else {
212
+ // If the event's persisted property is not `true` the page is
213
+ // about to be unloaded.
214
+ logStateChange('terminated');
215
+ localStorage.setItem('terminated', 'true')
216
+ }
217
+ }, { capture: true });
149
218
 
150
- param() {
151
- // PARAM
152
- const url: URL = new URL(window.top.location.href);
153
- const params: URLSearchParams = url.searchParams;
154
- return params;
155
219
  }
220
+
221
+
222
+ // param() {
223
+ // // PARAM
224
+ // const url: URL = new URL(window.top.location.href);
225
+ // const params: URLSearchParams = url.searchParams;
226
+ // return params;
227
+ // }
156
228
  /**
157
229
  */
158
230
  ngOnInit() {
159
231
  const appconfig = this.appConfigProvider.getConfig();
160
232
  this.persistence = appconfig.authPersistence;
161
233
  this.appStorageService.initialize(environment.storage_prefix, this.persistence, '')
162
- this.logger.log('[APP-COMP] HELLO ngOnInit !!!!!!!')
163
- this.logger.info('[APP-COMP] ngOnInit this.route.snapshot.params -->', this.route.snapshot.params);
234
+ // this.logger.log('[APP-COMP] HELLO ngOnInit !!!!!!!')
235
+ // this.logger.log('[APP-COMP] ngOnInit this.route.snapshot.params -->', this.route.snapshot.params);
164
236
  // this.initializeApp('oninit');
165
237
  const token = getParameterByName('jwt')
166
- this.logger.info('[APP-COMP] ngOnInit AUTOLOGIN token get with getParameterByName -->', token);
238
+ // this.logger.log('[APP-COMP] ngOnInit AUTOLOGIN token get with getParameterByName -->', token);
167
239
 
168
240
  if (token) {
169
241
  // this.isOnline = false;
@@ -182,9 +254,81 @@ export class AppComponent implements OnInit {
182
254
  }
183
255
  this.initializeApp('oninit');
184
256
 
257
+ this.listenToPostMsgs();
185
258
  }
186
259
 
187
260
 
261
+
262
+ listenToPostMsgs() {
263
+ window.addEventListener("message", (event) => {
264
+ // console.log("[APP-COMP] message event ", event);
265
+
266
+ if (event && event.data && event.data.action && event.data.parameter) {
267
+ if (event.data.action === 'openJoinConversationModal') {
268
+ // console.log("[APP-COMP] message event action ", event.data.action);
269
+ // console.log("[APP-COMP] message event parameter ", event.data.parameter);
270
+ this.presentAlertConfirmJoinRequest(event.data.parameter, event.data.calledBy)
271
+ }
272
+ }
273
+ if (event && event.data && event.data.action && event.data.text) {
274
+ if (event.data.action === "display_toast_join_complete") {
275
+ this.presentToastJoinComplete(event.data.text)
276
+ }
277
+ }
278
+ })
279
+ }
280
+
281
+ async presentToastJoinComplete(text) {
282
+ const toast = await this.toastController.create({
283
+ message: text,
284
+ duration: 2000,
285
+ color: "success"
286
+ });
287
+ toast.present();
288
+ }
289
+
290
+ async presentAlertConfirmJoinRequest(requestid, calledby) {
291
+ var iframeWin = <HTMLIFrameElement>document.getElementById("unassigned-convs-iframe")
292
+ // console.log("[APP-COMP] message event iframeWin ", iframeWin);
293
+
294
+ const isIFrame = (input: HTMLElement | null): input is HTMLIFrameElement =>
295
+ input !== null && input.tagName === 'IFRAME';
296
+
297
+ const keys = ['YouAreAboutToJoinThisChat', 'Cancel', 'AreYouSure'];
298
+ const translationMap = this.translateService.translateLanguage(keys);
299
+
300
+ const alert = await this.alertController.create({
301
+ cssClass: 'my-custom-class',
302
+ header: translationMap.get('AreYouSure'),
303
+ message: translationMap.get('YouAreAboutToJoinThisChat'),
304
+ buttons: [
305
+ {
306
+ text: translationMap.get('Cancel'),
307
+ role: 'cancel',
308
+ cssClass: 'secondary',
309
+ handler: (blah) => {
310
+ // console.log('Confirm Cancel: blah', blah);
311
+ }
312
+ }, {
313
+ text: 'Ok',
314
+ handler: () => {
315
+ // console.log('Confirm Okay');
316
+
317
+ if (isIFrame(iframeWin) && iframeWin.contentWindow) {
318
+ const msg = { action: "joinConversation", parameter: requestid, calledBy: calledby }
319
+ iframeWin.contentWindow.postMessage(msg, '*');
320
+ }
321
+ }
322
+ }
323
+ ]
324
+ });
325
+
326
+ await alert.present();
327
+ }
328
+
329
+
330
+
331
+
188
332
  signInWithCustomToken(token) {
189
333
  // this.isOnline = false;
190
334
  this.logger.log('[APP-COMP] SIGNINWITHCUSTOMTOKEN token', token)
@@ -200,18 +344,18 @@ export class AppComponent implements OnInit {
200
344
 
201
345
  /** */
202
346
  initializeApp(calledby: string) {
203
- this.logger.log('[APP-COMP] - X - initializeApp !!! CALLED-BY: ', calledby);
204
- this.logger.log('[APP-COMP] appconfig platform is cordova: ', this.platform.is('cordova'))
347
+ // this.logger.log('[APP-COMP] - X - initializeApp !!! CALLED-BY: ', calledby);
348
+ // console.log('[APP-COMP] appconfig platform is cordova: ', this.platform.is('cordova'))
205
349
 
206
- if (!this.platform.is('cordova')) {
207
- this.splashScreen.show();
208
- }
350
+ // if (!this.platform.is('cordova')) {
351
+ this.splashScreen.show();
352
+ // }
209
353
  this.tabTitle = document.title;
210
354
 
211
355
  this.getRouteParamsAndSetLoggerConfig();
212
356
 
213
357
  const appconfig = this.appConfigProvider.getConfig();
214
- this.logger.info('[APP-COMP] appconfig: ', appconfig)
358
+ // this.logger.info('[APP-COMP] appconfig: ', appconfig)
215
359
  this.version = PACKAGE.version;
216
360
  this.logger.info('[APP-COMP] version: ', this.version)
217
361
 
@@ -223,12 +367,39 @@ export class AppComponent implements OnInit {
223
367
  this.notificationsEnabled = true;
224
368
  this.zone = new NgZone({}); // a cosa serve?
225
369
 
370
+ // ------------------------------------------
371
+ // Platform ready
372
+ // ------------------------------------------
226
373
  this.platform.ready().then(() => {
227
- this.setLanguage();
374
+ // console.log("Check platform");
375
+ if (this.platform.is('cordova')) {
376
+ // console.log("the device running Cordova");
377
+ }
378
+ if (!this.platform.is('cordova')) {
379
+ // console.log("the device Not running Cordova");
380
+ }
228
381
 
229
- if (this.splashScreen) {
230
- this.splashScreen.hide();
382
+ if (this.platform.is('android')) {
383
+ // console.log("running on Android device!");
384
+ }
385
+ if (this.platform.is('ios')) {
386
+ // console.log("running on iOS device!");
231
387
  }
388
+ if (this.platform.is('mobileweb')) {
389
+ // console.log("running in a browser on mobile!");
390
+ }
391
+ if (this.platform.is('desktop')) {
392
+ // console.log("running on desktop!");
393
+ }
394
+
395
+
396
+
397
+
398
+ this.setLanguage();
399
+
400
+ // if (this.splashScreen) {
401
+ this.splashScreen.hide();
402
+ // }
232
403
  this.statusBar.styleDefault();
233
404
  this.navService.init(this.sidebarNav, this.detailNav);
234
405
  // this.persistence = appconfig.authPersistence;
@@ -320,9 +491,9 @@ export class AppComponent implements OnInit {
320
491
  getRouteParamsAndSetLoggerConfig() {
321
492
  const appconfig = this.appConfigProvider.getConfig();
322
493
  this.route.queryParams.subscribe(params => {
323
- this.logger.info('[APP-COMP] getRouteParamsAndSetLoggerConfig - queryParams params: ', params)
494
+ // this.logger.log('[APP-COMP] getRouteParamsAndSetLoggerConfig - queryParams params: ', params)
324
495
  if (params.logLevel) {
325
- this.logger.info('[APP-COMP] getRouteParamsAndSetLoggerConfig - log level get from queryParams: ', params.logLevel)
496
+ this.logger.log('[APP-COMP] getRouteParamsAndSetLoggerConfig - log level get from queryParams: ', params.logLevel)
326
497
  this.logger.setLoggerConfig(true, params.logLevel)
327
498
  } else {
328
499
  this.logger.info('[APP-COMP] getRouteParamsAndSetLoggerConfig - log level get from appconfig: ', appconfig.logLevel)
@@ -352,6 +523,7 @@ export class AppComponent implements OnInit {
352
523
  /**------- AUTHENTICATION FUNCTIONS --> START <--- +*/
353
524
  private initAuthentication() {
354
525
  const tiledeskToken = this.appStorageService.getItem('tiledeskToken')
526
+
355
527
  this.logger.log('[APP-COMP] >>> INIT-AUTHENTICATION !!! ')
356
528
  this.logger.log('[APP-COMP] >>> initAuthentication tiledeskToken ', tiledeskToken)
357
529
  // const currentUser = JSON.parse(this.appStorageService.getItem('currentUser'));
@@ -360,19 +532,19 @@ export class AppComponent implements OnInit {
360
532
  this.logger.log('[APP-COMP] >>> initAuthentication I LOG IN WITH A TOKEN EXISTING IN THE LOCAL STORAGE OR WITH A TOKEN PASSED IN THE URL PARAMETERS <<<')
361
533
  this.tiledeskAuthService.signInWithCustomToken(tiledeskToken).then(user => {
362
534
  this.logger.log('[APP-COMP] >>> initAuthentication user ', user)
363
- this.messagingAuthService.createCustomToken(tiledeskToken)
535
+ this.messagingAuthService.createCustomToken(tiledeskToken)
364
536
  }).catch(error => {
365
537
  this.logger.error('[APP-COMP] initAuthentication SIGNINWITHCUSTOMTOKEN error::', error)
366
538
  })
367
539
  } else {
368
540
  this.logger.warn('[APP-COMP] >>> I AM NOT LOGGED IN <<<')
369
-
541
+
370
542
  // clearTimeout(this.timeModalLogin);
371
543
  // this.timeModalLogin = setTimeout(() => {
372
- if (!this.hadBeenCalledOpenModal) {
373
- this.authModal = this.presentModal('initAuthentication');
374
- this.hadBeenCalledOpenModal = true;
375
- }
544
+ if (!this.hadBeenCalledOpenModal) {
545
+ this.authModal = this.presentModal('initAuthentication');
546
+ this.hadBeenCalledOpenModal = true;
547
+ }
376
548
  // }, 1000);
377
549
  }
378
550
  }
@@ -385,6 +557,18 @@ export class AppComponent implements OnInit {
385
557
  // }
386
558
  // }
387
559
 
560
+ connetWebsocket(tiledeskToken) {
561
+ const appconfig = this.appConfigProvider.getConfig();
562
+ this.logger.log('connetWebsocket appconfig wsUrl ', appconfig.wsUrl)
563
+ const WS_URL = appconfig.wsUrl + '?token=' + tiledeskToken
564
+ this.webSocketJs.init(
565
+ WS_URL,
566
+ undefined,
567
+ undefined,
568
+ undefined
569
+ );
570
+ }
571
+
388
572
  /**
389
573
  * goOnLine:
390
574
  * 1 - nascondo splashscreen
@@ -396,8 +580,10 @@ export class AppComponent implements OnInit {
396
580
  // this.isOnline = true;
397
581
  // this.logger.info('initialize FROM [APP-COMP] - [APP-COMP] - GO-ONLINE isOnline ', this.isOnline);
398
582
 
399
- clearTimeout(this.timeModalLogin);
583
+ // clearTimeout(this.timeModalLogin);
400
584
  const tiledeskToken = this.tiledeskAuthService.getTiledeskToken();
585
+ this.connetWebsocket(tiledeskToken)
586
+
401
587
  const currentUser = this.tiledeskAuthService.getCurrentUser();
402
588
  // this.logger.printDebug('APP-COMP - goOnLine****', currentUser);
403
589
  this.logger.log('[APP-COMP] - GO-ONLINE - currentUser ', currentUser);
@@ -429,8 +615,16 @@ export class AppComponent implements OnInit {
429
615
  this.chatManager.startApp();
430
616
  }
431
617
 
618
+
619
+ webSocketClose() {
620
+ this.logger.log('[APP-COMP] - GO-OFFLINE - webSocketClose');
621
+ this.webSocketJs.close()
622
+ }
623
+
432
624
  goOffLine = () => {
433
625
  this.logger.log('[APP-COMP] - GO-OFFLINE');
626
+
627
+ this.webSocketClose()
434
628
  // this.isOnline = false;
435
629
  // this.conversationsHandlerService.conversations = [];
436
630
 
@@ -439,13 +633,13 @@ export class AppComponent implements OnInit {
439
633
  this.chatManager.goOffLine();
440
634
 
441
635
  this.router.navigateByUrl('conversation-detail/'); //redirect to basePage
442
-
636
+
443
637
  // clearTimeout(this.timeModalLogin);
444
638
  // this.timeModalLogin = setTimeout(() => {
445
- if (!this.hadBeenCalledOpenModal) {
446
- this.authModal = this.presentModal('goOffLine');
447
- this.hadBeenCalledOpenModal = true
448
- }
639
+ if (!this.hadBeenCalledOpenModal) {
640
+ this.authModal = this.presentModal('goOffLine');
641
+ this.hadBeenCalledOpenModal = true
642
+ }
449
643
  // }, 1000);
450
644
 
451
645
  // this.unsubscribe$.next();
@@ -601,8 +795,8 @@ export class AppComponent implements OnInit {
601
795
  return;
602
796
  }
603
797
 
604
- this.BSAuthStateChangedSubscriptionRef = this.messagingAuthService.BSAuthStateChanged
605
-
798
+ this.BSAuthStateChangedSubscriptionRef = this.messagingAuthService.BSAuthStateChanged
799
+
606
800
  // .pipe(takeUntil(this.unsubscribe$))
607
801
  .pipe(filter((state) => state !== null))
608
802
  .subscribe((state: any) => {
@@ -658,7 +852,7 @@ export class AppComponent implements OnInit {
658
852
  * apro dettaglio conversazione
659
853
  */
660
854
  subscribeChangedConversationSelected = (user: UserModel, type: string) => {
661
- this.logger.info('[APP-COMP] subscribeUidConvSelectedChanged navigateByUrl', user, type);
855
+ this.logger.log('[APP-COMP] subscribeUidConvSelectedChanged navigateByUrl', user, type);
662
856
  // this.router.navigateByUrl('conversation-detail/' + user.uid + '?conversationWithFullname=' + user.fullname);
663
857
  this.router.navigateByUrl('conversation-detail/' + user.uid + '/' + user.fullname + '/' + type);
664
858
  }
@@ -848,7 +1042,7 @@ export class AppComponent implements OnInit {
848
1042
  // https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event
849
1043
  @HostListener('window:storage', ['$event'])
850
1044
  onStorageChanged(event: any) {
851
- // console.log('[APP-COMP] - onStorageChanged event ', event)
1045
+
852
1046
  if (event.key !== 'chat_sv5__tiledeskToken') {
853
1047
  return;
854
1048
  }
@@ -877,7 +1071,7 @@ export class AppComponent implements OnInit {
877
1071
  // this.unsubscribe$.complete();
878
1072
  this.initializeApp('onstoragechanged');
879
1073
 
880
-
1074
+
881
1075
 
882
1076
  // console.log('[APP-COMP] onAuthStateChanged HERE !!! ')
883
1077
  // firebase.auth().onAuthStateChanged(user => {
@@ -887,7 +1081,4 @@ export class AppComponent implements OnInit {
887
1081
  }
888
1082
  }
889
1083
  }
890
-
891
-
892
-
893
1084
  }
@@ -94,7 +94,8 @@ import { TooltipModule } from 'ng2-tooltip-directive';
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
+ import { UnassignedConversationsPageModule } from './pages/unassigned-conversations/unassigned-conversations.module';
98
99
 
99
100
  // FACTORIES
100
101
  export function createTranslateLoader(http: HttpClient) {
@@ -102,7 +103,7 @@ export function createTranslateLoader(http: HttpClient) {
102
103
 
103
104
  }
104
105
 
105
- export function authenticationFactory(http: HttpClient, appConfig: AppConfigProvider, chat21Service: Chat21Service, appSorage: AppStorageService, network: Network, connectionService:ConnectionService) {
106
+ export function authenticationFactory(http: HttpClient, appConfig: AppConfigProvider, chat21Service: Chat21Service, appSorage: AppStorageService, network: Network, connectionService: ConnectionService) {
106
107
  const config = appConfig.getConfig()
107
108
  if (config.chatEngine === CHAT_ENGINE_MQTT) {
108
109
 
@@ -111,8 +112,13 @@ export function authenticationFactory(http: HttpClient, appConfig: AppConfigProv
111
112
 
112
113
  const auth = new MQTTAuthService(http, chat21Service, appSorage);
113
114
 
114
- auth.setBaseUrl(appConfig.getConfig().apiUrl)
115
-
115
+ auth.setBaseUrl(appConfig.getConfig().apiUrl);
116
+
117
+ if (config.pushEngine = PUSH_ENGINE_MQTT) {
118
+ // FOR PUSH NOTIFICATIONS INIT FIREBASE APP
119
+ FirebaseInitService.initFirebase(config.firebaseConfig);
120
+ }
121
+
116
122
  return auth
117
123
  } else {
118
124
 
@@ -120,7 +126,7 @@ export function authenticationFactory(http: HttpClient, appConfig: AppConfigProv
120
126
  // console.log('[APP-MOD] FirebaseInitService config ', config)
121
127
  const auth = new FirebaseAuthService(http, network, connectionService);
122
128
  auth.setBaseUrl(config.apiUrl)
123
-
129
+
124
130
  return auth
125
131
  }
126
132
  }
@@ -216,12 +222,12 @@ export function uploadFactory(http: HttpClient, appConfig: AppConfigProvider, ap
216
222
  }
217
223
  }
218
224
 
219
- export function notificationsServiceFactory(appConfig: AppConfigProvider) {
225
+ export function notificationsServiceFactory(appConfig: AppConfigProvider, chat21Service: Chat21Service) {
220
226
  const config = appConfig.getConfig()
221
227
  if (config.pushEngine === PUSH_ENGINE_FIREBASE) {
222
228
  return new FirebaseNotifications();
223
229
  } else if (config.pushEngine === PUSH_ENGINE_MQTT) {
224
- return new MQTTNotifications();
230
+ return new MQTTNotifications(chat21Service);
225
231
  } else {
226
232
  return;
227
233
  }
@@ -253,6 +259,7 @@ const appInitializerFn = (appConfig: AppConfigProvider, logger: NGXLogger) => {
253
259
  LoginPageModule,
254
260
  ConversationListPageModule,
255
261
  ConversationDetailPageModule,
262
+ UnassignedConversationsPageModule,
256
263
  TranslateModule.forRoot({
257
264
  loader: {
258
265
  provide: TranslateLoader,
@@ -338,7 +345,7 @@ const appInitializerFn = (appConfig: AppConfigProvider, logger: NGXLogger) => {
338
345
  {
339
346
  provide: NotificationsService,
340
347
  useFactory: notificationsServiceFactory,
341
- deps: [AppConfigProvider]
348
+ deps: [AppConfigProvider, Chat21Service]
342
349
  },
343
350
  {
344
351
  provide: AppStorageService,
@@ -352,6 +359,7 @@ const appInitializerFn = (appConfig: AppConfigProvider, logger: NGXLogger) => {
352
359
  EventsService,
353
360
  Chooser,
354
361
  Chat21Service,
362
+ WebSocketJs
355
363
  ]
356
364
  })
357
365
  export class AppModule { }
@@ -67,8 +67,8 @@
67
67
  <div role="messaggio" *ngIf="messageType(MESSAGE_TYPE_MINE, message)" class="msg_container base_sent">
68
68
 
69
69
  <!--backgroundColor non viene ancora usato -->
70
- <chat-bubble-message
71
- class="messages msg_sent" id="{{'message'+'_'+ i}}"
70
+ <chat-bubble-message [ngClass]="{'has-metadata': (isImage(message) || isFrame(message))}"
71
+ class="messages msg_sent" id="message_msg_sent"
72
72
  [ngClass]="{'button-in-msg' : message.metadata && message.metadata.button}" [message]="message"
73
73
  [textColor]="'col-msg-sent'"
74
74
  (onBeforeMessageRender)="returnOnBeforeMessageRender($event)"
@@ -98,8 +98,8 @@
98
98
  </chat-avatar-image> -->
99
99
 
100
100
  <!--backgroundColor non viene ancora usato -->
101
-
102
- <chat-bubble-message class="messages msg_receive"
101
+
102
+ <chat-bubble-message [ngClass]="{'has-metadata': (isImage(message) || isFrame(message))}" class="messages msg_receive" id="message_msg_receive"
103
103
  [message]="message"
104
104
  [textColor]="'black'"
105
105
  (onBeforeMessageRender)="returnOnBeforeMessageRender($event)"
@@ -93,7 +93,9 @@ ion-item {
93
93
 
94
94
  }
95
95
 
96
-
96
+ .has-metadata {
97
+ max-width: 100% !important;
98
+ }
97
99
  }
98
100
 
99
101
  /** recive message **/
@@ -138,7 +140,11 @@ ion-item {
138
140
  border-top-left-radius: 8px;
139
141
  border-bottom-left-radius: 0px;
140
142
 
141
- }
143
+ }
144
+
145
+ .has-metadata {
146
+ max-width: 100% !important;
147
+ }
142
148
  }
143
149
 
144
150
  .time{
@@ -5,6 +5,7 @@ import { ChangeDetectorRef, Component, Input, OnInit, Output, EventEmitter} from
5
5
  import { MESSAGE_TYPE_INFO, MESSAGE_TYPE_MINE, MESSAGE_TYPE_OTHERS } from 'src/chat21-core/utils/constants';
6
6
  import { isChannelTypeGroup, isFirstMessage, isInfo, isMine, messageType } from 'src/chat21-core/utils/utils-message';
7
7
  import { UploadService } from 'src/chat21-core/providers/abstract/upload.service';
8
+ import { isFile, isFrame, isImage } from 'src/chat21-core/utils/utils-message';
8
9
 
9
10
  import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
10
11
  import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
@@ -25,6 +26,10 @@ export class IonConversationDetailComponent extends ConversationContentComponent
25
26
  public uploadProgress: number = 100
26
27
  public fileType: any
27
28
 
29
+ isImage = isImage;
30
+ isFile = isFile;
31
+ isFrame = isFrame;
32
+
28
33
  isMine = isMine;
29
34
  isInfo = isInfo;
30
35
  isFirstMessage = isFirstMessage;
@@ -34,7 +39,7 @@ export class IonConversationDetailComponent extends ConversationContentComponent
34
39
  MESSAGE_TYPE_INFO = MESSAGE_TYPE_INFO;
35
40
  MESSAGE_TYPE_MINE = MESSAGE_TYPE_MINE;
36
41
  MESSAGE_TYPE_OTHERS = MESSAGE_TYPE_OTHERS;
37
-
42
+ logger: LoggerService = LoggerInstance.getInstance()
38
43
  /**
39
44
  * Constructor
40
45
  * @param cdref
@@ -1,7 +1,7 @@
1
1
  <!-- [ngClass]="{'button-in-msg' : message.metadata && message.metadata.button}" -->
2
2
  <!-- [ngStyle]="{'padding': (isImage(message) || isFrame(message))?'0px':'0 8px'}" -->
3
3
  <!-- isImage >{{isImage(message) }} message.metadata.width {{message?.metadata?.width }} -->
4
- <div [ngStyle]="{'padding': (isImage(message) || isFrame(message))?'0px':'0 8px', 'width': (isImage(message) || isFrame(message))? message?.metadata?.width + 'px' : null }"
4
+ <div id="bubble-message" [ngStyle]="{'padding': (isImage(message) || isFrame(message))?'0px':'0 8px', 'width': (isImage(message) || isFrame(message))? message?.metadata?.width + 'px' : null }"
5
5
  class="messages primary-color"
6
6
  [class.emoticon]="message?.emoticon">
7
7
 
@@ -87,7 +87,7 @@ export class BubbleMessageComponent implements OnInit, OnChanges {
87
87
 
88
88
  ngOnChanges() {
89
89
  // console.log('BUBBLE-MSG Hello !!!! this.message ', this.message)
90
- if (this.message && this.message.metadata) {
90
+ if (this.message && this.message.metadata && typeof this.message.metadata === 'object') {
91
91
  this.getMetadataSize(this.message.metadata)
92
92
  // console.log('BUBBLE-MSG ngOnChanges message > metadata', this.message.metadata)
93
93
  }
@@ -1,9 +1,10 @@
1
1
  <div [ngStyle]="{ 'max-width': width +'px', 'max-height': height +'px' }" style="position: relative; ">
2
2
  <div *ngIf="loading" class="loader" [ngStyle]="{ 'width': width +'px', 'height': height +'px' }"></div>
3
- <img [ngStyle]="{ 'width': width +'px', 'height': height +'px' }" style="cursor:pointer" [tooltip]="timeTooltipRight" [options]="tooltipOptions" placement="bottom"
4
- content-type="template" class="message-contentX message-content-imageX" [ngClass]="{'isLoadingImage': loading}"
5
- [src]="metadata.src" (load)="onLoaded($event)" (click)="downloadImage(metadata.src, metadata.name)" />
6
- <ng-template #timeTooltipRight>
3
+ <!-- [tooltip]="timeTooltipRight" [options]="tooltipOptions" placement="bottom" content-type="template" -->
4
+ <img id="myImg" [ngStyle]="{ 'width': width +'px', 'height': height +'px' }" style="cursor:pointer"
5
+ class="message-contentX message-content-imageX" [ngClass]="{'isLoadingImage': loading}"
6
+ [src]="metadata.src" (load)="onLoaded($event)" (click)="openImageViewerModal(metadata.src, metadata.name)" />
7
+ <!-- <ng-template #timeTooltipRight>
7
8
  <span>{{ tooltipMessage }}</span>
8
- </ng-template>
9
- </div>
9
+ </ng-template> -->
10
+ </div>