@acorex/components 21.0.1-next.57 → 21.0.1-next.59

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 (333) hide show
  1. package/fesm2022/acorex-components-accordion.mjs +19 -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 +20 -20
  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-collapse.mjs +22 -19
  36. package/fesm2022/acorex-components-collapse.mjs.map +1 -1
  37. package/fesm2022/acorex-components-color-box.mjs +11 -11
  38. package/fesm2022/acorex-components-color-box.mjs.map +1 -1
  39. package/fesm2022/acorex-components-color-palette.mjs +31 -31
  40. package/fesm2022/acorex-components-color-palette.mjs.map +1 -1
  41. package/fesm2022/acorex-components-command.mjs +11 -11
  42. package/fesm2022/acorex-components-command.mjs.map +1 -1
  43. package/fesm2022/acorex-components-comment.mjs +33 -33
  44. package/fesm2022/acorex-components-comment.mjs.map +1 -1
  45. package/fesm2022/acorex-components-conversation.mjs +56 -56
  46. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  47. package/fesm2022/acorex-components-conversation2.mjs +249 -249
  48. package/fesm2022/acorex-components-conversation2.mjs.map +1 -1
  49. package/fesm2022/acorex-components-cron-job.mjs +53 -53
  50. package/fesm2022/acorex-components-cron-job.mjs.map +1 -1
  51. package/fesm2022/acorex-components-data-list.mjs +6 -6
  52. package/fesm2022/acorex-components-data-list.mjs.map +1 -1
  53. package/fesm2022/acorex-components-data-pager.mjs +33 -33
  54. package/fesm2022/acorex-components-data-pager.mjs.map +1 -1
  55. package/fesm2022/acorex-components-data-table.mjs +50 -486
  56. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  57. package/fesm2022/acorex-components-datetime-box.mjs +10 -10
  58. package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
  59. package/fesm2022/acorex-components-datetime-input.mjs +10 -10
  60. package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
  61. package/fesm2022/acorex-components-datetime-picker.mjs +11 -11
  62. package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
  63. package/fesm2022/acorex-components-decorators.mjs +48 -41
  64. package/fesm2022/acorex-components-decorators.mjs.map +1 -1
  65. package/fesm2022/acorex-components-dialog.mjs +13 -13
  66. package/fesm2022/acorex-components-dialog.mjs.map +1 -1
  67. package/fesm2022/acorex-components-drawer-legacy.mjs +14 -14
  68. package/fesm2022/acorex-components-drawer-legacy.mjs.map +1 -1
  69. package/fesm2022/acorex-components-drawer.mjs +16 -17
  70. package/fesm2022/acorex-components-drawer.mjs.map +1 -1
  71. package/fesm2022/acorex-components-dropdown-button.mjs +19 -11
  72. package/fesm2022/acorex-components-dropdown-button.mjs.map +1 -1
  73. package/fesm2022/acorex-components-dropdown.mjs +18 -18
  74. package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
  75. package/fesm2022/acorex-components-editor.mjs +12 -12
  76. package/fesm2022/acorex-components-editor.mjs.map +1 -1
  77. package/fesm2022/acorex-components-fab.mjs +9 -9
  78. package/fesm2022/acorex-components-fab.mjs.map +1 -1
  79. package/fesm2022/acorex-components-file-explorer.mjs +28 -28
  80. package/fesm2022/acorex-components-file-explorer.mjs.map +1 -1
  81. package/fesm2022/acorex-components-flow-chart.mjs +18 -18
  82. package/fesm2022/acorex-components-flow-chart.mjs.map +1 -1
  83. package/fesm2022/acorex-components-form.mjs +35 -27
  84. package/fesm2022/acorex-components-form.mjs.map +1 -1
  85. package/fesm2022/acorex-components-grid-layout-builder.mjs +12 -13
  86. package/fesm2022/acorex-components-grid-layout-builder.mjs.map +1 -1
  87. package/fesm2022/acorex-components-image-editor.mjs +48 -48
  88. package/fesm2022/acorex-components-image-editor.mjs.map +1 -1
  89. package/fesm2022/acorex-components-image.mjs +10 -10
  90. package/fesm2022/acorex-components-image.mjs.map +1 -1
  91. package/fesm2022/acorex-components-json-viewer.mjs +9 -9
  92. package/fesm2022/acorex-components-json-viewer.mjs.map +1 -1
  93. package/fesm2022/acorex-components-kanban.mjs +9 -7
  94. package/fesm2022/acorex-components-kanban.mjs.map +1 -1
  95. package/fesm2022/acorex-components-kbd.mjs +10 -10
  96. package/fesm2022/acorex-components-kbd.mjs.map +1 -1
  97. package/fesm2022/acorex-components-label.mjs +9 -9
  98. package/fesm2022/acorex-components-label.mjs.map +1 -1
  99. package/fesm2022/acorex-components-list.mjs +10 -10
  100. package/fesm2022/acorex-components-list.mjs.map +1 -1
  101. package/fesm2022/acorex-components-loading-dialog.mjs +12 -12
  102. package/fesm2022/acorex-components-loading-dialog.mjs.map +1 -1
  103. package/fesm2022/acorex-components-loading.mjs +21 -21
  104. package/fesm2022/acorex-components-loading.mjs.map +1 -1
  105. package/fesm2022/acorex-components-map.mjs +15 -15
  106. package/fesm2022/acorex-components-map.mjs.map +1 -1
  107. package/fesm2022/acorex-components-media-viewer.mjs +45 -45
  108. package/fesm2022/acorex-components-media-viewer.mjs.map +1 -1
  109. package/fesm2022/acorex-components-menu.mjs +29 -29
  110. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  111. package/fesm2022/{acorex-components-modal-acorex-components-modal-DwBY73dZ.mjs → acorex-components-modal-acorex-components-modal-CmWFb_lo.mjs} +24 -24
  112. package/fesm2022/acorex-components-modal-acorex-components-modal-CmWFb_lo.mjs.map +1 -0
  113. package/fesm2022/acorex-components-modal-modal-content.component-kJ6xzt_k.mjs +214 -0
  114. package/fesm2022/acorex-components-modal-modal-content.component-kJ6xzt_k.mjs.map +1 -0
  115. package/fesm2022/acorex-components-modal.mjs +1 -1
  116. package/fesm2022/acorex-components-navbar.mjs +9 -9
  117. package/fesm2022/acorex-components-navbar.mjs.map +1 -1
  118. package/fesm2022/acorex-components-notification.mjs +13 -13
  119. package/fesm2022/acorex-components-notification.mjs.map +1 -1
  120. package/fesm2022/acorex-components-number-box-legacy.mjs +14 -32
  121. package/fesm2022/acorex-components-number-box-legacy.mjs.map +1 -1
  122. package/fesm2022/acorex-components-number-box.mjs +46 -27
  123. package/fesm2022/acorex-components-number-box.mjs.map +1 -1
  124. package/fesm2022/acorex-components-otp.mjs +10 -10
  125. package/fesm2022/acorex-components-otp.mjs.map +1 -1
  126. package/fesm2022/acorex-components-page.mjs +10 -10
  127. package/fesm2022/acorex-components-page.mjs.map +1 -1
  128. package/fesm2022/acorex-components-paint.mjs +35 -40
  129. package/fesm2022/acorex-components-paint.mjs.map +1 -1
  130. package/fesm2022/acorex-components-password-box.mjs +14 -14
  131. package/fesm2022/acorex-components-password-box.mjs.map +1 -1
  132. package/fesm2022/acorex-components-pdf-reader.mjs +9 -9
  133. package/fesm2022/acorex-components-pdf-reader.mjs.map +1 -1
  134. package/fesm2022/acorex-components-phone-box.mjs +10 -10
  135. package/fesm2022/acorex-components-phone-box.mjs.map +1 -1
  136. package/fesm2022/acorex-components-picker.mjs +20 -20
  137. package/fesm2022/acorex-components-picker.mjs.map +1 -1
  138. package/fesm2022/acorex-components-popover.mjs +8 -8
  139. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  140. package/fesm2022/acorex-components-popup.mjs +17 -17
  141. package/fesm2022/acorex-components-popup.mjs.map +1 -1
  142. package/fesm2022/acorex-components-progress-bar.mjs +11 -9
  143. package/fesm2022/acorex-components-progress-bar.mjs.map +1 -1
  144. package/fesm2022/acorex-components-qrcode.mjs +10 -10
  145. package/fesm2022/acorex-components-qrcode.mjs.map +1 -1
  146. package/fesm2022/acorex-components-query-builder.mjs +9 -9
  147. package/fesm2022/acorex-components-query-builder.mjs.map +1 -1
  148. package/fesm2022/acorex-components-radio.mjs +10 -9
  149. package/fesm2022/acorex-components-radio.mjs.map +1 -1
  150. package/fesm2022/acorex-components-rail-navigation.mjs +40 -38
  151. package/fesm2022/acorex-components-rail-navigation.mjs.map +1 -1
  152. package/fesm2022/acorex-components-range-slider.mjs +11 -11
  153. package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
  154. package/fesm2022/acorex-components-rate-picker.mjs +20 -35
  155. package/fesm2022/acorex-components-rate-picker.mjs.map +1 -1
  156. package/fesm2022/acorex-components-rest-api-generator.mjs +25 -25
  157. package/fesm2022/acorex-components-rest-api-generator.mjs.map +1 -1
  158. package/fesm2022/acorex-components-result.mjs +8 -8
  159. package/fesm2022/acorex-components-result.mjs.map +1 -1
  160. package/fesm2022/acorex-components-routing-progress.mjs +8 -8
  161. package/fesm2022/acorex-components-routing-progress.mjs.map +1 -1
  162. package/fesm2022/acorex-components-rrule.mjs +13 -13
  163. package/fesm2022/acorex-components-rrule.mjs.map +1 -1
  164. package/fesm2022/acorex-components-scheduler-picker.mjs +73 -73
  165. package/fesm2022/acorex-components-scheduler-picker.mjs.map +1 -1
  166. package/fesm2022/acorex-components-scheduler.mjs +52 -52
  167. package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
  168. package/fesm2022/acorex-components-scss.mjs +4 -4
  169. package/fesm2022/acorex-components-scss.mjs.map +1 -1
  170. package/fesm2022/acorex-components-search-box.mjs +17 -11
  171. package/fesm2022/acorex-components-search-box.mjs.map +1 -1
  172. package/fesm2022/acorex-components-select-box.mjs +14 -12
  173. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  174. package/fesm2022/acorex-components-selection-list-2.mjs +12 -12
  175. package/fesm2022/acorex-components-selection-list-2.mjs.map +1 -1
  176. package/fesm2022/acorex-components-selection-list.mjs +10 -10
  177. package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
  178. package/fesm2022/acorex-components-side-menu.mjs +81 -24
  179. package/fesm2022/acorex-components-side-menu.mjs.map +1 -1
  180. package/fesm2022/acorex-components-skeleton.mjs +8 -8
  181. package/fesm2022/acorex-components-skeleton.mjs.map +1 -1
  182. package/fesm2022/acorex-components-slider.mjs +13 -13
  183. package/fesm2022/acorex-components-slider.mjs.map +1 -1
  184. package/fesm2022/acorex-components-sliding-item.mjs +19 -19
  185. package/fesm2022/acorex-components-sliding-item.mjs.map +1 -1
  186. package/fesm2022/acorex-components-step-wizard.mjs +16 -16
  187. package/fesm2022/acorex-components-step-wizard.mjs.map +1 -1
  188. package/fesm2022/acorex-components-switch.mjs +14 -14
  189. package/fesm2022/acorex-components-switch.mjs.map +1 -1
  190. package/fesm2022/acorex-components-tabs.mjs +17 -17
  191. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  192. package/fesm2022/acorex-components-tag-box.mjs +10 -10
  193. package/fesm2022/acorex-components-tag-box.mjs.map +1 -1
  194. package/fesm2022/acorex-components-tag.mjs +10 -10
  195. package/fesm2022/acorex-components-tag.mjs.map +1 -1
  196. package/fesm2022/acorex-components-text-area.mjs +9 -9
  197. package/fesm2022/acorex-components-text-area.mjs.map +1 -1
  198. package/fesm2022/acorex-components-text-box.mjs +12 -12
  199. package/fesm2022/acorex-components-text-box.mjs.map +1 -1
  200. package/fesm2022/acorex-components-time-duration.mjs +8 -8
  201. package/fesm2022/acorex-components-time-duration.mjs.map +1 -1
  202. package/fesm2022/acorex-components-time-line.mjs +14 -14
  203. package/fesm2022/acorex-components-time-line.mjs.map +1 -1
  204. package/fesm2022/acorex-components-toast.mjs +13 -13
  205. package/fesm2022/acorex-components-toast.mjs.map +1 -1
  206. package/fesm2022/acorex-components-toolbar.mjs +10 -10
  207. package/fesm2022/acorex-components-toolbar.mjs.map +1 -1
  208. package/fesm2022/acorex-components-tooltip.mjs +14 -14
  209. package/fesm2022/acorex-components-tooltip.mjs.map +1 -1
  210. package/fesm2022/acorex-components-tree-view-legacy.mjs +15 -15
  211. package/fesm2022/acorex-components-tree-view-legacy.mjs.map +1 -1
  212. package/fesm2022/acorex-components-tree-view.mjs +12 -12
  213. package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
  214. package/fesm2022/acorex-components-uploader.mjs +17 -17
  215. package/fesm2022/acorex-components-uploader.mjs.map +1 -1
  216. package/fesm2022/acorex-components-video-player.mjs +9 -9
  217. package/fesm2022/acorex-components-video-player.mjs.map +1 -1
  218. package/fesm2022/acorex-components-wysiwyg.mjs +45 -45
  219. package/fesm2022/acorex-components-wysiwyg.mjs.map +1 -1
  220. package/fesm2022/acorex-components.mjs.map +1 -1
  221. package/package.json +121 -121
  222. package/{accordion/index.d.ts → types/acorex-components-accordion.d.ts} +2 -2
  223. package/{button-group/index.d.ts → types/acorex-components-button-group.d.ts} +14 -12
  224. package/{button/index.d.ts → types/acorex-components-button.d.ts} +3 -3
  225. package/{check-box/index.d.ts → types/acorex-components-check-box.d.ts} +1 -1
  226. package/{chips/index.d.ts → types/acorex-components-chips.d.ts} +3 -8
  227. package/{collapse/index.d.ts → types/acorex-components-collapse.d.ts} +4 -6
  228. package/{conversation2/index.d.ts → types/acorex-components-conversation2.d.ts} +1542 -1542
  229. package/{data-table/index.d.ts → types/acorex-components-data-table.d.ts} +4 -253
  230. package/{dropdown-button/index.d.ts → types/acorex-components-dropdown-button.d.ts} +4 -2
  231. package/{grid-layout-builder/index.d.ts → types/acorex-components-grid-layout-builder.d.ts} +0 -1
  232. package/{loading/index.d.ts → types/acorex-components-loading.d.ts} +1 -1
  233. package/{menu/index.d.ts → types/acorex-components-menu.d.ts} +6 -6
  234. package/{number-box/index.d.ts → types/acorex-components-number-box.d.ts} +3 -0
  235. package/{paint/index.d.ts → types/acorex-components-paint.d.ts} +1 -6
  236. package/{radio/index.d.ts → types/acorex-components-radio.d.ts} +1 -1
  237. package/{rate-picker/index.d.ts → types/acorex-components-rate-picker.d.ts} +5 -15
  238. package/{scheduler-picker/index.d.ts → types/acorex-components-scheduler-picker.d.ts} +82 -81
  239. package/{select-box/index.d.ts → types/acorex-components-select-box.d.ts} +1 -1
  240. package/{side-menu/index.d.ts → types/acorex-components-side-menu.d.ts} +9 -2
  241. package/{slider/index.d.ts → types/acorex-components-slider.d.ts} +2 -2
  242. package/{tabs/index.d.ts → types/acorex-components-tabs.d.ts} +1 -1
  243. package/{tag/index.d.ts → types/acorex-components-tag.d.ts} +3 -3
  244. package/fesm2022/acorex-components-modal-acorex-components-modal-DwBY73dZ.mjs.map +0 -1
  245. package/fesm2022/acorex-components-modal-modal-content.component-DPMt_zaI.mjs +0 -212
  246. package/fesm2022/acorex-components-modal-modal-content.component-DPMt_zaI.mjs.map +0 -1
  247. /package/{action-sheet/index.d.ts → types/acorex-components-action-sheet.d.ts} +0 -0
  248. /package/{alert/index.d.ts → types/acorex-components-alert.d.ts} +0 -0
  249. /package/{aspect-ratio/index.d.ts → types/acorex-components-aspect-ratio.d.ts} +0 -0
  250. /package/{audio-wave/index.d.ts → types/acorex-components-audio-wave.d.ts} +0 -0
  251. /package/{autocomplete/index.d.ts → types/acorex-components-autocomplete.d.ts} +0 -0
  252. /package/{avatar/index.d.ts → types/acorex-components-avatar.d.ts} +0 -0
  253. /package/{badge/index.d.ts → types/acorex-components-badge.d.ts} +0 -0
  254. /package/{bottom-navigation/index.d.ts → types/acorex-components-bottom-navigation.d.ts} +0 -0
  255. /package/{breadcrumbs/index.d.ts → types/acorex-components-breadcrumbs.d.ts} +0 -0
  256. /package/{calendar/index.d.ts → types/acorex-components-calendar.d.ts} +0 -0
  257. /package/{circular-progress/index.d.ts → types/acorex-components-circular-progress.d.ts} +0 -0
  258. /package/{code-editor/index.d.ts → types/acorex-components-code-editor.d.ts} +0 -0
  259. /package/{color-box/index.d.ts → types/acorex-components-color-box.d.ts} +0 -0
  260. /package/{color-palette/index.d.ts → types/acorex-components-color-palette.d.ts} +0 -0
  261. /package/{command/index.d.ts → types/acorex-components-command.d.ts} +0 -0
  262. /package/{comment/index.d.ts → types/acorex-components-comment.d.ts} +0 -0
  263. /package/{conversation/index.d.ts → types/acorex-components-conversation.d.ts} +0 -0
  264. /package/{cron-job/index.d.ts → types/acorex-components-cron-job.d.ts} +0 -0
  265. /package/{data-list/index.d.ts → types/acorex-components-data-list.d.ts} +0 -0
  266. /package/{data-pager/index.d.ts → types/acorex-components-data-pager.d.ts} +0 -0
  267. /package/{datetime-box/index.d.ts → types/acorex-components-datetime-box.d.ts} +0 -0
  268. /package/{datetime-input/index.d.ts → types/acorex-components-datetime-input.d.ts} +0 -0
  269. /package/{datetime-picker/index.d.ts → types/acorex-components-datetime-picker.d.ts} +0 -0
  270. /package/{decorators/index.d.ts → types/acorex-components-decorators.d.ts} +0 -0
  271. /package/{dialog/index.d.ts → types/acorex-components-dialog.d.ts} +0 -0
  272. /package/{drawer-legacy/index.d.ts → types/acorex-components-drawer-legacy.d.ts} +0 -0
  273. /package/{drawer/index.d.ts → types/acorex-components-drawer.d.ts} +0 -0
  274. /package/{dropdown/index.d.ts → types/acorex-components-dropdown.d.ts} +0 -0
  275. /package/{editor/index.d.ts → types/acorex-components-editor.d.ts} +0 -0
  276. /package/{fab/index.d.ts → types/acorex-components-fab.d.ts} +0 -0
  277. /package/{file-explorer/index.d.ts → types/acorex-components-file-explorer.d.ts} +0 -0
  278. /package/{flow-chart/index.d.ts → types/acorex-components-flow-chart.d.ts} +0 -0
  279. /package/{form/index.d.ts → types/acorex-components-form.d.ts} +0 -0
  280. /package/{image-editor/index.d.ts → types/acorex-components-image-editor.d.ts} +0 -0
  281. /package/{image/index.d.ts → types/acorex-components-image.d.ts} +0 -0
  282. /package/{json-viewer/index.d.ts → types/acorex-components-json-viewer.d.ts} +0 -0
  283. /package/{kanban/index.d.ts → types/acorex-components-kanban.d.ts} +0 -0
  284. /package/{kbd/index.d.ts → types/acorex-components-kbd.d.ts} +0 -0
  285. /package/{label/index.d.ts → types/acorex-components-label.d.ts} +0 -0
  286. /package/{list/index.d.ts → types/acorex-components-list.d.ts} +0 -0
  287. /package/{loading-dialog/index.d.ts → types/acorex-components-loading-dialog.d.ts} +0 -0
  288. /package/{map/index.d.ts → types/acorex-components-map.d.ts} +0 -0
  289. /package/{media-viewer/index.d.ts → types/acorex-components-media-viewer.d.ts} +0 -0
  290. /package/{modal/index.d.ts → types/acorex-components-modal.d.ts} +0 -0
  291. /package/{navbar/index.d.ts → types/acorex-components-navbar.d.ts} +0 -0
  292. /package/{notification/index.d.ts → types/acorex-components-notification.d.ts} +0 -0
  293. /package/{number-box-legacy/index.d.ts → types/acorex-components-number-box-legacy.d.ts} +0 -0
  294. /package/{otp/index.d.ts → types/acorex-components-otp.d.ts} +0 -0
  295. /package/{page/index.d.ts → types/acorex-components-page.d.ts} +0 -0
  296. /package/{password-box/index.d.ts → types/acorex-components-password-box.d.ts} +0 -0
  297. /package/{pdf-reader/index.d.ts → types/acorex-components-pdf-reader.d.ts} +0 -0
  298. /package/{phone-box/index.d.ts → types/acorex-components-phone-box.d.ts} +0 -0
  299. /package/{picker/index.d.ts → types/acorex-components-picker.d.ts} +0 -0
  300. /package/{popover/index.d.ts → types/acorex-components-popover.d.ts} +0 -0
  301. /package/{popup/index.d.ts → types/acorex-components-popup.d.ts} +0 -0
  302. /package/{progress-bar/index.d.ts → types/acorex-components-progress-bar.d.ts} +0 -0
  303. /package/{qrcode/index.d.ts → types/acorex-components-qrcode.d.ts} +0 -0
  304. /package/{query-builder/index.d.ts → types/acorex-components-query-builder.d.ts} +0 -0
  305. /package/{rail-navigation/index.d.ts → types/acorex-components-rail-navigation.d.ts} +0 -0
  306. /package/{range-slider/index.d.ts → types/acorex-components-range-slider.d.ts} +0 -0
  307. /package/{rest-api-generator/index.d.ts → types/acorex-components-rest-api-generator.d.ts} +0 -0
  308. /package/{result/index.d.ts → types/acorex-components-result.d.ts} +0 -0
  309. /package/{routing-progress/index.d.ts → types/acorex-components-routing-progress.d.ts} +0 -0
  310. /package/{rrule/index.d.ts → types/acorex-components-rrule.d.ts} +0 -0
  311. /package/{scheduler/index.d.ts → types/acorex-components-scheduler.d.ts} +0 -0
  312. /package/{scss/index.d.ts → types/acorex-components-scss.d.ts} +0 -0
  313. /package/{search-box/index.d.ts → types/acorex-components-search-box.d.ts} +0 -0
  314. /package/{selection-list-2/index.d.ts → types/acorex-components-selection-list-2.d.ts} +0 -0
  315. /package/{selection-list/index.d.ts → types/acorex-components-selection-list.d.ts} +0 -0
  316. /package/{skeleton/index.d.ts → types/acorex-components-skeleton.d.ts} +0 -0
  317. /package/{sliding-item/index.d.ts → types/acorex-components-sliding-item.d.ts} +0 -0
  318. /package/{step-wizard/index.d.ts → types/acorex-components-step-wizard.d.ts} +0 -0
  319. /package/{switch/index.d.ts → types/acorex-components-switch.d.ts} +0 -0
  320. /package/{tag-box/index.d.ts → types/acorex-components-tag-box.d.ts} +0 -0
  321. /package/{text-area/index.d.ts → types/acorex-components-text-area.d.ts} +0 -0
  322. /package/{text-box/index.d.ts → types/acorex-components-text-box.d.ts} +0 -0
  323. /package/{time-duration/index.d.ts → types/acorex-components-time-duration.d.ts} +0 -0
  324. /package/{time-line/index.d.ts → types/acorex-components-time-line.d.ts} +0 -0
  325. /package/{toast/index.d.ts → types/acorex-components-toast.d.ts} +0 -0
  326. /package/{toolbar/index.d.ts → types/acorex-components-toolbar.d.ts} +0 -0
  327. /package/{tooltip/index.d.ts → types/acorex-components-tooltip.d.ts} +0 -0
  328. /package/{tree-view-legacy/index.d.ts → types/acorex-components-tree-view-legacy.d.ts} +0 -0
  329. /package/{tree-view/index.d.ts → types/acorex-components-tree-view.d.ts} +0 -0
  330. /package/{uploader/index.d.ts → types/acorex-components-uploader.d.ts} +0 -0
  331. /package/{video-player/index.d.ts → types/acorex-components-video-player.d.ts} +0 -0
  332. /package/{wysiwyg/index.d.ts → types/acorex-components-wysiwyg.d.ts} +0 -0
  333. /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
