@progress/kendo-angular-conversational-ui 21.4.1-develop.1 → 22.0.0-develop.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/ai-prompt/localization/messages.d.ts +1 -1
  2. package/ai-prompt/views/base-view.d.ts +1 -1
  3. package/chat/l10n/messages.d.ts +1 -1
  4. package/fesm2022/progress-kendo-angular-conversational-ui.mjs +182 -182
  5. package/inline-ai-prompt/localization/messages.d.ts +1 -1
  6. package/package.json +17 -25
  7. package/esm2022/ai-prompt/aiprompt.component.mjs +0 -556
  8. package/esm2022/ai-prompt/aiprompt.module.mjs +0 -53
  9. package/esm2022/ai-prompt/common/aiprompt.service.mjs +0 -75
  10. package/esm2022/ai-prompt/common/output-card.component.mjs +0 -230
  11. package/esm2022/ai-prompt/common/toolbar-focusable.directive.mjs +0 -72
  12. package/esm2022/ai-prompt/common/toolbar-navigation.service.mjs +0 -56
  13. package/esm2022/ai-prompt/localization/custom-messages.component.mjs +0 -54
  14. package/esm2022/ai-prompt/localization/localized-messages.directive.mjs +0 -39
  15. package/esm2022/ai-prompt/localization/messages.mjs +0 -77
  16. package/esm2022/ai-prompt/models/ai-prompt-settings.mjs +0 -5
  17. package/esm2022/ai-prompt/models/command-execute-event.mjs +0 -5
  18. package/esm2022/ai-prompt/models/command.interface.mjs +0 -5
  19. package/esm2022/ai-prompt/models/index.mjs +0 -5
  20. package/esm2022/ai-prompt/models/output-rating-change-event.mjs +0 -5
  21. package/esm2022/ai-prompt/models/prompt-output.interface.mjs +0 -5
  22. package/esm2022/ai-prompt/models/prompt-request-event.mjs +0 -5
  23. package/esm2022/ai-prompt/models/view-type.mjs +0 -5
  24. package/esm2022/ai-prompt/templates/aiprompt-output-body-template.directive.mjs +0 -33
  25. package/esm2022/ai-prompt/templates/aiprompt-output-template.directive.mjs +0 -33
  26. package/esm2022/ai-prompt/templates/toolbar-actions.template.mjs +0 -39
  27. package/esm2022/ai-prompt/utils.mjs +0 -26
  28. package/esm2022/ai-prompt/views/base-view.mjs +0 -98
  29. package/esm2022/ai-prompt/views/command-view.component.mjs +0 -100
  30. package/esm2022/ai-prompt/views/custom-view.component.mjs +0 -50
  31. package/esm2022/ai-prompt/views/index.mjs +0 -8
  32. package/esm2022/ai-prompt/views/output-view.component.mjs +0 -90
  33. package/esm2022/ai-prompt/views/prompt-view.component.mjs +0 -288
  34. package/esm2022/chat/api/action.interface.mjs +0 -5
  35. package/esm2022/chat/api/attachment.interface.mjs +0 -5
  36. package/esm2022/chat/api/chat-file-interface.mjs +0 -5
  37. package/esm2022/chat/api/chat-suggestion.interface.mjs +0 -5
  38. package/esm2022/chat/api/execute-action-event.mjs +0 -29
  39. package/esm2022/chat/api/file-action.mjs +0 -5
  40. package/esm2022/chat/api/file-download-event.interface.mjs +0 -5
  41. package/esm2022/chat/api/files-layout.mjs +0 -5
  42. package/esm2022/chat/api/index.mjs +0 -21
  43. package/esm2022/chat/api/message-action.mjs +0 -5
  44. package/esm2022/chat/api/message-settings.interface.mjs +0 -5
  45. package/esm2022/chat/api/message-width-mode.mjs +0 -5
  46. package/esm2022/chat/api/message.interface.mjs +0 -5
  47. package/esm2022/chat/api/post-message-event.mjs +0 -21
  48. package/esm2022/chat/api/preventable-event.mjs +0 -28
  49. package/esm2022/chat/api/send-button-settings.mjs +0 -5
  50. package/esm2022/chat/api/suggestions-layout.mjs +0 -5
  51. package/esm2022/chat/api/timestamp-visibility.mjs +0 -5
  52. package/esm2022/chat/api/user.interface.mjs +0 -5
  53. package/esm2022/chat/attachment.component.mjs +0 -105
  54. package/esm2022/chat/builtin-actions.mjs +0 -27
  55. package/esm2022/chat/cards/hero-card.component.mjs +0 -131
  56. package/esm2022/chat/chat-file.component.mjs +0 -144
  57. package/esm2022/chat/chat-item.mjs +0 -10
  58. package/esm2022/chat/chat-view.mjs +0 -80
  59. package/esm2022/chat/chat.component.mjs +0 -1015
  60. package/esm2022/chat/chat.directives.mjs +0 -18
  61. package/esm2022/chat/chat.module.mjs +0 -61
  62. package/esm2022/chat/common/chat.service.mjs +0 -179
  63. package/esm2022/chat/common/models/default-model-fields.mjs +0 -25
  64. package/esm2022/chat/common/models/formatted-text-parts.mjs +0 -5
  65. package/esm2022/chat/common/models/message-box-options.mjs +0 -5
  66. package/esm2022/chat/common/models/model-fields.mjs +0 -5
  67. package/esm2022/chat/common/scroll-anchor.directive.mjs +0 -80
  68. package/esm2022/chat/common/scroll-button.component.mjs +0 -81
  69. package/esm2022/chat/common/scroll.service.mjs +0 -110
  70. package/esm2022/chat/common/utils.mjs +0 -159
  71. package/esm2022/chat/l10n/custom-messages.component.mjs +0 -55
  72. package/esm2022/chat/l10n/localized-messages.directive.mjs +0 -40
  73. package/esm2022/chat/l10n/messages.mjs +0 -130
  74. package/esm2022/chat/message-attachments.component.mjs +0 -258
  75. package/esm2022/chat/message-box.component.mjs +0 -501
  76. package/esm2022/chat/message-list.component.mjs +0 -617
  77. package/esm2022/chat/message-reference-content.component.mjs +0 -86
  78. package/esm2022/chat/message.component.mjs +0 -740
  79. package/esm2022/chat/suggested-actions.component.mjs +0 -443
  80. package/esm2022/chat/templates/attachment-template.directive.mjs +0 -43
  81. package/esm2022/chat/templates/author-message-content-template.directive.mjs +0 -39
  82. package/esm2022/chat/templates/author-message-template.directive.mjs +0 -39
  83. package/esm2022/chat/templates/header-template.directive.mjs +0 -33
  84. package/esm2022/chat/templates/message-box.directive.mjs +0 -36
  85. package/esm2022/chat/templates/message-content-template.directive.mjs +0 -39
  86. package/esm2022/chat/templates/message-template.directive.mjs +0 -39
  87. package/esm2022/chat/templates/no-data-template.directive.mjs +0 -38
  88. package/esm2022/chat/templates/receiver-message-content-template.directive.mjs +0 -39
  89. package/esm2022/chat/templates/receiver-message-template.directive.mjs +0 -39
  90. package/esm2022/chat/templates/status-template.directive.mjs +0 -33
  91. package/esm2022/chat/templates/suggestion-template.directive.mjs +0 -36
  92. package/esm2022/chat/templates/timestamp-template.directive.mjs +0 -42
  93. package/esm2022/chat/templates/user-status-template.directive.mjs +0 -38
  94. package/esm2022/conversational-ui.module.mjs +0 -73
  95. package/esm2022/directives.mjs +0 -145
  96. package/esm2022/index.mjs +0 -40
  97. package/esm2022/inline-ai-prompt/inlineaiprompt-content.component.mjs +0 -548
  98. package/esm2022/inline-ai-prompt/inlineaiprompt.component.mjs +0 -351
  99. package/esm2022/inline-ai-prompt/inlineaiprompt.module.mjs +0 -46
  100. package/esm2022/inline-ai-prompt/inlineaiprompt.service.mjs +0 -92
  101. package/esm2022/inline-ai-prompt/localization/custom-messages.component.mjs +0 -51
  102. package/esm2022/inline-ai-prompt/localization/localized-messages.directive.mjs +0 -39
  103. package/esm2022/inline-ai-prompt/localization/messages.mjs +0 -35
  104. package/esm2022/inline-ai-prompt/models/command.interface.mjs +0 -5
  105. package/esm2022/inline-ai-prompt/models/index.mjs +0 -5
  106. package/esm2022/inline-ai-prompt/models/inlineaiprompt-popupsettings.mjs +0 -5
  107. package/esm2022/inline-ai-prompt/models/inlineaiprompt-settings.mjs +0 -59
  108. package/esm2022/inline-ai-prompt/models/messages.mjs +0 -8
  109. package/esm2022/inline-ai-prompt/models/output-action-click-event.mjs +0 -5
  110. package/esm2022/inline-ai-prompt/models/output-action.interface.mjs +0 -5
  111. package/esm2022/inline-ai-prompt/models/prompt-output.interface.mjs +0 -5
  112. package/esm2022/inline-ai-prompt/models/prompt-request-event.mjs +0 -5
  113. package/esm2022/inline-ai-prompt/output-template.directive.mjs +0 -38
  114. package/esm2022/inline-ai-prompt/utils.mjs +0 -57
  115. package/esm2022/package-metadata.mjs +0 -16
  116. package/esm2022/progress-kendo-angular-conversational-ui.mjs +0 -8
