@progress/kendo-angular-conversational-ui
Version:
Kendo UI for Angular Conversational UI components
160 lines (159 loc) • 4.67 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 { defaultModelFields } from "./models/default-model-fields";
import { getter } from "@progress/kendo-angular-common";
import { paperPlaneIcon } from "@progress/kendo-svg-icons";
import { copyIcon, undoIcon, downloadIcon } from "@progress/kendo-svg-icons";
/**
* @hidden
*/
export const closest = (node, predicate) => {
while (node && !predicate(node)) {
node = node.parentNode;
}
return node;
};
/**
* @hidden
*/
export const URL_REGEX = /(https?:\/\/[^\s]+)/g;
/**
* @hidden
*/
export const DOWNLOAD_ALL_SELECTOR = '.k-chat-download-button';
/**
* @hidden
*/
export const FILE_ACTION_BTN_SELECTOR = '.k-menu-button';
/**
* @hidden
*/
export const MENU_ITEM_SELECTOR = '.k-menu-link';
/**
* @hidden
* Default settings for the Speech to Text button.
* These settings can be overridden by the user.
*/
export const STB_DEFAULT_SETTINGS = {
continuous: false,
disabled: false,
fillMode: 'clear',
integrationMode: 'webSpeech',
interimResults: false,
lang: 'en-US',
maxAlternatives: 1,
rounded: 'medium',
size: 'medium',
themeColor: 'base'
};
/**
* @hidden
*/
export const SEND_BTN_DEFAULT_SETTINGS = {
fillMode: 'solid',
rounded: 'full',
size: 'medium',
themeColor: 'primary',
icon: 'paper-plane',
svgIcon: paperPlaneIcon,
buttonClass: 'k-chat-send'
};
/**
* @hidden
*/
export const FILESELECT_DEFAULT_SETTINGS = {
multiple: true,
disabled: false
};
/**
* @hidden
*/
export const SUGGESTIONS_LAYOUT_DEFAULT_SETTINGS = 'scroll';
/**
* @hidden
*/
export const CONTEXT_MENU_ACTIONS = [
{
id: 'copy',
label: 'Copy',
icon: 'copy',
svgIcon: copyIcon,
disabled: false
}, {
id: 'reply',
label: 'Reply',
icon: 'undo',
svgIcon: undoIcon,
disabled: false
}
];
/**
* @hidden
*/
export const FILE_ACTIONS = [
{
id: 'download',
label: 'Download',
icon: 'download',
svgIcon: downloadIcon,
disabled: false
}
];
/**
* @hidden
*/
export const processMessages = (messages, fields) => {
const modelFields = { ...defaultModelFields, ...fields };
return messages.map((message) => parseMessage(message, modelFields));
};
/**
* @hidden
*/
export const parseMessage = (message, fields) => {
const modelFields = { ...defaultModelFields, ...fields };
let author;
const authorId = getter(modelFields.authorIdField || 'authorId')(message);
const authorName = getter(modelFields.authorNameField || 'authorName')(message);
const authorImageUrl = getter(modelFields.authorImageUrlField || 'authorImageUrl')(message);
const authorImageAltText = getter(modelFields.authorImageAltTextField || 'authorImageAltText')(message);
if (authorId !== undefined) {
author = {
id: authorId,
...(authorName && { name: authorName }),
...(authorImageUrl && { avatarUrl: authorImageUrl }),
...(authorImageAltText && { avatarAltText: authorImageAltText }),
};
}
const timestampValue = getter(modelFields.timestampField)(message);
const timestamp = timestampValue instanceof Date ? timestampValue : new Date(timestampValue);
return {
id: getter(modelFields.idField)(message),
text: getter(modelFields.textField)(message),
author: author,
timestamp: timestamp,
status: getter(modelFields.statusField)(message),
files: getter(modelFields.filesField)(message),
attachments: getter(modelFields.attachmentsField)(message),
attachmentLayout: getter(modelFields.attachmentLayoutField)(message),
suggestedActions: getter(modelFields.suggestedActionsField)(message),
isPinned: getter(modelFields.isPinnedField)(message),
replyToId: getter(modelFields.replyToIdField)(message),
isDeleted: getter(modelFields.isDeletedField)(message),
typing: getter(modelFields.typingField)(message),
dataItem: message
};
};
/**
* @hidden
*/
export const transformActions = (actions) => {
return actions.map(action => ({
text: action.label,
icon: action.icon,
svgIcon: action.svgIcon,
disabled: action.disabled,
originalAction: action
}));
};