2309
2088
  */
2310
- abstract markAsRead(conversationId: string, messageIds: string[]): Promise<void>;
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
2097
+ */
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,852 +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
2272
+ * Message search filters
2493
2273
  */
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>;
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;
2509
2287
  }
2510
2288
  /**
2511
- * Connection event
2289
+ * Message forward data
2512
2290
  */
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;
2291
+ interface AXMessageForwardData {
2292
+ /** Message ID to forward */
2293
+ messageId: string;
2294
+ /** Target conversation IDs */
2295
+ conversationIds: string[];
2296
+ /** Optional caption */
2297
+ caption?: string;
2522
2298
  }
2523
2299
  /**
2524
- * Notification event
2525
- */
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>;
2300
+ * Read receipt information
2301
+ */
2302
+ interface AXReadReceipt {
2303
+ /** User ID */
2304
+ userId: string;
2305
+ /** User name */
2306
+ userName: string;
2307
+ /** Read timestamp */
2308
+ readAt: Date;
2545
2309
  }
2546
2310
  /**
2547
- * Call event
2311
+ * Pinned message information
2548
2312
  */
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;
2313
+ interface AXPinnedMessage {
2314
+ /** Message ID */
2315
+ messageId: string;
2316
+ /** Pinned by user ID */
2317
+ pinnedBy: string;
2318
+ /** Pinned timestamp */
2319
+ pinnedAt: Date;
2564
2320
  }
