@acorex/components 21.0.3-next.40 → 21.0.3-next.41

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 (106) hide show
  1. package/fesm2022/{acorex-components-conversation-open-composer-picker-for-files-Du8Lj9Sp.mjs → acorex-components-conversation-open-composer-picker-for-files-Duvap4M4.mjs} +2 -3
  2. package/fesm2022/{acorex-components-conversation-open-composer-picker-for-files-Du8Lj9Sp.mjs.map → acorex-components-conversation-open-composer-picker-for-files-Duvap4M4.mjs.map} +1 -1
  3. package/fesm2022/acorex-components-conversation.mjs +22456 -1
  4. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  5. package/package.json +3 -3
  6. package/types/acorex-components-conversation.d.ts +1228 -48
  7. package/fesm2022/acorex-components-conversation-acorex-components-conversation-YhVa42TC.mjs +0 -13711
  8. package/fesm2022/acorex-components-conversation-acorex-components-conversation-YhVa42TC.mjs.map +0 -1
  9. package/fesm2022/acorex-components-conversation-audio-attachment.component-CLvS3W8F.mjs +0 -119
  10. package/fesm2022/acorex-components-conversation-audio-attachment.component-CLvS3W8F.mjs.map +0 -1
  11. package/fesm2022/acorex-components-conversation-audio-composer.payload-BHQJNyXz.mjs +0 -59
  12. package/fesm2022/acorex-components-conversation-audio-composer.payload-BHQJNyXz.mjs.map +0 -1
  13. package/fesm2022/acorex-components-conversation-audio-picker.component-BD_fN2Ip.mjs +0 -432
  14. package/fesm2022/acorex-components-conversation-audio-picker.component-BD_fN2Ip.mjs.map +0 -1
  15. package/fesm2022/acorex-components-conversation-audio-renderer.component-CcxVVprx.mjs +0 -177
  16. package/fesm2022/acorex-components-conversation-audio-renderer.component-CcxVVprx.mjs.map +0 -1
  17. package/fesm2022/acorex-components-conversation-audio.payload-Bag4aTut.mjs +0 -54
  18. package/fesm2022/acorex-components-conversation-audio.payload-Bag4aTut.mjs.map +0 -1
  19. package/fesm2022/acorex-components-conversation-conversation-audio.file-type-CfGSVnMA.mjs +0 -100
  20. package/fesm2022/acorex-components-conversation-conversation-audio.file-type-CfGSVnMA.mjs.map +0 -1
  21. package/fesm2022/acorex-components-conversation-conversation-file.file-type-DB-2xhaC.mjs +0 -121
  22. package/fesm2022/acorex-components-conversation-conversation-file.file-type-DB-2xhaC.mjs.map +0 -1
  23. package/fesm2022/acorex-components-conversation-conversation-image.file-type-C02OzZZB.mjs +0 -84
  24. package/fesm2022/acorex-components-conversation-conversation-image.file-type-C02OzZZB.mjs.map +0 -1
  25. package/fesm2022/acorex-components-conversation-conversation-info-media-view.component-Mhk7JE6K.mjs +0 -238
  26. package/fesm2022/acorex-components-conversation-conversation-info-media-view.component-Mhk7JE6K.mjs.map +0 -1
  27. package/fesm2022/acorex-components-conversation-conversation-info-panel.component-CNaM5ajR.mjs +0 -1080
  28. package/fesm2022/acorex-components-conversation-conversation-info-panel.component-CNaM5ajR.mjs.map +0 -1
  29. package/fesm2022/acorex-components-conversation-conversation-video.file-type-Pescv4Vu.mjs +0 -102
  30. package/fesm2022/acorex-components-conversation-conversation-video.file-type-Pescv4Vu.mjs.map +0 -1
  31. package/fesm2022/acorex-components-conversation-conversation-voice.file-type-DDd47o4r.mjs +0 -90
  32. package/fesm2022/acorex-components-conversation-conversation-voice.file-type-DDd47o4r.mjs.map +0 -1
  33. package/fesm2022/acorex-components-conversation-fallback-renderer.component-CYh_6O6j.mjs +0 -44
  34. package/fesm2022/acorex-components-conversation-fallback-renderer.component-CYh_6O6j.mjs.map +0 -1
  35. package/fesm2022/acorex-components-conversation-file-composer.payload-Dy7aG-EH.mjs +0 -64
  36. package/fesm2022/acorex-components-conversation-file-composer.payload-Dy7aG-EH.mjs.map +0 -1
  37. package/fesm2022/acorex-components-conversation-file-picker.component-DCVgl33l.mjs +0 -468
  38. package/fesm2022/acorex-components-conversation-file-picker.component-DCVgl33l.mjs.map +0 -1
  39. package/fesm2022/acorex-components-conversation-file-renderer.component-DgCi06Mg.mjs +0 -125
  40. package/fesm2022/acorex-components-conversation-file-renderer.component-DgCi06Mg.mjs.map +0 -1
  41. package/fesm2022/acorex-components-conversation-file.payload-DyFxTQYn.mjs +0 -50
  42. package/fesm2022/acorex-components-conversation-file.payload-DyFxTQYn.mjs.map +0 -1
  43. package/fesm2022/acorex-components-conversation-format-media-DUD4vA6F.mjs +0 -21
  44. package/fesm2022/acorex-components-conversation-format-media-DUD4vA6F.mjs.map +0 -1
  45. package/fesm2022/acorex-components-conversation-image-attachment.component-CLMGxXPl.mjs +0 -77
  46. package/fesm2022/acorex-components-conversation-image-attachment.component-CLMGxXPl.mjs.map +0 -1
  47. package/fesm2022/acorex-components-conversation-image-picker.component-CS343UDa.mjs +0 -407
  48. package/fesm2022/acorex-components-conversation-image-picker.component-CS343UDa.mjs.map +0 -1
  49. package/fesm2022/acorex-components-conversation-image-renderer.component-Cy0TA6cL.mjs +0 -83
  50. package/fesm2022/acorex-components-conversation-image-renderer.component-Cy0TA6cL.mjs.map +0 -1
  51. package/fesm2022/acorex-components-conversation-index-3V2b14I0.mjs +0 -184
  52. package/fesm2022/acorex-components-conversation-index-3V2b14I0.mjs.map +0 -1
  53. package/fesm2022/acorex-components-conversation-index-MCvfr9Zd.mjs +0 -266
  54. package/fesm2022/acorex-components-conversation-index-MCvfr9Zd.mjs.map +0 -1
  55. package/fesm2022/acorex-components-conversation-location-picker.component-DcNQzuoU.mjs +0 -149
  56. package/fesm2022/acorex-components-conversation-location-picker.component-DcNQzuoU.mjs.map +0 -1
  57. package/fesm2022/acorex-components-conversation-location-renderer.component-Cw2PB0LM.mjs +0 -118
  58. package/fesm2022/acorex-components-conversation-location-renderer.component-Cw2PB0LM.mjs.map +0 -1
  59. package/fesm2022/acorex-components-conversation-media-formatters-DV3wEEno.mjs +0 -17
  60. package/fesm2022/acorex-components-conversation-media-formatters-DV3wEEno.mjs.map +0 -1
  61. package/fesm2022/acorex-components-conversation-media-playback-info-bar-banner.component-DbWUl6M2.mjs +0 -140
  62. package/fesm2022/acorex-components-conversation-media-playback-info-bar-banner.component-DbWUl6M2.mjs.map +0 -1
  63. package/fesm2022/acorex-components-conversation-message-renderer-copy-host.component-oXTr_Lfq.mjs +0 -33
  64. package/fesm2022/acorex-components-conversation-message-renderer-copy-host.component-oXTr_Lfq.mjs.map +0 -1
  65. package/fesm2022/acorex-components-conversation-message-renderer-state.component-Dp-JdHWr.mjs +0 -172
  66. package/fesm2022/acorex-components-conversation-message-renderer-state.component-Dp-JdHWr.mjs.map +0 -1
  67. package/fesm2022/acorex-components-conversation-pagination-demo-data-oIT_YJmN.mjs +0 -81
  68. package/fesm2022/acorex-components-conversation-pagination-demo-data-oIT_YJmN.mjs.map +0 -1
  69. package/fesm2022/acorex-components-conversation-picker-header.component-BneIFjXq.mjs +0 -91
  70. package/fesm2022/acorex-components-conversation-picker-header.component-BneIFjXq.mjs.map +0 -1
  71. package/fesm2022/acorex-components-conversation-picker-toolbar.component-BthRvEeE.mjs +0 -537
  72. package/fesm2022/acorex-components-conversation-picker-toolbar.component-BthRvEeE.mjs.map +0 -1
  73. package/fesm2022/acorex-components-conversation-picker-upload-C-PlKPaU.mjs +0 -163
  74. package/fesm2022/acorex-components-conversation-picker-upload-C-PlKPaU.mjs.map +0 -1
  75. package/fesm2022/acorex-components-conversation-playback-banner-sync-D8FFKde6.mjs +0 -68
  76. package/fesm2022/acorex-components-conversation-playback-banner-sync-D8FFKde6.mjs.map +0 -1
  77. package/fesm2022/acorex-components-conversation-renderer-shared.styles-Digah3Zn.mjs +0 -95
  78. package/fesm2022/acorex-components-conversation-renderer-shared.styles-Digah3Zn.mjs.map +0 -1
  79. package/fesm2022/acorex-components-conversation-search.component-B-nc6xiA.mjs +0 -187
  80. package/fesm2022/acorex-components-conversation-search.component-B-nc6xiA.mjs.map +0 -1
  81. package/fesm2022/acorex-components-conversation-send-message-media-BRklgfV7.mjs +0 -170
  82. package/fesm2022/acorex-components-conversation-send-message-media-BRklgfV7.mjs.map +0 -1
  83. package/fesm2022/acorex-components-conversation-shared-storage.seed-J9PA4l3c.mjs +0 -750
  84. package/fesm2022/acorex-components-conversation-shared-storage.seed-J9PA4l3c.mjs.map +0 -1
  85. package/fesm2022/acorex-components-conversation-sticker-renderer.component-BmBwy7Ig.mjs +0 -103
  86. package/fesm2022/acorex-components-conversation-sticker-renderer.component-BmBwy7Ig.mjs.map +0 -1
  87. package/fesm2022/acorex-components-conversation-system-renderer.component-uie3tm5N.mjs +0 -55
  88. package/fesm2022/acorex-components-conversation-system-renderer.component-uie3tm5N.mjs.map +0 -1
  89. package/fesm2022/acorex-components-conversation-text-renderer.component-DNAquHYK.mjs +0 -109
  90. package/fesm2022/acorex-components-conversation-text-renderer.component-DNAquHYK.mjs.map +0 -1
  91. package/fesm2022/acorex-components-conversation-video-attachment.component-CGaUhnSb.mjs +0 -105
  92. package/fesm2022/acorex-components-conversation-video-attachment.component-CGaUhnSb.mjs.map +0 -1
  93. package/fesm2022/acorex-components-conversation-video-composer.payload-DMqRkafr.mjs +0 -62
  94. package/fesm2022/acorex-components-conversation-video-composer.payload-DMqRkafr.mjs.map +0 -1
  95. package/fesm2022/acorex-components-conversation-video-picker.component-DPwSBnoH.mjs +0 -446
  96. package/fesm2022/acorex-components-conversation-video-picker.component-DPwSBnoH.mjs.map +0 -1
  97. package/fesm2022/acorex-components-conversation-video-renderer.component-DKa9mUe2.mjs +0 -181
  98. package/fesm2022/acorex-components-conversation-video-renderer.component-DKa9mUe2.mjs.map +0 -1
  99. package/fesm2022/acorex-components-conversation-video.payload-C8QaqxuX.mjs +0 -54
  100. package/fesm2022/acorex-components-conversation-video.payload-C8QaqxuX.mjs.map +0 -1
  101. package/fesm2022/acorex-components-conversation-voice-composer.payload-DLVow7ex.mjs +0 -17
  102. package/fesm2022/acorex-components-conversation-voice-composer.payload-DLVow7ex.mjs.map +0 -1
  103. package/fesm2022/acorex-components-conversation-voice-recorder.component-D_rdANZN.mjs +0 -344
  104. package/fesm2022/acorex-components-conversation-voice-recorder.component-D_rdANZN.mjs.map +0 -1
  105. package/fesm2022/acorex-components-conversation-voice-renderer.component-BY5FJcT8.mjs +0 -270
  106. package/fesm2022/acorex-components-conversation-voice-renderer.component-BY5FJcT8.mjs.map +0 -1
