@progress/kendo-angular-conversational-ui
Version:
Kendo UI for Angular Conversational UI components
180 lines (179 loc) • 7.56 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* Copyright © 2025 Progress Software Corporation. All rights reserved.
* Licensed under commercial license. See LICENSE.md in the project root for more information
*-------------------------------------------------------------------------------------------*/
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { STB_DEFAULT_SETTINGS, SEND_BTN_DEFAULT_SETTINGS, FILESELECT_DEFAULT_SETTINGS, SUGGESTIONS_LAYOUT_DEFAULT_SETTINGS } from './utils';
import * as i0 from "@angular/core";
/**
* @hidden
*/
export class ChatService {
authorId;
messageWidthMode;
messageToolbarActions = [];
messageContextMenuActions = [];
calculatedContextMenuActions = [];
fileActions = [];
toggleMessageState = false;
reply;
messages = [];
chatElement;
messageElementsMap = new Map();
messagesContextMenu;
activeMessage;
activeMessageElement;
selectOnMenuClose = false;
active = false;
messageFilesLayout = 'vertical';
timestampVisibility = 'focus';
showUsername = true;
showAvatar = true;
_enableSpeechToText = STB_DEFAULT_SETTINGS;
_enableFileSelect = FILESELECT_DEFAULT_SETTINGS;
_sendButtonSettings = SEND_BTN_DEFAULT_SETTINGS;
_suggestionsLayout = SUGGESTIONS_LAYOUT_DEFAULT_SETTINGS;
_quickActionsLayout = SUGGESTIONS_LAYOUT_DEFAULT_SETTINGS;
_authorMessageSettings;
_receiverMessageSettings;
_allowMessageCollapse;
subjects = {
toolbarAction: new Subject(),
contextMenuAction: new Subject(),
fileAction: new Subject(),
fileDownload: new Subject(),
replyReferenceClick: new Subject(),
inputValueChange: new Subject(),
contextMenuVisibilityChange: new Subject(),
suggestionsLayoutChange: new Subject(),
quickActionsLayoutChange: new Subject(),
authorMessageSettingsChange: new Subject(),
receiverMessageSettingsChange: new Subject(),
allowMessageCollapseChange: new Subject(),
};
toolbarAction$ = this.subjects.toolbarAction.asObservable();
contextMenuAction$ = this.subjects.contextMenuAction.asObservable();
fileAction$ = this.subjects.fileAction.asObservable();
fileDownload$ = this.subjects.fileDownload.asObservable();
replyReferenceClick$ = this.subjects.replyReferenceClick.asObservable();
inputValueChange$ = this.subjects.inputValueChange.asObservable();
contextMenuVisibilityChange$ = this.subjects.contextMenuVisibilityChange.asObservable();
suggestionsLayoutChange$ = this.subjects.suggestionsLayoutChange.asObservable();
quickActionsLayoutChange$ = this.subjects.quickActionsLayoutChange.asObservable();
authorMessageSettingsChange$ = this.subjects.authorMessageSettingsChange.asObservable();
receiverMessageSettingsChange$ = this.subjects.receiverMessageSettingsChange.asObservable();
allowMessageCollapseChange$ = this.subjects.allowMessageCollapseChange.asObservable();
set authorMessageSettings(settings) {
const previousSettings = this._authorMessageSettings;
if (JSON.stringify(previousSettings) !== JSON.stringify(settings)) {
this.updateComponentSettings('_authorMessageSettings', settings, null);
this.emit('authorMessageSettingsChange', this._authorMessageSettings);
}
}
get authorMessageSettings() {
return this._authorMessageSettings;
}
set receiverMessageSettings(settings) {
const previousSettings = this._receiverMessageSettings;
if (JSON.stringify(previousSettings) !== JSON.stringify(settings)) {
this.updateComponentSettings('_receiverMessageSettings', settings, null);
this.emit('receiverMessageSettingsChange', this._receiverMessageSettings);
}
}
get receiverMessageSettings() {
return this._receiverMessageSettings;
}
set enableSpeechToText(settings) {
this.updateComponentSettings('_enableSpeechToText', settings, STB_DEFAULT_SETTINGS);
}
get enableSpeechToText() {
return this._enableSpeechToText;
}
set enableFileSelect(settings) {
this.updateComponentSettings('_enableFileSelect', settings, FILESELECT_DEFAULT_SETTINGS);
}
get enableFileSelect() {
return this._enableFileSelect;
}
set sendButtonSettings(settings) {
this.updateComponentSettings('_sendButtonSettings', settings, SEND_BTN_DEFAULT_SETTINGS);
}
get sendButtonSettings() {
return this._sendButtonSettings;
}
set suggestionsLayout(layoutMode) {
this._suggestionsLayout = layoutMode;
this.emit('suggestionsLayoutChange', this._suggestionsLayout);
}
get suggestionsLayout() {
return this._suggestionsLayout;
}
set quickActionsLayout(layoutMode) {
this._quickActionsLayout = layoutMode;
this.emit('quickActionsLayoutChange', this._quickActionsLayout);
}
get quickActionsLayout() {
return this._quickActionsLayout;
}
set allowMessageCollapse(value) {
const previousValue = this._allowMessageCollapse;
if (previousValue !== value) {
this._allowMessageCollapse = value;
this.emit('allowMessageCollapseChange', this._allowMessageCollapse);
}
}
get allowMessageCollapse() {
return this._allowMessageCollapse;
}
calculateContextMenuActions(isOwn) {
const settings = isOwn ? this.authorMessageSettings : this.receiverMessageSettings;
if (settings?.messageContextMenuActions) {
this.calculatedContextMenuActions = settings.messageContextMenuActions;
return;
}
this.calculatedContextMenuActions = this.messageContextMenuActions || [];
}
emit(subjectKey, value) {
(this.subjects[subjectKey]).next(value);
}
getMessageById(id) {
return this.messages.find(message => message.id === id);
}
registerMessageElement(messageId, elementRef) {
this.messageElementsMap.set(messageId, elementRef);
}
unregisterMessageElement(messageId) {
this.messageElementsMap.delete(messageId);
if (this.reply?.id === messageId) {
this.reply = null;
}
}
scrollToMessage(messageId) {
const elementRef = this.messageElementsMap.get(messageId);
if (elementRef?.nativeElement) {
elementRef.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
}
focusActiveMessageElement() {
if (this.activeMessageElement) {
this.activeMessageElement.element?.nativeElement?.focus();
}
}
updateComponentSettings(property, settings, defaultSettings) {
if (settings === true) {
this[property] = defaultSettings;
}
else if (settings === false) {
this[property] = null;
}
else {
this[property] = { ...defaultSettings, ...settings };
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatService, decorators: [{
type: Injectable
}] });