@acorex/components 21.0.2-next.8 → 21.0.3-next.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 (228) hide show
  1. package/conversation2/README.md +5 -8
  2. package/fesm2022/acorex-components-accordion.mjs +29 -29
  3. package/fesm2022/acorex-components-accordion.mjs.map +1 -1
  4. package/fesm2022/acorex-components-action-sheet.mjs +30 -30
  5. package/fesm2022/acorex-components-action-sheet.mjs.map +1 -1
  6. package/fesm2022/acorex-components-alert.mjs +16 -16
  7. package/fesm2022/acorex-components-alert.mjs.map +1 -1
  8. package/fesm2022/acorex-components-aspect-ratio.mjs +5 -5
  9. package/fesm2022/acorex-components-aspect-ratio.mjs.map +1 -1
  10. package/fesm2022/acorex-components-audio-wave.mjs +11 -11
  11. package/fesm2022/acorex-components-audio-wave.mjs.map +1 -1
  12. package/fesm2022/acorex-components-autocomplete.mjs +14 -14
  13. package/fesm2022/acorex-components-autocomplete.mjs.map +1 -1
  14. package/fesm2022/acorex-components-avatar.mjs +17 -16
  15. package/fesm2022/acorex-components-avatar.mjs.map +1 -1
  16. package/fesm2022/acorex-components-badge.mjs +9 -9
  17. package/fesm2022/acorex-components-badge.mjs.map +1 -1
  18. package/fesm2022/acorex-components-bottom-navigation.mjs +14 -14
  19. package/fesm2022/acorex-components-bottom-navigation.mjs.map +1 -1
  20. package/fesm2022/acorex-components-breadcrumbs.mjs +13 -13
  21. package/fesm2022/acorex-components-breadcrumbs.mjs.map +1 -1
  22. package/fesm2022/acorex-components-button-group.mjs +40 -20
  23. package/fesm2022/acorex-components-button-group.mjs.map +1 -1
  24. package/fesm2022/acorex-components-button.mjs +35 -36
  25. package/fesm2022/acorex-components-button.mjs.map +1 -1
  26. package/fesm2022/acorex-components-calendar.mjs +279 -61
  27. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  28. package/fesm2022/acorex-components-check-box.mjs +10 -10
  29. package/fesm2022/acorex-components-check-box.mjs.map +1 -1
  30. package/fesm2022/acorex-components-chips.mjs +9 -9
  31. package/fesm2022/acorex-components-chips.mjs.map +1 -1
  32. package/fesm2022/acorex-components-circular-progress.mjs +13 -13
  33. package/fesm2022/acorex-components-circular-progress.mjs.map +1 -1
  34. package/fesm2022/acorex-components-code-editor.mjs +27 -27
  35. package/fesm2022/acorex-components-code-editor.mjs.map +1 -1
  36. package/fesm2022/acorex-components-color-box.mjs +14 -14
  37. package/fesm2022/acorex-components-color-box.mjs.map +1 -1
  38. package/fesm2022/acorex-components-color-palette.mjs +84 -43
  39. package/fesm2022/acorex-components-color-palette.mjs.map +1 -1
  40. package/fesm2022/acorex-components-command.mjs +19 -19
  41. package/fesm2022/acorex-components-command.mjs.map +1 -1
  42. package/fesm2022/acorex-components-comment.mjs +35 -35
  43. package/fesm2022/acorex-components-comment.mjs.map +1 -1
  44. package/fesm2022/acorex-components-conversation.mjs +105 -105
  45. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  46. package/fesm2022/acorex-components-conversation2.mjs +11697 -8617
  47. package/fesm2022/acorex-components-conversation2.mjs.map +1 -1
  48. package/fesm2022/acorex-components-cron-job.mjs +51 -51
  49. package/fesm2022/acorex-components-cron-job.mjs.map +1 -1
  50. package/fesm2022/acorex-components-data-list.mjs +31 -31
  51. package/fesm2022/acorex-components-data-list.mjs.map +1 -1
  52. package/fesm2022/acorex-components-data-pager.mjs +93 -104
  53. package/fesm2022/acorex-components-data-pager.mjs.map +1 -1
  54. package/fesm2022/acorex-components-data-table.mjs +467 -86
  55. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  56. package/fesm2022/acorex-components-datetime-box.mjs +174 -39
  57. package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
  58. package/fesm2022/acorex-components-datetime-input.mjs +30 -38
  59. package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
  60. package/fesm2022/acorex-components-datetime-picker.mjs +62 -55
  61. package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
  62. package/fesm2022/acorex-components-decorators.mjs +39 -39
  63. package/fesm2022/acorex-components-decorators.mjs.map +1 -1
  64. package/fesm2022/acorex-components-dialog.mjs +19 -26
  65. package/fesm2022/acorex-components-dialog.mjs.map +1 -1
  66. package/fesm2022/acorex-components-drawer.mjs +23 -23
  67. package/fesm2022/acorex-components-drawer.mjs.map +1 -1
  68. package/fesm2022/acorex-components-dropdown-button.mjs +9 -9
  69. package/fesm2022/acorex-components-dropdown.mjs +19 -19
  70. package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
  71. package/fesm2022/acorex-components-editor.mjs +12 -12
  72. package/fesm2022/acorex-components-editor.mjs.map +1 -1
  73. package/fesm2022/acorex-components-fab.mjs +15 -15
  74. package/fesm2022/acorex-components-fab.mjs.map +1 -1
  75. package/fesm2022/acorex-components-flow-chart.mjs +74 -58
  76. package/fesm2022/acorex-components-flow-chart.mjs.map +1 -1
  77. package/fesm2022/acorex-components-form.mjs +30 -30
  78. package/fesm2022/acorex-components-form.mjs.map +1 -1
  79. package/fesm2022/acorex-components-grid-layout-builder.mjs +15 -15
  80. package/fesm2022/acorex-components-grid-layout-builder.mjs.map +1 -1
  81. package/fesm2022/acorex-components-image-editor.mjs +87 -87
  82. package/fesm2022/acorex-components-image-editor.mjs.map +1 -1
  83. package/fesm2022/acorex-components-image.mjs +11 -11
  84. package/fesm2022/acorex-components-image.mjs.map +1 -1
  85. package/fesm2022/acorex-components-json-viewer.mjs +12 -12
  86. package/fesm2022/acorex-components-json-viewer.mjs.map +1 -1
  87. package/fesm2022/acorex-components-kanban.mjs +23 -23
  88. package/fesm2022/acorex-components-kanban.mjs.map +1 -1
  89. package/fesm2022/acorex-components-kbd.mjs +15 -15
  90. package/fesm2022/acorex-components-kbd.mjs.map +1 -1
  91. package/fesm2022/acorex-components-label.mjs +9 -9
  92. package/fesm2022/acorex-components-list.mjs +69 -19
  93. package/fesm2022/acorex-components-list.mjs.map +1 -1
  94. package/fesm2022/acorex-components-loading-dialog.mjs +20 -19
  95. package/fesm2022/acorex-components-loading-dialog.mjs.map +1 -1
  96. package/fesm2022/acorex-components-loading.mjs +21 -21
  97. package/fesm2022/acorex-components-loading.mjs.map +1 -1
  98. package/fesm2022/acorex-components-map.mjs +46 -46
  99. package/fesm2022/acorex-components-map.mjs.map +1 -1
  100. package/fesm2022/acorex-components-media-viewer.mjs +82 -82
  101. package/fesm2022/acorex-components-media-viewer.mjs.map +1 -1
  102. package/fesm2022/acorex-components-menu.mjs +366 -197
  103. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  104. package/fesm2022/{acorex-components-modal-acorex-components-modal-CcXuJ4IW.mjs → acorex-components-modal-acorex-components-modal-lJw2DGSj.mjs} +28 -28
  105. package/fesm2022/{acorex-components-modal-acorex-components-modal-CcXuJ4IW.mjs.map → acorex-components-modal-acorex-components-modal-lJw2DGSj.mjs.map} +1 -1
  106. package/fesm2022/{acorex-components-modal-modal-content.component-DTZu2zbU.mjs → acorex-components-modal-modal-content.component-t9kRuhc_.mjs} +39 -39
  107. package/fesm2022/acorex-components-modal-modal-content.component-t9kRuhc_.mjs.map +1 -0
  108. package/fesm2022/acorex-components-modal.mjs +1 -1
  109. package/fesm2022/acorex-components-navbar.mjs +8 -8
  110. package/fesm2022/acorex-components-notification.mjs +28 -28
  111. package/fesm2022/acorex-components-notification.mjs.map +1 -1
  112. package/fesm2022/acorex-components-number-box.mjs +61 -23
  113. package/fesm2022/acorex-components-number-box.mjs.map +1 -1
  114. package/fesm2022/acorex-components-otp.mjs +45 -21
  115. package/fesm2022/acorex-components-otp.mjs.map +1 -1
  116. package/fesm2022/acorex-components-page.mjs +10 -10
  117. package/fesm2022/acorex-components-paint.mjs +53 -53
  118. package/fesm2022/acorex-components-paint.mjs.map +1 -1
  119. package/fesm2022/acorex-components-password-box.mjs +28 -28
  120. package/fesm2022/acorex-components-password-box.mjs.map +1 -1
  121. package/fesm2022/acorex-components-pdf-reader.mjs +9 -9
  122. package/fesm2022/acorex-components-pdf-reader.mjs.map +1 -1
  123. package/fesm2022/acorex-components-phone-box.mjs +19 -19
  124. package/fesm2022/acorex-components-phone-box.mjs.map +1 -1
  125. package/fesm2022/acorex-components-picker.mjs +31 -31
  126. package/fesm2022/acorex-components-picker.mjs.map +1 -1
  127. package/fesm2022/acorex-components-popover.mjs +18 -14
  128. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  129. package/fesm2022/acorex-components-popup.mjs +52 -25
  130. package/fesm2022/acorex-components-popup.mjs.map +1 -1
  131. package/fesm2022/acorex-components-progress-bar.mjs +8 -8
  132. package/fesm2022/acorex-components-qrcode.mjs +37 -20
  133. package/fesm2022/acorex-components-qrcode.mjs.map +1 -1
  134. package/fesm2022/acorex-components-query-builder.mjs +15 -14
  135. package/fesm2022/acorex-components-query-builder.mjs.map +1 -1
  136. package/fesm2022/acorex-components-radio.mjs +9 -9
  137. package/fesm2022/acorex-components-rail-navigation.mjs +28 -28
  138. package/fesm2022/acorex-components-rail-navigation.mjs.map +1 -1
  139. package/fesm2022/acorex-components-range-slider.mjs +34 -34
  140. package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
  141. package/fesm2022/acorex-components-rate-picker.mjs +17 -17
  142. package/fesm2022/acorex-components-rate-picker.mjs.map +1 -1
  143. package/fesm2022/acorex-components-rest-api-generator.mjs +33 -33
  144. package/fesm2022/acorex-components-rest-api-generator.mjs.map +1 -1
  145. package/fesm2022/acorex-components-result.mjs +8 -8
  146. package/fesm2022/acorex-components-routing-progress.mjs +8 -8
  147. package/fesm2022/acorex-components-routing-progress.mjs.map +1 -1
  148. package/fesm2022/acorex-components-rrule.mjs +36 -36
  149. package/fesm2022/acorex-components-rrule.mjs.map +1 -1
  150. package/fesm2022/acorex-components-scheduler-picker.mjs +118 -118
  151. package/fesm2022/acorex-components-scheduler-picker.mjs.map +1 -1
  152. package/fesm2022/acorex-components-scheduler.mjs +398 -326
  153. package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
  154. package/fesm2022/acorex-components-search-box.mjs +9 -9
  155. package/fesm2022/acorex-components-search-box.mjs.map +1 -1
  156. package/fesm2022/acorex-components-select-box.mjs +55 -25
  157. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  158. package/fesm2022/acorex-components-selection-list-2.mjs +12 -12
  159. package/fesm2022/acorex-components-selection-list-2.mjs.map +1 -1
  160. package/fesm2022/acorex-components-selection-list.mjs +11 -11
  161. package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
  162. package/fesm2022/acorex-components-side-menu.mjs +455 -97
  163. package/fesm2022/acorex-components-side-menu.mjs.map +1 -1
  164. package/fesm2022/acorex-components-skeleton.mjs +8 -8
  165. package/fesm2022/acorex-components-skeleton.mjs.map +1 -1
  166. package/fesm2022/acorex-components-slider.mjs +7 -7
  167. package/fesm2022/acorex-components-sliding-item.mjs +25 -25
  168. package/fesm2022/acorex-components-sliding-item.mjs.map +1 -1
  169. package/fesm2022/acorex-components-step-wizard.mjs +40 -39
  170. package/fesm2022/acorex-components-step-wizard.mjs.map +1 -1
  171. package/fesm2022/acorex-components-switch.mjs +12 -12
  172. package/fesm2022/acorex-components-switch.mjs.map +1 -1
  173. package/fesm2022/acorex-components-tabs.mjs +20 -20
  174. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  175. package/fesm2022/acorex-components-tag-box.mjs +19 -19
  176. package/fesm2022/acorex-components-tag-box.mjs.map +1 -1
  177. package/fesm2022/acorex-components-tag.mjs +8 -8
  178. package/fesm2022/acorex-components-tag.mjs.map +1 -1
  179. package/fesm2022/acorex-components-text-area.mjs +9 -9
  180. package/fesm2022/acorex-components-text-area.mjs.map +1 -1
  181. package/fesm2022/acorex-components-text-box.mjs +12 -12
  182. package/fesm2022/acorex-components-text-box.mjs.map +1 -1
  183. package/fesm2022/acorex-components-time-duration.mjs +34 -32
  184. package/fesm2022/acorex-components-time-duration.mjs.map +1 -1
  185. package/fesm2022/acorex-components-time-line.mjs +19 -19
  186. package/fesm2022/acorex-components-time-line.mjs.map +1 -1
  187. package/fesm2022/acorex-components-toast.mjs +26 -26
  188. package/fesm2022/acorex-components-toast.mjs.map +1 -1
  189. package/fesm2022/acorex-components-toolbar.mjs +13 -13
  190. package/fesm2022/acorex-components-toolbar.mjs.map +1 -1
  191. package/fesm2022/acorex-components-tooltip.mjs +27 -18
  192. package/fesm2022/acorex-components-tooltip.mjs.map +1 -1
  193. package/fesm2022/acorex-components-tree-view.mjs +326 -67
  194. package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
  195. package/fesm2022/acorex-components-uploader.mjs +17 -17
  196. package/fesm2022/acorex-components-uploader.mjs.map +1 -1
  197. package/fesm2022/acorex-components-video-player.mjs +8 -8
  198. package/fesm2022/acorex-components-video-player.mjs.map +1 -1
  199. package/fesm2022/acorex-components-wysiwyg.mjs +60 -53
  200. package/fesm2022/acorex-components-wysiwyg.mjs.map +1 -1
  201. package/package.json +5 -4
  202. package/types/acorex-components-button-group.d.ts +9 -3
  203. package/types/acorex-components-button.d.ts +2 -8
  204. package/types/acorex-components-calendar.d.ts +142 -27
  205. package/types/acorex-components-color-palette.d.ts +2 -0
  206. package/types/acorex-components-conversation2.d.ts +1340 -1289
  207. package/types/acorex-components-data-pager.d.ts +6 -25
  208. package/types/acorex-components-data-table.d.ts +216 -56
  209. package/types/acorex-components-datetime-box.d.ts +79 -8
  210. package/types/acorex-components-datetime-input.d.ts +2 -2
  211. package/types/acorex-components-datetime-picker.d.ts +15 -5
  212. package/types/acorex-components-flow-chart.d.ts +4 -0
  213. package/types/acorex-components-list.d.ts +15 -1
  214. package/types/acorex-components-loading-dialog.d.ts +16 -16
  215. package/types/acorex-components-menu.d.ts +105 -36
  216. package/types/acorex-components-number-box.d.ts +9 -0
  217. package/types/acorex-components-otp.d.ts +18 -1
  218. package/types/acorex-components-popup.d.ts +11 -1
  219. package/types/acorex-components-qrcode.d.ts +1 -0
  220. package/types/acorex-components-query-builder.d.ts +1 -1
  221. package/types/acorex-components-scheduler.d.ts +23 -2
  222. package/types/acorex-components-select-box.d.ts +1 -0
  223. package/types/acorex-components-side-menu.d.ts +96 -34
  224. package/types/acorex-components-step-wizard.d.ts +2 -1
  225. package/types/acorex-components-time-duration.d.ts +1 -0
  226. package/types/acorex-components-tree-view.d.ts +43 -2
  227. package/types/acorex-components-wysiwyg.d.ts +6 -1
  228. package/fesm2022/acorex-components-modal-modal-content.component-DTZu2zbU.mjs.map +0 -1
@@ -1,11 +1,12 @@
1
1
  import * as _acorex_components_conversation2 from '@acorex/components/conversation2';
2
2
  import * as _angular_core from '@angular/core';
3
- import { OnDestroy, ViewContainerRef, Type, InputSignal, WritableSignal, Signal, OnInit, EventEmitter, TemplateRef, InjectionToken, ElementRef, ModuleWithProviders, Provider } from '@angular/core';
3
+ import { OnDestroy, ViewContainerRef, Type, InputSignal, WritableSignal, Signal, Provider, OnInit, EventEmitter, TemplateRef, InjectionToken, ModuleWithProviders } from '@angular/core';
4
4
  import { AXComponentCloseEvent, AXHtmlEvent, AXDataSource, AXClosableComponent } from '@acorex/cdk/common';
5
- import { AXUploaderChangedEvent } from '@acorex/cdk/uploader';
5
+ import * as _acorex_components_popup from '@acorex/components/popup';
6
+ import { AXPopupService, AXPopupRef } from '@acorex/components/popup';
7
+ import { AXFileUploadOptions, AXUploadResult, AXUploadReference, AXUploaderService, AXUploaderFileChangeEvent } from '@acorex/cdk/uploader';
6
8
  import { AXPopoverComponent } from '@acorex/components/popover';
7
9
  import { AXListComponent } from '@acorex/components/list';
8
- import { AXPopupService, AXPopupRef } from '@acorex/components/popup';
9
10
  import * as rxjs from 'rxjs';
10
11
  import { Observable, BehaviorSubject, Subject } from 'rxjs';
11
12
  import { AXDialogService } from '@acorex/components/dialog';
@@ -13,6 +14,7 @@ import { AXContextMenuOpeningEvent, AXContextMenuItemsClickEvent } from '@acorex
13
14
  import { AXBasePageComponent } from '@acorex/components/page';
14
15
  import { AXTranslationService } from '@acorex/core/translation';
15
16
  import { AXMapMarker } from '@acorex/components/map';
17
+ import { AXFileTypeInfoProvider, AXFileType, AXFileService } from '@acorex/core/file';
16
18
  import { SafeHtml } from '@angular/platform-browser';
17
19
  import * as i1 from '@angular/common';
18
20
  import * as i2 from '@angular/forms';
@@ -56,271 +58,168 @@ declare class AXComposerPopupComponent implements OnDestroy {
56
58
  }
57
59
 
58
60
  /**
59
- * Message Payload Types
60
- * Type-specific data structures for different message types
61
+ * Conversation-specific upload/message types.
62
+ * Storage contracts live in {@link @acorex/cdk/uploader}.
61
63
  */
64
+
65
+ type AXUploaderReference = AXUploadReference;
66
+ type AXUploaderResult = AXUploadResult;
67
+ /** Upload options with conversation scope in metadata. */
68
+ type AXConversationUploadOptions = Omit<AXFileUploadOptions, 'source'> & {
69
+ metadata?: Record<string, unknown> & {
70
+ conversationId?: string;
71
+ };
72
+ };
73
+ interface AXSendMessageUploadSource {
74
+ source: File | Blob;
75
+ fileName?: string;
76
+ mimeType?: string;
77
+ onProgress?: (percent: number) => void;
78
+ signal?: AbortSignal;
79
+ }
80
+ interface AXSendMessageOptions {
81
+ media?: AXSendMessageUploadSource;
82
+ localPreviewUrl?: string;
83
+ }
84
+ interface UploaderFilePreview {
85
+ file: File;
86
+ preview?: string;
87
+ type: 'image' | 'video' | 'audio' | 'file';
88
+ }
89
+
62
90
  /**
63
- * Text formatting information
91
+ * Message Payload Types
64
92
  */
93
+ /** Fields for one uploaded or remote media item. */
94
+ interface AXMediaItemFields {
95
+ /** HTTP(S) or other persistable URL; omit when only {@link mediaId} is stored. */
96
+ url?: string;
97
+ mediaId?: string;
98
+ mimeType?: string;
99
+ size?: number;
100
+ metadata?: Record<string, unknown>;
101
+ }
65
102
  interface AXTextFormat {
66
- /** Start position in text */
67
103
  start: number;
68
- /** End position in text */
69
104
  end: number;
70
- /** Format type: bold, italic, code, strikethrough, etc. */
71
105
  type: 'bold' | 'italic' | 'code' | 'strikethrough' | 'underline' | 'spoiler';
72
106
  }
73
- /**
74
- * Mention information
75
- */
76
107
  interface AXMention {
77
- /** Start position in text */
78
108
  start: number;
79
- /** End position in text */
80
109
  end: number;
81
- /** Mentioned user ID */
82
110
  userId: string;
83
- /** Mentioned user display name */
84
111
  userName: string;
85
112
  }
86
- /**
87
- * Link information
88
- */
89
113
  interface AXLink {
90
- /** Start position in text */
91
114
  start: number;
92
- /** End position in text */
93
115
  end: number;
94
- /** URL */
95
116
  url: string;
96
- /** Link preview data (optional) */
97
117
  preview?: AXLinkPreview;
98
118
  }
99
- /**
100
- * Link preview metadata
101
- */
102
119
  interface AXLinkPreview {
103
- /** Page title */
104
120
  title?: string;
105
- /** Page description */
106
121
  description?: string;
107
- /** Preview image URL */
108
122
  image?: string;
109
- /** Site name */
110
123
  siteName?: string;
111
124
  }
112
- /**
113
- * Text message payload
114
- */
115
125
  interface AXTextPayload {
116
- /** Message type */
117
126
  type: 'text';
118
- /** Message text content */
119
127
  text: string;
120
- /** Text formatting information */
121
128
  formatting?: AXTextFormat[];
122
- /** User mentions */
123
129
  mentions?: AXMention[];
124
- /** Links in the message */
125
130
  links?: AXLink[];
126
131
  }
