@chat21/chat21-web-widget 5.1.1-rc1 → 5.1.4
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 +50 -0
- package/deploy_amazon_prod.sh +20 -6
- package/package.json +2 -2
- package/src/app/app.component.scss +10 -9
- package/src/app/app.component.ts +38 -10
- package/src/app/component/conversation-detail/conversation/conversation.component.scss +18 -18
- package/src/app/component/conversation-detail/conversation/conversation.component.ts +3 -1
- package/src/app/component/conversation-detail/conversation-content/conversation-content.component.scss +1 -0
- package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.scss +12 -3
- package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.ts +6 -6
- package/src/app/component/eyeeye-catcher-card/eyeeye-catcher-card.component.ts +35 -13
- package/src/app/component/home/home.component.scss +5 -3
- package/src/app/component/last-message/last-message.component.ts +61 -9
- package/src/app/component/launcher-button/launcher-button.component.html +1 -1
- package/src/app/component/message/avatar/avatar.component.scss +1 -1
- package/src/app/component/message/bubble-message/bubble-message.component.scss +1 -1
- package/src/app/component/message/buttons/action-button/action-button.component.scss +19 -14
- package/src/app/component/message/buttons/link-button/link-button.component.scss +18 -11
- package/src/app/component/message/buttons/text-button/text-button.component.scss +20 -11
- package/src/app/component/message/carousel/carousel.component.scss +25 -17
- package/src/app/component/message/text/text.component.html +1 -2
- package/src/app/component/message-attachment/message-attachment.component.html +7 -3
- package/src/app/component/message-attachment/message-attachment.component.scss +3 -2
- package/src/app/component/send-button/send-button.component.html +2 -2
- package/src/app/pipe/marked.pipe.ts +120 -1
- package/src/app/sass/_variables.scss +9 -4
- package/src/app/utils/globals.ts +8 -3
- package/src/app/utils/utils.ts +71 -4
- package/src/chat21-core/providers/firebase/firebase-conversation-handler.ts +2 -2
- package/src/chat21-core/providers/mqtt/mqtt-conversation-handler.ts +3 -3
- package/src/chat21-core/utils/utils.ts +4 -0
- package/src/iframe-style.css +33 -7
package/src/app/utils/utils.ts
CHANGED
|
@@ -379,17 +379,23 @@ export function getUnique(arr, comp) {
|
|
|
379
379
|
.filter(e => arr[e]).map(e => arr[e]);
|
|
380
380
|
}
|
|
381
381
|
|
|
382
|
-
export function checkAcceptedFile(fileType, fileUploadAccept
|
|
382
|
+
export function checkAcceptedFile(nameFile, fileType, fileUploadAccept): boolean {
|
|
383
|
+
console.log('checkAcceptedFile ------------>', fileType, fileUploadAccept);
|
|
383
384
|
|
|
385
|
+
const fileExtension = getFileExtension(nameFile);
|
|
386
|
+
console.log('[CONV-FOOTER] fileExtension: ', fileExtension);
|
|
387
|
+
|
|
384
388
|
if (fileUploadAccept === '*/*') {
|
|
385
|
-
return true
|
|
389
|
+
return true;
|
|
386
390
|
}
|
|
391
|
+
|
|
387
392
|
// Dividi la stringa fileUploadAccept in un array di tipi accettati
|
|
388
393
|
const acceptedTypes = fileUploadAccept.split(',');
|
|
389
394
|
|
|
390
395
|
// Verifica se il tipo di file è accettato
|
|
391
396
|
return acceptedTypes.some((accept) => {
|
|
392
397
|
accept = accept.trim();
|
|
398
|
+
|
|
393
399
|
// Controlla per i tipi MIME con wildcard, come image/*
|
|
394
400
|
if (accept.endsWith('/*')) {
|
|
395
401
|
const baseMimeType = fileType.split('/')[0]; // Ottieni la parte principale del MIME type
|
|
@@ -402,9 +408,39 @@ export function checkAcceptedFile(fileType, fileUploadAccept ): boolean{
|
|
|
402
408
|
}
|
|
403
409
|
|
|
404
410
|
// Controlla per le estensioni di file specifiche come .pdf o .txt
|
|
405
|
-
|
|
411
|
+
const expectedMimeType = getMimeTypeFromExtension(accept);
|
|
412
|
+
if (expectedMimeType && fileType === expectedMimeType) {
|
|
413
|
+
return true;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// // Controlla se l'estensione del file corrisponde direttamente
|
|
417
|
+
// if (accept.startsWith('.') && fileExtension === accept.substring(1)) {
|
|
418
|
+
// return true;
|
|
419
|
+
// }
|
|
420
|
+
|
|
421
|
+
// Controlla se l'estensione del file corrisponde direttamente
|
|
422
|
+
// Dividi la stringa fileUploadAccept in un array di tipi accettati
|
|
423
|
+
const acceptedTypes = fileUploadAccept.split(',');
|
|
424
|
+
//verifica se l'estensione del file è accettata
|
|
425
|
+
if (acceptedTypes.includes(fileExtension)) {
|
|
426
|
+
return true;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
return false;
|
|
406
430
|
});
|
|
431
|
+
}
|
|
432
|
+
|
|
407
433
|
|
|
434
|
+
/**
|
|
435
|
+
* Estrae l'estensione del file dal nome
|
|
436
|
+
* @param filename Nome del file
|
|
437
|
+
* @returns Estensione in lowercase (es. 'xlsx', 'pdf', 'jpg')
|
|
438
|
+
*/
|
|
439
|
+
export function getFileExtension(filename: string): string {
|
|
440
|
+
if (!filename || filename.indexOf('.') === -1) {
|
|
441
|
+
return '';
|
|
442
|
+
}
|
|
443
|
+
return filename.split('.').pop()?.toLowerCase() || '';
|
|
408
444
|
}
|
|
409
445
|
|
|
410
446
|
function getMimeTypeFromExtension(extension: string): string {
|
|
@@ -418,8 +454,39 @@ function getMimeTypeFromExtension(extension: string): string {
|
|
|
418
454
|
'.txt': 'text/plain',
|
|
419
455
|
'.doc': 'application/msword',
|
|
420
456
|
'.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
421
|
-
'.
|
|
457
|
+
'.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
458
|
+
'.xls': 'application/vnd.ms-excel',
|
|
459
|
+
'.wav': 'audio/wav'
|
|
422
460
|
// Aggiungi altri tipi MIME se necessario
|
|
423
461
|
};
|
|
424
462
|
return mimeTypes[extension] || '';
|
|
425
463
|
}
|
|
464
|
+
|
|
465
|
+
export const BLOCKED_DOMAINS = [
|
|
466
|
+
// DOMINI MALEVOLI NOTI
|
|
467
|
+
'attacker.me', 'evil.com', 'malicious.site', 'hacker.com', 'phishing.com',
|
|
468
|
+
'malware.com', 'ransomware.com', 'trojan.com', 'virus.com', 'spyware.com',
|
|
469
|
+
|
|
470
|
+
// DOMINI DI PHISHING
|
|
471
|
+
'phish.com', 'stealer.com', 'credential-thief.com', 'login-stealer.com',
|
|
472
|
+
'password-stealer.com', 'banking-phish.com', 'paypal-phish.com',
|
|
473
|
+
|
|
474
|
+
// DOMINI DI SPAM
|
|
475
|
+
'spam.com', 'spammer.com', 'bulk-email.com', 'unsolicited.com',
|
|
476
|
+
|
|
477
|
+
// DOMINI TRUFFA
|
|
478
|
+
'scam.com', 'fraud.com', 'fake.com', 'counterfeit.com', 'hoax.com',
|
|
479
|
+
|
|
480
|
+
// DOMINI EXPLOIT
|
|
481
|
+
'exploit.com', 'vulnerability.com', 'zero-day.com', 'payload.com',
|
|
482
|
+
'shellcode.com', 'backdoor.com', 'rootkit.com',
|
|
483
|
+
|
|
484
|
+
// DOMINI BOTNET
|
|
485
|
+
'botnet.com', 'zombie-pc.com', 'command-control.com', 'c2-server.com',
|
|
486
|
+
|
|
487
|
+
// DOMINI ADWARE/MALVERTISING
|
|
488
|
+
'adware.com', 'malvertising.com', 'popup-ads.com', 'unwanted-ads.com',
|
|
489
|
+
|
|
490
|
+
// DOMINI GENERICI PERICOLOSI
|
|
491
|
+
'danger.com', 'unsafe.com', 'insecure.com', 'threat.com', 'risk.com',
|
|
492
|
+
]
|
|
@@ -387,9 +387,9 @@ export class FirebaseConversationHandler extends ConversationHandlerService {
|
|
|
387
387
|
complement = INFO_SUPPORT_USER_ADDED_COMPLEMENT;
|
|
388
388
|
} else {
|
|
389
389
|
|
|
390
|
-
if (message.attributes.messagelabel.parameters.
|
|
390
|
+
if (message.attributes.messagelabel.parameters.firstname) {
|
|
391
391
|
// other user has been added to the group (and he has a fullname)
|
|
392
|
-
subject = message.attributes.messagelabel.parameters.
|
|
392
|
+
subject = message.attributes.messagelabel.parameters.firstname;
|
|
393
393
|
verb = INFO_SUPPORT_USER_ADDED_VERB;
|
|
394
394
|
complement = INFO_SUPPORT_USER_ADDED_COMPLEMENT;
|
|
395
395
|
} else {
|
|
@@ -382,14 +382,14 @@ export class MQTTConversationHandler extends ConversationHandlerService {
|
|
|
382
382
|
verb = INFO_SUPPORT_USER_ADDED_YOU_VERB;
|
|
383
383
|
complement = INFO_SUPPORT_USER_ADDED_COMPLEMENT;
|
|
384
384
|
} else {
|
|
385
|
-
if (message.attributes.messagelabel.parameters.
|
|
385
|
+
if (message.attributes.messagelabel.parameters.firstname) {
|
|
386
386
|
// other user has been added to the group (and he has a fullname)
|
|
387
|
-
subject = message.attributes.messagelabel.parameters.
|
|
387
|
+
subject = message.attributes.messagelabel.parameters.firstname;
|
|
388
388
|
verb = INFO_SUPPORT_USER_ADDED_VERB;
|
|
389
389
|
complement = INFO_SUPPORT_USER_ADDED_COMPLEMENT;
|
|
390
390
|
} else {
|
|
391
391
|
// other user has been added to the group (and he has not a fullname, so use hes useruid)
|
|
392
|
-
subject = message.attributes.messagelabel.parameters.
|
|
392
|
+
subject = message.attributes.messagelabel.parameters.firstname;
|
|
393
393
|
verb = INFO_SUPPORT_USER_ADDED_VERB;
|
|
394
394
|
complement = INFO_SUPPORT_USER_ADDED_COMPLEMENT;
|
|
395
395
|
}
|
|
@@ -620,6 +620,10 @@ function componentFromStr(numStr, percent) {
|
|
|
620
620
|
export function isAllowedUrlInText(text: string, allowedUrls: string[]) {
|
|
621
621
|
const urlsInMessage = extractUrls(text);
|
|
622
622
|
|
|
623
|
+
if (urlsInMessage.length === 0) {
|
|
624
|
+
return true; // Nessun URL => testo ammesso
|
|
625
|
+
}
|
|
626
|
+
|
|
623
627
|
const allowedPatterns = allowedUrls.map((url) => {
|
|
624
628
|
try {
|
|
625
629
|
// Prova a estrarre il dominio da una URL completa
|
package/src/iframe-style.css
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
display: none;
|
|
17
17
|
z-index: 3000000000; /*999999*/;
|
|
18
18
|
}
|
|
19
|
+
|
|
19
20
|
#tiledesk-container.open.overlay--popup {
|
|
20
21
|
background-color: rgba(0, 0, 0, 0.4);
|
|
21
22
|
position: absolute;
|
|
@@ -38,6 +39,7 @@
|
|
|
38
39
|
display: block;
|
|
39
40
|
position: fixed;
|
|
40
41
|
max-height: calc(100% - 50px);
|
|
42
|
+
border-radius: 16px;
|
|
41
43
|
}
|
|
42
44
|
|
|
43
45
|
#tiledeskdiv.fullscreen {
|
|
@@ -50,19 +52,33 @@
|
|
|
50
52
|
}
|
|
51
53
|
|
|
52
54
|
#tiledeskdiv.top-size {
|
|
53
|
-
|
|
55
|
+
/* transition: width 50ms, height 200ms, max-height 200ms, transform 300ms cubic-bezier(0, 1.2, 1, 1), opacity 83ms ease-out; */
|
|
56
|
+
position: relative;
|
|
57
|
+
margin: auto;
|
|
54
58
|
top: 0;
|
|
55
59
|
bottom: 0;
|
|
56
|
-
left:
|
|
57
|
-
|
|
60
|
+
left: 0!important;
|
|
61
|
+
right: 0!important;
|
|
58
62
|
height: 100%; /*var(--iframeMaxHeight);*/
|
|
59
63
|
/* transform: translate(-50%, -50%); */
|
|
60
|
-
transform: translate(-50%, 0%);
|
|
64
|
+
/* transform: translate(-50%, 0%); */
|
|
61
65
|
width: 100%;
|
|
62
66
|
max-width: 1024px;
|
|
63
67
|
max-height: 100%;
|
|
68
|
+
|
|
69
|
+
transition:
|
|
70
|
+
width 300ms,
|
|
71
|
+
height 300ms,
|
|
72
|
+
max-height 300ms,
|
|
73
|
+
transform 300ms cubic-bezier(0, 1.2, 1, 1),
|
|
74
|
+
opacity 300ms ease-out;
|
|
75
|
+
/* per migliorare le prestazioni quando si usa transform */
|
|
76
|
+
will-change: transform, opacity, width, height;
|
|
64
77
|
}
|
|
65
|
-
|
|
78
|
+
|
|
79
|
+
/* #tiledesk-container.open #tiledeskdiv.top-size #tiledeskiframe {
|
|
80
|
+
border-radius: unset;
|
|
81
|
+
} */
|
|
66
82
|
|
|
67
83
|
@keyframes right-animate {
|
|
68
84
|
0% {
|
|
@@ -82,6 +98,7 @@
|
|
|
82
98
|
left: auto; /* NEW DEPA */
|
|
83
99
|
top:auto;
|
|
84
100
|
transform: none;
|
|
101
|
+
transition: none;
|
|
85
102
|
}
|
|
86
103
|
#tiledesk-container.closed #tiledeskdiv.callout {
|
|
87
104
|
/* width: 400px;
|
|
@@ -112,12 +129,21 @@
|
|
|
112
129
|
#tiledesk-container.open #tiledeskiframe {
|
|
113
130
|
display: block;
|
|
114
131
|
/*width: 376px;*/
|
|
115
|
-
|
|
116
|
-
#tiledesk-container.open #tiledeskdiv.shadow {
|
|
132
|
+
border-radius: 16px;
|
|
117
133
|
transition: box-shadow 0.8s ease-in;
|
|
118
134
|
box-shadow: rgba(0, 0, 0, 0.16) 0px 8px 36px 0px; /*NEW GAB*/
|
|
119
135
|
}
|
|
136
|
+
/*
|
|
137
|
+
#tiledesk-container.open #tiledeskdiv.shadow {
|
|
138
|
+
transition: box-shadow 0.8s ease-in;
|
|
139
|
+
box-shadow: rgba(0, 0, 0, 0.16) 0px 8px 36px 0px;
|
|
140
|
+
}
|
|
141
|
+
*/
|
|
120
142
|
|
|
143
|
+
#tiledesk-container.open #tiledeskdiv {
|
|
144
|
+
/* transition: box-shadow 0.8s ease-in;
|
|
145
|
+
box-shadow: rgba(0, 0, 0, 0.16) 0px 8px 36px 0px; */
|
|
146
|
+
}
|
|
121
147
|
|
|
122
148
|
#tiledesk-container.closed #tiledeskiframe {
|
|
123
149
|
display: block;
|