2565
2321
  /**
2566
- * Abstract Real-time Events API
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>;
2684
2451
  /**
2685
- * Subscribe to typing indicators
2452
+ * Get read receipts for a message
2686
2453
  *
2687
- * @param conversationId - Conversation ID (empty string for all conversations)
2688
- * @returns Observable stream of typing indicators
2454
+ * @param messageId - Message ID
2455
+ * @returns Array of read receipts
2456
+ * @throws {AXApiError} If request fails
2689
2457
  */
2690
- abstract subscribeToTypingIndicators(conversationId: string): Observable<AXTypingIndicator>;
2458
+ abstract getReadReceipts(messageId: string): Promise<AXReadReceipt[]>;
2691
2459
  /**
2692
- * Subscribe to presence updates (online/offline status)
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>;
2516
+ /**
2517
+ * Send typing indicator
2518
+ *
2519
+ * @param conversationId - Conversation ID
2520
+ * @throws {AXApiError} If sending fails
2521
+ */
2522
+ abstract sendTypingIndicator(conversationId: string): Promise<void>;
2523
+ /**
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
3052
- */
3053
- handleApiError(apiError: AXApiError, operation: string, context?: Record<string, unknown>): AXConversationError;
3054
- /**
3055
- * Normalize any error to conversation error format
3056
- */
3057
- private normalizeError;
3058
- /**
3059
- * Check if error is API error
3060
- */
3061
- private isApiError;
3062
- /**
3063
- * Determine severity based on status code
2835
+ * @param conversationId - Optional conversation ID to filter
2836
+ * @returns Observable stream of message IDs that were read
3064
2837
  */
