@acorex/components 21.0.1-next.92 → 21.0.2-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 (339) hide show
  1. package/fesm2022/acorex-components-accordion.mjs +17 -22
  2. package/fesm2022/acorex-components-accordion.mjs.map +1 -1
  3. package/fesm2022/acorex-components-action-sheet.mjs +17 -17
  4. package/fesm2022/acorex-components-action-sheet.mjs.map +1 -1
  5. package/fesm2022/acorex-components-alert.mjs +14 -14
  6. package/fesm2022/acorex-components-alert.mjs.map +1 -1
  7. package/fesm2022/acorex-components-aspect-ratio.mjs +4 -4
  8. package/fesm2022/acorex-components-aspect-ratio.mjs.map +1 -1
  9. package/fesm2022/acorex-components-audio-wave.mjs +12 -11
  10. package/fesm2022/acorex-components-audio-wave.mjs.map +1 -1
  11. package/fesm2022/acorex-components-autocomplete.mjs +9 -9
  12. package/fesm2022/acorex-components-autocomplete.mjs.map +1 -1
  13. package/fesm2022/acorex-components-avatar.mjs +13 -13
  14. package/fesm2022/acorex-components-avatar.mjs.map +1 -1
  15. package/fesm2022/acorex-components-badge.mjs +10 -10
  16. package/fesm2022/acorex-components-badge.mjs.map +1 -1
  17. package/fesm2022/acorex-components-bottom-navigation.mjs +12 -12
  18. package/fesm2022/acorex-components-bottom-navigation.mjs.map +1 -1
  19. package/fesm2022/acorex-components-breadcrumbs.mjs +12 -12
  20. package/fesm2022/acorex-components-breadcrumbs.mjs.map +1 -1
  21. package/fesm2022/acorex-components-button-group.mjs +41 -26
  22. package/fesm2022/acorex-components-button-group.mjs.map +1 -1
  23. package/fesm2022/acorex-components-button.mjs +22 -22
  24. package/fesm2022/acorex-components-button.mjs.map +1 -1
  25. package/fesm2022/acorex-components-calendar.mjs +18 -18
  26. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  27. package/fesm2022/acorex-components-check-box.mjs +11 -11
  28. package/fesm2022/acorex-components-check-box.mjs.map +1 -1
  29. package/fesm2022/acorex-components-chips.mjs +12 -14
  30. package/fesm2022/acorex-components-chips.mjs.map +1 -1
  31. package/fesm2022/acorex-components-circular-progress.mjs +13 -11
  32. package/fesm2022/acorex-components-circular-progress.mjs.map +1 -1
  33. package/fesm2022/acorex-components-code-editor.mjs +14 -14
  34. package/fesm2022/acorex-components-code-editor.mjs.map +1 -1
  35. package/fesm2022/acorex-components-color-box.mjs +11 -11
  36. package/fesm2022/acorex-components-color-box.mjs.map +1 -1
  37. package/fesm2022/acorex-components-color-palette.mjs +31 -31
  38. package/fesm2022/acorex-components-color-palette.mjs.map +1 -1
  39. package/fesm2022/acorex-components-command.mjs +11 -11
  40. package/fesm2022/acorex-components-command.mjs.map +1 -1
  41. package/fesm2022/acorex-components-comment.mjs +33 -33
  42. package/fesm2022/acorex-components-comment.mjs.map +1 -1
  43. package/fesm2022/acorex-components-conversation.mjs +63 -63
  44. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  45. package/fesm2022/acorex-components-conversation2.mjs +256 -248
  46. package/fesm2022/acorex-components-conversation2.mjs.map +1 -1
  47. package/fesm2022/acorex-components-cron-job.mjs +55 -55
  48. package/fesm2022/acorex-components-cron-job.mjs.map +1 -1
  49. package/fesm2022/acorex-components-data-list.mjs +6 -6
  50. package/fesm2022/acorex-components-data-list.mjs.map +1 -1
  51. package/fesm2022/acorex-components-data-pager.mjs +33 -33
  52. package/fesm2022/acorex-components-data-pager.mjs.map +1 -1
  53. package/fesm2022/acorex-components-data-table.mjs +50 -486
  54. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  55. package/fesm2022/acorex-components-datetime-box.mjs +10 -10
  56. package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
  57. package/fesm2022/acorex-components-datetime-input.mjs +10 -10
  58. package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
  59. package/fesm2022/acorex-components-datetime-picker.mjs +11 -11
  60. package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
  61. package/fesm2022/acorex-components-decorators.mjs +48 -41
  62. package/fesm2022/acorex-components-decorators.mjs.map +1 -1
  63. package/fesm2022/acorex-components-dialog.mjs +13 -13
  64. package/fesm2022/acorex-components-dialog.mjs.map +1 -1
  65. package/fesm2022/acorex-components-drawer.mjs +16 -17
  66. package/fesm2022/acorex-components-drawer.mjs.map +1 -1
  67. package/fesm2022/acorex-components-dropdown-button.mjs +19 -11
  68. package/fesm2022/acorex-components-dropdown-button.mjs.map +1 -1
  69. package/fesm2022/acorex-components-dropdown.mjs +18 -18
  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 +9 -9
  74. package/fesm2022/acorex-components-fab.mjs.map +1 -1
  75. package/fesm2022/acorex-components-flow-chart.mjs +22 -22
  76. package/fesm2022/acorex-components-flow-chart.mjs.map +1 -1
  77. package/fesm2022/acorex-components-form.mjs +35 -27
  78. package/fesm2022/acorex-components-form.mjs.map +1 -1
  79. package/fesm2022/acorex-components-grid-layout-builder.mjs +13 -14
  80. package/fesm2022/acorex-components-grid-layout-builder.mjs.map +1 -1
  81. package/fesm2022/acorex-components-image-editor.mjs +48 -48
  82. package/fesm2022/acorex-components-image-editor.mjs.map +1 -1
  83. package/fesm2022/acorex-components-image.mjs +10 -10
  84. package/fesm2022/acorex-components-image.mjs.map +1 -1
  85. package/fesm2022/acorex-components-json-viewer.mjs +9 -9
  86. package/fesm2022/acorex-components-json-viewer.mjs.map +1 -1
  87. package/fesm2022/acorex-components-kanban.mjs +9 -7
  88. package/fesm2022/acorex-components-kanban.mjs.map +1 -1
  89. package/fesm2022/acorex-components-kbd.mjs +10 -10
  90. package/fesm2022/acorex-components-kbd.mjs.map +1 -1
  91. package/fesm2022/acorex-components-label.mjs +9 -9
  92. package/fesm2022/acorex-components-label.mjs.map +1 -1
  93. package/fesm2022/acorex-components-list.mjs +10 -10
  94. package/fesm2022/acorex-components-list.mjs.map +1 -1
  95. package/fesm2022/acorex-components-loading-dialog.mjs +12 -12
  96. package/fesm2022/acorex-components-loading-dialog.mjs.map +1 -1
  97. package/fesm2022/acorex-components-loading.mjs +21 -21
  98. package/fesm2022/acorex-components-loading.mjs.map +1 -1
  99. package/fesm2022/acorex-components-map.mjs +15 -15
  100. package/fesm2022/acorex-components-map.mjs.map +1 -1
  101. package/fesm2022/acorex-components-media-viewer.mjs +45 -45
  102. package/fesm2022/acorex-components-media-viewer.mjs.map +1 -1
  103. package/fesm2022/acorex-components-menu.mjs +45 -30
  104. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  105. package/fesm2022/{acorex-components-modal-acorex-components-modal-DwBY73dZ.mjs → acorex-components-modal-acorex-components-modal-DWNqU6or.mjs} +24 -24
  106. package/fesm2022/acorex-components-modal-acorex-components-modal-DWNqU6or.mjs.map +1 -0
  107. package/fesm2022/acorex-components-modal-modal-content.component-DplJbJyk.mjs +214 -0
  108. package/fesm2022/acorex-components-modal-modal-content.component-DplJbJyk.mjs.map +1 -0
  109. package/fesm2022/acorex-components-modal.mjs +1 -1
  110. package/fesm2022/acorex-components-navbar.mjs +9 -9
  111. package/fesm2022/acorex-components-navbar.mjs.map +1 -1
  112. package/fesm2022/acorex-components-notification.mjs +13 -13
  113. package/fesm2022/acorex-components-notification.mjs.map +1 -1
  114. package/fesm2022/acorex-components-number-box.mjs +10 -10
  115. package/fesm2022/acorex-components-number-box.mjs.map +1 -1
  116. package/fesm2022/acorex-components-otp.mjs +10 -10
  117. package/fesm2022/acorex-components-otp.mjs.map +1 -1
  118. package/fesm2022/acorex-components-page.mjs +10 -10
  119. package/fesm2022/acorex-components-page.mjs.map +1 -1
  120. package/fesm2022/acorex-components-paint.mjs +35 -40
  121. package/fesm2022/acorex-components-paint.mjs.map +1 -1
  122. package/fesm2022/acorex-components-password-box.mjs +15 -23
  123. package/fesm2022/acorex-components-password-box.mjs.map +1 -1
  124. package/fesm2022/acorex-components-pdf-reader.mjs +9 -9
  125. package/fesm2022/acorex-components-pdf-reader.mjs.map +1 -1
  126. package/fesm2022/acorex-components-phone-box.mjs +10 -10
  127. package/fesm2022/acorex-components-phone-box.mjs.map +1 -1
  128. package/fesm2022/acorex-components-picker.mjs +20 -20
  129. package/fesm2022/acorex-components-picker.mjs.map +1 -1
  130. package/fesm2022/acorex-components-popover.mjs +8 -8
  131. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  132. package/fesm2022/acorex-components-popup.mjs +17 -17
  133. package/fesm2022/acorex-components-popup.mjs.map +1 -1
  134. package/fesm2022/acorex-components-progress-bar.mjs +11 -9
  135. package/fesm2022/acorex-components-progress-bar.mjs.map +1 -1
  136. package/fesm2022/acorex-components-qrcode.mjs +10 -10
  137. package/fesm2022/acorex-components-qrcode.mjs.map +1 -1
  138. package/fesm2022/acorex-components-query-builder.mjs +9 -9
  139. package/fesm2022/acorex-components-query-builder.mjs.map +1 -1
  140. package/fesm2022/acorex-components-radio.mjs +10 -9
  141. package/fesm2022/acorex-components-radio.mjs.map +1 -1
  142. package/fesm2022/acorex-components-rail-navigation.mjs +40 -38
  143. package/fesm2022/acorex-components-rail-navigation.mjs.map +1 -1
  144. package/fesm2022/acorex-components-range-slider.mjs +11 -11
  145. package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
  146. package/fesm2022/acorex-components-rate-picker.mjs +20 -35
  147. package/fesm2022/acorex-components-rate-picker.mjs.map +1 -1
  148. package/fesm2022/acorex-components-rest-api-generator.mjs +28 -28
  149. package/fesm2022/acorex-components-rest-api-generator.mjs.map +1 -1
  150. package/fesm2022/acorex-components-result.mjs +8 -8
  151. package/fesm2022/acorex-components-result.mjs.map +1 -1
  152. package/fesm2022/acorex-components-routing-progress.mjs +8 -8
  153. package/fesm2022/acorex-components-routing-progress.mjs.map +1 -1
  154. package/fesm2022/acorex-components-rrule.mjs +11 -11
  155. package/fesm2022/acorex-components-rrule.mjs.map +1 -1
  156. package/fesm2022/acorex-components-scheduler-picker.mjs +173 -179
  157. package/fesm2022/acorex-components-scheduler-picker.mjs.map +1 -1
  158. package/fesm2022/acorex-components-scheduler.mjs +52 -52
  159. package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
  160. package/fesm2022/acorex-components-search-box.mjs +17 -11
  161. package/fesm2022/acorex-components-search-box.mjs.map +1 -1
  162. package/fesm2022/acorex-components-select-box.mjs +21 -15
  163. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  164. package/fesm2022/acorex-components-selection-list-2.mjs +12 -12
  165. package/fesm2022/acorex-components-selection-list-2.mjs.map +1 -1
  166. package/fesm2022/acorex-components-selection-list.mjs +10 -10
  167. package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
  168. package/fesm2022/acorex-components-side-menu.mjs +81 -24
  169. package/fesm2022/acorex-components-side-menu.mjs.map +1 -1
  170. package/fesm2022/acorex-components-skeleton.mjs +8 -8
  171. package/fesm2022/acorex-components-skeleton.mjs.map +1 -1
  172. package/fesm2022/acorex-components-slider.mjs +13 -13
  173. package/fesm2022/acorex-components-slider.mjs.map +1 -1
  174. package/fesm2022/acorex-components-sliding-item.mjs +19 -19
  175. package/fesm2022/acorex-components-sliding-item.mjs.map +1 -1
  176. package/fesm2022/acorex-components-step-wizard.mjs +16 -16
  177. package/fesm2022/acorex-components-step-wizard.mjs.map +1 -1
  178. package/fesm2022/acorex-components-switch.mjs +14 -14
  179. package/fesm2022/acorex-components-switch.mjs.map +1 -1
  180. package/fesm2022/acorex-components-tabs.mjs +17 -17
  181. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  182. package/fesm2022/acorex-components-tag-box.mjs +10 -10
  183. package/fesm2022/acorex-components-tag-box.mjs.map +1 -1
  184. package/fesm2022/acorex-components-tag.mjs +10 -10
  185. package/fesm2022/acorex-components-tag.mjs.map +1 -1
  186. package/fesm2022/acorex-components-text-area.mjs +9 -9
  187. package/fesm2022/acorex-components-text-area.mjs.map +1 -1
  188. package/fesm2022/acorex-components-text-box.mjs +12 -12
  189. package/fesm2022/acorex-components-text-box.mjs.map +1 -1
  190. package/fesm2022/acorex-components-time-duration.mjs +8 -8
  191. package/fesm2022/acorex-components-time-duration.mjs.map +1 -1
  192. package/fesm2022/acorex-components-time-line.mjs +14 -14
  193. package/fesm2022/acorex-components-time-line.mjs.map +1 -1
  194. package/fesm2022/acorex-components-toast.mjs +13 -13
  195. package/fesm2022/acorex-components-toast.mjs.map +1 -1
  196. package/fesm2022/acorex-components-toolbar.mjs +10 -10
  197. package/fesm2022/acorex-components-toolbar.mjs.map +1 -1
  198. package/fesm2022/acorex-components-tooltip.mjs +14 -14
  199. package/fesm2022/acorex-components-tooltip.mjs.map +1 -1
  200. package/fesm2022/acorex-components-tree-view.mjs +13 -13
  201. package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
  202. package/fesm2022/acorex-components-uploader.mjs +17 -17
  203. package/fesm2022/acorex-components-uploader.mjs.map +1 -1
  204. package/fesm2022/acorex-components-video-player.mjs +9 -9
  205. package/fesm2022/acorex-components-video-player.mjs.map +1 -1
  206. package/fesm2022/acorex-components-wysiwyg.mjs +45 -45
  207. package/fesm2022/acorex-components-wysiwyg.mjs.map +1 -1
  208. package/fesm2022/acorex-components.mjs.map +1 -1
  209. package/package.json +122 -146
  210. package/{accordion/index.d.ts → types/acorex-components-accordion.d.ts} +0 -1
  211. package/{button-group/index.d.ts → types/acorex-components-button-group.d.ts} +14 -12
  212. package/{button/index.d.ts → types/acorex-components-button.d.ts} +3 -3
  213. package/{check-box/index.d.ts → types/acorex-components-check-box.d.ts} +1 -1
  214. package/{chips/index.d.ts → types/acorex-components-chips.d.ts} +3 -8
  215. package/{conversation2/index.d.ts → types/acorex-components-conversation2.d.ts} +1539 -1539
  216. package/{data-table/index.d.ts → types/acorex-components-data-table.d.ts} +4 -253
  217. package/{dropdown-button/index.d.ts → types/acorex-components-dropdown-button.d.ts} +4 -2
  218. package/{form/index.d.ts → types/acorex-components-form.d.ts} +24 -24
  219. package/{grid-layout-builder/index.d.ts → types/acorex-components-grid-layout-builder.d.ts} +0 -1
  220. package/{loading/index.d.ts → types/acorex-components-loading.d.ts} +1 -1
  221. package/{menu/index.d.ts → types/acorex-components-menu.d.ts} +6 -6
  222. package/{paint/index.d.ts → types/acorex-components-paint.d.ts} +1 -6
  223. package/{radio/index.d.ts → types/acorex-components-radio.d.ts} +1 -1
  224. package/{rate-picker/index.d.ts → types/acorex-components-rate-picker.d.ts} +5 -15
  225. package/{scheduler-picker/index.d.ts → types/acorex-components-scheduler-picker.d.ts} +82 -81
  226. package/{select-box/index.d.ts → types/acorex-components-select-box.d.ts} +2 -1
  227. package/{side-menu/index.d.ts → types/acorex-components-side-menu.d.ts} +9 -2
  228. package/{slider/index.d.ts → types/acorex-components-slider.d.ts} +2 -2
  229. package/{tabs/index.d.ts → types/acorex-components-tabs.d.ts} +1 -1
  230. package/{tag/index.d.ts → types/acorex-components-tag.d.ts} +3 -3
  231. package/collapse/README.md +0 -3
  232. package/collapse/index.d.ts +0 -174
  233. package/drawer-legacy/README.md +0 -3
  234. package/drawer-legacy/index.d.ts +0 -86
  235. package/fesm2022/acorex-components-collapse.mjs +0 -366
  236. package/fesm2022/acorex-components-collapse.mjs.map +0 -1
  237. package/fesm2022/acorex-components-drawer-legacy.mjs +0 -218
  238. package/fesm2022/acorex-components-drawer-legacy.mjs.map +0 -1
  239. package/fesm2022/acorex-components-file-explorer.mjs +0 -307
  240. package/fesm2022/acorex-components-file-explorer.mjs.map +0 -1
  241. package/fesm2022/acorex-components-modal-acorex-components-modal-DwBY73dZ.mjs.map +0 -1
  242. package/fesm2022/acorex-components-modal-modal-content.component-DPMt_zaI.mjs +0 -212
  243. package/fesm2022/acorex-components-modal-modal-content.component-DPMt_zaI.mjs.map +0 -1
  244. package/fesm2022/acorex-components-number-box-legacy.mjs +0 -430
  245. package/fesm2022/acorex-components-number-box-legacy.mjs.map +0 -1
  246. package/fesm2022/acorex-components-scss.mjs +0 -22
  247. package/fesm2022/acorex-components-scss.mjs.map +0 -1
  248. package/fesm2022/acorex-components-tree-view-legacy.mjs +0 -515
  249. package/fesm2022/acorex-components-tree-view-legacy.mjs.map +0 -1
  250. package/file-explorer/README.md +0 -3
  251. package/file-explorer/index.d.ts +0 -103
  252. package/number-box-legacy/README.md +0 -3
  253. package/number-box-legacy/index.d.ts +0 -191
  254. package/scss/README.md +0 -3
  255. package/scss/index.d.ts +0 -10
  256. package/tree-view-legacy/README.md +0 -3
  257. package/tree-view-legacy/index.d.ts +0 -185
  258. /package/{action-sheet/index.d.ts → types/acorex-components-action-sheet.d.ts} +0 -0
  259. /package/{alert/index.d.ts → types/acorex-components-alert.d.ts} +0 -0
  260. /package/{aspect-ratio/index.d.ts → types/acorex-components-aspect-ratio.d.ts} +0 -0
  261. /package/{audio-wave/index.d.ts → types/acorex-components-audio-wave.d.ts} +0 -0
  262. /package/{autocomplete/index.d.ts → types/acorex-components-autocomplete.d.ts} +0 -0
  263. /package/{avatar/index.d.ts → types/acorex-components-avatar.d.ts} +0 -0
  264. /package/{badge/index.d.ts → types/acorex-components-badge.d.ts} +0 -0
  265. /package/{bottom-navigation/index.d.ts → types/acorex-components-bottom-navigation.d.ts} +0 -0
  266. /package/{breadcrumbs/index.d.ts → types/acorex-components-breadcrumbs.d.ts} +0 -0
  267. /package/{calendar/index.d.ts → types/acorex-components-calendar.d.ts} +0 -0
  268. /package/{circular-progress/index.d.ts → types/acorex-components-circular-progress.d.ts} +0 -0
  269. /package/{code-editor/index.d.ts → types/acorex-components-code-editor.d.ts} +0 -0
  270. /package/{color-box/index.d.ts → types/acorex-components-color-box.d.ts} +0 -0
  271. /package/{color-palette/index.d.ts → types/acorex-components-color-palette.d.ts} +0 -0
  272. /package/{command/index.d.ts → types/acorex-components-command.d.ts} +0 -0
  273. /package/{comment/index.d.ts → types/acorex-components-comment.d.ts} +0 -0
  274. /package/{conversation/index.d.ts → types/acorex-components-conversation.d.ts} +0 -0
  275. /package/{cron-job/index.d.ts → types/acorex-components-cron-job.d.ts} +0 -0
  276. /package/{data-list/index.d.ts → types/acorex-components-data-list.d.ts} +0 -0
  277. /package/{data-pager/index.d.ts → types/acorex-components-data-pager.d.ts} +0 -0
  278. /package/{datetime-box/index.d.ts → types/acorex-components-datetime-box.d.ts} +0 -0
  279. /package/{datetime-input/index.d.ts → types/acorex-components-datetime-input.d.ts} +0 -0
  280. /package/{datetime-picker/index.d.ts → types/acorex-components-datetime-picker.d.ts} +0 -0
  281. /package/{decorators/index.d.ts → types/acorex-components-decorators.d.ts} +0 -0
  282. /package/{dialog/index.d.ts → types/acorex-components-dialog.d.ts} +0 -0
  283. /package/{drawer/index.d.ts → types/acorex-components-drawer.d.ts} +0 -0
  284. /package/{dropdown/index.d.ts → types/acorex-components-dropdown.d.ts} +0 -0
  285. /package/{editor/index.d.ts → types/acorex-components-editor.d.ts} +0 -0
  286. /package/{fab/index.d.ts → types/acorex-components-fab.d.ts} +0 -0
  287. /package/{flow-chart/index.d.ts → types/acorex-components-flow-chart.d.ts} +0 -0
  288. /package/{image-editor/index.d.ts → types/acorex-components-image-editor.d.ts} +0 -0
  289. /package/{image/index.d.ts → types/acorex-components-image.d.ts} +0 -0
  290. /package/{json-viewer/index.d.ts → types/acorex-components-json-viewer.d.ts} +0 -0
  291. /package/{kanban/index.d.ts → types/acorex-components-kanban.d.ts} +0 -0
  292. /package/{kbd/index.d.ts → types/acorex-components-kbd.d.ts} +0 -0
  293. /package/{label/index.d.ts → types/acorex-components-label.d.ts} +0 -0
  294. /package/{list/index.d.ts → types/acorex-components-list.d.ts} +0 -0
  295. /package/{loading-dialog/index.d.ts → types/acorex-components-loading-dialog.d.ts} +0 -0
  296. /package/{map/index.d.ts → types/acorex-components-map.d.ts} +0 -0
  297. /package/{media-viewer/index.d.ts → types/acorex-components-media-viewer.d.ts} +0 -0
  298. /package/{modal/index.d.ts → types/acorex-components-modal.d.ts} +0 -0
  299. /package/{navbar/index.d.ts → types/acorex-components-navbar.d.ts} +0 -0
  300. /package/{notification/index.d.ts → types/acorex-components-notification.d.ts} +0 -0
  301. /package/{number-box/index.d.ts → types/acorex-components-number-box.d.ts} +0 -0
  302. /package/{otp/index.d.ts → types/acorex-components-otp.d.ts} +0 -0
  303. /package/{page/index.d.ts → types/acorex-components-page.d.ts} +0 -0
  304. /package/{password-box/index.d.ts → types/acorex-components-password-box.d.ts} +0 -0
  305. /package/{pdf-reader/index.d.ts → types/acorex-components-pdf-reader.d.ts} +0 -0
  306. /package/{phone-box/index.d.ts → types/acorex-components-phone-box.d.ts} +0 -0
  307. /package/{picker/index.d.ts → types/acorex-components-picker.d.ts} +0 -0
  308. /package/{popover/index.d.ts → types/acorex-components-popover.d.ts} +0 -0
  309. /package/{popup/index.d.ts → types/acorex-components-popup.d.ts} +0 -0
  310. /package/{progress-bar/index.d.ts → types/acorex-components-progress-bar.d.ts} +0 -0
  311. /package/{qrcode/index.d.ts → types/acorex-components-qrcode.d.ts} +0 -0
  312. /package/{query-builder/index.d.ts → types/acorex-components-query-builder.d.ts} +0 -0
  313. /package/{rail-navigation/index.d.ts → types/acorex-components-rail-navigation.d.ts} +0 -0
  314. /package/{range-slider/index.d.ts → types/acorex-components-range-slider.d.ts} +0 -0
  315. /package/{rest-api-generator/index.d.ts → types/acorex-components-rest-api-generator.d.ts} +0 -0
  316. /package/{result/index.d.ts → types/acorex-components-result.d.ts} +0 -0
  317. /package/{routing-progress/index.d.ts → types/acorex-components-routing-progress.d.ts} +0 -0
  318. /package/{rrule/index.d.ts → types/acorex-components-rrule.d.ts} +0 -0
  319. /package/{scheduler/index.d.ts → types/acorex-components-scheduler.d.ts} +0 -0
  320. /package/{search-box/index.d.ts → types/acorex-components-search-box.d.ts} +0 -0
  321. /package/{selection-list-2/index.d.ts → types/acorex-components-selection-list-2.d.ts} +0 -0
  322. /package/{selection-list/index.d.ts → types/acorex-components-selection-list.d.ts} +0 -0
  323. /package/{skeleton/index.d.ts → types/acorex-components-skeleton.d.ts} +0 -0
  324. /package/{sliding-item/index.d.ts → types/acorex-components-sliding-item.d.ts} +0 -0
  325. /package/{step-wizard/index.d.ts → types/acorex-components-step-wizard.d.ts} +0 -0
  326. /package/{switch/index.d.ts → types/acorex-components-switch.d.ts} +0 -0
  327. /package/{tag-box/index.d.ts → types/acorex-components-tag-box.d.ts} +0 -0
  328. /package/{text-area/index.d.ts → types/acorex-components-text-area.d.ts} +0 -0
  329. /package/{text-box/index.d.ts → types/acorex-components-text-box.d.ts} +0 -0
  330. /package/{time-duration/index.d.ts → types/acorex-components-time-duration.d.ts} +0 -0
  331. /package/{time-line/index.d.ts → types/acorex-components-time-line.d.ts} +0 -0
  332. /package/{toast/index.d.ts → types/acorex-components-toast.d.ts} +0 -0
  333. /package/{toolbar/index.d.ts → types/acorex-components-toolbar.d.ts} +0 -0
  334. /package/{tooltip/index.d.ts → types/acorex-components-tooltip.d.ts} +0 -0
  335. /package/{tree-view/index.d.ts → types/acorex-components-tree-view.d.ts} +0 -0
  336. /package/{uploader/index.d.ts → types/acorex-components-uploader.d.ts} +0 -0
  337. /package/{video-player/index.d.ts → types/acorex-components-video-player.d.ts} +0 -0
  338. /package/{wysiwyg/index.d.ts → types/acorex-components-wysiwyg.d.ts} +0 -0
  339. /package/{index.d.ts → types/acorex-components.d.ts} +0 -0
