@acorex/components 17.0.15 → 17.0.16
Sign up to get free protection for your applications and to get access to all the features.
- package/conversation/index.d.ts +12 -0
- package/{chat/lib/chat-input/chat-input.component.d.ts → conversation/lib/conversation-input/conversation-input.component.d.ts} +4 -4
- package/conversation/lib/conversation-message/conversation-message.component.d.ts +16 -0
- package/conversation/lib/conversation-messages/conversation-message-text.component.d.ts +9 -0
- package/{chat/lib/chat-messages/chat-messages-voice/chat-message-voice.component.d.ts → conversation/lib/conversation-messages/conversation-messages-voice/conversation-message-voice.component.d.ts} +6 -4
- package/conversation/lib/conversation-view/conversation-view.component.d.ts +10 -0
- package/conversation/lib/conversation.module.d.ts +36 -0
- package/conversation/lib/conversation.types.d.ts +21 -0
- package/conversation/lib/services/conversation-message-type-registry.service.d.ts +9 -0
- package/conversation/lib/services/conversation.service.d.ts +5 -0
- package/esm2022/audio-wave/lib/audio-wave.component.mjs +4 -4
- package/esm2022/conversation/acorex-components-conversation.mjs +5 -0
- package/esm2022/conversation/index.mjs +14 -0
- package/esm2022/conversation/lib/classes/events.interface.mjs +2 -0
- package/esm2022/{chat/lib/chat-input/chat-input.component.mjs → conversation/lib/conversation-input/conversation-input.component.mjs} +14 -14
- package/esm2022/conversation/lib/conversation-input/conversation-input.interface.mjs +2 -0
- package/esm2022/conversation/lib/conversation-message/conversation-message.component.mjs +55 -0
- package/esm2022/conversation/lib/conversation-messages/conversation-message-text.component.mjs +23 -0
- package/esm2022/conversation/lib/conversation-messages/conversation-messages-voice/conversation-message-voice.component.mjs +112 -0
- package/esm2022/conversation/lib/conversation-view/conversation-view.component.mjs +22 -0
- package/esm2022/conversation/lib/conversation.module.mjs +150 -0
- package/esm2022/conversation/lib/conversation.types.mjs +10 -0
- package/esm2022/conversation/lib/services/conversation-message-type-registry.service.mjs +20 -0
- package/esm2022/conversation/lib/services/conversation.service.mjs +10 -0
- package/esm2022/conversation/lib/services/recording.service.mjs +78 -0
- package/fesm2022/acorex-components-audio-wave.mjs +3 -3
- package/fesm2022/acorex-components-audio-wave.mjs.map +1 -1
- package/fesm2022/{acorex-components-chat.mjs → acorex-components-conversation.mjs} +106 -86
- package/fesm2022/acorex-components-conversation.mjs.map +1 -0
- package/package.json +13 -13
- package/chat/index.d.ts +0 -12
- package/chat/lib/chat-message/chat-message.component.d.ts +0 -16
- package/chat/lib/chat-messages/chat-message-text.component.d.ts +0 -8
- package/chat/lib/chat-view/chat-view.component.d.ts +0 -10
- package/chat/lib/chat.module.d.ts +0 -35
- package/chat/lib/chat.types.d.ts +0 -21
- package/chat/lib/services/chat-message-type-registry.service.d.ts +0 -9
- package/chat/lib/services/chat.service.d.ts +0 -5
- package/esm2022/chat/acorex-components-chat.mjs +0 -5
- package/esm2022/chat/index.mjs +0 -14
- package/esm2022/chat/lib/chat-input/chat-input.interface.mjs +0 -2
- package/esm2022/chat/lib/chat-message/chat-message.component.mjs +0 -54
- package/esm2022/chat/lib/chat-messages/chat-message-text.component.mjs +0 -23
- package/esm2022/chat/lib/chat-messages/chat-messages-voice/chat-message-voice.component.mjs +0 -97
- package/esm2022/chat/lib/chat-view/chat-view.component.mjs +0 -22
- package/esm2022/chat/lib/chat.module.mjs +0 -146
- package/esm2022/chat/lib/chat.types.mjs +0 -10
- package/esm2022/chat/lib/classes/events.interface.mjs +0 -2
- package/esm2022/chat/lib/services/chat-message-type-registry.service.mjs +0 -20
- package/esm2022/chat/lib/services/chat.service.mjs +0 -10
- package/esm2022/chat/lib/services/recording.service.mjs +0 -78
- package/fesm2022/acorex-components-chat.mjs.map +0 -1
- /package/{chat → conversation}/README.md +0 -0
- /package/{chat → conversation}/lib/classes/events.interface.d.ts +0 -0
- /package/{chat/lib/chat-input/chat-input.interface.d.ts → conversation/lib/conversation-input/conversation-input.interface.d.ts} +0 -0
- /package/{chat → conversation}/lib/services/recording.service.d.ts +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"acorex-components-conversation.mjs","sources":["../../../../libs/components/conversation/src/lib/services/recording.service.ts","../../../../libs/components/conversation/src/lib/conversation-input/conversation-input.component.ts","../../../../libs/components/conversation/src/lib/conversation-input/conversation-input.component.html","../../../../libs/components/conversation/src/lib/services/conversation-message-type-registry.service.ts","../../../../libs/components/conversation/src/lib/conversation-message/conversation-message.component.ts","../../../../libs/components/conversation/src/lib/conversation-message/conversation-message.component.html","../../../../libs/components/conversation/src/lib/conversation-view/conversation-view.component.ts","../../../../libs/components/conversation/src/lib/conversation-view/conversation-view.component.html","../../../../libs/components/conversation/src/lib/conversation.types.ts","../../../../libs/components/conversation/src/lib/conversation-messages/conversation-message-text.component.ts","../../../../libs/components/conversation/src/lib/conversation-messages/conversation-messages-voice/conversation-message-voice.component.ts","../../../../libs/components/conversation/src/lib/conversation-messages/conversation-messages-voice/conversation-message-voice.component.html","../../../../libs/components/conversation/src/lib/conversation.module.ts","../../../../libs/components/conversation/src/lib/services/conversation.service.ts","../../../../libs/components/conversation/src/acorex-components-conversation.ts"],"sourcesContent":["import { Injectable, WritableSignal, signal } from '@angular/core';\n\n@Injectable()\nexport class AXRecordingService {\n audioBlobs: any[] = [];\n mediaRecorder: MediaRecorder | null;\n streamBeingCaptured: any = null;\n\n timer: WritableSignal<string> = signal('00:0');\n\n protected time = {\n seconds: 0,\n minutes: 0,\n hours: 0,\n };\n\n protected timerInterval;\n\n startRecording() {\n if (!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia)) {\n return Promise.reject(\n new Error(\n 'mediaDevices API or getUserMedia method is not supported in this browser.'\n )\n );\n } else {\n return navigator.mediaDevices\n .getUserMedia({ audio: true })\n .then((stream) => {\n this.streamBeingCaptured = stream;\n this.mediaRecorder = new MediaRecorder(stream);\n this.audioBlobs = [];\n this.mediaRecorder.addEventListener('dataavailable', (event) => {\n this.audioBlobs.push(event.data);\n });\n this.mediaRecorder.start();\n this.timerInterval = setInterval(() => {\n this.calculateTime();\n }, 1000);\n });\n }\n }\n\n stopRecording() {\n return new Promise((resolve) => {\n const mimeType = this.mediaRecorder?.mimeType;\n this.mediaRecorder?.addEventListener('stop', () => {\n const audioBlob = new Blob(this.audioBlobs, { type: mimeType });\n resolve(audioBlob);\n });\n this.mediaRecorder?.stop();\n this.streamBeingCaptured.getTracks().forEach((track) => track.stop());\n this.mediaRecorder = null;\n this.streamBeingCaptured = null;\n this.resetTimer();\n });\n }\n\n calculateTime() {\n this.time.seconds++;\n if (this.time.seconds >= 60) {\n this.time.seconds = 0;\n this.time.minutes++;\n if (this.time.minutes >= 60) {\n this.time.minutes = 0;\n this.time.hours++;\n }\n }\n\n const formattedTime =\n (this.time.hours > 0 ? this.time.hours + ':' : '') +\n (this.time.minutes < 10 ? '0' + this.time.minutes : this.time.minutes) +\n ':' +\n (this.time.seconds < 10 ? '0' + this.time.seconds : this.time.seconds);\n\n this.timer.set(formattedTime);\n }\n\n resetTimer() {\n clearInterval(this.timerInterval);\n this.time.seconds = 0;\n this.time.minutes = 0;\n this.time.hours = 0;\n this.timer.set('00:0');\n }\n}\n","import {\n AXClickEvent,\n AXComponent,\n AXFocusableComponent,\n AXValuableComponent,\n MXInputBaseValueComponent,\n MXLookComponent,\n} from '@acorex/components/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n ViewChild,\n ViewEncapsulation,\n WritableSignal,\n forwardRef,\n inject,\n signal,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { classes } from 'polytype';\nimport { AXInputFileChange } from '../classes/events.interface';\nimport { AXRecordingService } from '../services/recording.service';\n\n@Component({\n selector: 'ax-conversation-input',\n templateUrl: './conversation-input.component.html',\n styleUrls: ['./conversation-input.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: AXComponent, useExisting: AXConversationInputComponent },\n { provide: AXFocusableComponent, useExisting: AXConversationInputComponent },\n { provide: AXValuableComponent, useExisting: AXConversationInputComponent },\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AXConversationInputComponent),\n multi: true,\n },\n ],\n})\nexport class AXConversationInputComponent extends classes(MXInputBaseValueComponent<string>, MXLookComponent) {\n @ViewChild('inputFile') inputFile: ElementRef<HTMLInputElement>;\n @Input()\n maxLength: number;\n\n @Input() hasAttachment = true;\n\n @Input() haVoice = true;\n\n @Input() acceptFileType = '*';\n\n @Output()\n onSendClick: EventEmitter<AXClickEvent> = new EventEmitter<AXClickEvent>();\n\n @Output()\n onStartRecording: EventEmitter<AXClickEvent> = new EventEmitter<AXClickEvent>();\n\n @Output()\n onStopRecording: EventEmitter<AXClickEvent> = new EventEmitter<AXClickEvent>();\n\n @Output()\n onFileChange: EventEmitter<AXInputFileChange> = new EventEmitter<AXInputFileChange>();\n\n recording: WritableSignal<boolean> = signal(false);\n\n recordingService: AXRecordingService = inject(AXRecordingService);\n\n protected _updateOn: 'change' | 'blur' | 'submit' = 'change';\n\n protected _handleModelChange(value: string) {\n this.commitValue(value, true);\n }\n protected recordedAudio: unknown | null = null;\n\n handleRecordClick() {\n this.recordedAudio = null;\n this.recording.set(true);\n this.recordingService\n ?.startRecording()\n .then(() => {\n this.onStartRecording.emit({\n component: this,\n data: { recording: true },\n isUserInteraction: true,\n });\n })\n .catch((e) => {\n console.error(e);\n });\n }\n\n handleStopClick() {\n this.recordingService.stopRecording().then((c) => {\n this.recording.set(false);\n this.recordedAudio = c;\n this.onStopRecording.emit({\n component: this,\n data: { value: this.recordedAudio },\n });\n });\n }\n handleAttachClick() {\n this.inputFile.nativeElement.click();\n }\n\n handleChangeFile(event: Event) {\n this.onFileChange.emit({\n component: this,\n data: { value: (event.target as HTMLInputElement).files },\n });\n }\n\n handleSendClick() {\n this.onSendClick.emit({\n component: this,\n data: { value: this.value },\n isUserInteraction: true,\n });\n }\n\n handleSendVoiceClick() {\n this.handleStopClick();\n this.onSendClick.emit({\n component: this,\n data: { value: this.value },\n isUserInteraction: true,\n });\n }\n}\n","<div class=\"ax-chat-input\" [class.ax-state-recording]=\"recording()\">\n @if (recording()) {\n <div class=\"ax-chat-input-start-side\">\n <span class=\"ax-record-dot\"></span>\n <span>{{ recordingService.timer() }}</span>\n </div>\n <div class=\"ax-chat-input-main-side\">\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"primary\" [text]=\"'cancel' | translate | async\"\n (onClick)=\"handleStopClick()\"></ax-button>\n </div>\n <div class=\"ax-chat-input-end-side\">\n <ax-button look=\"solid\" color=\"danger\" class=\"ax-blob ax-sm\" (onClick)=\"handleSendVoiceClick()\">\n <ax-icon>\n <i class=\"ax-icon ax-icon-send\"></i>\n </ax-icon>\n </ax-button>\n </div>\n } @else {\n <div class=\"ax-chat-input-start-side\">\n <ax-button look=\"blank\" class=\"ax-sm\">\n <ax-icon>\n <i class=\"ax-icon ax-icon-emoji\"></i>\n </ax-icon>\n <ax-dropdown-panel>\n <ng-container>\n <div class=\"ax-emoji-container\">\n <div>⚠️</div>\n <div>➡️</div>\n <div>🔃</div>\n <div>🔷</div>\n <div>🤚</div>\n <div>😂</div>\n <div>😊</div>\n </div>\n </ng-container>\n </ax-dropdown-panel>\n </ax-button>\n </div>\n <textarea class=\"ax-chat-input-main-side\"\n oninput='this.style.height = \"\";this.style.height = this.scrollHeight + \"px\"' type=\"text\" rows=\"1\" [id]=\"id\"\n [name]=\"name\" [attr.placeholder]=\"placeholder\" [attr.maxlength]=\"maxLength\" [disabled]=\"disabled\"\n [readonly]=\"readonly\" [tabindex]=\"tabIndex\" [ngModel]=\"value\" (ngModelChange)=\"_handleModelChange($event)\"\n [ngModelOptions]=\"{ updateOn: _updateOn }\" (keydown)=\"emitOnKeydownEvent($event)\" (keyup)=\"emitOnKeyupEvent($event)\"\n (keypress)=\"emitOnKeypressEvent($event)\" (focus)=\"emitOnFocusEvent($event)\"\n (blur)=\"emitOnBlurEvent($event)\"></textarea>\n <div class=\"ax-chat-input-end-side\">\n @if (!value) {\n <ax-button look=\"blank\" class=\"ax-sm\" (onClick)=\"handleAttachClick()\">\n <ax-icon>\n <i class=\"ax-icon ax-icon-attach\"></i>\n </ax-icon>\n </ax-button>\n <ax-button look=\"blank\" class=\"ax-sm\" (onClick)=\"handleRecordClick()\">\n <ax-icon>\n <i class=\"ax-icon ax-icon-mic\"></i>\n </ax-icon>\n </ax-button>\n <input #inputFile [accept]=\"acceptFileType\" type=\"file\" class=\"ax-attach-input\" (change)=\"handleChangeFile($event)\">\n }\n\n @if (value) {\n <ax-button look=\"solid\" color=\"primary\" class=\"ax-sm\" (onClick)=\"handleSendClick()\">\n <ax-icon>\n <i class=\"ax-icon ax-icon-send\"></i>\n </ax-icon>\n </ax-button>\n }\n </div>\n }\n</div>","import { Injectable } from '@angular/core';\nimport { AXConversationMessageType } from '../conversation.types';\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationMessageTypeRegistryService {\n private plugins: Map<string, AXConversationMessageType> = new Map<string, AXConversationMessageType>();\n\n register(...plugins: AXConversationMessageType[]) {\n plugins.forEach((p) => this.plugins.set(p.name, p));\n }\n\n public resolve(name: string): AXConversationMessageType | undefined {\n return this.plugins.get(name);\n }\n}\n","import { MXBaseComponent } from '@acorex/components/common';\nimport { isBrowser } from '@acorex/core/platform';\nimport { CdkPortalOutletAttachedRef, ComponentPortal } from '@angular/cdk/portal';\nimport { Component, ComponentRef, HostBinding, ViewEncapsulation, inject, input } from '@angular/core';\nimport { AXConversationMessage } from '../conversation.types';\nimport { AXConversationMessageTypeRegistryService } from '../services/conversation-message-type-registry.service';\n\n@Component({\n selector: 'ax-conversation-message',\n templateUrl: './conversation-message.component.html',\n styleUrls: ['./conversation-message.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationMessageComponent extends MXBaseComponent {\n chatMessage = input<AXConversationMessage<any>>();\n\n protected _portal: ComponentPortal<any> | null;\n\n protected get isOwn(): boolean {\n return !this.chatMessage().fromId;\n }\n\n protected registryService = inject(AXConversationMessageTypeRegistryService);\n\n @HostBinding('class')\n get __hostClass(): string {\n return `${this.isOwn ? 'ax-state-own' : ''} ${!this.isOwn ? 'ax-state-other' : ''}`;\n }\n\n protected override ngOnInit(): void {\n this._portal = new ComponentPortal(this.registryService.resolve(this.chatMessage().type).component);\n }\n\n protected _handleAttched(ref: CdkPortalOutletAttachedRef) {\n ref = ref as ComponentRef<unknown>;\n if (ref.instance && isBrowser()) {\n Object.assign(ref.instance, { message: this.chatMessage() });\n this.cdr.markForCheck();\n const prefix = this.getHostElement().querySelector('ax-prefix') as HTMLDivElement;\n const suffix = this.getHostElement().querySelector('ax-suffix') as HTMLDivElement;\n const prefixContainer = this.getHostElement().querySelector('.ax-message-prefix');\n const suffixContainer = this.getHostElement().querySelector('.ax-message-suffix');\n if (prefix && prefixContainer) {\n prefix.style.display = 'flex';\n prefixContainer.append(prefix);\n }\n if (suffix && suffixContainer) {\n suffix.style.display = 'flex';\n suffixContainer.append(suffix);\n }\n }\n }\n}\n","@if(chatMessage().fromId){\n<ax-avatar [size]=\"36\"></ax-avatar>\n}\n<div class=\"ax-message-content\" [class.ax-state-own]=\"!chatMessage().fromId\"\n [class.ax-state-other]=\"chatMessage().fromId\">\n <ng-template [cdkPortalOutlet]=\"_portal\" (attached)=\"_handleAttched($event)\"></ng-template>\n\n <div class=\"ax-chat-message-status\">\n <div class=\"ax-message-prefix\">\n </div>\n <div>\n <div class=\"ax-message-suffix\"></div>\n <span>{{ chatMessage().sendTime | format:'datetime':'HH:mm' | async }}</span>\n <span>\n @if(isOwn)\n {\n @if(chatMessage().deliverTime){\n <i class=\"ax-icon ax-icon-check ax-message-status\"></i>\n }\n @if(chatMessage().readTime){\n <i class=\"ax-icon ax-icon-dobble-check ax-message-status\"></i>\n }\n }\n </span>\n </div>\n </div>\n</div>\n\n@if(!chatMessage().fromId){\n<ax-avatar [size]=\"36\"></ax-avatar>\n}","import { MXBaseComponent } from '@acorex/components/common';\nimport { ChangeDetectionStrategy, Component, Input, ViewEncapsulation, WritableSignal, signal } from '@angular/core';\nimport { AXConversationMessage } from '../conversation.types';\n\n@Component({\n selector: 'ax-conversation-view',\n templateUrl: './conversation-view.component.html',\n styleUrls: ['./conversation-view.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationViewComponent extends MXBaseComponent {\n @Input()\n public set conversations(items: AXConversationMessage<any>[]) {\n this._conversations.set(items);\n }\n\n protected _conversations: WritableSignal<AXConversationMessage<any>[]> = signal([]);\n}\n","@for (item of _conversations(); track $index) {\n<ax-conversation-message [chatMessage]=\"item\"></ax-conversation-message>\n}","import { Injectable, Type } from '@angular/core';\n\nexport interface AXConversationMessageType {\n name: string;\n component: Type<any>;\n}\n\nexport interface AXConversationMessage<T> {\n id: string;\n type: string;\n sendTime: Date;\n deliverTime?: Date;\n readTime?: Date;\n replyTo?: string;\n content: T;\n fromId?: string;\n}\n\n@Injectable()\nexport class AXConversationMessageBaseComponent<T> {\n message: AXConversationMessage<T>;\n}\n","import { Component, OnInit, ViewEncapsulation, signal } from '@angular/core';\nimport { AXConversationMessageBaseComponent } from '../conversation.types';\n\n@Component({\n template: `<div [innerHtml]=\"_text()\"></div>`,\n encapsulation: ViewEncapsulation.None,\n inputs: ['message'],\n})\nexport class AXConversationTextMessageComponent extends AXConversationMessageBaseComponent<string> implements OnInit {\n protected _text = signal('');\n\n ngOnInit(): void {\n this._text.set(this.message?.content);\n }\n}\n","import { AXAudioWaveChangeEvent, AXAudioWaveComponent, AXWaveConfig } from '@acorex/components/audio-wave';\nimport { Component, HostBinding, ViewChild, ViewEncapsulation, WritableSignal, afterNextRender, signal } from '@angular/core';\nimport { AXConversationMessageBaseComponent } from '../../conversation.types';\n\n@Component({\n selector: 'ax-conversation-message-audio',\n templateUrl: './conversation-message-voice.component.html',\n styleUrl: `./conversation-message-voice.component.scss`,\n encapsulation: ViewEncapsulation.None,\n inputs: ['message'],\n})\nexport class AXConversationAudioMessageComponent extends AXConversationMessageBaseComponent<string> {\n @ViewChild('a') audio: AXAudioWaveComponent;\n\n config: AXWaveConfig = { url: '' };\n\n audioState: WritableSignal<'playing' | 'paused' | 'loading' | 'ready' | 'error'> = signal('paused');\n selectedRate = signal(1);\n selectedRateIndex = signal(1);\n\n protected audioProgress = signal(0);\n protected timeLeft = signal(0);\n protected currentTime = signal(0);\n protected duration = signal(0);\n\n constructor() {\n super();\n afterNextRender(() => {\n this.config.url = this.message?.content;\n this.config.audioRate = 0.25;\n this.setWaveColor();\n\n this.handleLoadingProgress();\n });\n }\n\n setWaveColor() {\n let waveColor = '';\n let progressColor = '';\n if (this.message.fromId) {\n waveColor = getComputedStyle(document.body).getPropertyValue('--ax-message-other-bar-color');\n progressColor = getComputedStyle(document.body).getPropertyValue('--ax-message-other-progress-color');\n } else {\n waveColor = getComputedStyle(document.body).getPropertyValue('--ax-message-own-bar-color');\n progressColor = getComputedStyle(document.body).getPropertyValue('--ax-message-own-progress-color');\n }\n this.config.waveColor = waveColor;\n this.config.progressColor = progressColor;\n }\n\n handlePauseClick() {\n this.audio?.pause();\n this.audioState.set('paused');\n }\n\n handlePlayClick() {\n this.audio?.play()?.then(() => {\n this.audioState.set('playing');\n });\n }\n\n handleOnStatusChanged(e: AXAudioWaveChangeEvent) {\n if (e.status === 'load' || e.status === 'loading') {\n this.audioState.set('loading');\n }\n if (e.status === 'loading') {\n this.audioProgress.set(e.data.percent);\n this.duration.set(Math.ceil(e.data.duration * 1000));\n }\n if (e.status === 'ready') {\n this.audioState.set('ready');\n this.duration.set(Math.ceil(e.data.duration * 1000));\n }\n if (e.status === 'finish') {\n this.audioState.set('paused');\n }\n if (e.status === 'timeupdate') {\n this.timeLeft.set(this.duration() - e.data.currentTime * 1000);\n this.currentTime.set(e.data.currentTime * 1000);\n }\n if (e.status === 'error') {\n this.audioState.set('error');\n }\n }\n\n handleLoadingProgress() {\n // this.audioLoaderProgress?.nativeElement.style.cssText = `--ax-audio-progress: ${this.audioProgress()}`;\n }\n\n handleCancelLoading() {\n //\n }\n\n handleReloadClick() {\n //\n this.audioState.set('loading');\n this.audio.load();\n }\n\n handleRateClick() {\n const rates = [0.5, 1, 2, 4];\n if (this.selectedRateIndex() == rates.length - 1) {\n this.selectedRateIndex.set(0);\n } else {\n this.selectedRateIndex.set(this.selectedRateIndex() + 1);\n }\n this.selectedRate.set(rates[this.selectedRateIndex()]);\n this.audio.setRate(this.selectedRate());\n }\n\n @HostBinding('class')\n get __hostClass(): string {\n return `${this.message.fromId ? 'ax-state-other' : 'ax-state-own'}`;\n }\n}\n","<ax-prefix>\n @switch (audioState()) {\n @case ('paused')\n {\n {{currentTime() | format:'time-duration' | async}}\n }\n @case ('playing')\n {\n {{currentTime() | format:'time-duration' | async}}\n }\n @default {\n {{duration() | format:'time-duration' | async}}\n }\n }\n <button class=\"ax-audio-speed\" (click)=\"handleRateClick()\"></button>\n\n</ax-prefix>\n<div class=\"ax-audio-controller\">\n\n @switch (audioState()) {\n @case ('playing') {\n <button (click)=\"handlePauseClick()\">\n <i class=\"ax-icon ax-icon-pause\"></i>\n </button>\n }\n\n @case ('ready') {\n <button (click)=\"handlePlayClick()\">\n <i class=\"ax-icon ax-icon-play\" style=\"margin-inline-start: 0.25rem;\"></i>\n </button>\n }\n\n @case ('paused')\n {\n <button (click)=\"handlePlayClick()\">\n <i class=\"ax-icon ax-icon-play\" style=\"margin-inline-start: 0.25rem;\"></i>\n </button>\n }\n\n @case ('error')\n {\n <button class=\"ax-state-error\" (click)=\"handleReloadClick()\">\n <i class=\"ax-icon ax-icon-reload\"></i>\n </button>\n }\n\n @default {\n <button (click)=\"handleCancelLoading()\">\n <ax-loading-spinner [size]=\"24\" [stroke]=\"2\"\n [color]=\"message.fromId?'var(--ax-other-color)':'var(--ax-own-color)'\"></ax-loading-spinner>\n </button>\n }\n }\n\n</div>\n<ax-audio-wave #a [config]=\"config\" (onStatusChanged)=\"handleOnStatusChanged($event)\"></ax-audio-wave>\n<ax-suffix>\n <div class=\"ax-audio-rate-button\" [class.ax-state-own]=\"!message?.fromId\" (click)=\"handleRateClick()\">\n {{selectedRate()}}X</div>\n</ax-suffix>","import { AXAudioWaveModule } from '@acorex/components/audio-wave';\nimport { AXAvatarModule } from '@acorex/components/avatar';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXCircularProgressModule } from '@acorex/components/circular-progress';\nimport { AXRippleDirective } from '@acorex/components/common';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownModule } from '@acorex/components/dropdown';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXDateTimeModule } from '@acorex/core/date-time';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport { AsyncPipe, CommonModule } from '@angular/common';\nimport { Inject, ModuleWithProviders, NgModule, Optional } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversationInputComponent } from './conversation-input/conversation-input.component';\nimport { AXConversationMessageComponent } from './conversation-message/conversation-message.component';\nimport { AXConversationTextMessageComponent } from './conversation-messages/conversation-message-text.component';\nimport { AXConversationAudioMessageComponent } from './conversation-messages/conversation-messages-voice/conversation-message-voice.component';\nimport { AXConversationViewComponent } from './conversation-view/conversation-view.component';\nimport { AXConversationMessageType } from './conversation.types';\nimport { AXConversationMessageTypeRegistryService } from './services/conversation-message-type-registry.service';\nimport { AXRecordingService } from './services/recording.service';\n\nexport interface AXChatModuleConfig {\n types: AXConversationMessageType[];\n}\n\nconst COMPONENT = [\n AXConversationViewComponent,\n AXConversationInputComponent,\n AXConversationMessageComponent,\n AXConversationTextMessageComponent,\n AXConversationAudioMessageComponent,\n];\nconst MODULES = [\n CommonModule,\n FormsModule,\n AsyncPipe,\n AXRippleDirective,\n AXButtonModule,\n AXDecoratorModule,\n AXTranslationModule,\n AXDropdownModule,\n AXFormatModule,\n AXAudioWaveModule,\n AXCircularProgressModule,\n AXDateTimeModule,\n CdkPortalOutlet,\n AXLoadingModule,\n AXAvatarModule,\n];\n\n@NgModule({\n declarations: [...COMPONENT],\n imports: [...MODULES],\n exports: [...COMPONENT],\n providers: [AXRecordingService],\n})\nexport class AXConversationModule {\n static forRoot(config?: AXChatModuleConfig): ModuleWithProviders<AXConversationModule> {\n return {\n ngModule: AXConversationModule,\n providers: [\n {\n provide: 'AXChatModuleFactory',\n useFactory: (registry: AXConversationMessageTypeRegistryService) => () => {\n if (config?.types?.length) {\n registry.register(...config.types);\n }\n registry.register({\n name: 'text',\n component: AXConversationTextMessageComponent,\n });\n registry.register({\n name: 'audio',\n component: AXConversationAudioMessageComponent,\n });\n },\n deps: [AXConversationMessageTypeRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n static forChild(config?: AXChatModuleConfig): ModuleWithProviders<AXConversationModule> {\n return {\n ngModule: AXConversationModule,\n providers: [\n {\n provide: 'AXPWorkflowModuleFactory',\n useFactory: (registry: AXConversationMessageTypeRegistryService) => () => {\n if (config?.types?.length) {\n registry.register(...config.types);\n }\n },\n deps: [AXConversationMessageTypeRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n /**\n * @ignore\n */\n constructor(@Optional() @Inject('AXChatModuleFactory') instances: any[]) {\n instances?.forEach((f) => {\n f();\n });\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class AXConversationService {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3","i4","i1.AXConversationMessageComponent","i5"],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@acorex/components",
|
3
|
-
"version": "17.0.
|
3
|
+
"version": "17.0.16",
|
4
4
|
"peerDependencies": {
|
5
5
|
"@angular/common": "^17.3.2",
|
6
6
|
"@angular/core": "^17.3.2",
|
@@ -85,30 +85,24 @@
|
|
85
85
|
"esm": "./esm2022/calendar/acorex-components-calendar.mjs",
|
86
86
|
"default": "./fesm2022/acorex-components-calendar.mjs"
|
87
87
|
},
|
88
|
-
"./chat": {
|
89
|
-
"types": "./chat/index.d.ts",
|
90
|
-
"esm2022": "./esm2022/chat/acorex-components-chat.mjs",
|
91
|
-
"esm": "./esm2022/chat/acorex-components-chat.mjs",
|
92
|
-
"default": "./fesm2022/acorex-components-chat.mjs"
|
93
|
-
},
|
94
88
|
"./check-box": {
|
95
89
|
"types": "./check-box/index.d.ts",
|
96
90
|
"esm2022": "./esm2022/check-box/acorex-components-check-box.mjs",
|
97
91
|
"esm": "./esm2022/check-box/acorex-components-check-box.mjs",
|
98
92
|
"default": "./fesm2022/acorex-components-check-box.mjs"
|
99
93
|
},
|
100
|
-
"./circular-progress": {
|
101
|
-
"types": "./circular-progress/index.d.ts",
|
102
|
-
"esm2022": "./esm2022/circular-progress/acorex-components-circular-progress.mjs",
|
103
|
-
"esm": "./esm2022/circular-progress/acorex-components-circular-progress.mjs",
|
104
|
-
"default": "./fesm2022/acorex-components-circular-progress.mjs"
|
105
|
-
},
|
106
94
|
"./chips": {
|
107
95
|
"types": "./chips/index.d.ts",
|
108
96
|
"esm2022": "./esm2022/chips/acorex-components-chips.mjs",
|
109
97
|
"esm": "./esm2022/chips/acorex-components-chips.mjs",
|
110
98
|
"default": "./fesm2022/acorex-components-chips.mjs"
|
111
99
|
},
|
100
|
+
"./circular-progress": {
|
101
|
+
"types": "./circular-progress/index.d.ts",
|
102
|
+
"esm2022": "./esm2022/circular-progress/acorex-components-circular-progress.mjs",
|
103
|
+
"esm": "./esm2022/circular-progress/acorex-components-circular-progress.mjs",
|
104
|
+
"default": "./fesm2022/acorex-components-circular-progress.mjs"
|
105
|
+
},
|
112
106
|
"./collapse": {
|
113
107
|
"types": "./collapse/index.d.ts",
|
114
108
|
"esm2022": "./esm2022/collapse/acorex-components-collapse.mjs",
|
@@ -133,6 +127,12 @@
|
|
133
127
|
"esm": "./esm2022/common/acorex-components-common.mjs",
|
134
128
|
"default": "./fesm2022/acorex-components-common.mjs"
|
135
129
|
},
|
130
|
+
"./conversation": {
|
131
|
+
"types": "./conversation/index.d.ts",
|
132
|
+
"esm2022": "./esm2022/conversation/acorex-components-conversation.mjs",
|
133
|
+
"esm": "./esm2022/conversation/acorex-components-conversation.mjs",
|
134
|
+
"default": "./fesm2022/acorex-components-conversation.mjs"
|
135
|
+
},
|
136
136
|
"./data-pager": {
|
137
137
|
"types": "./data-pager/index.d.ts",
|
138
138
|
"esm2022": "./esm2022/data-pager/acorex-components-data-pager.mjs",
|
package/chat/index.d.ts
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
export * from './lib/chat-input/chat-input.component';
|
2
|
-
export * from './lib/chat-input/chat-input.interface';
|
3
|
-
export * from './lib/chat-message/chat-message.component';
|
4
|
-
export * from './lib/chat-view/chat-view.component';
|
5
|
-
export * from './lib/chat.module';
|
6
|
-
export * from './lib/chat.types';
|
7
|
-
export * from './lib/classes/events.interface';
|
8
|
-
export * from './lib/services/chat-message-type-registry.service';
|
9
|
-
export * from './lib/services/chat.service';
|
10
|
-
export * from './lib/services/recording.service';
|
11
|
-
export * from './lib/chat-messages/chat-message-text.component';
|
12
|
-
export * from './lib/chat-messages/chat-messages-voice/chat-message-voice.component';
|
@@ -1,16 +0,0 @@
|
|
1
|
-
import { MXBaseComponent } from '@acorex/components/common';
|
2
|
-
import { CdkPortalOutletAttachedRef, ComponentPortal } from '@angular/cdk/portal';
|
3
|
-
import { AXChatMessage } from '../chat.types';
|
4
|
-
import { AXChatMessageTypeRegistryService } from '../services/chat-message-type-registry.service';
|
5
|
-
import * as i0 from "@angular/core";
|
6
|
-
export declare class AXChatMessageComponent extends MXBaseComponent {
|
7
|
-
chatMessage: import("@angular/core").InputSignal<AXChatMessage<any>>;
|
8
|
-
protected _portal: ComponentPortal<any> | null;
|
9
|
-
protected get isOwn(): boolean;
|
10
|
-
protected registryService: AXChatMessageTypeRegistryService;
|
11
|
-
get __hostClass(): string;
|
12
|
-
protected ngOnInit(): void;
|
13
|
-
protected _handleAttched(ref: CdkPortalOutletAttachedRef): void;
|
14
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AXChatMessageComponent, never>;
|
15
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<AXChatMessageComponent, "ax-chat-message", never, { "chatMessage": { "alias": "chatMessage"; "required": false; "isSignal": true; }; }, {}, never, never, false, never>;
|
16
|
-
}
|
@@ -1,8 +0,0 @@
|
|
1
|
-
import { AXChatMessageBaseComponent } from '../chat.types';
|
2
|
-
import * as i0 from "@angular/core";
|
3
|
-
export declare class AXChatTextMessageComponent extends AXChatMessageBaseComponent<string> {
|
4
|
-
protected _text: import("@angular/core").WritableSignal<string>;
|
5
|
-
ngOnInit(): void;
|
6
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AXChatTextMessageComponent, never>;
|
7
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<AXChatTextMessageComponent, "ng-component", never, { "message": { "alias": "message"; "required": false; }; }, {}, never, never, false, never>;
|
8
|
-
}
|
@@ -1,10 +0,0 @@
|
|
1
|
-
import { MXBaseComponent } from '@acorex/components/common';
|
2
|
-
import { WritableSignal } from '@angular/core';
|
3
|
-
import { AXChatMessage } from '../chat.types';
|
4
|
-
import * as i0 from "@angular/core";
|
5
|
-
export declare class AXChatViewComponent extends MXBaseComponent {
|
6
|
-
set chats(items: AXChatMessage<any>[]);
|
7
|
-
protected _chats: WritableSignal<AXChatMessage<any>[]>;
|
8
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AXChatViewComponent, never>;
|
9
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<AXChatViewComponent, "ax-chat-view", never, { "chats": { "alias": "chats"; "required": false; }; }, {}, never, never, false, never>;
|
10
|
-
}
|
@@ -1,35 +0,0 @@
|
|
1
|
-
import { ModuleWithProviders } from '@angular/core';
|
2
|
-
import { AXChatMessageType } from './chat.types';
|
3
|
-
import * as i0 from "@angular/core";
|
4
|
-
import * as i1 from "./chat-view/chat-view.component";
|
5
|
-
import * as i2 from "./chat-input/chat-input.component";
|
6
|
-
import * as i3 from "./chat-message/chat-message.component";
|
7
|
-
import * as i4 from "./chat-messages/chat-message-text.component";
|
8
|
-
import * as i5 from "./chat-messages/chat-messages-voice/chat-message-voice.component";
|
9
|
-
import * as i6 from "@angular/common";
|
10
|
-
import * as i7 from "@angular/forms";
|
11
|
-
import * as i8 from "@acorex/components/common";
|
12
|
-
import * as i9 from "@acorex/components/button";
|
13
|
-
import * as i10 from "@acorex/components/decorators";
|
14
|
-
import * as i11 from "@acorex/core/translation";
|
15
|
-
import * as i12 from "@acorex/components/dropdown";
|
16
|
-
import * as i13 from "@acorex/core/format";
|
17
|
-
import * as i14 from "@acorex/components/audio-wave";
|
18
|
-
import * as i15 from "@acorex/components/circular-progress";
|
19
|
-
import * as i16 from "@acorex/core/date-time";
|
20
|
-
import * as i17 from "@angular/cdk/portal";
|
21
|
-
import * as i18 from "@acorex/components/loading";
|
22
|
-
export interface AXChatModuleConfig {
|
23
|
-
types: AXChatMessageType[];
|
24
|
-
}
|
25
|
-
export declare class AXChatModule {
|
26
|
-
static forRoot(config?: AXChatModuleConfig): ModuleWithProviders<AXChatModule>;
|
27
|
-
static forChild(config?: AXChatModuleConfig): ModuleWithProviders<AXChatModule>;
|
28
|
-
/**
|
29
|
-
* @ignore
|
30
|
-
*/
|
31
|
-
constructor(instances: any[]);
|
32
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AXChatModule, [{ optional: true; }]>;
|
33
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<AXChatModule, [typeof i1.AXChatViewComponent, typeof i2.AXChatInputComponent, typeof i3.AXChatMessageComponent, typeof i4.AXChatTextMessageComponent, typeof i5.AXChatAudioMessageComponent], [typeof i6.CommonModule, typeof i7.FormsModule, typeof i6.AsyncPipe, typeof i8.AXRippleDirective, typeof i9.AXButtonModule, typeof i10.AXDecoratorModule, typeof i11.AXTranslationModule, typeof i12.AXDropdownModule, typeof i13.AXFormatModule, typeof i14.AXAudioWaveModule, typeof i15.AXCircularProgressModule, typeof i16.AXDateTimeModule, typeof i17.CdkPortalOutlet, typeof i18.AXLoadingModule], [typeof i1.AXChatViewComponent, typeof i2.AXChatInputComponent, typeof i3.AXChatMessageComponent, typeof i4.AXChatTextMessageComponent, typeof i5.AXChatAudioMessageComponent]>;
|
34
|
-
static ɵinj: i0.ɵɵInjectorDeclaration<AXChatModule>;
|
35
|
-
}
|
package/chat/lib/chat.types.d.ts
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
import { Type } from '@angular/core';
|
2
|
-
import * as i0 from "@angular/core";
|
3
|
-
export interface AXChatMessageType {
|
4
|
-
name: string;
|
5
|
-
component: Type<any>;
|
6
|
-
}
|
7
|
-
export interface AXChatMessage<T> {
|
8
|
-
id: string;
|
9
|
-
type: string;
|
10
|
-
sendTime: Date;
|
11
|
-
deliverTime?: Date;
|
12
|
-
readTime?: Date;
|
13
|
-
replyTo?: string;
|
14
|
-
content: T;
|
15
|
-
fromId?: string;
|
16
|
-
}
|
17
|
-
export declare class AXChatMessageBaseComponent<T> {
|
18
|
-
message: AXChatMessage<T>;
|
19
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AXChatMessageBaseComponent<any>, never>;
|
20
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<AXChatMessageBaseComponent<any>>;
|
21
|
-
}
|
@@ -1,9 +0,0 @@
|
|
1
|
-
import { AXChatMessageType } from '../chat.types';
|
2
|
-
import * as i0 from "@angular/core";
|
3
|
-
export declare class AXChatMessageTypeRegistryService {
|
4
|
-
private plugins;
|
5
|
-
register(...plugins: AXChatMessageType[]): void;
|
6
|
-
resolve(name: string): AXChatMessageType | undefined;
|
7
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AXChatMessageTypeRegistryService, never>;
|
8
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<AXChatMessageTypeRegistryService>;
|
9
|
-
}
|
@@ -1,5 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Generated bundle index. Do not edit.
|
3
|
-
*/
|
4
|
-
export * from './index';
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNvbXBvbmVudHMtY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jaGF0L3NyYy9hY29yZXgtY29tcG9uZW50cy1jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
package/esm2022/chat/index.mjs
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
export * from './lib/chat-input/chat-input.component';
|
2
|
-
export * from './lib/chat-input/chat-input.interface';
|
3
|
-
export * from './lib/chat-message/chat-message.component';
|
4
|
-
export * from './lib/chat-view/chat-view.component';
|
5
|
-
export * from './lib/chat.module';
|
6
|
-
export * from './lib/chat.types';
|
7
|
-
export * from './lib/classes/events.interface';
|
8
|
-
export * from './lib/services/chat-message-type-registry.service';
|
9
|
-
export * from './lib/services/chat.service';
|
10
|
-
export * from './lib/services/recording.service';
|
11
|
-
//
|
12
|
-
export * from './lib/chat-messages/chat-message-text.component';
|
13
|
-
export * from './lib/chat-messages/chat-messages-voice/chat-message-voice.component';
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvY2hhdC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLG1EQUFtRCxDQUFDO0FBQ2xFLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxFQUFFO0FBQ0YsY0FBYyxpREFBaUQsQ0FBQztBQUNoRSxjQUFjLHNFQUFzRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvY2hhdC1pbnB1dC9jaGF0LWlucHV0LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jaGF0LWlucHV0L2NoYXQtaW5wdXQuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NoYXQtbWVzc2FnZS9jaGF0LW1lc3NhZ2UuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NoYXQtdmlldy9jaGF0LXZpZXcuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NoYXQubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NoYXQudHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY2xhc3Nlcy9ldmVudHMuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL2NoYXQtbWVzc2FnZS10eXBlLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvY2hhdC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL3JlY29yZGluZy5zZXJ2aWNlJztcbi8vXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jaGF0LW1lc3NhZ2VzL2NoYXQtbWVzc2FnZS10ZXh0LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jaGF0LW1lc3NhZ2VzL2NoYXQtbWVzc2FnZXMtdm9pY2UvY2hhdC1tZXNzYWdlLXZvaWNlLmNvbXBvbmVudCc7XG4iXX0=
|
@@ -1,2 +0,0 @@
|
|
1
|
-
export {};
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1pbnB1dC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvY2hhdC9zcmMvbGliL2NoYXQtaW5wdXQvY2hhdC1pbnB1dC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQVhBdWRpb1JlY29yZGVyIHtcbiAgYXVkaW9CbG9iczogYW55W107XG4gIG1lZGlhUmVjb3JkZXI6IGFueTtcbiAgc3RyZWFtQmVpbmdDYXB0dXJlZDogYW55O1xuICBzdGFydD8oKTogYW55O1xuICBzdG9wPygpOiBhbnk7XG4gIGNhbmNlbD8oKTogYW55O1xuICBzdG9wU3RyZWFtPygpOiBhbnk7XG4gIHJlc2V0UmVjb3JkaW5nUHJvcGVydGllcz8oKTogYW55O1xufVxuIl19
|
@@ -1,54 +0,0 @@
|
|
1
|
-
import { MXBaseComponent } from '@acorex/components/common';
|
2
|
-
import { isBrowser } from '@acorex/core/platform';
|
3
|
-
import { ComponentPortal } from '@angular/cdk/portal';
|
4
|
-
import { Component, HostBinding, ViewEncapsulation, inject, input } from '@angular/core';
|
5
|
-
import { AXChatMessageTypeRegistryService } from '../services/chat-message-type-registry.service';
|
6
|
-
import * as i0 from "@angular/core";
|
7
|
-
import * as i1 from "@angular/cdk/portal";
|
8
|
-
import * as i2 from "@angular/common";
|
9
|
-
import * as i3 from "@acorex/core/format";
|
10
|
-
export class AXChatMessageComponent extends MXBaseComponent {
|
11
|
-
constructor() {
|
12
|
-
super(...arguments);
|
13
|
-
this.chatMessage = input();
|
14
|
-
this.registryService = inject(AXChatMessageTypeRegistryService);
|
15
|
-
}
|
16
|
-
get isOwn() {
|
17
|
-
return !this.chatMessage().fromId;
|
18
|
-
}
|
19
|
-
get __hostClass() {
|
20
|
-
return `${this.isOwn ? 'ax-state-own' : ''} ${!this.isOwn ? 'ax-state-other' : ''}`;
|
21
|
-
}
|
22
|
-
ngOnInit() {
|
23
|
-
this._portal = new ComponentPortal(this.registryService.resolve(this.chatMessage().type).component);
|
24
|
-
}
|
25
|
-
_handleAttched(ref) {
|
26
|
-
ref = ref;
|
27
|
-
if (ref.instance && isBrowser()) {
|
28
|
-
Object.assign(ref.instance, { message: this.chatMessage() });
|
29
|
-
this.cdr.markForCheck();
|
30
|
-
const prefix = this.getHostElement().querySelector('ax-prefix');
|
31
|
-
const suffix = this.getHostElement().querySelector('ax-suffix');
|
32
|
-
const prefixContainer = this.getHostElement().querySelector('.ax-message-prefix');
|
33
|
-
const suffixContainer = this.getHostElement().querySelector('.ax-message-suffix');
|
34
|
-
if (prefix && prefixContainer) {
|
35
|
-
prefix.style.display = 'flex';
|
36
|
-
prefixContainer.append(prefix);
|
37
|
-
}
|
38
|
-
if (suffix && suffixContainer) {
|
39
|
-
suffix.style.display = 'flex';
|
40
|
-
suffixContainer.append(suffix);
|
41
|
-
}
|
42
|
-
}
|
43
|
-
}
|
44
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXChatMessageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
45
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.2", type: AXChatMessageComponent, selector: "ax-chat-message", inputs: { chatMessage: { classPropertyName: "chatMessage", publicName: "chatMessage", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.__hostClass" } }, usesInheritance: true, ngImport: i0, template: "<ng-template [cdkPortalOutlet]=\"_portal\" (attached)=\"_handleAttched($event)\"></ng-template>\n\n<div class=\"ax-chat-message-status\">\n <div class=\"ax-message-prefix\">\n </div>\n <div>\n <div class=\"ax-message-suffix\"></div>\n <span>{{ chatMessage().sendTime | format:'datetime':'HH:mm' | async }}</span>\n <span>\n @if(isOwn)\n {\n @if(chatMessage().deliverTime){\n <i class=\"ax-icon ax-icon-check ax-message-status\"></i>\n }\n @if(chatMessage().readTime){\n <i class=\"ax-icon ax-icon-dobble-check ax-message-status\"></i>\n }\n }\n </span>\n </div>\n</div>", styles: ["ax-chat-message{display:block;padding:.75rem;font-size:.875rem;line-height:1.25rem;border-radius:.75rem;border:1px solid;--ax-other-color: rgba(var(--ax-color-surface));--ax-other-color-fore: rgba(var(--ax-color-surface-fore));--ax-own-color: rgba(var(--ax-color-primary-100));--ax-own-color-fore: rgba(var(--ax-color-primary-fore-tint));--ax-message-status-color: rgba(var(--ax-color-primary-700))}ax-chat-message.ax-state-own{border-end-end-radius:0!important;background-color:var(--ax-own-color);border-color:var(--ax-own-color);color:var(--ax-own-color-fore)}ax-chat-message.ax-state-own .ax-chat-message-status{color:var(--ax-own-color-fore)}ax-chat-message.ax-state-other{border-end-start-radius:0!important;background-color:var(--ax-other-color);border-color:var(--ax-other-color);border-color:rgba(var(--ax-color-border-default))}ax-chat-message.ax-state-other .ax-chat-message-status{color:var(--ax-own-color-fore)}ax-chat-message .ax-chat-message-status{display:flex;justify-content:space-between;align-items:center;font-size:.75rem}ax-chat-message .ax-chat-message-status>div{display:flex;gap:.125rem;align-items:center}ax-chat-message .ax-chat-message-status .ax-message-status{color:var(--ax-message-status-color)}ax-chat-message ax-prefix,ax-chat-message ax-suffix{display:none}.ax-dark ax-chat-message{--ax-reply-bk: rgba(var(--ax-color-primary-800));--ax-reply-color: rgba(var(--ax-color-primary-fore));--ax-reply-border-color: rgba(var(--ax-color-primary-fore));--ax-own-color: rgba(var(--ax-color-primary-700));--ax-own-color-fore: rgba(var(--ax-color-primary-fore));--ax-message-status-color: rgba(var(--ax-color-primary-100))}\n"], dependencies: [{ kind: "directive", type: i1.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXFormatPipe, name: "format" }], encapsulation: i0.ViewEncapsulation.None }); }
|
46
|
-
}
|
47
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXChatMessageComponent, decorators: [{
|
48
|
-
type: Component,
|
49
|
-
args: [{ selector: 'ax-chat-message', encapsulation: ViewEncapsulation.None, template: "<ng-template [cdkPortalOutlet]=\"_portal\" (attached)=\"_handleAttched($event)\"></ng-template>\n\n<div class=\"ax-chat-message-status\">\n <div class=\"ax-message-prefix\">\n </div>\n <div>\n <div class=\"ax-message-suffix\"></div>\n <span>{{ chatMessage().sendTime | format:'datetime':'HH:mm' | async }}</span>\n <span>\n @if(isOwn)\n {\n @if(chatMessage().deliverTime){\n <i class=\"ax-icon ax-icon-check ax-message-status\"></i>\n }\n @if(chatMessage().readTime){\n <i class=\"ax-icon ax-icon-dobble-check ax-message-status\"></i>\n }\n }\n </span>\n </div>\n</div>", styles: ["ax-chat-message{display:block;padding:.75rem;font-size:.875rem;line-height:1.25rem;border-radius:.75rem;border:1px solid;--ax-other-color: rgba(var(--ax-color-surface));--ax-other-color-fore: rgba(var(--ax-color-surface-fore));--ax-own-color: rgba(var(--ax-color-primary-100));--ax-own-color-fore: rgba(var(--ax-color-primary-fore-tint));--ax-message-status-color: rgba(var(--ax-color-primary-700))}ax-chat-message.ax-state-own{border-end-end-radius:0!important;background-color:var(--ax-own-color);border-color:var(--ax-own-color);color:var(--ax-own-color-fore)}ax-chat-message.ax-state-own .ax-chat-message-status{color:var(--ax-own-color-fore)}ax-chat-message.ax-state-other{border-end-start-radius:0!important;background-color:var(--ax-other-color);border-color:var(--ax-other-color);border-color:rgba(var(--ax-color-border-default))}ax-chat-message.ax-state-other .ax-chat-message-status{color:var(--ax-own-color-fore)}ax-chat-message .ax-chat-message-status{display:flex;justify-content:space-between;align-items:center;font-size:.75rem}ax-chat-message .ax-chat-message-status>div{display:flex;gap:.125rem;align-items:center}ax-chat-message .ax-chat-message-status .ax-message-status{color:var(--ax-message-status-color)}ax-chat-message ax-prefix,ax-chat-message ax-suffix{display:none}.ax-dark ax-chat-message{--ax-reply-bk: rgba(var(--ax-color-primary-800));--ax-reply-color: rgba(var(--ax-color-primary-fore));--ax-reply-border-color: rgba(var(--ax-color-primary-fore));--ax-own-color: rgba(var(--ax-color-primary-700));--ax-own-color-fore: rgba(var(--ax-color-primary-fore));--ax-message-status-color: rgba(var(--ax-color-primary-100))}\n"] }]
|
50
|
-
}], propDecorators: { __hostClass: [{
|
51
|
-
type: HostBinding,
|
52
|
-
args: ['class']
|
53
|
-
}] } });
|
54
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jaGF0L3NyYy9saWIvY2hhdC1tZXNzYWdlL2NoYXQtbWVzc2FnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvY2hhdC9zcmMvbGliL2NoYXQtbWVzc2FnZS9jaGF0LW1lc3NhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQThCLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQWdCLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZHLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7OztBQVFsRyxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsZUFBZTtJQU4zRDs7UUFPRSxnQkFBVyxHQUFHLEtBQUssRUFBc0IsQ0FBQztRQVFoQyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0tBOEJ0RTtJQWxDQyxJQUFjLEtBQUs7UUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDcEMsQ0FBQztJQUlELElBQ0ksV0FBVztRQUNiLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUN0RixDQUFDO0lBRWtCLFFBQVE7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVTLGNBQWMsQ0FBQyxHQUErQjtRQUN0RCxHQUFHLEdBQUcsR0FBNEIsQ0FBQztRQUNuQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFtQixDQUFDO1lBQ2xGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFtQixDQUFDO1lBQ2xGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNsRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDbEYsSUFBSSxNQUFNLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztnQkFDOUIsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsSUFBSSxNQUFNLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztnQkFDOUIsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7OEdBdENVLHNCQUFzQjtrR0FBdEIsc0JBQXNCLDJSQ2JuQyxzc0JBb0JNOzsyRkRQTyxzQkFBc0I7a0JBTmxDLFNBQVM7K0JBQ0UsaUJBQWlCLGlCQUdaLGlCQUFpQixDQUFDLElBQUk7OEJBY2pDLFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTVhCYXNlQ29tcG9uZW50IH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2NvbW1vbic7XG5pbXBvcnQgeyBpc0Jyb3dzZXIgfSBmcm9tICdAYWNvcmV4L2NvcmUvcGxhdGZvcm0nO1xuaW1wb3J0IHsgQ2RrUG9ydGFsT3V0bGV0QXR0YWNoZWRSZWYsIENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRSZWYsIEhvc3RCaW5kaW5nLCBWaWV3RW5jYXBzdWxhdGlvbiwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhDaGF0TWVzc2FnZSB9IGZyb20gJy4uL2NoYXQudHlwZXMnO1xuaW1wb3J0IHsgQVhDaGF0TWVzc2FnZVR5cGVSZWdpc3RyeVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jaGF0LW1lc3NhZ2UtdHlwZS1yZWdpc3RyeS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtY2hhdC1tZXNzYWdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtbWVzc2FnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NoYXQtbWVzc2FnZS5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBBWENoYXRNZXNzYWdlQ29tcG9uZW50IGV4dGVuZHMgTVhCYXNlQ29tcG9uZW50IHtcbiAgY2hhdE1lc3NhZ2UgPSBpbnB1dDxBWENoYXRNZXNzYWdlPGFueT4+KCk7XG5cbiAgcHJvdGVjdGVkIF9wb3J0YWw6IENvbXBvbmVudFBvcnRhbDxhbnk+IHwgbnVsbDtcblxuICBwcm90ZWN0ZWQgZ2V0IGlzT3duKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5jaGF0TWVzc2FnZSgpLmZyb21JZDtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RyeVNlcnZpY2UgPSBpbmplY3QoQVhDaGF0TWVzc2FnZVR5cGVSZWdpc3RyeVNlcnZpY2UpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgX19ob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5pc093biA/ICdheC1zdGF0ZS1vd24nIDogJyd9ICR7IXRoaXMuaXNPd24gPyAnYXgtc3RhdGUtb3RoZXInIDogJyd9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKHRoaXMucmVnaXN0cnlTZXJ2aWNlLnJlc29sdmUodGhpcy5jaGF0TWVzc2FnZSgpLnR5cGUpLmNvbXBvbmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2hhbmRsZUF0dGNoZWQocmVmOiBDZGtQb3J0YWxPdXRsZXRBdHRhY2hlZFJlZikge1xuICAgIHJlZiA9IHJlZiBhcyBDb21wb25lbnRSZWY8dW5rbm93bj47XG4gICAgaWYgKHJlZi5pbnN0YW5jZSAmJiBpc0Jyb3dzZXIoKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZWYuaW5zdGFuY2UsIHsgbWVzc2FnZTogdGhpcy5jaGF0TWVzc2FnZSgpIH0pO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmdldEhvc3RFbGVtZW50KCkucXVlcnlTZWxlY3RvcignYXgtcHJlZml4JykgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICBjb25zdCBzdWZmaXggPSB0aGlzLmdldEhvc3RFbGVtZW50KCkucXVlcnlTZWxlY3RvcignYXgtc3VmZml4JykgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICBjb25zdCBwcmVmaXhDb250YWluZXIgPSB0aGlzLmdldEhvc3RFbGVtZW50KCkucXVlcnlTZWxlY3RvcignLmF4LW1lc3NhZ2UtcHJlZml4Jyk7XG4gICAgICBjb25zdCBzdWZmaXhDb250YWluZXIgPSB0aGlzLmdldEhvc3RFbGVtZW50KCkucXVlcnlTZWxlY3RvcignLmF4LW1lc3NhZ2Utc3VmZml4Jyk7XG4gICAgICBpZiAocHJlZml4ICYmIHByZWZpeENvbnRhaW5lcikge1xuICAgICAgICBwcmVmaXguc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgcHJlZml4Q29udGFpbmVyLmFwcGVuZChwcmVmaXgpO1xuICAgICAgfVxuICAgICAgaWYgKHN1ZmZpeCAmJiBzdWZmaXhDb250YWluZXIpIHtcbiAgICAgICAgc3VmZml4LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIHN1ZmZpeENvbnRhaW5lci5hcHBlbmQoc3VmZml4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSBbY2RrUG9ydGFsT3V0bGV0XT1cIl9wb3J0YWxcIiAoYXR0YWNoZWQpPVwiX2hhbmRsZUF0dGNoZWQoJGV2ZW50KVwiPjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgY2xhc3M9XCJheC1jaGF0LW1lc3NhZ2Utc3RhdHVzXCI+XG4gICAgPGRpdiBjbGFzcz1cImF4LW1lc3NhZ2UtcHJlZml4XCI+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImF4LW1lc3NhZ2Utc3VmZml4XCI+PC9kaXY+XG4gICAgICAgIDxzcGFuPnt7IGNoYXRNZXNzYWdlKCkuc2VuZFRpbWUgfCBmb3JtYXQ6J2RhdGV0aW1lJzonSEg6bW0nIHwgYXN5bmMgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgQGlmKGlzT3duKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgQGlmKGNoYXRNZXNzYWdlKCkuZGVsaXZlclRpbWUpe1xuICAgICAgICAgICAgPGkgY2xhc3M9XCJheC1pY29uIGF4LWljb24tY2hlY2sgYXgtbWVzc2FnZS1zdGF0dXNcIj48L2k+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYoY2hhdE1lc3NhZ2UoKS5yZWFkVGltZSl7XG4gICAgICAgICAgICA8aSBjbGFzcz1cImF4LWljb24gYXgtaWNvbi1kb2JibGUtY2hlY2sgYXgtbWVzc2FnZS1zdGF0dXNcIj48L2k+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
@@ -1,23 +0,0 @@
|
|
1
|
-
import { Component, ViewEncapsulation, signal } from '@angular/core';
|
2
|
-
import { AXChatMessageBaseComponent } from '../chat.types';
|
3
|
-
import * as i0 from "@angular/core";
|
4
|
-
export class AXChatTextMessageComponent extends AXChatMessageBaseComponent {
|
5
|
-
constructor() {
|
6
|
-
super(...arguments);
|
7
|
-
this._text = signal('');
|
8
|
-
}
|
9
|
-
ngOnInit() {
|
10
|
-
this._text.set(this.message?.content);
|
11
|
-
}
|
12
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXChatTextMessageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
13
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.2", type: AXChatTextMessageComponent, selector: "ng-component", inputs: { message: "message" }, usesInheritance: true, ngImport: i0, template: `<div [innerHtml]="_text()"></div>`, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
|
14
|
-
}
|
15
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXChatTextMessageComponent, decorators: [{
|
16
|
-
type: Component,
|
17
|
-
args: [{
|
18
|
-
template: `<div [innerHtml]="_text()"></div>`,
|
19
|
-
encapsulation: ViewEncapsulation.None,
|
20
|
-
inputs: ['message'],
|
21
|
-
}]
|
22
|
-
}] });
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLXRleHQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2NoYXQvc3JjL2xpYi9jaGF0LW1lc3NhZ2VzL2NoYXQtbWVzc2FnZS10ZXh0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTzNELE1BQU0sT0FBTywwQkFBMkIsU0FBUSwwQkFBa0M7SUFMbEY7O1FBTVksVUFBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUs5QjtJQUhDLFFBQVE7UUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7OEdBTFUsMEJBQTBCO2tHQUExQiwwQkFBMEIsMkdBSjNCLG1DQUFtQzs7MkZBSWxDLDBCQUEwQjtrQkFMdEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUNBQW1DO29CQUM3QyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDO2lCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhDaGF0TWVzc2FnZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9jaGF0LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiBgPGRpdiBbaW5uZXJIdG1sXT1cIl90ZXh0KClcIj48L2Rpdj5gLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbnB1dHM6IFsnbWVzc2FnZSddLFxufSlcbmV4cG9ydCBjbGFzcyBBWENoYXRUZXh0TWVzc2FnZUNvbXBvbmVudCBleHRlbmRzIEFYQ2hhdE1lc3NhZ2VCYXNlQ29tcG9uZW50PHN0cmluZz4ge1xuICBwcm90ZWN0ZWQgX3RleHQgPSBzaWduYWwoJycpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3RleHQuc2V0KHRoaXMubWVzc2FnZT8uY29udGVudCk7XG4gIH1cbn1cbiJdfQ==
|
@@ -1,97 +0,0 @@
|
|
1
|
-
import { AXAudioWaveComponent } from '@acorex/components/audio-wave';
|
2
|
-
import { Component, ViewChild, ViewEncapsulation, afterNextRender, signal } from '@angular/core';
|
3
|
-
import { AXChatMessageBaseComponent } from '../../chat.types';
|
4
|
-
import * as i0 from "@angular/core";
|
5
|
-
import * as i1 from "@acorex/components/decorators";
|
6
|
-
import * as i2 from "@acorex/components/audio-wave";
|
7
|
-
import * as i3 from "@acorex/components/loading";
|
8
|
-
import * as i4 from "@angular/common";
|
9
|
-
import * as i5 from "@acorex/core/format";
|
10
|
-
export class AXChatAudioMessageComponent extends AXChatMessageBaseComponent {
|
11
|
-
constructor() {
|
12
|
-
super();
|
13
|
-
this.config = { url: '' };
|
14
|
-
this.audioState = signal('paused');
|
15
|
-
this.selectedRate = signal(1);
|
16
|
-
this.selectedRateIndex = signal(1);
|
17
|
-
this.audioProgress = signal(0);
|
18
|
-
this.timeLeft = signal(0);
|
19
|
-
this.currentTime = signal(0);
|
20
|
-
this.duration = signal(0);
|
21
|
-
afterNextRender(() => {
|
22
|
-
this.config.url = this.message?.content;
|
23
|
-
this.config.audioRate = 0.25;
|
24
|
-
if (this.message.fromId) {
|
25
|
-
const neutral300 = getComputedStyle(document.body).getPropertyValue('--ax-color-neutral-200');
|
26
|
-
const neutral500 = getComputedStyle(document.body).getPropertyValue('--ax-color-neutral-500');
|
27
|
-
this.config.waveColor = `rgba(${neutral300})`;
|
28
|
-
this.config.progressColor = `rgba(${neutral500})`;
|
29
|
-
}
|
30
|
-
this.handleLoadingProgress();
|
31
|
-
});
|
32
|
-
}
|
33
|
-
handlePauseClick() {
|
34
|
-
this.audio?.pause();
|
35
|
-
this.audioState.set('paused');
|
36
|
-
}
|
37
|
-
handlePlayClick() {
|
38
|
-
this.audio?.play()?.then(() => {
|
39
|
-
this.audioState.set('playing');
|
40
|
-
});
|
41
|
-
}
|
42
|
-
handleOnStatusChanged(e) {
|
43
|
-
if (e.status === 'load' || e.status === 'loading') {
|
44
|
-
this.audioState.set('loading');
|
45
|
-
}
|
46
|
-
if (e.status === 'loading') {
|
47
|
-
this.audioProgress.set(e.data.percent);
|
48
|
-
this.duration.set(Math.ceil(e.data.duration * 1000));
|
49
|
-
}
|
50
|
-
if (e.status === 'ready') {
|
51
|
-
this.audioState.set('ready');
|
52
|
-
this.duration.set(Math.ceil(e.data.duration * 1000));
|
53
|
-
}
|
54
|
-
if (e.status === 'finish') {
|
55
|
-
this.audioState.set('paused');
|
56
|
-
}
|
57
|
-
if (e.status === 'timeupdate') {
|
58
|
-
this.timeLeft.set(this.duration() - e.data.currentTime * 1000);
|
59
|
-
this.currentTime.set(e.data.currentTime * 1000);
|
60
|
-
}
|
61
|
-
if (e.status === 'error') {
|
62
|
-
this.audioState.set('error');
|
63
|
-
}
|
64
|
-
}
|
65
|
-
handleLoadingProgress() {
|
66
|
-
// this.audioLoaderProgress?.nativeElement.style.cssText = `--ax-audio-progress: ${this.audioProgress()}`;
|
67
|
-
}
|
68
|
-
handleCancelLoading() {
|
69
|
-
//
|
70
|
-
}
|
71
|
-
handleReloadClick() {
|
72
|
-
//
|
73
|
-
this.audioState.set('loading');
|
74
|
-
this.audio.load();
|
75
|
-
}
|
76
|
-
handleRateClick() {
|
77
|
-
const rates = [0.5, 1, 2, 4];
|
78
|
-
if (this.selectedRateIndex() == rates.length - 1) {
|
79
|
-
this.selectedRateIndex.set(0);
|
80
|
-
}
|
81
|
-
else {
|
82
|
-
this.selectedRateIndex.set(this.selectedRateIndex() + 1);
|
83
|
-
}
|
84
|
-
this.selectedRate.set(rates[this.selectedRateIndex()]);
|
85
|
-
this.audio.setRate(this.selectedRate());
|
86
|
-
}
|
87
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXChatAudioMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
88
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.2", type: AXChatAudioMessageComponent, selector: "ax-chat-message-audio", inputs: { message: "message" }, viewQueries: [{ propertyName: "audio", first: true, predicate: ["a"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ax-prefix>\n @switch (audioState()) {\n @case ('paused')\n {\n {{currentTime() | format:'time-duration' | async}}\n }\n @case ('playing')\n {\n {{currentTime() | format:'time-duration' | async}}\n }\n @default {\n {{duration() | format:'time-duration' | async}}\n }\n }\n <button class=\"ax-audio-speed\" (click)=\"handleRateClick()\"></button>\n\n</ax-prefix>\n<div class=\"ax-audio-controller\">\n\n @switch (audioState()) {\n @case ('playing') {\n <button (click)=\"handlePauseClick()\">\n <i class=\"ax-icon ax-icon-pause\"></i>\n </button>\n }\n\n @case ('ready') {\n <button (click)=\"handlePlayClick()\">\n <i class=\"ax-icon ax-icon-play\" style=\"margin-inline-start: 0.25rem;\"></i>\n </button>\n }\n\n @case ('paused')\n {\n <button (click)=\"handlePlayClick()\">\n <i class=\"ax-icon ax-icon-play\" style=\"margin-inline-start: 0.25rem;\"></i>\n </button>\n }\n\n @case ('error')\n {\n <button class=\"ax-state-error\" (click)=\"handleReloadClick()\">\n <i class=\"ax-icon ax-icon-reload\"></i>\n </button>\n }\n\n @default {\n <!-- <button (click)=\"handleCancelLoading()\" class=\"ax-audio-loader\" [style.--ax-audio-progress]=\"audioProgress()\"\n [style.--ax-animation-duration]=\"audioProgress()*10+'ms'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 40 40\">\n <circle fill=\"none\" stroke-linecap=\"round\" cx=\"20\" cy=\"20\" r=\"15.915494309\" />\n </svg>\n </button> -->\n <button (click)=\"handleCancelLoading()\">\n <ax-loading-spinner [size]=\"24\" [stroke]=\"2\" color=\"white\"></ax-loading-spinner>\n </button>\n }\n }\n\n</div>\n<ax-audio-wave #a [config]=\"config\" (onStatusChanged)=\"handleOnStatusChanged($event)\"></ax-audio-wave>\n<ax-suffix>\n <div class=\"ax-audio-rate-button\" [class.ax-state-isOwn]=\"!message?.fromId\" (click)=\"handleRateClick()\">\n {{selectedRate()}}X</div>\n</ax-suffix>", styles: ["ax-chat-message-audio{display:flex;align-items:center;justify-content:space-between;gap:.25rem}ax-chat-message-audio .ax-audio-controller button{width:2.5rem;height:2.5rem;background-color:rgba(var(--ax-color-primary-500));color:rgba(var(--ax-color-primary-fore));border-radius:999rem;display:flex;align-items:center;justify-content:center}ax-chat-message-audio .ax-audio-controller button ax-loading-spinner{display:flex}ax-chat-message-audio .ax-audio-controller button.ax-state-error{background-color:rgba(var(--ax-color-danger-500));color:rgba(var(--ax-color-danger-fore))}ax-chat-message-audio .ax-audio-controller button>i{width:1.5rem;height:1.5rem;display:flex;align-items:center;justify-content:center;font-size:1.25rem;font-weight:700}ax-chat-message-audio .ax-audio-controller button.ax-audio-loader{--ax-audio-progress: 100}ax-chat-message-audio .ax-audio-controller button.ax-audio-loader svg circle{stroke:#fff;stroke-width:.125rem;stroke-dasharray:var(--ax-audio-progress);stroke-dashoffset:0;animation:loader normal;animation-duration:var(--ax-animation-duration);transform-origin:center;transform:rotate(-90deg)}@keyframes loader{0%{stroke-dashoffset:var(--ax-audio-progress);transform:rotate(-90deg)}to{stroke-dashoffset:0;transform:rotate(450deg)}}ax-chat-message-audio .ax-audio-wave{flex:1}.ax-audio-rate-button{background-color:rgba(var(--ax-color-neutral-200));color:rgba(var(--ax-color-neutral-fore-tint));border-radius:.5rem;padding:0 .5rem;font-weight:700;margin-inline-end:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}.ax-audio-rate-button.ax-state-isOwn{background-color:rgba(var(--ax-color-primary-200));color:rgba(var(--ax-color-primary-fore-tint))}\n"], dependencies: [{ kind: "component", type: i1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title , ax-sub-title, ax-placeholder, ax-overlay" }, { kind: "component", type: i2.AXAudioWaveComponent, selector: "ax-audio-wave", inputs: ["config"], outputs: ["onStatusChanged"] }, { kind: "component", type: i3.AXLoadingSpinnerComponent, selector: "ax-loading-spinner", inputs: ["color", "size", "stroke"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }], encapsulation: i0.ViewEncapsulation.None }); }
|
89
|
-
}
|
90
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXChatAudioMessageComponent, decorators: [{
|
91
|
-
type: Component,
|
92
|
-
args: [{ selector: 'ax-chat-message-audio', encapsulation: ViewEncapsulation.None, inputs: ['message'], template: "<ax-prefix>\n @switch (audioState()) {\n @case ('paused')\n {\n {{currentTime() | format:'time-duration' | async}}\n }\n @case ('playing')\n {\n {{currentTime() | format:'time-duration' | async}}\n }\n @default {\n {{duration() | format:'time-duration' | async}}\n }\n }\n <button class=\"ax-audio-speed\" (click)=\"handleRateClick()\"></button>\n\n</ax-prefix>\n<div class=\"ax-audio-controller\">\n\n @switch (audioState()) {\n @case ('playing') {\n <button (click)=\"handlePauseClick()\">\n <i class=\"ax-icon ax-icon-pause\"></i>\n </button>\n }\n\n @case ('ready') {\n <button (click)=\"handlePlayClick()\">\n <i class=\"ax-icon ax-icon-play\" style=\"margin-inline-start: 0.25rem;\"></i>\n </button>\n }\n\n @case ('paused')\n {\n <button (click)=\"handlePlayClick()\">\n <i class=\"ax-icon ax-icon-play\" style=\"margin-inline-start: 0.25rem;\"></i>\n </button>\n }\n\n @case ('error')\n {\n <button class=\"ax-state-error\" (click)=\"handleReloadClick()\">\n <i class=\"ax-icon ax-icon-reload\"></i>\n </button>\n }\n\n @default {\n <!-- <button (click)=\"handleCancelLoading()\" class=\"ax-audio-loader\" [style.--ax-audio-progress]=\"audioProgress()\"\n [style.--ax-animation-duration]=\"audioProgress()*10+'ms'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 40 40\">\n <circle fill=\"none\" stroke-linecap=\"round\" cx=\"20\" cy=\"20\" r=\"15.915494309\" />\n </svg>\n </button> -->\n <button (click)=\"handleCancelLoading()\">\n <ax-loading-spinner [size]=\"24\" [stroke]=\"2\" color=\"white\"></ax-loading-spinner>\n </button>\n }\n }\n\n</div>\n<ax-audio-wave #a [config]=\"config\" (onStatusChanged)=\"handleOnStatusChanged($event)\"></ax-audio-wave>\n<ax-suffix>\n <div class=\"ax-audio-rate-button\" [class.ax-state-isOwn]=\"!message?.fromId\" (click)=\"handleRateClick()\">\n {{selectedRate()}}X</div>\n</ax-suffix>", styles: ["ax-chat-message-audio{display:flex;align-items:center;justify-content:space-between;gap:.25rem}ax-chat-message-audio .ax-audio-controller button{width:2.5rem;height:2.5rem;background-color:rgba(var(--ax-color-primary-500));color:rgba(var(--ax-color-primary-fore));border-radius:999rem;display:flex;align-items:center;justify-content:center}ax-chat-message-audio .ax-audio-controller button ax-loading-spinner{display:flex}ax-chat-message-audio .ax-audio-controller button.ax-state-error{background-color:rgba(var(--ax-color-danger-500));color:rgba(var(--ax-color-danger-fore))}ax-chat-message-audio .ax-audio-controller button>i{width:1.5rem;height:1.5rem;display:flex;align-items:center;justify-content:center;font-size:1.25rem;font-weight:700}ax-chat-message-audio .ax-audio-controller button.ax-audio-loader{--ax-audio-progress: 100}ax-chat-message-audio .ax-audio-controller button.ax-audio-loader svg circle{stroke:#fff;stroke-width:.125rem;stroke-dasharray:var(--ax-audio-progress);stroke-dashoffset:0;animation:loader normal;animation-duration:var(--ax-animation-duration);transform-origin:center;transform:rotate(-90deg)}@keyframes loader{0%{stroke-dashoffset:var(--ax-audio-progress);transform:rotate(-90deg)}to{stroke-dashoffset:0;transform:rotate(450deg)}}ax-chat-message-audio .ax-audio-wave{flex:1}.ax-audio-rate-button{background-color:rgba(var(--ax-color-neutral-200));color:rgba(var(--ax-color-neutral-fore-tint));border-radius:.5rem;padding:0 .5rem;font-weight:700;margin-inline-end:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}.ax-audio-rate-button.ax-state-isOwn{background-color:rgba(var(--ax-color-primary-200));color:rgba(var(--ax-color-primary-fore-tint))}\n"] }]
|
93
|
-
}], ctorParameters: () => [], propDecorators: { audio: [{
|
94
|
-
type: ViewChild,
|
95
|
-
args: ['a']
|
96
|
-
}] } });
|
97
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLXZvaWNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jaGF0L3NyYy9saWIvY2hhdC1tZXNzYWdlcy9jaGF0LW1lc3NhZ2VzLXZvaWNlL2NoYXQtbWVzc2FnZS12b2ljZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvY2hhdC9zcmMvbGliL2NoYXQtbWVzc2FnZXMvY2hhdC1tZXNzYWdlcy12b2ljZS9jaGF0LW1lc3NhZ2Utdm9pY2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQixvQkFBb0IsRUFBZ0IsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBa0IsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7OztBQVM5RCxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsMEJBQWtDO0lBY2pGO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFaVixXQUFNLEdBQWlCLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBRW5DLGVBQVUsR0FBeUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BHLGlCQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLHNCQUFpQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwQixrQkFBYSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixhQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLGFBQVEs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Q0FBQyxTQUFTLENBQUM7d0RBR0gsS0FBSztzQkFBcEIsU0FBUzt1QkFBQyxHQUFHIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhBdWRpb1dhdmVDaGFuZ2VFdmVudCwgQVhBdWRpb1dhdmVDb21wb25lbnQsIEFYV2F2ZUNvbmZpZyB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9hdWRpby13YXZlJztcbmltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiwgV3JpdGFibGVTaWduYWwsIGFmdGVyTmV4dFJlbmRlciwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWENoYXRNZXNzYWdlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NoYXQudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC1jaGF0LW1lc3NhZ2UtYXVkaW8nLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhdC1tZXNzYWdlLXZvaWNlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6IGAuL2NoYXQtbWVzc2FnZS12b2ljZS5jb21wb25lbnQuc2Nzc2AsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGlucHV0czogWydtZXNzYWdlJ10sXG59KVxuZXhwb3J0IGNsYXNzIEFYQ2hhdEF1ZGlvTWVzc2FnZUNvbXBvbmVudCBleHRlbmRzIEFYQ2hhdE1lc3NhZ2VCYXNlQ29tcG9uZW50PHN0cmluZz4ge1xuICBAVmlld0NoaWxkKCdhJykgYXVkaW86IEFYQXVkaW9XYXZlQ29tcG9uZW50O1xuXG4gIGNvbmZpZzogQVhXYXZlQ29uZmlnID0geyB1cmw6ICcnIH07XG5cbiAgYXVkaW9TdGF0ZTogV3JpdGFibGVTaWduYWw8J3BsYXlpbmcnIHwgJ3BhdXNlZCcgfCAnbG9hZGluZycgfCAncmVhZHknIHwgJ2Vycm9yJz4gPSBzaWduYWwoJ3BhdXNlZCcpO1xuICBzZWxlY3RlZFJhdGUgPSBzaWduYWwoMSk7XG4gIHNlbGVjdGVkUmF0ZUluZGV4ID0gc2lnbmFsKDEpO1xuXG4gIHByb3RlY3RlZCBhdWRpb1Byb2dyZXNzID0gc2lnbmFsKDApO1xuICBwcm90ZWN0ZWQgdGltZUxlZnQgPSBzaWduYWwoMCk7XG4gIHByb3RlY3RlZCBjdXJyZW50VGltZSA9IHNpZ25hbCgwKTtcbiAgcHJvdGVjdGVkIGR1cmF0aW9uID0gc2lnbmFsKDApO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuY29uZmlnLnVybCA9IHRoaXMubWVzc2FnZT8uY29udGVudDtcbiAgICAgIHRoaXMuY29uZmlnLmF1ZGlvUmF0ZSA9IDAuMjU7XG4gICAgICBpZiAodGhpcy5tZXNzYWdlLmZyb21JZCkge1xuICAgICAgICBjb25zdCBuZXV0cmFsMzAwID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWF4LWNvbG9yLW5ldXRyYWwtMjAwJyk7XG4gICAgICAgIGNvbnN0IG5ldXRyYWw1MDAgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoJy0tYXgtY29sb3ItbmV1dHJhbC01MDAnKTtcblxuICAgICAgICB0aGlzLmNvbmZpZy53YXZlQ29sb3IgPSBgcmdiYSgke25ldXRyYWwzMDB9KWA7XG4gICAgICAgIHRoaXMuY29uZmlnLnByb2dyZXNzQ29sb3IgPSBgcmdiYSgke25ldXRyYWw1MDB9KWA7XG4gICAgICB9XG4gICAgICB0aGlzLmhhbmRsZUxvYWRpbmdQcm9ncmVzcygpO1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlUGF1c2VDbGljaygpIHtcbiAgICB0aGlzLmF1ZGlvPy5wYXVzZSgpO1xuICAgIHRoaXMuYXVkaW9TdGF0ZS5zZXQoJ3BhdXNlZCcpO1xuICB9XG5cbiAgaGFuZGxlUGxheUNsaWNrKCkge1xuICAgIHRoaXMuYXVkaW8/LnBsYXkoKT8udGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmF1ZGlvU3RhdGUuc2V0KCdwbGF5aW5nJyk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVPblN0YXR1c0NoYW5nZWQoZTogQVhBdWRpb1dhdmVDaGFuZ2VFdmVudCkge1xuICAgIGlmIChlLnN0YXR1cyA9PT0gJ2xvYWQnIHx8IGUuc3RhdHVzID09PSAnbG9hZGluZycpIHtcbiAgICAgIHRoaXMuYXVkaW9TdGF0ZS5zZXQoJ2xvYWRpbmcnKTtcbiAgICB9XG4gICAgaWYgKGUuc3RhdHVzID09PSAnbG9hZGluZycpIHtcbiAgICAgIHRoaXMuYXVkaW9Qcm9ncmVzcy5zZXQoZS5kYXRhLnBlcmNlbnQpO1xuICAgICAgdGhpcy5kdXJhdGlvbi5zZXQoTWF0aC5jZWlsKGUuZGF0YS5kdXJhdGlvbiAqIDEwMDApKTtcbiAgICB9XG4gICAgaWYgKGUuc3RhdHVzID09PSAncmVhZHknKSB7XG4gICAgICB0aGlzLmF1ZGlvU3RhdGUuc2V0KCdyZWFkeScpO1xuICAgICAgdGhpcy5kdXJhdGlvbi5zZXQoTWF0aC5jZWlsKGUuZGF0YS5kdXJhdGlvbiAqIDEwMDApKTtcbiAgICB9XG4gICAgaWYgKGUuc3RhdHVzID09PSAnZmluaXNoJykge1xuICAgICAgdGhpcy5hdWRpb1N0YXRlLnNldCgncGF1c2VkJyk7XG4gICAgfVxuICAgIGlmIChlLnN0YXR1cyA9PT0gJ3RpbWV1cGRhdGUnKSB7XG4gICAgICB0aGlzLnRpbWVMZWZ0LnNldCh0aGlzLmR1cmF0aW9uKCkgLSBlLmRhdGEuY3VycmVudFRpbWUgKiAxMDAwKTtcbiAgICAgIHRoaXMuY3VycmVudFRpbWUuc2V0KGUuZGF0YS5jdXJyZW50VGltZSAqIDEwMDApO1xuICAgIH1cbiAgICBpZiAoZS5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgIHRoaXMuYXVkaW9TdGF0ZS5zZXQoJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTG9hZGluZ1Byb2dyZXNzKCkge1xuICAgIC8vIHRoaXMuYXVkaW9Mb2FkZXJQcm9ncmVzcz8ubmF0aXZlRWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gYC0tYXgtYXVkaW8tcHJvZ3Jlc3M6ICR7dGhpcy5hdWRpb1Byb2dyZXNzKCl9YDtcbiAgfVxuXG4gIGhhbmRsZUNhbmNlbExvYWRpbmcoKSB7XG4gICAgLy9cbiAgfVxuXG4gIGhhbmRsZVJlbG9hZENsaWNrKCkge1xuICAgIC8vXG4gICAgdGhpcy5hdWRpb1N0YXRlLnNldCgnbG9hZGluZycpO1xuICAgIHRoaXMuYXVkaW8ubG9hZCgpO1xuICB9XG5cbiAgaGFuZGxlUmF0ZUNsaWNrKCkge1xuICAgIGNvbnN0IHJhdGVzID0gWzAuNSwgMSwgMiwgNF07XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRSYXRlSW5kZXgoKSA9PSByYXRlcy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUmF0ZUluZGV4LnNldCgwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFJhdGVJbmRleC5zZXQodGhpcy5zZWxlY3RlZFJhdGVJbmRleCgpICsgMSk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRSYXRlLnNldChyYXRlc1t0aGlzLnNlbGVjdGVkUmF0ZUluZGV4KCldKTtcbiAgICB0aGlzLmF1ZGlvLnNldFJhdGUodGhpcy5zZWxlY3RlZFJhdGUoKSk7XG4gIH1cbn1cbiIsIjxheC1wcmVmaXg+XG4gIEBzd2l0Y2ggKGF1ZGlvU3RhdGUoKSkge1xuICBAY2FzZSAoJ3BhdXNlZCcpXG4gIHtcbiAge3tjdXJyZW50VGltZSgpIHwgZm9ybWF0Oid0aW1lLWR1cmF0aW9uJyB8IGFzeW5jfX1cbiAgfVxuICBAY2FzZSAoJ3BsYXlpbmcnKVxuICB7XG4gIHt7Y3VycmVudFRpbWUoKSB8IGZvcm1hdDondGltZS1kdXJhdGlvbicgfCBhc3luY319XG4gIH1cbiAgQGRlZmF1bHQge1xuICB7e2R1cmF0aW9uKCkgfCBmb3JtYXQ6J3RpbWUtZHVyYXRpb24nIHwgYXN5bmN9fVxuICB9XG4gIH1cbiAgPGJ1dHRvbiBjbGFzcz1cImF4LWF1ZGlvLXNwZWVkXCIgKGNsaWNrKT1cImhhbmRsZVJhdGVDbGljaygpXCI+PC9idXR0b24+XG5cbjwvYXgtcHJlZml4PlxuPGRpdiBjbGFzcz1cImF4LWF1ZGlvLWNvbnRyb2xsZXJcIj5cblxuICBAc3dpdGNoIChhdWRpb1N0YXRlKCkpIHtcbiAgQGNhc2UgKCdwbGF5aW5nJykge1xuICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVQYXVzZUNsaWNrKClcIj5cbiAgICA8aSBjbGFzcz1cImF4LWljb24gYXgtaWNvbi1wYXVzZVwiPjwvaT5cbiAgPC9idXR0b24+XG4gIH1cblxuICBAY2FzZSAoJ3JlYWR5Jykge1xuICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVQbGF5Q2xpY2soKVwiPlxuICAgIDxpIGNsYXNzPVwiYXgtaWNvbiBheC1pY29uLXBsYXlcIiBzdHlsZT1cIm1hcmdpbi1pbmxpbmUtc3RhcnQ6IDAuMjVyZW07XCI+PC9pPlxuICA8L2J1dHRvbj5cbiAgfVxuXG4gIEBjYXNlICgncGF1c2VkJylcbiAge1xuICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVQbGF5Q2xpY2soKVwiPlxuICAgIDxpIGNsYXNzPVwiYXgtaWNvbiBheC1pY29uLXBsYXlcIiBzdHlsZT1cIm1hcmdpbi1pbmxpbmUtc3RhcnQ6IDAuMjVyZW07XCI+PC9pPlxuICA8L2J1dHRvbj5cbiAgfVxuXG4gIEBjYXNlICgnZXJyb3InKVxuICB7XG4gIDxidXR0b24gY2xhc3M9XCJheC1zdGF0ZS1lcnJvclwiIChjbGljayk9XCJoYW5kbGVSZWxvYWRDbGljaygpXCI+XG4gICAgPGkgY2xhc3M9XCJheC1pY29uIGF4LWljb24tcmVsb2FkXCI+PC9pPlxuICA8L2J1dHRvbj5cbiAgfVxuXG4gIEBkZWZhdWx0IHtcbiAgPCEtLSA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVDYW5jZWxMb2FkaW5nKClcIiBjbGFzcz1cImF4LWF1ZGlvLWxvYWRlclwiIFtzdHlsZS4tLWF4LWF1ZGlvLXByb2dyZXNzXT1cImF1ZGlvUHJvZ3Jlc3MoKVwiXG4gICAgW3N0eWxlLi0tYXgtYW5pbWF0aW9uLWR1cmF0aW9uXT1cImF1ZGlvUHJvZ3Jlc3MoKSoxMCsnbXMnXCI+XG4gICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA0MCA0MFwiPlxuICAgICAgPGNpcmNsZSBmaWxsPVwibm9uZVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBjeD1cIjIwXCIgY3k9XCIyMFwiIHI9XCIxNS45MTU0OTQzMDlcIiAvPlxuICAgIDwvc3ZnPlxuICA8L2J1dHRvbj4gLS0+XG4gIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUNhbmNlbExvYWRpbmcoKVwiPlxuICAgIDxheC1sb2FkaW5nLXNwaW5uZXIgW3NpemVdPVwiMjRcIiBbc3Ryb2tlXT1cIjJcIiBjb2xvcj1cIndoaXRlXCI+PC9heC1sb2FkaW5nLXNwaW5uZXI+XG4gIDwvYnV0dG9uPlxuICB9XG4gIH1cblxuPC9kaXY+XG48YXgtYXVkaW8td2F2ZSAjYSBbY29uZmlnXT1cImNvbmZpZ1wiIChvblN0YXR1c0NoYW5nZWQpPVwiaGFuZGxlT25TdGF0dXNDaGFuZ2VkKCRldmVudClcIj48L2F4LWF1ZGlvLXdhdmU+XG48YXgtc3VmZml4PlxuICA8ZGl2IGNsYXNzPVwiYXgtYXVkaW8tcmF0ZS1idXR0b25cIiBbY2xhc3MuYXgtc3RhdGUtaXNPd25dPVwiIW1lc3NhZ2U/LmZyb21JZFwiIChjbGljayk9XCJoYW5kbGVSYXRlQ2xpY2soKVwiPlxuICAgIHt7c2VsZWN0ZWRSYXRlKCl9fVg8L2Rpdj5cbjwvYXgtc3VmZml4PiJdfQ==
|