3065
- private determineSeverity;
2838
+ abstract subscribeToReadReceipts(conversationId?: string): Observable<{
2839
+ messageId: string;
2840
+ userId: string;
2841
+ readAt: Date;
2842
+ }>;
3066
2843
  /**
3067
- * Get recovery suggestions based on error
2844
+ * Subscribe to push notifications
2845
+ * Fires for mentions, calls, and other important events
2846
+ *
2847
+ * @returns Observable stream of notification events
3068
2848
  */
3069
- private getRecoverySuggestions;
2849
+ abstract subscribeToNotifications(): Observable<AXNotificationEvent>;
3070
2850
  /**
3071
- * Get default recovery suggestions
2851
+ * Subscribe to call events
2852
+ * Fires for incoming/outgoing calls
2853
+ *
2854
+ * @returns Observable stream of call events
3072
2855
  */
3073
- private getDefaultRecoverySuggestions;
2856
+ abstract subscribeToCallEvents?(): Observable<AXCallEvent>;
3074
2857
  /**
3075
- * Log error to console
2858
+ * Subscribe to user blocked/unblocked events
2859
+ *
2860
+ * @returns Observable stream of user IDs and block status
3076
2861
  */
3077
- private logError;
2862
+ abstract subscribeToUserBlockEvents(): Observable<{
2863
+ userId: string;
2864
+ blocked: boolean;
2865
+ }>;
3078
2866
  /**
3079
- * Get user-friendly error message
2867
+ * Subscribe to participant added/removed events
2868
+ *
2869
+ * @param conversationId - Optional conversation ID to filter
2870
+ * @returns Observable stream of participant changes
3080
2871
  */
3081
- getUserFriendlyMessage(error: AXConversationError): string;
2872
+ abstract subscribeToParticipantEvents(conversationId?: string): Observable<{
2873
+ conversationId: string;
2874
+ userId: string;
2875
+ action: 'added' | 'removed';
2876
+ }>;
3082
2877
  /**
3083
- * Check if error is retryable
2878
+ * Subscribe to system events
2879
+ * Fires for maintenance, updates, or other system-wide events
2880
+ *
2881
+ * @returns Observable stream of system events
3084
2882
  */
3085
- isRetryable(error: AXConversationError): boolean;
2883
+ abstract subscribeToSystemEvents(): Observable<{
2884
+ type: string;
2885
+ message: string;
2886
+ data?: unknown;
2887
+ }>;
3086
2888
  /**
3087
- * Execute an operation with automatic retry logic
3088
- * @param operation - The async operation to execute
3089
- * @param operationName - Name of the operation for error tracking
3090
- * @param context - Additional context for error handling
3091
- * @returns Promise resolving to the operation result
3092
- * @throws {AXConversationError} If all retries fail
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
3093
2894
  */
3094
- executeWithRetry<T>(operation: () => Promise<T>, operationName: string, context?: Record<string, unknown>): Promise<T>;
2895
+ abstract subscribeToMessageStatusChanges(conversationId?: string): Observable<{
2896
+ messageId: string;
2897
+ status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed';
2898
+ timestamp: Date;
2899
+ }>;
3095
2900
  /**
3096
- * Delay helper for retry backoff
3097
- * @param ms - Milliseconds to delay
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
3098
2906
  */
3099
- private delay;
2907
+ abstract subscribeToConversationSettingsChanges(conversationId?: string): Observable<{
2908
+ conversationId: string;
2909
+ settings: Record<string, unknown>;
2910
+ }>;
3100
2911
  /**
3101
- * Clear error history
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
3102
2917
  */
3103
- clear(): void;
3104
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXErrorHandlerService, never>;
3105
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXErrorHandlerService>;
2918
+ abstract subscribeToDraftChanges(conversationId?: string): Observable<{
2919
+ conversationId: string;
2920
+ draft: string | null;
2921
+ }>;
3106
2922
  }
3107
2923
 
3108
2924
  /**
3109
- * Dependency Injection Tokens
3110
- * InjectionTokens for configuration and dependencies
3111
- */
3112
-
3113
- /**
3114
- * Configuration token for conversation component
3115
- * Uses centralized defaults from AX_DEFAULT_CONVERSATION_CONFIG
3116
- */
3117
- declare const CONVERSATION_CONFIG: InjectionToken<Required<AXConversationConfig>>;
3118
- /**
3119
- * Token for configuring AXErrorHandlerService
3120
- */
3121
- declare const ERROR_HANDLER_CONFIG: InjectionToken<Partial<AXErrorHandlerConfig>>;
3122
-
3123
- /**
3124
- * Registry Configuration Tokens
3125
- * Injection tokens for configuring default registry values
2925
+ * Abstract User Management API
2926
+ * Handle user profile management and user operations for conversations
3126
2927
  */
3127
2928
 
3128
2929
  /**
3129
- * Additional message renderers configuration
3130
- * Provide this token to add custom message renderers in addition to built-in ones
3131
- * Note: Built-in renderers (text, system, fallback) are registered by default; other types are provided via plugins/constants.
3132
- */
3133
- declare const DEFAULT_MESSAGE_RENDERERS: InjectionToken<AXMessageRenderer[]>;
3134
- /**
3135
- * Default message actions configuration
3136
- * Provide this token to override default message actions
3137
- */
3138
- declare const DEFAULT_MESSAGE_ACTIONS: InjectionToken<AXMessageAction[]>;
3139
- /**
3140
- * Default composer tabs configuration
3141
- * Provide this token to override default composer tabs (emoji, stickers, etc.)
3142
- */
3143
- declare const DEFAULT_COMPOSER_TABS: InjectionToken<AXComposerTab[]>;
3144
- /**
3145
- * Default composer actions configuration
3146
- * Provide this token to override default composer actions (attach, voice, etc.)
3147
- */
3148
- declare const DEFAULT_COMPOSER_ACTIONS: InjectionToken<AXComposerAction[]>;
3149
- /**
3150
- * Default conversation tabs configuration
3151
- * Provide this token to override default conversation tabs (all, private, groups, etc.)
3152
- */
3153
- declare const DEFAULT_CONVERSATION_TABS: InjectionToken<AXConversationTab[]>;
3154
- /**
3155
- * Default info bar actions configuration
3156
- * Provide this token to override default info bar actions (mute, archive, block, etc.)
3157
- */
3158
- declare const DEFAULT_INFO_BAR_ACTIONS: InjectionToken<AXInfoBarAction[]>;
3159
- /**
3160
- * Default conversation item actions configuration
3161
- * Provide this token to override default conversation item actions (mute, delete, archive, etc.)
3162
- */
3163
- declare const DEFAULT_CONVERSATION_ITEM_ACTIONS: InjectionToken<AXConversationItemAction[]>;
3164
- /**
3165
- * Registry configuration interface
2930
+ * User profile update data
3166
2931
  */
3167
- interface AXRegistryConfiguration {
3168
- /**
3169
- * Additional message renderers to register (built-in renderers are automatic).
3170
- * Each {@link AXMessageRenderer} may include optional `composerActions` for co-located send UX.
3171
- */
3172
- messageRenderers?: AXMessageRenderer[];
3173
- /** Message actions to register by default */
3174
- messageActions?: AXMessageAction[];
3175
- /** Composer tabs to register by default */
3176
- composerTabs?: AXComposerTab[];
3177
- /** Composer actions to register by default */
3178
- composerActions?: AXComposerAction[];
3179
- /** Conversation tabs to register by default */
3180
- conversationTabs?: AXConversationTab[];
3181
- /** Info bar actions to register by default */
3182
- infoBarActions?: AXInfoBarAction[];
3183
- /** Conversation item actions to register by default */
3184
- 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>;
3185
2947
  }
