@chat21/chat21-web-widget 5.0.88 → 5.0.89-rc.1

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 (27) hide show
  1. package/CHANGELOG.md +3 -6
  2. package/package.json +1 -1
  3. package/src/app/app.module.ts +5 -2
  4. package/src/app/component/conversation-detail/conversation/conversation.component.html +0 -1
  5. package/src/app/component/conversation-detail/conversation/conversation.component.ts +3 -4
  6. package/src/app/component/conversation-detail/conversation-audio-recorder/conversation-audio-recorder.component.html +29 -0
  7. package/src/app/component/conversation-detail/conversation-audio-recorder/conversation-audio-recorder.component.scss +103 -0
  8. package/src/app/component/conversation-detail/conversation-audio-recorder/conversation-audio-recorder.component.spec.ts +23 -0
  9. package/src/app/component/conversation-detail/conversation-audio-recorder/conversation-audio-recorder.component.ts +96 -0
  10. package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.html +14 -3
  11. package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.scss +26 -10
  12. package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.ts +123 -41
  13. package/src/app/component/message/audio-track/audio-track.component.html +32 -0
  14. package/src/app/component/message/audio-track/audio-track.component.scss +107 -0
  15. package/src/app/component/message/{audio/audio.component.spec.ts → audio-track/audio-track.component.spec.ts} +6 -6
  16. package/src/app/component/message/audio-track/audio-track.component.ts +147 -0
  17. package/src/app/component/message/bubble-message/bubble-message.component.html +30 -5
  18. package/src/app/component/message/bubble-message/bubble-message.component.scss +7 -0
  19. package/src/app/component/message/bubble-message/bubble-message.component.ts +1 -0
  20. package/src/app/modals/confirm-close/confirm-close.component.html +6 -6
  21. package/src/app/modals/confirm-close/confirm-close.component.scss +3 -14
  22. package/src/app/modals/confirm-close/confirm-close.component.ts +4 -19
  23. package/src/app/utils/globals.ts +1 -1
  24. package/src/assets/twp/index-dev.html +1 -0
  25. package/src/app/component/message/audio/audio.component.html +0 -20
  26. package/src/app/component/message/audio/audio.component.scss +0 -122
  27. package/src/app/component/message/audio/audio.component.ts +0 -122
@@ -1,9 +1,26 @@
1
1
  <!-- [ngClass]="{'button-in-msg' : message.metadata && message.metadata.button}" -->
2
2
  <!-- ngStyle]="{'padding': (isImage(message) || isFrame(message))?'1px':'0 8px'}" -->
3
3
  <!-- 'width': (isImage(message) || isFrame(message))? sizeImage?.width + 'px': null -->
4
- <div id="bubble-message" [ngStyle]="{'padding': (isImage(message) || isFrame(message))?'0 0px':'0 8px'}" class="messages primary-color">
5
-
4
+
5
+
6
6
 
7
+ <!-- <div id="bubble-message" *ngIf="isAudio(message)" [ngStyle]="{'padding': '0'}" class="messages primary-color">
8
+ <div>
9
+ <chat-audio-track *ngIf="isAudio(message)"
10
+ [metadata]="message.metadata"
11
+ ></chat-audio-track>
12
+ </div>
13
+ </div>
14
+
15
+
16
+ [ngStyle]="{'padding': (isImage(message) || isFrame(message) || isAudio(message))?'0 0px':'0 8px'}"
17
+ -->
18
+
19
+
20
+
21
+
22
+
23
+ <div id="bubble-message" class="messages primary-color">
7
24
  <div>
8
25
 
9
26
  <div *ngIf="messageType(MESSAGE_TYPE_OTHERS, message) && !isSameSender"
@@ -36,10 +53,18 @@
36
53
  (onElementRendered)="onElementRenderedFN($event)">
37
54
  </chat-frame>
38
55
 
39
- <chat-audio *ngIf="isAudio(message)"
56
+ <!-- <chat-audio *ngIf="isAudio(message)"
40
57
  [metadata]="message.metadata"
41
58
  (onElementRendered)="onElementRenderedFN($event)">