@@ -1,13 +1,13 @@
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, InjectionToken, OnInit, EventEmitter, TemplateRef, ElementRef, ModuleWithProviders, Provider } from '@angular/core';
3
+ import { OnDestroy, ViewContainerRef, Type, InputSignal, WritableSignal, Signal, OnInit, EventEmitter, TemplateRef, InjectionToken, ElementRef, ModuleWithProviders, Provider } from '@angular/core';
4
4
  import { AXComponentCloseEvent, AXHtmlEvent, AXDataSource, AXClosableComponent } from '@acorex/cdk/common';
5
5
  import { AXUploaderChangedEvent } from '@acorex/cdk/uploader';
6
- import * as rxjs from 'rxjs';
7
- import { Observable, BehaviorSubject, Subject } from 'rxjs';
8
6
  import { AXPopoverComponent } from '@acorex/components/popover';
9
7
  import { AXListComponent } from '@acorex/components/list';
10
8
  import { AXPopupService, AXPopupRef } from '@acorex/components/popup';
9
+ import * as rxjs from 'rxjs';
10
+ import { Observable, BehaviorSubject, Subject } from 'rxjs';
11
11
  import { AXDialogService } from '@acorex/components/dialog';
12
12
  import { AXContextMenuOpeningEvent, AXContextMenuItemsClickEvent } from '@acorex/components/menu';
13
13
  import { AXBasePageComponent } from '@acorex/components/page';
@@ -661,6 +661,144 @@ interface AXConversationSort {
661
661
  direction: 'asc' | 'desc';
662
662
  }
663
663
 
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
+
664
802
  /**
665
803
  * Abstract Base Registry
666
804
  * Base class for all registries with common functionality
@@ -1399,7 +1537,7 @@ declare class AXComposerService {
1399
1537
  private readonly _editMessage;
1400
1538
  readonly replyMessage: _angular_core.Signal<AXMessage>;
1401
1539
  readonly editMessage: _angular_core.Signal<AXMessage>;
1402
- readonly activeConversation: _angular_core.Signal<AXConversation>;
1540
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
1403
1541
  readonly activeMessages: _angular_core.Signal<AXMessage[]>;
1404
1542
  /** Active component being shown in composer (full-width mode) */
1405
1543
  private readonly _activeComponent;
@@ -1471,735 +1609,385 @@ declare class AXComposerService {
1471
1609
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXComposerService>;
1472
1610
  }
1473
1611
 