3186
2948
  /**
3187
- * Complete registry configuration token
3188
- * Provide this for comprehensive registry configuration
2949
+ * User search filters
3189
2950
  */
3190
- declare const REGISTRY_CONFIG: InjectionToken<AXRegistryConfiguration>;
3191
-
3192
- declare class AXConversationContainerComponent {
3193
- private readonly conversationService;
3194
- protected readonly config: Required<AXConversationConfig>;
3195
- /** Custom CSS class */
3196
- readonly customClass: _angular_core.InputSignal<string>;
3197
- /** Loading state */
3198
- readonly loading: _angular_core.Signal<boolean>;
3199
- /** Error state */
3200
- readonly error: _angular_core.Signal<Error>;
3201
- /** Active conversation */
3202
- readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
3203
- /** Container CSS classes */
3204
- readonly containerClasses: _angular_core.Signal<string>;
3205
- closeActiveConversation(): void;
3206
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationContainerComponent, never>;
3207
- 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>;
3208
- }
3209
-
3210
- declare class AXConversationContainerDirective {
3211
- private readonly conversationService;
3212
- /** Active conversation */
3213
- readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
3214
- /** Loading state */
3215
- readonly loading: _angular_core.Signal<boolean>;
3216
- /** Error state */
3217
- readonly error: _angular_core.Signal<Error>;
3218
- closeActiveConversation(): void;
3219
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationContainerDirective, never>;
3220
- 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;
3221
2960
  }
3222
-
3223
2961
  /**
3224
- * Active component state in info-bar
2962
+ * Block/Report reason
3225
2963
  */