@@ -1,131 +0,0 @@
1
- /**-----------------------------------------------------------------------------------------
2
- * Copyright © 2026 Progress Software Corporation. All rights reserved.
3
- * Licensed under commercial license. See LICENSE.md in the project root for more information
4
- *-------------------------------------------------------------------------------------------*/
5
- import { Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';
6
- import { ButtonComponent } from '@progress/kendo-angular-buttons';
7
- import * as i0 from "@angular/core";
8
- /**
9
- * Represents a Hero Card component.
10
- * Hero cards display a single large image and action buttons with text content.
11
- *
12
- * @example
13
- * ```html
14
- * <kendo-chat-hero-card
15
- * title="Card Title"
16
- * subtitle="Card Subtitle"
17
- * [actions]="actions">
18
- * </kendo-chat-hero-card>
19
- * ```
20
- */
21
- export class HeroCardComponent {
22
- /**
23
- * Sets the URL of the hero card image.
24
- */
25
- imageUrl;
26
- /**
27
- * Sets the title of the hero card.
28
- */
29
- title;
30
- /**
31
- * Sets the subtitle of the hero card.
32
- */
33
- subtitle;
34
- /**
35
- * Sets the array of quick actions for this hero card.
36
- */
37
- actions;
38
- cssClass = true;
39
- /**
40
- * Fires when the user clicks a button.
41
- */
42
- executeAction = new EventEmitter();
43
- /**
44
- * Emits the `executeAction` event when the user clicks an action button.
45
- */
46
- onClick(action) {
47
- this.executeAction.next(action);
48
- }
49
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HeroCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
50
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: HeroCardComponent, isStandalone: true, selector: "kendo-chat-hero-card", inputs: { imageUrl: "imageUrl", title: "title", subtitle: "subtitle", actions: "actions" }, outputs: { executeAction: "executeAction" }, host: { properties: { "class.k-card": "this.cssClass" } }, ngImport: i0, template: `
51
- @if (imageUrl) {
52
- <img class="k-card-image" [src]="imageUrl" />
53
- }
54
- <div class="k-card-body">
55
- @if (title) {
56
- <h5 class="k-card-title">
57
- {{ title }}
58
- </h5>
59
- }
60
- @if (subtitle) {
61
- <h6 class="k-card-subtitle">
62
- {{ subtitle }}
63
- </h6>
64
- }
65
- </div>
66
- <div class="k-card-actions k-card-actions-vertical">
67
- @for (act of actions; track act) {
68
- <span class="k-card-action"
69
- >
70
- <button
71
- kendoButton fillMode="flat"
72
- (click)="onClick(act)"
73
- >
74
- {{ act.title }}
75
- </button>
76
- </span>
77
- }
78
- </div>
79
- `, isInline: true, dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }] });
80
- }
81
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HeroCardComponent, decorators: [{
82
- type: Component,
83
- args: [{
84
- selector: 'kendo-chat-hero-card',
85
- template: `
86
- @if (imageUrl) {
87
- <img class="k-card-image" [src]="imageUrl" />
88
- }
89
- <div class="k-card-body">
90
- @if (title) {
91
- <h5 class="k-card-title">
92
- {{ title }}
93
- </h5>
94
- }
95
- @if (subtitle) {
96
- <h6 class="k-card-subtitle">
97
- {{ subtitle }}
98
- </h6>
99
- }
100
- </div>
101
- <div class="k-card-actions k-card-actions-vertical">
102
- @for (act of actions; track act) {
103
- <span class="k-card-action"
104
- >
105
- <button
106
- kendoButton fillMode="flat"
107
- (click)="onClick(act)"
108
- >
109
- {{ act.title }}
110
- </button>
111
- </span>
112
- }
113
- </div>
114
- `,
115
- standalone: true,
116
- imports: [ButtonComponent]
117
- }]
118
- }], propDecorators: { imageUrl: [{
119
- type: Input
120
- }], title: [{
121
- type: Input
122
- }], subtitle: [{
123
- type: Input
124
- }], actions: [{
125
- type: Input
126
- }], cssClass: [{
127
- type: HostBinding,
128
- args: ['class.k-card']
129
- }], executeAction: [{
130
- type: Output
131
- }] } });
@@ -1,144 +0,0 @@
1
- /**-----------------------------------------------------------------------------------------
2
- * Copyright © 2026 Progress Software Corporation. All rights reserved.
3
- * Licensed under commercial license. See LICENSE.md in the project root for more information
4
- *-------------------------------------------------------------------------------------------*/
5
- /* eslint-disable @typescript-eslint/no-empty-function */
6
- import { Component, forwardRef, Input, Output, EventEmitter } from '@angular/core';
7
- import { ChatItem } from './chat-item';
8
- import { fileGroupClass, fileSVGGroupIcon, getTotalFilesSizeMessage } from '@progress/kendo-angular-upload';
9
- import { IconWrapperComponent } from '@progress/kendo-angular-icons';
10
- import { moreVerticalIcon, xIcon } from '@progress/kendo-svg-icons';
11
- import { ButtonComponent, DropDownButtonComponent } from '@progress/kendo-angular-buttons';
12
- import { LocalizationService } from '@progress/kendo-angular-l10n';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@progress/kendo-angular-l10n";
15
- /**
16
- * @hidden
17
- */
18
- export class ChatFileComponent extends ChatItem {
19
- localization;
20
- chatFile;
21
- removable = false;
22
- fileActions;
23
- remove = new EventEmitter();
24
- actionClick = new EventEmitter();
25
- actionsToggle = new EventEmitter();
26
- actionButtonClick = new EventEmitter();
27
- deleteIcon = xIcon;
28
- moreIcon = moreVerticalIcon;
29
- constructor(localization) {
30
- super();
31
- this.localization = localization;
32
- }
33
- fileThumbnail(extension) {
34
- return fileSVGGroupIcon(extension);
35
- }
36
- fileGroupClass(extension) {
37
- return fileGroupClass(extension);
38
- }
39
- getTotalFilesSizeMessage(file) {
40
- return getTotalFilesSizeMessage([file]);
41
- }
42
- textFor(key) {
43
- return this.localization.get(key);
44
- }
45
- focus() { }
46
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatFileComponent, deps: [{ token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
47
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChatFileComponent, isStandalone: true, selector: "li[chatFile]", inputs: { chatFile: "chatFile", removable: "removable", fileActions: "fileActions" }, outputs: { remove: "remove", actionClick: "actionClick", actionsToggle: "actionsToggle", actionButtonClick: "actionButtonClick" }, providers: [{
48
- provide: ChatItem,
49
- useExisting: forwardRef(() => ChatFileComponent)
50
- }], usesInheritance: true, ngImport: i0, template: `
51
- <kendo-icon-wrapper
52
- size="xlarge"
53
- [name]="fileGroupClass(chatFile.extension)"
54
- [svgIcon]="fileThumbnail(chatFile.extension)"
55
- >
56
- </kendo-icon-wrapper>
57
- <div class="k-chat-file-info">
58
- <span class="k-chat-file-name">{{chatFile.name}}</span>
59
- <span class="k-chat-file-size">{{getTotalFilesSizeMessage(chatFile)}}</span>
60
- </div>
61
- @if (removable) {
62
- <button
63
- kendoButton
64
- [attr.title]="textFor('removeFileTitle')"
65
- [svgIcon]="deleteIcon"
66
- (click)="remove.emit(chatFile)"
67
- fillMode="flat"
68
- ></button>
69
- }
70
- @if (fileActions && fileActions.length > 0) {
71
- <kendo-dropdownbutton
72
- [data]="fileActions"
73
- [attr.title]="textFor('fileActionsTitle')"
74
- fillMode="flat"
75
- icon="more-vertical"
76
- [svgIcon]="moreIcon"
77
- (itemClick)="actionClick.emit($event)"
78
- (click)="$event.preventDefault()"
79
- (open)="actionsToggle.emit(true)"
80
- (close)="actionsToggle.emit(false)"
81
- ></kendo-dropdownbutton>
82
- }
83
- `, isInline: true, dependencies: [{ kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: DropDownButtonComponent, selector: "kendo-dropdownbutton", inputs: ["arrowIcon", "icon", "svgIcon", "iconClass", "imageUrl", "textField", "data", "size", "rounded", "fillMode", "themeColor", "buttonAttributes"], outputs: ["itemClick", "focus", "blur"], exportAs: ["kendoDropDownButton"] }] });
84
- }
85
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatFileComponent, decorators: [{
86
- type: Component,
87
- args: [{
88
- selector: 'li[chatFile]',
89
- providers: [{
90
- provide: ChatItem,
91
- useExisting: forwardRef(() => ChatFileComponent)
92
- }],
93
- template: `
94
- <kendo-icon-wrapper
95
- size="xlarge"
96
- [name]="fileGroupClass(chatFile.extension)"
97
- [svgIcon]="fileThumbnail(chatFile.extension)"
98
- >
99
- </kendo-icon-wrapper>
100
- <div class="k-chat-file-info">
101
- <span class="k-chat-file-name">{{chatFile.name}}</span>
102
- <span class="k-chat-file-size">{{getTotalFilesSizeMessage(chatFile)}}</span>
103
- </div>
104
- @if (removable) {
105
- <button
106
- kendoButton
107
- [attr.title]="textFor('removeFileTitle')"
108
- [svgIcon]="deleteIcon"
109
- (click)="remove.emit(chatFile)"
110
- fillMode="flat"
111
- ></button>
112
- }
113
- @if (fileActions && fileActions.length > 0) {
114
- <kendo-dropdownbutton
115
- [data]="fileActions"
116
- [attr.title]="textFor('fileActionsTitle')"
117
- fillMode="flat"
118
- icon="more-vertical"
119
- [svgIcon]="moreIcon"
120
- (itemClick)="actionClick.emit($event)"
121
- (click)="$event.preventDefault()"
122
- (open)="actionsToggle.emit(true)"
123
- (close)="actionsToggle.emit(false)"
124
- ></kendo-dropdownbutton>
125
- }
126
- `,
127
- standalone: true,
128
- imports: [IconWrapperComponent, ButtonComponent, DropDownButtonComponent]
129
- }]
130
- }], ctorParameters: () => [{ type: i1.LocalizationService }], propDecorators: { chatFile: [{
131
- type: Input
132
- }], removable: [{
133
- type: Input
134
- }], fileActions: [{
135
- type: Input
136
- }], remove: [{
137
- type: Output
138
- }], actionClick: [{
139
- type: Output
140
- }], actionsToggle: [{
141
- type: Output
142
- }], actionButtonClick: [{
143
- type: Output
144
- }] } });
@@ -1,10 +0,0 @@
1
- /**-----------------------------------------------------------------------------------------
2
- * Copyright © 2026 Progress Software Corporation. All rights reserved.
3
- * Licensed under commercial license. See LICENSE.md in the project root for more information
4
- *-------------------------------------------------------------------------------------------*/
5
- /**
6
- * @hidden
7
- */
8
- export class ChatItem {
9
- selected;
10
- }
@@ -1,80 +0,0 @@
1
- /**-----------------------------------------------------------------------------------------
2
- * Copyright © 2026 Progress Software Corporation. All rights reserved.
3
- * Licensed under commercial license. See LICENSE.md in the project root for more information
4
- *-------------------------------------------------------------------------------------------*/
5
- import { isDevMode } from '@angular/core';
6
- /**
7
- * @hidden
8
- */
9
- export const isAuthor = (authorId, msg) => msg.author && authorId === msg.author.id;
10
- const last = (arr) => arr[arr.length - 1];
11
- const dateChanged = (curr, prev) => (curr && prev) && (prev.getDate() !== curr.getDate() ||
12
- prev.getMonth() !== curr.getMonth() ||
13
- prev.getFullYear() !== curr.getFullYear());
14
- const addDateMarker = (acc, msg) => {
15
- const timestamp = msg.timestamp;
16
- const lastItem = last(acc);
17
- if (!timestamp) {
18
- return;
19
- }
20
- if (!lastItem || dateChanged(timestamp, lastItem.timestamp)) {
21
- const dateMarker = {
22
- type: 'date-marker',
23
- timestamp: timestamp,
24
- trackBy: timestamp.getTime()
25
- };
26
- acc.push(dateMarker);
27
- }
28
- };
29
- const groupMessages = (acc, msg, isLastMessage) => {
30
- const lastItem = last(acc);
31
- let messages;
32
- if (isDevMode() && !msg.author) {
33
- throw new Error('Author must be set for message: ' + JSON.stringify(msg));
34
- }
35
- if (msg.typing && !isLastMessage) {
36
- return;
37
- }
38
- if (lastItem && lastItem.type === 'message-group') {
39
- messages = lastItem.messages;
40
- }
41
- if (messages && isAuthor(msg.author.id, last(messages))) {
42
- messages.push(msg);
43
- }
44
- else {
45
- acc.push({
46
- type: 'message-group',
47
- messages: [msg],
48
- author: msg.author,
49
- timestamp: msg.timestamp,
50
- trackBy: msg
51
- });
52
- }
53
- };
54
- const groupItems = (total) => (acc, msg, index) => {
55
- const isLastMessage = index === total - 1;
56
- addDateMarker(acc, msg);
57
- groupMessages(acc, msg, isLastMessage);
58
- if (msg.attachments && msg.attachments.length > 1) {
59
- acc.push({
60
- type: 'attachment-group',
61
- attachments: msg.attachments,
62
- attachmentLayout: msg.attachmentLayout,
63
- timestamp: msg.timestamp,
64
- trackBy: 'attachment-group' + msg.id
65
- });
66
- }
67
- if (msg.suggestedActions && isLastMessage) {
68
- acc.push({
69
- type: 'action-group',
70
- actions: msg.suggestedActions,
71
- timestamp: msg.timestamp,
72
- trackBy: 'action-group' + msg.id
73
- });
74
- }
75
- return acc;
76
- };
77
- /**
78
- * @hidden
79
- */
80
- export const chatView = (messages) => messages.reduce(groupItems(messages.length), []);