127
- /**
128
- * Image message payload
129
- */
130
- interface AXImagePayload {
131
- /** Message type */
132
- type: 'image';
133
- /** Full-size image URL */
134
- url: string;
135
- /** Thumbnail URL for preview */
132
+ interface AXImageMediaItem extends AXMediaItemFields {
136
133
  thumbnailUrl?: string;
137
- /** Image width in pixels */
138
134
  width: number;
139
- /** Image height in pixels */
140
135
  height: number;
141
- /** Optional caption */
142
- caption?: string;
143
- /** File size in bytes */
144
- size?: number;
145
- /** MIME type */
146
- mimeType?: string;
147
- /** Blurhash for progressive loading */
148
136
  blurhash?: string;
149
137
  }
150
- /**
151
- * Video message payload
152
- */
153
- interface AXVideoPayload {
154
- /** Message type */
155
- type: 'video';
156
- /** Video file URL */
157
- url: string;
158
- /** Thumbnail/poster image URL */
138
+ interface AXImagePayload {
139
+ type: 'image';
140
+ images: AXImageMediaItem[];
141
+ caption?: string;
142
+ }
143
+ interface AXVideoMediaItem extends AXMediaItemFields {
159
144
  thumbnailUrl?: string;
160
- /** Video duration in seconds */
161
145
  duration: number;
162
- /** Video width in pixels */
163
146
  width: number;
164
- /** Video height in pixels */
165
147
  height: number;
166
- /** File size in bytes */
167
- size: number;
168
- /** MIME type */
169
- mimeType?: string;
170
- /** Optional caption */
148
+ }
149
+ interface AXVideoPayload {
150
+ type: 'video';
151
+ videos: AXVideoMediaItem[];
171
152
  caption?: string;
172
153
  }
173
- /**
174
- * Audio message payload (e.g., music, podcast)
175
- */
176
- interface AXAudioPayload {
177
- /** Message type */
178
- type: 'audio';
179
- /** Audio file URL */
180
- url: string;
181
- /** Duration in seconds */
154
+ interface AXAudioMediaItem extends AXMediaItemFields {
182
155
  duration: number;
183
- /** File size in bytes */
184
- size: number;
185
- /** MIME type */
186
- mimeType?: string;
187
- /** Audio title */
188
156
  title?: string;
189
- /** Artist name */
190
157
  artist?: string;
191
- /** Album art URL */
192
158
  coverUrl?: string;
193
- /** Waveform data for visualization */
194
159
  waveform?: number[];
195
160
  }
196
- /**
197
- * Voice message payload (recorded audio)
198
- */
199
- interface AXVoicePayload {
200
- /** Message type */
161
+ interface AXAudioPayload {
162
+ type: 'audio';
163
+ audios: AXAudioMediaItem[];
164
+ caption?: string;
165
+ }
166
+ interface AXVoicePayload extends AXMediaItemFields {
201
167
  type: 'voice';
202
- /** Voice recording URL */
203
- url: string;
204
- /** Duration in seconds */
205
168
  duration: number;
206
- /** File size in bytes */
207
- size: number;
208
- /** MIME type */
209
- mimeType?: string;
210
- /** Waveform data for visualization */
211
169
  waveform?: number[];
212
- /** Whether the voice message has been played */
213
170
  played?: boolean;
214
171
  }
215
- /**
216
- * File message payload
217
- */
218
- interface AXFilePayload {
219
- /** Message type */
220
- type: 'file';
221
- /** File download URL */
222
- url: string;
223
- /** File name */
172
+ interface AXFileMediaItem extends AXMediaItemFields {
224
173
  name: string;
225
- /** File size in bytes */
226
- size: number;
227
- /** MIME type */
228
174
  mimeType: string;
229
- /** Optional thumbnail for supported file types */
230
175
  thumbnailUrl?: string;
231
- /** File extension */
232
176
  extension?: string;
233
177
  }
234
- /**
235
- * Location message payload
236
- */
178
+ interface AXFilePayload {
179
+ type: 'file';
180
+ files: AXFileMediaItem[];
181
+ caption?: string;
182
+ }
237
183
  interface AXLocationPayload {
238
- /** Message type */
239
184
  type: 'location';
240
- /** Latitude coordinate */
241
185
  latitude: number;
242
- /** Longitude coordinate */
243
186
  longitude: number;
244
- /** Location name */
245
187
  name?: string;
246
- /** Formatted address */
247
188
  address?: string;
248
- /** Static map image URL */
249
189
  mapImageUrl?: string;
250
- /** Accuracy in meters */
251
190
  accuracy?: number;
252
191
  }
253
- /**
254
- * Sticker message payload
255
- */
256
- interface AXStickerPayload {
257
- /** Message type */
192
+ interface AXStickerPayload extends AXMediaItemFields {
258
193
  type: 'sticker';
259
- /** Sticker unique ID */
260
194
  id: string;
261
- /** Sticker pack ID */
262
195
  packId: string;
263
- /** Sticker image URL */
264
- url: string;
265
- /** Whether sticker is animated */
266
196
  animated: boolean;
267
- /** Sticker width */
268
197
  width?: number;
269
- /** Sticker height */
270
198
  height?: number;
271
- /** Emoji representation */
272
199
  emoji?: string;
273
200
  }
274
- /**
275
- * Poll message payload
276
- */
201
+ interface AXPollOption {
202
+ id: string;
203
+ text: string;
204
+ votes: number;
205
+ voters?: string[];
206
+ }
277
207
  interface AXPollPayload {
278
- /** Message type */
279
208
  type: 'poll';
280
- /** Poll question */
281
209
  question: string;
282
- /** Poll options */
283
210
  options: AXPollOption[];
284
- /** Whether multiple choices are allowed */
285
211
  multipleChoice: boolean;
286
- /** Whether poll is anonymous */
287
212
  anonymous: boolean;
288
- /** Poll expiry date */
289
213
  expiresAt?: Date;
290
- /** Total vote count */
291
214
  totalVotes?: number;
292
215
  }
293
- /**
294
- * Poll option
295
- */
296
- interface AXPollOption {
297
- /** Option ID */
298
- id: string;
299
- /** Option text */
300
- text: string;
301
- /** Vote count */
302
- votes: number;
303
- /** User IDs who voted for this option */
304
- voters?: string[];
305
- }
306
- /**
307
- * System message payload (for notifications, events, etc.)
308
- */
309
216
  interface AXSystemPayload {
310
- /** Message type */
311
217
  type: 'system';
312
- /** System event type */
313
218
  eventType: 'user_joined' | 'user_left' | 'title_changed' | 'avatar_changed' | 'custom';
314
- /** Message text */
315
219
  text: string;
316
- /** Related user IDs */
317
220
  userIds?: string[];
318
- /** Additional data */
319
221
  data?: Record<string, unknown>;
320
222
  }
321
- /**
322
- * Union type of all message payloads
323
- */
324
223
  type AXMessagePayload = AXTextPayload | AXImagePayload | AXVideoPayload | AXAudioPayload | AXVoicePayload | AXFilePayload | AXLocationPayload | AXStickerPayload | AXPollPayload | AXSystemPayload;
325
224
 
326
225
  /**
@@ -353,6 +252,11 @@ interface AXMessage {
353
252
  senderId: string;
354
253
  /** Message type */
355
254
  type: AXMessageType;
255
+ /**
256
+ * File-type catalog name when this message uses a composer file type (image, video, …).
257
+ * Omitted for text, location, system, etc.
258
+ */
259
+ fileType?: string;
356
260
  /** Message creation timestamp */
357
261
  timestamp: Date;
358
262
  /** Type-specific message payload */
@@ -412,6 +316,8 @@ interface AXSendMessageCommand {
412
316
  conversationId: string;
413
317
  /** Message type */
414
318
  type: AXMessageType;
319
+ /** File-type catalog when applicable (see {@link AXMessage.fileType}). */
320
+ fileType?: string;
415
321
  /** Message payload */
416
322
  payload: AXMessagePayload;
417
323
  /** Reply to message ID (optional) */
@@ -506,27 +412,6 @@ interface AXConversationStatus {
506
412
  /** Last seen timestamp (for private chats when offline) */
507
413
  lastSeen?: Date;
508
414
  }
509
- /**
510
- * Conversation permissions
511
- */
512
- interface AXConversationPermissions {
513
- /** Can send messages */
514
- canSendMessages: boolean;
515
- /** Can send media */
516
- canSendMedia: boolean;
517
- /** Can add members (groups) */
518
- canAddMembers: boolean;
519
- /** Can remove members (groups) */
520
- canRemoveMembers: boolean;
521
- /** Can change conversation info */
522
- canEditInfo: boolean;
523
- /** Can pin messages */
524
- canPinMessages: boolean;
525
- /** Can delete messages */
526
- canDeleteMessages: boolean;
527
- /** Custom permissions */
528
- custom?: Record<string, boolean>;
529
- }
530
415
  /**
531
416
  * Conversation settings
532
417
  */
@@ -587,8 +472,6 @@ interface AXConversation {
587
472
  unreadMentions?: number;
588
473
  /** Current status (typing, presence, etc.) */
589
474
  status: AXConversationStatus;
590
- /** User permissions in this conversation */
591
- permissions: AXConversationPermissions;
592
475
  /** User-specific settings */
593
476
  settings: AXConversationSettings;
594
477
  /** Pinned messages IDs */
@@ -661,144 +544,6 @@ interface AXConversationSort {
661
544
  direction: 'asc' | 'desc';
662
545
  }
663
546
 
664
- declare class AXComposerComponent implements OnDestroy {
665
- #private;
666
- private readonly conversationService;
667
- private readonly messageApi;
668
- private readonly composerService;
669
- private readonly messageListService;
670
- private readonly popupService;
671
- private readonly config;
672
- private readonly translation;
673
- /** Access registry through conversation service */
674
- private get registry();
675
- /** Input element reference */
676
- private readonly inputElementRef;
677
- /** Draft text - use service */
678
- readonly draftText: _angular_core.WritableSignal<string>;
679
- /** Attachments - use service */
680
- readonly attachments: _angular_core.WritableSignal<File[]>;
681
- /** Editing message */
682
- readonly editingMessage: _angular_core.WritableSignal<any>;
683
- /** Replying to message */
684
- readonly replyingToMessage: _angular_core.WritableSignal<AXMessage>;
685
- /** Show typing indicator - use service */
686
- readonly showTypingIndicator: _angular_core.WritableSignal<boolean>;
687
- /** Message sent event */
688
- readonly messageSent: _angular_core.OutputEmitterRef<AXSendMessageCommand>;
689
- /** Emoji clicked event */
690
- readonly emojiClick: _angular_core.OutputEmitterRef<void>;
691
- /** Attach clicked event */
692
- readonly attachClick: _angular_core.OutputEmitterRef<void>;
693
- /** Voice clicked event */
694
- readonly voiceClick: _angular_core.OutputEmitterRef<void>;
695
- /** Active conversation */
696
- readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
697
- readonly activeMessages: _angular_core.Signal<AXMessage[]>;
698
- /** Active component from service */
699
- readonly activeComponent: _angular_core.Signal<_acorex_components_conversation2.AXComposerActiveComponent>;
700
- /** Emoji popover state */
701
- private readonly emojiPopoverRef;
702
- readonly emojiPopoverTarget: _angular_core.WritableSignal<HTMLElement>;
703
- readonly composerPopupComponent: typeof AXComposerPopupComponent;
704
- /** Input placeholder - use service */
705
- readonly placeholder: _angular_core.Signal<string>;
706
- /** Sending message state */
707
- readonly sendingMessage: _angular_core.WritableSignal<boolean>;
708
- /** Typing indicator subject for rate limiting */
709
- private readonly typingSubject;
710
- constructor();
711
- private draftSaveTimeout?;
712
- /** Number of input rows - use service */
713
- readonly inputRows: _angular_core.Signal<number>;
714
- /** Can send message - use service */
715
- readonly canSend: _angular_core.Signal<boolean>;
716
- /** Left actions from registry - use service */
717
- readonly leftActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
718
- /** Right actions from registry - use service */
719
- readonly rightActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
720
- /** Left inline actions (location = 'inline' or undefined) */
721
- readonly leftInlineActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
722
- /** Left menu actions (location = 'menu') */
723
- readonly leftMenuActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
724
- /** Right inline actions (location = 'inline' or undefined) */
725
- readonly rightInlineActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
726
- /** Right menu actions (location = 'menu') */
727
- readonly rightMenuActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
728
- /** Handle key down */
729
- onKeyDown(event: AXHtmlEvent<KeyboardEvent>): void;
730
- /** Handle input */
731
- onInput(): void;
732
- /** Send typing indicator (throttled via RxJS) */
733
- private sendTypingIndicator;
734
- /** Cleanup on destroy */
735
- ngOnDestroy(): void;
736
- /** Handle send click */
737
- onSendClick(): Promise<void>;
738
- /** Handle emoji click */
739
- onEmojiClick(event?: MouseEvent): Promise<void>;
740
- /** Handle emoji popover closed */
741
- onEmojiPopoverClosed(): void;
742
- /** Handle emoji/sticker selection from popup */
743
- onEmojiItemSelected(item: string | AXStickerPayload): void;
744
- /** Send sticker message */
745
- private sendSticker;
746
- /** Get inputs for emoji popup component */
747
- getEmojiPopupInputs(): Record<string, unknown>;
748
- /** Handle attach click */
749
- onAttachClick(): void;
750
- /** Handle voice click */
751
- onVoiceClick(): void;
752
- /** Remove attachment */
753
- removeAttachment(index: number): void;
754
- /** Files selected via uploader */
755
- onFilesSelected(e: AXUploaderChangedEvent): Promise<void>;
756
- /**
757
- * Validate file before upload
758
- * @param file - File to validate
759
- * @throws {Error} If file is invalid
760
- */
761
- private validateFile;
762
- /** Cancel edit/reply mode */
763
- cancelEditReply(): void;
764
- /** Reset all composer states (used when switching conversations) */
765
- private resetComposerState;
766
- /** Start editing a message */
767
- startEdit(message: any): void;
768
- /** Start replying to a message */
769
- startReply(message: AXMessage): void;
770
- /** Handle action click */
771
- onActionClick(actionId: string, event?: MouseEvent): Promise<void>;
772
- /** Check if action is enabled */
773
- isActionEnabled(action: any): boolean;
774
- /** Get replying sender name */
775
- getReplyingSenderName(): string;
776
- getActionLabel(action: {
777
- label: string;
778
- }): string;
779
- /** Get replying message text */
780
- getReplyingMessageText(): string;
781
- /** Preview object for replying banner (type, icon, value) */
782
- getReplyingPreview(): {
783
- value: string;
784
- type: string;
785
- icon: string;
786
- } | null;
787
- /** Preview object for editing banner (type, icon, value) */
788
- getEditingPreview(): {
789
- value: string;
790
- type: string;
791
- icon: string;
792
- } | null;
793
- /** Handle reply preview click - scroll to original message */
794
- onReplyPreviewClick(): void;
795
- /** Get inputs for dynamic component */
796
- getComponentInputs(): Record<string, unknown>;
797
- onEnter(event: AXHtmlEvent<KeyboardEvent>): Promise<void>;
798
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXComposerComponent, never>;
799
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXComposerComponent, "ax-conversation-composer", never, {}, { "messageSent": "messageSent"; "emojiClick": "emojiClick"; "attachClick": "attachClick"; "voiceClick": "voiceClick"; }, never, never, true, never>;
800
- }
801
-
802
547
  /**
803
548
  * Abstract Base Registry
804
549
  * Base class for all registries with common functionality
@@ -903,6 +648,14 @@ interface AXComposerActionContext {
903
648
  interface AXComposerActionComponent {
904
649
  readonly conversation: InputSignal<AXConversation>;
905
650
  readonly service?: InputSignal<AXComposerService | undefined>;
651
+ /** Max files per message; falls back to {@link AXConversationConfig.maxFilesPerMessage}. */
652
+ readonly maxFiles?: InputSignal<number | undefined>;
653
+ /** Pre-fill picker when opened from message-list drag-and-drop. */
654
+ readonly initialFiles?: InputSignal<File[]>;
655
+ /** Set by {@link AXPopupService} when the picker is shown in a popup. */
656
+ readonly __popup__?: InputSignal<_acorex_components_popup.AXPopupRef | undefined>;
657
+ /** Cancel in-flight uploads when the picker is closed or replaced. */
658
+ abortInProgressUploads?(): void;
906
659
  }
907
660
  /**
908
661
  * Composer action registration
@@ -939,7 +692,13 @@ interface AXComposerAction extends Omit<AXRegistryItem, 'enabled'> {
939
692
  className?: string;
940
693
  /** Badge text/count */
941
694
  badge?: string | number;
695
+ /** File catalog for this action's picker; built-ins use {@link provideConversationComposerFileTypes}. */
696
+ fileType?: string;
697
+ /** Max files per message; falls back to {@link AXConversationConfig.maxFilesPerMessage}. */
698
+ maxFiles?: number;
942
699
  }
700
+ /** Validation rules and built-in conversation file types. */
701
+ declare function provideConversationFileCatalog(_extraActions?: readonly AXComposerAction[]): Provider[];
943
702
  /**
944
703
  * Composer Action Registry Service
945
704
  */
@@ -947,6 +706,7 @@ declare class AXComposerActionRegistry {
947
706
  private readonly _actions;
948
707
  private readonly translation;
949
708
  private readonly injector;
709
+ private readonly fileTypeRegistry;
950
710
  constructor();
951
711
  /** All registered actions */
952
712
  readonly actions: _angular_core.Signal<AXComposerAction[]>;
@@ -966,6 +726,7 @@ declare class AXComposerActionRegistry {
966
726
  * Register a composer action
967
727
  */
968
728
  register(action: AXComposerAction): void;
729
+ private ensureFileTypeExists;
969
730
  /**
970
731
  * Unregister a composer action
971
732
  */
@@ -979,6 +740,14 @@ declare class AXComposerActionRegistry {
979
740
  */
980
741
  getEnabledActions(position: 'left' | 'right', context: AXComposerActionContext): AXComposerAction[];
981
742
  isActionEnabled(action: AXComposerAction, context: AXComposerActionContext): boolean;
743
+ /**
744
+ * Picker actions for a file catalog (by priority), when visible and enabled.
745
+ */
746
+ findPickerActionsForFileType(catalogName: string, context: AXComposerActionContext): AXComposerAction[];
747
+ /**
748
+ * First picker action for a file catalog (by priority), when visible and enabled.
749
+ */
750
+ findPickerActionForFileType(catalogName: string, context: AXComposerActionContext): AXComposerAction | undefined;
982
751
  /**
983
752
  * Get action by ID
984
753
  */
@@ -1310,95 +1079,8 @@ declare class AXInfoBarActionRegistry extends AXBaseRegistry<AXInfoBarAction> {
1310
1079
  }
1311
1080
 
1312
1081
  /**
1313
- * Action context provided to handlers
1314
- */
1315
- interface AXMessageActionContext {
1316
- /** The message */
1317
- message: AXMessage;
1318
- /** Current user */
1319
- currentUser: AXParticipant;
1320
- /** All conversation participants */
1321
- participants: AXParticipant[];
1322
- /** Custom context data */
1323
- custom?: Record<string, unknown>;
1324
- }
1325
- /**
1326
- * Message action registration
1327
- */
1328
- interface AXMessageAction extends Omit<AXRegistryItem, 'enabled'> {
1329
- /** Display label */
1330
- label: string;
1331
- /** Icon name/class */
1332
- icon?: string;
1333
- /** Show as inline button */
1334
- showInline?: boolean;
1335
- /** Visibility condition */
1336
- visible: (message: AXMessage, currentUser: AXParticipant) => boolean;
1337
- /** Enabled condition */
1338
- enabled: (message: AXMessage, currentUser: AXParticipant) => boolean;
1339
- /** Action handler */
1340
- handler: (context: AXMessageActionContext) => void | Promise<void>;
1341
- /** Confirmation message (if required) */
1342
- confirmMessage?: string;
1343
- /** Keyboard shortcut */
1344
- shortcut?: string;
1345
- /** Custom class for styling */
1346
- className?: string;
1347
- /** Destructive action (shows warning) */
1348
- destructive?: boolean;
1349
- }
1350
- /**
1351
- * Message Action Registry Service
1352
- */
1353
- declare class AXMessageActionRegistry {
1354
- private readonly _actions;
1355
- private readonly translation;
1356
- private readonly injector;
1357
- constructor();
1358
- /** All registered actions */
1359
- readonly actions: _angular_core.Signal<AXMessageAction[]>;
1360
- /** Actions sorted by priority */
1361
- readonly sortedActions: _angular_core.Signal<AXMessageAction[]>;
1362
- /**
1363
- * Register a message action
1364
- */
1365
- register(action: AXMessageAction): void;
1366
- /**
1367
- * Unregister a message action
1368
- */
1369
- unregister(id: string): void;
1370
- /**
1371
- * Get all actions for a specific message
1372
- */
1373
- getActions(message: AXMessage, currentUser: AXParticipant): AXMessageAction[];
1374
- /**
1375
- * Get menu actions for a message
1376
- */
1377
- getMenuActions(message: AXMessage, currentUser: AXParticipant): AXMessageAction[];
1378
- getActionLabel(action: AXMessageAction): string;
1379
- /**
1380
- * Get inline actions for a message
1381
- */
1382
- getInlineActions(message: AXMessage, currentUser: AXParticipant): AXMessageAction[];
1383
- /**
1384
- * Get action by ID
1385
- */
1386
- getActionById(id: string): AXMessageAction | undefined;
1387
- /**
1388
- * Execute an action
1389
- */
1390
- executeAction(actionId: string, context: AXMessageActionContext): Promise<void>;
1391
- /**
1392
- * Clear all actions
1393
- */
1394
- clear(): void;
1395
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXMessageActionRegistry, never>;
1396
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXMessageActionRegistry>;
1397
- }
1398
-
1399
- /**
1400
- * Message Renderer Registry
1401
- * Register custom message renderers for different message types
1082
+ * Message Renderer Registry
1083
+ * Register custom message renderers for different message types
1402
1084
  */
1403
1085
 
1404
1086
  /**
@@ -1439,6 +1121,8 @@ interface AXMessageRendererState {
1439
1121
  interface AXMessageRendererComponent {
1440
1122
  readonly message: InputSignal<AXMessage>;
1441
1123
  readonly rendererState: Signal<AXMessageRendererState>;
1124
+ /** Plain-text copy for this message (does not write to the clipboard). */
1125
+ copy?(): string | Promise<string>;
1442
1126
  }
1443
1127
  /**
1444
1128
  * Contract for components used as {@link AXMessageRenderer.infoBarBanner}.
@@ -1468,6 +1152,8 @@ interface AXMessageRenderer {
1468
1152
  displayName?: string;
1469
1153
  /** Icon name/class */
1470
1154
  icon?: string;
1155
+ /** Linked file type catalog name (for utility APIs like preview/duration). */
1156
+ fileType?: string;
1471
1157
  /**
1472
1158
  * Optional composer actions co-located with this message type (e.g. pickers that produce this message).
1473
1159
  * Registered with {@link AXComposerActionRegistry} when the renderer is registered.
@@ -1519,116 +1205,370 @@ declare class AXMessageRendererRegistry {
1519
1205
  }
1520
1206
 
1521
1207
  /**
1522
- * Active component state in composer
1208
+ * Action context provided to handlers
1523
1209
  */
1524
- interface AXComposerActiveComponent {
1525
- /** Action that triggered this component */
1526
- action: AXComposerAction;
1527
- /** Component to render */
1528
- component: Type<unknown>;
1529
- /** Component inputs */
1530
- inputs?: Record<string, unknown>;
1210
+ interface AXMessageActionContext {
1211
+ /** The message */
1212
+ message: AXMessage;
1213
+ /** Current user */
1214
+ currentUser: AXParticipant;
1215
+ /** All conversation participants */
1216
+ participants: AXParticipant[];
1217
+ /** Mounted message renderer for this row (see {@link AXMessageRendererComponent.copy}). */
1218
+ renderer?: AXMessageRendererComponent;
1219
+ /** Custom context data */
1220
+ custom?: Record<string, unknown>;
1531
1221
  }
1532
- declare class AXComposerService {
1533
- private readonly conversationService;
1222
+ /**
1223
+ * Message action registration
1224
+ */
1225
+ interface AXMessageAction extends Omit<AXRegistryItem, 'enabled'> {
1226
+ /** Display label */
1227
+ label: string;
1228
+ /** Icon name/class */
1229
+ icon?: string;
1230
+ /** Show as inline button */
1231
+ showInline?: boolean;
1232
+ /** Visibility condition */
1233
+ visible: (message: AXMessage, currentUser: AXParticipant) => boolean;
1234
+ /** Enabled condition */
1235
+ enabled: (message: AXMessage, currentUser: AXParticipant) => boolean;
1236
+ /** Action handler */
1237
+ handler: (context: AXMessageActionContext) => void | Promise<void>;
1238
+ /** Confirmation message (if required) */
1239
+ confirmMessage?: string;
1240
+ /** Keyboard shortcut */
1241
+ shortcut?: string;
1242
+ /** Custom class for styling */
1243
+ className?: string;
1244
+ /** Destructive action (shows warning) */
1245
+ destructive?: boolean;
1246
+ }
1247
+ /**
1248
+ * Message Action Registry Service
1249
+ */
1250
+ declare class AXMessageActionRegistry {
1251
+ private readonly _actions;
1534
1252
  private readonly translation;
1535
- private get registry();
1536
- private readonly _replyMessage;
1537
- private readonly _editMessage;
1538
- readonly replyMessage: _angular_core.Signal<AXMessage>;
1539
- readonly editMessage: _angular_core.Signal<AXMessage>;
1540
- readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
1541
- readonly activeMessages: _angular_core.Signal<AXMessage[]>;
1542
- /** Active component being shown in composer (full-width mode) */
1543
- private readonly _activeComponent;
1544
- readonly activeComponent: _angular_core.Signal<AXComposerActiveComponent>;
1545
- /** Draft text */
1546
- readonly draftText: _angular_core.WritableSignal<string>;
1547
- /** Attachments */
1548
- readonly attachments: _angular_core.WritableSignal<File[]>;
1549
- /** Show typing indicator */
1550
- readonly showTypingIndicator: _angular_core.WritableSignal<boolean>;
1551
- /** Input placeholder */
1552
- readonly placeholder: _angular_core.Signal<string>;
1553
- /** Number of input rows */
1554
- readonly inputRows: _angular_core.Signal<number>;
1555
- /** Can send message */
1556
- readonly canSend: _angular_core.Signal<boolean>;
1557
- /** Composer action context */
1558
- readonly actionContext: _angular_core.Signal<AXComposerActionContext>;
1559
- /** Left actions from registry */
1560
- readonly leftActions: _angular_core.Signal<AXComposerAction[]>;
1561
- /** Right actions from registry */
1562
- readonly rightActions: _angular_core.Signal<AXComposerAction[]>;
1563
- /** Left inline actions (location = 'inline' or undefined) */
1564
- readonly leftInlineActions: _angular_core.Signal<AXComposerAction[]>;
1565
- /** Left menu actions (location = 'menu') */
1566
- readonly leftMenuActions: _angular_core.Signal<AXComposerAction[]>;
1567
- /** Right inline actions (location = 'inline' or undefined) */
1568
- readonly rightInlineActions: _angular_core.Signal<AXComposerAction[]>;
1569
- /** Right menu actions (location = 'menu') */
1570
- readonly rightMenuActions: _angular_core.Signal<AXComposerAction[]>;
1571
- startReply(message: AXMessage): void;
1572
- startEdit(message: AXMessage): void;
1573
- clear(): void;
1574
- sendTypingIndicator(conversationId: string): Promise<void>;
1575
- sendMessage(command: AXSendMessageCommand): Promise<void>;
1253
+ private readonly injector;
1254
+ constructor();
1255
+ /** All registered actions */
1256
+ readonly actions: _angular_core.Signal<AXMessageAction[]>;
1257
+ /** Actions sorted by priority */
1258
+ readonly sortedActions: _angular_core.Signal<AXMessageAction[]>;
1576
1259
  /**
1577
- * Show a component in the composer (full-width mode)
1260
+ * Register a message action
1578
1261
  */
1579
- showComponent(action: AXComposerAction, inputs?: Record<string, unknown>): void;
1262
+ register(action: AXMessageAction): void;
1580
1263
  /**
1581
- * Hide the active component
1264
+ * Unregister a message action
1582
1265
  */
1583
- hideComponent(): void;
1266
+ unregister(id: string): void;
1584
1267
  /**
1585
- * Toggle component visibility
1268
+ * Get all actions for a specific message
1586
1269
  */
1587
- toggleComponent(action: AXComposerAction, inputs?: Record<string, unknown>): void;
1270
+ getActions(message: AXMessage, currentUser: AXParticipant): AXMessageAction[];
1588
1271
  /**
1589
- * Get actions for the active conversation
1272
+ * Get menu actions for a message
1590
1273
  */
1591
- getActionsForPosition(position: 'left' | 'right', context: AXComposerActionContext): AXComposerAction[];
1274
+ getMenuActions(message: AXMessage, currentUser: AXParticipant): AXMessageAction[];
1275
+ /** Whether an action is enabled (safe to call outside an injection context). */
1276
+ isActionEnabled(action: AXMessageAction, message: AXMessage, currentUser: AXParticipant): boolean;
1277
+ getActionLabel(action: AXMessageAction): string;
1592
1278
  /**
1593
- * Execute an action
1279
+ * Get inline actions for a message
1594
1280
  */
1595
- executeAction(actionId: string, context: AXComposerActionContext): Promise<void>;
1281
+ getInlineActions(message: AXMessage, currentUser: AXParticipant): AXMessageAction[];
1596
1282
  /**
1597
- * Save draft to localStorage
1283
+ * Get action by ID
1598
1284
  */
1599
- saveDraft(conversationId: string, text: string): void;
1285
+ getActionById(id: string): AXMessageAction | undefined;
1600
1286
  /**
1601
- * Load draft from localStorage
1287
+ * Execute an action
1602
1288
  */
1603
- loadDraft(conversationId: string): string;
1289
+ executeAction(actionId: string, context: AXMessageActionContext): Promise<void>;
1604
1290
  /**
1605
- * Clear draft from localStorage
1291
+ * Clear all actions
1606
1292
  */
1607
- clearDraft(conversationId: string): void;
1608
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXComposerService, never>;
1609
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXComposerService>;
1610
- }
1611
-
1612
- declare class AXConversationContainerComponent {
1613
- private readonly conversationService;
1614
- protected readonly config: Required<_acorex_components_conversation2.AXConversationConfig>;
1615
- /** Custom CSS class */
1616
- readonly customClass: _angular_core.InputSignal<string>;
1617
- /** Loading state */
1618
- readonly loading: _angular_core.Signal<boolean>;
1619
- /** Error state */
1620
- readonly error: _angular_core.Signal<Error>;
1621
- /** Active conversation */
1622
- readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
1623
- /** Container CSS classes */
1624
- readonly containerClasses: _angular_core.Signal<string>;
1625
- closeActiveConversation(): void;
1626
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationContainerComponent, never>;
1627
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationContainerComponent, "ax-conversation-container", never, { "customClass": { "alias": "customClass"; "required": false; "isSignal": true; }; }, {}, never, ["ax-conversation-sidebar, [ax-conversation-sidebar]", "ax-conversation-info-bar, [ax-conversation-info-bar]", "ax-conversation-message-list, [ax-conversation-message-list]", "ax-conversation-composer, [ax-conversation-composer]", "ax-conversation-empty"], true, never>;
1293
+ clear(): void;
1294
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXMessageActionRegistry, never>;
1295
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXMessageActionRegistry>;
1628
1296
  }
1629
1297
 
1630
- declare class AXConversationContainerDirective {
1298
+ declare class AXComposerComponent implements OnDestroy {
1299
+ #private;
1631
1300
  private readonly conversationService;
1301
+ private readonly composerService;
1302
+ private readonly messageListService;
1303
+ private readonly config;
1304
+ private readonly translation;
1305
+ /** Access registry through conversation service */
1306
+ private get registry();
1307
+ /** Composer text area reference */
1308
+ private readonly textAreaRef;
1309
+ /** Draft text - use service */
1310
+ readonly draftText: _angular_core.WritableSignal<string>;
1311
+ /** Attachments - use service */
1312
+ readonly attachments: _angular_core.WritableSignal<File[]>;
1313
+ /** Editing message */
1314
+ readonly editingMessage: _angular_core.WritableSignal<any>;
1315
+ /** Replying to message */
1316
+ readonly replyingToMessage: _angular_core.WritableSignal<AXMessage>;
1317
+ /** Show typing indicator - use service */
1318
+ readonly showTypingIndicator: _angular_core.WritableSignal<boolean>;
1319
+ /** Message sent event */
1320
+ readonly messageSent: _angular_core.OutputEmitterRef<AXSendMessageCommand>;
1321
+ /** Emoji clicked event */
1322
+ readonly emojiClick: _angular_core.OutputEmitterRef<void>;
1323
+ /** Attach clicked event */
1324
+ readonly attachClick: _angular_core.OutputEmitterRef<void>;
1325
+ /** Voice clicked event */
1326
+ readonly voiceClick: _angular_core.OutputEmitterRef<void>;
1327
+ /** Active conversation */
1328
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
1329
+ readonly activeMessages: _angular_core.Signal<AXMessage[]>;
1330
+ /** Active component from service */
1331
+ readonly activeComponent: _angular_core.Signal<_acorex_components_conversation2.AXComposerActiveComponent>;
1332
+ /** Emoji popover state */
1333
+ private readonly emojiPopoverRef;
1334
+ readonly emojiPopoverTarget: _angular_core.WritableSignal<HTMLElement>;
1335
+ readonly composerPopupComponent: typeof AXComposerPopupComponent;
1336
+ /** Input placeholder - use service */
1337
+ readonly placeholder: _angular_core.Signal<string>;
1338
+ /** Sending message state */
1339
+ readonly sendingMessage: _angular_core.WritableSignal<boolean>;
1340
+ /** Typing indicator subject for rate limiting */
1341
+ private readonly typingSubject;
1342
+ constructor();
1343
+ private draftSaveTimeout?;
1344
+ /** Number of input rows - use service */
1345
+ readonly inputRows: _angular_core.Signal<number>;
1346
+ /** Can send message - use service */
1347
+ readonly canSend: _angular_core.Signal<boolean>;
1348
+ /** Left actions from registry - use service */
1349
+ readonly leftActions: _angular_core.Signal<AXComposerAction[]>;
1350
+ /** Right actions from registry - use service */
1351
+ readonly rightActions: _angular_core.Signal<AXComposerAction[]>;
1352
+ /** Left inline actions (location = 'inline' or undefined) */
1353
+ readonly leftInlineActions: _angular_core.Signal<AXComposerAction[]>;
1354
+ /** Left menu actions (location = 'menu') */
1355
+ readonly leftMenuActions: _angular_core.Signal<AXComposerAction[]>;
1356
+ /** Right inline actions (location = 'inline' or undefined) */
1357
+ readonly rightInlineActions: _angular_core.Signal<AXComposerAction[]>;
1358
+ /** Right menu actions (location = 'menu') */
1359
+ readonly rightMenuActions: _angular_core.Signal<AXComposerAction[]>;
1360
+ /** Handle key down */
1361
+ onKeyDown(event: AXHtmlEvent<KeyboardEvent>): void;
1362
+ /** Handle input */
1363
+ onInput(): void;
1364
+ /** Send typing indicator (throttled via RxJS) */
1365
+ private sendTypingIndicator;
1366
+ /** Cleanup on destroy */
1367
+ ngOnDestroy(): void;
1368
+ /** Handle send click */
1369
+ onSendClick(): Promise<void>;
1370
+ /** Handle emoji click */
1371
+ onEmojiClick(event?: MouseEvent): Promise<void>;
1372
+ /** Handle emoji popover closed */
1373
+ onEmojiPopoverClosed(): void;
1374
+ /** Handle emoji/sticker selection from popup */
1375
+ onEmojiItemSelected(item: string | AXStickerPayload): void;
1376
+ /** Send sticker message */
1377
+ private sendSticker;
1378
+ /** Get inputs for emoji popup component */
1379
+ getEmojiPopupInputs(): Record<string, unknown>;
1380
+ /** Handle attach click */
1381
+ onAttachClick(): void;
1382
+ /** Handle voice click */
1383
+ onVoiceClick(): void;
1384
+ /** Remove attachment */
1385
+ removeAttachment(index: number): void;
1386
+ /** Cancel edit/reply mode */
1387
+ cancelEditReply(): void;
1388
+ /** Start editing a message */
1389
+ startEdit(message: any): void;
1390
+ /** Start replying to a message */
1391
+ startReply(message: AXMessage): void;
1392
+ /** Focus the native textarea inside ax-text-area */
1393
+ private focusTextArea;
1394
+ /** Handle action click */
1395
+ onActionClick(actionId: string, event?: MouseEvent): Promise<void>;
1396
+ /** Check if action is enabled */
1397
+ isActionEnabled(action: any): boolean;
1398
+ /** Get replying sender name */
1399
+ getReplyingSenderName(): string;
1400
+ getActionLabel(action: {
1401
+ label: string;
1402
+ }): string;
1403
+ /** Get replying message text */
1404
+ getReplyingMessageText(): string;
1405
+ /** Preview object for replying banner (type, icon, value) */
1406
+ getReplyingPreview(): {
1407
+ value: string;
1408
+ type: string;
1409
+ icon: string;
1410
+ } | null;
1411
+ /** Preview object for editing banner (type, icon, value) */
1412
+ getEditingPreview(): {
1413
+ value: string;
1414
+ type: string;
1415
+ icon: string;
1416
+ } | null;
1417
+ getComposerPreviewLabel(preview: {
1418
+ value: string;
1419
+ type: string;
1420
+ }): string;
1421
+ /** Handle reply preview click - scroll to original message */
1422
+ onReplyPreviewClick(): void;
1423
+ /** Inputs for picker / full-width composer components */
1424
+ private buildPickerInputs;
1425
+ /** Get inputs for dynamic component */
1426
+ getComponentInputs(): Record<string, unknown>;
1427
+ onEnter(event: AXHtmlEvent<KeyboardEvent>): Promise<void>;
1428
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXComposerComponent, never>;
1429
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXComposerComponent, "ax-conversation-composer", never, {}, { "messageSent": "messageSent"; "emojiClick": "emojiClick"; "attachClick": "attachClick"; "voiceClick": "voiceClick"; }, never, never, true, never>;
1430
+ }
1431
+
1432
+ /**
1433
+ * Active component state in composer
1434
+ */
1435
+ interface AXComposerActiveComponent {
1436
+ /** Action that triggered this component */
1437
+ action: AXComposerAction;
1438
+ /** Component to render */
1439
+ component: Type<unknown>;
1440
+ /** Component inputs */
1441
+ inputs?: Record<string, unknown>;
1442
+ }
1443
+ declare class AXComposerService {
1444
+ private readonly conversationService;
1445
+ private readonly translation;
1446
+ private get registry();
1447
+ private readonly _replyMessage;
1448
+ private readonly _editMessage;
1449
+ readonly replyMessage: _angular_core.Signal<AXMessage>;
1450
+ readonly editMessage: _angular_core.Signal<AXMessage>;
1451
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
1452
+ readonly activeMessages: _angular_core.Signal<AXMessage[]>;
1453
+ /** Active component being shown in composer (full-width mode) */
1454
+ private readonly _activeComponent;
1455
+ readonly activeComponent: _angular_core.Signal<AXComposerActiveComponent>;
1456
+ /** Draft text */
1457
+ readonly draftText: _angular_core.WritableSignal<string>;
1458
+ /** Attachments */
1459
+ readonly attachments: _angular_core.WritableSignal<File[]>;
1460
+ /** Show typing indicator */
1461
+ readonly showTypingIndicator: _angular_core.WritableSignal<boolean>;
1462
+ /** Incremented to request focus on the composer text area (handled by AXComposerComponent). */
1463
+ private readonly _focusRequest;
1464
+ readonly focusRequest: _angular_core.Signal<number>;
1465
+ /** Input placeholder */
1466
+ readonly placeholder: _angular_core.Signal<string>;
1467
+ /** Number of input rows */
1468
+ readonly inputRows: _angular_core.Signal<number>;
1469
+ /** Can send message */
1470
+ readonly canSend: _angular_core.Signal<boolean>;
1471
+ /** Composer action context */
1472
+ readonly actionContext: _angular_core.Signal<AXComposerActionContext>;
1473
+ /** Left actions from registry */
1474
+ readonly leftActions: _angular_core.Signal<AXComposerAction[]>;
1475
+ /** Right actions from registry */
1476
+ readonly rightActions: _angular_core.Signal<AXComposerAction[]>;
1477
+ /** Left inline actions (location = 'inline' or undefined) */
1478
+ readonly leftInlineActions: _angular_core.Signal<AXComposerAction[]>;
1479
+ /** Left menu actions (location = 'menu') */
1480
+ readonly leftMenuActions: _angular_core.Signal<AXComposerAction[]>;
1481
+ /** Right inline actions (location = 'inline' or undefined) */
1482
+ readonly rightInlineActions: _angular_core.Signal<AXComposerAction[]>;
1483
+ /** Right menu actions (location = 'menu') */
1484
+ readonly rightMenuActions: _angular_core.Signal<AXComposerAction[]>;
1485
+ startReply(message: AXMessage): void;
1486
+ startEdit(message: AXMessage): void;
1487
+ /** Focus the composer text area when the composer component is mounted. */
1488
+ focusComposer(): void;
1489
+ clear(): void;
1490
+ /**
1491
+ * Persist draft for the previous conversation and reset composer UI state when switching conversations.
1492
+ */
1493
+ onConversationChanged(previousConversationId: string | null, currentConversationId: string | null): void;
1494
+ sendTypingIndicator(conversationId: string): Promise<void>;
1495
+ sendMessage(command: AXSendMessageCommand, options?: AXSendMessageOptions): Promise<void>;
1496
+ /**
1497
+ * Show a component in the composer (full-width mode)
1498
+ */
1499
+ showComponent(action: AXComposerAction, inputs?: Record<string, unknown>): void;
1500
+ /**
1501
+ * Hide the active component
1502
+ */
1503
+ hideComponent(): void;
1504
+ /**
1505
+ * Toggle component visibility
1506
+ */
1507
+ toggleComponent(action: AXComposerAction, inputs?: Record<string, unknown>): void;
1508
+ /**
1509
+ * Get actions for the active conversation
1510
+ */
1511
+ getActionsForPosition(position: 'left' | 'right', context: AXComposerActionContext): AXComposerAction[];
1512
+ /**
1513
+ * Execute an action
1514
+ */
1515
+ executeAction(actionId: string, context: AXComposerActionContext): Promise<void>;
1516
+ /**
1517
+ * Save draft to localStorage
1518
+ */
1519
+ saveDraft(conversationId: string, text: string): void;
1520
+ /**
1521
+ * Load draft from localStorage
1522
+ */
1523
+ loadDraft(conversationId: string): string;
1524
+ /**
1525
+ * Clear draft from localStorage
1526
+ */
1527
+ clearDraft(conversationId: string): void;
1528
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXComposerService, never>;
1529
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXComposerService>;
1530
+ }
1531
+
1532
+ declare class AXConversationContainerComponent {
1533
+ private readonly conversationService;
1534
+ private readonly composerService;
1535
+ private readonly fileService;
1536
+ private readonly translation;
1537
+ private readonly toast;
1538
+ private readonly hostRef;
1539
+ private readonly platformId;
1540
+ protected readonly config: Required<_acorex_components_conversation2.AXConversationConfig>;
1541
+ private get registry();
1542
+ /** Custom CSS class */
1543
+ readonly customClass: _angular_core.InputSignal<string>;
1544
+ /** Loading state */
1545
+ readonly loading: _angular_core.Signal<boolean>;
1546
+ /** Error state */
1547
+ readonly error: _angular_core.Signal<Error>;
1548
+ /** Active conversation */
1549
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
1550
+ /** Container CSS classes */
1551
+ readonly containerClasses: _angular_core.Signal<string>;
1552
+ closeActiveConversation(): void;
1553
+ /**
1554
+ * When the user pastes files copied from the OS (e.g. Ctrl+V after copying in Explorer),
1555
+ * open the same composer picker popup used for message-list drag-and-drop.
1556
+ */
1557
+ onDocumentPaste(event: ClipboardEvent): Promise<void>;
1558
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationContainerComponent, never>;
1559
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationContainerComponent, "ax-conversation-container", never, { "customClass": { "alias": "customClass"; "required": false; "isSignal": true; }; }, {}, never, ["ax-conversation-sidebar, [ax-conversation-sidebar]", "ax-conversation-info-bar, [ax-conversation-info-bar]", "ax-conversation-message-list, [ax-conversation-message-list]", "ax-conversation-composer, [ax-conversation-composer]", "ax-conversation-empty"], true, never>;
1560
+ }
1561
+
1562
+ declare class AXConversationContainerDirective {
1563
+ private readonly conversationService;
1564
+ private readonly composerService;
1565
+ private readonly fileService;
1566
+ private readonly hostRef;
1567
+ private readonly platformId;
1568
+ private readonly translation;
1569
+ private readonly toast;
1570
+ private readonly config;
1571
+ private get registry();
1632
1572
  /** Active conversation */
1633
1573
  readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
1634
1574
  /** Loading state */
@@ -1636,6 +1576,7 @@ declare class AXConversationContainerDirective {
1636
1576
  /** Error state */
1637
1577
  readonly error: _angular_core.Signal<Error>;
1638
1578
  closeActiveConversation(): void;
1579
+ onDocumentPaste(event: ClipboardEvent): Promise<void>;
1639
1580
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationContainerDirective, never>;
1640
1581
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXConversationContainerDirective, "[axConversationContainer]", never, {}, {}, never, never, true, never>;
1641
1582
  }
@@ -1681,10 +1622,6 @@ declare class AXInfoBarComponent {
1681
1622
  getStatus(conversation: AXConversation): 'online' | 'offline' | 'away' | undefined;
1682
1623
  /** Get subtitle text - delegate to utils */
1683
1624
  getSubtitle(conversation: AXConversation): string;
1684
- /** Get initials from name - delegate to utils */
1685
- getInitials(name: string): string;
1686
- getConversationAvatar(conversation: AXConversation): string | undefined;
1687
- getConversationAvatarIcon(conversation: AXConversation): string | undefined;
1688
1625
  /** Handle avatar click */
1689
1626
  onAvatarClick(): void;
1690
1627
  /** Handle members click - open popover */
@@ -1750,7 +1687,10 @@ declare class AXInfoBarService {
1750
1687
  /** Current search result index */
1751
1688
  private readonly _currentSearchIndex;
1752
1689
  readonly currentSearchIndex: _angular_core.Signal<number>;
1753
- constructor();
1690
+ /**
1691
+ * Reset info-bar overlays when the active conversation changes.
1692
+ */
1693
+ onConversationChanged(): void;
1754
1694
  /**
1755
1695
  * Get actions for the active conversation
1756
1696
  */
@@ -1855,6 +1795,14 @@ interface AXPaginatedResult<T> {
1855
1795
  /** Total pages */
1856
1796
  totalPages?: number;
1857
1797
  }
1798
+ /**
1799
+ * Pagination cursor state for a single list (conversations or messages).
1800
+ */
1801
+ interface AXPaginationState {
1802
+ page: number;
1803
+ hasMore: boolean;
1804
+ nextCursor?: string;
1805
+ }
1858
1806
  /**
1859
1807
  * Connection status
1860
1808
  */
@@ -1970,8 +1918,6 @@ interface AXParticipantUpdate {
1970
1918
  userId: string;
1971
1919
  /** New role */
1972
1920
  role?: AXUserRole;
1973
- /** Custom permissions */
1974
- permissions?: Record<string, boolean>;
1975
1921
  }
1976
1922
  /**
1977
1923
  * Abstract Conversation Management API
@@ -2130,7 +2076,7 @@ declare abstract class AXConversationApi {
2130
2076
  */
2131
2077
  abstract leaveConversation(conversationId: string): Promise<void>;
2132
2078
  /**
2133
- * Update participant role/permissions
2079
+ * Update participant role
2134
2080
  *
2135
2081
  * @param conversationId - Conversation ID
2136
2082
  * @param update - Participant update data
@@ -2211,22 +2157,6 @@ declare abstract class AXConversationApi {
2211
2157
  * @throws {AXApiError} If request fails
2212
2158
  */
2213
2159
  abstract getConversationTags(conversationId: string): Promise<string[]>;
2214
- /**
2215
- * Get conversation permissions for current user
2216
- *
2217
- * @param conversationId - Conversation ID
2218
- * @returns User permissions
2219
- * @throws {AXApiError} If request fails
2220
- */
2221
- abstract getConversationPermissions(conversationId: string): Promise<Record<string, boolean>>;
2222
- /**
2223
- * Update conversation permissions
2224
- *
2225
- * @param conversationId - Conversation ID
2226
- * @param permissions - Permissions to update
2227
- * @throws {AXApiError} If update fails
2228
- */
2229
- abstract updateConversationPermissions(conversationId: string, permissions: Record<string, boolean>): Promise<void>;
2230
2160
  /**
2231
2161
  * Save draft message for conversation
2232
2162
  *
@@ -2527,21 +2457,6 @@ declare abstract class AXMessageApi {
2527
2457
  * @throws {AXApiError} If stopping fails
2528
2458
  */
2529
2459
  abstract stopTypingIndicator(conversationId: string): Promise<void>;
2530
- /**
2531
- * Upload a file/media
2532
- *
2533
- * @param file - File to upload
2534
- * @param conversationId - Conversation ID for context
2535
- * @returns Upload result with URL and metadata
2536
- * @throws {AXApiError} If upload fails
2537
- */
2538
- abstract uploadFile(file: File, conversationId: string): Promise<{
2539
- url: string;
2540
- thumbnailUrl?: string;
2541
- size: number;
2542
- mimeType: string;
2543
- metadata?: Record<string, unknown>;
2544
- }>;
2545
2460
  /**
2546
2461
  * Update message metadata
2547
2462
  *
@@ -3148,6 +3063,13 @@ declare class AXRegistryService {
3148
3063
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXRegistryService>;
3149
3064
  }
3150
3065
 
3066
+ /** Result of loading a message page (newest-first APIs, merged ascending in the store). */
3067
+ interface AXLoadMessagesResult {
3068
+ items: AXMessage[];
3069
+ hasMore: boolean;
3070
+ page: number;
3071
+ nextCursor?: string;
3072
+ }
3151
3073
  /**
3152
3074
  * Main Conversation Service
3153
3075
  *
@@ -3165,6 +3087,9 @@ declare class AXConversationService {
3165
3087
  readonly conversationApi: AXConversationApi;
3166
3088
  readonly messageApi: AXMessageApi;
3167
3089
  readonly realtimeApi: AXRealtimeApi;
3090
+ readonly uploader: AXUploaderService;
3091
+ private readonly fileService;
3092
+ private readonly platformId;
3168
3093
  private readonly errorHandler;
3169
3094
  readonly dialogService: AXDialogService;
3170
3095
  readonly popupService: AXPopupService;
@@ -3175,7 +3100,10 @@ declare class AXConversationService {
3175
3100
  readonly registry: AXRegistryService;
3176
3101
  private readonly _activeConversationId;
3177
3102
  private readonly _loading;
3103
+ private readonly _loadingActiveMessages;
3178
3104
  private readonly _error;
3105
+ private readonly _conversationsPagination;
3106
+ private readonly _messagesPaginationByConversation;
3179
3107
  /** Emits when the active conversation changes, cancelling per-conversation subscriptions. */
3180
3108
  private readonly _conversationSwitch$;
3181
3109
  private readonly _messageReceived$;
@@ -3191,8 +3119,14 @@ declare class AXConversationService {
3191
3119
  readonly activeConversation: _angular_core.Signal<AXConversation>;
3192
3120
  /** Messages for active conversation */
3193
3121
  readonly activeMessages: _angular_core.Signal<AXMessage[]>;
3194
- /** Loading state */
3122
+ /** Loading state (conversation list initial load) */
3195
3123
  readonly loading: _angular_core.Signal<boolean>;
3124
+ /** Loading state for the active conversation's message history */
3125
+ readonly loadingActiveMessages: _angular_core.Signal<boolean>;
3126
+ /** Sidebar conversation list pagination */
3127
+ readonly conversationsPagination: _angular_core.Signal<AXPaginationState>;
3128
+ /** Active conversation message pagination */
3129
+ readonly activeMessagesPagination: _angular_core.Signal<AXPaginationState>;
3196
3130
  /** Error state */
3197
3131
  readonly error: _angular_core.Signal<Error>;
3198
3132
  /** Connection status */
@@ -3243,13 +3177,25 @@ declare class AXConversationService {
3243
3177
  * Load messages for a conversation
3244
3178
  * Fetches messages from server with request cancellation support
3245
3179
  */
3246
- loadMessages(conversationId: string, page?: number): Promise<AXMessage[]>;
3180
+ loadMessages(conversationId: string, page?: number): Promise<AXLoadMessagesResult>;
3181
+ /** Reset sidebar conversation pagination (e.g. after filters change). */
3182
+ resetConversationsPagination(): void;
3247
3183
  /**
3248
- * Send a message
3249
- * Uses optimistic UI updates - message appears immediately
3250
- * Improved with better temp ID generation to prevent collisions
3184
+ * Upload media for a conversation (composers and custom plugins).
3251
3185
  */
3252
- sendMessage(command: AXSendMessageCommand): Promise<void>;
3186
+ uploadMedia(source: File | Blob, conversationId: string, options?: Omit<AXConversationUploadOptions, 'metadata'> & {
3187
+ metadata?: Record<string, unknown>;
3188
+ }): Promise<AXUploaderResult>;
3189
+ /**
3190
+ * Resolve a media reference to a playback/download URL.
3191
+ */
3192
+ resolveMediaUrl(reference: AXUploaderReference, signal?: AbortSignal): Promise<string>;
3193
+ /**
3194
+ * Send a message
3195
+ * Uses optimistic UI updates - message appears immediately
3196
+ * Pass `options.media` to upload a File/Blob before send (with optional progress and AbortSignal).
3197
+ */
3198
+ sendMessage(command: AXSendMessageCommand, options?: AXSendMessageOptions): Promise<void>;
3253
3199
  /**
3254
3200
  * Retry a failed message
3255
3201
  */
@@ -3659,38 +3605,6 @@ declare class AXErrorHandlerService {
3659
3605
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXErrorHandlerService>;
3660
3606
  }
3661
3607
 
3662
- interface FilePreview {
3663
- file: File;
3664
- preview?: string;
3665
- type: 'image' | 'video' | 'audio' | 'file';
3666
- }
3667
- declare class AXFileUploadService {
3668
- private readonly config;
3669
- private readonly platformId;
3670
- readFileAsDataURL(file: File): Promise<string>;
3671
- getFileType(file: File): 'image' | 'video' | 'audio' | 'file';
3672
- generatePreview(file: File): Promise<FilePreview>;
3673
- generatePreviews(files: File[]): Promise<FilePreview[]>;
3674
- getVideoDuration(file: File): Promise<number>;
3675
- getAudioDuration(file: File): Promise<number>;
3676
- formatFileSize(bytes: number): string;
3677
- formatDuration(seconds: number): string;
3678
- validateFileType(file: File, allowedTypes: string[]): boolean;
3679
- validateFileSize(file: File, maxSizeInMB: number): boolean;
3680
- filterFilesByType(files: File[], allowedTypes: string[]): File[];
3681
- isFileTypeAllowed(file: File): boolean;
3682
- isFileSizeAllowed(file: File): boolean;
3683
- validateFilesWithConfig(files: File[]): {
3684
- accepted: File[];
3685
- rejected: {
3686
- file: File;
3687
- reason: string;
3688
- }[];
3689
- };
3690
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFileUploadService, never>;
3691
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXFileUploadService>;
3692
- }
3693
-
3694
3608
  declare class AXForwardMessageDialogComponent implements OnInit {
3695
3609
  private readonly toastService;
3696
3610
  private readonly translation;
@@ -3718,9 +3632,6 @@ declare class AXForwardMessageDialogComponent implements OnInit {
3718
3632
  onForwardSearchChange(value: string): void;
3719
3633
  conversationFromItem(item: unknown): AXConversation | null;
3720
3634
  isSelected(conversationId: string): boolean;
3721
- getInitials(name: string): string;
3722
- getConversationAvatar(conversation: AXConversation): string | undefined;
3723
- getConversationAvatarIcon(conversation: AXConversation): string | undefined;
3724
3635
  private getFilteredConversationsForForward;
3725
3636
  onCancel(): void;
3726
3637
  onForward(): Promise<void>;
@@ -3728,6 +3639,309 @@ declare class AXForwardMessageDialogComponent implements OnInit {
3728
3639
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXForwardMessageDialogComponent, "ax-forward-message-dialog", never, { "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3729
3640
  }
3730
3641
 
3642
+ /**
3643
+ * Shared UI for message bubble bodies: sending / failed (with retry) and content load errors,
3644
+ * driven by {@link AXMessageRendererState}.
3645
+ */
3646
+ declare class AXConversationMessageRendererStateComponent {
3647
+ private readonly conversation;
3648
+ readonly translation: AXTranslationService;
3649
+ readonly rendererState: _angular_core.InputSignal<AXMessageRendererState>;
3650
+ readonly message: _angular_core.InputSignal<AXMessage>;
3651
+ /** Overrides default text when {@link AXMessageRendererState.contentState} is `error`. */
3652
+ readonly contentErrorLabel: _angular_core.InputSignal<string>;
3653
+ /** Overrides default text when delivery failed. */
3654
+ readonly deliveryFailedLabel: _angular_core.InputSignal<string>;
3655
+ /** Set false when the renderer shows content errors inline (e.g. inline media error state). */
3656
+ readonly showContentErrorChrome: _angular_core.InputSignal<boolean>;
3657
+ /** `inline` matches legacy media rows (e.g. audio): compact danger text under the player. */
3658
+ readonly contentErrorStyle: _angular_core.InputSignal<"inline" | "banner">;
3659
+ /** Icon class for content error (e.g. `fa-light fa-music` for audio). */
3660
+ readonly contentErrorIconClass: _angular_core.InputSignal<string>;
3661
+ /** `below`: render after main bubble body (typical for media). */
3662
+ readonly placement: _angular_core.InputSignal<"above" | "below">;
3663
+ readonly contentRetryEnabled: _angular_core.InputSignal<boolean>;
3664
+ readonly contentRetry: _angular_core.OutputEmitterRef<void>;
3665
+ readonly retryBusy: _angular_core.WritableSignal<boolean>;
3666
+ private readonly currentUser;
3667
+ private readonly isOwn;
3668
+ readonly showSending: _angular_core.Signal<boolean>;
3669
+ readonly showFailed: _angular_core.Signal<boolean>;
3670
+ readonly showContentError: _angular_core.Signal<boolean>;
3671
+ readonly hasVisibleChrome: _angular_core.Signal<boolean>;
3672
+ readonly showRetryButton: _angular_core.Signal<boolean>;
3673
+ readonly contentErrorText: _angular_core.Signal<string>;
3674
+ readonly deliveryFailedText: _angular_core.Signal<string>;
3675
+ onRetry(): Promise<void>;
3676
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationMessageRendererStateComponent, never>;
3677
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationMessageRendererStateComponent, "ax-conversation-message-renderer-state", never, { "rendererState": { "alias": "rendererState"; "required": true; "isSignal": true; }; "message": { "alias": "message"; "required": true; "isSignal": true; }; "contentErrorLabel": { "alias": "contentErrorLabel"; "required": false; "isSignal": true; }; "deliveryFailedLabel": { "alias": "deliveryFailedLabel"; "required": false; "isSignal": true; }; "showContentErrorChrome": { "alias": "showContentErrorChrome"; "required": false; "isSignal": true; }; "contentErrorStyle": { "alias": "contentErrorStyle"; "required": false; "isSignal": true; }; "contentErrorIconClass": { "alias": "contentErrorIconClass"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "contentRetryEnabled": { "alias": "contentRetryEnabled"; "required": false; "isSignal": true; }; }, { "contentRetry": "contentRetry"; }, never, never, true, never>;
3678
+ }
3679
+
3680
+ interface AXPlaybackBannerInputs {
3681
+ title?: string;
3682
+ currentTime?: number;
3683
+ duration?: number;
3684
+ isPlaying?: boolean;
3685
+ onTogglePlay?: () => void;
3686
+ onClose?: () => void;
3687
+ playbackSpeed?: number;
3688
+ onCycleSpeed?: () => void;
3689
+ showSpeedControl?: boolean;
3690
+ }
3691
+ declare class AXCnvMediaPlaybackInfoBarBannerComponent implements AXMessageInfoBarBannerComponent {
3692
+ readonly message: _angular_core.InputSignal<AXMessage>;
3693
+ readonly title: _angular_core.InputSignal<string>;
3694
+ readonly currentTime: _angular_core.InputSignal<number>;
3695
+ readonly duration: _angular_core.InputSignal<number>;
3696
+ readonly isPlaying: _angular_core.InputSignal<boolean>;
3697
+ readonly onTogglePlay: _angular_core.InputSignal<() => void>;
3698
+ readonly playbackSpeed: _angular_core.InputSignal<number>;
3699
+ readonly onCycleSpeed: _angular_core.InputSignal<() => void>;
3700
+ readonly showSpeedControl: _angular_core.InputSignal<boolean>;
3701
+ readonly iconClass: _angular_core.Signal<string>;
3702
+ readonly resolvedTitle: _angular_core.Signal<string>;
3703
+ readonly progressPercent: _angular_core.Signal<number>;
3704
+ readonly timeLabel: _angular_core.Signal<string>;
3705
+ onTogglePlayClick(): void;
3706
+ onCycleSpeedClick(): void;
3707
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXCnvMediaPlaybackInfoBarBannerComponent, never>;
3708
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXCnvMediaPlaybackInfoBarBannerComponent, "ax-cnv-media-playback-info-bar-banner", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "isPlaying": { "alias": "isPlaying"; "required": false; "isSignal": true; }; "onTogglePlay": { "alias": "onTogglePlay"; "required": false; "isSignal": true; }; "playbackSpeed": { "alias": "playbackSpeed"; "required": false; "isSignal": true; }; "onCycleSpeed": { "alias": "onCycleSpeed"; "required": false; "isSignal": true; }; "showSpeedControl": { "alias": "showSpeedControl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3709
+ }
3710
+
3711
+ /**
3712
+ * Registers the live renderer on {@link AXMessageListService} for message actions.
3713
+ */
3714
+ declare abstract class AXMessageRendererCopyHostComponent implements AXMessageRendererComponent {
3715
+ abstract readonly message: InputSignal<AXMessage>;
3716
+ abstract readonly rendererState: Signal<AXMessageRendererState>;
3717
+ abstract copy(): string | Promise<string>;
3718
+ private readonly messageList;
3719
+ constructor();
3720
+ }
3721
+
3722
+ declare class AXAudioRendererComponent extends AXMessageRendererCopyHostComponent {
3723
+ private readonly fileTypes;
3724
+ private readonly destroyRef;
3725
+ private readonly infoBarService;
3726
+ private readonly attachments;
3727
+ private readonly _contentState;
3728
+ private readonly activeTrackIndex;
3729
+ private readonly isPlaying;
3730
+ private readonly currentTime;
3731
+ private readonly duration;
3732
+ readonly message: _angular_core.InputSignal<AXMessage>;
3733
+ readonly rendererState: _angular_core.Signal<{
3734
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
3735
+ contentState: AXMessageRendererContentState;
3736
+ }>;
3737
+ readonly payload: _angular_core.Signal<AXAudioPayload>;
3738
+ readonly audios: _angular_core.Signal<_acorex_components_conversation2.AXAudioMediaItem[]>;
3739
+ readonly caption: _angular_core.Signal<string>;
3740
+ copy(): Promise<string>;
3741
+ constructor();
3742
+ onPlayingChange(index: number, playing: boolean): void;
3743
+ onTimeUpdate(index: number, time: number): void;
3744
+ onDurationChange(index: number, duration: number): void;
3745
+ onPlaybackEnded(index: number): void;
3746
+ onPlaybackError(): void;
3747
+ togglePlay(): void;
3748
+ private pauseOtherTracks;
3749
+ private pausePlayback;
3750
+ private syncInfoBarBanner;
3751
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXAudioRendererComponent, never>;
3752
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXAudioRendererComponent, "ax-conversation-audio-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3753
+ }
3754
+
3755
+ declare class AXFallbackRendererComponent implements AXMessageRendererComponent {
3756
+ private readonly _contentState;
3757
+ readonly message: _angular_core.InputSignal<AXMessage>;
3758
+ readonly rendererState: _angular_core.Signal<{
3759
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
3760
+ contentState: AXMessageRendererContentState;
3761
+ }>;
3762
+ readonly messageTypeLabel: _angular_core.Signal<string>;
3763
+ /** Same tone as content-error default in {@link AXConversationMessageRendererStateComponent}. */
3764
+ readonly fallbackDescription: _angular_core.Signal<string>;
3765
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFallbackRendererComponent, never>;
3766
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFallbackRendererComponent, "ax-conversation-fallback-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3767
+ }
3768
+
3769
+ declare class AXFileRendererComponent extends AXMessageRendererCopyHostComponent {
3770
+ private readonly fileTypes;
3771
+ readonly message: _angular_core.InputSignal<AXMessage>;
3772
+ readonly rendererState: _angular_core.Signal<{
3773
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
3774
+ contentState: "ready";
3775
+ }>;
3776
+ readonly payload: _angular_core.Signal<AXFilePayload>;
3777
+ readonly files: _angular_core.Signal<_acorex_components_conversation2.AXFileMediaItem[]>;
3778
+ readonly caption: _angular_core.Signal<string>;
3779
+ copy(): Promise<string>;
3780
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFileRendererComponent, never>;
3781
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFileRendererComponent, "ax-conversation-file-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3782
+ }
3783
+
3784
+ declare class AXImageRendererComponent extends AXMessageRendererCopyHostComponent {
3785
+ private readonly fileTypes;
3786
+ readonly message: _angular_core.InputSignal<AXMessage>;
3787
+ readonly rendererState: _angular_core.Signal<{
3788
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
3789
+ contentState: "ready";
3790
+ }>;
3791
+ readonly payload: _angular_core.Signal<AXImagePayload>;
3792
+ readonly images: _angular_core.Signal<_acorex_components_conversation2.AXImageMediaItem[]>;
3793
+ readonly caption: _angular_core.Signal<string>;
3794
+ copy(): Promise<string>;
3795
+ readonly gridModeClass: _angular_core.Signal<"ax-cnv-msg__grid--single" | "ax-cnv-msg__grid--dual" | "ax-cnv-msg__grid--multi">;
3796
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXImageRendererComponent, never>;
3797
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXImageRendererComponent, "ax-conversation-image-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3798
+ }
3799
+
3800
+ declare class AXLocationRendererComponent extends AXMessageRendererCopyHostComponent {
3801
+ private readonly _contentState;
3802
+ readonly message: _angular_core.InputSignal<AXMessage>;
3803
+ readonly rendererState: _angular_core.Signal<{
3804
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
3805
+ contentState: AXMessageRendererContentState;
3806
+ }>;
3807
+ readonly payload: _angular_core.Signal<AXLocationPayload>;
3808
+ readonly latitude: _angular_core.Signal<number>;
3809
+ readonly longitude: _angular_core.Signal<number>;
3810
+ readonly locationName: _angular_core.Signal<string>;
3811
+ readonly address: _angular_core.Signal<string>;
3812
+ readonly coordinatesText: _angular_core.Signal<string>;
3813
+ readonly mapsUrl: _angular_core.Signal<string>;
3814
+ copy(): string;
3815
+ readonly markers: _angular_core.Signal<{
3816
+ latitude: number;
3817
+ longitude: number;
3818
+ popup: string;
3819
+ popupOpen: boolean;
3820
+ popupCloseButton: boolean;
3821
+ }[]>;
3822
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXLocationRendererComponent, never>;
3823
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXLocationRendererComponent, "ax-conversation-location-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3824
+ }
3825
+
3826
+ declare class AXStickerRendererComponent implements AXMessageRendererComponent {
3827
+ private readonly _contentState;
3828
+ readonly message: _angular_core.InputSignal<AXMessage>;
3829
+ readonly rendererState: _angular_core.Signal<{
3830
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
3831
+ contentState: AXMessageRendererContentState;
3832
+ }>;
3833
+ readonly payload: _angular_core.Signal<AXStickerPayload>;
3834
+ private readonly mediaReference;
3835
+ private readonly resolvedUrl;
3836
+ readonly stickerUrl: _angular_core.Signal<string>;
3837
+ readonly alt: _angular_core.Signal<string>;
3838
+ constructor();
3839
+ onLoad(): void;
3840
+ onError(): void;
3841
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXStickerRendererComponent, never>;
3842
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXStickerRendererComponent, "ax-conversation-sticker-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3843
+ }
3844
+
3845
+ declare class AXSystemRendererComponent implements AXMessageRendererComponent {
3846
+ private readonly _contentState;
3847
+ readonly message: _angular_core.InputSignal<AXMessage>;
3848
+ readonly rendererState: _angular_core.Signal<{
3849
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
3850
+ contentState: AXMessageRendererContentState;
3851
+ }>;
3852
+ readonly payload: _angular_core.Signal<AXSystemPayload>;
3853
+ readonly iconClass: _angular_core.Signal<string>;
3854
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSystemRendererComponent, never>;
3855
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSystemRendererComponent, "ax-conversation-system-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3856
+ }
3857
+
3858
+ declare class AXTextRendererComponent extends AXMessageRendererCopyHostComponent {
3859
+ private readonly infoBarService;
3860
+ private readonly sanitizer;
3861
+ private readonly _contentState;
3862
+ readonly message: _angular_core.InputSignal<AXMessage>;
3863
+ readonly rendererState: _angular_core.Signal<{
3864
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
3865
+ contentState: AXMessageRendererContentState;
3866
+ }>;
3867
+ readonly searchQuery: _angular_core.Signal<string>;
3868
+ copy(): string;
3869
+ readonly formattedText: _angular_core.Signal<SafeHtml>;
3870
+ private linkify;
3871
+ private highlightSearch;
3872
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXTextRendererComponent, never>;
3873
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXTextRendererComponent, "ax-conversation-text-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3874
+ }
3875
+
3876
+ declare class AXVideoRendererComponent extends AXMessageRendererCopyHostComponent {
3877
+ private readonly fileTypes;
3878
+ private readonly platformId;
3879
+ private readonly destroyRef;
3880
+ private readonly infoBarService;
3881
+ private readonly attachments;
3882
+ private readonly activeVideoIndex;
3883
+ readonly message: _angular_core.InputSignal<AXMessage>;
3884
+ readonly rendererState: _angular_core.Signal<{
3885
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
3886
+ contentState: "ready";
3887
+ }>;
3888
+ readonly isPlaying: _angular_core.WritableSignal<boolean>;
3889
+ readonly currentTime: _angular_core.WritableSignal<number>;
3890
+ readonly duration: _angular_core.WritableSignal<number>;
3891
+ readonly payload: _angular_core.Signal<AXVideoPayload>;
3892
+ readonly videos: _angular_core.Signal<_acorex_components_conversation2.AXVideoMediaItem[]>;
3893
+ readonly caption: _angular_core.Signal<string>;
3894
+ copy(): Promise<string>;
3895
+ constructor();
3896
+ onPlayingChange(index: number, playing: boolean): void;
3897
+ onTimeUpdate(index: number, time: number): void;
3898
+ onDurationChange(index: number, duration: number): void;
3899
+ onPlaybackEnded(index: number): void;
3900
+ togglePlay(): void;
3901
+ private pauseOtherVideos;
3902
+ private pausePlayback;
3903
+ private syncInfoBarBanner;
3904
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVideoRendererComponent, never>;
3905
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVideoRendererComponent, "ax-conversation-video-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3906
+ }
3907
+
3908
+ declare class AXVoiceRendererComponent extends AXMessageRendererCopyHostComponent {
3909
+ private readonly fileTypes;
3910
+ private readonly platformId;
3911
+ private readonly destroyRef;
3912
+ private readonly infoBarService;
3913
+ private readonly audioElementRef;
3914
+ private readonly _contentState;
3915
+ readonly message: _angular_core.InputSignal<AXMessage>;
3916
+ readonly rendererState: _angular_core.Signal<{
3917
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
3918
+ contentState: AXMessageRendererContentState;
3919
+ }>;
3920
+ readonly isPlaying: _angular_core.WritableSignal<boolean>;
3921
+ readonly currentTime: _angular_core.WritableSignal<number>;
3922
+ readonly duration: _angular_core.WritableSignal<number>;
3923
+ readonly playbackSpeed: _angular_core.WritableSignal<number>;
3924
+ private readonly speeds;
3925
+ readonly payload: _angular_core.Signal<AXVoicePayload>;
3926
+ private readonly mediaReference;
3927
+ private readonly resolvedUrl;
3928
+ readonly voiceUrl: _angular_core.Signal<string>;
3929
+ readonly waveformBars: _angular_core.Signal<number[]>;
3930
+ readonly activeBarIndex: _angular_core.Signal<number>;
3931
+ readonly timeLabel: _angular_core.Signal<string>;
3932
+ copy(): Promise<string>;
3933
+ constructor();
3934
+ togglePlay(): void;
3935
+ cyclePlaybackSpeed(): void;
3936
+ onTimeUpdate(): void;
3937
+ onEnded(): void;
3938
+ onError(): void;
3939
+ private pausePlayback;
3940
+ private syncInfoBarBanner;
3941
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVoiceRendererComponent, never>;
3942
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVoiceRendererComponent, "ax-conversation-voice-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3943
+ }
3944
+
3731
3945
  /** Default message list surface when no conversation is selected and no `ax-conversation-message-list-no-active` content is projected. */
3732
3946
  declare class AXMessageListNoActiveDefaultComponent {
3733
3947
  private readonly translation;
@@ -3742,6 +3956,10 @@ declare class AXMessageListNoActiveDefaultComponent {
3742
3956
  declare class AXMessageListComponent implements OnDestroy {
3743
3957
  private readonly conversationService;
3744
3958
  private readonly messageListService;
3959
+ private readonly composerService;
3960
+ private readonly fileService;
3961
+ private readonly toast;
3962
+ private readonly infoBarService;
3745
3963
  private readonly translation;
3746
3964
  protected readonly config: Required<_acorex_components_conversation2.AXConversationConfig>;
3747
3965
  /**
@@ -3752,8 +3970,6 @@ declare class AXMessageListComponent implements OnDestroy {
3752
3970
  resolvedEmptyStateComponent(): Type<AXMessageListEmptyComponent>;
3753
3971
  /** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */
3754
3972
  protected readonly noActiveFallbackComponent: typeof AXMessageListNoActiveDefaultComponent;
3755
- /** Custom avatar template for message list items */
3756
- readonly avatarTemplate: _angular_core.InputSignal<TemplateRef<AXMessageAvatarTemplateContext>>;
3757
3973
  private readonly timeouts;
3758
3974
  private readonly replyCounts;
3759
3975
  private readonly forwardCounts;
@@ -3762,6 +3978,10 @@ declare class AXMessageListComponent implements OnDestroy {
3762
3978
  readonly reactionPopover: _angular_core.Signal<any>;
3763
3979
  /** Message id whose context menu is open (for active row styling). */
3764
3980
  readonly contextMenuMessageId: _angular_core.WritableSignal<string>;
3981
+ /** True while files are dragged over the message list drop zone. */
3982
+ readonly messageListDragging: _angular_core.WritableSignal<boolean>;
3983
+ /** While true, older history is being prepended — do not auto-scroll to the latest message. */
3984
+ private restoringScrollAfterPrepend;
3765
3985
  readonly availableReactions: _angular_core.WritableSignal<string[]>;
3766
3986
  private get registry();
3767
3987
  /** Message list element reference */
@@ -3769,9 +3989,11 @@ declare class AXMessageListComponent implements OnDestroy {
3769
3989
  /** Messages container element reference */
3770
3990
  private readonly messagesContainerRef;
3771
3991
  /** Loading state - use service */
3772
- readonly loading: _angular_core.WritableSignal<boolean>;
3992
+ readonly loading: _angular_core.Signal<boolean>;
3773
3993
  /** Loading more messages state - use service */
3774
3994
  readonly loadingMore: _angular_core.WritableSignal<boolean>;
3995
+ /** Whether older messages remain on the server */
3996
+ readonly hasMoreMessages: _angular_core.Signal<boolean>;
3775
3997
  /** Show scroll to bottom button - use service */
3776
3998
  readonly showScrollButton: _angular_core.WritableSignal<boolean>;
3777
3999
  /** Active conversation */
@@ -3813,16 +4035,12 @@ declare class AXMessageListComponent implements OnDestroy {
3813
4035
  shouldShowSenderName(message: AXMessage): boolean;
3814
4036
  /** Get sender name */
3815
4037
  getSenderName(message: AXMessage): string;
3816
- /** Get sender avatar */
3817
- getSenderAvatar(message: AXMessage): string | undefined;
3818
- /** Font Awesome icon for sender when no avatar image (participant or conversation icon). */
3819
- getSenderAvatarIcon(message: AXMessage): string | undefined;
3820
4038
  /** Get original sender name for forwarded messages */
3821
4039
  getOriginalSenderName(message: AXMessage): string;
3822
4040
  /** Get forwarded text with sender and conversation info */
3823
4041
  getForwardedText(message: AXMessage): string;
3824
4042
  /** Resolve renderer component for message */
3825
- getRendererComponent(message: AXMessage): Type<_acorex_components_conversation2.AXMessageRendererComponent>;
4043
+ getRendererComponent(message: AXMessage): typeof AXFallbackRendererComponent | Type<_acorex_components_conversation2.AXMessageRendererComponent>;
3826
4044
  /** Provide inputs for the dynamic renderer */
3827
4045
  getRendererInputs(message: AXMessage): {
3828
4046
  message: AXMessage;
@@ -3865,8 +4083,6 @@ declare class AXMessageListComponent implements OnDestroy {
3865
4083
  private loadAvailableReactions;
3866
4084
  /** Get message actions from registry */
3867
4085
  getMessageActions(message: AXMessage): _acorex_components_conversation2.AXMessageAction[];
3868
- /** Get initials from name */
3869
- getInitials(name: string): string;
3870
4086
  /** Handle reaction click */
3871
4087
  onReactionClick(message: AXMessage, emoji: string): void;
3872
4088
  /** Handle message action */
@@ -3875,8 +4091,12 @@ declare class AXMessageListComponent implements OnDestroy {
3875
4091
  onScroll(event: Event): void;
3876
4092
  /** Handle infinite scroll threshold */
3877
4093
  onScrollThreshold(edge: 'top' | 'bottom'): Promise<void>;
3878
- /** Load older messages - delegate to service */
4094
+ /** Load older messages - delegate to service and preserve scroll anchor */
3879
4095
  private loadOlderMessages;
4096
+ /**
4097
+ * Keep the user's viewport on the same messages after older rows are inserted above.
4098
+ */
4099
+ private restoreScrollPositionAfterPrepend;
3880
4100
  /** Check if user is near bottom of scroll */
3881
4101
  private isUserNearBottom;
3882
4102
  /**
@@ -3908,6 +4128,11 @@ declare class AXMessageListComponent implements OnDestroy {
3908
4128
  * This is called when a new reply or forward is detected globally
3909
4129
  */
3910
4130
  private refreshCount;
4131
+ onMessageListDragEnter(): void;
4132
+ onMessageListDragLeave(): void;
4133
+ /** Open the matching composer picker popup when files are dropped on the message list. */
4134
+ onMessageListFilesDropped(event: AXUploaderFileChangeEvent): Promise<void>;
4135
+ private composerPickerDeps;
3911
4136
  /** Handle context menu opening for messages */
3912
4137
  handleMessageContextMenuOpening(event: AXContextMenuOpeningEvent, message: AXMessage): void;
3913
4138
  /** Handle context menu item click for messages */
@@ -3926,15 +4151,7 @@ declare class AXMessageListComponent implements OnDestroy {
3926
4151
  */
3927
4152
  trackMessage(index: number, message: AXMessage): string;
3928
4153
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXMessageListComponent, never>;
3929
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXMessageListComponent, "ax-conversation-message-list", never, { "avatarTemplate": { "alias": "avatarTemplate"; "required": false; "isSignal": true; }; }, { "messageAction": "messageAction"; }, never, ["ax-conversation-message-list-empty, [ax-conversation-message-list-empty]", "ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]"], true, never>;
3930
- }
3931
- interface AXMessageAvatarTemplateContext {
3932
- $implicit: AXMessage;
3933
- size: number;
3934
- senderName: string;
3935
- senderAvatar?: string;
3936
- /** Font Awesome class string when there is no `senderAvatar` image. */
3937
- senderIcon?: string;
4154
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXMessageListComponent, "ax-conversation-message-list", never, {}, { "messageAction": "messageAction"; }, never, ["ax-conversation-message-list-empty, [ax-conversation-message-list-empty]", "ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]"], true, never>;
3938
4155
  }
3939
4156
 
3940
4157
  declare class AXMessageListService {
@@ -3944,18 +4161,21 @@ declare class AXMessageListService {
3944
4161
  readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
3945
4162
  readonly activeMessages: _angular_core.Signal<AXMessage[]>;
3946
4163
  readonly currentUser: _angular_core.Signal<_acorex_components_conversation2.AXParticipant>;
3947
- /** Loading state */
3948
- readonly loading: _angular_core.WritableSignal<boolean>;
3949
- /** Loading more messages state */
4164
+ /** Initial message history load (conversation switch) */
4165
+ readonly loading: _angular_core.Signal<boolean>;
4166
+ /** Loading older messages (scroll-up pagination) */
3950
4167
  readonly loadingMore: _angular_core.WritableSignal<boolean>;
4168
+ /** Whether older messages can be loaded */
4169
+ readonly hasMoreMessages: _angular_core.Signal<boolean>;
3951
4170
  /** Show scroll to bottom button */
3952
4171
  readonly showScrollButton: _angular_core.WritableSignal<boolean>;
3953
4172
  /** Scroll requests counter */
3954
4173
  readonly scrollRequests: _angular_core.WritableSignal<number>;
3955
- /** Current page for pagination */
3956
- private readonly currentPage;
3957
- /** Has more messages to load */
3958
- private readonly hasMoreMessages;
4174
+ /** Live renderer instances keyed by message id (for message actions). */
4175
+ private readonly _rendererInstances;
4176
+ registerRendererInstance(messageId: string, instance: AXMessageRendererComponent): void;
4177
+ unregisterRendererInstance(messageId: string): void;
4178
+ getRendererInstance(messageId: string): AXMessageRendererComponent | undefined;
3959
4179
  /** Message grouped by date */
3960
4180
  readonly messageGroups: _angular_core.Signal<{
3961
4181
  date: string;
@@ -3963,11 +4183,11 @@ declare class AXMessageListService {
3963
4183
  messages: AXMessage[];
3964
4184
  }[]>;
3965
4185
  /**
3966
- * Load more messages (pagination)
4186
+ * Load older messages when the user scrolls near the top.
3967
4187
  */
3968
- loadMoreMessages(): Promise<void>;
4188
+ loadMoreMessages(): Promise<boolean>;
3969
4189
  /**
3970
- * Reset pagination (call when conversation changes)
4190
+ * Reset pagination when switching conversations (page 0 is loaded by {@link AXConversationService.selectConversation}).
3971
4191
  */
3972
4192
  resetPagination(): void;
3973
4193
  getMenuActions(message: AXMessage): _acorex_components_conversation2.AXMessageAction[];
@@ -3985,11 +4205,10 @@ declare class AXSidebarService {
3985
4205
  private get registry();
3986
4206
  readonly searchQuery: _angular_core.WritableSignal<string>;
3987
4207
  readonly activeTabId: _angular_core.WritableSignal<string>;
3988
- private readonly currentPage;
3989
- private readonly hasMoreConversations;
3990
4208
  readonly loadingMore: _angular_core.WritableSignal<boolean>;
3991
4209
  readonly conversations: _angular_core.Signal<AXConversation[]>;
3992
4210
  readonly loading: _angular_core.Signal<boolean>;
4211
+ readonly hasMoreConversations: _angular_core.Signal<boolean>;
3993
4212
  readonly enabledTabs: _angular_core.Signal<_acorex_components_conversation2.AXConversationTab[]>;
3994
4213
  private filterCache;
3995
4214
  readonly filteredConversations: _angular_core.Signal<AXConversation[]>;
@@ -4002,7 +4221,7 @@ declare class AXSidebarService {
4002
4221
  selectConversation(conversation: AXConversation): void;
4003
4222
  getBadgeValue(tabId: string): string | undefined;
4004
4223
  /**
4005
- * Load more conversations (pagination)
4224
+ * Load more conversations when the user scrolls near the bottom of the sidebar list.
4006
4225
  */
4007
4226
  loadMoreConversations(): Promise<void>;
4008
4227
  /**
@@ -4010,9 +4229,9 @@ declare class AXSidebarService {
4010
4229
  */
4011
4230
  onScrollThreshold(edge: 'top' | 'bottom'): Promise<void>;
4012
4231
  /**
4013
- * Reset pagination (call when filters change)
4232
+ * Reload conversation list from the first page (e.g. pull-to-refresh).
4014
4233
  */
4015
- resetPagination(): void;
4234
+ reloadConversations(): Promise<void>;
4016
4235
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSidebarService, never>;
4017
4236
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXSidebarService>;
4018
4237
  }
@@ -4032,6 +4251,7 @@ declare class AXSidebarComponent implements OnDestroy {
4032
4251
  readonly filteredConversations: _angular_core.Signal<AXConversation[]>;
4033
4252
  readonly loading: _angular_core.Signal<boolean>;
4034
4253
  readonly loadingMore: _angular_core.WritableSignal<boolean>;
4254
+ readonly hasMoreConversations: _angular_core.Signal<boolean>;
4035
4255
  constructor();
4036
4256
  /** Handle search input change with debouncing */
4037
4257
  onSearchChange(value: string): void;
@@ -4096,7 +4316,6 @@ declare class AXNewConversationDialogComponent extends AXBasePageComponent {
4096
4316
  onSearchChange(value: string): void;
4097
4317
  isUserSelected(id: string): boolean;
4098
4318
  userFromItem(item: unknown): AXParticipant | null;
4099
- getInitials(name: string): string;
4100
4319
  private filteredUsers;
4101
4320
  onCreateConversation(): Promise<void>;
4102
4321
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXNewConversationDialogComponent, never>;
@@ -4110,15 +4329,22 @@ declare class AXInfiniteScrollDirective {
4110
4329
  readonly threshold: _angular_core.InputSignal<number>;
4111
4330
  /** Which edge to watch: 'top', 'bottom', or 'both' */
4112
4331
  readonly edge: _angular_core.InputSignal<"top" | "bottom" | "both">;
4332
+ /** When true, scroll events are ignored (e.g. while a page is loading). */
4333
+ readonly scrollDisabled: _angular_core.InputSignal<boolean>;
4334
+ /** Minimum time between emissions (ms) to avoid duplicate API calls. */
4335
+ readonly cooldownMs: _angular_core.InputSignal<number>;
4113
4336
  /** Event emitted when scrolling reaches the threshold */
4114
4337
  readonly scrollThreshold: _angular_core.OutputEmitterRef<"top" | "bottom">;
4115
4338
  private lastScrollTop;
4116
4339
  private ticking;
4340
+ private lastEmitAt;
4341
+ private pendingEmit;
4117
4342
  constructor();
4118
4343
  private setupScrollListener;
4119
4344
  private handleScroll;
4345
+ private emitThreshold;
4120
4346
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfiniteScrollDirective, never>;
4121
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXInfiniteScrollDirective, "[axInfiniteScroll]", never, { "threshold": { "alias": "threshold"; "required": false; "isSignal": true; }; "edge": { "alias": "edge"; "required": false; "isSignal": true; }; }, { "scrollThreshold": "scrollThreshold"; }, never, never, true, never>;
4347
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXInfiniteScrollDirective, "[axInfiniteScroll]", never, { "threshold": { "alias": "threshold"; "required": false; "isSignal": true; }; "edge": { "alias": "edge"; "required": false; "isSignal": true; }; "scrollDisabled": { "alias": "scrollDisabled"; "required": false; "isSignal": true; }; "cooldownMs": { "alias": "cooldownMs"; "required": false; "isSignal": true; }; }, { "scrollThreshold": "scrollThreshold"; }, never, never, true, never>;
4122
4348
  }
4123
4349
 
4124
4350
  /**
@@ -4160,14 +4386,12 @@ interface AXConversationConfig {
4160
4386
  defaultSidebarWidth?: number;
4161
4387
  /** Filter cache size */
4162
4388
  filterCacheSize?: number;
4163
- /** Maximum file size in bytes */
4164
- maxFileSize?: number;
4165
- /** Allowed file types (glob patterns like 'image/*') */
4166
- allowedFileTypes?: string[];
4167
4389
  /** Maximum message length in characters */
4168
4390
  maxMessageLength?: number;
4169
4391
  /** Minimum message length in characters */
4170
4392
  minMessageLength?: number;
4393
+ /** Max attachments per message when a composer action omits `maxFiles`. */
4394
+ maxFilesPerMessage?: number;
4171
4395
  /** Threshold for marking messages as read (0.0 to 1.0, default: 0.3) */
4172
4396
  messageReadThreshold?: number;
4173
4397
  /**
@@ -4211,6 +4435,29 @@ declare const CONVERSATION_CONFIG: InjectionToken<Required<AXConversationConfig>
4211
4435
  */
4212
4436
  declare const ERROR_HANDLER_CONFIG: InjectionToken<Partial<AXErrorHandlerConfig>>;
4213
4437
 
4438
+ /**
4439
+ * Pluggable avatar components for the conversation UI.
4440
+ * Register via `provideConversation({ avatarComponents: { user, conversation } })`.
4441
+ */
4442
+
4443
+ /** Custom user avatar (e.g. platform `axp-user-avatar`). */
4444
+ interface AXConversationUserAvatarComponent {
4445
+ readonly userId: InputSignal<string>;
4446
+ readonly size: InputSignal<number>;
4447
+ }
4448
+ /** Optional custom group/channel conversation avatar. */
4449
+ interface AXConversationConversationAvatarComponent {
4450
+ readonly conversationId: InputSignal<string>;
4451
+ readonly size: InputSignal<number>;
4452
+ }
4453
+ type AXConversationAvatarKind = 'user' | 'conversation' | 'auto';
4454
+ declare const AX_CONVERSATION_USER_AVATAR_COMPONENT: InjectionToken<Type<AXConversationUserAvatarComponent>>;
4455
+ declare const AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT: InjectionToken<Type<AXConversationConversationAvatarComponent>>;
4456
+ interface AXConversationAvatarComponents {
4457
+ user?: Type<AXConversationUserAvatarComponent>;
4458
+ conversation?: Type<AXConversationConversationAvatarComponent>;
4459
+ }
4460
+
4214
4461
  /**
4215
4462
  * Registry Configuration Tokens
4216
4463
  * Injection tokens for configuring default registry values
@@ -4289,8 +4536,19 @@ declare const AXConversationIndexedDbStores: {
4289
4536
  readonly PARTICIPANTS: "participants";
4290
4537
  readonly CONVERSATIONS: "conversations";
4291
4538
  readonly MESSAGES: "messages";
4539
+ readonly MEDIA: "media";
4292
4540
  readonly SETTINGS: "settings";
4293
4541
  };
4542
+ /** Blob stored for demo multimedia uploads */
4543
+ interface AXConversationIndexedDbMediaRecord {
4544
+ id: string;
4545
+ conversationId: string;
4546
+ mimeType: string;
4547
+ size: number;
4548
+ fileName?: string;
4549
+ blob: Blob;
4550
+ createdAt: string;
4551
+ }
4294
4552
  declare class AXConversationIndexedDbStorage {
4295
4553
  private db;
4296
4554
  private initPromise;
@@ -4336,6 +4594,9 @@ declare class AXConversationIndexedDbStorage {
4336
4594
  deleteMessage(id: string): Promise<void>;
4337
4595
  getSetting(key: string): Promise<unknown>;
4338
4596
  putSetting(key: string, value: unknown): Promise<void>;
4597
+ getMedia(id: string): Promise<AXConversationIndexedDbMediaRecord | undefined>;
4598
+ putMedia(record: AXConversationIndexedDbMediaRecord): Promise<void>;
4599
+ deleteMedia(id: string): Promise<void>;
4339
4600
  }
4340
4601
  declare const axConversationIndexedDbStorage: AXConversationIndexedDbStorage;
4341
4602
 
@@ -4389,6 +4650,59 @@ declare class AXConversationSharedStorage {
4389
4650
  }
4390
4651
  declare const conversationSharedStorage: AXConversationSharedStorage;
4391
4652
 
4653
+ /**
4654
+ * Chat-oriented pagination helpers for IndexedDB demo APIs.
4655
+ *
4656
+ * Convention (matches {@link AXConversationService}):
4657
+ * - Page 0: newest items (sidebar: recent chats; messages: latest history window).
4658
+ * - Page 1+ or `cursor`: older items before the previous window.
4659
+ * - `hasMore`: true when older items remain.
4660
+ * - `nextCursor`: id of the oldest item in the current page (use as `pagination.cursor` for the next request).
4661
+ */
4662
+
4663
+ declare const AX_MESSAGE_CURSOR_PREFIX = "msg:";
4664
+ declare const AX_CONVERSATION_CURSOR_PREFIX = "conv:";
4665
+ type AXChatCursorKind = 'message' | 'conversation';
4666
+ interface AXParsedChatCursor {
4667
+ kind: AXChatCursorKind;
4668
+ id: string;
4669
+ }
4670
+ declare function encodeMessageCursor(messageId: string): string;
4671
+ declare function encodeConversationCursor(conversationId: string): string;
4672
+ /** Decode cursor from API pagination (supports prefixed or legacy raw message id). */
4673
+ declare function parseChatCursor(cursor?: string): AXParsedChatCursor | null;
4674
+ /**
4675
+ * Paginate a list sorted newest-first (chats, message history windows).
4676
+ */
4677
+ declare function paginateChatNewestFirst<T extends {
4678
+ id: string;
4679
+ }>(sortedNewestFirst: T[], pagination: AXPagination, cursorKind: AXChatCursorKind): AXPaginatedResult<T>;
4680
+ /**
4681
+ * Paginate a list sorted oldest-first (replies, forward history).
4682
+ */
4683
+ declare function paginateChatOldestFirst<T extends {
4684
+ id: string;
4685
+ }>(sortedOldestFirst: T[], pagination: AXPagination): AXPaginatedResult<T>;
4686
+
4687
+ /**
4688
+ * Shared read/write helpers for IndexedDB chat storage (in-memory + persistence).
4689
+ */
4690
+
4691
+ declare function getConversationLastActivity(conv: AXConversation): number;
4692
+ /** Messages for a conversation, newest first (API / pagination order). */
4693
+ declare function getConversationMessagesNewestFirst(conversationId: string): AXMessage[];
4694
+ /** Keep per-conversation id list sorted ascending by timestamp (store order). */
4695
+ declare function sortConversationMessageIds(conversationId: string): void;
4696
+ /** Register a message in maps and keep the conversation index sorted. */
4697
+ declare function registerChatMessage(message: AXMessage): void;
4698
+ /** Remove a message from conversation index and global map. */
4699
+ declare function unregisterChatMessage(messageId: string, conversationId: string): void;
4700
+ declare function applyConversationFilters(conversations: AXConversation[], filters?: AXConversationFilters): AXConversation[];
4701
+ /** Sidebar list order: pinned first, then by last activity (newest first). */
4702
+ declare function getSortedConversationsForInbox(filters?: AXConversationFilters): AXConversation[];
4703
+ /** Sort all loaded conversation message indexes (after IndexedDB hydration). */
4704
+ declare function normalizeAllConversationMessageIndexes(): void;
4705
+
4392
4706
  declare class AXConversationIndexedDbUserApi extends AXUserApi {
4393
4707
  getCurrentUser(): Promise<AXParticipant>;
4394
4708
  updateProfile(updates: AXUserProfileUpdate): Promise<AXParticipant>;
@@ -4412,36 +4726,38 @@ declare class AXConversationIndexedDbUserApi extends AXUserApi {
4412
4726
  declare class AXConversationIndexedDbConversationApi extends AXConversationApi {
4413
4727
  createConversation(data: AXConversationCreateData): Promise<AXConversation>;
4414
4728
  getConversation(conversationId: string): Promise<AXConversation>;
4415
- getConversations(pagination: AXPagination, _filters?: AXConversationFilters): Promise<AXPaginatedResult<AXConversation>>;
4729
+ /**
4730
+ * Inbox page (pinned + recent activity, newest first).
4731
+ * Page 0 / cursor align with {@link AXConversationService.loadConversations} and sidebar infinite scroll.
4732
+ */
4733
+ getConversations(pagination: AXPagination, filters?: AXConversationFilters): Promise<AXPaginatedResult<AXConversation>>;
4416
4734
  updateConversation(conversationId: string, updates: AXConversationUpdateData): Promise<AXConversation>;
4417
4735
  deleteConversation(conversationId: string): Promise<boolean>;
4418
4736
  archiveConversation(conversationId: string): Promise<void>;
4419
4737
  unarchiveConversation(conversationId: string): Promise<void>;
4420
- pinConversation(_conversationId: string): Promise<void>;
4421
- unpinConversation(_conversationId: string): Promise<void>;
4738
+ pinConversation(conversationId: string): Promise<void>;
4739
+ unpinConversation(conversationId: string): Promise<void>;
4422
4740
  markConversationAsRead(conversationId: string): Promise<void>;
4423
4741
  markConversationAsUnread(conversationId: string): Promise<void>;
4424
4742
  searchConversations(query: string): Promise<AXConversation[]>;
4425
- filterConversations(_filters: AXConversationFilters, pagination?: AXPagination): Promise<AXPaginatedResult<AXConversation>>;
4743
+ filterConversations(filters: AXConversationFilters, pagination?: AXPagination): Promise<AXPaginatedResult<AXConversation>>;
4426
4744
  getParticipants(conversationId: string): Promise<AXParticipant[]>;
4427
4745
  addParticipants(_conversationId: string, _userIds: string[]): Promise<AXConversation>;
4428
4746
  removeParticipant(conversationId: string, _userId: string): Promise<AXConversation>;
4429
4747
  leaveConversation(_conversationId: string): Promise<void>;
4430
4748
  updateParticipant(conversationId: string, _update: AXParticipantUpdate): Promise<AXConversation>;
4431
4749
  getConversationSettings(conversationId: string): Promise<AXConversationSettingsUpdate>;
4432
- updateConversationSettings(_conversationId: string, _settings: AXConversationSettingsUpdate): Promise<void>;
4433
- muteConversation(_conversationId: string, _duration?: number): Promise<void>;
4434
- unmuteConversation(_conversationId: string): Promise<void>;
4750
+ updateConversationSettings(conversationId: string, settings: AXConversationSettingsUpdate): Promise<void>;
4751
+ muteConversation(conversationId: string, duration?: number): Promise<void>;
4752
+ unmuteConversation(conversationId: string): Promise<void>;
4435
4753
  uploadConversationAvatar(_conversationId: string, file: File): Promise<string>;
4436
- getConversationMedia(_conversationId: string, _pagination?: AXPagination): Promise<AXPaginatedResult<unknown>>;
4437
- addConversationTags(_conversationId: string, _tags: string[]): Promise<void>;
4438
- removeConversationTags(_conversationId: string, _tags: string[]): Promise<void>;
4439
- getConversationTags(_conversationId: string): Promise<string[]>;
4440
- getConversationPermissions(_conversationId: string): Promise<Record<string, boolean>>;
4441
- updateConversationPermissions(_conversationId: string, _permissions: Record<string, boolean>): Promise<void>;
4442
- saveDraft(_conversationId: string, _draft: string): Promise<void>;
4443
- getDraft(_conversationId: string): Promise<string | null>;
4444
- clearDraft(_conversationId: string): Promise<void>;
4754
+ getConversationMedia(conversationId: string, pagination?: AXPagination): Promise<AXPaginatedResult<unknown>>;
4755
+ addConversationTags(conversationId: string, tags: string[]): Promise<void>;
4756
+ removeConversationTags(conversationId: string, tags: string[]): Promise<void>;
4757
+ getConversationTags(conversationId: string): Promise<string[]>;
4758
+ saveDraft(conversationId: string, draft: string): Promise<void>;
4759
+ getDraft(conversationId: string): Promise<string | null>;
4760
+ clearDraft(conversationId: string): Promise<void>;
4445
4761
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbConversationApi, never>;
4446
4762
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbConversationApi>;
4447
4763
  }
@@ -4449,12 +4765,17 @@ declare class AXConversationIndexedDbConversationApi extends AXConversationApi {
4449
4765
  declare class AXConversationIndexedDbMessageApi extends AXMessageApi {
4450
4766
  sendMessage(command: AXSendMessageCommand): Promise<AXMessage>;
4451
4767
  getMessage(messageId: string): Promise<AXMessage>;
4768
+ /**
4769
+ * Message history for a chat (newest-first pages).
4770
+ * - Page 0: latest `pageSize` messages.
4771
+ * - Page 1+ or `pagination.cursor`: older messages before the previous window.
4772
+ */
4452
4773
  getMessages(conversationId: string, pagination: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
4453
4774
  editMessage(messageId: string, payload: AXMessagePayload): Promise<AXMessage>;
4454
4775
  deleteMessage(messageId: string, _forEveryone?: boolean): Promise<void>;
4455
4776
  deleteMessages(messageIds: string[], forEveryone?: boolean): Promise<void>;
4456
- searchMessages(conversationId: string, filters: AXMessageSearchFilters, _pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
4457
- searchAllMessages(_filters: AXMessageSearchFilters, _pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
4777
+ searchMessages(conversationId: string, filters: AXMessageSearchFilters, pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
4778
+ searchAllMessages(filters: AXMessageSearchFilters, pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
4458
4779
  addReaction(messageId: string, emoji: string): Promise<void>;
4459
4780
  removeReaction(messageId: string, emoji: string): Promise<void>;
4460
4781
  getAvailableReactions(): Promise<string[]>;
@@ -4470,24 +4791,17 @@ declare class AXConversationIndexedDbMessageApi extends AXMessageApi {
4470
4791
  getForwardCount(messageId: string): Promise<number>;
4471
4792
  sendTypingIndicator(conversationId: string): Promise<void>;
4472
4793
  stopTypingIndicator(conversationId: string): Promise<void>;
4473
- uploadFile(file: File, _conversationId: string): Promise<{
4474
- url: string;
4475
- thumbnailUrl?: string;
4476
- size: number;
4477
- mimeType: string;
4478
- metadata?: Record<string, unknown>;
4479
- }>;
4480
- updateMessageMetadata(_messageId: string, _metadata: Record<string, unknown>): Promise<void>;
4481
- getMessageMetadata(_messageId: string): Promise<Record<string, unknown>>;
4482
- updateMessageStatus(_messageId: string, _status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed'): Promise<void>;
4794
+ updateMessageMetadata(messageId: string, metadata: Record<string, unknown>): Promise<void>;
4795
+ getMessageMetadata(messageId: string): Promise<Record<string, unknown>>;
4796
+ updateMessageStatus(messageId: string, status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed'): Promise<void>;
4483
4797
  getMessageDeliveryStatus(_messageId: string): Promise<{
4484
4798
  delivered: number;
4485
4799
  read: number;
4486
4800
  total: number;
4487
4801
  }>;
4488
- markMessagesAsRead(_messageIds: string[]): Promise<void>;
4489
- bulkDeleteMessages(_conversationId: string, _messageIds: string[], _forEveryone?: boolean): Promise<void>;
4490
- exportMessages(_conversationId: string, _format: 'json' | 'csv' | 'txt'): Promise<string | Blob>;
4802
+ markMessagesAsRead(messageIds: string[]): Promise<void>;
4803
+ bulkDeleteMessages(conversationId: string, messageIds: string[], forEveryone?: boolean): Promise<void>;
4804
+ exportMessages(conversationId: string, _format: 'json' | 'csv' | 'txt'): Promise<string | Blob>;
4491
4805
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbMessageApi, never>;
4492
4806
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbMessageApi>;
4493
4807
  }
@@ -4653,31 +4967,66 @@ declare class AXConversationIndexedDbMessageAiApi extends AXConversationIndexedD
4653
4967
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbMessageAiApi>;
4654
4968
  }
4655
4969
 
4656
- interface AudioFile {
4970
+ /**
4971
+ * Shared upload state and helpers for composer media pickers.
4972
+ */
4973
+
4974
+ interface AXComposerPickerUploadItem {
4657
4975
  file: File;
4976
+ preview?: string;
4977
+ duration?: number;
4978
+ uploadProgress?: number;
4979
+ uploading?: boolean;
4980
+ uploaded?: boolean;
4981
+ uploadedUrl?: string;
4982
+ mediaId?: string;
4983
+ error?: string;
4984
+ abortController?: AbortController;
4985
+ }
4986
+
4987
+ interface AudioFile extends AXComposerPickerUploadItem {
4658
4988
  duration?: number;
4659
4989
  dataUrl?: string;
4660
4990
  }
4661
- declare class AXAudioPickerComponent {
4662
- private readonly composerService;
4663
- private readonly conversationService;
4664
- private readonly fileUploadService;
4991
+ declare class AXAudioPickerComponent implements OnDestroy {
4992
+ private uploadsDismissed;
4993
+ private retainUploadedOnDismiss;
4994
+ readonly service: _angular_core.InputSignal<AXComposerService>;
4995
+ private readonly composerServiceFromInjector;
4996
+ private get composerService();
4997
+ private readonly uploader;
4998
+ private readonly fileService;
4999
+ private readonly fileTypeRegistry;
5000
+ private readonly platformId;
5001
+ private readonly toast;
4665
5002
  readonly translation: AXTranslationService;
4666
5003
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4667
- readonly fileInput: _angular_core.Signal<ElementRef<HTMLInputElement>>;
5004
+ readonly maxFiles: _angular_core.InputSignal<number>;
5005
+ readonly initialFiles: _angular_core.InputSignal<File[]>;
5006
+ readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
5007
+ readonly catalogFileType: "conversation-audio";
4668
5008
  readonly audioFiles: _angular_core.WritableSignal<AudioFile[]>;
4669
5009
  readonly isDragging: _angular_core.WritableSignal<boolean>;
5010
+ readonly typeIconClass: "fa-light fa-music text-amber-500";
5011
+ readonly emptyIconClass: _angular_core.Signal<"fa-light fa-music text-amber-500" | "fa-light fa-cloud-arrow-up">;
5012
+ private catalogFileTypeDef?;
4670
5013
  caption: string;
4671
- triggerFileInput(): void;
5014
+ readonly allowMultiple: _angular_core.Signal<boolean>;
5015
+ constructor();
5016
+ private createUtilityContext;
5017
+ private getCatalogFileTypeDef;
5018
+ private runUtility;
4672
5019
  handleFiles(files: File[]): Promise<void>;
4673
- onFileInputChange(event: Event): void;
5020
+ private uploadAudioAt;
5021
+ private patchAudio;
4674
5022
  removeAudio(index: number): void;
4675
- onDragEnter(event: DragEvent): void;
4676
- onDragOver(event: DragEvent): void;
4677
- onDragLeave(event: DragEvent): void;
4678
- onDrop(event: DragEvent): void;
4679
5023
  sendAudio(): Promise<void>;
5024
+ canSend(): boolean;
5025
+ getUploadingLabel(progress: number): string;
5026
+ getCancelUploadLabel(): string;
4680
5027
  cancel(): void;
5028
+ ngOnDestroy(): void;
5029
+ private dismissPicker;
4681
5030
  formatFileSize(bytes: number): string;
4682
5031
  formatDuration(seconds: number): string;
4683
5032
  getEmptyTitle(): string;
@@ -4685,7 +5034,7 @@ declare class AXAudioPickerComponent {
4685
5034
  getSelectedCountText(): string;
4686
5035
  getSendText(): string;
4687
5036
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXAudioPickerComponent, never>;
4688
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXAudioPickerComponent, "ax-conversation-audio-picker", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5037
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXAudioPickerComponent, "ax-conversation-audio-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4689
5038
  }
4690
5039
 
4691
5040
  declare const AX_CONVERSATION_COMPOSER_EMOJI_TAB: AXComposerTab;
@@ -4729,37 +5078,54 @@ declare class AXEmojiTabComponent {
4729
5078
  interface AttachedFile {
4730
5079
  file: File;
4731
5080
  preview?: string;
5081
+ icon: string;
4732
5082
  type: 'image' | 'video' | 'audio' | 'file';
4733
5083
  uploadProgress?: number;
4734
5084
  uploading?: boolean;
4735
5085
  uploaded?: boolean;
4736
5086
  uploadedUrl?: string;
5087
+ mediaId?: string;
4737
5088
  error?: string;
4738
- }
4739
- declare class AXFilePickerComponent {
4740
- private readonly conversationService;
4741
- private readonly fileUploadService;
4742
- private readonly messageApi;
4743
- private readonly composerService;
5089
+ abortController?: AbortController;
5090
+ }
5091
+ declare class AXFilePickerComponent implements OnDestroy {
5092
+ private uploadsDismissed;
5093
+ private retainUploadedOnDismiss;
5094
+ private readonly uploader;
5095
+ private readonly fileService;
5096
+ private readonly fileTypeRegistry;
5097
+ private readonly platformId;
5098
+ readonly service: _angular_core.InputSignal<AXComposerService>;
5099
+ private readonly composerServiceFromInjector;
5100
+ private get composerService();
5101
+ private readonly toast;
4744
5102
  readonly translation: AXTranslationService;
4745
5103
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4746
- readonly fileInput: _angular_core.Signal<ElementRef<HTMLInputElement>>;
5104
+ readonly maxFiles: _angular_core.InputSignal<number>;
5105
+ readonly initialFiles: _angular_core.InputSignal<File[]>;
5106
+ readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
5107
+ readonly catalogFileType: "conversation-file";
5108
+ readonly allowMultiple: _angular_core.Signal<boolean>;
4747
5109
  readonly files: _angular_core.WritableSignal<AttachedFile[]>;
4748
5110
  readonly isDragging: _angular_core.WritableSignal<boolean>;
4749
5111
  readonly isUploading: _angular_core.WritableSignal<boolean>;
4750
- triggerFileInput(): void;
5112
+ readonly emptyIconClass: _angular_core.Signal<"fa-light fa-file text-neutral-500" | "fa-light fa-cloud-arrow-up">;
5113
+ private catalogFileTypeDef?;
5114
+ caption: string;
5115
+ constructor();
5116
+ private createUtilityContext;
5117
+ private getCatalogFileTypeDef;
5118
+ private pickerKind;
4751
5119
  handleFiles(fileList: File[]): Promise<void>;
4752
5120
  private uploadFile;
4753
- onFileInputChange(event: Event): void;
4754
5121
  removeFile(index: number): void;
4755
- onDragEnter(event: DragEvent): void;
4756
- onDragOver(event: DragEvent): void;
4757
- onDragLeave(event: DragEvent): void;
4758
- onDrop(event: DragEvent): void;
4759
5122
  sendFiles(): Promise<void>;
4760
5123
  private updateFileProgress;
4761
5124
  private uploadFileWithProgress;
4762
5125
  cancel(): void;
5126
+ ngOnDestroy(): void;
5127
+ private dismissPicker;
5128
+ getCancelUploadLabel(): string;
4763
5129
  formatFileSize(bytes: number): string;
4764
5130
  canSend(): boolean;
4765
5131
  getSendButtonText(): string;
@@ -4768,40 +5134,56 @@ declare class AXFilePickerComponent {
4768
5134
  getSelectedCountText(): string;
4769
5135
  getUploadingLabel(progress: number): string;
4770
5136
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFilePickerComponent, never>;
4771
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFilePickerComponent, "ax-conversation-file-picker", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5137
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFilePickerComponent, "ax-conversation-file-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4772
5138
  }
4773
5139
 
4774
- interface ImageFile {
4775
- file: File;
5140
+ interface ImageFile extends AXComposerPickerUploadItem {
4776
5141
  preview: string;
4777
5142
  }
4778
- declare class AXImagePickerComponent {
4779
- private readonly composerService;
4780
- private readonly conversationService;
4781
- private readonly fileUploadService;
5143
+ declare class AXImagePickerComponent implements OnDestroy {
5144
+ private uploadsDismissed;
5145
+ /** Uploaded blobs are referenced by the sent message — do not delete on dismiss. */
5146
+ private retainUploadedOnDismiss;
5147
+ readonly service: _angular_core.InputSignal<AXComposerService>;
5148
+ private readonly composerServiceFromInjector;
5149
+ private get composerService();
5150
+ private readonly uploader;
5151
+ private readonly fileService;
5152
+ private readonly fileTypeRegistry;
5153
+ private readonly platformId;
5154
+ private readonly toast;
4782
5155
  readonly translation: AXTranslationService;
5156
+ readonly catalogFileType: "conversation-image";
4783
5157
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4784
- readonly fileInput: _angular_core.Signal<ElementRef<HTMLInputElement>>;
5158
+ readonly maxFiles: _angular_core.InputSignal<number>;
5159
+ readonly initialFiles: _angular_core.InputSignal<File[]>;
5160
+ readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
4785
5161
  readonly images: _angular_core.WritableSignal<ImageFile[]>;
4786
5162
  readonly isDragging: _angular_core.WritableSignal<boolean>;
5163
+ readonly emptyIconClass: _angular_core.Signal<"fa-light fa-image text-purple-500" | "fa-light fa-cloud-arrow-up">;
4787
5164
  caption: string;
4788
- triggerFileInput(): void;
5165
+ readonly allowMultiple: _angular_core.Signal<boolean>;
5166
+ private imageFileType?;
5167
+ constructor();
5168
+ private createUtilityContext;
5169
+ private loadImageFileType;
4789
5170
  handleFiles(files: File[]): Promise<void>;
4790
- onFileInputChange(event: Event): void;
5171
+ private uploadImageAt;
5172
+ private patchImage;
4791
5173
  removeImage(index: number): void;
4792
- onDragEnter(event: DragEvent): void;
4793
- onDragOver(event: DragEvent): void;
4794
- onDragLeave(event: DragEvent): void;
4795
- onDrop(event: DragEvent): void;
4796
5174
  sendImages(): Promise<void>;
5175
+ canSend(): boolean;
5176
+ getUploadingLabel(progress: number): string;
5177
+ getCancelUploadLabel(): string;
4797
5178
  cancel(): void;
4798
- formatFileSize(bytes: number): string;
5179
+ ngOnDestroy(): void;
5180
+ private dismissPicker;
4799
5181
  getEmptyTitle(): string;
4800
5182
  getEmptySubtitle(): string;
4801
5183
  getSelectedCountText(): string;
4802
5184
  getSendText(): string;
4803
5185
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXImagePickerComponent, never>;
4804
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXImagePickerComponent, "ax-conversation-image-picker", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5186
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXImagePickerComponent, "ax-conversation-image-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4805
5187
  }
4806
5188
 
4807
5189
  declare class AXLocationPickerComponent {
@@ -4868,31 +5250,49 @@ declare class AXStickerTabComponent {
4868
5250
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXStickerTabComponent, "ax-sticker-tab", never, {}, { "itemSelected": "itemSelected"; }, never, never, true, never>;
4869
5251
  }
4870
5252
 
4871
- interface VideoFile {
4872
- file: File;
5253
+ interface VideoFile extends AXComposerPickerUploadItem {
4873
5254
  preview?: string;
4874
5255
  duration?: number;
4875
5256
  }
4876
- declare class AXVideoPickerComponent {
4877
- private readonly composerService;
4878
- private readonly conversationService;
4879
- private readonly fileUploadService;
5257
+ declare class AXVideoPickerComponent implements OnDestroy {
5258
+ private uploadsDismissed;
5259
+ private retainUploadedOnDismiss;
5260
+ readonly service: _angular_core.InputSignal<AXComposerService>;
5261
+ private readonly composerServiceFromInjector;
5262
+ private get composerService();
5263
+ private readonly uploader;
5264
+ private readonly fileService;
5265
+ private readonly fileTypeRegistry;
5266
+ private readonly platformId;
5267
+ private readonly toast;
4880
5268
  readonly translation: AXTranslationService;
4881
5269
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4882
- readonly fileInput: _angular_core.Signal<ElementRef<HTMLInputElement>>;
5270
+ readonly maxFiles: _angular_core.InputSignal<number>;
5271
+ readonly initialFiles: _angular_core.InputSignal<File[]>;
5272
+ readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
5273
+ readonly catalogFileType: "conversation-video";
4883
5274
  readonly videos: _angular_core.WritableSignal<VideoFile[]>;
4884
5275
  readonly isDragging: _angular_core.WritableSignal<boolean>;
4885
5276
  caption: string;
4886
- triggerFileInput(): void;
5277
+ readonly allowMultiple: _angular_core.Signal<boolean>;
5278
+ readonly typeIconClass: "fa-light fa-video ax-text-blue-500";
5279
+ readonly emptyIconClass: _angular_core.Signal<"fa-light fa-video ax-text-blue-500" | "fa-light fa-cloud-arrow-up">;
5280
+ private catalogFileTypeDef?;
5281
+ constructor();
5282
+ private createUtilityContext;
5283
+ private getCatalogFileTypeDef;
5284
+ private runUtility;
4887
5285
  handleFiles(files: File[]): Promise<void>;
4888
- onFileInputChange(event: Event): void;
5286
+ private uploadVideoAt;
5287
+ private patchVideo;
4889
5288
  removeVideo(index: number): void;
4890
- onDragEnter(event: DragEvent): void;
4891
- onDragOver(event: DragEvent): void;
4892
- onDragLeave(event: DragEvent): void;
4893
- onDrop(event: DragEvent): void;
4894
5289
  sendVideos(): Promise<void>;
5290
+ canSend(): boolean;
5291
+ getUploadingLabel(progress: number): string;
5292
+ getCancelUploadLabel(): string;
4895
5293
  cancel(): void;
5294
+ ngOnDestroy(): void;
5295
+ private dismissPicker;
4896
5296
  formatFileSize(bytes: number): string;
4897
5297
  formatDuration(seconds: number): string;
4898
5298
  getEmptyTitle(): string;
@@ -4900,20 +5300,22 @@ declare class AXVideoPickerComponent {
4900
5300
  getSelectedCountText(): string;
4901
5301
  getSendText(): string;
4902
5302
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVideoPickerComponent, never>;
4903
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVideoPickerComponent, "ax-conversation-video-picker", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5303
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVideoPickerComponent, "ax-conversation-video-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4904
5304
  }
4905
5305
 
4906
5306
  declare class AXVoiceRecorderComponent {
4907
5307
  private readonly platformId;
4908
5308
  private readonly destroyRef;
4909
5309
  private readonly composerService;
4910
- private readonly conversationService;
4911
- private readonly messageApi;
5310
+ private readonly uploader;
5311
+ private readonly toast;
4912
5312
  readonly translation: AXTranslationService;
4913
5313
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4914
5314
  readonly recordingComplete: _angular_core.OutputEmitterRef<Blob>;
4915
5315
  readonly recordingCancelled: _angular_core.OutputEmitterRef<void>;
4916
5316
  readonly isRecording: _angular_core.WritableSignal<boolean>;
5317
+ readonly isUploading: _angular_core.WritableSignal<boolean>;
5318
+ readonly uploadProgress: _angular_core.WritableSignal<number>;
4917
5319
  readonly recordingDuration: _angular_core.WritableSignal<number>;
4918
5320
  private recordingStartTime;
4919
5321
  private timerInterval?;
@@ -4921,6 +5323,7 @@ declare class AXVoiceRecorderComponent {
4921
5323
  private audioChunks;
4922
5324
  private activeStream?;
4923
5325
  private cancelled;
5326
+ private uploadAbortController?;
4924
5327
  readonly formattedTime: _angular_core.Signal<string>;
4925
5328
  constructor();
4926
5329
  startRecording(): Promise<void>;
@@ -4929,518 +5332,228 @@ declare class AXVoiceRecorderComponent {
4929
5332
  cancelRecording(): void;
4930
5333
  /** Close the voice recorder */
4931
5334
  cancel(): void;
5335
+ abortInProgressUploads(): void;
4932
5336
  /** Clear timer */
4933
5337
  private clearTimer;
5338
+ getUploadingLabel(): string;
4934
5339
  /** Send voice message */
4935
5340
  private sendVoiceMessage;
4936
5341
  private stopAndCleanup;
4937
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVoiceRecorderComponent, never>;
4938
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVoiceRecorderComponent, "ax-conversation-voice-recorder", never, { "conversation": { "alias": "conversation"; "required": false; "isSignal": true; }; }, { "recordingComplete": "recordingComplete"; "recordingCancelled": "recordingCancelled"; }, never, never, true, never>;
4939
- }
4940
-
4941
- /**
4942
- * Composer Actions Plugin
4943
- * Individual composer action constants
4944
- *
4945
- * Priority Standard (lower number = higher priority):
4946
- * - 10: Emoji (most common)
4947
- * - 20: File attachment (common)
4948
- * - 30: Voice recording (common)
4949
- * - 40: Image (media)
4950
- * - 50: Video (media)
4951
- * - 60: Audio (media)
4952
- * - 70: Location (special)
4953
- */
4954
-
4955
- /**
4956
- * Emoji & Stickers picker action
4957
- */
4958
- declare const AX_CONVERSATION_COMPOSER_EMOJI_ACTION: AXComposerAction;
4959
- /**
4960
- * Image picker action
4961
- */
4962
- declare const AX_CONVERSATION_COMPOSER_IMAGE_ACTION: AXComposerAction;
4963
- /**
4964
- * Video picker action
4965
- */
4966
- declare const AX_CONVERSATION_COMPOSER_VIDEO_ACTION: AXComposerAction;
4967
- /**
4968
- * File picker action
4969
- */
4970
- declare const AX_CONVERSATION_COMPOSER_FILE_ACTION: AXComposerAction;
4971
- /**
4972
- * Voice recording action
4973
- */
4974
- declare const AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION: AXComposerAction;
4975
- /**
4976
- * Audio file picker action
4977
- */
4978
- declare const AX_CONVERSATION_COMPOSER_AUDIO_ACTION: AXComposerAction;
4979
- /**
4980
- * Location picker action
4981
- */
4982
- declare const AX_CONVERSATION_COMPOSER_LOCATION_ACTION: AXComposerAction;
4983
-
4984
- declare class AXConversationInfoPanelComponent extends AXClosableComponent implements OnInit, OnDestroy {
4985
- private readonly toastService;
4986
- readonly translation: AXTranslationService;
4987
- /** Event emitted when popup should close */
4988
- readonly onClosed: _angular_core.OutputEmitterRef<AXComponentCloseEvent>;
4989
- /** Conversation (typically passed via popup data). */
4990
- conversation: AXConversation;
4991
- conversationService: AXConversationService;
4992
- /**
4993
- * Conversation service used by panel actions.
4994
- * Kept assignable for backward compatibility with popup `data`,
4995
- * but defaults to DI so this panel works without explicit data wiring.
4996
- */
4997
- notificationsEnabled: boolean;
4998
- showPreview: boolean;
4999
- archived: boolean;
5000
- private initialNotifications;
5001
- private initialShowPreview;
5002
- private initialArchived;
5003
- memberSearchQuery: string;
5004
- activeTab: string;
5005
- editTitle: string;
5006
- editAvatar: string;
5007
- readonly backgroundPresets: Array<{
5008
- id: string;
5009
- label: string;
5010
- value: string;
5011
- }>;
5012
- /** Get filtered members based on search */
5013
- get filteredMembers(): _acorex_components_conversation2.AXParticipant[];
5014
- /** Handle tab change */
5015
- onTabChange(event: any): void;
5016
- ngOnInit(): void;
5017
- /** Get initials from name */
5018
- getInitials(name: string): string;
5019
- /** Get conversation subtitle */
5020
- getSubtitle(): string;
5021
- /** Get type label */
5022
- getTypeLabel(): string;
5023
- /** Handle notifications change */
5024
- onNotificationsChange(value: boolean): Promise<void>;
5025
- /** Handle show preview change */
5026
- onShowPreviewChange(value: boolean): Promise<void>;
5027
- /** Handle archived change */
5028
- onArchivedChange(value: boolean): Promise<void>;
5029
- /** Implement AXClosableComponent.close() */
5030
- close(data?: unknown): void;
5031
- /** Implement AXClosableComponent.closeAll() */
5032
- closeAll(): void;
5033
- /** Handle leave conversation */
5034
- onLeave(): Promise<void>;
5035
- /** Get member count text */
5036
- getMemberCountText(): string;
5037
- /** Get formatted date */
5038
- getFormattedDate(date: Date): string;
5039
- /** Check if can save edit */
5040
- canSaveEdit(): boolean;
5041
- /** Save edit */
5042
- saveEdit(): Promise<void>;
5043
- currentBackground(): string;
5044
- isBackgroundSelected(value: string): boolean;
5045
- applyMessageListBackground(value: string): Promise<void>;
5046
- ngOnDestroy(): void;
5047
- getMembersTabLabel(): string;
5048
- getBackgroundAriaLabel(label: string): string;
5049
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationInfoPanelComponent, never>;
5050
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationInfoPanelComponent, "ax-conversation-info-panel", never, {}, { "onClosed": "onClosed"; }, never, never, true, never>;
5051
- }
5052
-
5053
- declare class AXInfoBarSearchComponent {
5054
- private readonly platformId;
5055
- private readonly destroyRef;
5056
- private readonly infoBarService;
5057
- private readonly conversationService;
5058
- /** Conversation input */
5059
- readonly conversation: _angular_core.InputSignal<AXConversation>;
5060
- /** Service input */
5061
- readonly service: _angular_core.InputSignal<AXInfoBarService>;
5062
- /** Search query from service */
5063
- readonly searchQuery: _angular_core.Signal<string>;
5064
- /** Results count from service */
5065
- readonly resultsCount: _angular_core.Signal<number>;
5066
- /** Current index from service */
5067
- readonly currentIndex: _angular_core.Signal<number>;
5068
- /** Messages from conversation */
5069
- readonly messages: _angular_core.Signal<_acorex_components_conversation2.AXMessage[]>;
5070
- private scrollTimer?;
5071
- constructor();
5072
- /** Handle search input change */
5073
- onSearchChange(value: string): void;
5074
- /** Perform search in messages */
5075
- private performSearch;
5076
- /** Navigate to next result */
5077
- onNext(): void;
5078
- /** Navigate to previous result */
5079
- onPrevious(): void;
5080
- /** Scroll to current search result */
5081
- private scrollToCurrentResult;
5082
- private scrollToResult;
5083
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfoBarSearchComponent, never>;
5084
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXInfoBarSearchComponent, "ax-info-bar-search", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "service": { "alias": "service"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5085
- }
5086
-
5087
- /**
5088
- * Info Bar Actions Plugin
5089
- * Individual info bar action constants
5090
- */
5091
-
5092
- /**
5093
- * Search in conversation action (inline)
5094
- */
5095
- declare const AX_CONVERSATION_INFO_BAR_SEARCH_ACTION: AXInfoBarAction;
5096
- /**
5097
- * Show conversation info action (menu)
5098
- */
5099
- declare const AX_CONVERSATION_INFO_BAR_INFO_ACTION: AXInfoBarAction;
5100
- /**
5101
- * Mute/Unmute notifications action (menu)
5102
- */
5103
- declare const AX_CONVERSATION_INFO_BAR_MUTE_ACTION: AXInfoBarAction;
5104
- /**
5105
- * Divider separator (menu)
5106
- */
5107
- declare const AX_CONVERSATION_INFO_BAR_DIVIDER: AXInfoBarAction;
5108
- /**
5109
- * Archive/Unarchive conversation action (menu)
5110
- */
5111
- declare const AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION: AXInfoBarAction;
5112
- /**
5113
- * Delete/Leave conversation action (smart action that adapts based on conversation type)
5114
- * - Private: "Delete" - Deletes the conversation
5115
- * - Group/Channel: "Leave & Delete" - Leaves the group and removes it from list
5116
- */
5117
- declare const AX_CONVERSATION_INFO_BAR_DELETE_ACTION: AXInfoBarAction;
5118
- /**
5119
- * Block user action (private chats only, menu)
5120
- */
5121
- declare const AX_CONVERSATION_INFO_BAR_BLOCK_ACTION: AXInfoBarAction;
5122
-
5123
- /**
5124
- * Shared UI for message bubble bodies: sending / failed (with retry) and content load errors,
5125
- * driven by {@link AXMessageRendererState}.
5126
- */
5127
- declare class AXConversationMessageRendererStateComponent {
5128
- private readonly conversation;
5129
- readonly translation: AXTranslationService;
5130
- readonly rendererState: _angular_core.InputSignal<AXMessageRendererState>;
5131
- readonly message: _angular_core.InputSignal<AXMessage>;
5132
- /** Overrides default text when {@link AXMessageRendererState.contentState} is `error`. */
5133
- readonly contentErrorLabel: _angular_core.InputSignal<string>;
5134
- /** Overrides default text when delivery failed. */
5135
- readonly deliveryFailedLabel: _angular_core.InputSignal<string>;
5136
- /** Set false when the renderer shows content errors inline (e.g. inline media error state). */
5137
- readonly showContentErrorChrome: _angular_core.InputSignal<boolean>;
5138
- /** `inline` matches legacy media rows (e.g. audio): compact danger text under the player. */
5139
- readonly contentErrorStyle: _angular_core.InputSignal<"inline" | "banner">;
5140
- /** Icon class for content error (e.g. `fa-light fa-music` for audio). */
5141
- readonly contentErrorIconClass: _angular_core.InputSignal<string>;
5142
- /** `below`: render after main bubble body (typical for media). */
5143
- readonly placement: _angular_core.InputSignal<"above" | "below">;
5144
- readonly contentRetryEnabled: _angular_core.InputSignal<boolean>;
5145
- readonly contentRetry: _angular_core.OutputEmitterRef<void>;
5146
- readonly retryBusy: _angular_core.WritableSignal<boolean>;
5147
- private readonly currentUser;
5148
- private readonly isOwn;
5149
- readonly showSending: _angular_core.Signal<boolean>;
5150
- readonly showFailed: _angular_core.Signal<boolean>;
5151
- readonly showContentError: _angular_core.Signal<boolean>;
5152
- readonly hasVisibleChrome: _angular_core.Signal<boolean>;
5153
- readonly showRetryButton: _angular_core.Signal<boolean>;
5154
- readonly contentErrorText: _angular_core.Signal<string>;
5155
- readonly deliveryFailedText: _angular_core.Signal<string>;
5156
- onRetry(): Promise<void>;
5157
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationMessageRendererStateComponent, never>;
5158
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationMessageRendererStateComponent, "ax-conversation-message-renderer-state", never, { "rendererState": { "alias": "rendererState"; "required": true; "isSignal": true; }; "message": { "alias": "message"; "required": true; "isSignal": true; }; "contentErrorLabel": { "alias": "contentErrorLabel"; "required": false; "isSignal": true; }; "deliveryFailedLabel": { "alias": "deliveryFailedLabel"; "required": false; "isSignal": true; }; "showContentErrorChrome": { "alias": "showContentErrorChrome"; "required": false; "isSignal": true; }; "contentErrorStyle": { "alias": "contentErrorStyle"; "required": false; "isSignal": true; }; "contentErrorIconClass": { "alias": "contentErrorIconClass"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "contentRetryEnabled": { "alias": "contentRetryEnabled"; "required": false; "isSignal": true; }; }, { "contentRetry": "contentRetry"; }, never, never, true, never>;
5159
- }
5160
-
5161
- declare class AXAudioRendererComponent implements AXMessageRendererComponent {
5162
- private readonly platformId;
5163
- private readonly destroyRef;
5164
- private readonly infoBarService;
5165
- private readonly audioElementRef;
5166
- private readonly _contentState;
5167
- readonly message: _angular_core.InputSignal<AXMessage>;
5168
- readonly rendererState: _angular_core.Signal<{
5169
- deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5170
- contentState: AXMessageRendererContentState;
5171
- }>;
5172
- readonly isPlaying: _angular_core.WritableSignal<boolean>;
5173
- readonly isMuted: _angular_core.WritableSignal<boolean>;
5174
- readonly currentTime: _angular_core.WritableSignal<number>;
5175
- readonly duration: _angular_core.WritableSignal<number>;
5176
- readonly payload: _angular_core.Signal<AXAudioPayload>;
5177
- readonly audioUrl: _angular_core.Signal<string>;
5178
- readonly title: _angular_core.Signal<string>;
5179
- readonly progress: _angular_core.Signal<number>;
5180
- readonly currentTimeFormatted: _angular_core.Signal<string>;
5181
- readonly durationFormatted: _angular_core.Signal<string>;
5182
- constructor();
5183
- togglePlay(): void;
5184
- toggleMute(): void;
5185
- onTimeUpdate(): void;
5186
- onEnded(): void;
5187
- onError(): void;
5188
- onProgressClick(event: MouseEvent): void;
5189
- private pausePlayback;
5190
- private syncInfoBarBanner;
5191
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXAudioRendererComponent, never>;
5192
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXAudioRendererComponent, "ax-conversation-audio-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5193
- }
5194
-
5195
- declare class AXAudioInfoBarBannerComponent implements AXMessageInfoBarBannerComponent {
5196
- readonly message: _angular_core.InputSignal<AXMessage>;
5197
- readonly title: _angular_core.InputSignal<string>;
5198
- readonly currentTime: _angular_core.InputSignal<number>;
5199
- readonly duration: _angular_core.InputSignal<number>;
5200
- private readonly payload;
5201
- readonly resolvedTitle: _angular_core.Signal<string>;
5202
- readonly progressPercent: _angular_core.Signal<number>;
5203
- readonly timeLabel: _angular_core.Signal<string>;
5204
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXAudioInfoBarBannerComponent, never>;
5205
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXAudioInfoBarBannerComponent, "ax-conversation-audio-info-bar-banner", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5206
- }
5207
-
5208
- declare class AXFallbackRendererComponent implements AXMessageRendererComponent {
5209
- private readonly _contentState;
5210
- readonly message: _angular_core.InputSignal<AXMessage>;
5211
- readonly rendererState: _angular_core.Signal<{
5212
- deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5213
- contentState: AXMessageRendererContentState;
5214
- }>;
5215
- readonly messageTypeLabel: _angular_core.Signal<string>;
5216
- /** Same tone as content-error default in {@link AXConversationMessageRendererStateComponent}. */
5217
- readonly fallbackDescription: _angular_core.Signal<string>;
5218
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFallbackRendererComponent, never>;
5219
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFallbackRendererComponent, "ax-conversation-fallback-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5220
- }
5221
-
5222
- declare class AXFileRendererComponent implements AXMessageRendererComponent {
5223
- private readonly _contentState;
5224
- readonly message: _angular_core.InputSignal<AXMessage>;
5225
- readonly rendererState: _angular_core.Signal<{
5226
- deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5227
- contentState: AXMessageRendererContentState;
5228
- }>;
5229
- readonly payload: _angular_core.Signal<AXFilePayload>;
5230
- readonly fileUrl: _angular_core.Signal<string>;
5231
- readonly fileName: _angular_core.Signal<string>;
5232
- readonly fileSize: _angular_core.Signal<number>;
5233
- readonly mimeType: _angular_core.Signal<string>;
5234
- readonly fileExtension: _angular_core.Signal<string>;
5235
- readonly swatchColor: _angular_core.Signal<string>;
5236
- readonly formattedSize: _angular_core.Signal<string>;
5237
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFileRendererComponent, never>;
5238
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFileRendererComponent, "ax-conversation-file-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5239
- }
5240
-
5241
- declare class AXImageRendererComponent implements AXMessageRendererComponent {
5242
- private readonly platformId;
5243
- private readonly _contentState;
5244
- readonly message: _angular_core.InputSignal<AXMessage>;
5245
- readonly rendererState: _angular_core.Signal<{
5246
- deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5247
- contentState: AXMessageRendererContentState;
5248
- }>;
5249
- readonly imageClick: _angular_core.OutputEmitterRef<string>;
5250
- readonly payload: _angular_core.Signal<AXImagePayload>;
5251
- readonly thumbnailUrl: _angular_core.Signal<string>;
5252
- readonly alt: _angular_core.Signal<string>;
5253
- readonly caption: _angular_core.Signal<string>;
5254
- constructor();
5255
- onLoad(): void;
5256
- onError(): void;
5257
- onClick(): void;
5258
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXImageRendererComponent, never>;
5259
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXImageRendererComponent, "ax-conversation-image-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, { "imageClick": "imageClick"; }, never, never, true, never>;
5260
- }
5261
-
5262
- declare class AXLocationRendererComponent implements AXMessageRendererComponent {
5263
- private readonly _contentState;
5264
- readonly message: _angular_core.InputSignal<AXMessage>;
5265
- readonly rendererState: _angular_core.Signal<{
5266
- deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5267
- contentState: AXMessageRendererContentState;
5268
- }>;
5269
- readonly payload: _angular_core.Signal<AXLocationPayload>;
5270
- readonly latitude: _angular_core.Signal<number>;
5271
- readonly longitude: _angular_core.Signal<number>;
5272
- readonly locationName: _angular_core.Signal<string>;
5273
- readonly address: _angular_core.Signal<string>;
5274
- readonly coordinatesText: _angular_core.Signal<string>;
5275
- readonly mapsUrl: _angular_core.Signal<string>;
5276
- readonly markers: _angular_core.Signal<{
5277
- latitude: number;
5278
- longitude: number;
5279
- popup: string;
5280
- popupOpen: boolean;
5281
- popupCloseButton: boolean;
5282
- }[]>;
5283
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXLocationRendererComponent, never>;
5284
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXLocationRendererComponent, "ax-conversation-location-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5285
- }
5286
-
5287
- declare class AXStickerRendererComponent implements AXMessageRendererComponent {
5288
- private readonly _contentState;
5289
- readonly message: _angular_core.InputSignal<AXMessage>;
5290
- readonly rendererState: _angular_core.Signal<{
5291
- deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5292
- contentState: AXMessageRendererContentState;
5293
- }>;
5294
- readonly payload: _angular_core.Signal<AXStickerPayload>;
5295
- readonly stickerUrl: _angular_core.Signal<string>;
5296
- readonly alt: _angular_core.Signal<string>;
5297
- constructor();
5298
- onLoad(): void;
5299
- onError(): void;
5300
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXStickerRendererComponent, never>;
5301
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXStickerRendererComponent, "ax-conversation-sticker-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5302
- }
5303
-
5304
- declare class AXSystemRendererComponent implements AXMessageRendererComponent {
5305
- private readonly _contentState;
5306
- readonly message: _angular_core.InputSignal<AXMessage>;
5307
- readonly rendererState: _angular_core.Signal<{
5308
- deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5309
- contentState: AXMessageRendererContentState;
5310
- }>;
5311
- readonly payload: _angular_core.Signal<AXSystemPayload>;
5312
- readonly iconClass: _angular_core.Signal<string>;
5313
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSystemRendererComponent, never>;
5314
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSystemRendererComponent, "ax-conversation-system-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5342
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVoiceRecorderComponent, never>;
5343
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVoiceRecorderComponent, "ax-conversation-voice-recorder", never, { "conversation": { "alias": "conversation"; "required": false; "isSignal": true; }; }, { "recordingComplete": "recordingComplete"; "recordingCancelled": "recordingCancelled"; }, never, never, true, never>;
5315
5344
  }
5316
5345
 
5317
- declare class AXTextRendererComponent implements AXMessageRendererComponent {
5318
- private readonly infoBarService;
5319
- private readonly sanitizer;
5320
- private readonly _contentState;
5321
- readonly message: _angular_core.InputSignal<AXMessage>;
5322
- readonly rendererState: _angular_core.Signal<{
5323
- deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5324
- contentState: AXMessageRendererContentState;
5325
- }>;
5326
- readonly searchQuery: _angular_core.Signal<string>;
5327
- readonly formattedText: _angular_core.Signal<SafeHtml>;
5328
- private linkify;
5329
- private highlightSearch;
5330
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXTextRendererComponent, never>;
5331
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXTextRendererComponent, "ax-conversation-text-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5346
+ declare class AXConversationAudioFileTypeProvider extends AXFileTypeInfoProvider {
5347
+ items(): Promise<AXFileType<Record<string, (ctx: {
5348
+ readAsDataUrl: (file: File | Blob) => Promise<string>;
5349
+ platformId: object;
5350
+ }, ...args: unknown[]) => Promise<unknown> | unknown>>[]>;
5351
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAudioFileTypeProvider, never>;
5352
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationAudioFileTypeProvider>;
5332
5353
  }
5333
5354
 
5355
+ declare class AXConversationFileFileTypeProvider extends AXFileTypeInfoProvider {
5356
+ items(): Promise<AXFileType<Record<string, (ctx: {
5357
+ readAsDataUrl: (file: File | Blob) => Promise<string>;
5358
+ platformId: object;
5359
+ }, ...args: unknown[]) => Promise<unknown> | unknown>>[]>;
5360
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationFileFileTypeProvider, never>;
5361
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationFileFileTypeProvider>;
5362
+ }
5363
+
5364
+ declare class AXConversationImageFileTypeProvider extends AXFileTypeInfoProvider {
5365
+ items(): Promise<AXFileType<Record<string, (ctx: {
5366
+ readAsDataUrl: (file: File | Blob) => Promise<string>;
5367
+ platformId: object;
5368
+ }, ...args: unknown[]) => Promise<unknown> | unknown>>[]>;
5369
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationImageFileTypeProvider, never>;
5370
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationImageFileTypeProvider>;
5371
+ }
5372
+
5373
+ declare class AXConversationVideoFileTypeProvider extends AXFileTypeInfoProvider {
5374
+ items(): Promise<AXFileType<Record<string, (ctx: {
5375
+ readAsDataUrl: (file: File | Blob) => Promise<string>;
5376
+ platformId: object;
5377
+ }, ...args: unknown[]) => Promise<unknown> | unknown>>[]>;
5378
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationVideoFileTypeProvider, never>;
5379
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationVideoFileTypeProvider>;
5380
+ }
5381
+
5382
+ declare class AXConversationVoiceFileTypeProvider extends AXFileTypeInfoProvider {
5383
+ items(): Promise<AXFileType<Record<string, (ctx: {
5384
+ readAsDataUrl: (file: File | Blob) => Promise<string>;
5385
+ platformId: object;
5386
+ }, ...args: unknown[]) => Promise<unknown> | unknown>>[]>;
5387
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationVoiceFileTypeProvider, never>;
5388
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationVoiceFileTypeProvider>;
5389
+ }
5390
+
5391
+ /** Built-in composer media file type providers (one per picker plugin). */
5392
+ declare const AX_CONVERSATION_COMPOSER_FILE_TYPE_PROVIDERS: readonly [typeof AXConversationImageFileTypeProvider, typeof AXConversationVideoFileTypeProvider, typeof AXConversationAudioFileTypeProvider, typeof AXConversationFileFileTypeProvider, typeof AXConversationVoiceFileTypeProvider];
5334
5393
  /**
5335
- * Video message: with thumbnail tap poster to play inline; without thumbnail — native `<video>` only.
5394
+ * Ensures built-in conversation catalogs exist on the root {@link AXFileTypeRegistryService}
5395
+ * before registries validate composer actions (inject from conversation providers).
5336
5396
  */
5337
- declare class AXVideoRendererComponent implements AXMessageRendererComponent {
5338
- private readonly platformId;
5339
- private readonly destroyRef;
5340
- private readonly infoBarService;
5341
- private readonly videoElementRef;
5342
- private readonly _contentState;
5343
- readonly message: _angular_core.InputSignal<AXMessage>;
5344
- readonly rendererState: _angular_core.Signal<{
5345
- deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5346
- contentState: AXMessageRendererContentState;
5347
- }>;
5348
- readonly showPlayer: _angular_core.WritableSignal<boolean>;
5349
- readonly isPlaying: _angular_core.WritableSignal<boolean>;
5350
- readonly currentTime: _angular_core.WritableSignal<number>;
5351
- readonly payload: _angular_core.Signal<AXVideoPayload>;
5352
- readonly playbackUrl: _angular_core.Signal<string>;
5353
- readonly thumbnailUrl: _angular_core.Signal<string>;
5354
- readonly hasThumbnail: _angular_core.Signal<boolean>;
5355
- readonly duration: _angular_core.Signal<number>;
5356
- readonly caption: _angular_core.Signal<string>;
5357
- readonly durationLabel: _angular_core.Signal<string>;
5358
- readonly showDurationBadge: _angular_core.Signal<boolean>;
5359
- readonly playAriaLabel: _angular_core.Signal<string>;
5360
- constructor();
5361
- playVideo(): void;
5362
- onPlay(): void;
5363
- onPause(): void;
5364
- onTimeUpdate(): void;
5365
- onEnded(): void;
5366
- onThumbLoad(): void;
5367
- onThumbError(): void;
5368
- onVideoLoaded(): void;
5369
- onError(): void;
5370
- private pausePlayback;
5371
- private syncInfoBarBanner;
5372
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVideoRendererComponent, never>;
5373
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVideoRendererComponent, "ax-conversation-video-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5374
- }
5397
+ declare const CONVERSATION_FILE_TYPES_READY: InjectionToken<boolean>;
5398
+ /** Registers validation rules, file-type providers, and root catalog bootstrap for conversation2. */
5399
+ declare function provideConversationComposerFileTypes(): Provider[];
5400
+ declare const AX_CONVERSATION_COMPOSER_EMOJI_ACTION: AXComposerAction;
5401
+ declare const AX_CONVERSATION_COMPOSER_IMAGE_ACTION: AXComposerAction;
5402
+ declare const AX_CONVERSATION_COMPOSER_VIDEO_ACTION: AXComposerAction;
5403
+ declare const AX_CONVERSATION_COMPOSER_FILE_ACTION: AXComposerAction;
5404
+ declare const AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION: AXComposerAction;
5405
+ declare const AX_CONVERSATION_COMPOSER_AUDIO_ACTION: AXComposerAction;
5406
+ declare const AX_CONVERSATION_COMPOSER_LOCATION_ACTION: AXComposerAction;
5375
5407
 
5376
- declare class AXVideoInfoBarBannerComponent implements AXMessageInfoBarBannerComponent {
5377
- readonly message: _angular_core.InputSignal<AXMessage>;
5378
- readonly title: _angular_core.InputSignal<string>;
5379
- readonly currentTime: _angular_core.InputSignal<number>;
5380
- readonly duration: _angular_core.InputSignal<number>;
5381
- private readonly payload;
5382
- readonly resolvedTitle: _angular_core.Signal<string>;
5383
- readonly progressPercent: _angular_core.Signal<number>;
5384
- readonly timeLabel: _angular_core.Signal<string>;
5385
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVideoInfoBarBannerComponent, never>;
5386
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVideoInfoBarBannerComponent, "ax-conversation-video-info-bar-banner", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5408
+ declare function mergeUploadResult(type: AXMessageType, payload: AXMessagePayload, result: AXUploadResult): AXMessagePayload;
5409
+ declare function applyLocalPreview(type: AXMessageType, payload: AXMessagePayload, localUrl: string, mimeType?: string): AXMessagePayload;
5410
+ declare function toUploaderReference(payload: AXMessagePayload): AXUploaderReference;
5411
+ declare function createObjectUrl(platformId: object, blob: Blob): string;
5412
+ declare function revokeObjectUrl(platformId: object, url: string): void;
5413
+ declare function createLocalPreviewUrl(fileService: AXFileService, platformId: object, source: File | Blob, messageType: AXMessageType): Promise<string | undefined>;
5414
+
5415
+ declare class AXConversationInfoPanelComponent extends AXClosableComponent implements OnInit, OnDestroy {
5416
+ private readonly toastService;
5417
+ readonly translation: AXTranslationService;
5418
+ /** Event emitted when popup should close */
5419
+ readonly onClosed: _angular_core.OutputEmitterRef<AXComponentCloseEvent>;
5420
+ /** Conversation (typically passed via popup data). */
5421
+ conversation: AXConversation;
5422
+ conversationService: AXConversationService;
5423
+ /**
5424
+ * Conversation service used by panel actions.
5425
+ * Kept assignable for backward compatibility with popup `data`,
5426
+ * but defaults to DI so this panel works without explicit data wiring.
5427
+ */
5428
+ notificationsEnabled: boolean;
5429
+ showPreview: boolean;
5430
+ archived: boolean;
5431
+ private initialNotifications;
5432
+ private initialShowPreview;
5433
+ private initialArchived;
5434
+ memberSearchQuery: string;
5435
+ activeTab: string;
5436
+ editTitle: string;
5437
+ editAvatar: string;
5438
+ readonly backgroundPresets: Array<{
5439
+ id: string;
5440
+ label: string;
5441
+ value: string;
5442
+ }>;
5443
+ /** Get filtered members based on search */
5444
+ get filteredMembers(): _acorex_components_conversation2.AXParticipant[];
5445
+ /** Handle tab change */
5446
+ onTabChange(event: any): void;
5447
+ ngOnInit(): void;
5448
+ /** Get conversation subtitle */
5449
+ getSubtitle(): string;
5450
+ /** Get type label */
5451
+ getTypeLabel(): string;
5452
+ /** Handle notifications change */
5453
+ onNotificationsChange(value: boolean): Promise<void>;
5454
+ /** Handle show preview change */
5455
+ onShowPreviewChange(value: boolean): Promise<void>;
5456
+ /** Handle archived change */
5457
+ onArchivedChange(value: boolean): Promise<void>;
5458
+ /** Implement AXClosableComponent.close() */
5459
+ close(data?: unknown): void;
5460
+ /** Implement AXClosableComponent.closeAll() */
5461
+ closeAll(): void;
5462
+ /** Handle leave conversation */
5463
+ onLeave(): Promise<void>;
5464
+ /** Get member count text */
5465
+ getMemberCountText(): string;
5466
+ /** Get formatted date */
5467
+ getFormattedDate(date: Date): string;
5468
+ /** Check if can save edit */
5469
+ canSaveEdit(): boolean;
5470
+ /** Save edit */
5471
+ saveEdit(): Promise<void>;
5472
+ currentBackground(): string;
5473
+ isBackgroundSelected(value: string): boolean;
5474
+ applyMessageListBackground(value: string): Promise<void>;
5475
+ ngOnDestroy(): void;
5476
+ getMembersTabLabel(): string;
5477
+ getBackgroundAriaLabel(label: string): string;
5478
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationInfoPanelComponent, never>;
5479
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationInfoPanelComponent, "ax-conversation-info-panel", never, {}, { "onClosed": "onClosed"; }, never, never, true, never>;
5387
5480
  }
5388
5481
 
5389
- declare class AXVoiceRendererComponent implements AXMessageRendererComponent {
5482
+ declare class AXInfoBarSearchComponent {
5390
5483
  private readonly platformId;
5391
5484
  private readonly destroyRef;
5392
5485
  private readonly infoBarService;
5393
- private readonly audioElementRef;
5394
- private readonly _contentState;
5395
- readonly message: _angular_core.InputSignal<AXMessage>;
5396
- readonly rendererState: _angular_core.Signal<{
5397
- deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5398
- contentState: AXMessageRendererContentState;
5399
- }>;
5400
- readonly isPlaying: _angular_core.WritableSignal<boolean>;
5401
- readonly currentTime: _angular_core.WritableSignal<number>;
5402
- readonly duration: _angular_core.WritableSignal<number>;
5403
- readonly playbackSpeed: _angular_core.WritableSignal<number>;
5404
- private readonly speeds;
5405
- readonly payload: _angular_core.Signal<AXVoicePayload>;
5406
- readonly voiceUrl: _angular_core.Signal<string>;
5407
- readonly waveformBars: _angular_core.Signal<number[]>;
5408
- readonly activeBarIndex: _angular_core.Signal<number>;
5409
- readonly timeLabel: _angular_core.Signal<string>;
5486
+ private readonly conversationService;
5487
+ /** Conversation input */
5488
+ readonly conversation: _angular_core.InputSignal<AXConversation>;
5489
+ /** Service input */
5490
+ readonly service: _angular_core.InputSignal<AXInfoBarService>;
5491
+ /** Search query from service */
5492
+ readonly searchQuery: _angular_core.Signal<string>;
5493
+ /** Results count from service */
5494
+ readonly resultsCount: _angular_core.Signal<number>;
5495
+ /** Current index from service */
5496
+ readonly currentIndex: _angular_core.Signal<number>;
5497
+ /** Messages from conversation */
5498
+ readonly messages: _angular_core.Signal<_acorex_components_conversation2.AXMessage[]>;
5499
+ private scrollTimer?;
5410
5500
  constructor();
5411
- togglePlay(): void;
5412
- cyclePlaybackSpeed(): void;
5413
- onTimeUpdate(): void;
5414
- onEnded(): void;
5415
- onError(): void;
5416
- private pausePlayback;
5417
- private syncInfoBarBanner;
5418
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVoiceRendererComponent, never>;
5419
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVoiceRendererComponent, "ax-conversation-voice-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5501
+ /** Handle search input change */
5502
+ onSearchChange(value: string): void;
5503
+ /** Perform search in messages */
5504
+ private performSearch;
5505
+ /** Navigate to next result */
5506
+ onNext(): void;
5507
+ /** Navigate to previous result */
5508
+ onPrevious(): void;
5509
+ /** Scroll to current search result */
5510
+ private scrollToCurrentResult;
5511
+ private scrollToResult;
5512
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfoBarSearchComponent, never>;
5513
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXInfoBarSearchComponent, "ax-info-bar-search", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "service": { "alias": "service"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5420
5514
  }
5421
5515
 
5422
- declare class AXVoiceInfoBarBannerComponent implements AXMessageInfoBarBannerComponent {
5423
- readonly message: _angular_core.InputSignal<AXMessage>;
5424
- readonly title: _angular_core.InputSignal<string>;
5425
- readonly currentTime: _angular_core.InputSignal<number>;
5426
- readonly duration: _angular_core.InputSignal<number>;
5427
- private readonly payload;
5428
- readonly resolvedTitle: _angular_core.Signal<string>;
5429
- readonly progressPercent: _angular_core.Signal<number>;
5430
- readonly timeLabel: _angular_core.Signal<string>;
5431
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVoiceInfoBarBannerComponent, never>;
5432
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVoiceInfoBarBannerComponent, "ax-conversation-voice-info-bar-banner", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5433
- }
5516
+ /**
5517
+ * Info Bar Actions Plugin
5518
+ * Individual info bar action constants
5519
+ */
5434
5520
 
5435
5521
  /**
5436
- * Default Message Actions Plugin
5437
- * Individual message action constants
5522
+ * Search in conversation action (inline)
5523
+ */
5524
+ declare const AX_CONVERSATION_INFO_BAR_SEARCH_ACTION: AXInfoBarAction;
5525
+ /**
5526
+ * Show conversation info action (menu)
5527
+ */
5528
+ declare const AX_CONVERSATION_INFO_BAR_INFO_ACTION: AXInfoBarAction;
5529
+ /**
5530
+ * Mute/Unmute notifications action (menu)
5531
+ */
5532
+ declare const AX_CONVERSATION_INFO_BAR_MUTE_ACTION: AXInfoBarAction;
5533
+ /**
5534
+ * Divider separator (menu)
5535
+ */
5536
+ declare const AX_CONVERSATION_INFO_BAR_DIVIDER: AXInfoBarAction;
5537
+ /**
5538
+ * Archive/Unarchive conversation action (menu)
5539
+ */
5540
+ declare const AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION: AXInfoBarAction;
5541
+ /**
5542
+ * Delete/Leave conversation action (smart action that adapts based on conversation type)
5543
+ * - Private: "Delete" - Deletes the conversation
5544
+ * - Group/Channel: "Leave & Delete" - Leaves the group and removes it from list
5545
+ */
5546
+ declare const AX_CONVERSATION_INFO_BAR_DELETE_ACTION: AXInfoBarAction;
5547
+ /**
5548
+ * Block user action (private chats only, menu)
5438
5549
  */
5550
+ declare const AX_CONVERSATION_INFO_BAR_BLOCK_ACTION: AXInfoBarAction;
5439
5551
 
5440
5552
  /**
5441
- * Copy message text to clipboard
5553
+ * Default Message Actions Plugin
5554
+ * Individual message action constants
5442
5555
  */
5443
- declare const AX_CONVERSATION_MESSAGE_COPY_ACTION: AXMessageAction;
5556
+
5444
5557
  /**
5445
5558
  * Reply to message
5446
5559
  */
@@ -5505,11 +5618,6 @@ declare const AX_CONVERSATION_ITEM_DELETE_ACTION: AXConversationItemAction;
5505
5618
  * Block/Unblock user (private conversations only)
5506
5619
  */
5507
5620
  declare const AX_CONVERSATION_ITEM_BLOCK_ACTION: AXConversationItemAction;
5508
- /**
5509
- * Get all default conversation item actions
5510
- * @deprecated Use individual action constants instead (e.g., AX_CONVERSATION_ITEM_MUTE_ACTION)
5511
- */
5512
- declare function getDefaultConversationItemActions(): AXConversationItemAction[];
5513
5621
 
5514
5622
  /**
5515
5623
  * Default Conversation Tabs Plugin
@@ -5540,6 +5648,8 @@ interface AXConversationOptions {
5540
5648
  config?: Partial<AXConversationConfig>;
5541
5649
  /** Registry configuration */
5542
5650
  registry?: Partial<AXRegistryConfiguration>;
5651
+ /** Optional custom avatar components for the entire conversation UI */
5652
+ avatarComponents?: AXConversationAvatarComponents;
5543
5653
  }
5544
5654
  declare class AXConversation2Module {
5545
5655
  /**
@@ -5585,6 +5695,18 @@ declare class AXConversation2Module {
5585
5695
  */
5586
5696
  declare function provideConversation(options: AXConversationOptions): Provider[];
5587
5697
 
5698
+ interface AXConversationAvatarDisplay {
5699
+ name: string;
5700
+ avatar?: string;
5701
+ icon?: string;
5702
+ }
5703
+ /** Other participant in a private chat (excludes the current user). */
5704
+ declare function resolvePrivatePeerUserId(conversation: AXConversation, currentUserId?: string): string | undefined;
5705
+ /** Whether `auto` kind should render a user avatar for this conversation. */
5706
+ declare function shouldUseUserAvatarForConversation(conversation: AXConversation, currentUserId?: string): boolean;
5707
+ declare function resolveUserAvatarDisplay(userId: string, conversation: AXConversation | undefined, message?: AXMessage): AXConversationAvatarDisplay;
5708
+ declare function resolveConversationAvatarDisplay(conversation: AXConversation): AXConversationAvatarDisplay;
5709
+
5588
5710
  declare class AXConversationDateUtilsService {
5589
5711
  /**
5590
5712
  * Format relative time (e.g., "2m ago", "1h ago")
@@ -5691,7 +5813,7 @@ declare class AXConversationMessageUtilsService {
5691
5813
 
5692
5814
  /**
5693
5815
  * Validation Utilities
5694
- * Centralized validation functions for messages, files, and user input
5816
+ * Centralized validation functions for messages and user input
5695
5817
  */
5696
5818
 
5697
5819
  /**
@@ -5705,15 +5827,6 @@ interface AXValidationResult {
5705
5827
  /** Error code for programmatic handling */
5706
5828
  errorCode?: string;
5707
5829
  }
5708
- /**
5709
- * File validation result with additional metadata
5710
- */
5711
- interface AXFileValidationResult extends AXValidationResult {
5712
- /** File size in bytes */
5713
- size?: number;
5714
- /** File type/MIME type */
5715
- type?: string;
5716
- }
5717
5830
  /**
5718
5831
  * Validate message text content
5719
5832
  * @param text - Text to validate
@@ -5721,13 +5834,6 @@ interface AXFileValidationResult extends AXValidationResult {
5721
5834
  * @returns Validation result
5722
5835
  */
5723
5836
  declare function validateMessageText(text: string | undefined, config: AXConversationConfig): AXValidationResult;
5724
- /**
5725
- * Validate file upload
5726
- * @param file - File to validate
5727
- * @param config - Configuration for validation rules
5728
- * @returns File validation result
5729
- */
5730
- declare function validateFile(file: File, config: AXConversationConfig): AXFileValidationResult;
5731
5837
  /**
5732
5838
  * Validate conversation ID
5733
5839
  * @param conversationId - Conversation ID to validate
@@ -5993,35 +6099,6 @@ declare const URL_ERRORS: {
5993
6099
  readonly message: "Invalid URL format";
5994
6100
  };
5995
6101
  };
5996
- /**
5997
- * Permission errors
5998
- */
5999
- declare const PERMISSION_ERRORS: {
6000
- readonly CANNOT_SEND_MESSAGES: {
6001
- readonly code: "PERMISSION.CANNOT_SEND_MESSAGES";
6002
- readonly message: "You do not have permission to send messages";
6003
- };
6004
- readonly CANNOT_SEND_MEDIA: {
6005
- readonly code: "PERMISSION.CANNOT_SEND_MEDIA";
6006
- readonly message: "You do not have permission to send media";
6007
- };
6008
- readonly CANNOT_ADD_MEMBERS: {
6009
- readonly code: "PERMISSION.CANNOT_ADD_MEMBERS";
6010
- readonly message: "You do not have permission to add members";
6011
- };
6012
- readonly CANNOT_REMOVE_MEMBERS: {
6013
- readonly code: "PERMISSION.CANNOT_REMOVE_MEMBERS";
6014
- readonly message: "You do not have permission to remove members";
6015
- };
6016
- readonly CANNOT_EDIT_INFO: {
6017
- readonly code: "PERMISSION.CANNOT_EDIT_INFO";
6018
- readonly message: "You do not have permission to edit conversation info";
6019
- };
6020
- readonly CANNOT_DELETE_MESSAGES: {
6021
- readonly code: "PERMISSION.CANNOT_DELETE_MESSAGES";
6022
- readonly message: "You do not have permission to delete messages";
6023
- };
6024
- };
6025
6102
  /**
6026
6103
  * All error messages combined
6027
6104
  */
@@ -6186,32 +6263,6 @@ declare const ERROR_MESSAGES: {
6186
6263
  readonly message: "Invalid URL format";
6187
6264
  };
6188
6265
  };
6189
- readonly PERMISSION: {
6190
- readonly CANNOT_SEND_MESSAGES: {
6191
- readonly code: "PERMISSION.CANNOT_SEND_MESSAGES";
6192
- readonly message: "You do not have permission to send messages";
6193
- };
6194
- readonly CANNOT_SEND_MEDIA: {
6195
- readonly code: "PERMISSION.CANNOT_SEND_MEDIA";
6196
- readonly message: "You do not have permission to send media";
6197
- };
6198
- readonly CANNOT_ADD_MEMBERS: {
6199
- readonly code: "PERMISSION.CANNOT_ADD_MEMBERS";
6200
- readonly message: "You do not have permission to add members";
6201
- };
6202
- readonly CANNOT_REMOVE_MEMBERS: {
6203
- readonly code: "PERMISSION.CANNOT_REMOVE_MEMBERS";
6204
- readonly message: "You do not have permission to remove members";
6205
- };
6206
- readonly CANNOT_EDIT_INFO: {
6207
- readonly code: "PERMISSION.CANNOT_EDIT_INFO";
6208
- readonly message: "You do not have permission to edit conversation info";
6209
- };
6210
- readonly CANNOT_DELETE_MESSAGES: {
6211
- readonly code: "PERMISSION.CANNOT_DELETE_MESSAGES";
6212
- readonly message: "You do not have permission to delete messages";
6213
- };
6214
- };
6215
6266
  };
6216
6267
  /**
6217
6268
  * Helper function to format error message with parameters
@@ -6238,7 +6289,7 @@ declare function getErrorMessage(code: string, params?: Record<string, string |
6238
6289
  * Type for error codes
6239
6290
  * Useful for type-safe error handling
6240
6291
  */
6241
- type AXErrorCode = typeof MESSAGE_ERRORS[keyof typeof MESSAGE_ERRORS]['code'] | typeof FILE_ERRORS[keyof typeof FILE_ERRORS]['code'] | typeof USER_ERRORS[keyof typeof USER_ERRORS]['code'] | typeof CONVERSATION_ERRORS[keyof typeof CONVERSATION_ERRORS]['code'] | typeof CONNECTION_ERRORS[keyof typeof CONNECTION_ERRORS]['code'] | typeof LOCATION_ERRORS[keyof typeof LOCATION_ERRORS]['code'] | typeof URL_ERRORS[keyof typeof URL_ERRORS]['code'] | typeof PERMISSION_ERRORS[keyof typeof PERMISSION_ERRORS]['code'];
6292
+ type AXErrorCode = typeof MESSAGE_ERRORS[keyof typeof MESSAGE_ERRORS]['code'] | typeof FILE_ERRORS[keyof typeof FILE_ERRORS]['code'] | typeof USER_ERRORS[keyof typeof USER_ERRORS]['code'] | typeof CONVERSATION_ERRORS[keyof typeof CONVERSATION_ERRORS]['code'] | typeof CONNECTION_ERRORS[keyof typeof CONNECTION_ERRORS]['code'] | typeof LOCATION_ERRORS[keyof typeof LOCATION_ERRORS]['code'] | typeof URL_ERRORS[keyof typeof URL_ERRORS]['code'];
6242
6293
 
6243
- export { AXAudioInfoBarBannerComponent, AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, AXComposerActionRegistry, AXComposerComponent, AXComposerPopupComponent, AXComposerService, AXComposerTabRegistry, AXConversation2Module, AXConversationAiApiKey, AXConversationAiResponderService, AXConversationApi, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationIndexedDbConversationApi, AXConversationIndexedDbMessageAiApi, AXConversationIndexedDbMessageApi, AXConversationIndexedDbRealtimeApi, AXConversationIndexedDbStorage, AXConversationIndexedDbStores, AXConversationIndexedDbUserApi, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationService, AXConversationSharedStorage, AXConversationTabRegistry, AXEmojiTabComponent, AXErrorHandlerService, AXFallbackRendererComponent, AXFilePickerComponent, AXFileRendererComponent, AXFileUploadService, AXForwardMessageDialogComponent, AXImagePickerComponent, AXImageRendererComponent, AXInfiniteScrollDirective, AXInfoBarActionRegistry, AXInfoBarComponent, AXInfoBarSearchComponent, AXInfoBarService, AXLocationPickerComponent, AXLocationRendererComponent, AXMessageActionRegistry, AXMessageApi, AXMessageListComponent, AXMessageListNoActiveDefaultComponent, AXMessageListService, AXMessageRendererRegistry, AXNewConversationDialogComponent, AXPickerFooterComponent, AXPickerHeaderComponent, AXRealtimeApi, AXRegistryService, AXSidebarComponent, AXSidebarService, AXStickerRendererComponent, AXStickerTabComponent, AXSystemRendererComponent, AXTextRendererComponent, AXUserApi, AXVideoInfoBarBannerComponent, AXVideoPickerComponent, AXVideoRendererComponent, AXVoiceInfoBarBannerComponent, AXVoiceRecorderComponent, AXVoiceRendererComponent, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_COPY_ACTION, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_STICKER_RENDERER, AX_CONVERSATION_SYSTEM_RENDERER, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_ARCHIVED, AX_CONVERSATION_TAB_BOT, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, AX_STICKER_API_KEY, CONNECTION_ERRORS, CONVERSATION_CONFIG, CONVERSATION_ERRORS, DEFAULT_COMPOSER_ACTIONS, DEFAULT_COMPOSER_TABS, DEFAULT_CONVERSATION_ITEM_ACTIONS, DEFAULT_CONVERSATION_TABS, DEFAULT_INFO_BAR_ACTIONS, DEFAULT_MESSAGE_ACTIONS, DEFAULT_MESSAGE_RENDERERS, ERROR_HANDLER_CONFIG, ERROR_MESSAGES, FILE_ERRORS, LOCATION_ERRORS, MESSAGE_ERRORS, PERMISSION_ERRORS, REGISTRY_CONFIG, URL_ERRORS, USER_ERRORS, axConversationIndexedDbStorage, conversationSharedStorage, formatErrorMessage, getDefaultConversationItemActions, getErrorMessage, mergeWithDefaults, provideConversation, sanitizeInput, validateConversationId, validateEmail, validateFile, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds };
6244
- export type { AXApiError, AXAudioPayload, AXBlockReportReason, AXCallEvent, AXComposerAction, AXComposerActionComponent, AXComposerActionContext, AXComposerActiveComponent, AXComposerTab, AXConnectionEvent, AXConnectionOptions, AXConnectionStatus, AXConversation, AXConversationAiResponderConfig, AXConversationConfig, AXConversationCreateData, AXConversationError, AXConversationFilter, AXConversationFilters, AXConversationItemAction, AXConversationItemActionContext, AXConversationMetadata, AXConversationOptions, AXConversationPermissions, AXConversationSettings, AXConversationSettingsUpdate, AXConversationSort, AXConversationStatus, AXConversationTab, AXConversationType, AXConversationUpdateData, AXDeleteMessageCommand, AXEditMessageCommand, AXErrorCode, AXErrorHandlerConfig, AXErrorMessage, AXErrorSeverity, AXFilePayload, AXFileValidationResult, AXGroupedReaction, AXImagePayload, AXInfoBarAction, AXInfoBarActionComponent, AXInfoBarActionContext, AXInfoBarActiveBanner, AXInfoBarActiveComponent, AXLink, AXLinkPreview, AXLocationPayload, AXMention, AXMessage, AXMessageAction, AXMessageActionContext, AXMessageAvatarTemplateContext, AXMessageForwardData, AXMessageInfoBarBannerComponent, AXMessageListEmptyComponent, AXMessagePayload, AXMessageRenderer, AXMessageRendererCapabilities, AXMessageRendererComponent, AXMessageRendererContentState, AXMessageRendererState, AXMessageSearchFilters, AXMessageStatus, AXMessageType, AXNotificationEvent, AXPaginatedResult, AXPagination, AXParticipant, AXParticipantRole, AXParticipantStatus, AXParticipantUpdate, AXPinnedMessage, AXPollOption, AXPollPayload, AXPresenceStatus, AXPresenceUpdate, AXReaction, AXReadReceipt, AXRegistryConfiguration, AXRegistryItem, AXSendMessageCommand, AXStickerPayload, AXSystemPayload, AXTextFormat, AXTextPayload, AXTypingIndicator, AXUserProfileUpdate, AXUserRole, AXUserSearchFilters, AXValidationResult, AXVideoPayload, AXVoicePayload, DropdownMenuItem, FilePreview };
6294
+ export { AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, AXCnvMediaPlaybackInfoBarBannerComponent, AXComposerActionRegistry, AXComposerComponent, AXComposerPopupComponent, AXComposerService, AXComposerTabRegistry, AXConversation2Module, AXConversationAiApiKey, AXConversationAiResponderService, AXConversationApi, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationIndexedDbConversationApi, AXConversationIndexedDbMessageAiApi, AXConversationIndexedDbMessageApi, AXConversationIndexedDbRealtimeApi, AXConversationIndexedDbStorage, AXConversationIndexedDbStores, AXConversationIndexedDbUserApi, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationService, AXConversationSharedStorage, AXConversationTabRegistry, AXEmojiTabComponent, AXErrorHandlerService, AXFallbackRendererComponent, AXFilePickerComponent, AXFileRendererComponent, AXForwardMessageDialogComponent, AXImagePickerComponent, AXImageRendererComponent, AXInfiniteScrollDirective, AXInfoBarActionRegistry, AXInfoBarComponent, AXInfoBarSearchComponent, AXInfoBarService, AXLocationPickerComponent, AXLocationRendererComponent, AXMessageActionRegistry, AXMessageApi, AXMessageListComponent, AXMessageListNoActiveDefaultComponent, AXMessageListService, AXMessageRendererRegistry, AXNewConversationDialogComponent, AXPickerFooterComponent, AXPickerHeaderComponent, AXRealtimeApi, AXRegistryService, AXSidebarComponent, AXSidebarService, AXStickerRendererComponent, AXStickerTabComponent, AXSystemRendererComponent, AXTextRendererComponent, AXUserApi, AXVideoPickerComponent, AXVideoRendererComponent, AXVoiceRecorderComponent, AXVoiceRendererComponent, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_FILE_TYPE_PROVIDERS, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT, AX_CONVERSATION_CURSOR_PREFIX, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_STICKER_RENDERER, AX_CONVERSATION_SYSTEM_RENDERER, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_ARCHIVED, AX_CONVERSATION_TAB_BOT, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_USER_AVATAR_COMPONENT, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, AX_MESSAGE_CURSOR_PREFIX, AX_STICKER_API_KEY, CONNECTION_ERRORS, CONVERSATION_CONFIG, CONVERSATION_ERRORS, CONVERSATION_FILE_TYPES_READY, DEFAULT_COMPOSER_ACTIONS, DEFAULT_COMPOSER_TABS, DEFAULT_CONVERSATION_ITEM_ACTIONS, DEFAULT_CONVERSATION_TABS, DEFAULT_INFO_BAR_ACTIONS, DEFAULT_MESSAGE_ACTIONS, DEFAULT_MESSAGE_RENDERERS, ERROR_HANDLER_CONFIG, ERROR_MESSAGES, FILE_ERRORS, LOCATION_ERRORS, MESSAGE_ERRORS, REGISTRY_CONFIG, URL_ERRORS, USER_ERRORS, applyConversationFilters, applyLocalPreview, axConversationIndexedDbStorage, conversationSharedStorage, createLocalPreviewUrl, createObjectUrl, encodeConversationCursor, encodeMessageCursor, formatErrorMessage, getConversationLastActivity, getConversationMessagesNewestFirst, getErrorMessage, getSortedConversationsForInbox, mergeUploadResult, mergeWithDefaults, normalizeAllConversationMessageIndexes, paginateChatNewestFirst, paginateChatOldestFirst, parseChatCursor, provideConversation, provideConversationComposerFileTypes, provideConversationFileCatalog, registerChatMessage, resolveConversationAvatarDisplay, resolvePrivatePeerUserId, resolveUserAvatarDisplay, revokeObjectUrl, sanitizeInput, shouldUseUserAvatarForConversation, sortConversationMessageIds, toUploaderReference, unregisterChatMessage, validateConversationId, validateEmail, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds };
6295
+ export type { AXApiError, AXAudioMediaItem, AXAudioPayload, AXBlockReportReason, AXCallEvent, AXChatCursorKind, AXComposerAction, AXComposerActionComponent, AXComposerActionContext, AXComposerActiveComponent, AXComposerTab, AXConnectionEvent, AXConnectionOptions, AXConnectionStatus, AXConversation, AXConversationAiResponderConfig, AXConversationAvatarComponents, AXConversationAvatarDisplay, AXConversationAvatarKind, AXConversationConfig, AXConversationConversationAvatarComponent, AXConversationCreateData, AXConversationError, AXConversationFilter, AXConversationFilters, AXConversationIndexedDbMediaRecord, AXConversationItemAction, AXConversationItemActionContext, AXConversationMetadata, AXConversationOptions, AXConversationSettings, AXConversationSettingsUpdate, AXConversationSort, AXConversationStatus, AXConversationTab, AXConversationType, AXConversationUpdateData, AXConversationUploadOptions, AXConversationUserAvatarComponent, AXDeleteMessageCommand, AXEditMessageCommand, AXErrorCode, AXErrorHandlerConfig, AXErrorMessage, AXErrorSeverity, AXFileMediaItem, AXFilePayload, AXGroupedReaction, AXImageMediaItem, AXImagePayload, AXInfoBarAction, AXInfoBarActionComponent, AXInfoBarActionContext, AXInfoBarActiveBanner, AXInfoBarActiveComponent, AXLink, AXLinkPreview, AXLoadMessagesResult, AXLocationPayload, AXMediaItemFields, AXMention, AXMessage, AXMessageAction, AXMessageActionContext, AXMessageForwardData, AXMessageInfoBarBannerComponent, AXMessageListEmptyComponent, AXMessagePayload, AXMessageRenderer, AXMessageRendererCapabilities, AXMessageRendererComponent, AXMessageRendererContentState, AXMessageRendererState, AXMessageSearchFilters, AXMessageStatus, AXMessageType, AXNotificationEvent, AXPaginatedResult, AXPagination, AXPaginationState, AXParsedChatCursor, AXParticipant, AXParticipantRole, AXParticipantStatus, AXParticipantUpdate, AXPinnedMessage, AXPlaybackBannerInputs, AXPollOption, AXPollPayload, AXPresenceStatus, AXPresenceUpdate, AXReaction, AXReadReceipt, AXRegistryConfiguration, AXRegistryItem, AXSendMessageCommand, AXSendMessageOptions, AXSendMessageUploadSource, AXStickerPayload, AXSystemPayload, AXTextFormat, AXTextPayload, AXTypingIndicator, AXUploaderReference, AXUploaderResult, AXUserProfileUpdate, AXUserRole, AXUserSearchFilters, AXValidationResult, AXVideoMediaItem, AXVideoPayload, AXVoicePayload, DropdownMenuItem, UploaderFilePreview };