1474
- declare class AXComposerComponent implements OnDestroy {
1475
- #private;
1612
+ declare class AXConversationContainerComponent {
1476
1613
  private readonly conversationService;
1477
- private readonly messageApi;
1478
- private readonly composerService;
1479
- private readonly messageListService;
1480
- private readonly popupService;
1481
- private readonly config;
1482
- private readonly translation;
1483
- /** Access registry through conversation service */
1484
- private get registry();
1485
- /** Input element reference */
1486
- private readonly inputElementRef;
1487
- /** Draft text - use service */
1488
- readonly draftText: _angular_core.WritableSignal<string>;
1489
- /** Attachments - use service */
1490
- readonly attachments: _angular_core.WritableSignal<File[]>;
1491
- /** Editing message */
1492
- readonly editingMessage: _angular_core.WritableSignal<any>;
1493
- /** Replying to message */
1494
- readonly replyingToMessage: _angular_core.WritableSignal<AXMessage>;
1495
- /** Show typing indicator - use service */
1496
- readonly showTypingIndicator: _angular_core.WritableSignal<boolean>;
1497
- /** Message sent event */
1498
- readonly messageSent: _angular_core.OutputEmitterRef<AXSendMessageCommand>;
1499
- /** Emoji clicked event */
1500
- readonly emojiClick: _angular_core.OutputEmitterRef<void>;
1501
- /** Attach clicked event */
1502
- readonly attachClick: _angular_core.OutputEmitterRef<void>;
1503
- /** Voice clicked event */
1504
- readonly voiceClick: _angular_core.OutputEmitterRef<void>;
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>;
1628
+ }
1629
+
1630
+ declare class AXConversationContainerDirective {
1631
+ private readonly conversationService;
1632
+ /** Active conversation */
1633
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
1634
+ /** Loading state */
1635
+ readonly loading: _angular_core.Signal<boolean>;
1636
+ /** Error state */
1637
+ readonly error: _angular_core.Signal<Error>;
1638
+ closeActiveConversation(): void;
1639
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationContainerDirective, never>;
1640
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXConversationContainerDirective, "[axConversationContainer]", never, {}, {}, never, never, true, never>;
1641
+ }
1642
+
1643
+ interface DropdownMenuItem {
1644
+ id: string;
1645
+ label: string;
1646
+ icon?: string;
1647
+ disabled?: boolean;
1648
+ divider?: boolean;
1649
+ destructive?: boolean;
1650
+ shortcut?: string;
1651
+ }
1652
+ declare class AXInfoBarComponent {
1653
+ private readonly conversationService;
1654
+ private readonly infoBar;
1655
+ protected get registry(): _acorex_components_conversation2.AXRegistryService;
1505
1656
  /** Active conversation */
1506
1657
  readonly activeConversation: _angular_core.Signal<AXConversation>;
1507
- readonly activeMessages: _angular_core.Signal<AXMessage[]>;
1508
1658
  /** Active component from service */
1509
- readonly activeComponent: _angular_core.Signal<AXComposerActiveComponent>;
1510
- /** Emoji popover state */
1511
- private readonly emojiPopoverRef;
1512
- readonly emojiPopoverTarget: _angular_core.WritableSignal<HTMLElement>;
1513
- readonly composerPopupComponent: typeof AXComposerPopupComponent;
1514
- /** Input placeholder - use service */
1515
- readonly placeholder: _angular_core.Signal<string>;
1516
- /** Sending message state */
1517
- readonly sendingMessage: _angular_core.WritableSignal<boolean>;
1518
- /** Typing indicator subject for rate limiting */
1519
- private readonly typingSubject;
1520
- constructor();
1521
- private draftSaveTimeout?;
1522
- /** Number of input rows - use service */
1523
- readonly inputRows: _angular_core.Signal<number>;
1524
- /** Can send message - use service */
1525
- readonly canSend: _angular_core.Signal<boolean>;
1526
- /** Left actions from registry - use service */
1527
- readonly leftActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
1528
- /** Right actions from registry - use service */
1529
- readonly rightActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
1530
- /** Left inline actions (location = 'inline' or undefined) */
1531
- readonly leftInlineActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
1532
- /** Left menu actions (location = 'menu') */
1533
- readonly leftMenuActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
1534
- /** Right inline actions (location = 'inline' or undefined) */
1535
- readonly rightInlineActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
1536
- /** Right menu actions (location = 'menu') */
1537
- readonly rightMenuActions: _angular_core.Signal<_acorex_components_conversation2.AXComposerAction[]>;
1538
- /** Handle key down */
1539
- onKeyDown(event: AXHtmlEvent<KeyboardEvent>): void;
1540
- /** Handle input */
1541
- onInput(): void;
1542
- /** Send typing indicator (throttled via RxJS) */
1543
- private sendTypingIndicator;
1544
- /** Cleanup on destroy */
1545
- ngOnDestroy(): void;
1546
- /** Handle send click */
1547
- onSendClick(): Promise<void>;
1548
- /** Handle emoji click */
1549
- onEmojiClick(event?: MouseEvent): Promise<void>;
1550
- /** Handle emoji popover closed */
1551
- onEmojiPopoverClosed(): void;
1552
- /** Handle emoji/sticker selection from popup */
1553
- onEmojiItemSelected(item: string | AXStickerPayload): void;
1554
- /** Send sticker message */
1555
- private sendSticker;
1556
- /** Get inputs for emoji popup component */
1557
- getEmojiPopupInputs(): Record<string, unknown>;
1558
- /** Handle attach click */
1559
- onAttachClick(): void;
1560
- /** Handle voice click */
1561
- onVoiceClick(): void;
1562
- /** Remove attachment */
1563
- removeAttachment(index: number): void;
1564
- /** Files selected via uploader */
1565
- onFilesSelected(e: AXUploaderChangedEvent): Promise<void>;
1566
- /**
1567
- * Validate file before upload
1568
- * @param file - File to validate
1569
- * @throws {Error} If file is invalid
1570
- */
1571
- private validateFile;
1572
- /** Cancel edit/reply mode */
1573
- cancelEditReply(): void;
1574
- /** Reset all composer states (used when switching conversations) */
1575
- private resetComposerState;
1576
- /** Start editing a message */
1577
- startEdit(message: any): void;
1578
- /** Start replying to a message */
1579
- startReply(message: AXMessage): void;
1580
- /** Handle action click */
1581
- onActionClick(actionId: string, event?: MouseEvent): Promise<void>;
1582
- /** Check if action is enabled */
1583
- isActionEnabled(action: any): boolean;
1584
- /** Get replying sender name */
1585
- getReplyingSenderName(): string;
1586
- getActionLabel(action: {
1587
- label: string;
1588
- }): string;
1589
- /** Get replying message text */
1590
- getReplyingMessageText(): string;
1591
- /** Preview object for replying banner (type, icon, value) */
1592
- getReplyingPreview(): {
1593
- value: string;
1594
- type: string;
1595
- icon: string;
1596
- } | null;
1597
- /** Preview object for editing banner (type, icon, value) */
1598
- getEditingPreview(): {
1599
- value: string;
1600
- type: string;
1601
- icon: string;
1602
- } | null;
1603
- /** Handle reply preview click - scroll to original message */
1604
- onReplyPreviewClick(): void;
1605
- /** Get inputs for dynamic component */
1606
- getComponentInputs(): Record<string, unknown>;
1607
- onEnter(event: AXHtmlEvent<KeyboardEvent>): Promise<void>;
1608
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXComposerComponent, never>;
1609
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXComposerComponent, "ax-conversation-composer", never, {}, { "messageSent": "messageSent"; "emojiClick": "emojiClick"; "attachClick": "attachClick"; "voiceClick": "voiceClick"; }, never, never, true, never>;
1610
- }
1611
-
1612
- /**
1613
- * Conversation Configuration Interface
1614
- * Centralized configuration values to avoid magic numbers
1615
- */
1616
- /**
1617
- * Main configuration interface for the conversation component
1618
- */
1619
- interface AXConversationConfig {
1620
- /** Number of messages to load per page */
1621
- messagePageSize?: number;
1622
- /** Number of conversations to load per page */
1623
- conversationPageSize?: number;
1624
- /** Scroll threshold for detecting scroll events */
1625
- scrollThreshold?: number;
1626
- /** Infinite scroll threshold */
1627
- infiniteScrollThreshold?: number;
1628
- /** Typing indicator timeout in milliseconds */
1629
- typingIndicatorTimeout?: number;
1630
- /** Typing indicator throttle in milliseconds (for rate limiting) */
1631
- typingIndicatorThrottle?: number;
1632
- /** Message highlight duration in milliseconds */
1633
- messageHighlightDuration?: number;
1634
- /** Search debounce delay in milliseconds */
1635
- debounceSearch?: number;
1636
- /** Date separator inactivity fade delay in milliseconds */
1637
- /** Maximum messages per conversation */
1638
- maxMessagesPerConversation?: number;
1639
- /** Maximum total messages in store */
1640
- maxTotalMessages?: number;
1641
- /** Maximum cached conversations */
1642
- maxCachedConversations?: number;
1643
- /** Minimum sidebar width in pixels */
1644
- minSidebarWidth?: number;
1645
- /** Maximum sidebar width in pixels */
1646
- maxSidebarWidth?: number;
1647
- /** Default sidebar width in pixels */
1648
- defaultSidebarWidth?: number;
1649
- /** Filter cache size */
1650
- filterCacheSize?: number;
1651
- /** Maximum file size in bytes */
1652
- maxFileSize?: number;
1653
- /** Allowed file types (glob patterns like 'image/*') */
1654
- allowedFileTypes?: string[];
1655
- /** Maximum message length in characters */
1656
- maxMessageLength?: number;
1657
- /** Minimum message length in characters */
1658
- minMessageLength?: number;
1659
- /** Threshold for marking messages as read (0.0 to 1.0, default: 0.3) */
1660
- messageReadThreshold?: number;
1661
- /**
1662
- * CSS `background` for the message list (`ax-conversation-message-list` area, all states: loading, empty, messages).
1663
- * Use full shorthand, or a bare `https://...` / `/path/to.png` (wrapped as `url(...)` with `center/cover`).
1664
- * Empty string = library default soft gradient. `transparent` or `none` = flat background.
1665
- */
1666
- messageListBackground?: string;
1667
- }
1668
-
1669
- /**
1670
- * Default Configuration Values
1671
- * Centralized defaults to avoid magic numbers throughout the codebase
1672
- */
1673
-
1674
- /**
1675
- * Default conversation configuration
1676
- * All values are explicitly defined here for easy maintenance and documentation
1677
- */
1678
- declare const AX_DEFAULT_CONVERSATION_CONFIG: Required<AXConversationConfig>;
1679
- /**
1680
- * Helper function to merge user config with defaults
1681
- * Properly handles array merging to avoid reference issues
1682
- * @param userConfig - User-provided configuration
1683
- * @returns Merged configuration with all required fields
1684
- */
1685
- declare function mergeWithDefaults(userConfig?: Partial<AXConversationConfig>): Required<AXConversationConfig>;
1686
-
1687
- /**
1688
- * Shared API Types
1689
- * Common types used across all API services
1690
- */
1691
- /**
1692
- * Pagination parameters
1693
- */
1694
- interface AXPagination {
1695
- /** Page number (0-based) */
1696
- page: number;
1697
- /** Items per page */
1698
- pageSize: number;
1699
- /** Cursor for cursor-based pagination (optional) */
1700
- cursor?: string;
1701
- /** Sort field */
1702
- sortBy?: string;
1703
- /** Sort direction */
1704
- sortDirection?: 'asc' | 'desc';
1705
- }
1706
- /**
1707
- * Paginated response
1708
- */
1709
- interface AXPaginatedResult<T> {
1710
- /** Result items */
1711
- items: T[];
1712
- /** Total count (if available) */
1713
- total?: number;
1714
- /** Next page cursor (for cursor-based pagination) */
1715
- nextCursor?: string;
1716
- /** Previous page cursor */
1717
- prevCursor?: string;
1718
- /** Whether there are more pages */
1719
- hasMore: boolean;
1720
- /** Current page number */
1721
- page?: number;
1722
- /** Total pages */
1723
- totalPages?: number;
1724
- }
1725
- /**
1726
- * Connection status
1727
- */
1728
- type AXConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';
1729
- /**
1730
- * API Error with details
1731
- */
1732
- interface AXApiError {
1733
- /** Error code */
1734
- code: string;
1735
- /** Error message */
1736
- message: string;
1737
- /** HTTP status code */
1738
- statusCode?: number;
1739
- /** Additional details */
1740
- details?: unknown;
1741
- /** Timestamp */
1742
- timestamp?: Date;
1743
- }
1744
- /**
1745
- * User presence status
1746
- */
1747
- type AXPresenceStatus = 'online' | 'offline' | 'away' | 'busy' | 'invisible';
1748
- /**
1749
- * User role in conversation
1750
- */
1751
- type AXUserRole = 'owner' | 'admin' | 'member' | 'guest';
1752
-
1753
- /**
1754
- * Abstract Conversation Management API
1755
- * Handle conversation CRUD operations, participants, and settings
1756
- */
1757
-
1758
- /**
1759
- * Conversation creation data
1760
- */
1761
- interface AXConversationCreateData {
1762
- /** Conversation type */
1763
- type: AXConversationType;
1764
- /** Participant user IDs */
1765
- participantIds: string[];
1766
- /** Conversation title (for groups/channels) */
1767
- title?: string;
1768
- /** Conversation description */
1769
- description?: string;
1770
- /** Avatar URL */
1771
- avatar?: string;
1772
- /**
1773
- * Font Awesome icon class(es) for this conversation when no image avatar is used.
1774
- * Implementations should treat empty/whitespace `avatar` values as absent and use this icon fallback.
1775
- */
1776
- icon?: string;
1777
- /** Custom metadata */
1778
- metadata?: Record<string, unknown>;
1779
- }
1780
- /**
1781
- * Conversation update data
1782
- */
1783
- interface AXConversationUpdateData {
1784
- /** Conversation title */
1785
- title?: string;
1786
- /** Conversation description */
1787
- description?: string;
1788
- /** Avatar URL */
1789
- avatar?: string;
1790
- /**
1791
- * Font Awesome icon class(es) for this conversation when no image avatar is used.
1792
- * Implementations should treat empty/whitespace `avatar` values as absent and use this icon fallback.
1793
- */
1794
- icon?: string;
1795
- /** Custom metadata */
1796
- metadata?: Record<string, unknown>;
1797
- }
1798
- /**
1799
- * Conversation filter options
1800
- */
1801
- interface AXConversationFilters {
1802
- /** Filter by type */
1803
- type?: AXConversationType;
1804
- /** Filter by unread */
1805
- unread?: boolean;
1806
- /** Filter by archived */
1807
- archived?: boolean;
1808
- /** Filter by pinned */
1809
- pinned?: boolean;
1810
- /** Search query */
1811
- searchQuery?: string;
1812
- /** Filter by tags */
1813
- tags?: string[];
1814
- /** Custom filters */
1815
- custom?: Record<string, unknown>;
1816
- }
1817
- /**
1818
- * Conversation settings update
1819
- */
1820
- interface AXConversationSettingsUpdate {
1821
- /** Muted until timestamp */
1822
- mutedUntil?: Date;
1823
- /** Show notifications */
1824
- notifications?: boolean;
1825
- /** Custom notification sound */
1826
- notificationSound?: string;
1827
- /** Show message preview in notifications */
1828
- showPreview?: boolean;
1829
- /** Custom settings */
1830
- custom?: Record<string, unknown>;
1831
- }
1832
- /**
1833
- * Participant update data
1834
- */
1835
- interface AXParticipantUpdate {
1836
- /** User ID */
1837
- userId: string;
1838
- /** New role */
1839
- role?: AXUserRole;
1840
- /** Custom permissions */
1841
- permissions?: Record<string, boolean>;
1842
- }
1843
- /**
1844
- * Abstract Conversation Management API
1845
- *
1846
- * Implement this abstract class to handle conversation operations.
1847
- *
1848
- * @example
1849
- * ```typescript
1850
- * @Injectable()
1851
- * export class MyConversationApi extends AXConversationManagementApi {
1852
- * constructor(private http: HttpClient) {
1853
- * super();
1854
- * }
1855
- *
1856
- * async createConversation(data: AXConversationCreateData): Promise<AXConversation> {
1857
- * const response = await this.http.post('/api/conversations', data).toPromise();
1858
- * return response;
1859
- * }
1860
- *
1861
- * // ... implement other methods
1862
- * }
1863
- * ```
1864
- */
1865
- declare abstract class AXConversationApi {
1866
- /**
1867
- * Create a new conversation
1868
- *
1869
- * @param data - Conversation creation data
1870
- * @returns Created conversation
1871
- * @throws {AXApiError} If creation fails
1872
- */
1873
- abstract createConversation(data: AXConversationCreateData): Promise<AXConversation>;
1874
- /**
1875
- * Get conversation by ID
1876
- *
1877
- * @param conversationId - Conversation ID
1878
- * @returns Conversation details
1879
- * @throws {AXApiError} If conversation not found
1880
- */
1881
- abstract getConversation(conversationId: string): Promise<AXConversation>;
1882
- /**
1883
- * Get conversations list with pagination
1884
- *
1885
- * @param pagination - Pagination parameters
1886
- * @param filters - Optional filters
1887
- * @returns Paginated conversation list
1888
- * @throws {AXApiError} If request fails
1889
- */
1890
- abstract getConversations(pagination: AXPagination, filters?: AXConversationFilters): Promise<AXPaginatedResult<AXConversation>>;
1891
- /**
1892
- * Update conversation details
1893
- *
1894
- * @param conversationId - Conversation ID
1895
- * @param updates - Update data
1896
- * @returns Updated conversation
1897
- * @throws {AXApiError} If update fails
1898
- */
1899
- abstract updateConversation(conversationId: string, updates: AXConversationUpdateData): Promise<AXConversation>;
1900
- /**
1901
- * Delete conversation
1902
- *
1903
- * @param conversationId - Conversation ID
1904
- * @throws {AXApiError} If deletion fails
1905
- */
1906
- abstract deleteConversation(conversationId: string): Promise<boolean>;
1907
- /**
1908
- * Archive conversation
1909
- *
1910
- * @param conversationId - Conversation ID
1911
- * @throws {AXApiError} If archiving fails
1912
- */
1913
- abstract archiveConversation(conversationId: string): Promise<void>;
1914
- /**
1915
- * Unarchive conversation
1916
- *
1917
- * @param conversationId - Conversation ID
1918
- * @throws {AXApiError} If unarchiving fails
1919
- */
1920
- abstract unarchiveConversation(conversationId: string): Promise<void>;
1921
- /**
1922
- * Pin conversation
1923
- *
1924
- * @param conversationId - Conversation ID
1925
- * @throws {AXApiError} If pinning fails
1926
- */
1927
- abstract pinConversation(conversationId: string): Promise<void>;
1928
- /**
1929
- * Unpin conversation
1930
- *
1931
- * @param conversationId - Conversation ID
1932
- * @throws {AXApiError} If unpinning fails
1933
- */
1934
- abstract unpinConversation(conversationId: string): Promise<void>;
1935
- /**
1936
- * Mark conversation as read
1937
- *
1938
- * @param conversationId - Conversation ID
1939
- * @throws {AXApiError} If marking fails
1940
- */
1941
- abstract markConversationAsRead(conversationId: string): Promise<void>;
1942
- /**
1943
- * Mark conversation as unread
1944
- *
1945
- * @param conversationId - Conversation ID
1946
- * @throws {AXApiError} If marking fails
1947
- */
1948
- abstract markConversationAsUnread(conversationId: string): Promise<void>;
1949
- /**
1950
- * Search conversations
1951
- *
1952
- * @param query - Search query
1953
- * @returns Matching conversations
1954
- * @throws {AXApiError} If search fails
1955
- */
1956
- abstract searchConversations(query: string): Promise<AXConversation[]>;
1957
- /**
1958
- * Filter conversations
1959
- *
1960
- * @param filters - Filter options
1961
- * @param pagination - Pagination parameters
1962
- * @returns Filtered conversations
1963
- * @throws {AXApiError} If filtering fails
1964
- */
1965
- abstract filterConversations(filters: AXConversationFilters, pagination?: AXPagination): Promise<AXPaginatedResult<AXConversation>>;
1966
- /**
1967
- * Get conversation participants
1968
- *
1969
- * @param conversationId - Conversation ID
1970
- * @returns List of participants
1971
- * @throws {AXApiError} If request fails
1972
- */
1973
- abstract getParticipants(conversationId: string): Promise<AXParticipant[]>;
1974
- /**
1975
- * Add participants to conversation
1976
- *
1977
- * @param conversationId - Conversation ID
1978
- * @param userIds - User IDs to add
1979
- * @returns Updated conversation
1980
- * @throws {AXApiError} If adding fails
1981
- */
1982
- abstract addParticipants(conversationId: string, userIds: string[]): Promise<AXConversation>;
1983
- /**
1984
- * Remove participant from conversation
1985
- *
1986
- * @param conversationId - Conversation ID
1987
- * @param userId - User ID to remove
1988
- * @returns Updated conversation
1989
- * @throws {AXApiError} If removal fails
1990
- */
1991
- abstract removeParticipant(conversationId: string, userId: string): Promise<AXConversation>;
1992
- /**
1993
- * Leave conversation (remove self)
1994
- *
1995
- * @param conversationId - Conversation ID
1996
- * @throws {AXApiError} If leaving fails
1997
- */
1998
- abstract leaveConversation(conversationId: string): Promise<void>;
1999
- /**
2000
- * Update participant role/permissions
2001
- *
2002
- * @param conversationId - Conversation ID
2003
- * @param update - Participant update data
2004
- * @returns Updated conversation
2005
- * @throws {AXApiError} If update fails
2006
- */
2007
- abstract updateParticipant(conversationId: string, update: AXParticipantUpdate): Promise<AXConversation>;
1659
+ readonly activeComponent: _angular_core.Signal<_acorex_components_conversation2.AXInfoBarActiveComponent>;
1660
+ /** Active banner from service */
1661
+ readonly activeBanner: _angular_core.Signal<_acorex_components_conversation2.AXInfoBarActiveBanner>;
1662
+ /** Members popover reference */
1663
+ readonly membersPopoverRef: _angular_core.Signal<AXPopoverComponent>;
1664
+ /** Members popover target element */
1665
+ readonly membersPopoverTarget: _angular_core.WritableSignal<HTMLElement>;
1666
+ /** Loading state for async actions */
1667
+ readonly actionLoading: _angular_core.WritableSignal<boolean>;
1668
+ /** Avatar clicked event */
1669
+ readonly avatarClick: _angular_core.OutputEmitterRef<void>;
1670
+ /** Search clicked event */
1671
+ readonly searchClick: _angular_core.OutputEmitterRef<void>;
1672
+ /** Search query changed event */
1673
+ readonly searchQuery: _angular_core.OutputEmitterRef<string>;
1674
+ /** Menu item clicked event */
1675
+ readonly menuItemAction: _angular_core.OutputEmitterRef<string>;
1676
+ /** Inline action buttons from registry */
1677
+ readonly inlineActions: _angular_core.Signal<_acorex_components_conversation2.AXInfoBarAction[]>;
1678
+ /** Dropdown menu items from registry */
1679
+ readonly menuItems: _angular_core.Signal<DropdownMenuItem[]>;
1680
+ /** Get conversation status - delegate to utils */
1681
+ getStatus(conversation: AXConversation): 'online' | 'offline' | 'away' | undefined;
1682
+ /** Get subtitle text - delegate to utils */
1683
+ 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
+ /** Handle avatar click */
1689
+ onAvatarClick(): void;
1690
+ /** Handle members click - open popover */
1691
+ onMembersClick(event: MouseEvent): void;
1692
+ /** Handle inline action click */
1693
+ onInlineActionClick(actionId: string): Promise<void>;
1694
+ /** Get inputs for dynamic component */
1695
+ getComponentInputs(): Record<string, unknown>;
1696
+ getInlineComponentInputs(): Record<string, unknown>;
1697
+ isActiveComponentFullWidth(): boolean;
1698
+ /** Handle close component */
1699
+ onCloseComponent(): void;
1700
+ getBannerInputs(): Record<string, unknown>;
1701
+ onCloseBanner(): void;
1702
+ /** Handle menu item click */
1703
+ onMenuItemClick(item: DropdownMenuItem): Promise<void>;
1704
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfoBarComponent, never>;
1705
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXInfoBarComponent, "ax-conversation-info-bar", never, {}, { "avatarClick": "avatarClick"; "searchClick": "searchClick"; "searchQuery": "searchQuery"; "menuItemAction": "menuItemAction"; }, never, ["ax-prefix"], true, never>;
1706
+ }
1707
+
1708
+ /**
1709
+ * Active component state in info-bar
1710
+ */
1711
+ interface AXInfoBarActiveComponent {
1712
+ /** Action that triggered this component */
1713
+ action: AXInfoBarAction;
1714
+ /** Component to render */
1715
+ component: Type<unknown>;
1716
+ /** Component inputs */
1717
+ inputs?: Record<string, unknown>;
1718
+ }
1719
+ interface AXInfoBarActiveBanner {
1720
+ /** Message that owns this banner */
1721
+ message: AXMessage;
1722
+ /** Banner component */
1723
+ component: Type<AXMessageInfoBarBannerComponent>;
1724
+ /** Additional component inputs (only keys that match declared `input()` on the banner) */
1725
+ inputs?: Record<string, unknown>;
1726
+ /** Callback invoked when the banner is dismissed (e.g. pause playback) */
1727
+ onClose?: () => void;
1728
+ }
1729
+ /**
1730
+ * Info Bar Service
1731
+ * Manages info bar state and actions
1732
+ */
1733
+ declare class AXInfoBarService {
1734
+ private readonly conversationService;
1735
+ private readonly injector;
1736
+ private get registry();
1737
+ /** Active conversation */
1738
+ readonly activeConversation: _angular_core.Signal<AXConversation>;
1739
+ /** Active component being shown in info-bar */
1740
+ private readonly _activeComponent;
1741
+ readonly activeComponent: _angular_core.Signal<AXInfoBarActiveComponent>;
1742
+ /** Active banner shown under info-bar */
1743
+ private readonly _activeBanner;
1744
+ readonly activeBanner: _angular_core.Signal<AXInfoBarActiveBanner>;
1745
+ /** Search query signal */
1746
+ private readonly _searchQuery;
1747
+ readonly searchQuery: _angular_core.Signal<string>;
1748
+ private readonly _searchResultsCount;
1749
+ readonly searchResultsCount: _angular_core.Signal<number>;
1750
+ /** Current search result index */
1751
+ private readonly _currentSearchIndex;
1752
+ readonly currentSearchIndex: _angular_core.Signal<number>;
1753
+ constructor();
2008
1754
  /**
2009
- * Get conversation settings
2010
- *
2011
- * @param conversationId - Conversation ID
2012
- * @returns Conversation settings
2013
- * @throws {AXApiError} If request fails
1755
+ * Get actions for the active conversation
2014
1756
  */
2015
- abstract getConversationSettings(conversationId: string): Promise<AXConversationSettingsUpdate>;
1757
+ getActionsForConversation(conversation: AXConversation): AXInfoBarAction[];
2016
1758
  /**
2017
- * Update conversation settings
2018
- *
2019
- * @param conversationId - Conversation ID
2020
- * @param settings - Settings to update
2021
- * @throws {AXApiError} If update fails
1759
+ * Execute an action
2022
1760
  */
2023
- abstract updateConversationSettings(conversationId: string, settings: AXConversationSettingsUpdate): Promise<void>;
1761
+ executeAction(actionId: string, conversation: AXConversation, data?: Record<string, unknown>): Promise<void>;
2024
1762
  /**
2025
- * Mute conversation
2026
- *
2027
- * @param conversationId - Conversation ID
2028
- * @param duration - Mute duration in milliseconds (undefined = forever)
2029
- * @throws {AXApiError} If muting fails
1763
+ * Get action label
2030
1764
  */
2031
- abstract muteConversation(conversationId: string, duration?: number): Promise<void>;
1765
+ getActionLabel(action: AXInfoBarAction, conversation: AXConversation): string;
2032
1766
  /**
2033
- * Unmute conversation
2034
- *
2035
- * @param conversationId - Conversation ID
2036
- * @throws {AXApiError} If unmuting fails
1767
+ * Get action icon
2037
1768
  */
2038
- abstract unmuteConversation(conversationId: string): Promise<void>;
1769
+ getActionIcon(action: AXInfoBarAction, conversation: AXConversation): string | undefined;
2039
1770
  /**
2040
- * Upload conversation avatar
2041
- *
2042
- * @param conversationId - Conversation ID
2043
- * @param file - Avatar image file
2044
- * @returns Avatar URL
2045
- * @throws {AXApiError} If upload fails
1771
+ * Show a component in the info-bar
2046
1772
  */
2047
- abstract uploadConversationAvatar(conversationId: string, file: File): Promise<string>;
1773
+ showComponent(action: AXInfoBarAction, inputs?: Record<string, unknown>): void;
2048
1774
  /**
2049
- * Get conversation media gallery
2050
- *
2051
- * @param conversationId - Conversation ID
2052
- * @param pagination - Pagination parameters
2053
- * @returns Paginated media items
2054
- * @throws {AXApiError} If request fails
1775
+ * Hide the active component
2055
1776
  */
2056
- abstract getConversationMedia(conversationId: string, pagination?: AXPagination): Promise<AXPaginatedResult<unknown>>;
1777
+ hideComponent(): void;
2057
1778
  /**
2058
- * Add tags to conversation
2059
- *
2060
- * @param conversationId - Conversation ID
2061
- * @param tags - Tags to add
2062
- * @throws {AXApiError} If adding fails
1779
+ * Show message-owned banner under info-bar if renderer provides one
2063
1780
  */
2064
- abstract addConversationTags(conversationId: string, tags: string[]): Promise<void>;
1781
+ showMessageBanner(message: AXMessage, inputs?: Record<string, unknown>): void;
2065
1782
  /**
2066
- * Remove tags from conversation
2067
- *
2068
- * @param conversationId - Conversation ID
2069
- * @param tags - Tags to remove
2070
- * @throws {AXApiError} If removal fails
1783
+ * Update active banner inputs for a specific message
2071
1784
  */
2072
- abstract removeConversationTags(conversationId: string, tags: string[]): Promise<void>;
1785
+ updateMessageBannerInputs(messageId: string, inputs: Record<string, unknown>): void;
2073
1786
  /**
2074
- * Get conversation tags
2075
- *
2076
- * @param conversationId - Conversation ID
2077
- * @returns Array of tags
2078
- * @throws {AXApiError} If request fails
1787
+ * Hide active banner. If messageId is provided, hide only when it matches.
2079
1788
  */
2080
- abstract getConversationTags(conversationId: string): Promise<string[]>;
1789
+ hideMessageBanner(messageId?: string): void;
1790
+ isMessageBannerActive(messageId: string): boolean;
2081
1791
  /**
2082
- * Get conversation permissions for current user
2083
- *
2084
- * @param conversationId - Conversation ID
2085
- * @returns User permissions
2086
- * @throws {AXApiError} If request fails
1792
+ * Toggle component visibility
2087
1793
  */
2088
- abstract getConversationPermissions(conversationId: string): Promise<Record<string, boolean>>;
1794
+ toggleComponent(action: AXInfoBarAction, inputs?: Record<string, unknown>): void;
2089
1795
  /**
2090
- * Update conversation permissions
2091
- *
2092
- * @param conversationId - Conversation ID
2093
- * @param permissions - Permissions to update
2094
- * @throws {AXApiError} If update fails
1796
+ * Set search query
2095
1797
  */
2096
- abstract updateConversationPermissions(conversationId: string, permissions: Record<string, boolean>): Promise<void>;
1798
+ setSearchQuery(query: string): void;
2097
1799
  /**
2098
- * Save draft message for conversation
2099
- *
2100
- * @param conversationId - Conversation ID
2101
- * @param draft - Draft text
2102
- * @throws {AXApiError} If saving fails
1800
+ * Set search results
2103
1801
  */
2104
- abstract saveDraft(conversationId: string, draft: string): Promise<void>;
1802
+ setSearchResults(count: number, currentIndex?: number): void;
2105
1803
  /**
2106
- * Get draft message for conversation
2107
- *
2108
- * @param conversationId - Conversation ID
2109
- * @returns Draft text or null
2110
- * @throws {AXApiError} If request fails
1804
+ * Navigate to next search result
2111
1805
  */
2112
- abstract getDraft(conversationId: string): Promise<string | null>;
1806
+ nextSearchResult(): void;
2113
1807
  /**
2114
- * Clear draft message for conversation
2115
- *
2116
- * @param conversationId - Conversation ID
2117
- * @throws {AXApiError} If clearing fails
1808
+ * Navigate to previous search result
2118
1809
  */
2119
- abstract clearDraft(conversationId: string): Promise<void>;
1810
+ previousSearchResult(): void;
2120
1811
  /**
2121
- * Create an API error
2122
- * Helper method for consistent error creation
2123
- *
2124
- * @param code - Error code
2125
- * @param message - Error message
2126
- * @param statusCode - HTTP status code
2127
- * @param details - Additional details
2128
- * @returns API error object
1812
+ * Clear search
2129
1813
  */
2130
- protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXApiError;
1814
+ clearSearch(): void;
1815
+ private _extractOnClose;
1816
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfoBarService, never>;
1817
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXInfoBarService>;
1818
+ }
1819
+
1820
+ /**
1821
+ * Shared API Types
1822
+ * Common types used across all API services
1823
+ */
1824
+ /**
1825
+ * Pagination parameters
1826
+ */
1827
+ interface AXPagination {
1828
+ /** Page number (0-based) */
1829
+ page: number;
1830
+ /** Items per page */
1831
+ pageSize: number;
1832
+ /** Cursor for cursor-based pagination (optional) */
1833
+ cursor?: string;
1834
+ /** Sort field */
1835
+ sortBy?: string;
1836
+ /** Sort direction */
1837
+ sortDirection?: 'asc' | 'desc';
1838
+ }
1839
+ /**
1840
+ * Paginated response
1841
+ */
1842
+ interface AXPaginatedResult<T> {
1843
+ /** Result items */
1844
+ items: T[];
1845
+ /** Total count (if available) */
1846
+ total?: number;
1847
+ /** Next page cursor (for cursor-based pagination) */
1848
+ nextCursor?: string;
1849
+ /** Previous page cursor */
1850
+ prevCursor?: string;
1851
+ /** Whether there are more pages */
1852
+ hasMore: boolean;
1853
+ /** Current page number */
1854
+ page?: number;
1855
+ /** Total pages */
1856
+ totalPages?: number;
1857
+ }
1858
+ /**
1859
+ * Connection status
1860
+ */
1861
+ type AXConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';
1862
+ /**
1863
+ * API Error with details
1864
+ */
1865
+ interface AXApiError {
1866
+ /** Error code */
1867
+ code: string;
1868
+ /** Error message */
1869
+ message: string;
1870
+ /** HTTP status code */
1871
+ statusCode?: number;
1872
+ /** Additional details */
1873
+ details?: unknown;
1874
+ /** Timestamp */
1875
+ timestamp?: Date;
2131
1876
  }
1877
+ /**
1878
+ * User presence status
1879
+ */
1880
+ type AXPresenceStatus = 'online' | 'offline' | 'away' | 'busy' | 'invisible';
1881
+ /**
1882
+ * User role in conversation
1883
+ */
1884
+ type AXUserRole = 'owner' | 'admin' | 'member' | 'guest';
2132
1885
 
2133
1886
  /**
2134
- * Abstract Message Management API
2135
- * Handle message CRUD operations, reactions, and interactions
1887
+ * Abstract Conversation Management API
1888
+ * Handle conversation CRUD operations, participants, and settings
2136
1889
  */
2137
1890
 
2138
1891
  /**
2139
- * Message search filters
1892
+ * Conversation creation data
2140
1893
  */
2141
- interface AXMessageSearchFilters {
2142
- /** Search query */
2143
- query: string;
2144
- /** Filter by sender ID */
2145
- senderId?: string;
2146
- /** Filter by message type */
2147
- type?: string;
2148
- /** Date range start */
2149
- dateFrom?: Date;
2150
- /** Date range end */
2151
- dateTo?: Date;
2152
- /** Include only messages with media */
2153
- mediaOnly?: boolean;
1894
+ interface AXConversationCreateData {
1895
+ /** Conversation type */
1896
+ type: AXConversationType;
1897
+ /** Participant user IDs */
1898
+ participantIds: string[];
1899
+ /** Conversation title (for groups/channels) */
1900
+ title?: string;
1901
+ /** Conversation description */
1902
+ description?: string;
1903
+ /** Avatar URL */
1904
+ avatar?: string;
1905
+ /**
1906
+ * Font Awesome icon class(es) for this conversation when no image avatar is used.
1907
+ * Implementations should treat empty/whitespace `avatar` values as absent and use this icon fallback.
1908
+ */
1909
+ icon?: string;
1910
+ /** Custom metadata */
1911
+ metadata?: Record<string, unknown>;
2154
1912
  }
2155
1913
  /**
2156
- * Message forward data
1914
+ * Conversation update data
2157
1915
  */
2158
- interface AXMessageForwardData {
2159
- /** Message ID to forward */
2160
- messageId: string;
2161
- /** Target conversation IDs */
2162
- conversationIds: string[];
2163
- /** Optional caption */
2164
- caption?: string;
1916
+ interface AXConversationUpdateData {
1917
+ /** Conversation title */
1918
+ title?: string;
1919
+ /** Conversation description */
1920
+ description?: string;
1921
+ /** Avatar URL */
1922
+ avatar?: string;
1923
+ /**
1924
+ * Font Awesome icon class(es) for this conversation when no image avatar is used.
1925
+ * Implementations should treat empty/whitespace `avatar` values as absent and use this icon fallback.
1926
+ */
1927
+ icon?: string;
1928
+ /** Custom metadata */
1929
+ metadata?: Record<string, unknown>;
2165
1930
  }
2166
1931
  /**
2167
- * Read receipt information
1932
+ * Conversation filter options
2168
1933
  */
2169
- interface AXReadReceipt {
2170
- /** User ID */
2171
- userId: string;
2172
- /** User name */
2173
- userName: string;
2174
- /** Read timestamp */
2175
- readAt: Date;
1934
+ interface AXConversationFilters {
1935
+ /** Filter by type */
1936
+ type?: AXConversationType;
1937
+ /** Filter by unread */
1938
+ unread?: boolean;
1939
+ /** Filter by archived */
1940
+ archived?: boolean;
1941
+ /** Filter by pinned */
1942
+ pinned?: boolean;
1943
+ /** Search query */
1944
+ searchQuery?: string;
1945
+ /** Filter by tags */
1946
+ tags?: string[];
1947
+ /** Custom filters */
1948
+ custom?: Record<string, unknown>;
2176
1949
  }
2177
1950
  /**
2178
- * Pinned message information
1951
+ * Conversation settings update
2179
1952
  */
2180
- interface AXPinnedMessage {
2181
- /** Message ID */
2182
- messageId: string;
2183
- /** Pinned by user ID */
2184
- pinnedBy: string;
2185
- /** Pinned timestamp */
2186
- pinnedAt: Date;
1953
+ interface AXConversationSettingsUpdate {
1954
+ /** Muted until timestamp */
1955
+ mutedUntil?: Date;
1956
+ /** Show notifications */
1957
+ notifications?: boolean;
1958
+ /** Custom notification sound */
1959
+ notificationSound?: string;
1960
+ /** Show message preview in notifications */
1961
+ showPreview?: boolean;
1962
+ /** Custom settings */
1963
+ custom?: Record<string, unknown>;
2187
1964
  }
2188
1965
  /**
2189
- * Abstract Message Management API
1966
+ * Participant update data
1967
+ */
1968
+ interface AXParticipantUpdate {
1969
+ /** User ID */
1970
+ userId: string;
1971
+ /** New role */
1972
+ role?: AXUserRole;
1973
+ /** Custom permissions */
1974
+ permissions?: Record<string, boolean>;
1975
+ }
1976
+ /**
1977
+ * Abstract Conversation Management API
2190
1978
  *
2191
- * Implement this abstract class to handle message operations.
1979
+ * Implement this abstract class to handle conversation operations.
2192
1980
  *
2193
1981
  * @example
2194
1982
  * ```typescript
2195
1983
  * @Injectable()
2196
- * export class MyMessageApi extends AXMessageApi {
1984
+ * export class MyConversationApi extends AXConversationManagementApi {
2197
1985
  * constructor(private http: HttpClient) {
2198
1986
  * super();
2199
1987
  * }
2200
1988
  *
2201
- * async sendMessage(command: AXSendMessageCommand): Promise<AXMessage> {
2202
- * const response = await this.http.post('/api/messages', command).toPromise();
1989
+ * async createConversation(data: AXConversationCreateData): Promise<AXConversation> {
1990
+ * const response = await this.http.post('/api/conversations', data).toPromise();
2203
1991
  * return response;
2204
1992
  * }
2205
1993
  *
@@ -2207,269 +1995,261 @@ interface AXPinnedMessage {
2207
1995
  * }
2208
1996
  * ```
2209
1997
  */
2210
- declare abstract class AXMessageApi {
1998
+ declare abstract class AXConversationApi {
2211
1999
  /**
2212
- * Send a new message
2000
+ * Create a new conversation
2213
2001
  *
2214
- * @param command - Message send command
2215
- * @returns Sent message with server-generated ID
2216
- * @throws {AXApiError} If send fails
2002
+ * @param data - Conversation creation data
2003
+ * @returns Created conversation
2004
+ * @throws {AXApiError} If creation fails
2217
2005
  */
2218
- abstract sendMessage(command: AXSendMessageCommand): Promise<AXMessage>;
2006
+ abstract createConversation(data: AXConversationCreateData): Promise<AXConversation>;
2219
2007
  /**
2220
- * Get message by ID
2008
+ * Get conversation by ID
2221
2009
  *
2222
- * @param messageId - Message ID
2223
- * @returns Message details
2224
- * @throws {AXApiError} If message not found
2010
+ * @param conversationId - Conversation ID
2011
+ * @returns Conversation details
2012
+ * @throws {AXApiError} If conversation not found
2225
2013
  */
2226
- abstract getMessage(messageId: string): Promise<AXMessage>;
2014
+ abstract getConversation(conversationId: string): Promise<AXConversation>;
2227
2015
  /**
2228
- * Get messages for a conversation
2016
+ * Get conversations list with pagination
2229
2017
  *
2230
- * @param conversationId - Conversation ID
2231
2018
  * @param pagination - Pagination parameters
2232
- * @returns Paginated message list
2019
+ * @param filters - Optional filters
2020
+ * @returns Paginated conversation list
2233
2021
  * @throws {AXApiError} If request fails
2234
2022
  */
2235
- abstract getMessages(conversationId: string, pagination: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
2023
+ abstract getConversations(pagination: AXPagination, filters?: AXConversationFilters): Promise<AXPaginatedResult<AXConversation>>;
2236
2024
  /**
2237
- * Edit an existing message
2025
+ * Update conversation details
2238
2026
  *
2239
- * @param messageId - Message ID to edit
2240
- * @param payload - New message payload
2241
- * @returns Updated message
2242
- * @throws {AXApiError} If edit fails or message not found
2027
+ * @param conversationId - Conversation ID
2028
+ * @param updates - Update data
2029
+ * @returns Updated conversation
2030
+ * @throws {AXApiError} If update fails
2243
2031
  */
2244
- abstract editMessage(messageId: string, payload: AXMessagePayload): Promise<AXMessage>;
2032
+ abstract updateConversation(conversationId: string, updates: AXConversationUpdateData): Promise<AXConversation>;
2245
2033
  /**
2246
- * Delete a message
2034
+ * Delete conversation
2247
2035
  *
2248
- * @param messageId - Message ID to delete
2249
- * @param forEveryone - Delete for all participants (vs just for current user)
2036
+ * @param conversationId - Conversation ID
2250
2037
  * @throws {AXApiError} If deletion fails
2251
2038
  */
2252
- abstract deleteMessage(messageId: string, forEveryone?: boolean): Promise<void>;
2039
+ abstract deleteConversation(conversationId: string): Promise<boolean>;
2253
2040
  /**
2254
- * Delete multiple messages
2041
+ * Archive conversation
2255
2042
  *
2256
- * @param messageIds - Array of message IDs to delete
2257
- * @param forEveryone - Delete for all participants
2258
- * @throws {AXApiError} If deletion fails
2043
+ * @param conversationId - Conversation ID
2044
+ * @throws {AXApiError} If archiving fails
2259
2045
  */
2260
- abstract deleteMessages(messageIds: string[], forEveryone?: boolean): Promise<void>;
2046
+ abstract archiveConversation(conversationId: string): Promise<void>;
2261
2047
  /**
2262
- * Search messages in a conversation
2048
+ * Unarchive conversation
2263
2049
  *
2264
2050
  * @param conversationId - Conversation ID
2265
- * @param filters - Search filters
2266
- * @param pagination - Pagination parameters
2267
- * @returns Matching messages
2268
- * @throws {AXApiError} If search fails
2051
+ * @throws {AXApiError} If unarchiving fails
2269
2052
  */
2270
- abstract searchMessages(conversationId: string, filters: AXMessageSearchFilters, pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
2053
+ abstract unarchiveConversation(conversationId: string): Promise<void>;
2271
2054
  /**
2272
- * Search messages across all conversations
2055
+ * Pin conversation
2273
2056
  *
2274
- * @param filters - Search filters
2275
- * @param pagination - Pagination parameters
2276
- * @returns Matching messages
2277
- * @throws {AXApiError} If search fails
2057
+ * @param conversationId - Conversation ID
2058
+ * @throws {AXApiError} If pinning fails
2278
2059
  */
2279
- abstract searchAllMessages(filters: AXMessageSearchFilters, pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
2060
+ abstract pinConversation(conversationId: string): Promise<void>;
2280
2061
  /**
2281
- * Add a reaction to a message
2062
+ * Unpin conversation
2282
2063
  *
2283
- * @param messageId - Message ID
2284
- * @param emoji - Emoji reaction
2285
- * @throws {AXApiError} If reaction fails
2064
+ * @param conversationId - Conversation ID
2065
+ * @throws {AXApiError} If unpinning fails
2286
2066
  */
2287
- abstract addReaction(messageId: string, emoji: string): Promise<void>;
2067
+ abstract unpinConversation(conversationId: string): Promise<void>;
2288
2068
  /**
2289
- * Remove a reaction from a message
2069
+ * Mark conversation as read
2290
2070
  *
2291
- * @param messageId - Message ID
2292
- * @param emoji - Emoji reaction to remove
2293
- * @throws {AXApiError} If removal fails
2071
+ * @param conversationId - Conversation ID
2072
+ * @throws {AXApiError} If marking fails
2294
2073
  */
2295
- abstract removeReaction(messageId: string, emoji: string): Promise<void>;
2074
+ abstract markConversationAsRead(conversationId: string): Promise<void>;
2296
2075
  /**
2297
- * Get available reaction emojis
2076
+ * Mark conversation as unread
2298
2077
  *
2299
- * @returns Array of available emoji reactions
2300
- * @throws {AXApiError} If fetching fails
2078
+ * @param conversationId - Conversation ID
2079
+ * @throws {AXApiError} If marking fails
2301
2080
  */
2302
- abstract getAvailableReactions(): Promise<string[]>;
2081
+ abstract markConversationAsUnread(conversationId: string): Promise<void>;
2303
2082
  /**
2304
- * Mark messages as read
2083
+ * Search conversations
2305
2084
  *
2306
- * @param conversationId - Conversation ID
2307
- * @param messageIds - Array of message IDs to mark as read
2308
- * @throws {AXApiError} If marking fails
2085
+ * @param query - Search query
2086
+ * @returns Matching conversations
2087
+ * @throws {AXApiError} If search fails
2088
+ */
2089
+ abstract searchConversations(query: string): Promise<AXConversation[]>;
2090
+ /**
2091
+ * Filter conversations
2092
+ *
2093
+ * @param filters - Filter options
2094
+ * @param pagination - Pagination parameters
2095
+ * @returns Filtered conversations
2096
+ * @throws {AXApiError} If filtering fails
2309
2097
  */
2310
- abstract markAsRead(conversationId: string, messageIds: string[]): Promise<void>;
2098
+ abstract filterConversations(filters: AXConversationFilters, pagination?: AXPagination): Promise<AXPaginatedResult<AXConversation>>;
2311
2099
  /**
2312
- * Mark conversation as unread
2100
+ * Get conversation participants
2313
2101
  *
2314
2102
  * @param conversationId - Conversation ID
2315
- * @throws {AXApiError} If marking fails
2103
+ * @returns List of participants
2104
+ * @throws {AXApiError} If request fails
2316
2105
  */
2317
- abstract markAsUnread(conversationId: string): Promise<void>;
2106
+ abstract getParticipants(conversationId: string): Promise<AXParticipant[]>;
2318
2107
  /**
2319
- * Get read receipts for a message
2108
+ * Add participants to conversation
2320
2109
  *
2321
- * @param messageId - Message ID
2322
- * @returns Array of read receipts
2323
- * @throws {AXApiError} If request fails
2110
+ * @param conversationId - Conversation ID
2111
+ * @param userIds - User IDs to add
2112
+ * @returns Updated conversation
2113
+ * @throws {AXApiError} If adding fails
2324
2114
  */
2325
- abstract getReadReceipts(messageId: string): Promise<AXReadReceipt[]>;
2115
+ abstract addParticipants(conversationId: string, userIds: string[]): Promise<AXConversation>;
2326
2116
  /**
2327
- * Forward message to other conversations
2117
+ * Remove participant from conversation
2328
2118
  *
2329
- * @param data - Forward data
2330
- * @returns Array of forwarded messages
2331
- * @throws {AXApiError} If forwarding fails
2119
+ * @param conversationId - Conversation ID
2120
+ * @param userId - User ID to remove
2121
+ * @returns Updated conversation
2122
+ * @throws {AXApiError} If removal fails
2332
2123
  */
2333
- abstract forwardMessage(data: AXMessageForwardData): Promise<AXMessage[]>;
2124
+ abstract removeParticipant(conversationId: string, userId: string): Promise<AXConversation>;
2334
2125
  /**
2335
- * Pin message in conversation
2126
+ * Leave conversation (remove self)
2336
2127
  *
2337
2128
  * @param conversationId - Conversation ID
2338
- * @param messageId - Message ID to pin
2339
- * @throws {AXApiError} If pinning fails
2129
+ * @throws {AXApiError} If leaving fails
2340
2130
  */
2341
- abstract pinMessage(conversationId: string, messageId: string): Promise<void>;
2131
+ abstract leaveConversation(conversationId: string): Promise<void>;
2342
2132
  /**
2343
- * Unpin message from conversation
2133
+ * Update participant role/permissions
2344
2134
  *
2345
2135
  * @param conversationId - Conversation ID
2346
- * @param messageId - Message ID to unpin
2347
- * @throws {AXApiError} If unpinning fails
2136
+ * @param update - Participant update data
2137
+ * @returns Updated conversation
2138
+ * @throws {AXApiError} If update fails
2348
2139
  */
2349
- abstract unpinMessage(conversationId: string, messageId: string): Promise<void>;
2140
+ abstract updateParticipant(conversationId: string, update: AXParticipantUpdate): Promise<AXConversation>;
2350
2141
  /**
2351
- * Get pinned messages in conversation
2142
+ * Get conversation settings
2352
2143
  *
2353
2144
  * @param conversationId - Conversation ID
2354
- * @returns Array of pinned messages
2145
+ * @returns Conversation settings
2355
2146
  * @throws {AXApiError} If request fails
2356
2147
  */
2357
- abstract getPinnedMessages(conversationId: string): Promise<AXPinnedMessage[]>;
2148
+ abstract getConversationSettings(conversationId: string): Promise<AXConversationSettingsUpdate>;
2358
2149
  /**
2359
- * Get replies to a message
2150
+ * Update conversation settings
2360
2151
  *
2361
- * @param messageId - Original message ID
2362
- * @param pagination - Pagination parameters
2363
- * @returns Paginated replies
2364
- * @throws {AXApiError} If request fails
2152
+ * @param conversationId - Conversation ID
2153
+ * @param settings - Settings to update
2154
+ * @throws {AXApiError} If update fails
2365
2155
  */
2366
- abstract getMessageReplies(messageId: string, pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
2156
+ abstract updateConversationSettings(conversationId: string, settings: AXConversationSettingsUpdate): Promise<void>;
2367
2157
  /**
2368
- * Get reply count for a message
2158
+ * Mute conversation
2369
2159
  *
2370
- * @param messageId - Original message ID
2371
- * @returns Number of replies
2372
- * @throws {AXApiError} If fetching fails
2160
+ * @param conversationId - Conversation ID
2161
+ * @param duration - Mute duration in milliseconds (undefined = forever)
2162
+ * @throws {AXApiError} If muting fails
2373
2163
  */
2374
- abstract getReplyCount(messageId: string): Promise<number>;
2164
+ abstract muteConversation(conversationId: string, duration?: number): Promise<void>;
2375
2165
  /**
2376
- * Get forward count for a message
2166
+ * Unmute conversation
2377
2167
  *
2378
- * @param messageId - Original message ID
2379
- * @returns Number of times forwarded
2380
- * @throws {AXApiError} If fetching fails
2168
+ * @param conversationId - Conversation ID
2169
+ * @throws {AXApiError} If unmuting fails
2381
2170
  */
2382
- abstract getForwardCount(messageId: string): Promise<number>;
2171
+ abstract unmuteConversation(conversationId: string): Promise<void>;
2383
2172
  /**
2384
- * Send typing indicator
2173
+ * Upload conversation avatar
2385
2174
  *
2386
2175
  * @param conversationId - Conversation ID
2387
- * @throws {AXApiError} If sending fails
2176
+ * @param file - Avatar image file
2177
+ * @returns Avatar URL
2178
+ * @throws {AXApiError} If upload fails
2388
2179
  */
2389
- abstract sendTypingIndicator(conversationId: string): Promise<void>;
2180
+ abstract uploadConversationAvatar(conversationId: string, file: File): Promise<string>;
2390
2181
  /**
2391
- * Stop typing indicator
2182
+ * Get conversation media gallery
2392
2183
  *
2393
2184
  * @param conversationId - Conversation ID
2394
- * @throws {AXApiError} If stopping fails
2185
+ * @param pagination - Pagination parameters
2186
+ * @returns Paginated media items
2187
+ * @throws {AXApiError} If request fails
2395
2188
  */
2396
- abstract stopTypingIndicator(conversationId: string): Promise<void>;
2189
+ abstract getConversationMedia(conversationId: string, pagination?: AXPagination): Promise<AXPaginatedResult<unknown>>;
2397
2190
  /**
2398
- * Upload a file/media
2191
+ * Add tags to conversation
2399
2192
  *
2400
- * @param file - File to upload
2401
- * @param conversationId - Conversation ID for context
2402
- * @returns Upload result with URL and metadata
2403
- * @throws {AXApiError} If upload fails
2193
+ * @param conversationId - Conversation ID
2194
+ * @param tags - Tags to add
2195
+ * @throws {AXApiError} If adding fails
2404
2196
  */
2405
- abstract uploadFile(file: File, conversationId: string): Promise<{
2406
- url: string;
2407
- thumbnailUrl?: string;
2408
- size: number;
2409
- mimeType: string;
2410
- metadata?: Record<string, unknown>;
2411
- }>;
2197
+ abstract addConversationTags(conversationId: string, tags: string[]): Promise<void>;
2412
2198
  /**
2413
- * Update message metadata
2199
+ * Remove tags from conversation
2414
2200
  *
2415
- * @param messageId - Message ID
2416
- * @param metadata - Metadata to update
2417
- * @throws {AXApiError} If update fails
2201
+ * @param conversationId - Conversation ID
2202
+ * @param tags - Tags to remove
2203
+ * @throws {AXApiError} If removal fails
2418
2204
  */
2419
- abstract updateMessageMetadata(messageId: string, metadata: Record<string, unknown>): Promise<void>;
2205
+ abstract removeConversationTags(conversationId: string, tags: string[]): Promise<void>;
2420
2206
  /**
2421
- * Get message metadata
2207
+ * Get conversation tags
2422
2208
  *
2423
- * @param messageId - Message ID
2424
- * @returns Message metadata
2209
+ * @param conversationId - Conversation ID
2210
+ * @returns Array of tags
2425
2211
  * @throws {AXApiError} If request fails
2426
2212
  */
2427
- abstract getMessageMetadata(messageId: string): Promise<Record<string, unknown>>;
2213
+ abstract getConversationTags(conversationId: string): Promise<string[]>;
2428
2214
  /**
2429
- * Update message status
2215
+ * Get conversation permissions for current user
2430
2216
  *
2431
- * @param messageId - Message ID
2432
- * @param status - New status
2433
- * @throws {AXApiError} If update fails
2217
+ * @param conversationId - Conversation ID
2218
+ * @returns User permissions
2219
+ * @throws {AXApiError} If request fails
2434
2220
  */
2435
- abstract updateMessageStatus(messageId: string, status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed'): Promise<void>;
2221
+ abstract getConversationPermissions(conversationId: string): Promise<Record<string, boolean>>;
2436
2222
  /**
2437
- * Get message delivery status
2223
+ * Update conversation permissions
2438
2224
  *
2439
- * @param messageId - Message ID
2440
- * @returns Delivery status information
2441
- * @throws {AXApiError} If request fails
2225
+ * @param conversationId - Conversation ID
2226
+ * @param permissions - Permissions to update
2227
+ * @throws {AXApiError} If update fails
2442
2228
  */
2443
- abstract getMessageDeliveryStatus(messageId: string): Promise<{
2444
- delivered: number;
2445
- read: number;
2446
- total: number;
2447
- }>;
2229
+ abstract updateConversationPermissions(conversationId: string, permissions: Record<string, boolean>): Promise<void>;
2448
2230
  /**
2449
- * Mark multiple messages as read
2231
+ * Save draft message for conversation
2450
2232
  *
2451
- * @param messageIds - Array of message IDs
2452
- * @throws {AXApiError} If marking fails
2233
+ * @param conversationId - Conversation ID
2234
+ * @param draft - Draft text
2235
+ * @throws {AXApiError} If saving fails
2453
2236
  */
2454
- abstract markMessagesAsRead(messageIds: string[]): Promise<void>;
2237
+ abstract saveDraft(conversationId: string, draft: string): Promise<void>;
2455
2238
  /**
2456
- * Delete multiple messages in bulk
2239
+ * Get draft message for conversation
2457
2240
  *
2458
2241
  * @param conversationId - Conversation ID
2459
- * @param messageIds - Array of message IDs
2460
- * @param forEveryone - Delete for all participants
2461
- * @throws {AXApiError} If deletion fails
2242
+ * @returns Draft text or null
2243
+ * @throws {AXApiError} If request fails
2462
2244
  */
2463
- abstract bulkDeleteMessages(conversationId: string, messageIds: string[], forEveryone?: boolean): Promise<void>;
2245
+ abstract getDraft(conversationId: string): Promise<string | null>;
2464
2246
  /**
2465
- * Export conversation messages
2247
+ * Clear draft message for conversation
2466
2248
  *
2467
2249
  * @param conversationId - Conversation ID
2468
- * @param format - Export format (json, csv, txt)
2469
- * @returns Export data or download URL
2470
- * @throws {AXApiError} If export fails
2250
+ * @throws {AXApiError} If clearing fails
2471
2251
  */
2472
- abstract exportMessages(conversationId: string, format: 'json' | 'csv' | 'txt'): Promise<string | Blob>;
2252
+ abstract clearDraft(conversationId: string): Promise<void>;
2473
2253
  /**
2474
2254
  * Create an API error
2475
2255
  * Helper method for consistent error creation
@@ -2484,847 +2264,858 @@ declare abstract class AXMessageApi {
2484
2264
  }
2485
2265
 
2486
2266
  /**
2487
- * Abstract Real-time Events API
2488
- * Handle WebSocket/SSE connections and real-time event subscriptions
2267
+ * Abstract Message Management API
2268
+ * Handle message CRUD operations, reactions, and interactions
2489
2269
  */
2490
2270
 
2491
2271
  /**
2492
- * Connection options
2493
- */
2494
- interface AXConnectionOptions {
2495
- /** WebSocket/SSE endpoint URL */
2496
- url?: string;
2497
- /** Authentication token */
2498
- token?: string;
2499
- /** Reconnect automatically on disconnect */
2500
- autoReconnect?: boolean;
2501
- /** Reconnect delay in milliseconds */
2502
- reconnectDelay?: number;
2503
- /** Maximum reconnect attempts */
2504
- maxReconnectAttempts?: number;
2505
- /** Heartbeat interval in milliseconds */
2506
- heartbeatInterval?: number;
2507
- /** Custom headers */
2508
- headers?: Record<string, string>;
2509
- }
2510
- /**
2511
- * Connection event
2272
+ * Message search filters
2512
2273
  */
2513
- interface AXConnectionEvent {
2514
- /** Event type */
2515
- type: 'connected' | 'disconnected' | 'reconnecting' | 'error';
2516
- /** Timestamp */
2517
- timestamp: Date;
2518
- /** Error message if applicable */
2519
- error?: string;
2520
- /** Attempt number for reconnecting */
2521
- attempt?: number;
2274
+ interface AXMessageSearchFilters {
2275
+ /** Search query */
2276
+ query: string;
2277
+ /** Filter by sender ID */
2278
+ senderId?: string;
2279
+ /** Filter by message type */
2280
+ type?: string;
2281
+ /** Date range start */
2282
+ dateFrom?: Date;
2283
+ /** Date range end */
2284
+ dateTo?: Date;
2285
+ /** Include only messages with media */
2286
+ mediaOnly?: boolean;
2522
2287
  }
2523
2288
  /**
2524
- * Notification event
2289
+ * Message forward data
2525
2290
  */
2526
- interface AXNotificationEvent {
2527
- /** Notification ID */
2528
- id: string;
2529
- /** Notification type */
2530
- type: 'message' | 'mention' | 'reaction' | 'call' | 'system';
2531
- /** Title */
2532
- title: string;
2533
- /** Body text */
2534
- body: string;
2535
- /** Related conversation ID */
2536
- conversationId?: string;
2537
- /** Related message ID */
2538
- messageId?: string;
2539
- /** Icon URL */
2540
- icon?: string;
2541
- /** Timestamp */
2542
- timestamp: Date;
2543
- /** Custom data */
2544
- data?: Record<string, unknown>;
2291
+ interface AXMessageForwardData {
2292
+ /** Message ID to forward */
2293
+ messageId: string;
2294
+ /** Target conversation IDs */
2295
+ conversationIds: string[];
2296
+ /** Optional caption */
2297
+ caption?: string;
2545
2298
  }
2546
2299
  /**
2547
- * Call event
2300
+ * Read receipt information
2548
2301
  */
2549
- interface AXCallEvent {
2550
- /** Call ID */
2551
- callId: string;
2552
- /** Call type */
2553
- type: 'voice' | 'video';
2554
- /** Call status */
2555
- status: 'incoming' | 'outgoing' | 'accepted' | 'rejected' | 'ended' | 'missed';
2556
- /** Caller user ID */
2557
- callerId: string;
2558
- /** Conversation ID */
2559
- conversationId: string;
2560
- /** Timestamp */
2561
- timestamp: Date;
2562
- /** Call duration in seconds (for ended calls) */
2563
- duration?: number;
2302
+ interface AXReadReceipt {
2303
+ /** User ID */
2304
+ userId: string;
2305
+ /** User name */
2306
+ userName: string;
2307
+ /** Read timestamp */
2308
+ readAt: Date;
2564
2309
  }
2565
2310
  /**
2566
- * Abstract Real-time Events API
2311
+ * Pinned message information
2312
+ */
2313
+ interface AXPinnedMessage {
2314
+ /** Message ID */
2315
+ messageId: string;
2316
+ /** Pinned by user ID */
2317
+ pinnedBy: string;
2318
+ /** Pinned timestamp */
2319
+ pinnedAt: Date;
2320
+ }
2321
+ /**
2322
+ * Abstract Message Management API
2567
2323
  *
2568
- * Implement this abstract class to handle real-time event subscriptions.
2569
- * Supports WebSocket, SSE, or any other real-time protocol.
2324
+ * Implement this abstract class to handle message operations.
2570
2325
  *
2571
2326
  * @example
2572
2327
  * ```typescript
2573
2328
  * @Injectable()
2574
- * export class MyRealtimeApi extends AXRealtimeApi {
2575
- * private socket: WebSocket;
2576
- * private connectionStatus$ = new BehaviorSubject<AXConnectionStatus>('disconnected');
2577
- *
2578
- * async connect(options?: AXConnectionOptions): Promise<void> {
2579
- * this.socket = new WebSocket(options?.url || 'ws://localhost:3000');
2580
- * this.socket.onopen = () => this.connectionStatus$.next('connected');
2581
- * // ... handle other events
2329
+ * export class MyMessageApi extends AXMessageApi {
2330
+ * constructor(private http: HttpClient) {
2331
+ * super();
2582
2332
  * }
2583
2333
  *
2584
- * subscribeToMessages(conversationId: string): Observable<AXMessage> {
2585
- * return new Observable(subscriber => {
2586
- * this.socket.addEventListener('message', (event) => {
2587
- * const data = JSON.parse(event.data);
2588
- * if (data.type === 'message' && data.conversationId === conversationId) {
2589
- * subscriber.next(data.message);
2590
- * }
2591
- * });
2592
- * });
2334
+ * async sendMessage(command: AXSendMessageCommand): Promise<AXMessage> {
2335
+ * const response = await this.http.post('/api/messages', command).toPromise();
2336
+ * return response;
2593
2337
  * }
2594
2338
  *
2595
2339
  * // ... implement other methods
2596
2340
  * }
2597
2341
  * ```
2598
2342
  */
2599
- declare abstract class AXRealtimeApi {
2343
+ declare abstract class AXMessageApi {
2600
2344
  /**
2601
- * Current connection status
2602
- * Emit connection status changes through this observable
2345
+ * Send a new message
2346
+ *
2347
+ * @param command - Message send command
2348
+ * @returns Sent message with server-generated ID
2349
+ * @throws {AXApiError} If send fails
2603
2350
  */
2604
- abstract readonly connectionStatus$: Observable<AXConnectionStatus>;
2351
+ abstract sendMessage(command: AXSendMessageCommand): Promise<AXMessage>;
2605
2352
  /**
2606
- * Connect to real-time server
2607
- * Establish WebSocket/SSE connection
2353
+ * Get message by ID
2608
2354
  *
2609
- * @param options - Connection options
2610
- * @throws {Error} If connection fails
2355
+ * @param messageId - Message ID
2356
+ * @returns Message details
2357
+ * @throws {AXApiError} If message not found
2611
2358
  */
2612
- abstract connect(options?: AXConnectionOptions): Promise<void>;
2359
+ abstract getMessage(messageId: string): Promise<AXMessage>;
2613
2360
  /**
2614
- * Disconnect from real-time server
2615
- * Close connection and clean up resources
2361
+ * Get messages for a conversation
2362
+ *
2363
+ * @param conversationId - Conversation ID
2364
+ * @param pagination - Pagination parameters
2365
+ * @returns Paginated message list
2366
+ * @throws {AXApiError} If request fails
2616
2367
  */
2617
- abstract disconnect(): Promise<void>;
2368
+ abstract getMessages(conversationId: string, pagination: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
2618
2369
  /**
2619
- * Check if currently connected
2370
+ * Edit an existing message
2620
2371
  *
2621
- * @returns True if connected
2372
+ * @param messageId - Message ID to edit
2373
+ * @param payload - New message payload
2374
+ * @returns Updated message
2375
+ * @throws {AXApiError} If edit fails or message not found
2622
2376
  */
2623
- abstract isConnected(): boolean;
2377
+ abstract editMessage(messageId: string, payload: AXMessagePayload): Promise<AXMessage>;
2624
2378
  /**
2625
- * Reconnect to server
2626
- * Manually trigger reconnection
2379
+ * Delete a message
2380
+ *
2381
+ * @param messageId - Message ID to delete
2382
+ * @param forEveryone - Delete for all participants (vs just for current user)
2383
+ * @throws {AXApiError} If deletion fails
2627
2384
  */
2628
- abstract reconnect(): Promise<void>;
2385
+ abstract deleteMessage(messageId: string, forEveryone?: boolean): Promise<void>;
2629
2386
  /**
2630
- * Subscribe to connection events
2387
+ * Delete multiple messages
2631
2388
  *
2632
- * @returns Observable of connection events
2389
+ * @param messageIds - Array of message IDs to delete
2390
+ * @param forEveryone - Delete for all participants
2391
+ * @throws {AXApiError} If deletion fails
2633
2392
  */
2634
- abstract subscribeToConnectionEvents(): Observable<AXConnectionEvent>;
2393
+ abstract deleteMessages(messageIds: string[], forEveryone?: boolean): Promise<void>;
2635
2394
  /**
2636
- * Subscribe to new messages in a conversation
2395
+ * Search messages in a conversation
2637
2396
  *
2638
- * @param conversationId - Conversation ID (empty string for all conversations)
2639
- * @returns Observable stream of new messages
2397
+ * @param conversationId - Conversation ID
2398
+ * @param filters - Search filters
2399
+ * @param pagination - Pagination parameters
2400
+ * @returns Matching messages
2401
+ * @throws {AXApiError} If search fails
2640
2402
  */
2641
- abstract subscribeToMessages(conversationId: string): Observable<AXMessage>;
2403
+ abstract searchMessages(conversationId: string, filters: AXMessageSearchFilters, pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
2642
2404
  /**
2643
- * Subscribe to message updates (edits, status changes)
2405
+ * Search messages across all conversations
2644
2406
  *
2645
- * @param conversationId - Optional conversation ID to filter
2646
- * @returns Observable stream of updated messages
2407
+ * @param filters - Search filters
2408
+ * @param pagination - Pagination parameters
2409
+ * @returns Matching messages
2410
+ * @throws {AXApiError} If search fails
2647
2411
  */
2648
- abstract subscribeToMessageUpdates(conversationId?: string): Observable<AXMessage>;
2412
+ abstract searchAllMessages(filters: AXMessageSearchFilters, pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
2649
2413
  /**
2650
- * Subscribe to message deletions
2414
+ * Add a reaction to a message
2651
2415
  *
2652
- * @param conversationId - Optional conversation ID to filter
2653
- * @returns Observable stream of deleted message IDs
2416
+ * @param messageId - Message ID
2417
+ * @param emoji - Emoji reaction
2418
+ * @throws {AXApiError} If reaction fails
2654
2419
  */
2655
- abstract subscribeToMessageDeletions(conversationId?: string): Observable<string>;
2420
+ abstract addReaction(messageId: string, emoji: string): Promise<void>;
2656
2421
  /**
2657
- * Subscribe to message reactions
2422
+ * Remove a reaction from a message
2658
2423
  *
2659
- * @param conversationId - Optional conversation ID to filter
2660
- * @returns Observable stream of updated messages with reactions
2424
+ * @param messageId - Message ID
2425
+ * @param emoji - Emoji reaction to remove
2426
+ * @throws {AXApiError} If removal fails
2661
2427
  */
2662
- abstract subscribeToMessageReactions(conversationId?: string): Observable<AXMessage>;
2428
+ abstract removeReaction(messageId: string, emoji: string): Promise<void>;
2663
2429
  /**
2664
- * Subscribe to conversation updates
2665
- * Fires when conversation details change (title, avatar, participants, etc.)
2430
+ * Get available reaction emojis
2666
2431
  *
2667
- * @returns Observable stream of updated conversations
2432
+ * @returns Array of available emoji reactions
2433
+ * @throws {AXApiError} If fetching fails
2668
2434
  */
2669
- abstract subscribeToConversationUpdates(): Observable<AXConversation>;
2435
+ abstract getAvailableReactions(): Promise<string[]>;
2670
2436
  /**
2671
- * Subscribe to conversation creation
2672
- * Fires when user is added to a new conversation
2437
+ * Mark messages as read
2673
2438
  *
2674
- * @returns Observable stream of new conversations
2439
+ * @param conversationId - Conversation ID
2440
+ * @param messageIds - Array of message IDs to mark as read
2441
+ * @throws {AXApiError} If marking fails
2675
2442
  */
2676
- abstract subscribeToConversationCreated(): Observable<AXConversation>;
2443
+ abstract markAsRead(conversationId: string, messageIds: string[]): Promise<void>;
2677
2444
  /**
2678
- * Subscribe to conversation deletion
2679
- * Fires when a conversation is deleted
2445
+ * Mark conversation as unread
2680
2446
  *
2681
- * @returns Observable stream of deleted conversation IDs
2447
+ * @param conversationId - Conversation ID
2448
+ * @throws {AXApiError} If marking fails
2682
2449
  */
2683
- abstract subscribeToConversationDeleted(): Observable<string>;
2450
+ abstract markAsUnread(conversationId: string): Promise<void>;
2451
+ /**
2452
+ * Get read receipts for a message
2453
+ *
2454
+ * @param messageId - Message ID
2455
+ * @returns Array of read receipts
2456
+ * @throws {AXApiError} If request fails
2457
+ */
2458
+ abstract getReadReceipts(messageId: string): Promise<AXReadReceipt[]>;
2459
+ /**
2460
+ * Forward message to other conversations
2461
+ *
2462
+ * @param data - Forward data
2463
+ * @returns Array of forwarded messages
2464
+ * @throws {AXApiError} If forwarding fails
2465
+ */
2466
+ abstract forwardMessage(data: AXMessageForwardData): Promise<AXMessage[]>;
2467
+ /**
2468
+ * Pin message in conversation
2469
+ *
2470
+ * @param conversationId - Conversation ID
2471
+ * @param messageId - Message ID to pin
2472
+ * @throws {AXApiError} If pinning fails
2473
+ */
2474
+ abstract pinMessage(conversationId: string, messageId: string): Promise<void>;
2475
+ /**
2476
+ * Unpin message from conversation
2477
+ *
2478
+ * @param conversationId - Conversation ID
2479
+ * @param messageId - Message ID to unpin
2480
+ * @throws {AXApiError} If unpinning fails
2481
+ */
2482
+ abstract unpinMessage(conversationId: string, messageId: string): Promise<void>;
2483
+ /**
2484
+ * Get pinned messages in conversation
2485
+ *
2486
+ * @param conversationId - Conversation ID
2487
+ * @returns Array of pinned messages
2488
+ * @throws {AXApiError} If request fails
2489
+ */
2490
+ abstract getPinnedMessages(conversationId: string): Promise<AXPinnedMessage[]>;
2491
+ /**
2492
+ * Get replies to a message
2493
+ *
2494
+ * @param messageId - Original message ID
2495
+ * @param pagination - Pagination parameters
2496
+ * @returns Paginated replies
2497
+ * @throws {AXApiError} If request fails
2498
+ */
2499
+ abstract getMessageReplies(messageId: string, pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
2500
+ /**
2501
+ * Get reply count for a message
2502
+ *
2503
+ * @param messageId - Original message ID
2504
+ * @returns Number of replies
2505
+ * @throws {AXApiError} If fetching fails
2506
+ */
2507
+ abstract getReplyCount(messageId: string): Promise<number>;
2508
+ /**
2509
+ * Get forward count for a message
2510
+ *
2511
+ * @param messageId - Original message ID
2512
+ * @returns Number of times forwarded
2513
+ * @throws {AXApiError} If fetching fails
2514
+ */
2515
+ abstract getForwardCount(messageId: string): Promise<number>;
2684
2516
  /**
2685
- * Subscribe to typing indicators
2517
+ * Send typing indicator
2686
2518
  *
2687
- * @param conversationId - Conversation ID (empty string for all conversations)
2688
- * @returns Observable stream of typing indicators
2519
+ * @param conversationId - Conversation ID
2520
+ * @throws {AXApiError} If sending fails
2689
2521
  */
2690
- abstract subscribeToTypingIndicators(conversationId: string): Observable<AXTypingIndicator>;
2522
+ abstract sendTypingIndicator(conversationId: string): Promise<void>;
2691
2523
  /**
2692
- * Subscribe to presence updates (online/offline status)
2524
+ * Stop typing indicator
2693
2525
  *
2694
- * @param userIds - Optional array of user IDs to filter (empty for all users)
2695
- * @returns Observable stream of presence updates
2526
+ * @param conversationId - Conversation ID
2527
+ * @throws {AXApiError} If stopping fails
2696
2528
  */
2697
- abstract subscribeToPresenceUpdates(userIds?: string[]): Observable<AXPresenceUpdate>;
2529
+ abstract stopTypingIndicator(conversationId: string): Promise<void>;
2698
2530
  /**
2699
- * Subscribe to read receipt updates
2700
- * Fires when someone reads messages
2531
+ * Upload a file/media
2701
2532
  *
2702
- * @param conversationId - Optional conversation ID to filter
2703
- * @returns Observable stream of message IDs that were read
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
2704
2537
  */
2705
- abstract subscribeToReadReceipts(conversationId?: string): Observable<{
2706
- messageId: string;
2707
- userId: string;
2708
- readAt: Date;
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>;
2709
2544
  }>;
2710
2545
  /**
2711
- * Subscribe to push notifications
2712
- * Fires for mentions, calls, and other important events
2546
+ * Update message metadata
2713
2547
  *
2714
- * @returns Observable stream of notification events
2548
+ * @param messageId - Message ID
2549
+ * @param metadata - Metadata to update
2550
+ * @throws {AXApiError} If update fails
2715
2551
  */
2716
- abstract subscribeToNotifications(): Observable<AXNotificationEvent>;
2552
+ abstract updateMessageMetadata(messageId: string, metadata: Record<string, unknown>): Promise<void>;
2717
2553
  /**
2718
- * Subscribe to call events
2719
- * Fires for incoming/outgoing calls
2554
+ * Get message metadata
2720
2555
  *
2721
- * @returns Observable stream of call events
2556
+ * @param messageId - Message ID
2557
+ * @returns Message metadata
2558
+ * @throws {AXApiError} If request fails
2722
2559
  */
2723
- abstract subscribeToCallEvents?(): Observable<AXCallEvent>;
2560
+ abstract getMessageMetadata(messageId: string): Promise<Record<string, unknown>>;
2724
2561
  /**
2725
- * Subscribe to user blocked/unblocked events
2562
+ * Update message status
2726
2563
  *
2727
- * @returns Observable stream of user IDs and block status
2564
+ * @param messageId - Message ID
2565
+ * @param status - New status
2566
+ * @throws {AXApiError} If update fails
2728
2567
  */
2729
- abstract subscribeToUserBlockEvents(): Observable<{
2730
- userId: string;
2731
- blocked: boolean;
2732
- }>;
2568
+ abstract updateMessageStatus(messageId: string, status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed'): Promise<void>;
2733
2569
  /**
2734
- * Subscribe to participant added/removed events
2570
+ * Get message delivery status
2735
2571
  *
2736
- * @param conversationId - Optional conversation ID to filter
2737
- * @returns Observable stream of participant changes
2572
+ * @param messageId - Message ID
2573
+ * @returns Delivery status information
2574
+ * @throws {AXApiError} If request fails
2738
2575
  */
2739
- abstract subscribeToParticipantEvents(conversationId?: string): Observable<{
2740
- conversationId: string;
2741
- userId: string;
2742
- action: 'added' | 'removed';
2576
+ abstract getMessageDeliveryStatus(messageId: string): Promise<{
2577
+ delivered: number;
2578
+ read: number;
2579
+ total: number;
2743
2580
  }>;
2744
2581
  /**
2745
- * Subscribe to system events
2746
- * Fires for maintenance, updates, or other system-wide events
2582
+ * Mark multiple messages as read
2747
2583
  *
2748
- * @returns Observable stream of system events
2584
+ * @param messageIds - Array of message IDs
2585
+ * @throws {AXApiError} If marking fails
2749
2586
  */
2750
- abstract subscribeToSystemEvents(): Observable<{
2751
- type: string;
2752
- message: string;
2753
- data?: unknown;
2754
- }>;
2587
+ abstract markMessagesAsRead(messageIds: string[]): Promise<void>;
2755
2588
  /**
2756
- * Subscribe to message status changes
2757
- * Fires when message status changes (sending -> sent -> delivered -> read)
2589
+ * Delete multiple messages in bulk
2758
2590
  *
2759
- * @param conversationId - Optional conversation ID to filter
2760
- * @returns Observable stream of message status updates
2591
+ * @param conversationId - Conversation ID
2592
+ * @param messageIds - Array of message IDs
2593
+ * @param forEveryone - Delete for all participants
2594
+ * @throws {AXApiError} If deletion fails
2761
2595
  */
2762
- abstract subscribeToMessageStatusChanges(conversationId?: string): Observable<{
2763
- messageId: string;
2764
- status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed';
2765
- timestamp: Date;
2766
- }>;
2596
+ abstract bulkDeleteMessages(conversationId: string, messageIds: string[], forEveryone?: boolean): Promise<void>;
2767
2597
  /**
2768
- * Subscribe to conversation settings changes
2769
- * Fires when conversation settings are updated
2598
+ * Export conversation messages
2770
2599
  *
2771
- * @param conversationId - Optional conversation ID to filter
2772
- * @returns Observable stream of settings updates
2600
+ * @param conversationId - Conversation ID
2601
+ * @param format - Export format (json, csv, txt)
2602
+ * @returns Export data or download URL
2603
+ * @throws {AXApiError} If export fails
2773
2604
  */
2774
- abstract subscribeToConversationSettingsChanges(conversationId?: string): Observable<{
2775
- conversationId: string;
2776
- settings: Record<string, unknown>;
2777
- }>;
2605
+ abstract exportMessages(conversationId: string, format: 'json' | 'csv' | 'txt'): Promise<string | Blob>;
2778
2606
  /**
2779
- * Subscribe to draft changes
2780
- * Fires when draft is saved/updated in a conversation
2607
+ * Create an API error
2608
+ * Helper method for consistent error creation
2781
2609
  *
2782
- * @param conversationId - Optional conversation ID to filter
2783
- * @returns Observable stream of draft updates
2610
+ * @param code - Error code
2611
+ * @param message - Error message
2612
+ * @param statusCode - HTTP status code
2613
+ * @param details - Additional details
2614
+ * @returns API error object
2784
2615
  */
2785
- abstract subscribeToDraftChanges(conversationId?: string): Observable<{
2786
- conversationId: string;
2787
- draft: string | null;
2788
- }>;
2616
+ protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXApiError;
2789
2617
  }
2790
2618
 
2791
2619
  /**
2792
- * Abstract User Management API
2793
- * Handle user profile management and user operations for conversations
2620
+ * Abstract Real-time Events API
2621
+ * Handle WebSocket/SSE connections and real-time event subscriptions
2794
2622
  */
2795
2623
 
2796
2624
  /**
2797
- * User profile update data
2625
+ * Connection options
2798
2626
  */
2799
- interface AXUserProfileUpdate {
2800
- /** Display name */
2801
- name?: string;
2802
- /** Avatar URL */
2803
- avatar?: string;
2804
- /** Short line under the name in lists (e.g. job title) */
2805
- description?: string;
2806
- /** Bio/status text */
2807
- bio?: string;
2808
- /** Phone number */
2809
- phone?: string;
2810
- /** Email */
2811
- email?: string;
2812
- /** Custom fields */
2813
- custom?: Record<string, unknown>;
2627
+ interface AXConnectionOptions {
2628
+ /** WebSocket/SSE endpoint URL */
2629
+ url?: string;
2630
+ /** Authentication token */
2631
+ token?: string;
2632
+ /** Reconnect automatically on disconnect */
2633
+ autoReconnect?: boolean;
2634
+ /** Reconnect delay in milliseconds */
2635
+ reconnectDelay?: number;
2636
+ /** Maximum reconnect attempts */
2637
+ maxReconnectAttempts?: number;
2638
+ /** Heartbeat interval in milliseconds */
2639
+ heartbeatInterval?: number;
2640
+ /** Custom headers */
2641
+ headers?: Record<string, string>;
2814
2642
  }
2815
2643
  /**
2816
- * User search filters
2644
+ * Connection event
2817
2645
  */
2818
- interface AXUserSearchFilters {
2819
- /** Search query */
2820
- query?: string;
2821
- /** Filter by online status */
2822
- onlineOnly?: boolean;
2823
- /** Exclude blocked users */
2824
- excludeBlocked?: boolean;
2825
- /** Limit results */
2826
- limit?: number;
2646
+ interface AXConnectionEvent {
2647
+ /** Event type */
2648
+ type: 'connected' | 'disconnected' | 'reconnecting' | 'error';
2649
+ /** Timestamp */
2650
+ timestamp: Date;
2651
+ /** Error message if applicable */
2652
+ error?: string;
2653
+ /** Attempt number for reconnecting */
2654
+ attempt?: number;
2827
2655
  }
2828
2656
  /**
2829
- * Block/Report reason
2657
+ * Notification event
2830
2658
  */
2831
- interface AXBlockReportReason {
2832
- /** Reason code */
2833
- code: string;
2834
- /** Description */
2835
- description?: string;
2659
+ interface AXNotificationEvent {
2660
+ /** Notification ID */
2661
+ id: string;
2662
+ /** Notification type */
2663
+ type: 'message' | 'mention' | 'reaction' | 'call' | 'system';
2664
+ /** Title */
2665
+ title: string;
2666
+ /** Body text */
2667
+ body: string;
2668
+ /** Related conversation ID */
2669
+ conversationId?: string;
2670
+ /** Related message ID */
2671
+ messageId?: string;
2672
+ /** Icon URL */
2673
+ icon?: string;
2674
+ /** Timestamp */
2675
+ timestamp: Date;
2676
+ /** Custom data */
2677
+ data?: Record<string, unknown>;
2836
2678
  }
2837
2679
  /**
2838
- * Abstract User Management API
2680
+ * Call event
2681
+ */
2682
+ interface AXCallEvent {
2683
+ /** Call ID */
2684
+ callId: string;
2685
+ /** Call type */
2686
+ type: 'voice' | 'video';
2687
+ /** Call status */
2688
+ status: 'incoming' | 'outgoing' | 'accepted' | 'rejected' | 'ended' | 'missed';
2689
+ /** Caller user ID */
2690
+ callerId: string;
2691
+ /** Conversation ID */
2692
+ conversationId: string;
2693
+ /** Timestamp */
2694
+ timestamp: Date;
2695
+ /** Call duration in seconds (for ended calls) */
2696
+ duration?: number;
2697
+ }
2698
+ /**
2699
+ * Abstract Real-time Events API
2839
2700
  *
2840
- * Implement this abstract class to handle user management for conversations.
2701
+ * Implement this abstract class to handle real-time event subscriptions.
2702
+ * Supports WebSocket, SSE, or any other real-time protocol.
2841
2703
  *
2842
2704
  * @example
2843
2705
  * ```typescript
2844
2706
  * @Injectable()
2845
- * export class MyUserApi extends AXUserApi {
2846
- * constructor(private http: HttpClient) {
2847
- * super();
2707
+ * export class MyRealtimeApi extends AXRealtimeApi {
2708
+ * private socket: WebSocket;
2709
+ * private connectionStatus$ = new BehaviorSubject<AXConnectionStatus>('disconnected');
2710
+ *
2711
+ * async connect(options?: AXConnectionOptions): Promise<void> {
2712
+ * this.socket = new WebSocket(options?.url || 'ws://localhost:3000');
2713
+ * this.socket.onopen = () => this.connectionStatus$.next('connected');
2714
+ * // ... handle other events
2848
2715
  * }
2849
2716
  *
2850
- * async getCurrentUser(): Promise<AXParticipant> {
2851
- * const response = await this.http.get('/api/users/me').toPromise();
2852
- * return response;
2717
+ * subscribeToMessages(conversationId: string): Observable<AXMessage> {
2718
+ * return new Observable(subscriber => {
2719
+ * this.socket.addEventListener('message', (event) => {
2720
+ * const data = JSON.parse(event.data);
2721
+ * if (data.type === 'message' && data.conversationId === conversationId) {
2722
+ * subscriber.next(data.message);
2723
+ * }
2724
+ * });
2725
+ * });
2853
2726
  * }
2854
2727
  *
2855
2728
  * // ... implement other methods
2856
2729
  * }
2857
2730
  * ```
2858
2731
  */
2859
- declare abstract class AXUserApi {
2732
+ declare abstract class AXRealtimeApi {
2860
2733
  /**
2861
- * Get current authenticated user
2862
- *
2863
- * @returns Current user information
2864
- * @throws {AXApiError} If user is not authenticated
2734
+ * Current connection status
2735
+ * Emit connection status changes through this observable
2865
2736
  */
2866
- abstract getCurrentUser(): Promise<AXParticipant>;
2737
+ abstract readonly connectionStatus$: Observable<AXConnectionStatus>;
2867
2738
  /**
2868
- * Update current user profile
2739
+ * Connect to real-time server
2740
+ * Establish WebSocket/SSE connection
2869
2741
  *
2870
- * @param updates - Profile updates
2871
- * @returns Updated user information
2872
- * @throws {AXApiError} If update fails
2742
+ * @param options - Connection options
2743
+ * @throws {Error} If connection fails
2873
2744
  */
2874
- abstract updateProfile(updates: AXUserProfileUpdate): Promise<AXParticipant>;
2745
+ abstract connect(options?: AXConnectionOptions): Promise<void>;
2875
2746
  /**
2876
- * Upload user avatar
2877
- *
2878
- * @param file - Avatar image file
2879
- * @returns Avatar URL
2880
- * @throws {AXApiError} If upload fails
2747
+ * Disconnect from real-time server
2748
+ * Close connection and clean up resources
2881
2749
  */
2882
- abstract uploadAvatar(file: File): Promise<string>;
2750
+ abstract disconnect(): Promise<void>;
2883
2751
  /**
2884
- * Get available users for conversation creation
2752
+ * Check if currently connected
2885
2753
  *
2886
- * @param filters - Search filters
2887
- * @returns List of users
2888
- * @throws {AXApiError} If request fails
2754
+ * @returns True if connected
2889
2755
  */
2890
- abstract getUsers(filters?: AXUserSearchFilters): Promise<AXParticipant[]>;
2756
+ abstract isConnected(): boolean;
2891
2757
  /**
2892
- * Search users by query
2893
- *
2894
- * @param query - Search query
2895
- * @returns Matching users
2896
- * @throws {AXApiError} If search fails
2758
+ * Reconnect to server
2759
+ * Manually trigger reconnection
2897
2760
  */
2898
- abstract searchUsers(query: string): Promise<AXParticipant[]>;
2761
+ abstract reconnect(): Promise<void>;
2899
2762
  /**
2900
- * Get user by ID
2763
+ * Subscribe to connection events
2901
2764
  *
2902
- * @param userId - User ID
2903
- * @returns User information
2904
- * @throws {AXApiError} If user not found
2765
+ * @returns Observable of connection events
2905
2766
  */
2906
- abstract getUserById(userId: string): Promise<AXParticipant>;
2767
+ abstract subscribeToConnectionEvents(): Observable<AXConnectionEvent>;
2907
2768
  /**
2908
- * Get multiple users by IDs
2769
+ * Subscribe to new messages in a conversation
2909
2770
  *
2910
- * @param userIds - Array of user IDs
2911
- * @returns Array of users
2912
- * @throws {AXApiError} If request fails
2771
+ * @param conversationId - Conversation ID (empty string for all conversations)
2772
+ * @returns Observable stream of new messages
2913
2773
  */
2914
- abstract getUsersByIds(userIds: string[]): Promise<AXParticipant[]>;
2774
+ abstract subscribeToMessages(conversationId: string): Observable<AXMessage>;
2915
2775
  /**
2916
- * Get user presence status
2776
+ * Subscribe to message updates (edits, status changes)
2917
2777
  *
2918
- * @param userId - User ID
2919
- * @returns Presence information
2920
- * @throws {AXApiError} If request fails
2778
+ * @param conversationId - Optional conversation ID to filter
2779
+ * @returns Observable stream of updated messages
2921
2780
  */
2922
- abstract getUserPresence(userId: string): Promise<AXPresenceUpdate>;
2781
+ abstract subscribeToMessageUpdates(conversationId?: string): Observable<AXMessage>;
2923
2782
  /**
2924
- * Update current user presence
2783
+ * Subscribe to message deletions
2925
2784
  *
2926
- * @param status - Presence status
2927
- * @param statusText - Optional status text
2928
- * @throws {AXApiError} If update fails
2785
+ * @param conversationId - Optional conversation ID to filter
2786
+ * @returns Observable stream of deleted message IDs
2929
2787
  */
2930
- abstract updatePresence(status: AXPresenceStatus, statusText?: string): Promise<void>;
2788
+ abstract subscribeToMessageDeletions(conversationId?: string): Observable<string>;
2931
2789
  /**
2932
- * Block a user
2790
+ * Subscribe to message reactions
2933
2791
  *
2934
- * @param userId - User ID to block
2935
- * @param reason - Optional reason
2936
- * @throws {AXApiError} If blocking fails
2792
+ * @param conversationId - Optional conversation ID to filter
2793
+ * @returns Observable stream of updated messages with reactions
2937
2794
  */
2938
- abstract blockUser(userId: string, reason?: AXBlockReportReason): Promise<void>;
2795
+ abstract subscribeToMessageReactions(conversationId?: string): Observable<AXMessage>;
2939
2796
  /**
2940
- * Unblock a user
2797
+ * Subscribe to conversation updates
2798
+ * Fires when conversation details change (title, avatar, participants, etc.)
2941
2799
  *
2942
- * @param userId - User ID to unblock
2943
- * @throws {AXApiError} If unblocking fails
2800
+ * @returns Observable stream of updated conversations
2944
2801
  */
2945
- abstract unblockUser(userId: string): Promise<void>;
2802
+ abstract subscribeToConversationUpdates(): Observable<AXConversation>;
2946
2803
  /**
2947
- * Get list of blocked users
2804
+ * Subscribe to conversation creation
2805
+ * Fires when user is added to a new conversation
2948
2806
  *
2949
- * @returns Array of blocked user IDs
2950
- * @throws {AXApiError} If request fails
2807
+ * @returns Observable stream of new conversations
2951
2808
  */
2952
- abstract getBlockedUsers(): Promise<string[]>;
2809
+ abstract subscribeToConversationCreated(): Observable<AXConversation>;
2953
2810
  /**
2954
- * Report a user
2811
+ * Subscribe to conversation deletion
2812
+ * Fires when a conversation is deleted
2955
2813
  *
2956
- * @param userId - User ID to report
2957
- * @param reason - Report reason
2958
- * @throws {AXApiError} If reporting fails
2814
+ * @returns Observable stream of deleted conversation IDs
2959
2815
  */
2960
- abstract reportUser(userId: string, reason: AXBlockReportReason): Promise<void>;
2816
+ abstract subscribeToConversationDeleted(): Observable<string>;
2961
2817
  /**
2962
- * Get user settings
2818
+ * Subscribe to typing indicators
2963
2819
  *
2964
- * @returns User settings
2965
- * @throws {AXApiError} If request fails
2820
+ * @param conversationId - Conversation ID (empty string for all conversations)
2821
+ * @returns Observable stream of typing indicators
2966
2822
  */
2967
- abstract getUserSettings(): Promise<Record<string, unknown>>;
2823
+ abstract subscribeToTypingIndicators(conversationId: string): Observable<AXTypingIndicator>;
2968
2824
  /**
2969
- * Update user settings
2825
+ * Subscribe to presence updates (online/offline status)
2970
2826
  *
2971
- * @param settings - Settings to update
2972
- * @throws {AXApiError} If update fails
2827
+ * @param userIds - Optional array of user IDs to filter (empty for all users)
2828
+ * @returns Observable stream of presence updates
2973
2829
  */
2974
- abstract updateUserSettings(settings: Record<string, unknown>): Promise<void>;
2830
+ abstract subscribeToPresenceUpdates(userIds?: string[]): Observable<AXPresenceUpdate>;
2975
2831
  /**
2976
- * Create an API error
2977
- * Helper method for consistent error creation
2832
+ * Subscribe to read receipt updates
2833
+ * Fires when someone reads messages
2978
2834
  *
2979
- * @param code - Error code
2980
- * @param message - Error message
2981
- * @param statusCode - HTTP status code
2982
- * @param details - Additional details
2983
- * @returns API error object
2984
- */
2985
- protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXApiError;
2986
- }
2987
-
2988
- /**
2989
- * Error severity levels
2990
- */
2991
- type AXErrorSeverity = 'info' | 'warning' | 'error' | 'critical';
2992
- /**
2993
- * Conversation error event
2994
- */
2995
- interface AXConversationError {
2996
- /** Error code */
2997
- code: string;
2998
- /** Error message */
2999
- message: string;
3000
- /** Severity level */
3001
- severity: AXErrorSeverity;
3002
- /** Source operation */
3003
- operation: string;
3004
- /** Original error */
3005
- originalError?: unknown;
3006
- /** HTTP status code (if applicable) */
3007
- statusCode?: number;
3008
- /** Additional context */
3009
- context?: Record<string, unknown>;
3010
- /** Timestamp */
3011
- timestamp: Date;
3012
- /** Whether error was handled */
3013
- handled: boolean;
3014
- /** Recovery suggestions */
3015
- recoverySuggestions?: string[];
3016
- }
3017
- /**
3018
- * Error Handler Configuration
3019
- */
3020
- interface AXErrorHandlerConfig {
3021
- /** Log errors to console */
3022
- logToConsole?: boolean;
3023
- /** Show user-friendly error messages */
3024
- showUserMessages?: boolean;
3025
- /** Retry failed operations automatically */
3026
- autoRetry?: boolean;
3027
- /** Number of retry attempts */
3028
- maxRetries?: number;
3029
- /** Custom error handler */
3030
- customHandler?: (error: AXConversationError) => void;
3031
- }
3032
- /**
3033
- * Error Handler Service
3034
- */
3035
- declare class AXErrorHandlerService {
3036
- private readonly injectedConfig;
3037
- private readonly _errors$;
3038
- private readonly _config;
3039
- /** Error stream */
3040
- readonly errors$: rxjs.Observable<AXConversationError>;
3041
- constructor();
3042
- /**
3043
- * Configure error handler
3044
- */
3045
- configure(config: Partial<AXErrorHandlerConfig>): void;
3046
- /**
3047
- * Handle an error
3048
- */
3049
- handle(error: unknown, operation: string, context?: Record<string, unknown>): AXConversationError;
3050
- /**
3051
- * Handle API error (same pipeline as {@link handle}, for typed API failures)
3052
- */
3053
- handleApiError(apiError: AXApiError, operation: string, context?: Record<string, unknown>): AXConversationError;
3054
- private publish;
3055
- /**
3056
- * Normalize any error to conversation error format (does not publish — use {@link handle})
2835
+ * @param conversationId - Optional conversation ID to filter
2836
+ * @returns Observable stream of message IDs that were read
3057
2837
  */
3058
- private normalizeError;
3059
- private conversationErrorFromApi;
3060
- private isApiError;
2838
+ abstract subscribeToReadReceipts(conversationId?: string): Observable<{
2839
+ messageId: string;
2840
+ userId: string;
2841
+ readAt: Date;
2842
+ }>;
3061
2843
  /**
3062
- * Determine severity based on status code
2844
+ * Subscribe to push notifications
2845
+ * Fires for mentions, calls, and other important events
2846
+ *
2847
+ * @returns Observable stream of notification events
3063
2848
  */
3064
- private determineSeverity;
2849
+ abstract subscribeToNotifications(): Observable<AXNotificationEvent>;
3065
2850
  /**
3066
- * Get recovery suggestions based on error
2851
+ * Subscribe to call events
2852
+ * Fires for incoming/outgoing calls
2853
+ *
2854
+ * @returns Observable stream of call events
3067
2855
  */
3068
- private getRecoverySuggestions;
2856
+ abstract subscribeToCallEvents?(): Observable<AXCallEvent>;
3069
2857
  /**
3070
- * Get default recovery suggestions
2858
+ * Subscribe to user blocked/unblocked events
2859
+ *
2860
+ * @returns Observable stream of user IDs and block status
3071
2861
  */
3072
- private getDefaultRecoverySuggestions;
2862
+ abstract subscribeToUserBlockEvents(): Observable<{
2863
+ userId: string;
2864
+ blocked: boolean;
2865
+ }>;
3073
2866
  /**
3074
- * Log error to console
2867
+ * Subscribe to participant added/removed events
2868
+ *
2869
+ * @param conversationId - Optional conversation ID to filter
2870
+ * @returns Observable stream of participant changes
3075
2871
  */
3076
- private logError;
2872
+ abstract subscribeToParticipantEvents(conversationId?: string): Observable<{
2873
+ conversationId: string;
2874
+ userId: string;
2875
+ action: 'added' | 'removed';
2876
+ }>;
3077
2877
  /**
3078
- * Get user-friendly error message
2878
+ * Subscribe to system events
2879
+ * Fires for maintenance, updates, or other system-wide events
2880
+ *
2881
+ * @returns Observable stream of system events
3079
2882
  */
3080
- getUserFriendlyMessage(error: AXConversationError): string;
2883
+ abstract subscribeToSystemEvents(): Observable<{
2884
+ type: string;
2885
+ message: string;
2886
+ data?: unknown;
2887
+ }>;
3081
2888
  /**
3082
- * Check if error is retryable
2889
+ * Subscribe to message status changes
2890
+ * Fires when message status changes (sending -> sent -> delivered -> read)
2891
+ *
2892
+ * @param conversationId - Optional conversation ID to filter
2893
+ * @returns Observable stream of message status updates
3083
2894
  */
3084
- isRetryable(error: AXConversationError): boolean;
2895
+ abstract subscribeToMessageStatusChanges(conversationId?: string): Observable<{
2896
+ messageId: string;
2897
+ status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed';
2898
+ timestamp: Date;
2899
+ }>;
3085
2900
  /**
3086
- * Execute an operation with automatic retry logic
3087
- * @param operation - The async operation to execute
3088
- * @param operationName - Name of the operation for error tracking
3089
- * @param context - Additional context for error handling
3090
- * @returns Promise resolving to the operation result
3091
- * @throws {AXConversationError} If all retries fail
2901
+ * Subscribe to conversation settings changes
2902
+ * Fires when conversation settings are updated
2903
+ *
2904
+ * @param conversationId - Optional conversation ID to filter
2905
+ * @returns Observable stream of settings updates
3092
2906
  */
3093
- executeWithRetry<T>(operation: () => Promise<T>, operationName: string, context?: Record<string, unknown>): Promise<T>;
2907
+ abstract subscribeToConversationSettingsChanges(conversationId?: string): Observable<{
2908
+ conversationId: string;
2909
+ settings: Record<string, unknown>;
2910
+ }>;
3094
2911
  /**
3095
- * Delay helper for retry backoff
3096
- * @param ms - Milliseconds to delay
2912
+ * Subscribe to draft changes
2913
+ * Fires when draft is saved/updated in a conversation
2914
+ *
2915
+ * @param conversationId - Optional conversation ID to filter
2916
+ * @returns Observable stream of draft updates
3097
2917
  */
3098
- private delay;
3099
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXErrorHandlerService, never>;
3100
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXErrorHandlerService>;
2918
+ abstract subscribeToDraftChanges(conversationId?: string): Observable<{
2919
+ conversationId: string;
2920
+ draft: string | null;
2921
+ }>;
3101
2922
  }
3102
2923
 
3103
2924
  /**
3104
- * Dependency Injection Tokens
3105
- * InjectionTokens for configuration and dependencies
3106
- */
3107
-
3108
- /**
3109
- * Configuration token for conversation component
3110
- * Uses centralized defaults from AX_DEFAULT_CONVERSATION_CONFIG
3111
- */
3112
- declare const CONVERSATION_CONFIG: InjectionToken<Required<AXConversationConfig>>;
3113
- /**
3114
- * Token for configuring AXErrorHandlerService
3115
- */
3116
- declare const ERROR_HANDLER_CONFIG: InjectionToken<Partial<AXErrorHandlerConfig>>;
3117
-
3118
- /**
3119
- * Registry Configuration Tokens
3120
- * Injection tokens for configuring default registry values
2925
+ * Abstract User Management API
2926
+ * Handle user profile management and user operations for conversations
3121
2927
  */
3122
2928
 
3123
2929
  /**
3124
- * Additional message renderers configuration
3125
- * Provide this token to add custom message renderers in addition to built-in ones
3126
- * Note: Built-in renderers (text, system, fallback) are registered by default; other types are provided via plugins/constants.
3127
- */
3128
- declare const DEFAULT_MESSAGE_RENDERERS: InjectionToken<AXMessageRenderer[]>;
3129
- /**
3130
- * Default message actions configuration
3131
- * Provide this token to override default message actions
3132
- */
3133
- declare const DEFAULT_MESSAGE_ACTIONS: InjectionToken<AXMessageAction[]>;
3134
- /**
3135
- * Default composer tabs configuration
3136
- * Provide this token to override default composer tabs (emoji, stickers, etc.)
3137
- */
3138
- declare const DEFAULT_COMPOSER_TABS: InjectionToken<AXComposerTab[]>;
3139
- /**
3140
- * Default composer actions configuration
3141
- * Provide this token to override default composer actions (attach, voice, etc.)
3142
- */
3143
- declare const DEFAULT_COMPOSER_ACTIONS: InjectionToken<AXComposerAction[]>;
3144
- /**
3145
- * Default conversation tabs configuration
3146
- * Provide this token to override default conversation tabs (all, private, groups, etc.)
3147
- */
3148
- declare const DEFAULT_CONVERSATION_TABS: InjectionToken<AXConversationTab[]>;
3149
- /**
3150
- * Default info bar actions configuration
3151
- * Provide this token to override default info bar actions (mute, archive, block, etc.)
3152
- */
3153
- declare const DEFAULT_INFO_BAR_ACTIONS: InjectionToken<AXInfoBarAction[]>;
3154
- /**
3155
- * Default conversation item actions configuration
3156
- * Provide this token to override default conversation item actions (mute, delete, archive, etc.)
3157
- */
3158
- declare const DEFAULT_CONVERSATION_ITEM_ACTIONS: InjectionToken<AXConversationItemAction[]>;
3159
- /**
3160
- * Registry configuration interface
2930
+ * User profile update data
3161
2931
  */
3162
- interface AXRegistryConfiguration {
3163
- /**
3164
- * Additional message renderers to register (built-in renderers are automatic).
3165
- * Each {@link AXMessageRenderer} may include optional `composerActions` for co-located send UX.
3166
- */
3167
- messageRenderers?: AXMessageRenderer[];
3168
- /** Message actions to register by default */
3169
- messageActions?: AXMessageAction[];
3170
- /** Composer tabs to register by default */
3171
- composerTabs?: AXComposerTab[];
3172
- /** Composer actions to register by default */
3173
- composerActions?: AXComposerAction[];
3174
- /** Conversation tabs to register by default */
3175
- conversationTabs?: AXConversationTab[];
3176
- /** Info bar actions to register by default */
3177
- infoBarActions?: AXInfoBarAction[];
3178
- /** Conversation item actions to register by default */
3179
- conversationItemActions?: AXConversationItemAction[];
2932
+ interface AXUserProfileUpdate {
2933
+ /** Display name */
2934
+ name?: string;
2935
+ /** Avatar URL */
2936
+ avatar?: string;
2937
+ /** Short line under the name in lists (e.g. job title) */
2938
+ description?: string;
2939
+ /** Bio/status text */
2940
+ bio?: string;
2941
+ /** Phone number */
2942
+ phone?: string;
2943
+ /** Email */
2944
+ email?: string;
2945
+ /** Custom fields */
2946
+ custom?: Record<string, unknown>;
3180
2947
  }
3181
2948
  /**
3182
- * Complete registry configuration token
3183
- * Provide this for comprehensive registry configuration
2949
+ * User search filters
3184
2950
  */
3185
- declare const REGISTRY_CONFIG: InjectionToken<AXRegistryConfiguration>;
3186
-
3187
- declare class AXConversationContainerComponent {
3188
- private readonly conversationService;
3189
- protected readonly config: Required<AXConversationConfig>;
3190
- /** Custom CSS class */
3191
- readonly customClass: _angular_core.InputSignal<string>;
3192
- /** Loading state */
3193
- readonly loading: _angular_core.Signal<boolean>;
3194
- /** Error state */
3195
- readonly error: _angular_core.Signal<Error>;
3196
- /** Active conversation */
3197
- readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
3198
- /** Container CSS classes */
3199
- readonly containerClasses: _angular_core.Signal<string>;
3200
- closeActiveConversation(): void;
3201
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationContainerComponent, never>;
3202
- 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>;
3203
- }
3204
-
3205
- declare class AXConversationContainerDirective {
3206
- private readonly conversationService;
3207
- /** Active conversation */
3208
- readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
3209
- /** Loading state */
3210
- readonly loading: _angular_core.Signal<boolean>;
3211
- /** Error state */
3212
- readonly error: _angular_core.Signal<Error>;
3213
- closeActiveConversation(): void;
3214
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationContainerDirective, never>;
3215
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXConversationContainerDirective, "[axConversationContainer]", never, {}, {}, never, never, true, never>;
2951
+ interface AXUserSearchFilters {
2952
+ /** Search query */
2953
+ query?: string;
2954
+ /** Filter by online status */
2955
+ onlineOnly?: boolean;
2956
+ /** Exclude blocked users */
2957
+ excludeBlocked?: boolean;
2958
+ /** Limit results */
2959
+ limit?: number;
3216
2960
  }
3217
-
3218
2961
  /**
3219
- * Active component state in info-bar
2962
+ * Block/Report reason
3220
2963
  */
3221
- interface AXInfoBarActiveComponent {
3222
- /** Action that triggered this component */
3223
- action: AXInfoBarAction;
3224
- /** Component to render */
3225
- component: Type<unknown>;
3226
- /** Component inputs */
3227
- inputs?: Record<string, unknown>;
3228
- }
3229
- interface AXInfoBarActiveBanner {
3230
- /** Message that owns this banner */
3231
- message: AXMessage;
3232
- /** Banner component */
3233
- component: Type<AXMessageInfoBarBannerComponent>;
3234
- /** Additional component inputs (only keys that match declared `input()` on the banner) */
3235
- inputs?: Record<string, unknown>;
3236
- /** Callback invoked when the banner is dismissed (e.g. pause playback) */
3237
- onClose?: () => void;
2964
+ interface AXBlockReportReason {
2965
+ /** Reason code */
2966
+ code: string;
2967
+ /** Description */
2968
+ description?: string;
3238
2969
  }
3239
2970
  /**
3240
- * Info Bar Service
3241
- * Manages info bar state and actions
3242
- */
3243
- declare class AXInfoBarService {
3244
- private readonly conversationService;
3245
- private readonly injector;
3246
- private get registry();
3247
- /** Active conversation */
3248
- readonly activeConversation: _angular_core.Signal<AXConversation>;
3249
- /** Active component being shown in info-bar */
3250
- private readonly _activeComponent;
3251
- readonly activeComponent: _angular_core.Signal<AXInfoBarActiveComponent>;
3252
- /** Active banner shown under info-bar */
3253
- private readonly _activeBanner;
3254
- readonly activeBanner: _angular_core.Signal<AXInfoBarActiveBanner>;
3255
- /** Search query signal */
3256
- private readonly _searchQuery;
3257
- readonly searchQuery: _angular_core.Signal<string>;
3258
- private readonly _searchResultsCount;
3259
- readonly searchResultsCount: _angular_core.Signal<number>;
3260
- /** Current search result index */
3261
- private readonly _currentSearchIndex;
3262
- readonly currentSearchIndex: _angular_core.Signal<number>;
3263
- constructor();
2971
+ * Abstract User Management API
2972
+ *
2973
+ * Implement this abstract class to handle user management for conversations.
2974
+ *
2975
+ * @example
2976
+ * ```typescript
2977
+ * @Injectable()
2978
+ * export class MyUserApi extends AXUserApi {
2979
+ * constructor(private http: HttpClient) {
2980
+ * super();
2981
+ * }
2982
+ *
2983
+ * async getCurrentUser(): Promise<AXParticipant> {
2984
+ * const response = await this.http.get('/api/users/me').toPromise();
2985
+ * return response;
2986
+ * }
2987
+ *
2988
+ * // ... implement other methods
2989
+ * }
2990
+ * ```
2991
+ */
2992
+ declare abstract class AXUserApi {
3264
2993
  /**
3265
- * Get actions for the active conversation
2994
+ * Get current authenticated user
2995
+ *
2996
+ * @returns Current user information
2997
+ * @throws {AXApiError} If user is not authenticated
3266
2998
  */
3267
- getActionsForConversation(conversation: AXConversation): AXInfoBarAction[];
2999
+ abstract getCurrentUser(): Promise<AXParticipant>;
3268
3000
  /**
3269
- * Execute an action
3001
+ * Update current user profile
3002
+ *
3003
+ * @param updates - Profile updates
3004
+ * @returns Updated user information
3005
+ * @throws {AXApiError} If update fails
3270
3006
  */
3271
- executeAction(actionId: string, conversation: AXConversation, data?: Record<string, unknown>): Promise<void>;
3007
+ abstract updateProfile(updates: AXUserProfileUpdate): Promise<AXParticipant>;
3272
3008
  /**
3273
- * Get action label
3009
+ * Upload user avatar
3010
+ *
3011
+ * @param file - Avatar image file
3012
+ * @returns Avatar URL
3013
+ * @throws {AXApiError} If upload fails
3274
3014
  */
3275
- getActionLabel(action: AXInfoBarAction, conversation: AXConversation): string;
3015
+ abstract uploadAvatar(file: File): Promise<string>;
3276
3016
  /**
3277
- * Get action icon
3017
+ * Get available users for conversation creation
3018
+ *
3019
+ * @param filters - Search filters
3020
+ * @returns List of users
3021
+ * @throws {AXApiError} If request fails
3278
3022
  */
3279
- getActionIcon(action: AXInfoBarAction, conversation: AXConversation): string | undefined;
3023
+ abstract getUsers(filters?: AXUserSearchFilters): Promise<AXParticipant[]>;
3280
3024
  /**
3281
- * Show a component in the info-bar
3025
+ * Search users by query
3026
+ *
3027
+ * @param query - Search query
3028
+ * @returns Matching users
3029
+ * @throws {AXApiError} If search fails
3282
3030
  */
3283
- showComponent(action: AXInfoBarAction, inputs?: Record<string, unknown>): void;
3031
+ abstract searchUsers(query: string): Promise<AXParticipant[]>;
3284
3032
  /**
3285
- * Hide the active component
3033
+ * Get user by ID
3034
+ *
3035
+ * @param userId - User ID
3036
+ * @returns User information
3037
+ * @throws {AXApiError} If user not found
3286
3038
  */
3287
- hideComponent(): void;
3039
+ abstract getUserById(userId: string): Promise<AXParticipant>;
3288
3040
  /**
3289
- * Show message-owned banner under info-bar if renderer provides one
3041
+ * Get multiple users by IDs
3042
+ *
3043
+ * @param userIds - Array of user IDs
3044
+ * @returns Array of users
3045
+ * @throws {AXApiError} If request fails
3290
3046
  */
3291
- showMessageBanner(message: AXMessage, inputs?: Record<string, unknown>): void;
3047
+ abstract getUsersByIds(userIds: string[]): Promise<AXParticipant[]>;
3292
3048
  /**
3293
- * Update active banner inputs for a specific message
3049
+ * Get user presence status
3050
+ *
3051
+ * @param userId - User ID
3052
+ * @returns Presence information
3053
+ * @throws {AXApiError} If request fails
3294
3054
  */
3295
- updateMessageBannerInputs(messageId: string, inputs: Record<string, unknown>): void;
3055
+ abstract getUserPresence(userId: string): Promise<AXPresenceUpdate>;
3296
3056
  /**
3297
- * Hide active banner. If messageId is provided, hide only when it matches.
3057
+ * Update current user presence
3058
+ *
3059
+ * @param status - Presence status
3060
+ * @param statusText - Optional status text
3061
+ * @throws {AXApiError} If update fails
3298
3062
  */
3299
- hideMessageBanner(messageId?: string): void;
3300
- isMessageBannerActive(messageId: string): boolean;
3063
+ abstract updatePresence(status: AXPresenceStatus, statusText?: string): Promise<void>;
3301
3064
  /**
3302
- * Toggle component visibility
3065
+ * Block a user
3066
+ *
3067
+ * @param userId - User ID to block
3068
+ * @param reason - Optional reason
3069
+ * @throws {AXApiError} If blocking fails
3303
3070
  */
3304
- toggleComponent(action: AXInfoBarAction, inputs?: Record<string, unknown>): void;
3071
+ abstract blockUser(userId: string, reason?: AXBlockReportReason): Promise<void>;
3305
3072
  /**
3306
- * Set search query
3073
+ * Unblock a user
3074
+ *
3075
+ * @param userId - User ID to unblock
3076
+ * @throws {AXApiError} If unblocking fails
3307
3077
  */
3308
- setSearchQuery(query: string): void;
3078
+ abstract unblockUser(userId: string): Promise<void>;
3309
3079
  /**
3310
- * Set search results
3080
+ * Get list of blocked users
3081
+ *
3082
+ * @returns Array of blocked user IDs
3083
+ * @throws {AXApiError} If request fails
3311
3084
  */
3312
- setSearchResults(count: number, currentIndex?: number): void;
3085
+ abstract getBlockedUsers(): Promise<string[]>;
3313
3086
  /**
3314
- * Navigate to next search result
3087
+ * Report a user
3088
+ *
3089
+ * @param userId - User ID to report
3090
+ * @param reason - Report reason
3091
+ * @throws {AXApiError} If reporting fails
3315
3092
  */
3316
- nextSearchResult(): void;
3093
+ abstract reportUser(userId: string, reason: AXBlockReportReason): Promise<void>;
3317
3094
  /**
3318
- * Navigate to previous search result
3095
+ * Get user settings
3096
+ *
3097
+ * @returns User settings
3098
+ * @throws {AXApiError} If request fails
3319
3099
  */
3320
- previousSearchResult(): void;
3100
+ abstract getUserSettings(): Promise<Record<string, unknown>>;
3321
3101
  /**
3322
- * Clear search
3102
+ * Update user settings
3103
+ *
3104
+ * @param settings - Settings to update
3105
+ * @throws {AXApiError} If update fails
3323
3106
  */
3324
- clearSearch(): void;
3325
- private _extractOnClose;
3326
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfoBarService, never>;
3327
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXInfoBarService>;
3107
+ abstract updateUserSettings(settings: Record<string, unknown>): Promise<void>;
3108
+ /**
3109
+ * Create an API error
3110
+ * Helper method for consistent error creation
3111
+ *
3112
+ * @param code - Error code
3113
+ * @param message - Error message
3114
+ * @param statusCode - HTTP status code
3115
+ * @param details - Additional details
3116
+ * @returns API error object
3117
+ */
3118
+ protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXApiError;
3328
3119
  }
3329
3120
 
3330
3121
  /**
@@ -3405,9 +3196,9 @@ declare class AXConversationService {
3405
3196
  /** Error state */
3406
3197
  readonly error: _angular_core.Signal<Error>;
3407
3198
  /** Connection status */
3408
- readonly connectionStatus$: rxjs.Observable<AXConnectionStatus>;
3199
+ readonly connectionStatus$: rxjs.Observable<_acorex_components_conversation2.AXConnectionStatus>;
3409
3200
  /** Error stream */
3410
- readonly errors$: rxjs.Observable<AXConversationError>;
3201
+ readonly errors$: rxjs.Observable<_acorex_components_conversation2.AXConversationError>;
3411
3202
  readonly onMessageReceived: rxjs.Observable<AXMessage>;
3412
3203
  readonly onMessageUpdated: rxjs.Observable<AXMessage>;
3413
3204
  readonly onMessageDeleted: rxjs.Observable<string>;
@@ -3419,7 +3210,7 @@ declare class AXConversationService {
3419
3210
  type: "reply" | "forward";
3420
3211
  }>;
3421
3212
  private _currentUser;
3422
- readonly currentUser: _angular_core.Signal<AXParticipant>;
3213
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation2.AXParticipant>;
3423
3214
  constructor();
3424
3215
  /**
3425
3216
  * Initialize the service
@@ -3732,25 +3523,140 @@ declare class AXConversationService {
3732
3523
  */
3733
3524
  unblockUser(userId: string): Promise<void>;
3734
3525
  /**
3735
- * Get blocked users
3736
- * @returns Array of blocked user IDs
3526
+ * Get blocked users
3527
+ * @returns Array of blocked user IDs
3528
+ */
3529
+ getBlockedUsers(): Promise<string[]>;
3530
+ /**
3531
+ * Update user presence
3532
+ * @param status - Presence status
3533
+ * @param statusText - Optional status text
3534
+ */
3535
+ updatePresence(status: 'online' | 'offline' | 'away' | 'busy' | 'invisible', statusText?: string): Promise<void>;
3536
+ /**
3537
+ * Validate message content before sending
3538
+ * Uses centralized validation utilities for consistency
3539
+ * @param command - Message command to validate
3540
+ * @throws {Error} If message content is invalid
3541
+ */
3542
+ private validateMessageContent;
3543
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationService, never>;
3544
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationService>;
3545
+ }
3546
+
3547
+ /**
3548
+ * Error severity levels
3549
+ */
3550
+ type AXErrorSeverity = 'info' | 'warning' | 'error' | 'critical';
3551
+ /**
3552
+ * Conversation error event
3553
+ */
3554
+ interface AXConversationError {
3555
+ /** Error code */
3556
+ code: string;
3557
+ /** Error message */
3558
+ message: string;
3559
+ /** Severity level */
3560
+ severity: AXErrorSeverity;
3561
+ /** Source operation */
3562
+ operation: string;
3563
+ /** Original error */
3564
+ originalError?: unknown;
3565
+ /** HTTP status code (if applicable) */
3566
+ statusCode?: number;
3567
+ /** Additional context */
3568
+ context?: Record<string, unknown>;
3569
+ /** Timestamp */
3570
+ timestamp: Date;
3571
+ /** Whether error was handled */
3572
+ handled: boolean;
3573
+ /** Recovery suggestions */
3574
+ recoverySuggestions?: string[];
3575
+ }
3576
+ /**
3577
+ * Error Handler Configuration
3578
+ */
3579
+ interface AXErrorHandlerConfig {
3580
+ /** Log errors to console */
3581
+ logToConsole?: boolean;
3582
+ /** Show user-friendly error messages */
3583
+ showUserMessages?: boolean;
3584
+ /** Retry failed operations automatically */
3585
+ autoRetry?: boolean;
3586
+ /** Number of retry attempts */
3587
+ maxRetries?: number;
3588
+ /** Custom error handler */
3589
+ customHandler?: (error: AXConversationError) => void;
3590
+ }
3591
+ /**
3592
+ * Error Handler Service
3593
+ */
3594
+ declare class AXErrorHandlerService {
3595
+ private readonly injectedConfig;
3596
+ private readonly _errors$;
3597
+ private readonly _config;
3598
+ /** Error stream */
3599
+ readonly errors$: rxjs.Observable<AXConversationError>;
3600
+ constructor();
3601
+ /**
3602
+ * Configure error handler
3603
+ */
3604
+ configure(config: Partial<AXErrorHandlerConfig>): void;
3605
+ /**
3606
+ * Handle an error
3607
+ */
3608
+ handle(error: unknown, operation: string, context?: Record<string, unknown>): AXConversationError;
3609
+ /**
3610
+ * Handle API error (same pipeline as {@link handle}, for typed API failures)
3611
+ */
3612
+ handleApiError(apiError: AXApiError, operation: string, context?: Record<string, unknown>): AXConversationError;
3613
+ private publish;
3614
+ /**
3615
+ * Normalize any error to conversation error format (does not publish — use {@link handle})
3616
+ */
3617
+ private normalizeError;
3618
+ private conversationErrorFromApi;
3619
+ private isApiError;
3620
+ /**
3621
+ * Determine severity based on status code
3622
+ */
3623
+ private determineSeverity;
3624
+ /**
3625
+ * Get recovery suggestions based on error
3626
+ */
3627
+ private getRecoverySuggestions;
3628
+ /**
3629
+ * Get default recovery suggestions
3630
+ */
3631
+ private getDefaultRecoverySuggestions;
3632
+ /**
3633
+ * Log error to console
3634
+ */
3635
+ private logError;
3636
+ /**
3637
+ * Get user-friendly error message
3638
+ */
3639
+ getUserFriendlyMessage(error: AXConversationError): string;
3640
+ /**
3641
+ * Check if error is retryable
3737
3642
  */
3738
- getBlockedUsers(): Promise<string[]>;
3643
+ isRetryable(error: AXConversationError): boolean;
3739
3644
  /**
3740
- * Update user presence
3741
- * @param status - Presence status
3742
- * @param statusText - Optional status text
3645
+ * Execute an operation with automatic retry logic
3646
+ * @param operation - The async operation to execute
3647
+ * @param operationName - Name of the operation for error tracking
3648
+ * @param context - Additional context for error handling
3649
+ * @returns Promise resolving to the operation result
3650
+ * @throws {AXConversationError} If all retries fail
3743
3651
  */
3744
- updatePresence(status: 'online' | 'offline' | 'away' | 'busy' | 'invisible', statusText?: string): Promise<void>;
3652
+ executeWithRetry<T>(operation: () => Promise<T>, operationName: string, context?: Record<string, unknown>): Promise<T>;
3745
3653
  /**
3746
- * Validate message content before sending
3747
- * Uses centralized validation utilities for consistency
3748
- * @param command - Message command to validate
3749
- * @throws {Error} If message content is invalid
3654
+ * Delay helper for retry backoff
3655
+ * @param ms - Milliseconds to delay
3750
3656
  */
3751
- private validateMessageContent;
3752
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationService, never>;
3753
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationService>;
3657
+ private delay;
3658
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXErrorHandlerService, never>;
3659
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXErrorHandlerService>;
3754
3660
  }
3755
3661
 
3756
3662
  interface FilePreview {
@@ -3785,71 +3691,6 @@ declare class AXFileUploadService {
3785
3691
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXFileUploadService>;
3786
3692
  }
3787
3693
 
3788
- interface DropdownMenuItem {
3789
- id: string;
3790
- label: string;
3791
- icon?: string;
3792
- disabled?: boolean;
3793
- divider?: boolean;
3794
- destructive?: boolean;
3795
- shortcut?: string;
3796
- }
3797
- declare class AXInfoBarComponent {
3798
- private readonly conversationService;
3799
- private readonly infoBar;
3800
- protected get registry(): AXRegistryService;
3801
- /** Active conversation */
3802
- readonly activeConversation: _angular_core.Signal<AXConversation>;
3803
- /** Active component from service */
3804
- readonly activeComponent: _angular_core.Signal<AXInfoBarActiveComponent>;
3805
- /** Active banner from service */
3806
- readonly activeBanner: _angular_core.Signal<AXInfoBarActiveBanner>;
3807
- /** Members popover reference */
3808
- readonly membersPopoverRef: _angular_core.Signal<AXPopoverComponent>;
3809
- /** Members popover target element */
3810
- readonly membersPopoverTarget: _angular_core.WritableSignal<HTMLElement>;
3811
- /** Loading state for async actions */
3812
- readonly actionLoading: _angular_core.WritableSignal<boolean>;
3813
- /** Avatar clicked event */
3814
- readonly avatarClick: _angular_core.OutputEmitterRef<void>;
3815
- /** Search clicked event */
3816
- readonly searchClick: _angular_core.OutputEmitterRef<void>;
3817
- /** Search query changed event */
3818
- readonly searchQuery: _angular_core.OutputEmitterRef<string>;
3819
- /** Menu item clicked event */
3820
- readonly menuItemAction: _angular_core.OutputEmitterRef<string>;
3821
- /** Inline action buttons from registry */
3822
- readonly inlineActions: _angular_core.Signal<_acorex_components_conversation2.AXInfoBarAction[]>;
3823
- /** Dropdown menu items from registry */
3824
- readonly menuItems: _angular_core.Signal<DropdownMenuItem[]>;
3825
- /** Get conversation status - delegate to utils */
3826
- getStatus(conversation: AXConversation): 'online' | 'offline' | 'away' | undefined;
3827
- /** Get subtitle text - delegate to utils */
3828
- getSubtitle(conversation: AXConversation): string;
3829
- /** Get initials from name - delegate to utils */
3830
- getInitials(name: string): string;
3831
- getConversationAvatar(conversation: AXConversation): string | undefined;
3832
- getConversationAvatarIcon(conversation: AXConversation): string | undefined;
3833
- /** Handle avatar click */
3834
- onAvatarClick(): void;
3835
- /** Handle members click - open popover */
3836
- onMembersClick(event: MouseEvent): void;
3837
- /** Handle inline action click */
3838
- onInlineActionClick(actionId: string): Promise<void>;
3839
- /** Get inputs for dynamic component */
3840
- getComponentInputs(): Record<string, unknown>;
3841
- getInlineComponentInputs(): Record<string, unknown>;
3842
- isActiveComponentFullWidth(): boolean;
3843
- /** Handle close component */
3844
- onCloseComponent(): void;
3845
- getBannerInputs(): Record<string, unknown>;
3846
- onCloseBanner(): void;
3847
- /** Handle menu item click */
3848
- onMenuItemClick(item: DropdownMenuItem): Promise<void>;
3849
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfoBarComponent, never>;
3850
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXInfoBarComponent, "ax-conversation-info-bar", never, {}, { "avatarClick": "avatarClick"; "searchClick": "searchClick"; "searchQuery": "searchQuery"; "menuItemAction": "menuItemAction"; }, never, ["ax-prefix"], true, never>;
3851
- }
3852
-
3853
3694
  declare class AXForwardMessageDialogComponent implements OnInit {
3854
3695
  private readonly toastService;
3855
3696
  private readonly translation;
@@ -3902,7 +3743,7 @@ declare class AXMessageListComponent implements OnDestroy {
3902
3743
  private readonly conversationService;
3903
3744
  private readonly messageListService;
3904
3745
  private readonly translation;
3905
- protected readonly config: Required<AXConversationConfig>;
3746
+ protected readonly config: Required<_acorex_components_conversation2.AXConversationConfig>;
3906
3747
  /**
3907
3748
  * Background for the message list scroll area from config, or the built-in soft gradient when unset/empty.
3908
3749
  * Set `messageListBackground` to `transparent` or `none` for a flat look.
@@ -3934,7 +3775,7 @@ declare class AXMessageListComponent implements OnDestroy {
3934
3775
  /** Show scroll to bottom button - use service */
3935
3776
  readonly showScrollButton: _angular_core.WritableSignal<boolean>;
3936
3777
  /** Active conversation */
3937
- readonly activeConversation: _angular_core.Signal<AXConversation>;
3778
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
3938
3779
  /** Messages */
3939
3780
  readonly messages: _angular_core.Signal<AXMessage[]>;
3940
3781
  /** Message action event */
@@ -3943,7 +3784,7 @@ declare class AXMessageListComponent implements OnDestroy {
3943
3784
  action: string;
3944
3785
  }>;
3945
3786
  /** Current user from service */
3946
- readonly currentUser: _angular_core.Signal<AXParticipant>;
3787
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation2.AXParticipant>;
3947
3788
  /** Message grouped by date - use service */
3948
3789
  readonly messageGroups: _angular_core.Signal<{
3949
3790
  date: string;
@@ -4100,9 +3941,9 @@ declare class AXMessageListService {
4100
3941
  private readonly conversationService;
4101
3942
  private readonly config;
4102
3943
  private get registry();
4103
- readonly activeConversation: _angular_core.Signal<AXConversation>;
3944
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
4104
3945
  readonly activeMessages: _angular_core.Signal<AXMessage[]>;
4105
- readonly currentUser: _angular_core.Signal<AXParticipant>;
3946
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation2.AXParticipant>;
4106
3947
  /** Loading state */
4107
3948
  readonly loading: _angular_core.WritableSignal<boolean>;
4108
3949
  /** Loading more messages state */
@@ -4178,7 +4019,7 @@ declare class AXSidebarService {
4178
4019
 
4179
4020
  declare class AXSidebarComponent implements OnDestroy {
4180
4021
  readonly sidebar: AXSidebarService;
4181
- protected readonly config: Required<AXConversationConfig>;
4022
+ protected readonly config: Required<_acorex_components_conversation2.AXConversationConfig>;
4182
4023
  private readonly conversationService;
4183
4024
  private readonly popupService;
4184
4025
  private readonly translation;
@@ -4280,6 +4121,165 @@ declare class AXInfiniteScrollDirective {
4280
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>;
4281
4122
  }
4282
4123
 
4124
+ /**
4125
+ * Conversation Configuration Interface
4126
+ * Centralized configuration values to avoid magic numbers
4127
+ */
4128
+ /**
4129
+ * Main configuration interface for the conversation component
4130
+ */
4131
+ interface AXConversationConfig {
4132
+ /** Number of messages to load per page */
4133
+ messagePageSize?: number;
4134
+ /** Number of conversations to load per page */
4135
+ conversationPageSize?: number;
4136
+ /** Scroll threshold for detecting scroll events */
4137
+ scrollThreshold?: number;
4138
+ /** Infinite scroll threshold */
4139
+ infiniteScrollThreshold?: number;
4140
+ /** Typing indicator timeout in milliseconds */
4141
+ typingIndicatorTimeout?: number;
4142
+ /** Typing indicator throttle in milliseconds (for rate limiting) */
4143
+ typingIndicatorThrottle?: number;
4144
+ /** Message highlight duration in milliseconds */
4145
+ messageHighlightDuration?: number;
4146
+ /** Search debounce delay in milliseconds */
4147
+ debounceSearch?: number;
4148
+ /** Date separator inactivity fade delay in milliseconds */
4149
+ /** Maximum messages per conversation */
4150
+ maxMessagesPerConversation?: number;
4151
+ /** Maximum total messages in store */
4152
+ maxTotalMessages?: number;
4153
+ /** Maximum cached conversations */
4154
+ maxCachedConversations?: number;
4155
+ /** Minimum sidebar width in pixels */
4156
+ minSidebarWidth?: number;
4157
+ /** Maximum sidebar width in pixels */
4158
+ maxSidebarWidth?: number;
4159
+ /** Default sidebar width in pixels */
4160
+ defaultSidebarWidth?: number;
4161
+ /** Filter cache size */
4162
+ filterCacheSize?: number;
4163
+ /** Maximum file size in bytes */
4164
+ maxFileSize?: number;
4165
+ /** Allowed file types (glob patterns like 'image/*') */
4166
+ allowedFileTypes?: string[];
4167
+ /** Maximum message length in characters */
4168
+ maxMessageLength?: number;
4169
+ /** Minimum message length in characters */
4170
+ minMessageLength?: number;
4171
+ /** Threshold for marking messages as read (0.0 to 1.0, default: 0.3) */
4172
+ messageReadThreshold?: number;
4173
+ /**
4174
+ * CSS `background` for the message list (`ax-conversation-message-list` area, all states: loading, empty, messages).
4175
+ * Use full shorthand, or a bare `https://...` / `/path/to.png` (wrapped as `url(...)` with `center/cover`).
4176
+ * Empty string = library default soft gradient. `transparent` or `none` = flat background.
4177
+ */
4178
+ messageListBackground?: string;
4179
+ }
4180
+
4181
+ /**
4182
+ * Default Configuration Values
4183
+ * Centralized defaults to avoid magic numbers throughout the codebase
4184
+ */
4185
+
4186
+ /**
4187
+ * Default conversation configuration
4188
+ * All values are explicitly defined here for easy maintenance and documentation
4189
+ */
4190
+ declare const AX_DEFAULT_CONVERSATION_CONFIG: Required<AXConversationConfig>;
4191
+ /**
4192
+ * Helper function to merge user config with defaults
4193
+ * Properly handles array merging to avoid reference issues
4194
+ * @param userConfig - User-provided configuration
4195
+ * @returns Merged configuration with all required fields
4196
+ */
4197
+ declare function mergeWithDefaults(userConfig?: Partial<AXConversationConfig>): Required<AXConversationConfig>;
4198
+
4199
+ /**
4200
+ * Dependency Injection Tokens
4201
+ * InjectionTokens for configuration and dependencies
4202
+ */
4203
+
4204
+ /**
4205
+ * Configuration token for conversation component
4206
+ * Uses centralized defaults from AX_DEFAULT_CONVERSATION_CONFIG
4207
+ */
4208
+ declare const CONVERSATION_CONFIG: InjectionToken<Required<AXConversationConfig>>;
4209
+ /**
4210
+ * Token for configuring AXErrorHandlerService
4211
+ */
4212
+ declare const ERROR_HANDLER_CONFIG: InjectionToken<Partial<AXErrorHandlerConfig>>;
4213
+
4214
+ /**
4215
+ * Registry Configuration Tokens
4216
+ * Injection tokens for configuring default registry values
4217
+ */
4218
+
4219
+ /**
4220
+ * Additional message renderers configuration
4221
+ * Provide this token to add custom message renderers in addition to built-in ones
4222
+ * Note: Built-in renderers (text, system, fallback) are registered by default; other types are provided via plugins/constants.
4223
+ */
4224
+ declare const DEFAULT_MESSAGE_RENDERERS: InjectionToken<AXMessageRenderer[]>;
4225
+ /**
4226
+ * Default message actions configuration
4227
+ * Provide this token to override default message actions
4228
+ */
4229
+ declare const DEFAULT_MESSAGE_ACTIONS: InjectionToken<AXMessageAction[]>;
4230
+ /**
4231
+ * Default composer tabs configuration
4232
+ * Provide this token to override default composer tabs (emoji, stickers, etc.)
4233
+ */
4234
+ declare const DEFAULT_COMPOSER_TABS: InjectionToken<AXComposerTab[]>;
4235
+ /**
4236
+ * Default composer actions configuration
4237
+ * Provide this token to override default composer actions (attach, voice, etc.)
4238
+ */
4239
+ declare const DEFAULT_COMPOSER_ACTIONS: InjectionToken<AXComposerAction[]>;
4240
+ /**
4241
+ * Default conversation tabs configuration
4242
+ * Provide this token to override default conversation tabs (all, private, groups, etc.)
4243
+ */
4244
+ declare const DEFAULT_CONVERSATION_TABS: InjectionToken<AXConversationTab[]>;
4245
+ /**
4246
+ * Default info bar actions configuration
4247
+ * Provide this token to override default info bar actions (mute, archive, block, etc.)
4248
+ */
4249
+ declare const DEFAULT_INFO_BAR_ACTIONS: InjectionToken<AXInfoBarAction[]>;
4250
+ /**
4251
+ * Default conversation item actions configuration
4252
+ * Provide this token to override default conversation item actions (mute, delete, archive, etc.)
4253
+ */
4254
+ declare const DEFAULT_CONVERSATION_ITEM_ACTIONS: InjectionToken<AXConversationItemAction[]>;
4255
+ /**
4256
+ * Registry configuration interface
4257
+ */
4258
+ interface AXRegistryConfiguration {
4259
+ /**
4260
+ * Additional message renderers to register (built-in renderers are automatic).
4261
+ * Each {@link AXMessageRenderer} may include optional `composerActions` for co-located send UX.
4262
+ */
4263
+ messageRenderers?: AXMessageRenderer[];
4264
+ /** Message actions to register by default */
4265
+ messageActions?: AXMessageAction[];
4266
+ /** Composer tabs to register by default */
4267
+ composerTabs?: AXComposerTab[];
4268
+ /** Composer actions to register by default */
4269
+ composerActions?: AXComposerAction[];
4270
+ /** Conversation tabs to register by default */
4271
+ conversationTabs?: AXConversationTab[];
4272
+ /** Info bar actions to register by default */
4273
+ infoBarActions?: AXInfoBarAction[];
4274
+ /** Conversation item actions to register by default */
4275
+ conversationItemActions?: AXConversationItemAction[];
4276
+ }
4277
+ /**
4278
+ * Complete registry configuration token
4279
+ * Provide this for comprehensive registry configuration
4280
+ */
4281
+ declare const REGISTRY_CONFIG: InjectionToken<AXRegistryConfiguration>;
4282
+
4283
4283
  /**
4284
4284
  * IndexedDB Storage Wrapper
4285
4285
  * Provides persistent storage for conversation data
@@ -5010,7 +5010,7 @@ declare class AXConversationInfoPanelComponent extends AXClosableComponent imple
5010
5010
  value: string;
5011
5011
  }>;
5012
5012
  /** Get filtered members based on search */
5013
- get filteredMembers(): AXParticipant[];
5013
+ get filteredMembers(): _acorex_components_conversation2.AXParticipant[];
5014
5014
  /** Handle tab change */
5015
5015
  onTabChange(event: any): void;
5016
5016
  ngOnInit(): void;
@@ -5066,7 +5066,7 @@ declare class AXInfoBarSearchComponent {
5066
5066
  /** Current index from service */
5067
5067
  readonly currentIndex: _angular_core.Signal<number>;
5068
5068
  /** Messages from conversation */
5069
- readonly messages: _angular_core.Signal<AXMessage[]>;
5069
+ readonly messages: _angular_core.Signal<_acorex_components_conversation2.AXMessage[]>;
5070
5070
  private scrollTimer?;
5071
5071
  constructor();
5072
5072
  /** Handle search input change */
@@ -5166,7 +5166,7 @@ declare class AXAudioRendererComponent implements AXMessageRendererComponent {
5166
5166
  private readonly _contentState;
5167
5167
  readonly message: _angular_core.InputSignal<AXMessage>;
5168
5168
  readonly rendererState: _angular_core.Signal<{
5169
- deliveryStatus: AXMessageStatus;
5169
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5170
5170
  contentState: AXMessageRendererContentState;
5171
5171
  }>;
5172
5172
  readonly isPlaying: _angular_core.WritableSignal<boolean>;
@@ -5209,7 +5209,7 @@ declare class AXFallbackRendererComponent implements AXMessageRendererComponent
5209
5209
  private readonly _contentState;
5210
5210
  readonly message: _angular_core.InputSignal<AXMessage>;
5211
5211
  readonly rendererState: _angular_core.Signal<{
5212
- deliveryStatus: AXMessageStatus;
5212
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5213
5213
  contentState: AXMessageRendererContentState;
5214
5214
  }>;
5215
5215
  readonly messageTypeLabel: _angular_core.Signal<string>;
@@ -5223,7 +5223,7 @@ declare class AXFileRendererComponent implements AXMessageRendererComponent {
5223
5223
  private readonly _contentState;
5224
5224
  readonly message: _angular_core.InputSignal<AXMessage>;
5225
5225
  readonly rendererState: _angular_core.Signal<{
5226
- deliveryStatus: AXMessageStatus;
5226
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5227
5227
  contentState: AXMessageRendererContentState;
5228
5228
  }>;
5229
5229
  readonly payload: _angular_core.Signal<AXFilePayload>;
@@ -5243,7 +5243,7 @@ declare class AXImageRendererComponent implements AXMessageRendererComponent {
5243
5243
  private readonly _contentState;
5244
5244
  readonly message: _angular_core.InputSignal<AXMessage>;
5245
5245
  readonly rendererState: _angular_core.Signal<{
5246
- deliveryStatus: AXMessageStatus;
5246
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5247
5247
  contentState: AXMessageRendererContentState;
5248
5248
  }>;
5249
5249
  readonly imageClick: _angular_core.OutputEmitterRef<string>;
@@ -5263,7 +5263,7 @@ declare class AXLocationRendererComponent implements AXMessageRendererComponent
5263
5263
  private readonly _contentState;
5264
5264
  readonly message: _angular_core.InputSignal<AXMessage>;
5265
5265
  readonly rendererState: _angular_core.Signal<{
5266
- deliveryStatus: AXMessageStatus;
5266
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5267
5267
  contentState: AXMessageRendererContentState;
5268
5268
  }>;
5269
5269
  readonly payload: _angular_core.Signal<AXLocationPayload>;
@@ -5288,7 +5288,7 @@ declare class AXStickerRendererComponent implements AXMessageRendererComponent {
5288
5288
  private readonly _contentState;
5289
5289
  readonly message: _angular_core.InputSignal<AXMessage>;
5290
5290
  readonly rendererState: _angular_core.Signal<{
5291
- deliveryStatus: AXMessageStatus;
5291
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5292
5292
  contentState: AXMessageRendererContentState;
5293
5293
  }>;
5294
5294
  readonly payload: _angular_core.Signal<AXStickerPayload>;
@@ -5305,7 +5305,7 @@ declare class AXSystemRendererComponent implements AXMessageRendererComponent {
5305
5305
  private readonly _contentState;
5306
5306
  readonly message: _angular_core.InputSignal<AXMessage>;
5307
5307
  readonly rendererState: _angular_core.Signal<{
5308
- deliveryStatus: AXMessageStatus;
5308
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5309
5309
  contentState: AXMessageRendererContentState;
5310
5310
  }>;
5311
5311
  readonly payload: _angular_core.Signal<AXSystemPayload>;
@@ -5320,7 +5320,7 @@ declare class AXTextRendererComponent implements AXMessageRendererComponent {
5320
5320
  private readonly _contentState;
5321
5321
  readonly message: _angular_core.InputSignal<AXMessage>;
5322
5322
  readonly rendererState: _angular_core.Signal<{
5323
- deliveryStatus: AXMessageStatus;
5323
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5324
5324
  contentState: AXMessageRendererContentState;
5325
5325
  }>;
5326
5326
  readonly searchQuery: _angular_core.Signal<string>;
@@ -5342,7 +5342,7 @@ declare class AXVideoRendererComponent implements AXMessageRendererComponent {
5342
5342
  private readonly _contentState;
5343
5343
  readonly message: _angular_core.InputSignal<AXMessage>;
5344
5344
  readonly rendererState: _angular_core.Signal<{
5345
- deliveryStatus: AXMessageStatus;
5345
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5346
5346
  contentState: AXMessageRendererContentState;
5347
5347
  }>;
5348
5348
  readonly showPlayer: _angular_core.WritableSignal<boolean>;
@@ -5394,7 +5394,7 @@ declare class AXVoiceRendererComponent implements AXMessageRendererComponent {
5394
5394
  private readonly _contentState;
5395
5395
  readonly message: _angular_core.InputSignal<AXMessage>;
5396
5396
  readonly rendererState: _angular_core.Signal<{
5397
- deliveryStatus: AXMessageStatus;
5397
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5398
5398
  contentState: AXMessageRendererContentState;
5399
5399
  }>;
5400
5400
  readonly isPlaying: _angular_core.WritableSignal<boolean>;