42
- </chat-audio>
59
+ </chat-audio> -->
60
+
61
+ <chat-audio-track *ngIf="isAudio(message)"
62
+ [metadata]="message.metadata"
63
+ [color]="fontColor"
64
+ [fontSize]="fontSize"
65
+ [stylesMap]="stylesMap">
66
+ </chat-audio-track>
67
+
43
68
 
44
69
  <!-- <chat-frame *ngIf="message.metadata && message.metadata.type && message.metadata.type.includes('video')"
45
70
  [metadata]="message.metadata"
@@ -51,7 +76,7 @@
51
76
  <!-- <div *ngIf="message.type == 'text'"> -->
52
77
 
53
78
  <!-- tooltip="{{message.timestamp | dateAgo}} ({{message.timestamp | date:'shortDate'}} {{message.timestamp | date:'HH:mm:ss'}})" placement="bottom" -->
54
- <div *ngIf="message?.text" >
79
+ <div *ngIf="message?.text && !isAudio(message)" >
55
80
 
56
81
  <!-- [htmlEnabled]="(message?.type==='html')? true : false" -->
57
82
  <chat-text *ngIf="message?.type !=='html'"
@@ -5,6 +5,9 @@
5
5
  border-radius: var(--border-radius-bubble-message);
6
6
  padding: 0;
7
7
  word-wrap: break-word;
8
+
9
+ background: transparent;
10
+
8
11
  // padding: 14px;
9
12
  // padding: 6px 6px 6px 6px;
10
13
  // box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
@@ -26,4 +29,8 @@
26
29
  height: auto;
27
30
  object-fit: cover;
28
31
  }
32
+
33
+ chat-audio-track {
34
+ display: flex;
35
+ }
29
36
  }
@@ -42,6 +42,7 @@ export class BubbleMessageComponent implements OnInit {
42
42
  constructor(public sanitizer: DomSanitizer) { }
43
43
 
44
44
  ngOnInit() {
45
+ // console.log("---- > MSG:", this.message);
45
46
  }
46
47
 
47
48
  ngOnChanges() {
@@ -10,20 +10,20 @@
10
10
  </button>
11
11
  </div>
12
12
  <div class="content">
13
- <div class="text">{{ translationMap?.get('CONFIRM_CLOSE_CHAT') }}</div>
13
+ <div class="text">Are you sure you wanna close this chat?</div>
14
14
  <div class="options">
15
15
 
16
16
  <!-- BUTTON CANCEL-->
17
- <span class="v-align-center c21-label-button back-button" [class.disabled]="isLoadingActive" (click)="onBack()">
17
+ <span class="v-align-center c21-label-button back-button" (click)="onBack()">
18
18
  {{translationMap?.get('BACK')}}
19
19
  </span>
20
20
 
21
21
  <!-- BUTTON CLOSE-->
22
- <button tabindex="1040" aflistconv #aflistconv class="c21-button-primary" (click)="onConfirm()" [ngStyle]="{'background-color': stylesMap?.get('themeColor'), 'border-color': stylesMap?.get('themeColor'), 'color': stylesMap?.get('foregroundColor') }">
23
- <span *ngIf="isLoadingActive" class="spinner-container">
24
- <svg xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="25" height="25" [ngStyle]="{'fill': stylesMap?.get('foregroundColor') }"
22
+ <button tabindex="1040" aflistconv #aflistconv class="c21-button-primary" (click)="onConfirm()" [ngStyle]="{'background-color': stylesMap?.get('themeColor'), 'border-color': stylesMap?.get('themeColor'), 'color': stylesMap?.get('themeForegroundColor') }">
23
+ <span *ngIf="isLoadingActive" style="height: inherit; width: inherit;">
24
+ <svg xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" with="25" height="25"
25
25
  viewBox="0 0 100 100" enable-background="new 0 0 0 0" xml:space="preserve">
26
- <path fill="inherit" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50">
26
+ <path fill="#fff" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50">
27
27
  <animateTransform
28
28
  attributeName="transform"
29
29
  attributeType="XML"
@@ -28,23 +28,12 @@
28
28
  }
29
29
 
30
30
  .back-button{
31
- color: #777777;
32
-
33
- &.disabled{
34
- cursor: not-allowed;
35
- pointer-events: none;
36
- opacity: 0.6
37
- }
38
- }
39
-
40
- .spinner-container{
41
- width: inherit;
42
- height: inherit;
43
- display: flex;
44
- align-items: center;
31
+ color: #777777
45
32
  }
46
33
 
47
34
  }
