UNPKG

@progress/kendo-angular-conversational-ui

Version:

Kendo UI for Angular Conversational UI components

160 lines (159 loc) 4.67 kB
/**----------------------------------------------------------------------------------------- * 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 })); };