@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.
- package/CHANGELOG.md +46 -0
- package/README.md +4 -0
- package/config.xml +11 -2
- package/env.sample +2 -0
- package/package.json +1 -1
- package/resources/Android/splash/drawable-land-hdpi-screen.png +0 -0
- package/resources/Android/splash/drawable-land-ldpi-screen.png +0 -0
- package/resources/Android/splash/drawable-land-mdpi-screen.png +0 -0
- package/resources/Android/splash/drawable-land-xhdpi-screen.png +0 -0
- package/resources/Android/splash/drawable-land-xxhdpi-screen.png +0 -0
- package/resources/Android/splash/drawable-land-xxxhdpi-screen.png +0 -0
- package/resources/Android/splash/drawable-port-hdpi-screen.png +0 -0
- package/resources/Android/splash/drawable-port-ldpi-screen.png +0 -0
- package/resources/Android/splash/drawable-port-mdpi-screen.png +0 -0
- package/resources/Android/splash/drawable-port-xhdpi-screen.png +0 -0
- package/resources/Android/splash/drawable-port-xxhdpi-screen.png +0 -0
- package/resources/Android/splash/drawable-port-xxxhdpi-screen.png +0 -0
- package/resources/Android/splash.png +0 -0
- package/src/app/app-routing.module.ts +21 -17
- package/src/app/app.component.html +6 -3
- package/src/app/app.component.ts +242 -51
- package/src/app/app.module.ts +16 -8
- package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +4 -4
- package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.scss +8 -2
- package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.ts +6 -1
- package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.html +1 -1
- package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +1 -1
- package/src/app/chatlib/conversation-detail/message/image/image.component.html +7 -6
- package/src/app/chatlib/conversation-detail/message/image/image.component.ts +20 -1
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +39 -9
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.scss +8 -144
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +14 -17
- package/src/app/components/authentication/login/login.component.html +2 -2
- package/src/app/components/authentication/login/login.component.ts +2 -1
- package/src/app/components/conversation-detail/bubble-my-message/bubble-my-message.component.ts +1 -1
- package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +3 -2
- package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.ts +3 -3
- package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +46 -5
- package/src/app/components/ddp-header/ddp-header.component.html +1 -1
- package/src/app/components/ddp-header/ddp-header.component.ts +4 -2
- package/src/app/components/image-viewer/image-viewer.component.html +23 -0
- package/src/app/components/image-viewer/image-viewer.component.scss +107 -0
- package/src/app/components/image-viewer/image-viewer.component.spec.ts +24 -0
- package/src/app/components/image-viewer/image-viewer.component.ts +38 -0
- package/src/app/components/project-item/project-item.component.html +147 -0
- package/src/app/components/project-item/project-item.component.scss +669 -0
- package/src/app/components/project-item/project-item.component.spec.ts +24 -0
- package/src/app/components/project-item/project-item.component.ts +316 -0
- package/src/app/components/utils/avatar-profile/avatar-profile.component.html +9 -3
- package/src/app/components/utils/avatar-profile/avatar-profile.component.ts +6 -4
- package/src/app/pages/authentication/login/login.page.ts +1 -1
- package/src/app/pages/conversation-detail/conversation-detail.page.html +5 -3
- package/src/app/pages/conversation-detail/conversation-detail.page.ts +122 -30
- package/src/app/pages/conversations-list/conversations-list.page.html +40 -24
- package/src/app/pages/conversations-list/conversations-list.page.scss +146 -1
- package/src/app/pages/conversations-list/conversations-list.page.ts +87 -6
- package/src/app/pages/unassigned-conversations/unassigned-conversations-routing.module.ts +17 -0
- package/src/app/pages/unassigned-conversations/unassigned-conversations.module.ts +22 -0
- package/src/app/pages/unassigned-conversations/unassigned-conversations.page.html +22 -0
- package/src/app/pages/unassigned-conversations/unassigned-conversations.page.scss +79 -0
- package/src/app/pages/unassigned-conversations/unassigned-conversations.page.spec.ts +24 -0
- package/src/app/pages/unassigned-conversations/unassigned-conversations.page.ts +108 -0
- package/src/app/services/nav-proxy.service.ts +1 -1
- package/src/app/services/tiledesk/tiledesk.service.ts +22 -1
- package/src/app/services/websocket/websocket-js.ts +559 -0
- package/src/app/services/websocket/websocket.service.spec.ts +12 -0
- package/src/app/services/websocket/websocket.service.ts +274 -0
- package/src/app/shared/shared.module.ts +7 -1
- package/src/assets/i18n/en.json +9 -1
- package/src/assets/i18n/it.json +9 -1
- package/src/assets/js/chat21client.js +141 -67
- package/src/assets/transparent.png +0 -0
- package/src/chat-config-pre-test.json +3 -1
- package/src/chat-config-template.json +3 -1
- package/src/chat-config.json +3 -1
- package/src/chat21-core/providers/chat-manager.ts +3 -3
- package/src/chat21-core/providers/firebase/firebase-archivedconversations-handler.ts +1 -1
- package/src/chat21-core/providers/firebase/firebase-auth-service.ts +3 -3
- package/src/chat21-core/providers/firebase/firebase-conversation-handler.ts +1 -1
- package/src/chat21-core/providers/firebase/firebase-notifications.ts +1 -1
- package/src/chat21-core/providers/firebase/firebase-presence.service.ts +2 -2
- package/src/chat21-core/providers/firebase/firebase-typing.service.ts +1 -1
- package/src/chat21-core/providers/firebase/firebase-upload.service.ts +1 -1
- package/src/chat21-core/providers/mqtt/mqtt-auth-service.ts +27 -27
- package/src/chat21-core/providers/mqtt/mqtt-conversations-handler.ts +13 -5
- package/src/chat21-core/providers/mqtt/mqtt-notifications.ts +101 -11
- package/src/chat21-core/providers/tiledesk/tiledesk-auth.service.ts +1 -1
- package/src/chat21-core/utils/utils.ts +1 -1
package/src/app/app.component.ts
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
-
|
|
142
|
-
//
|
|
143
|
-
//
|
|
144
|
-
//
|
|
145
|
-
//
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
230
|
-
|
|
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.
|
|
494
|
+
// this.logger.log('[APP-COMP] getRouteParamsAndSetLoggerConfig - queryParams params: ', params)
|
|
324
495
|
if (params.logLevel) {
|
|
325
|
-
this.logger.
|
|
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
|
-
|
|
373
|
-
|
|
374
|
-
|
|
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
|
-
|
|
446
|
-
|
|
447
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
}
|
package/src/app/app.module.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.html
CHANGED
|
@@ -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
|
|
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
|
|
package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts
CHANGED
|
@@ -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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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>
|