@@ -1,270 +0,0 @@
1
- import { isPlatformBrowser, CommonModule } from '@angular/common';
2
- import * as i0 from '@angular/core';
3
- import { inject, PLATFORM_ID, DestroyRef, viewChild, signal, input, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';
4
- import { l as copyWithFileTypeFallback, m as AXConversationInfoBarService, x as createResolvedMediaUrlSignal, y as pickDisplayMediaUrl } from './acorex-components-conversation-acorex-components-conversation-YhVa42TC.mjs';
5
- import { AXFileTypeRegistryService } from '@acorex/core/file';
6
- import { AXTranslationService } from '@acorex/core/translation';
7
- import { A as AXConversationMessageRendererCopyHostComponent, m as mediaCopyText } from './acorex-components-conversation-message-renderer-copy-host.component-oXTr_Lfq.mjs';
8
- import { f as formatMediaDuration } from './acorex-components-conversation-format-media-DUD4vA6F.mjs';
9
- import { A as AXConversationMessageRendererStateComponent } from './acorex-components-conversation-message-renderer-state.component-Dp-JdHWr.mjs';
10
- import { b as bindMediaRendererContentState, r as reportMediaLoadError, s as syncPlaybackInfoBarBanner } from './acorex-components-conversation-playback-banner-sync-D8FFKde6.mjs';
11
-
12
- /** Decorative bars when payload has no waveform (deterministic, no random). */
13
- const AX_CONVERSATION_FALLBACK_WAVEFORM = [
14
- 38, 58, 44, 72, 48, 64, 40, 68, 52, 60, 42, 56, 46, 70, 50, 62, 36, 54, 48, 66,
15
- ];
16
- class AXConversationVoiceRendererComponent extends AXConversationMessageRendererCopyHostComponent {
17
- copy() {
18
- return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {
19
- const url = this.voiceUrl()?.trim();
20
- return mediaCopyText(undefined, 'Voice message', 'voice messages', 1, [url]);
21
- });
22
- }
23
- constructor() {
24
- super();
25
- this.fileTypes = inject(AXFileTypeRegistryService);
26
- this.translation = inject(AXTranslationService);
27
- this.platformId = inject(PLATFORM_ID);
28
- this.destroyRef = inject(DestroyRef);
29
- this.infoBarService = inject(AXConversationInfoBarService, { optional: true });
30
- this.audioElementRef = viewChild('audioElement', ...(ngDevMode ? [{ debugName: "audioElementRef" }] : /* istanbul ignore next */ []));
31
- this._contentState = signal('ready', ...(ngDevMode ? [{ debugName: "_contentState" }] : /* istanbul ignore next */ []));
32
- this.message = input.required(...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
33
- this.rendererState = computed(() => ({
34
- deliveryStatus: this.message().status,
35
- contentState: this._contentState(),
36
- }), ...(ngDevMode ? [{ debugName: "rendererState" }] : /* istanbul ignore next */ []));
37
- this.isPlaying = signal(false, ...(ngDevMode ? [{ debugName: "isPlaying" }] : /* istanbul ignore next */ []));
38
- this.currentTime = signal(0, ...(ngDevMode ? [{ debugName: "currentTime" }] : /* istanbul ignore next */ []));
39
- this.duration = signal(0, ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
40
- this.playbackSpeed = signal(1.0, ...(ngDevMode ? [{ debugName: "playbackSpeed" }] : /* istanbul ignore next */ []));
41
- this.speeds = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
42
- this.payload = computed(() => this.message().payload, ...(ngDevMode ? [{ debugName: "payload" }] : /* istanbul ignore next */ []));
43
- this.mediaReference = computed(() => ({
44
- url: this.payload().url,
45
- mediaId: this.payload().mediaId,
46
- mimeType: this.payload().mimeType,
47
- size: this.payload().size,
48
- }), ...(ngDevMode ? [{ debugName: "mediaReference" }] : /* istanbul ignore next */ []));
49
- this.resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);
50
- this.voiceUrl = computed(() => pickDisplayMediaUrl(this.resolvedUrl(), this.payload().url), ...(ngDevMode ? [{ debugName: "voiceUrl" }] : /* istanbul ignore next */ []));
51
- this.waveformBars = computed(() => {
52
- const w = this.payload().waveform;
53
- return w?.length ? w : [...AX_CONVERSATION_FALLBACK_WAVEFORM];
54
- }, ...(ngDevMode ? [{ debugName: "waveformBars" }] : /* istanbul ignore next */ []));
55
- this.activeBarIndex = computed(() => {
56
- const dur = this.duration();
57
- const n = this.waveformBars().length;
58
- return dur > 0 ? Math.floor((this.currentTime() / dur) * n) : 0;
59
- }, ...(ngDevMode ? [{ debugName: "activeBarIndex" }] : /* istanbul ignore next */ []));
60
- this.timeLabel = computed(() => formatMediaDuration(this.isPlaying() ? this.currentTime() : this.duration()), ...(ngDevMode ? [{ debugName: "timeLabel" }] : /* istanbul ignore next */ []));
61
- this.voiceLoadErrorLabel = computed(() => this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-voice'), ...(ngDevMode ? [{ debugName: "voiceLoadErrorLabel" }] : /* istanbul ignore next */ []));
62
- bindMediaRendererContentState(this.message, this._contentState, () => this.voiceUrl());
63
- effect((onCleanup) => {
64
- const audioEl = this.audioElementRef()?.nativeElement;
65
- if (!audioEl || !isPlatformBrowser(this.platformId)) {
66
- return;
67
- }
68
- const onMeta = () => {
69
- this.duration.set(audioEl.duration);
70
- };
71
- audioEl.addEventListener('loadedmetadata', onMeta);
72
- onCleanup(() => audioEl.removeEventListener('loadedmetadata', onMeta));
73
- });
74
- this.destroyRef.onDestroy(() => {
75
- const messageId = this.message()?.id;
76
- if (!messageId || !this.infoBarService) {
77
- return;
78
- }
79
- this.infoBarService.hideMessageBanner(messageId);
80
- });
81
- }
82
- togglePlay() {
83
- if (!isPlatformBrowser(this.platformId)) {
84
- return;
85
- }
86
- const audioEl = this.audioElementRef()?.nativeElement;
87
- if (!audioEl) {
88
- return;
89
- }
90
- if (this.isPlaying()) {
91
- audioEl.pause();
92
- this.isPlaying.set(false);
93
- this.syncInfoBarBanner();
94
- }
95
- else {
96
- void audioEl.play();
97
- this.isPlaying.set(true);
98
- this.syncInfoBarBanner(true);
99
- }
100
- }
101
- cyclePlaybackSpeed() {
102
- const current = this.playbackSpeed();
103
- const i = this.speeds.findIndex((s) => s === current);
104
- const nextIndex = (i < 0 ? 2 : i + 1) % this.speeds.length;
105
- const next = this.speeds[nextIndex] ?? 1;
106
- this.playbackSpeed.set(next);
107
- const audioEl = this.audioElementRef()?.nativeElement;
108
- if (audioEl) {
109
- audioEl.playbackRate = next;
110
- this.syncInfoBarBanner();
111
- }
112
- }
113
- onTimeUpdate() {
114
- const audioEl = this.audioElementRef()?.nativeElement;
115
- if (audioEl) {
116
- this.currentTime.set(audioEl.currentTime);
117
- this.syncInfoBarBanner();
118
- }
119
- }
120
- onEnded() {
121
- this.isPlaying.set(false);
122
- this.currentTime.set(0);
123
- this.syncInfoBarBanner();
124
- }
125
- onError() {
126
- if (!reportMediaLoadError(this.message(), this._contentState)) {
127
- return;
128
- }
129
- this.isPlaying.set(false);
130
- this.infoBarService?.hideMessageBanner(this.message().id);
131
- }
132
- pausePlayback() {
133
- const audioEl = this.audioElementRef()?.nativeElement;
134
- if (!audioEl) {
135
- this.isPlaying.set(false);
136
- return;
137
- }
138
- audioEl.pause();
139
- this.isPlaying.set(false);
140
- }
141
- syncInfoBarBanner(forceOpen = false) {
142
- if (!this.infoBarService) {
143
- return;
144
- }
145
- const message = this.message();
146
- const payload = this.payload();
147
- syncPlaybackInfoBarBanner(this.infoBarService, message, {
148
- title: 'Voice message',
149
- currentTime: this.currentTime(),
150
- duration: this.duration() || payload.duration || 0,
151
- isPlaying: this.isPlaying(),
152
- onTogglePlay: () => this.togglePlay(),
153
- onClose: () => this.pausePlayback(),
154
- playbackSpeed: this.playbackSpeed(),
155
- onCycleSpeed: () => this.cyclePlaybackSpeed(),
156
- showSpeedControl: true,
157
- }, { forceOpen });
158
- }
159
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXConversationVoiceRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
160
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXConversationVoiceRendererComponent, isStandalone: true, selector: "ax-conversation-voice-renderer", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "audioElementRef", first: true, predicate: ["audioElement"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
161
- <div class="ax-conversation-voice">
162
- <div class="ax-conversation-voice__bar">
163
- <button
164
- type="button"
165
- class="ax-conversation-voice__fab"
166
- (click)="togglePlay()"
167
- [attr.aria-label]="isPlaying() ? 'Pause' : 'Play voice message'"
168
- >
169
- <i class="fa-solid" [class.fa-pause]="isPlaying()" [class.fa-play]="!isPlaying()"></i>
170
- </button>
171
- <div class="ax-conversation-voice__wave" aria-hidden="true">
172
- <div class="ax-conversation-voice__cols">
173
- @for (bar of waveformBars(); track $index) {
174
- <div
175
- class="ax-conversation-voice__col"
176
- [style.height.%]="bar"
177
- [class.ax-conversation-voice__col--on]="$index < activeBarIndex()"
178
- ></div>
179
- }
180
- </div>
181
- </div>
182
- <div class="ax-conversation-voice__side">
183
- <button
184
- type="button"
185
- class="ax-conversation-voice__speed"
186
- (click)="cyclePlaybackSpeed()"
187
- [attr.aria-label]="'Playback speed: ' + playbackSpeed() + 'x'"
188
- >
189
- {{ playbackSpeed() }}x
190
- </button>
191
- <span class="ax-conversation-voice__time">{{ timeLabel() }}</span>
192
- </div>
193
- </div>
194
- <audio
195
- #audioElement
196
- class="ax-conversation-voice__el"
197
- [src]="voiceUrl() || null"
198
- (error)="onError()"
199
- (timeupdate)="onTimeUpdate()"
200
- (ended)="onEnded()"
201
- ></audio>
202
- <ax-conversation-message-renderer-state
203
- [rendererState]="rendererState()"
204
- [message]="message()"
205
- [contentErrorLabel]="voiceLoadErrorLabel()"
206
- contentErrorStyle="inline"
207
- contentErrorIconClass="fa-light fa-microphone"
208
- placement="below"
209
- />
210
- </div>
211
- `, isInline: true, styles: [":host{display:block;max-width:100%}.ax-conversation-voice{width:100%;max-width:min(100%,17rem)}.ax-conversation-voice__bar{display:flex;align-items:center;gap:.5rem;padding:.375rem .5rem;border-radius:999px;background:rgb(var(--ax-sys-color-light-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface))}.ax-conversation-voice__fab{flex-shrink:0;width:2.25rem;height:2.25rem;touch-action:manipulation;display:flex;align-items:center;justify-content:center;padding-inline-start:.12rem;border:none;border-radius:50%;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));font-size:.75rem;cursor:pointer;transition:background .15s ease}@media(hover:hover){.ax-conversation-voice__fab:hover{background:rgb(var(--ax-sys-color-primary-600))}}.ax-conversation-voice__fab:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}.ax-conversation-voice__wave{flex:1;min-width:0}.ax-conversation-voice__cols{display:flex;align-items:center;gap:2px;height:1.75rem}.ax-conversation-voice__col{flex:1;min-width:2px;max-height:100%;align-self:center;border-radius:2px;background:rgb(var(--ax-sys-color-border-light-surface));transition:background .12s ease}.ax-conversation-voice__col--on{background:rgb(var(--ax-sys-color-primary-500))}.ax-conversation-voice__side{display:flex;flex-direction:column;align-items:center;gap:.125rem;flex-shrink:0}.ax-conversation-voice__speed{min-width:2.5rem;height:1.25rem;padding:0 .25rem;border:1px solid rgb(var(--ax-sys-color-primary-500));border-radius:999px;background:transparent;color:rgb(var(--ax-sys-color-primary-600));font-size:.6875rem;font-weight:600;cursor:pointer;transition:background .15s ease}.ax-conversation-voice__speed:hover{background:rgb(var(--ax-sys-color-primary-lightest-surface))}.ax-conversation-voice__time{font-size:.625rem;font-variant-numeric:tabular-nums;opacity:.72;color:rgb(var(--ax-sys-color-primary-600))}.ax-conversation-voice__el{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXConversationMessageRendererStateComponent, selector: "ax-conversation-message-renderer-state", inputs: ["rendererState", "message", "contentErrorLabel", "deliveryFailedLabel", "showContentErrorChrome", "contentErrorStyle", "contentErrorIconClass", "placement", "contentRetryEnabled"], outputs: ["contentRetry"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
212
- }
213
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXConversationVoiceRendererComponent, decorators: [{
214
- type: Component,
215
- args: [{ selector: 'ax-conversation-voice-renderer', imports: [CommonModule, AXConversationMessageRendererStateComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
216
- <div class="ax-conversation-voice">
217
- <div class="ax-conversation-voice__bar">
218
- <button
219
- type="button"
220
- class="ax-conversation-voice__fab"
221
- (click)="togglePlay()"
222
- [attr.aria-label]="isPlaying() ? 'Pause' : 'Play voice message'"
223
- >
224
- <i class="fa-solid" [class.fa-pause]="isPlaying()" [class.fa-play]="!isPlaying()"></i>
225
- </button>
226
- <div class="ax-conversation-voice__wave" aria-hidden="true">
227
- <div class="ax-conversation-voice__cols">
228
- @for (bar of waveformBars(); track $index) {
229
- <div
230
- class="ax-conversation-voice__col"
231
- [style.height.%]="bar"
232
- [class.ax-conversation-voice__col--on]="$index < activeBarIndex()"
233
- ></div>
234
- }
235
- </div>
236
- </div>
237
- <div class="ax-conversation-voice__side">
238
- <button
239
- type="button"
240
- class="ax-conversation-voice__speed"
241
- (click)="cyclePlaybackSpeed()"
242
- [attr.aria-label]="'Playback speed: ' + playbackSpeed() + 'x'"
243
- >
244
- {{ playbackSpeed() }}x
245
- </button>
246
- <span class="ax-conversation-voice__time">{{ timeLabel() }}</span>
247
- </div>
248
- </div>
249
- <audio
250
- #audioElement
251
- class="ax-conversation-voice__el"
252
- [src]="voiceUrl() || null"
253
- (error)="onError()"
254
- (timeupdate)="onTimeUpdate()"
255
- (ended)="onEnded()"
256
- ></audio>
257
- <ax-conversation-message-renderer-state
258
- [rendererState]="rendererState()"
259
- [message]="message()"
260
- [contentErrorLabel]="voiceLoadErrorLabel()"
261
- contentErrorStyle="inline"
262
- contentErrorIconClass="fa-light fa-microphone"
263
- placement="below"
264
- />
265
- </div>
266
- `, styles: [":host{display:block;max-width:100%}.ax-conversation-voice{width:100%;max-width:min(100%,17rem)}.ax-conversation-voice__bar{display:flex;align-items:center;gap:.5rem;padding:.375rem .5rem;border-radius:999px;background:rgb(var(--ax-sys-color-light-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface))}.ax-conversation-voice__fab{flex-shrink:0;width:2.25rem;height:2.25rem;touch-action:manipulation;display:flex;align-items:center;justify-content:center;padding-inline-start:.12rem;border:none;border-radius:50%;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));font-size:.75rem;cursor:pointer;transition:background .15s ease}@media(hover:hover){.ax-conversation-voice__fab:hover{background:rgb(var(--ax-sys-color-primary-600))}}.ax-conversation-voice__fab:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}.ax-conversation-voice__wave{flex:1;min-width:0}.ax-conversation-voice__cols{display:flex;align-items:center;gap:2px;height:1.75rem}.ax-conversation-voice__col{flex:1;min-width:2px;max-height:100%;align-self:center;border-radius:2px;background:rgb(var(--ax-sys-color-border-light-surface));transition:background .12s ease}.ax-conversation-voice__col--on{background:rgb(var(--ax-sys-color-primary-500))}.ax-conversation-voice__side{display:flex;flex-direction:column;align-items:center;gap:.125rem;flex-shrink:0}.ax-conversation-voice__speed{min-width:2.5rem;height:1.25rem;padding:0 .25rem;border:1px solid rgb(var(--ax-sys-color-primary-500));border-radius:999px;background:transparent;color:rgb(var(--ax-sys-color-primary-600));font-size:.6875rem;font-weight:600;cursor:pointer;transition:background .15s ease}.ax-conversation-voice__speed:hover{background:rgb(var(--ax-sys-color-primary-lightest-surface))}.ax-conversation-voice__time{font-size:.625rem;font-variant-numeric:tabular-nums;opacity:.72;color:rgb(var(--ax-sys-color-primary-600))}.ax-conversation-voice__el{display:none}\n"] }]
267
- }], ctorParameters: () => [], propDecorators: { audioElementRef: [{ type: i0.ViewChild, args: ['audioElement', { isSignal: true }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: true }] }] } });
268
-
269
- export { AXConversationVoiceRendererComponent };
270
- //# sourceMappingURL=acorex-components-conversation-voice-renderer.component-BY5FJcT8.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acorex-components-conversation-voice-renderer.component-BY5FJcT8.mjs","sources":["../../../../packages/components/conversation/src/lib/plugins/message-list/components/voice-renderer/voice-renderer.component.ts"],"sourcesContent":["import { CommonModule, isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationMessage, AXConversationVoicePayload } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXConversationMessageRendererCopyHostComponent, mediaCopyText } from '../shared/message-renderer-copy-host.component';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { formatMediaDuration } from '../shared/format-media';\nimport { createResolvedMediaUrlSignal } from '../shared/media-url-resolve';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { bindMediaRendererContentState, reportMediaLoadError } from '../shared/media-renderer-content-state';\nimport { syncPlaybackInfoBarBanner } from '../shared/playback-banner-sync';\n\n/** Decorative bars when payload has no waveform (deterministic, no random). */\nconst AX_CONVERSATION_FALLBACK_WAVEFORM: readonly number[] = [\n 38, 58, 44, 72, 48, 64, 40, 68, 52, 60, 42, 56, 46, 70, 50, 62, 36, 54, 48, 66,\n];\n\n@Component({\n selector: 'ax-conversation-voice-renderer',\n imports: [CommonModule, AXConversationMessageRendererStateComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-voice\">\n <div class=\"ax-conversation-voice__bar\">\n <button\n type=\"button\"\n class=\"ax-conversation-voice__fab\"\n (click)=\"togglePlay()\"\n [attr.aria-label]=\"isPlaying() ? 'Pause' : 'Play voice message'\"\n >\n <i class=\"fa-solid\" [class.fa-pause]=\"isPlaying()\" [class.fa-play]=\"!isPlaying()\"></i>\n </button>\n <div class=\"ax-conversation-voice__wave\" aria-hidden=\"true\">\n <div class=\"ax-conversation-voice__cols\">\n @for (bar of waveformBars(); track $index) {\n <div\n class=\"ax-conversation-voice__col\"\n [style.height.%]=\"bar\"\n [class.ax-conversation-voice__col--on]=\"$index < activeBarIndex()\"\n ></div>\n }\n </div>\n </div>\n <div class=\"ax-conversation-voice__side\">\n <button\n type=\"button\"\n class=\"ax-conversation-voice__speed\"\n (click)=\"cyclePlaybackSpeed()\"\n [attr.aria-label]=\"'Playback speed: ' + playbackSpeed() + 'x'\"\n >\n {{ playbackSpeed() }}x\n </button>\n <span class=\"ax-conversation-voice__time\">{{ timeLabel() }}</span>\n </div>\n </div>\n <audio\n #audioElement\n class=\"ax-conversation-voice__el\"\n [src]=\"voiceUrl() || null\"\n (error)=\"onError()\"\n (timeupdate)=\"onTimeUpdate()\"\n (ended)=\"onEnded()\"\n ></audio>\n <ax-conversation-message-renderer-state\n [rendererState]=\"rendererState()\"\n [message]=\"message()\"\n [contentErrorLabel]=\"voiceLoadErrorLabel()\"\n contentErrorStyle=\"inline\"\n contentErrorIconClass=\"fa-light fa-microphone\"\n placement=\"below\"\n />\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n max-width: 100%;\n }\n\n .ax-conversation-voice {\n width: 100%;\n max-width: min(100%, 17rem);\n }\n\n .ax-conversation-voice__bar {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.5rem;\n border-radius: 999px;\n background: rgb(var(--ax-sys-color-light-surface));\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .ax-conversation-voice__fab {\n flex-shrink: 0;\n width: 2.25rem;\n height: 2.25rem;\n touch-action: manipulation;\n display: flex;\n align-items: center;\n justify-content: center;\n padding-inline-start: 0.12rem;\n border: none;\n border-radius: 50%;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n font-size: 0.75rem;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n @media (hover: hover) {\n .ax-conversation-voice__fab:hover {\n background: rgb(var(--ax-sys-color-primary-600));\n }\n }\n\n .ax-conversation-voice__fab:focus-visible {\n outline: 2px solid rgb(var(--ax-sys-color-primary-500));\n outline-offset: 2px;\n }\n\n .ax-conversation-voice__wave {\n flex: 1;\n min-width: 0;\n }\n\n .ax-conversation-voice__cols {\n display: flex;\n align-items: center;\n gap: 2px;\n height: 1.75rem;\n }\n\n .ax-conversation-voice__col {\n flex: 1;\n min-width: 2px;\n max-height: 100%;\n align-self: center;\n border-radius: 2px;\n background: rgb(var(--ax-sys-color-border-light-surface));\n transition: background 0.12s ease;\n }\n\n .ax-conversation-voice__col--on {\n background: rgb(var(--ax-sys-color-primary-500));\n }\n\n .ax-conversation-voice__side {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.125rem;\n flex-shrink: 0;\n }\n\n .ax-conversation-voice__speed {\n min-width: 2.5rem;\n height: 1.25rem;\n padding: 0 0.25rem;\n border: 1px solid rgb(var(--ax-sys-color-primary-500));\n border-radius: 999px;\n background: transparent;\n color: rgb(var(--ax-sys-color-primary-600));\n font-size: 0.6875rem;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .ax-conversation-voice__speed:hover {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n }\n\n .ax-conversation-voice__time {\n font-size: 0.625rem;\n font-variant-numeric: tabular-nums;\n opacity: 0.72;\n color: rgb(var(--ax-sys-color-primary-600));\n }\n\n .ax-conversation-voice__el {\n display: none;\n }\n `,\n ],\n})\nexport class AXConversationVoiceRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n private readonly fileTypes = inject(AXFileTypeRegistryService);\n private readonly translation = inject(AXTranslationService);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n private readonly infoBarService = inject(AXConversationInfoBarService, { optional: true });\n private readonly audioElementRef = viewChild<ElementRef<HTMLAudioElement>>('audioElement');\n\n private readonly _contentState = signal<AXConversationMessageRendererContentState>('ready');\n\n readonly message = input.required<AXConversationMessage>();\n readonly rendererState = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: this._contentState(),\n }));\n\n readonly isPlaying = signal(false);\n readonly currentTime = signal(0);\n readonly duration = signal(0);\n readonly playbackSpeed = signal(1.0);\n\n private readonly speeds = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] as const;\n\n readonly payload = computed(() => this.message().payload as AXConversationVoicePayload);\n private readonly mediaReference = computed(() => ({\n url: this.payload().url,\n mediaId: this.payload().mediaId,\n mimeType: this.payload().mimeType,\n size: this.payload().size,\n }));\n private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n readonly voiceUrl = computed(() => pickDisplayMediaUrl(this.resolvedUrl(), this.payload().url));\n\n readonly waveformBars = computed(() => {\n const w = this.payload().waveform;\n return w?.length ? w : [...AX_CONVERSATION_FALLBACK_WAVEFORM];\n });\n\n readonly activeBarIndex = computed(() => {\n const dur = this.duration();\n const n = this.waveformBars().length;\n return dur > 0 ? Math.floor((this.currentTime() / dur) * n) : 0;\n });\n\n readonly timeLabel = computed(() => formatMediaDuration(this.isPlaying() ? this.currentTime() : this.duration()));\n\n readonly voiceLoadErrorLabel = computed(() =>\n this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-voice'),\n );\n\n copy(): Promise<string> {\n return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n const url = this.voiceUrl()?.trim();\n return mediaCopyText(undefined, 'Voice message', 'voice messages', 1, [url]);\n });\n }\n\n constructor() {\n super();\n bindMediaRendererContentState(this.message, this._contentState, () => this.voiceUrl());\n\n effect((onCleanup) => {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl || !isPlatformBrowser(this.platformId)) {\n return;\n }\n const onMeta = (): void => {\n this.duration.set(audioEl.duration);\n };\n audioEl.addEventListener('loadedmetadata', onMeta);\n onCleanup(() => audioEl.removeEventListener('loadedmetadata', onMeta));\n });\n\n this.destroyRef.onDestroy(() => {\n const messageId = this.message()?.id;\n if (!messageId || !this.infoBarService) {\n return;\n }\n this.infoBarService.hideMessageBanner(messageId);\n });\n }\n\n togglePlay(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl) {\n return;\n }\n if (this.isPlaying()) {\n audioEl.pause();\n this.isPlaying.set(false);\n this.syncInfoBarBanner();\n } else {\n void audioEl.play();\n this.isPlaying.set(true);\n this.syncInfoBarBanner(true);\n }\n }\n\n cyclePlaybackSpeed(): void {\n const current = this.playbackSpeed();\n const i = this.speeds.findIndex((s) => s === current);\n const nextIndex = (i < 0 ? 2 : i + 1) % this.speeds.length;\n const next = this.speeds[nextIndex] ?? 1;\n this.playbackSpeed.set(next);\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl) {\n audioEl.playbackRate = next;\n this.syncInfoBarBanner();\n }\n }\n\n onTimeUpdate(): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl) {\n this.currentTime.set(audioEl.currentTime);\n this.syncInfoBarBanner();\n }\n }\n\n onEnded(): void {\n this.isPlaying.set(false);\n this.currentTime.set(0);\n this.syncInfoBarBanner();\n }\n\n onError(): void {\n if (!reportMediaLoadError(this.message(), this._contentState)) {\n return;\n }\n this.isPlaying.set(false);\n this.infoBarService?.hideMessageBanner(this.message().id);\n }\n\n private pausePlayback(): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl) {\n this.isPlaying.set(false);\n return;\n }\n audioEl.pause();\n this.isPlaying.set(false);\n }\n\n private syncInfoBarBanner(forceOpen = false): void {\n if (!this.infoBarService) {\n return;\n }\n const message = this.message();\n const payload = this.payload();\n\n syncPlaybackInfoBarBanner(\n this.infoBarService,\n message,\n {\n title: 'Voice message',\n currentTime: this.currentTime(),\n duration: this.duration() || payload.duration || 0,\n isPlaying: this.isPlaying(),\n onTogglePlay: () => this.togglePlay(),\n onClose: () => this.pausePlayback(),\n playbackSpeed: this.playbackSpeed(),\n onCycleSpeed: () => this.cyclePlaybackSpeed(),\n showSpeedControl: true,\n },\n { forceOpen },\n );\n }\n}\n"],"names":[],"mappings":"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"}