3226
- interface AXInfoBarActiveComponent {
3227
- /** Action that triggered this component */
3228
- action: AXInfoBarAction;
3229
- /** Component to render */
3230
- component: Type<unknown>;
3231
- /** Component inputs */
3232
- inputs?: Record<string, unknown>;
3233
- }
3234
- interface AXInfoBarActiveBanner {
3235
- /** Message that owns this banner */
3236
- message: AXMessage;
3237
- /** Banner component */
3238
- component: Type<AXMessageInfoBarBannerComponent>;
3239
- /** Additional component inputs (only keys that match declared `input()` on the banner) */
3240
- inputs?: Record<string, unknown>;
3241
- /** Callback invoked when the banner is dismissed (e.g. pause playback) */
3242
- onClose?: () => void;
2964
+ interface AXBlockReportReason {
2965
+ /** Reason code */
2966
+ code: string;
2967
+ /** Description */
2968
+ description?: string;
3243
2969
  }
3244
2970
  /**
3245
- * Info Bar Service
3246
- * Manages info bar state and actions
3247
- */
3248
- declare class AXInfoBarService {
3249
- private readonly conversationService;
3250
- private readonly injector;
3251
- private get registry();
3252
- /** Active conversation */
3253
- readonly activeConversation: _angular_core.Signal<AXConversation>;
3254
- /** Active component being shown in info-bar */
3255
- private readonly _activeComponent;
3256
- readonly activeComponent: _angular_core.Signal<AXInfoBarActiveComponent>;
3257
- /** Active banner shown under info-bar */
3258
- private readonly _activeBanner;
3259
- readonly activeBanner: _angular_core.Signal<AXInfoBarActiveBanner>;
3260
- /** Search query signal */
3261
- private readonly _searchQuery;
3262
- readonly searchQuery: _angular_core.Signal<string>;
3263
- private readonly _searchResultsCount;
3264
- readonly searchResultsCount: _angular_core.Signal<number>;
3265
- /** Current search result index */
3266
- private readonly _currentSearchIndex;
3267
- readonly currentSearchIndex: _angular_core.Signal<number>;
3268
- 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 {
3269
2993
  /**
3270
- * 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
3271
2998
  */
3272
- getActionsForConversation(conversation: AXConversation): AXInfoBarAction[];
2999
+ abstract getCurrentUser(): Promise<AXParticipant>;
3273
3000
  /**
3274
- * 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
3275
3006
  */
3276
- executeAction(actionId: string, conversation: AXConversation, data?: Record<string, unknown>): Promise<void>;
3007
+ abstract updateProfile(updates: AXUserProfileUpdate): Promise<AXParticipant>;
3277
3008
  /**
3278
- * Get action label
3009
+ * Upload user avatar
3010
+ *
3011
+ * @param file - Avatar image file
3012
+ * @returns Avatar URL
3013
+ * @throws {AXApiError} If upload fails
3279
3014
  */
3280
- getActionLabel(action: AXInfoBarAction, conversation: AXConversation): string;
3015
+ abstract uploadAvatar(file: File): Promise<string>;
3281
3016
  /**
3282
- * 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
3283
3022
  */
3284
- getActionIcon(action: AXInfoBarAction, conversation: AXConversation): string | undefined;
3023
+ abstract getUsers(filters?: AXUserSearchFilters): Promise<AXParticipant[]>;
3285
3024
  /**
3286
- * 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
3287
3030
  */
3288
- showComponent(action: AXInfoBarAction, inputs?: Record<string, unknown>): void;
3031
+ abstract searchUsers(query: string): Promise<AXParticipant[]>;
3289
3032
  /**
3290
- * 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
3291
3038
  */
3292
- hideComponent(): void;
3039
+ abstract getUserById(userId: string): Promise<AXParticipant>;
3293
3040
  /**
3294
- * 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
3295
3046
  */
3296
- showMessageBanner(message: AXMessage, inputs?: Record<string, unknown>): void;
3047
+ abstract getUsersByIds(userIds: string[]): Promise<AXParticipant[]>;
3297
3048
  /**
3298
- * 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
3299
3054
  */
3300
- updateMessageBannerInputs(messageId: string, inputs: Record<string, unknown>): void;
3055
+ abstract getUserPresence(userId: string): Promise<AXPresenceUpdate>;
3301
3056
  /**
3302
- * 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
3303
3062
  */
3304
- hideMessageBanner(messageId?: string): void;
3305
- isMessageBannerActive(messageId: string): boolean;
3063
+ abstract updatePresence(status: AXPresenceStatus, statusText?: string): Promise<void>;
3306
3064
  /**
3307
- * 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
3308
3070
  */
3309
- toggleComponent(action: AXInfoBarAction, inputs?: Record<string, unknown>): void;
3071
+ abstract blockUser(userId: string, reason?: AXBlockReportReason): Promise<void>;
3310
3072
  /**
3311
- * Set search query
3073
+ * Unblock a user
3074
+ *
3075
+ * @param userId - User ID to unblock
3076
+ * @throws {AXApiError} If unblocking fails
3312
3077
  */
3313
- setSearchQuery(query: string): void;
3078
+ abstract unblockUser(userId: string): Promise<void>;
3314
3079
  /**
3315
- * Set search results
3080
+ * Get list of blocked users
3081
+ *
3082
+ * @returns Array of blocked user IDs
3083
+ * @throws {AXApiError} If request fails
3316
3084
  */
3317
- setSearchResults(count: number, currentIndex?: number): void;
3085
+ abstract getBlockedUsers(): Promise<string[]>;
3318
3086
  /**
3319
- * 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
3320
3092
  */
3321
- nextSearchResult(): void;
3093
+ abstract reportUser(userId: string, reason: AXBlockReportReason): Promise<void>;
3322
3094
  /**
3323
- * Navigate to previous search result
3095
+ * Get user settings
3096
+ *
3097
+ * @returns User settings
3098
+ * @throws {AXApiError} If request fails
3324
3099
  */
3325
- previousSearchResult(): void;
3100
+ abstract getUserSettings(): Promise<Record<string, unknown>>;
3326
3101
  /**
3327
- * Clear search
3102
+ * Update user settings
3103
+ *
3104
+ * @param settings - Settings to update
3105
+ * @throws {AXApiError} If update fails
3328
3106
  */
3329
- clearSearch(): void;
3330
- private _extractOnClose;
3331
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfoBarService, never>;
3332
- 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;
3333
3119
  }
3334
3120
 
3335
3121
  /**
@@ -3581,9 +3367,9 @@ declare class AXConversationService {
3581
3367
  /** Error state */
3582
3368
  readonly error: _angular_core.Signal<Error>;
3583
3369
  /** Connection status */
3584
- readonly connectionStatus$: rxjs.Observable<AXConnectionStatus>;
3370
+ readonly connectionStatus$: rxjs.Observable<_acorex_components_conversation2.AXConnectionStatus>;
3585
3371
  /** Error stream */
3586
- readonly errors$: rxjs.Observable<AXConversationError>;
3372
+ readonly errors$: rxjs.Observable<_acorex_components_conversation2.AXConversationError>;
3587
3373
  readonly onMessageReceived: rxjs.Observable<AXMessage>;
3588
3374
  readonly onMessageUpdated: rxjs.Observable<AXMessage>;
3589
3375
  readonly onMessageDeleted: rxjs.Observable<string>;
@@ -3595,7 +3381,7 @@ declare class AXConversationService {
3595
3381
  type: "reply" | "forward";
3596
3382
  }>;
3597
3383
  private _currentUser;
3598
- readonly currentUser: _angular_core.Signal<AXParticipant>;
3384
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation2.AXParticipant>;
3599
3385
  constructor();
3600
3386
  /**
3601
3387
  * Initialize the service
@@ -3908,25 +3694,145 @@ declare class AXConversationService {
3908
3694
  */
3909
3695
  unblockUser(userId: string): Promise<void>;
3910
3696
  /**
3911
- * Get blocked users
3912
- * @returns Array of blocked user IDs
3697
+ * Get blocked users
3698
+ * @returns Array of blocked user IDs
3699
+ */
3700
+ getBlockedUsers(): Promise<string[]>;
3701
+ /**
3702
+ * Update user presence
3703
+ * @param status - Presence status
3704
+ * @param statusText - Optional status text
3705
+ */
3706
+ updatePresence(status: 'online' | 'offline' | 'away' | 'busy' | 'invisible', statusText?: string): Promise<void>;
3707
+ /**
3708
+ * Validate message content before sending
3709
+ * Uses centralized validation utilities for consistency
3710
+ * @param command - Message command to validate
3711
+ * @throws {Error} If message content is invalid
3712
+ */
3713
+ private validateMessageContent;
3714
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationService, never>;
3715
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationService>;
3716
+ }
3717
+
3718
+ /**
3719
+ * Error severity levels
3720
+ */
3721
+ type AXErrorSeverity = 'info' | 'warning' | 'error' | 'critical';
3722
+ /**
3723
+ * Conversation error event
3724
+ */
3725
+ interface AXConversationError {
3726
+ /** Error code */
3727
+ code: string;
3728
+ /** Error message */
3729
+ message: string;
3730
+ /** Severity level */
3731
+ severity: AXErrorSeverity;
3732
+ /** Source operation */
3733
+ operation: string;
3734
+ /** Original error */
3735
+ originalError?: unknown;
3736
+ /** HTTP status code (if applicable) */
3737
+ statusCode?: number;
3738
+ /** Additional context */
3739
+ context?: Record<string, unknown>;
3740
+ /** Timestamp */
3741
+ timestamp: Date;
3742
+ /** Whether error was handled */
3743
+ handled: boolean;
3744
+ /** Recovery suggestions */
3745
+ recoverySuggestions?: string[];
3746
+ }
3747
+ /**
3748
+ * Error Handler Configuration
3749
+ */
3750
+ interface AXErrorHandlerConfig {
3751
+ /** Log errors to console */
3752
+ logToConsole?: boolean;
3753
+ /** Show user-friendly error messages */
3754
+ showUserMessages?: boolean;
3755
+ /** Retry failed operations automatically */
3756
+ autoRetry?: boolean;
3757
+ /** Number of retry attempts */
3758
+ maxRetries?: number;
3759
+ /** Custom error handler */
3760
+ customHandler?: (error: AXConversationError) => void;
3761
+ }
3762
+ /**
3763
+ * Error Handler Service
3764
+ */
3765
+ declare class AXErrorHandlerService {
3766
+ private readonly injectedConfig;
3767
+ private readonly _errors$;
3768
+ private readonly _config;
3769
+ /** Error stream */
3770
+ readonly errors$: rxjs.Observable<AXConversationError>;
3771
+ constructor();
3772
+ /**
3773
+ * Configure error handler
3774
+ */
3775
+ configure(config: Partial<AXErrorHandlerConfig>): void;
3776
+ /**
3777
+ * Handle an error
3778
+ */
3779
+ handle(error: unknown, operation: string, context?: Record<string, unknown>): AXConversationError;
3780
+ /**
3781
+ * Handle API error
3782
+ */
3783
+ handleApiError(apiError: AXApiError, operation: string, context?: Record<string, unknown>): AXConversationError;
3784
+ /**
3785
+ * Normalize any error to conversation error format
3786
+ */
3787
+ private normalizeError;
3788
+ /**
3789
+ * Check if error is API error
3790
+ */
3791
+ private isApiError;
3792
+ /**
3793
+ * Determine severity based on status code
3794
+ */
3795
+ private determineSeverity;
3796
+ /**
3797
+ * Get recovery suggestions based on error
3798
+ */
3799
+ private getRecoverySuggestions;
3800
+ /**
3801
+ * Get default recovery suggestions
3802
+ */
3803
+ private getDefaultRecoverySuggestions;
3804
+ /**
3805
+ * Log error to console
3806
+ */
3807
+ private logError;
3808
+ /**
3809
+ * Get user-friendly error message
3810
+ */
3811
+ getUserFriendlyMessage(error: AXConversationError): string;
3812
+ /**
3813
+ * Check if error is retryable
3814
+ */
3815
+ isRetryable(error: AXConversationError): boolean;
3816
+ /**
3817
+ * Execute an operation with automatic retry logic
3818
+ * @param operation - The async operation to execute
3819
+ * @param operationName - Name of the operation for error tracking
3820
+ * @param context - Additional context for error handling
3821
+ * @returns Promise resolving to the operation result
3822
+ * @throws {AXConversationError} If all retries fail
3913
3823
  */
3914
- getBlockedUsers(): Promise<string[]>;
3824
+ executeWithRetry<T>(operation: () => Promise<T>, operationName: string, context?: Record<string, unknown>): Promise<T>;
3915
3825
  /**
3916
- * Update user presence
3917
- * @param status - Presence status
3918
- * @param statusText - Optional status text
3826
+ * Delay helper for retry backoff
3827
+ * @param ms - Milliseconds to delay
3919
3828
  */
3920
- updatePresence(status: 'online' | 'offline' | 'away' | 'busy' | 'invisible', statusText?: string): Promise<void>;
3829
+ private delay;
3921
3830
  /**
3922
- * Validate message content before sending
3923
- * Uses centralized validation utilities for consistency
3924
- * @param command - Message command to validate
3925
- * @throws {Error} If message content is invalid
3831
+ * Clear error history
3926
3832
  */
3927
- private validateMessageContent;
3928
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationService, never>;
3929
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationService>;
3833
+ clear(): void;
3834
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXErrorHandlerService, never>;
3835
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXErrorHandlerService>;
3930
3836
  }
3931
3837
 
3932
3838
  interface FileUploadProgress {
@@ -4014,71 +3920,6 @@ declare class AXFileUploadService {
4014
3920
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXFileUploadService>;
4015
3921
  }
4016
3922
 
4017
- interface DropdownMenuItem {
4018
- id: string;
4019
- label: string;
4020
- icon?: string;
4021
- disabled?: boolean;
4022
- divider?: boolean;
4023
- destructive?: boolean;
4024
- shortcut?: string;
4025
- }
4026
- declare class AXInfoBarComponent {
4027
- private readonly conversationService;
4028
- private readonly infoBar;
4029
- protected get registry(): AXRegistryService;
4030
- /** Active conversation */
4031
- readonly activeConversation: _angular_core.Signal<AXConversation>;
4032
- /** Active component from service */
4033
- readonly activeComponent: _angular_core.Signal<AXInfoBarActiveComponent>;
4034
- /** Active banner from service */
4035
- readonly activeBanner: _angular_core.Signal<AXInfoBarActiveBanner>;
4036
- /** Members popover reference */
4037
- readonly membersPopoverRef: _angular_core.Signal<AXPopoverComponent>;
4038
- /** Members popover target element */
4039
- readonly membersPopoverTarget: _angular_core.WritableSignal<HTMLElement>;
4040
- /** Loading state for async actions */
4041
- readonly actionLoading: _angular_core.WritableSignal<boolean>;
4042
- /** Avatar clicked event */
4043
- readonly avatarClick: _angular_core.OutputEmitterRef<void>;
4044
- /** Search clicked event */
4045
- readonly searchClick: _angular_core.OutputEmitterRef<void>;
4046
- /** Search query changed event */
4047
- readonly searchQuery: _angular_core.OutputEmitterRef<string>;
4048
- /** Menu item clicked event */
4049
- readonly menuItemAction: _angular_core.OutputEmitterRef<string>;
4050
- /** Inline action buttons from registry */
4051
- readonly inlineActions: _angular_core.Signal<_acorex_components_conversation2.AXInfoBarAction[]>;
4052
- /** Dropdown menu items from registry */
4053
- readonly menuItems: _angular_core.Signal<DropdownMenuItem[]>;
4054
- /** Get conversation status - delegate to utils */
4055
- getStatus(conversation: AXConversation): 'online' | 'offline' | 'away' | undefined;
4056
- /** Get subtitle text - delegate to utils */
4057
- getSubtitle(conversation: AXConversation): string;
4058
- /** Get initials from name - delegate to utils */
4059
- getInitials(name: string): string;
4060
- getConversationAvatar(conversation: AXConversation): string | undefined;
4061
- getConversationAvatarIcon(conversation: AXConversation): string | undefined;
4062
- /** Handle avatar click */
4063
- onAvatarClick(): void;
4064
- /** Handle members click - open popover */
4065
- onMembersClick(event: MouseEvent): void;
4066
- /** Handle inline action click */
4067
- onInlineActionClick(actionId: string): Promise<void>;
4068
- /** Get inputs for dynamic component */
4069
- getComponentInputs(): Record<string, unknown>;
4070
- getInlineComponentInputs(): Record<string, unknown>;
4071
- isActiveComponentFullWidth(): boolean;
4072
- /** Handle close component */
4073
- onCloseComponent(): void;
4074
- getBannerInputs(): Record<string, unknown>;
4075
- onCloseBanner(): void;
4076
- /** Handle menu item click */
4077
- onMenuItemClick(item: DropdownMenuItem): Promise<void>;
4078
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfoBarComponent, never>;
4079
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXInfoBarComponent, "ax-conversation-info-bar", never, {}, { "avatarClick": "avatarClick"; "searchClick": "searchClick"; "searchQuery": "searchQuery"; "menuItemAction": "menuItemAction"; }, never, ["ax-prefix"], true, never>;
4080
- }
4081
-
4082
3923
  declare class AXForwardMessageDialogComponent implements OnInit {
4083
3924
  private readonly toastService;
4084
3925
  private readonly translation;
@@ -4126,7 +3967,7 @@ declare class AXMessageListComponent implements OnDestroy {
4126
3967
  private readonly conversationService;
4127
3968
  private readonly messageListService;
4128
3969
  private readonly translation;
4129
- protected readonly config: Required<AXConversationConfig>;
3970
+ protected readonly config: Required<_acorex_components_conversation2.AXConversationConfig>;
4130
3971
  /**
4131
3972
  * Background for the message list scroll area from config, or the built-in soft gradient when unset/empty.
4132
3973
  * Set `messageListBackground` to `transparent` or `none` for a flat look.
@@ -4158,7 +3999,7 @@ declare class AXMessageListComponent implements OnDestroy {
4158
3999
  /** Show scroll to bottom button - use service */
4159
4000
  readonly showScrollButton: _angular_core.WritableSignal<boolean>;
4160
4001
  /** Active conversation */
4161
- readonly activeConversation: _angular_core.Signal<AXConversation>;
4002
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
4162
4003
  /** Messages */
4163
4004
  readonly messages: _angular_core.Signal<AXMessage[]>;
4164
4005
  /** Message action event */
@@ -4167,7 +4008,7 @@ declare class AXMessageListComponent implements OnDestroy {
4167
4008
  action: string;
4168
4009
  }>;
4169
4010
  /** Current user from service */
4170
- readonly currentUser: _angular_core.Signal<AXParticipant>;
4011
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation2.AXParticipant>;
4171
4012
  /** Message grouped by date - use service */
4172
4013
  readonly messageGroups: _angular_core.Signal<{
4173
4014
  date: string;
@@ -4324,9 +4165,9 @@ declare class AXMessageListService {
4324
4165
  private readonly conversationService;
4325
4166
  private readonly config;
4326
4167
  private get registry();
4327
- readonly activeConversation: _angular_core.Signal<AXConversation>;
4168
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
4328
4169
  readonly activeMessages: _angular_core.Signal<AXMessage[]>;
4329
- readonly currentUser: _angular_core.Signal<AXParticipant>;
4170
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation2.AXParticipant>;
4330
4171
  /** Loading state */
4331
4172
  readonly loading: _angular_core.WritableSignal<boolean>;
4332
4173
  /** Loading more messages state */
@@ -4402,7 +4243,7 @@ declare class AXSidebarService {
4402
4243
 
4403
4244
  declare class AXSidebarComponent implements OnDestroy {
4404
4245
  readonly sidebar: AXSidebarService;
4405
- protected readonly config: Required<AXConversationConfig>;
4246
+ protected readonly config: Required<_acorex_components_conversation2.AXConversationConfig>;
4406
4247
  private readonly conversationService;
4407
4248
  private readonly popupService;
4408
4249
  private readonly translation;
@@ -4499,6 +4340,165 @@ declare class AXInfiniteScrollDirective {
4499
4340
  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>;
4500
4341
  }
4501
4342
 
4343
+ /**
4344
+ * Conversation Configuration Interface
4345
+ * Centralized configuration values to avoid magic numbers
4346
+ */
4347
+ /**
4348
+ * Main configuration interface for the conversation component
4349
+ */
4350
+ interface AXConversationConfig {
4351
+ /** Number of messages to load per page */
4352
+ messagePageSize?: number;
4353
+ /** Number of conversations to load per page */
4354
+ conversationPageSize?: number;
4355
+ /** Scroll threshold for detecting scroll events */
4356
+ scrollThreshold?: number;
4357
+ /** Infinite scroll threshold */
4358
+ infiniteScrollThreshold?: number;
4359
+ /** Typing indicator timeout in milliseconds */
4360
+ typingIndicatorTimeout?: number;
4361
+ /** Typing indicator throttle in milliseconds (for rate limiting) */
4362
+ typingIndicatorThrottle?: number;
4363
+ /** Message highlight duration in milliseconds */
4364
+ messageHighlightDuration?: number;
4365
+ /** Search debounce delay in milliseconds */
4366
+ debounceSearch?: number;
4367
+ /** Date separator inactivity fade delay in milliseconds */
4368
+ /** Maximum messages per conversation */
4369
+ maxMessagesPerConversation?: number;
4370
+ /** Maximum total messages in store */
4371
+ maxTotalMessages?: number;
4372
+ /** Maximum cached conversations */
4373
+ maxCachedConversations?: number;
4374
+ /** Minimum sidebar width in pixels */
4375
+ minSidebarWidth?: number;
4376
+ /** Maximum sidebar width in pixels */
4377
+ maxSidebarWidth?: number;
4378
+ /** Default sidebar width in pixels */
4379
+ defaultSidebarWidth?: number;
4380
+ /** Filter cache size */
4381
+ filterCacheSize?: number;
4382
+ /** Maximum file size in bytes */
4383
+ maxFileSize?: number;
4384
+ /** Allowed file types (glob patterns like 'image/*') */
4385
+ allowedFileTypes?: string[];
4386
+ /** Maximum message length in characters */
4387
+ maxMessageLength?: number;
4388
+ /** Minimum message length in characters */
4389
+ minMessageLength?: number;
4390
+ /** Threshold for marking messages as read (0.0 to 1.0, default: 0.3) */
4391
+ messageReadThreshold?: number;
4392
+ /**
4393
+ * CSS `background` for the message list (`ax-conversation-message-list` area, all states: loading, empty, messages).
4394
+ * Use full shorthand, or a bare `https://...` / `/path/to.png` (wrapped as `url(...)` with `center/cover`).
4395
+ * Empty string = library default soft gradient. `transparent` or `none` = flat background.
4396
+ */
4397
+ messageListBackground?: string;
4398
+ }
4399
+
4400
+ /**
4401
+ * Default Configuration Values
4402
+ * Centralized defaults to avoid magic numbers throughout the codebase
4403
+ */
4404
+
4405
+ /**
4406
+ * Default conversation configuration
4407
+ * All values are explicitly defined here for easy maintenance and documentation
4408
+ */
4409
+ declare const AX_DEFAULT_CONVERSATION_CONFIG: Required<AXConversationConfig>;
4410
+ /**
4411
+ * Helper function to merge user config with defaults
4412
+ * Properly handles array merging to avoid reference issues
4413
+ * @param userConfig - User-provided configuration
4414
+ * @returns Merged configuration with all required fields
4415
+ */
4416
+ declare function mergeWithDefaults(userConfig?: Partial<AXConversationConfig>): Required<AXConversationConfig>;
4417
+
4418
+ /**
4419
+ * Dependency Injection Tokens
4420
+ * InjectionTokens for configuration and dependencies
4421
+ */
4422
+
4423
+ /**
4424
+ * Configuration token for conversation component
4425
+ * Uses centralized defaults from AX_DEFAULT_CONVERSATION_CONFIG
4426
+ */
4427
+ declare const CONVERSATION_CONFIG: InjectionToken<Required<AXConversationConfig>>;
4428
+ /**
4429
+ * Token for configuring AXErrorHandlerService
4430
+ */
4431
+ declare const ERROR_HANDLER_CONFIG: InjectionToken<Partial<AXErrorHandlerConfig>>;
4432
+
4433
+ /**
4434
+ * Registry Configuration Tokens
4435
+ * Injection tokens for configuring default registry values
4436
+ */
4437
+
4438
+ /**
4439
+ * Additional message renderers configuration
4440
+ * Provide this token to add custom message renderers in addition to built-in ones
4441
+ * Note: Built-in renderers (text, system, fallback) are registered by default; other types are provided via plugins/constants.
4442
+ */
4443
+ declare const DEFAULT_MESSAGE_RENDERERS: InjectionToken<AXMessageRenderer[]>;
4444
+ /**
4445
+ * Default message actions configuration
4446
+ * Provide this token to override default message actions
4447
+ */
4448
+ declare const DEFAULT_MESSAGE_ACTIONS: InjectionToken<AXMessageAction[]>;
4449
+ /**
4450
+ * Default composer tabs configuration
4451
+ * Provide this token to override default composer tabs (emoji, stickers, etc.)
4452
+ */
4453
+ declare const DEFAULT_COMPOSER_TABS: InjectionToken<AXComposerTab[]>;
4454
+ /**
4455
+ * Default composer actions configuration
4456
+ * Provide this token to override default composer actions (attach, voice, etc.)
4457
+ */
4458
+ declare const DEFAULT_COMPOSER_ACTIONS: InjectionToken<AXComposerAction[]>;
4459
+ /**
4460
+ * Default conversation tabs configuration
4461
+ * Provide this token to override default conversation tabs (all, private, groups, etc.)
4462
+ */
4463
+ declare const DEFAULT_CONVERSATION_TABS: InjectionToken<AXConversationTab[]>;
4464
+ /**
4465
+ * Default info bar actions configuration
4466
+ * Provide this token to override default info bar actions (mute, archive, block, etc.)
4467
+ */
4468
+ declare const DEFAULT_INFO_BAR_ACTIONS: InjectionToken<AXInfoBarAction[]>;
4469
+ /**
4470
+ * Default conversation item actions configuration
4471
+ * Provide this token to override default conversation item actions (mute, delete, archive, etc.)
4472
+ */
4473
+ declare const DEFAULT_CONVERSATION_ITEM_ACTIONS: InjectionToken<AXConversationItemAction[]>;
4474
+ /**
4475
+ * Registry configuration interface
4476
+ */
4477
+ interface AXRegistryConfiguration {
4478
+ /**
4479
+ * Additional message renderers to register (built-in renderers are automatic).
4480
+ * Each {@link AXMessageRenderer} may include optional `composerActions` for co-located send UX.
4481
+ */
4482
+ messageRenderers?: AXMessageRenderer[];
4483
+ /** Message actions to register by default */
4484
+ messageActions?: AXMessageAction[];
4485
+ /** Composer tabs to register by default */
4486
+ composerTabs?: AXComposerTab[];
4487
+ /** Composer actions to register by default */
4488
+ composerActions?: AXComposerAction[];
4489
+ /** Conversation tabs to register by default */
4490
+ conversationTabs?: AXConversationTab[];
4491
+ /** Info bar actions to register by default */
4492
+ infoBarActions?: AXInfoBarAction[];
4493
+ /** Conversation item actions to register by default */
4494
+ conversationItemActions?: AXConversationItemAction[];
4495
+ }
4496
+ /**
4497
+ * Complete registry configuration token
4498
+ * Provide this for comprehensive registry configuration
4499
+ */
4500
+ declare const REGISTRY_CONFIG: InjectionToken<AXRegistryConfiguration>;
4501
+
4502
4502
  /**
4503
4503
  * IndexedDB Storage Wrapper
4504
4504
  * Provides persistent storage for conversation data
@@ -5229,7 +5229,7 @@ declare class AXConversationInfoPanelComponent extends AXClosableComponent imple
5229
5229
  value: string;
5230
5230
  }>;
5231
5231
  /** Get filtered members based on search */
5232
- get filteredMembers(): AXParticipant[];
5232
+ get filteredMembers(): _acorex_components_conversation2.AXParticipant[];
5233
5233
  /** Handle tab change */
5234
5234
  onTabChange(event: any): void;
5235
5235
  ngOnInit(): void;
@@ -5285,7 +5285,7 @@ declare class AXInfoBarSearchComponent {
5285
5285
  /** Current index from service */
5286
5286
  readonly currentIndex: _angular_core.Signal<number>;
5287
5287
  /** Messages from conversation */
5288
- readonly messages: _angular_core.Signal<AXMessage[]>;
5288
+ readonly messages: _angular_core.Signal<_acorex_components_conversation2.AXMessage[]>;
5289
5289
  private scrollTimer?;
5290
5290
  constructor();
5291
5291
  /** Handle search input change */
@@ -5385,7 +5385,7 @@ declare class AXAudioRendererComponent implements AXMessageRendererComponent {
5385
5385
  private readonly _contentState;
5386
5386
  readonly message: _angular_core.InputSignal<AXMessage>;
5387
5387
  readonly rendererState: _angular_core.Signal<{
5388
- deliveryStatus: AXMessageStatus;
5388
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5389
5389
  contentState: AXMessageRendererContentState;
5390
5390
  }>;
5391
5391
  readonly isPlaying: _angular_core.WritableSignal<boolean>;
@@ -5428,7 +5428,7 @@ declare class AXFallbackRendererComponent implements AXMessageRendererComponent
5428
5428
  private readonly _contentState;
5429
5429
  readonly message: _angular_core.InputSignal<AXMessage>;
5430
5430
  readonly rendererState: _angular_core.Signal<{
5431
- deliveryStatus: AXMessageStatus;
5431
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5432
5432
  contentState: AXMessageRendererContentState;
5433
5433
  }>;
5434
5434
  readonly messageTypeLabel: _angular_core.Signal<string>;
@@ -5442,7 +5442,7 @@ declare class AXFileRendererComponent implements AXMessageRendererComponent {
5442
5442
  private readonly _contentState;
5443
5443
  readonly message: _angular_core.InputSignal<AXMessage>;
5444
5444
  readonly rendererState: _angular_core.Signal<{
5445
- deliveryStatus: AXMessageStatus;
5445
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5446
5446
  contentState: AXMessageRendererContentState;
5447
5447
  }>;
5448
5448
  readonly payload: _angular_core.Signal<AXFilePayload>;
@@ -5462,7 +5462,7 @@ declare class AXImageRendererComponent implements AXMessageRendererComponent {
5462
5462
  private readonly _contentState;
5463
5463
  readonly message: _angular_core.InputSignal<AXMessage>;
5464
5464
  readonly rendererState: _angular_core.Signal<{
5465
- deliveryStatus: AXMessageStatus;
5465
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5466
5466
  contentState: AXMessageRendererContentState;
5467
5467
  }>;
5468
5468
  readonly imageClick: _angular_core.OutputEmitterRef<string>;
@@ -5482,7 +5482,7 @@ declare class AXLocationRendererComponent implements AXMessageRendererComponent
5482
5482
  private readonly _contentState;
5483
5483
  readonly message: _angular_core.InputSignal<AXMessage>;
5484
5484
  readonly rendererState: _angular_core.Signal<{
5485
- deliveryStatus: AXMessageStatus;
5485
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5486
5486
  contentState: AXMessageRendererContentState;
5487
5487
  }>;
5488
5488
  readonly payload: _angular_core.Signal<AXLocationPayload>;
@@ -5507,7 +5507,7 @@ declare class AXStickerRendererComponent implements AXMessageRendererComponent {
5507
5507
  private readonly _contentState;
5508
5508
  readonly message: _angular_core.InputSignal<AXMessage>;
5509
5509
  readonly rendererState: _angular_core.Signal<{
5510
- deliveryStatus: AXMessageStatus;
5510
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5511
5511
  contentState: AXMessageRendererContentState;
5512
5512
  }>;
5513
5513
  readonly payload: _angular_core.Signal<AXStickerPayload>;
@@ -5524,7 +5524,7 @@ declare class AXSystemRendererComponent implements AXMessageRendererComponent {
5524
5524
  private readonly _contentState;
5525
5525
  readonly message: _angular_core.InputSignal<AXMessage>;
5526
5526
  readonly rendererState: _angular_core.Signal<{
5527
- deliveryStatus: AXMessageStatus;
5527
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5528
5528
  contentState: AXMessageRendererContentState;
5529
5529
  }>;
5530
5530
  readonly payload: _angular_core.Signal<AXSystemPayload>;
@@ -5539,7 +5539,7 @@ declare class AXTextRendererComponent implements AXMessageRendererComponent {
5539
5539
  private readonly _contentState;
5540
5540
  readonly message: _angular_core.InputSignal<AXMessage>;
5541
5541
  readonly rendererState: _angular_core.Signal<{
5542
- deliveryStatus: AXMessageStatus;
5542
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5543
5543
  contentState: AXMessageRendererContentState;
5544
5544
  }>;
5545
5545
  readonly searchQuery: _angular_core.Signal<string>;
@@ -5561,7 +5561,7 @@ declare class AXVideoRendererComponent implements AXMessageRendererComponent {
5561
5561
  private readonly _contentState;
5562
5562
  readonly message: _angular_core.InputSignal<AXMessage>;
5563
5563
  readonly rendererState: _angular_core.Signal<{
5564
- deliveryStatus: AXMessageStatus;
5564
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5565
5565
  contentState: AXMessageRendererContentState;
5566
5566
  }>;
5567
5567
  readonly showPlayer: _angular_core.WritableSignal<boolean>;
@@ -5613,7 +5613,7 @@ declare class AXVoiceRendererComponent implements AXMessageRendererComponent {
5613
5613
  private readonly _contentState;
5614
5614
  readonly message: _angular_core.InputSignal<AXMessage>;
5615
5615
  readonly rendererState: _angular_core.Signal<{
5616
- deliveryStatus: AXMessageStatus;
5616
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5617
5617
  contentState: AXMessageRendererContentState;
5618
5618
  }>;
5619
5619
  readonly isPlaying: _angular_core.WritableSignal<boolean>;