35
+
36
+
48
37
  }
49
38
 
50
39
  .c21-header-button{
@@ -1,6 +1,4 @@
1
- import { Component, ElementRef, EventEmitter, Input, OnInit, Output, SimpleChange, SimpleChanges, ViewChild, OnDestroy } from '@angular/core';
2
- import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
3
- import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
1
+ import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
4
2
 
5
3
 
6
4
  @Component({
@@ -9,33 +7,20 @@ import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance'
9
7
  styleUrls: ['./confirm-close.component.scss']
10
8
  })
11
9
  export class ConfirmCloseComponent implements OnInit{
12
-
13
- @Input() isLoadingActive: boolean;
14
- @Input() conversationId: string;
10
+
11
+ isLoadingActive: boolean = false;
15
12
 
16
13
  @Input() translationMap: Map< string, string>;
17
14
  @Input() stylesMap: Map<string, string>;
18
15
  @Output() onDiaglogClosed = new EventEmitter<{type: string, data: any}>();
19
16
 
20
- private logger: LoggerService = LoggerInstance.getInstance();
21
17
  constructor() { }
22
18
 
23
19
  ngOnInit(): void {
24
- this.logger.log('[CONFIRM CLOSE MODAL] onInit', this.isLoadingActive, this.stylesMap);
20
+ console.log('[CONFIRM CLOSE MODAL] onInit');
25
21
  // this.dialog.showModal();
26
22
  }
27
23
 
28
- ngOnChanges(changes: SimpleChanges){
29
- if(changes &&
30
- changes['conversationId'] &&
31
- changes['conversationId'].previousValue !== undefined &&
32
- (changes['conversationId'].previousValue !== changes['conversationId'].currentValue) &&
33
- changes['conversationId'].currentValue
34
- ){
35
- this.isLoadingActive = false;
36
- }
37
- }
38
-
39
24
  ngAfterViewInit(){
40
25
  }
41
26
 
@@ -388,7 +388,7 @@ export class Globals {
388
388
  /**enable user to set a facebook messanger page to chat with */
389
389
  this.telegramUsername = ''
390
390
  /**enable user to set a telegram number to chat with */
391
- this.fileUploadAccept = "image/*,.pdf,.txt"
391
+ this.fileUploadAccept = "image/*,.pdf,.txt,.mp3"
392
392
  /**enable auto disconnect from messaging after a defined amount of time (s)*/
393
393
  this.disconnetTime = 0
394
394
 
@@ -131,6 +131,7 @@
131
131
  display: -webkit-box;
132
132
  max-height: 258px; /* Fallback for non-webkit */
133
133
  line-height: 2.3;
134
+ line-clamp: 8;
134
135
  -webkit-line-clamp: 8;
135
136
  -webkit-box-orient: vertical;
136
137
  overflow: hidden;
@@ -1,20 +0,0 @@
1
-
2
-
3
- <div id="audio_container" #audio_container>
4
-
5
- <audio aria-label="traccia audio" #audio_msg controls controlsList="nodownload" id="audio_msg" (pause)="pauseAudioMsg($event)" (play)="playAudioMsg($event)" (timeupdate)="updateTimeAudioMsg($event)">
6
- <source [src]="metadata?.src" [type]="metadata?.type">
7
- <!-- {{metadata?.src}} -->
8
- <!-- controlsList="nodownload" -->
9
- </audio>
10
-
11
- <!-- <button id="play-icon" (click)="onPlayPause('play')" *ngIf="status === 'play'">
12
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M10 8.64L15.27 12 10 15.36V8.64M8 5v14l11-7L8 5z"/></svg>
13
- </button>
14
- <button id="pause-icon" (click)="onPlayPause('pause')" *ngIf="status === 'pause'">
15
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"/></svg>
16
- </button>
17
- <div id="duration" #duration>0:00</div>
18
- <input type="range" id="seek-slider" max="100" value="0"> -->
19
- </div>
20
-
@@ -1,122 +0,0 @@
1
- #audio_container{
2
- display: flex;
3
- }
4
-
5
- #play-icon,
6
- #pause-icon {
7
- margin: 20px 2.5% 10px 2.5%;
8
- }
9
-
10
- .time {
11
- display: inline-block;
12
- width: 37px;
13
- text-align: center;
14
- font-size: 20px;
15
- margin: 28.5px 0 18.5px 0;
16
- float: left;
17
- }
18
- output {
19
- display: inline-block;
20
- width: 32px;
21
- text-align: center;
22
- font-size: 20px;
23
- margin: 10px 2.5% 0 5%;
24
- float: left;
25
- clear: left;
26
- }
27
-
28
- input[type="range"] {
29
- position: relative;
30
- -webkit-appearance: none;
31
- width: 48%;
32
- margin: 0;
33
- padding: 0;
34
- height: 19px;
35
- margin: 30px 2.5% 20px 2.5%;
36
- float: left;
37
- outline: none;
38
- }
39
- input[type="range"]::-webkit-slider-runnable-track {
40
- width: 100%;
41
- height: 3px;
42
- cursor: pointer;
43
- background: linear-gradient(to right, rgba(0, 125, 181, 0.6) var(--buffered-width), rgba(0, 125, 181, 0.2) var(--buffered-width));
44
- }
45
- input[type="range"]::before {
46
- position: absolute;
47
- content: "";
48
- top: 8px;
49
- left: 0;
50
- width: var(--seek-before-width);
51
- height: 3px;
52
- background-color: #007db5;
53
- cursor: pointer;
54
- }
55
- input[type="range"]::-webkit-slider-thumb {
56
- position: relative;
57
- -webkit-appearance: none;
58
- box-sizing: content-box;
59
- border: 1px solid #007db5;
60
- height: 15px;
61
- width: 15px;
62
- border-radius: 50%;
63
- background-color: #fff;
64
- cursor: pointer;
65
- margin: -7px 0 0 0;
66
- }
67
- input[type="range"]:active::-webkit-slider-thumb {
68
- transform: scale(1.2);
69
- background: #007db5;
70
- }
71
- input[type="range"]::-moz-range-track {
72
- width: 100%;
73
- height: 3px;
74
- cursor: pointer;
75
- background: linear-gradient(to right, rgba(0, 125, 181, 0.6) var(--buffered-width), rgba(0, 125, 181, 0.2) var(--buffered-width));
76
- }
77
- input[type="range"]::-moz-range-progress {
78
- background-color: #007db5;
79
- }
80
- input[type="range"]::-moz-focus-outer {
81
- border: 0;
82
- }
83
- input[type="range"]::-moz-range-thumb {
84
- box-sizing: content-box;
85
- border: 1px solid #007db5;
86
- height: 15px;
87
- width: 15px;
88
- border-radius: 50%;
89
- background-color: #fff;
90
- cursor: pointer;
91
- }
92
- input[type="range"]:active::-moz-range-thumb {
93
- transform: scale(1.2);
94
- background: #007db5;
95
- }
96
- input[type="range"]::-ms-track {
97
- width: 100%;
98
- height: 3px;
99
- cursor: pointer;
100
- background: transparent;
101
- border: solid transparent;
102
- color: transparent;
103
- }
104
- input[type="range"]::-ms-fill-lower {
105
- background-color: #007db5;
106
- }
107
- input[type="range"]::-ms-fill-upper {
108
- background: linear-gradient(to right, rgba(0, 125, 181, 0.6) var(--buffered-width), rgba(0, 125, 181, 0.2) var(--buffered-width));
109
- }
110
- input[type="range"]::-ms-thumb {
111
- box-sizing: content-box;
112
- border: 1px solid #007db5;
113
- height: 15px;
114
- width: 15px;
115
- border-radius: 50%;
116
- background-color: #fff;
117
- cursor: pointer;
118
- }
119
- input[type="range"]:active::-ms-thumb {
120
- transform: scale(1.2);
121
- background: #007db5;
122
- }
@@ -1,122 +0,0 @@
1
- import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
2
- // import lottieWeb from 'https://cdn.skypack.dev/lottie-web';
3
-
4
- @Component({
5
- selector: 'chat-audio',
6
- templateUrl: './audio.component.html',
7
- styleUrls: ['./audio.component.scss']
8
- })
9
- export class AudioComponent implements OnInit {
10
-
11
- @Input() metadata: any;
12
- @Output() onElementRendered = new EventEmitter<{element: string, status: boolean}>();
13
-
14
- uidAudioPlayng: string = ''
15
- divPlay: HTMLAudioElement
16
- playState: HTMLElement
17
- status: 'play' | 'pause' = 'play'
18
-
19
- constructor(private elementRef: ElementRef) { }
20
-
21
- ngOnInit() {
22
- // this.divPlay = this.elementRef.nativeElement.querySelector('#audio_container').querySelector('#audio_msg')
23
- // this.playState= this.elementRef.nativeElement.querySelector('#audio_container').querySelector('#duration')
24
- }
25
-
26
- onPlayPause(status: string){
27
- // const divPlay = (<HTMLAudioElement>document.getElementById('audio_msg'));
28
- if(status === 'play') {
29
- this.divPlay.play();
30
- this.status = 'pause'
31
- } else {
32
- this.divPlay.pause();
33
- this.status = 'play'
34
- }
35
- }
36
-
37
- pauseAudioMsg(e) {
38
- try {
39
- // stop all audio
40
- if (this.uidAudioPlayng) {
41
- const divPlay = (<HTMLAudioElement>document.getElementById(this.uidAudioPlayng));
42
- divPlay.pause();
43
- // console.log('> pausa: ', divPlay);
44
- }
45
- } catch (error) {
46
- console.log('> Error is: ', error);
47
- }
48
-
49
- try {
50
- // console.log(e.target.id);
51
- if (this.uidAudioPlayng) {
52
- this.uidAudioPlayng = '';
53
- }
54
- } catch (error) {
55
- console.log('> Error is: ', error);
56
- }
57
- }
58
-
59
- playAudioMsg(e) {
60
- // stop all audio
61
- if (this.uidAudioPlayng) {
62
- const divPlay = (<HTMLAudioElement>document.getElementById(this.uidAudioPlayng));
63
- divPlay.pause();
64
- // console.log('> pausa: ', divPlay);
65
- }
66
- try {
67
- // console.log(e.target.id);
68
- // set uid audio playng
69
- this.uidAudioPlayng = e.target.id;
70
- } catch (error) {
71
- console.log('> Error is: ', error);
72
- }
73
- }
74
-
75
- updateTimeAudioMsg(ev){
76
- var currTime = Math.floor(ev.target.currentTime);
77
- var duration = Math.floor(ev.target.duration);
78
-
79
- let minutes = 0;
80
- if(currTime > 60){
81
- minutes = Math.floor(currTime / 60);
82
- }
83
- const seconds = currTime - minutes * 60
84
- // console.log('timeeee', minutes + ':' + seconds )
85
- // this.playState.innerHTML = minutes + ':' + seconds
86
- }
87
-
88
-
89
-
90
- /**
91
- *
92
- * @param uid
93
- */
94
- playPausaAudioMsg(uid: string) {
95
- // console.log('playPausaAudioMsg: ', uid);
96
- const that = this;
97
- try {
98
- const divPause = (<HTMLAudioElement>document.getElementById(that.uidAudioPlayng));
99
- const divPlay = (<HTMLAudioElement>document.getElementById(uid));
100
- if (divPause) {
101
- divPause.pause();
102
- }
103
-
104
- if (that.uidAudioPlayng === uid) {
105
- that.uidAudioPlayng = '';
106
- } else {
107
- if (divPlay) {
108
- setTimeout(function() {
109
- // if (that.g.autoplay_activated) {
110
- // divPlay.play();
111
- // }
112
- this.uidAudioPlayng = uid;
113
- }, 300);
114
- }
115
- }
116
-
117
- } catch (error) {
118
- console.log('> Error is: ', error);
119
- }
120
- }
121
-
122
- }