@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.
Files changed (32) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/deploy_amazon_prod.sh +20 -6
  3. package/package.json +2 -2
  4. package/src/app/app.component.scss +10 -9
  5. package/src/app/app.component.ts +38 -10
  6. package/src/app/component/conversation-detail/conversation/conversation.component.scss +18 -18
  7. package/src/app/component/conversation-detail/conversation/conversation.component.ts +3 -1
  8. package/src/app/component/conversation-detail/conversation-content/conversation-content.component.scss +1 -0
  9. package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.scss +12 -3
  10. package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.ts +6 -6
  11. package/src/app/component/eyeeye-catcher-card/eyeeye-catcher-card.component.ts +35 -13
  12. package/src/app/component/home/home.component.scss +5 -3
  13. package/src/app/component/last-message/last-message.component.ts +61 -9
  14. package/src/app/component/launcher-button/launcher-button.component.html +1 -1
  15. package/src/app/component/message/avatar/avatar.component.scss +1 -1
  16. package/src/app/component/message/bubble-message/bubble-message.component.scss +1 -1
  17. package/src/app/component/message/buttons/action-button/action-button.component.scss +19 -14
  18. package/src/app/component/message/buttons/link-button/link-button.component.scss +18 -11
  19. package/src/app/component/message/buttons/text-button/text-button.component.scss +20 -11
  20. package/src/app/component/message/carousel/carousel.component.scss +25 -17
  21. package/src/app/component/message/text/text.component.html +1 -2
  22. package/src/app/component/message-attachment/message-attachment.component.html +7 -3
  23. package/src/app/component/message-attachment/message-attachment.component.scss +3 -2
  24. package/src/app/component/send-button/send-button.component.html +2 -2
  25. package/src/app/pipe/marked.pipe.ts +120 -1
  26. package/src/app/sass/_variables.scss +9 -4
  27. package/src/app/utils/globals.ts +8 -3
  28. package/src/app/utils/utils.ts +71 -4
  29. package/src/chat21-core/providers/firebase/firebase-conversation-handler.ts +2 -2
  30. package/src/chat21-core/providers/mqtt/mqtt-conversation-handler.ts +3 -3
  31. package/src/chat21-core/utils/utils.ts +4 -0
  32. package/src/iframe-style.css +33 -7
@@ -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 ): boolean{
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
- return fileType === getMimeTypeFromExtension(accept);
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
- '.wav' : 'audio/wav'
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.fullname) {
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.fullname;
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.fullname) {
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.fullname;
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.member_id;
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
@@ -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
- position: fixed;
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: 50%;
57
- /* width: calc( var(--iframeMaxWidth) + 180px); */
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;