@chat21/chat21-ionic 3.0.59-rc3 → 3.0.59-rc9
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 +28 -1
- package/env.sample +2 -0
- package/package.json +1 -1
- package/src/app/app-routing.module.ts +21 -17
- package/src/app/app.component.ts +200 -36
- package/src/app/app.module.ts +4 -1
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +20 -8
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.scss +0 -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/message-text-area/message-text-area.component.ts +0 -7
- 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/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/pages/authentication/login/login.page.ts +1 -1
- package/src/app/pages/conversation-detail/conversation-detail.page.ts +26 -22
- package/src/app/pages/conversations-list/conversations-list.page.html +40 -23
- package/src/app/pages/conversations-list/conversations-list.page.scss +146 -1
- package/src/app/pages/conversations-list/conversations-list.page.ts +71 -5
- 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/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 +3 -0
- package/src/assets/i18n/en.json +9 -1
- package/src/assets/i18n/it.json +9 -1
- 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/firebase/firebase-auth-service.ts +2 -2
- package/src/chat21-core/providers/mqtt/mqtt-auth-service.ts +27 -27
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# chat21-ionic ver 3.0
|
|
2
2
|
|
|
3
|
+
### 3.0.59-rc9
|
|
4
|
+
- Changes in the archived conversations the date format if the browser language is English
|
|
5
|
+
- Displays the button to open the contact list for direct conversations and the entry at the top of the conversation list showing the number of unassigned conversations for a selected project if the "supportMode" configuration property is set to true
|
|
6
|
+
- Adds a style rule on the unassigned conversations page that changes the background of the "ion-content" if the project list is displayed in the iframe
|
|
7
|
+
- Adds "supportMode" property to env.sample, chat-config-template.json and chat-config.json
|
|
8
|
+
|
|
9
|
+
### 3.0.59-rc8
|
|
10
|
+
- Changes the title of the modal window showing unassigned conversations from "Unassigned Conversations" to "New Conversations"
|
|
11
|
+
- Fixes the bug: if the "chatEngine" property value is set to "mqtt" the login modal window does not disappear even if the agent is logged in
|
|
12
|
+
- Fixed the value of the configuration property "dashboardUrl"
|
|
13
|
+
|
|
14
|
+
### 3.0.59-rc7
|
|
15
|
+
- Fixes the bug "Cannot read properties of undefined (reading 'get')" in component template showing the number of new conversations
|
|
16
|
+
- Fixes the bug: the value of the "supportMode" property is passed hard-coded
|
|
17
|
+
|
|
18
|
+
### 3.0.59-rc6
|
|
19
|
+
- Outsources the websocket URL to environments
|
|
20
|
+
- Improves the graphic of the element, positioned at the top of the conversation list, which displays the number of new conversations
|
|
21
|
+
- Adds "wsUrl" property to env.sample, chat-config-template.json and chat-config.json
|
|
22
|
+
- Updates environments with "wsUrl" property
|
|
23
|
+
|
|
24
|
+
### 3.0.59-rc5
|
|
25
|
+
- Display a "toast message" of success after that the agent has joined to an unassigned conversation and other minor improvements
|
|
26
|
+
|
|
27
|
+
### 3.0.59-rc4
|
|
28
|
+
- Adds an item to the top of the conversation list that shows the number of unassigned conversations for a selected project
|
|
29
|
+
- Adds the ability, by clicking on the element that displays the number of unassigned conversations, to view the unassigned conversations and to join to them or archive them
|
|
30
|
+
|
|
3
31
|
### 3.0.59-rc3
|
|
4
32
|
- Improves the method that allows to chain multiple canned responses
|
|
5
33
|
|
|
@@ -8,7 +36,6 @@
|
|
|
8
36
|
- Adds in the "bubble-message" component a check if the metadata is an object before calling the getMetadataSize() method
|
|
9
37
|
- Hides the "canned responses" if there are whitespace after the forward slash "/" or if there are no whitespace before the forward slash "/"
|
|
10
38
|
- Fixes the bug: if the "canned responses" are selected with the mouse, the "send message" text area does not have focus
|
|
11
|
-
- Fixes the bug: on mobile devices, a blank page appears when the hardware back button is pressed in the conversation list
|
|
12
39
|
- Adds the image viewer and the ability to download an image from it
|
|
13
40
|
- Fixes the position of the "archive" button when the app runs on mobile devices
|
|
14
41
|
- Updates Android splash screen .png image
|
package/env.sample
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
API_BASEIMAGE_URL=CHANGEIT
|
|
2
2
|
DASHBOARD_URL=https://YOUR_DASHBOARD_URL
|
|
3
|
+
WS_URL=wss://YOUR_TILEDESK_SERVER_URL?token=
|
|
3
4
|
|
|
4
5
|
SERVER_BASE_URL=http://localhost:3000/
|
|
5
6
|
|
|
@@ -9,6 +10,7 @@ PUSH_ENGINE=none
|
|
|
9
10
|
FILE_UPLOAD_ACCEPT=*/*
|
|
10
11
|
TENANT=tilechat
|
|
11
12
|
LOG_LEVEL=INFO
|
|
13
|
+
SUPPORT_MODE=false
|
|
12
14
|
|
|
13
15
|
# For MQTT Chat Engine
|
|
14
16
|
MQTT_APPID=tilechat
|
package/package.json
CHANGED
|
@@ -29,6 +29,27 @@ const routes: Routes = [
|
|
|
29
29
|
loadChildren: './pages/conversation-detail/conversation-detail.module#ConversationDetailPageModule'
|
|
30
30
|
|
|
31
31
|
},
|
|
32
|
+
{
|
|
33
|
+
path: 'contacts-directory',
|
|
34
|
+
loadChildren: () => import('./pages/contacts-directory/contacts-directory.module').then( m => m.ContactsDirectoryPageModule)
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
path: 'login',
|
|
38
|
+
loadChildren: () => import('./pages/authentication/login/login.module').then( m => m.LoginPageModule)
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
path: 'profile-info',
|
|
42
|
+
loadChildren: () => import('./pages/profile-info/profile-info.module').then( m => m.ProfileInfoPageModule)
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
path: 'loader-preview',
|
|
46
|
+
loadChildren: () => import('./pages/loader-preview/loader-preview.module').then( m => m.LoaderPreviewPageModule)
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
path: 'unassigned-conversations',
|
|
50
|
+
loadChildren: () => import('./pages/unassigned-conversations/unassigned-conversations.module').then( m => m.UnassignedConversationsPageModule)
|
|
51
|
+
}
|
|
52
|
+
|
|
32
53
|
|
|
33
54
|
// {
|
|
34
55
|
// path: 'conversation-detail/:IDConv',
|
|
@@ -50,23 +71,6 @@ const routes: Routes = [
|
|
|
50
71
|
// // loadChildren: () => import('./pages/details/details.module').then( m => m.DetailsPageModule),
|
|
51
72
|
// // loadChildren: './pages/details/details.module',
|
|
52
73
|
// },
|
|
53
|
-
{
|
|
54
|
-
path: 'contacts-directory',
|
|
55
|
-
loadChildren: () => import('./pages/contacts-directory/contacts-directory.module').then( m => m.ContactsDirectoryPageModule)
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
path: 'login',
|
|
59
|
-
loadChildren: () => import('./pages/authentication/login/login.module').then( m => m.LoginPageModule)
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
path: 'profile-info',
|
|
63
|
-
loadChildren: () => import('./pages/profile-info/profile-info.module').then( m => m.ProfileInfoPageModule)
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
path: 'loader-preview',
|
|
67
|
-
loadChildren: () => import('./pages/loader-preview/loader-preview.module').then( m => m.LoaderPreviewPageModule)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
74
|
|
|
71
75
|
|
|
72
76
|
// {
|
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,23 +137,94 @@ 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() {
|
|
@@ -182,8 +254,80 @@ export class AppComponent implements OnInit {
|
|
|
182
254
|
}
|
|
183
255
|
this.initializeApp('oninit');
|
|
184
256
|
|
|
257
|
+
this.listenToPostMsgs();
|
|
258
|
+
}
|
|
259
|
+
|
|
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();
|
|
185
288
|
}
|
|
186
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
|
+
|
|
187
331
|
|
|
188
332
|
signInWithCustomToken(token) {
|
|
189
333
|
// this.isOnline = false;
|
|
@@ -352,6 +496,7 @@ export class AppComponent implements OnInit {
|
|
|
352
496
|
/**------- AUTHENTICATION FUNCTIONS --> START <--- +*/
|
|
353
497
|
private initAuthentication() {
|
|
354
498
|
const tiledeskToken = this.appStorageService.getItem('tiledeskToken')
|
|
499
|
+
|
|
355
500
|
this.logger.log('[APP-COMP] >>> INIT-AUTHENTICATION !!! ')
|
|
356
501
|
this.logger.log('[APP-COMP] >>> initAuthentication tiledeskToken ', tiledeskToken)
|
|
357
502
|
// const currentUser = JSON.parse(this.appStorageService.getItem('currentUser'));
|
|
@@ -360,19 +505,19 @@ export class AppComponent implements OnInit {
|
|
|
360
505
|
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
506
|
this.tiledeskAuthService.signInWithCustomToken(tiledeskToken).then(user => {
|
|
362
507
|
this.logger.log('[APP-COMP] >>> initAuthentication user ', user)
|
|
363
|
-
this.messagingAuthService.createCustomToken(tiledeskToken)
|
|
508
|
+
this.messagingAuthService.createCustomToken(tiledeskToken)
|
|
364
509
|
}).catch(error => {
|
|
365
510
|
this.logger.error('[APP-COMP] initAuthentication SIGNINWITHCUSTOMTOKEN error::', error)
|
|
366
511
|
})
|
|
367
512
|
} else {
|
|
368
513
|
this.logger.warn('[APP-COMP] >>> I AM NOT LOGGED IN <<<')
|
|
369
|
-
|
|
514
|
+
|
|
370
515
|
// clearTimeout(this.timeModalLogin);
|
|
371
516
|
// this.timeModalLogin = setTimeout(() => {
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
517
|
+
if (!this.hadBeenCalledOpenModal) {
|
|
518
|
+
this.authModal = this.presentModal('initAuthentication');
|
|
519
|
+
this.hadBeenCalledOpenModal = true;
|
|
520
|
+
}
|
|
376
521
|
// }, 1000);
|
|
377
522
|
}
|
|
378
523
|
}
|
|
@@ -385,6 +530,18 @@ export class AppComponent implements OnInit {
|
|
|
385
530
|
// }
|
|
386
531
|
// }
|
|
387
532
|
|
|
533
|
+
connetWebsocket(tiledeskToken) {
|
|
534
|
+
const appconfig = this.appConfigProvider.getConfig();
|
|
535
|
+
this.logger.log('connetWebsocket appconfig wsUrl ', appconfig.wsUrl)
|
|
536
|
+
const WS_URL = appconfig.wsUrl + '?token=' + tiledeskToken
|
|
537
|
+
this.webSocketJs.init(
|
|
538
|
+
WS_URL,
|
|
539
|
+
undefined,
|
|
540
|
+
undefined,
|
|
541
|
+
undefined
|
|
542
|
+
);
|
|
543
|
+
}
|
|
544
|
+
|
|
388
545
|
/**
|
|
389
546
|
* goOnLine:
|
|
390
547
|
* 1 - nascondo splashscreen
|
|
@@ -396,8 +553,10 @@ export class AppComponent implements OnInit {
|
|
|
396
553
|
// this.isOnline = true;
|
|
397
554
|
// this.logger.info('initialize FROM [APP-COMP] - [APP-COMP] - GO-ONLINE isOnline ', this.isOnline);
|
|
398
555
|
|
|
399
|
-
clearTimeout(this.timeModalLogin);
|
|
556
|
+
// clearTimeout(this.timeModalLogin);
|
|
400
557
|
const tiledeskToken = this.tiledeskAuthService.getTiledeskToken();
|
|
558
|
+
this.connetWebsocket(tiledeskToken)
|
|
559
|
+
|
|
401
560
|
const currentUser = this.tiledeskAuthService.getCurrentUser();
|
|
402
561
|
// this.logger.printDebug('APP-COMP - goOnLine****', currentUser);
|
|
403
562
|
this.logger.log('[APP-COMP] - GO-ONLINE - currentUser ', currentUser);
|
|
@@ -429,8 +588,16 @@ export class AppComponent implements OnInit {
|
|
|
429
588
|
this.chatManager.startApp();
|
|
430
589
|
}
|
|
431
590
|
|
|
591
|
+
|
|
592
|
+
webSocketClose() {
|
|
593
|
+
this.logger.log('[APP-COMP] - GO-OFFLINE - webSocketClose');
|
|
594
|
+
this.webSocketJs.close()
|
|
595
|
+
}
|
|
596
|
+
|
|
432
597
|
goOffLine = () => {
|
|
433
598
|
this.logger.log('[APP-COMP] - GO-OFFLINE');
|
|
599
|
+
|
|
600
|
+
this.webSocketClose()
|
|
434
601
|
// this.isOnline = false;
|
|
435
602
|
// this.conversationsHandlerService.conversations = [];
|
|
436
603
|
|
|
@@ -439,13 +606,13 @@ export class AppComponent implements OnInit {
|
|
|
439
606
|
this.chatManager.goOffLine();
|
|
440
607
|
|
|
441
608
|
this.router.navigateByUrl('conversation-detail/'); //redirect to basePage
|
|
442
|
-
|
|
609
|
+
|
|
443
610
|
// clearTimeout(this.timeModalLogin);
|
|
444
611
|
// this.timeModalLogin = setTimeout(() => {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
612
|
+
if (!this.hadBeenCalledOpenModal) {
|
|
613
|
+
this.authModal = this.presentModal('goOffLine');
|
|
614
|
+
this.hadBeenCalledOpenModal = true
|
|
615
|
+
}
|
|
449
616
|
// }, 1000);
|
|
450
617
|
|
|
451
618
|
// this.unsubscribe$.next();
|
|
@@ -601,8 +768,8 @@ export class AppComponent implements OnInit {
|
|
|
601
768
|
return;
|
|
602
769
|
}
|
|
603
770
|
|
|
604
|
-
this.BSAuthStateChangedSubscriptionRef = this.messagingAuthService.BSAuthStateChanged
|
|
605
|
-
|
|
771
|
+
this.BSAuthStateChangedSubscriptionRef = this.messagingAuthService.BSAuthStateChanged
|
|
772
|
+
|
|
606
773
|
// .pipe(takeUntil(this.unsubscribe$))
|
|
607
774
|
.pipe(filter((state) => state !== null))
|
|
608
775
|
.subscribe((state: any) => {
|
|
@@ -848,7 +1015,7 @@ export class AppComponent implements OnInit {
|
|
|
848
1015
|
// https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event
|
|
849
1016
|
@HostListener('window:storage', ['$event'])
|
|
850
1017
|
onStorageChanged(event: any) {
|
|
851
|
-
|
|
1018
|
+
|
|
852
1019
|
if (event.key !== 'chat_sv5__tiledeskToken') {
|
|
853
1020
|
return;
|
|
854
1021
|
}
|
|
@@ -877,7 +1044,7 @@ export class AppComponent implements OnInit {
|
|
|
877
1044
|
// this.unsubscribe$.complete();
|
|
878
1045
|
this.initializeApp('onstoragechanged');
|
|
879
1046
|
|
|
880
|
-
|
|
1047
|
+
|
|
881
1048
|
|
|
882
1049
|
// console.log('[APP-COMP] onAuthStateChanged HERE !!! ')
|
|
883
1050
|
// firebase.auth().onAuthStateChanged(user => {
|
|
@@ -887,7 +1054,4 @@ export class AppComponent implements OnInit {
|
|
|
887
1054
|
}
|
|
888
1055
|
}
|
|
889
1056
|
}
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
1057
|
}
|
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) {
|
|
@@ -253,6 +254,7 @@ const appInitializerFn = (appConfig: AppConfigProvider, logger: NGXLogger) => {
|
|
|
253
254
|
LoginPageModule,
|
|
254
255
|
ConversationListPageModule,
|
|
255
256
|
ConversationDetailPageModule,
|
|
257
|
+
UnassignedConversationsPageModule,
|
|
256
258
|
TranslateModule.forRoot({
|
|
257
259
|
loader: {
|
|
258
260
|
provide: TranslateLoader,
|
|
@@ -352,6 +354,7 @@ const appInitializerFn = (appConfig: AppConfigProvider, logger: NGXLogger) => {
|
|
|
352
354
|
EventsService,
|
|
353
355
|
Chooser,
|
|
354
356
|
Chat21Service,
|
|
357
|
+
WebSocketJs
|
|
355
358
|
]
|
|
356
359
|
})
|
|
357
360
|
export class AppModule { }
|
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
<!-- -------------------------------------------------------------------------- -->
|
|
26
26
|
<!-- New <ion-spinner class="spinner-middle" style="margin-left: 19px;"></ion-spinner> -->
|
|
27
27
|
<!-- -------------------------------------------------------------------------- -->
|
|
28
|
-
<ion-item *ngIf="isOnline === false" button="true" lines="none" class="ion-no-padding waiting-for-connection">
|
|
28
|
+
<!-- <ion-item *ngIf="isOnline === false" button="true" lines="none" class="ion-no-padding waiting-for-connection">
|
|
29
|
+
<div tabindex="0"></div>
|
|
29
30
|
<ion-avatar item-start>
|
|
30
31
|
<div class="sk-fading-circle">
|
|
31
32
|
<div class="sk-circle1 sk-circle"></div>
|
|
@@ -43,7 +44,17 @@
|
|
|
43
44
|
</div>
|
|
44
45
|
</ion-avatar>
|
|
45
46
|
<ion-label part="message-text" class="waiting-for-network-msg"> Waiting for network</ion-label>
|
|
46
|
-
</ion-item>
|
|
47
|
+
</ion-item> -->
|
|
48
|
+
|
|
49
|
+
<!-- <ion-item>
|
|
50
|
+
<div tabindex="0"></div>
|
|
51
|
+
<iframe loading="lazy" width="100%" height="70px" style="border: unset;" [src]="PROJECT_FOR_PANEL"></iframe>
|
|
52
|
+
</ion-item> -->
|
|
53
|
+
<!-- <ion-item button="true" (click)="openUnsevedConversationIframe()">
|
|
54
|
+
<app-project-item
|
|
55
|
+
(projectIdEvent)="getLastProjectId($event)"></app-project-item>
|
|
56
|
+
</ion-item> -->
|
|
57
|
+
|
|
47
58
|
|
|
48
59
|
<!-- <ion-item-sliding disabled>
|
|
49
60
|
<ion-item>
|
|
@@ -63,6 +74,7 @@
|
|
|
63
74
|
</ion-item-options>
|
|
64
75
|
</ion-item-sliding> -->
|
|
65
76
|
|
|
77
|
+
|
|
66
78
|
<ion-item button="true" lines="none" class="ion-no-padding" [class.ion-selected]="conversation.uid === uidConvSelected"
|
|
67
79
|
*ngFor="let conversation of listConversations" (click)="openConversationByID(conversation)" detail=false>
|
|
68
80
|
<div tabindex="0"></div>
|
|
@@ -106,7 +118,8 @@
|
|
|
106
118
|
<ion-note *ngIf="!conversation.archived" class="conversation_time">{{conversation.timestamp | amTimeAgo}}</ion-note>
|
|
107
119
|
|
|
108
120
|
<ion-buttons slot="end">
|
|
109
|
-
<ion-button *ngIf="!conversation.archived"
|
|
121
|
+
<ion-button *ngIf="!conversation.archived"
|
|
122
|
+
[ngClass]="{'hide': !isApp, 'button-on-desktop': !isApp, 'button-on-mobile': isApp }"
|
|
110
123
|
id="{{ 'close_conversation_button' + conversation.uid }}" class="close-conversation-button" ion-button clear
|
|
111
124
|
item-end (click)="closeConversation(conversation);$event.stopPropagation();" padding>
|
|
112
125
|
<ion-icon slot="icon-only" style="display:block;" id="{{ 'close_button_icon' + conversation.uid }}"
|
|
@@ -121,21 +134,20 @@
|
|
|
121
134
|
|
|
122
135
|
<div item-end *ngIf="conversation?.archived" class="achived-icon-wpr">
|
|
123
136
|
<span *ngIf="(conversation.timestamp | amDateFormat:'YYYY') === currentYear" class="time-in-archived">
|
|
124
|
-
{{browserLang === '
|
|
125
|
-
amDateFormat:'MMM DD')}}
|
|
137
|
+
{{browserLang === 'en' ? (conversation.timestamp | amDateFormat:'MMM DD') : (conversation.timestamp| amDateFormat:'DD MMM')}}
|
|
126
138
|
|
|
127
139
|
<!-- {{conversation.timestamp | amDateFormat:'DD MMM'}} -->
|
|
128
140
|
</span>
|
|
129
141
|
<span *ngIf="(conversation.timestamp | amDateFormat:'YYYY') !== currentYear" class="time-in-archived">
|
|
130
|
-
{{browserLang === '
|
|
131
|
-
amDateFormat:'MMM DD YYYY')}}
|
|
142
|
+
{{browserLang === 'en' ? (conversation.timestamp | amDateFormat:'MMM DD YYYY') : (conversation.timestamp| amDateFormat:'DD MMM YYYY') }}
|
|
132
143
|
<!-- {{conversation.timestamp | amDateFormat:'DD MMM YYYY'}} -->
|
|
133
144
|
</span>
|
|
134
145
|
<i class="material-icons" item-end style="font-size: 15px;font-weight: 400;color: #666666;"> history </i>
|
|
135
146
|
</div>
|
|
136
147
|
|
|
137
148
|
<!-- && !conversation?.archived -->
|
|
138
|
-
<div item-end class="notification_point"
|
|
149
|
+
<div item-end class="notification_point"
|
|
150
|
+
[ngClass]="{'notification_point-on-desktop': !isApp, 'notification_point-on-mobile': isApp }"
|
|
139
151
|
*ngIf="conversation.is_new">
|
|
140
152
|
</div>
|
|
141
153
|
|