@chat21/chat21-ionic 3.0.65 → 3.0.68-rc.2
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 +17 -0
- package/deploy_amazon_prod.sh +6 -2
- package/package.json +1 -1
- package/src/app/app.component.ts +90 -56
- package/src/app/app.module.ts +4 -4
- package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.scss +8 -0
- package/src/app/chatlib/conversation-detail/message/info-message/info-message.component.ts +0 -2
- package/src/app/chatlib/conversation-detail/message/return-receipt/return-receipt.component.html +49 -4
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +1 -3
- package/src/app/components/conversation-info/info-content/info-content.component.ts +22 -25
- package/src/app/components/ddp-header/ddp-header.component.html +20 -5
- package/src/app/components/ddp-header/ddp-header.component.ts +8 -0
- package/src/app/components/project-item/project-item.component.ts +26 -49
- package/src/app/components/sidebar/sidebar.component.ts +33 -56
- package/src/app/pages/conversation-detail/conversation-detail.page.ts +54 -106
- package/src/app/pages/conversations-list/conversations-list.page.html +3 -1
- package/src/app/pages/conversations-list/conversations-list.page.ts +48 -30
- package/src/app/pages/create-canned-response/create-canned-response.page.ts +22 -29
- package/src/app/pages/loader-preview/loader-preview.page.ts +12 -43
- package/src/app/services/websocket/websocket.service.ts +1 -1
- package/src/assets/i18n/ar.json +1 -1
- package/src/assets/i18n/az.json +266 -0
- package/src/assets/i18n/de.json +1 -1
- package/src/assets/i18n/en.json +1 -1
- package/src/assets/i18n/es.json +1 -1
- package/src/assets/i18n/fr.json +1 -1
- package/src/assets/i18n/it.json +1 -1
- package/src/assets/i18n/kk.json +266 -0
- package/src/assets/i18n/pt.json +1 -1
- package/src/assets/i18n/ru.json +1 -1
- package/src/assets/i18n/sr.json +1 -1
- package/src/assets/i18n/sv.json +266 -0
- package/src/assets/i18n/tr.json +1 -1
- package/src/assets/i18n/uk.json +266 -0
- package/src/assets/i18n/uz.json +267 -0
- package/src/assets/images/language_flag/az.png +0 -0
- package/src/assets/images/language_flag/kk.png +0 -0
- package/src/assets/images/language_flag/{sv-SE.png → sv.png} +0 -0
- package/src/assets/images/language_flag/uz.png +0 -0
- package/src/chat-config-mqtt-localhost.json +10 -3
- package/src/chat-config-pre.json +3 -1
- package/src/chat21-core/providers/abstract/archivedconversations-handler.service.ts +1 -2
- package/src/chat21-core/providers/abstract/conversations-handler.service.ts +4 -4
- package/src/chat21-core/providers/firebase/firebase-archivedconversations-handler.ts +3 -6
- package/src/chat21-core/providers/firebase/firebase-auth-service.ts +2 -8
- package/src/chat21-core/providers/firebase/firebase-conversation-handler.ts +4 -4
- package/src/chat21-core/providers/firebase/firebase-conversations-handler.ts +49 -10
- package/src/chat21-core/providers/firebase/firebase-groups-handler.ts +5 -5
- package/src/chat21-core/providers/firebase/firebase-image-repo.ts +2 -1
- package/src/chat21-core/providers/firebase/firebase-presence.service.ts +2 -3
- package/src/chat21-core/providers/firebase/firebase-typing.service.ts +2 -2
- package/src/chat21-core/providers/firebase/firebase-upload.service.ts +1 -1
- package/src/chat21-core/providers/mqtt/mqtt-archivedconversations-handler.ts +74 -274
- package/src/chat21-core/providers/mqtt/mqtt-auth-service.ts +26 -29
- package/src/chat21-core/providers/mqtt/mqtt-conversation-handler.ts +7 -28
- package/src/chat21-core/providers/mqtt/mqtt-conversations-handler.ts +24 -52
- package/src/chat21-core/providers/mqtt/mqtt-groups-handler.ts +11 -15
- package/src/chat21-core/providers/mqtt/mqtt-notifications.ts +88 -93
- package/src/chat21-core/providers/mqtt/mqtt-presence.service.ts +3 -2
- package/src/chat21-core/providers/mqtt/mqtt-typing.service.ts +5 -0
- package/src/chat21-core/providers/native/native-image-repo.ts +9 -2
- package/src/chat21-core/providers/native/native-upload-service.ts +3 -11
- package/src/chat21-core/providers/tiledesk/tiledesk-auth.service.ts +0 -2
- package/src/chat21-core/utils/constants.ts +1 -1
- package/src/chat21-core/utils/utils-message.ts +1 -1
- package/deploy_pre.sh +0 -44
|
@@ -30,10 +30,10 @@ import { messageType } from '../../utils/utils-message';
|
|
|
30
30
|
export class MQTTConversationHandler extends ConversationHandlerService {
|
|
31
31
|
|
|
32
32
|
// BehaviorSubject
|
|
33
|
-
messageAdded: BehaviorSubject<MessageModel
|
|
34
|
-
messageChanged: BehaviorSubject<MessageModel
|
|
35
|
-
messageRemoved: BehaviorSubject<string
|
|
36
|
-
|
|
33
|
+
messageAdded: BehaviorSubject<MessageModel> = new BehaviorSubject<MessageModel>(null);;
|
|
34
|
+
messageChanged: BehaviorSubject<MessageModel> = new BehaviorSubject<MessageModel>(null);;
|
|
35
|
+
messageRemoved: BehaviorSubject<string> = new BehaviorSubject<string>(null);
|
|
36
|
+
messageWait: BehaviorSubject<any> = new BehaviorSubject<string>(null);
|
|
37
37
|
|
|
38
38
|
// public variables
|
|
39
39
|
public attributes: any;
|
|
@@ -65,13 +65,7 @@ export class MQTTConversationHandler extends ConversationHandlerService {
|
|
|
65
65
|
/**
|
|
66
66
|
* inizializzo conversation handler
|
|
67
67
|
*/
|
|
68
|
-
initialize(
|
|
69
|
-
recipientId: string,
|
|
70
|
-
recipientFullName: string,
|
|
71
|
-
loggedUser: UserModel,
|
|
72
|
-
tenant: string,
|
|
73
|
-
translationMap: Map<string, string>
|
|
74
|
-
) {
|
|
68
|
+
initialize(recipientId: string,recipientFullName: string,loggedUser: UserModel,tenant: string, translationMap: Map<string, string>) {
|
|
75
69
|
this.logger.log('[MQTTConversationHandler] initWithRecipient:', tenant);
|
|
76
70
|
this.recipientId = recipientId;
|
|
77
71
|
this.recipientFullname = recipientFullName;
|
|
@@ -96,7 +90,7 @@ export class MQTTConversationHandler extends ConversationHandlerService {
|
|
|
96
90
|
* mi sottoscrivo a change, removed, added
|
|
97
91
|
*/
|
|
98
92
|
connect() {
|
|
99
|
-
this.logger.log('[MQTTConversationHandler] connecting conversation handler...');
|
|
93
|
+
this.logger.log('[MQTTConversationHandler] connecting conversation handler...', this.conversationWith);
|
|
100
94
|
if (this.conversationWith == null) {
|
|
101
95
|
this.logger.error('[MQTTConversationHandler] cant connect invalid this.conversationWith', this.conversationWith);
|
|
102
96
|
return;
|
|
@@ -118,7 +112,6 @@ export class MQTTConversationHandler extends ConversationHandlerService {
|
|
|
118
112
|
this.logger.log('[MQTTConversationHandler] message updated:', message, 'on topic:', topic);
|
|
119
113
|
this.updatedMessageStatus(message);
|
|
120
114
|
});
|
|
121
|
-
this.logger.log("[MQTTConversationHandler] this.conversationWith,", this.conversationWith);
|
|
122
115
|
}
|
|
123
116
|
|
|
124
117
|
isGroup(groupId) {
|
|
@@ -256,16 +249,6 @@ export class MQTTConversationHandler extends ConversationHandlerService {
|
|
|
256
249
|
this.messageAdded.next(msg);
|
|
257
250
|
}
|
|
258
251
|
|
|
259
|
-
// /** */
|
|
260
|
-
// private updatedMessage(message: any) {
|
|
261
|
-
// const msg = this.messageGenerate(message);
|
|
262
|
-
// msg.uid = msg.message_id;
|
|
263
|
-
// // imposto il giorno del messaggio per visualizzare o nascondere l'header data
|
|
264
|
-
// // con**** DATAIL messageAdded ***sole.log('>>>>>>>>>>>>>> changed headerDate: ', msg);
|
|
265
|
-
// this.addReplaceMessageInArray(msg.uid, msg);
|
|
266
|
-
// this.messageChanged.next(msg);
|
|
267
|
-
// }
|
|
268
|
-
|
|
269
252
|
/** */
|
|
270
253
|
private updatedMessageStatus(patch: any) {
|
|
271
254
|
if(this.skipInfoMessage && messageType(MESSAGE_TYPE_INFO, patch) ){
|
|
@@ -278,8 +261,6 @@ export class MQTTConversationHandler extends ConversationHandlerService {
|
|
|
278
261
|
if (message) {
|
|
279
262
|
message.status = patch.status;
|
|
280
263
|
this.logger.log('[MQTTConversationHandler] message found and patched (replacing)', message);
|
|
281
|
-
// imposto il giorno del messaggio per visualizzare o nascondere l'header data
|
|
282
|
-
// con**** DATAIL messageAdded ***sole.log('>>>>>>>>>>>>>> changed headerDate: ', msg);
|
|
283
264
|
this.addReplaceMessageInArray(message.uid, message);
|
|
284
265
|
this.messageChanged.next(message);
|
|
285
266
|
}
|
|
@@ -311,8 +292,7 @@ export class MQTTConversationHandler extends ConversationHandlerService {
|
|
|
311
292
|
// msg.text = htmlEntities(msg.text);
|
|
312
293
|
// }
|
|
313
294
|
// verifico che il sender è il logged user
|
|
314
|
-
this.logger.log("****>msg.sender:" + msg.sender);
|
|
315
|
-
this.logger.log("****>this.loggedUser.uid:" + this.loggedUser.uid);
|
|
295
|
+
this.logger.log("[MQTTConversationHandler] ****>msg.sender:" + msg.sender);
|
|
316
296
|
msg.isSender = this.isSender(msg.sender, this.loggedUser.uid);
|
|
317
297
|
// traduco messaggi se sono del server
|
|
318
298
|
if (msg.attributes && msg.attributes.subtype) {
|
|
@@ -436,7 +416,6 @@ export class MQTTConversationHandler extends ConversationHandlerService {
|
|
|
436
416
|
this.listSubsriptions.forEach(sub => {
|
|
437
417
|
this.logger.log('[MQTTConversationHandler] unsubscribe: ', sub.uid, key);
|
|
438
418
|
if (sub.uid === key) {
|
|
439
|
-
this.logger.log('[MQTTConversationHandler] unsubscribe: ', sub.uid, key);
|
|
440
419
|
sub.unsubscribe(key, null);
|
|
441
420
|
return;
|
|
442
421
|
}
|
|
@@ -23,15 +23,21 @@ import { THIS_EXPR } from '@angular/compiler/src/output/output_ast';
|
|
|
23
23
|
@Injectable({ providedIn: 'root' })
|
|
24
24
|
export class MQTTConversationsHandler extends ConversationsHandlerService {
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
// BehaviorSubject
|
|
27
|
+
BSConversationDetail: BehaviorSubject<ConversationModel> = new BehaviorSubject<ConversationModel>(null);;
|
|
28
|
+
conversationAdded: BehaviorSubject<ConversationModel> = new BehaviorSubject<ConversationModel>(null);;
|
|
29
|
+
conversationChanged: BehaviorSubject<ConversationModel> = new BehaviorSubject<ConversationModel>(null);;
|
|
30
|
+
conversationChangedDetailed: BehaviorSubject<{value: ConversationModel, previousValue: ConversationModel}> = new BehaviorSubject<{value: ConversationModel, previousValue: ConversationModel}>(null);
|
|
31
|
+
conversationRemoved: BehaviorSubject<ConversationModel> = new BehaviorSubject<ConversationModel>(null);;
|
|
31
32
|
BSConversations: BehaviorSubject<ConversationModel[]>
|
|
33
|
+
// readAllMessages: BehaviorSubject<string>;
|
|
34
|
+
|
|
35
|
+
// public variables
|
|
32
36
|
conversations: Array<ConversationModel> = [];
|
|
33
37
|
uidConvSelected: string;
|
|
34
38
|
tenant: string;
|
|
39
|
+
|
|
40
|
+
// private variables
|
|
35
41
|
private loggedUserId: string;
|
|
36
42
|
private translationMap: Map<string, string>;
|
|
37
43
|
private isConversationClosingMap: Map<string, boolean>;
|
|
@@ -43,11 +49,7 @@ export class MQTTConversationsHandler extends ConversationsHandlerService {
|
|
|
43
49
|
super();
|
|
44
50
|
}
|
|
45
51
|
|
|
46
|
-
initialize(
|
|
47
|
-
tenant: string,
|
|
48
|
-
userId: string,
|
|
49
|
-
translationMap: Map<string, string>
|
|
50
|
-
) {
|
|
52
|
+
initialize(tenant: string, userId: string,translationMap: Map<string, string>) {
|
|
51
53
|
this.logger.debug('[MQTTConversationsHandler] initialize');
|
|
52
54
|
this.loggedUserId = userId;
|
|
53
55
|
this.translationMap = translationMap;
|
|
@@ -56,19 +58,19 @@ export class MQTTConversationsHandler extends ConversationsHandlerService {
|
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
public getConversationDetail(conversationWith: string, callback) {
|
|
59
|
-
// 1
|
|
60
|
-
// 2
|
|
61
|
+
// 1 cerco array locale
|
|
62
|
+
// 2 cerco remoto
|
|
61
63
|
// callback
|
|
62
|
-
|
|
64
|
+
|
|
63
65
|
const conversation = this.conversations.find(conv => conv.conversation_with === conversationWith);
|
|
64
|
-
|
|
66
|
+
this.logger.log('[MQTTConversationsHandler] getConversationDetail found locally? *****: ', conversation);
|
|
65
67
|
if (conversation) {
|
|
66
68
|
|
|
67
69
|
callback(conversation);
|
|
68
70
|
} else {
|
|
69
|
-
|
|
71
|
+
this.logger.log('[MQTTConversationsHandler] getConversationDetail Not found locally, remote.getConversationDetail *****: ', conversation);
|
|
70
72
|
this.chat21Service.chatClient.conversationDetail(conversationWith, (err, conversation) => {
|
|
71
|
-
|
|
73
|
+
this.logger.log('[MQTTConversationsHandler] getConversationDetail --REMOTE CONV IS OBJ:', conversation);
|
|
72
74
|
if (conversation) {
|
|
73
75
|
if (callback) {
|
|
74
76
|
callback(this.completeConversation(conversation));
|
|
@@ -148,9 +150,8 @@ export class MQTTConversationsHandler extends ConversationsHandlerService {
|
|
|
148
150
|
// lastTimestamp temporarily ignored
|
|
149
151
|
this.logger.debug('[MQTTConversationsHandler] connecting MQTT conversations handler');
|
|
150
152
|
const handlerConversationAdded = this.chat21Service.chatClient.onConversationAdded( (conv) => {
|
|
151
|
-
this.logger.log("onConversationAdded:", conv);
|
|
152
153
|
let conversation = this.completeConversation(conv); // needed to get the "conversation_with", and find the conv in the conv-history
|
|
153
|
-
this.logger.log("onConversationAdded completed:"
|
|
154
|
+
this.logger.log("onConversationAdded completed:",conversation);
|
|
154
155
|
const index = this.searchIndexInArrayForConversationWith(this.conversations, conversation.conversation_with);
|
|
155
156
|
if (index > -1) {
|
|
156
157
|
this.logger.log('[MQTTConversationsHandler] Added conv -> Changed!')
|
|
@@ -189,17 +190,18 @@ export class MQTTConversationsHandler extends ConversationsHandlerService {
|
|
|
189
190
|
}
|
|
190
191
|
});
|
|
191
192
|
}
|
|
193
|
+
|
|
194
|
+
getLastConversation(callback: (conv: ConversationModel, error: string) => void): void {
|
|
195
|
+
throw new Error('Method not implemented.');
|
|
196
|
+
}
|
|
192
197
|
|
|
193
198
|
private added(conv: any) {
|
|
194
199
|
this.logger.debug('[MQTTConversationsHandler] NEW CONV childSnapshot', conv)
|
|
195
200
|
let conversation = this.completeConversation(conv);
|
|
196
201
|
if (this.isValidConversation(conversation)) {
|
|
197
202
|
this.setClosingConversation(conversation.conversation_with, false);
|
|
198
|
-
this.logger.debug('[MQTTConversationsHandler]
|
|
199
|
-
this.logger.debug('[MQTTConversationsHandler] conversations:', this.conversations);
|
|
203
|
+
this.logger.debug('[MQTTConversationsHandler] conversations:', conversation.uid, this.conversations);
|
|
200
204
|
const index = this.searchIndexInArrayForConversationWith(this.conversations, conversation.conversation_with);
|
|
201
|
-
this.logger.debug('[MQTTConversationsHandler] found index:', index)
|
|
202
|
-
this.logger.debug('[MQTTConversationsHandler] NUOVA CONVER;.uid2' + conversation.uid)
|
|
203
205
|
if (index > -1) {
|
|
204
206
|
this.logger.debug('[MQTTConversationsHandler] TROVATO')
|
|
205
207
|
this.conversations.splice(index, 1, conversation);
|
|
@@ -210,13 +212,8 @@ export class MQTTConversationsHandler extends ConversationsHandlerService {
|
|
|
210
212
|
}
|
|
211
213
|
this.logger.debug('[MQTTConversationsHandler] NUOVA CONVER;.uid3' + conversation.uid)
|
|
212
214
|
this.conversations.sort(compareValues('timestamp', 'desc'));
|
|
213
|
-
this.logger.debug('[MQTTConversationsHandler] NUOVA CONVER;.uid4' + conversation.uid)
|
|
214
215
|
this.logger.debug('[MQTTConversationsHandler] TUTTE:', this.conversations)
|
|
215
|
-
// this.conversationChanged.next(conversation);
|
|
216
|
-
this.logger.debug('[MQTTConversationsHandler] NUOVA CONVER;.uid5' + conversation.uid)
|
|
217
216
|
this.conversationAdded.next(conversation);
|
|
218
|
-
this.logger.debug('[MQTTConversationsHandler] NUOVA CONVER;.uid6' + conversation.uid)
|
|
219
|
-
// this.events.publish('conversationsChanged', this.conversations);
|
|
220
217
|
} else {
|
|
221
218
|
this.logger.error('[MQTTConversationsHandler] ChatConversationsHandler::added::conversations with conversationId: ', conversation.conversation_with, 'is not valid');
|
|
222
219
|
}
|
|
@@ -267,7 +264,6 @@ export class MQTTConversationsHandler extends ConversationsHandlerService {
|
|
|
267
264
|
|
|
268
265
|
private updateConversationWithSnapshot(conv: ConversationModel, snap: any) {
|
|
269
266
|
this.logger.debug('[MQTTConversationsHandler] updating conv', conv, 'with snap', snap)
|
|
270
|
-
this.logger.debug('[MQTTConversationsHandler] print snap keys/values')
|
|
271
267
|
Object.keys(snap).forEach(k => {
|
|
272
268
|
this.logger.debug('[MQTTConversationsHandler] key:' + k);
|
|
273
269
|
if (k === 'is_new') {
|
|
@@ -312,27 +308,6 @@ export class MQTTConversationsHandler extends ConversationsHandlerService {
|
|
|
312
308
|
conv.type = snap[k];
|
|
313
309
|
}
|
|
314
310
|
});
|
|
315
|
-
// SCHEMA ConversationModel
|
|
316
|
-
// public uid: string,
|
|
317
|
-
// public attributes: any,
|
|
318
|
-
// public channel_type: string,
|
|
319
|
-
// public conversation_with_fullname: string,
|
|
320
|
-
// public conversation_with: string,
|
|
321
|
-
// public recipient: string,
|
|
322
|
-
// public recipient_fullname: string,
|
|
323
|
-
// public image: string,
|
|
324
|
-
// public is_new: boolean,
|
|
325
|
-
// public last_message_text: string,
|
|
326
|
-
// public sender: string,
|
|
327
|
-
// public senderAuthInfo: any,
|
|
328
|
-
// public sender_fullname: string,
|
|
329
|
-
// public status: string,
|
|
330
|
-
// public timestamp: string,
|
|
331
|
-
// public time_last_message: string,
|
|
332
|
-
// public selected: boolean,
|
|
333
|
-
// public color: string,
|
|
334
|
-
// public avatar: string,
|
|
335
|
-
// public archived: boolean
|
|
336
311
|
}
|
|
337
312
|
|
|
338
313
|
|
|
@@ -411,13 +386,10 @@ export class MQTTConversationsHandler extends ConversationsHandlerService {
|
|
|
411
386
|
conv.last_message_text = conv.text; // building conv with a message
|
|
412
387
|
}
|
|
413
388
|
conv.uid = conv.conversation_with;
|
|
414
|
-
console.log("uidConvSelected is", this.uidConvSelected);
|
|
415
389
|
if (conv.uid === this.uidConvSelected) {
|
|
416
|
-
this.logger.debug("For selected conversation is_new = false");
|
|
417
390
|
conv.is_new = false;
|
|
418
391
|
}
|
|
419
392
|
if (conv.sender === this.loggedUserId) {
|
|
420
|
-
this.logger.debug("is_new always false if sender it's me")
|
|
421
393
|
conv.is_new = false;
|
|
422
394
|
}
|
|
423
395
|
return conv;
|
|
@@ -14,11 +14,11 @@ import { avatarPlaceholder, getColorBck } from 'src/chat21-core/utils/utils-user
|
|
|
14
14
|
export class MQTTGroupsHandler extends GroupsHandlerService {
|
|
15
15
|
|
|
16
16
|
// BehaviorSubject
|
|
17
|
-
BSgroupDetail: BehaviorSubject<GroupModel
|
|
18
|
-
SgroupDetail: Subject<GroupModel
|
|
19
|
-
groupAdded: BehaviorSubject<GroupModel
|
|
20
|
-
groupChanged: BehaviorSubject<GroupModel
|
|
21
|
-
groupRemoved: BehaviorSubject<GroupModel
|
|
17
|
+
BSgroupDetail: BehaviorSubject<GroupModel> = new BehaviorSubject<GroupModel>(null);
|
|
18
|
+
SgroupDetail: Subject<GroupModel> = new BehaviorSubject<GroupModel>(null);
|
|
19
|
+
groupAdded: BehaviorSubject<GroupModel> = new BehaviorSubject<GroupModel>(null);
|
|
20
|
+
groupChanged: BehaviorSubject<GroupModel> = new BehaviorSubject<GroupModel>(null);
|
|
21
|
+
groupRemoved: BehaviorSubject<GroupModel> = new BehaviorSubject<GroupModel>(null);
|
|
22
22
|
|
|
23
23
|
// private params
|
|
24
24
|
private tenant: string;
|
|
@@ -35,7 +35,7 @@ import { avatarPlaceholder, getColorBck } from 'src/chat21-core/utils/utils-user
|
|
|
35
35
|
* inizializzo groups handler
|
|
36
36
|
*/
|
|
37
37
|
initialize(tenant: string, loggedUserId: string): void {
|
|
38
|
-
this.logger.log('
|
|
38
|
+
this.logger.log('[MQTT-GROUPS-HANDLER] initialize');
|
|
39
39
|
this.tenant = tenant;
|
|
40
40
|
this.loggedUserId = loggedUserId;
|
|
41
41
|
}
|
|
@@ -64,13 +64,11 @@ import { avatarPlaceholder, getColorBck } from 'src/chat21-core/utils/utils-user
|
|
|
64
64
|
onGroupChange(groupId: string): Observable<GroupModel> {
|
|
65
65
|
if (this.isGroup(groupId)) {
|
|
66
66
|
this.chat21Service.chatClient.groupData(groupId, (err, group) => {
|
|
67
|
-
this.logger.log('got result by REST call:', group);
|
|
68
|
-
this.logger.log('got group by REST call:', group.result);
|
|
67
|
+
this.logger.log('[MQTT-GROUPS-HANDLER] onGroupChange: got result by REST call:', group);
|
|
69
68
|
this.groupValue(group.result);
|
|
70
|
-
this.logger.log('subscribing to group updates...', groupId);
|
|
69
|
+
this.logger.log('[MQTT-GROUPS-HANDLER] onGroupChange: subscribing to group updates...', groupId);
|
|
71
70
|
const handler_group_updated = this.chat21Service.chatClient.onGroupUpdated( (group, topic) => {
|
|
72
71
|
if (topic.conversWith === groupId) {
|
|
73
|
-
this.logger.log('group updated:', group);
|
|
74
72
|
this.groupValue(group);
|
|
75
73
|
}
|
|
76
74
|
});
|
|
@@ -87,13 +85,11 @@ import { avatarPlaceholder, getColorBck } from 'src/chat21-core/utils/utils-user
|
|
|
87
85
|
}
|
|
88
86
|
|
|
89
87
|
private groupValue(childSnapshot: any){
|
|
90
|
-
this.logger.
|
|
91
|
-
const group: GroupModel = childSnapshot;
|
|
92
|
-
this.logger.
|
|
88
|
+
this.logger.debug('[MQTT-GROUPS-SERV] group detail::', childSnapshot.val(), childSnapshot)
|
|
89
|
+
const group: GroupModel = childSnapshot.val();
|
|
90
|
+
this.logger.debug('[MQTT-GROUPS-SERV] groupValue ', group)
|
|
93
91
|
if (group) {
|
|
94
92
|
let groupCompleted = this.completeGroup(group)
|
|
95
|
-
this.logger.log("group:", group);
|
|
96
|
-
this.logger.log("groupCompleted:", groupCompleted);
|
|
97
93
|
this.SgroupDetail.next(groupCompleted)
|
|
98
94
|
}
|
|
99
95
|
}
|
|
@@ -14,109 +14,104 @@ import { Chat21Service } from './chat-service';
|
|
|
14
14
|
@Injectable({
|
|
15
15
|
providedIn: 'root'
|
|
16
16
|
})
|
|
17
|
-
|
|
17
|
+
export class MQTTNotifications extends NotificationsService {
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
public BUILD_VERSION: string;
|
|
20
|
+
private FCMcurrentToken: string;
|
|
21
|
+
private userId: string;
|
|
22
|
+
private tenant: string;
|
|
23
|
+
private vapidkey: string;
|
|
24
|
+
private logger: LoggerService = LoggerInstance.getInstance();
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
constructor(
|
|
27
|
+
public chat21Service: Chat21Service
|
|
28
28
|
) {
|
|
29
|
-
|
|
29
|
+
super();
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
32
|
+
initialize(tenant: string, vapId: string): void {
|
|
33
|
+
this.tenant = tenant;
|
|
34
|
+
this.vapidkey = vapId;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
38
|
+
getNotificationPermissionAndSaveToken(currentUserUid) {
|
|
39
|
+
console.log("[MQTTNotificationService] getNotificationPermissionAndSaveToken()",currentUserUid );
|
|
40
|
+
this.userId = currentUserUid;
|
|
41
|
+
if (firebase.messaging.isSupported()) {
|
|
42
|
+
console.log("[MQTTNotificationService] firebase.messaging.isSupported -> YES");
|
|
43
|
+
const messaging = firebase.messaging();
|
|
44
|
+
// messaging.requestPermission()
|
|
45
|
+
Notification.requestPermission().then((permission) => {
|
|
46
|
+
if (permission === 'granted') {
|
|
47
|
+
this.logger.log('[MQTTNotificationService] >>>> requestPermission Notification permission granted.');
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
49
|
+
return messaging.getToken({ vapidKey: this.vapidkey })
|
|
50
|
+
}
|
|
51
|
+
}).then(FCMtoken => {
|
|
52
|
+
this.logger.log('[MQTTNotificationService] >>>> requestPermission FCMtoken', FCMtoken)
|
|
53
|
+
// Save FCM Token in Chat21
|
|
54
|
+
this.FCMcurrentToken = FCMtoken;
|
|
55
|
+
this.saveToken(FCMtoken, currentUserUid)
|
|
56
|
+
}).catch((err) => {
|
|
57
|
+
this.logger.error('[MQTTNotificationService] >>>> requestPermission ERR: Unable to get permission to notify.', err);
|
|
58
|
+
});
|
|
59
|
+
} else {
|
|
60
|
+
this.logger.log('[MQTTNotificationService] >>>> FIREBASE MESSAGING IS NOT SUPPORTED')
|
|
62
61
|
}
|
|
62
|
+
}
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
})
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
private saveToken(FCMcurrentToken, currentUserUid) {
|
|
101
|
-
this.logger.log('[FIREBASE-NOTIFICATIONS] >>>> getPermission > updateToken ', FCMcurrentToken);
|
|
102
|
-
if (!currentUserUid || !FCMcurrentToken) {
|
|
103
|
-
return
|
|
104
|
-
};
|
|
105
|
-
const device_model = {
|
|
106
|
-
device_model: navigator.userAgent,
|
|
107
|
-
language: navigator.language,
|
|
108
|
-
platform: 'ionic',
|
|
109
|
-
platform_version: this.BUILD_VERSION
|
|
65
|
+
removeNotificationsInstance(callback: (string) => void) {
|
|
66
|
+
var self = this;
|
|
67
|
+
// firebase.auth().onAuthStateChanged(function (user) {
|
|
68
|
+
// if (user) {
|
|
69
|
+
// self.logger.debug('[FIREBASE-NOTIFICATIONS] - FB User is signed in. ', user)
|
|
70
|
+
// self.logger.log('[FIREBASE-NOTIFICATIONS] >>>> removeNotificationsInstance > this.userId', self.userId);
|
|
71
|
+
// self.logger.log('[FIREBASE-NOTIFICATIONS] >>>> removeNotificationsInstance > FCMcurrentToken', self.FCMcurrentToken);
|
|
72
|
+
// // this.logger.log('[FIREBASE-NOTIFICATIONS] >>>> removeNotificationsInstance > this.tenant', this.tenant);
|
|
73
|
+
// } else {
|
|
74
|
+
// self.logger.debug('[FIREBASE-NOTIFICATIONS] - No FB user is signed in. ', user)
|
|
75
|
+
// }
|
|
76
|
+
// });
|
|
77
|
+
const urlNodeFirebase = '/apps/' + self.tenant
|
|
78
|
+
const connectionsRefinstancesId = urlNodeFirebase + '/users/' + self.userId + '/instances/'
|
|
79
|
+
self.logger.log('[MQTTNotificationService] >>>> connectionsRefinstancesId ', connectionsRefinstancesId);
|
|
80
|
+
let connectionsRefURL = '';
|
|
81
|
+
if (connectionsRefinstancesId) {
|
|
82
|
+
connectionsRefURL = connectionsRefinstancesId + self.FCMcurrentToken;
|
|
83
|
+
const connectionsRef = firebase.database().ref().child(connectionsRefURL);
|
|
84
|
+
self.logger.log('[MQTTNotificationService] >>>> connectionsRef ', connectionsRef);
|
|
85
|
+
self.logger.log('[MQTTNotificationService] >>>> connectionsRef url ', connectionsRefURL);
|
|
86
|
+
connectionsRef.off()
|
|
87
|
+
connectionsRef.remove().then(() => {
|
|
88
|
+
self.logger.log("[MQTTNotificationService] >>>> removeNotificationsInstance > Remove succeeded.")
|
|
89
|
+
callback('success')
|
|
90
|
+
}).catch((error) => {
|
|
91
|
+
self.logger.error("[MQTTNotificationService] >>>> removeNotificationsInstance Remove failed: " + error.message)
|
|
92
|
+
callback('error')
|
|
93
|
+
}).finally(() => {
|
|
94
|
+
self.logger.log('[MQTTNotificationService] COMPLETED');
|
|
95
|
+
})
|
|
110
96
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private saveToken(FCMcurrentToken, currentUserUid) {
|
|
100
|
+
this.logger.log('[MQTTNotificationService] >>>> getPermission > updateToken ', FCMcurrentToken);
|
|
101
|
+
if (!currentUserUid || !FCMcurrentToken) {
|
|
102
|
+
return
|
|
103
|
+
};
|
|
104
|
+
const device_model = {
|
|
105
|
+
device_model: navigator.userAgent,
|
|
106
|
+
language: navigator.language,
|
|
107
|
+
platform: 'ionic',
|
|
108
|
+
platform_version: this.BUILD_VERSION
|
|
120
109
|
}
|
|
121
|
-
|
|
110
|
+
this.chat21Service.chatClient.saveInstance(FCMcurrentToken,device_model,(err, response) => {
|
|
111
|
+
if (err) {
|
|
112
|
+
this.logger.error('[MQTTNotificationService] Error saving FCMcurrentToken on chat21 App Instance', FCMcurrentToken);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
122
115
|
}
|
|
116
|
+
|
|
117
|
+
}
|
|
@@ -21,8 +21,9 @@ import { environment } from '../../../environments/environment';
|
|
|
21
21
|
})
|
|
22
22
|
export class MQTTPresenceService extends PresenceService {
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
// BehaviorSubject
|
|
25
|
+
BSIsOnline: BehaviorSubject<any> = new BehaviorSubject<any>(null);
|
|
26
|
+
BSLastOnline: BehaviorSubject<any> = new BehaviorSubject<any>(null);
|
|
26
27
|
|
|
27
28
|
// private params
|
|
28
29
|
private tenant: string;
|
|
@@ -14,6 +14,7 @@ import { LoggerInstance } from '../logger/loggerInstance';
|
|
|
14
14
|
import { setLastDate } from '../../utils/utils';
|
|
15
15
|
import { environment } from '../../../environments/environment';
|
|
16
16
|
import { TypingService } from '../abstract/typing.service';
|
|
17
|
+
import { BehaviorSubject } from 'rxjs';
|
|
17
18
|
|
|
18
19
|
export class TypingModel {
|
|
19
20
|
|
|
@@ -31,6 +32,10 @@ export class TypingModel {
|
|
|
31
32
|
|
|
32
33
|
export class MQTTTypingService extends TypingService {
|
|
33
34
|
|
|
35
|
+
// BehaviorSubject
|
|
36
|
+
BSIsTyping: BehaviorSubject<any> = new BehaviorSubject<any>(null);
|
|
37
|
+
BSSetTyping: BehaviorSubject<any> = new BehaviorSubject<any>(null);
|
|
38
|
+
|
|
34
39
|
// private params
|
|
35
40
|
private tenant: string;
|
|
36
41
|
private urlNodeTypings: string;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
1
2
|
import { Injectable } from '@angular/core';
|
|
2
3
|
import { ImageRepoService } from 'src/chat21-core/providers/abstract/image-repo.service';
|
|
3
4
|
|
|
@@ -7,7 +8,7 @@ export class NativeImageRepoService extends ImageRepoService {
|
|
|
7
8
|
|
|
8
9
|
private baseImageURL: string;
|
|
9
10
|
|
|
10
|
-
constructor() {
|
|
11
|
+
constructor(public http: HttpClient) {
|
|
11
12
|
super();
|
|
12
13
|
}
|
|
13
14
|
|
|
@@ -25,6 +26,12 @@ export class NativeImageRepoService extends ImageRepoService {
|
|
|
25
26
|
const filename_photo = '?path=uploads/users/'+ sender_id + '/images/photo.jpg'
|
|
26
27
|
const filename_thumbnail = '?path=uploads/users/'+ sender_id + '/images/thumbnails_200_200-photo.jpg'
|
|
27
28
|
return this.baseImageURL + filename_photo
|
|
28
|
-
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
checkImageExists(url: string, callback: (exist: boolean) => void): void {
|
|
32
|
+
this.http.get(url).subscribe( res => {
|
|
33
|
+
callback(true)
|
|
34
|
+
},(error) => { console.log('errorrrrrr', url, error);callback(false)})
|
|
35
|
+
}
|
|
29
36
|
|
|
30
37
|
}
|
|
@@ -11,16 +11,9 @@ import { LoggerInstance } from '../logger/loggerInstance';
|
|
|
11
11
|
@Injectable()
|
|
12
12
|
export class NativeUploadService extends UploadService {
|
|
13
13
|
|
|
14
|
+
BSStateUpload: BehaviorSubject<any> = new BehaviorSubject<any>(null)
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
BSStateUpload: BehaviorSubject<any>;
|
|
17
|
-
|
|
18
|
-
// private persistence: string;
|
|
19
|
-
SERVER_BASE_URL: string;
|
|
20
|
-
|
|
21
|
-
public token: any;
|
|
22
|
-
public tiledeskToken: any;
|
|
23
|
-
|
|
16
|
+
private tiledeskToken: string;
|
|
24
17
|
private URL_TILEDESK_IMAGES: string;
|
|
25
18
|
private URL_TILEDESK_FILE: string;
|
|
26
19
|
private logger: LoggerService = LoggerInstance.getInstance()
|
|
@@ -32,9 +25,8 @@ export class NativeUploadService extends UploadService {
|
|
|
32
25
|
super();
|
|
33
26
|
}
|
|
34
27
|
|
|
35
|
-
|
|
36
28
|
initialize(): void {
|
|
37
|
-
this.logger.info('
|
|
29
|
+
this.logger.info('[NATIVE UPLOAD] initialize')
|
|
38
30
|
this.URL_TILEDESK_FILE = this.getBaseUrl() + 'files'
|
|
39
31
|
this.URL_TILEDESK_IMAGES = this.getBaseUrl() + 'images'
|
|
40
32
|
this.tiledeskToken = this.appStorage.getItem('tiledeskToken')
|
|
@@ -14,7 +14,6 @@ import { LoggerInstance } from '../logger/loggerInstance';
|
|
|
14
14
|
})
|
|
15
15
|
export class TiledeskAuthService {
|
|
16
16
|
|
|
17
|
-
// public isOnline$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(null);
|
|
18
17
|
// private persistence: string;
|
|
19
18
|
public SERVER_BASE_URL: string;
|
|
20
19
|
|
|
@@ -120,7 +119,6 @@ export class TiledeskAuthService {
|
|
|
120
119
|
if (data['success'] && data['token']) {
|
|
121
120
|
that.tiledeskToken = data['token'];
|
|
122
121
|
that.createCompleteUser(data['user']);
|
|
123
|
-
|
|
124
122
|
// that.appStorage.setItem('tiledeskToken', that.tiledeskToken); // salvarlo esternamente nell'app.component
|
|
125
123
|
this.checkAndSetInStorageTiledeskToken(that.tiledeskToken)
|
|
126
124
|
resolve(this.currentUser)
|
|
@@ -110,7 +110,7 @@ export const LogLevel = {
|
|
|
110
110
|
'DEBUG': 3
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
export const tranlatedLanguage = ['it', 'en', 'de', 'es', 'pt', 'fr', 'ru', 'tr', 'sr', 'ar']
|
|
113
|
+
export const tranlatedLanguage = ['it', 'en', 'de', 'es', 'pt', 'fr', 'ru', 'tr', 'sr', 'ar', 'uk', 'sv', 'az', 'kk', 'uz']
|
|
114
114
|
|
|
115
115
|
|
|
116
116
|
|
|
@@ -109,7 +109,7 @@ export function isEmojii(message: any){
|
|
|
109
109
|
const onlyEmojis = message.replace(new RegExp('[\u0000-\u1eeff]', 'g'), '')
|
|
110
110
|
const visibleChars = message.replace(new RegExp('[\n\r\s]+|( )+', 'g'), '')
|
|
111
111
|
if(onlyEmojis === '' || visibleChars == '') return false
|
|
112
|
-
return onlyEmojis.length === visibleChars.length
|
|
112
|
+
return (onlyEmojis.length === visibleChars.length && onlyEmojis.length <= 2)
|
|
113
113
|
} catch(e) {
|
|
114
114
|
return false
|
|
115
115
|
}
|