@acorex/components 20.8.32 โ†’ 20.9.0

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 (128) hide show
  1. package/conversation/README.md +462 -2
  2. package/conversation/index.d.ts +5400 -485
  3. package/fesm2022/acorex-components-calendar.mjs +3 -2
  4. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  5. package/fesm2022/acorex-components-conversation-acorex-components-conversation-CjVDCoJw.mjs +13711 -0
  6. package/fesm2022/acorex-components-conversation-acorex-components-conversation-CjVDCoJw.mjs.map +1 -0
  7. package/fesm2022/acorex-components-conversation-audio-attachment.component-Ri-Jx210.mjs +119 -0
  8. package/fesm2022/acorex-components-conversation-audio-attachment.component-Ri-Jx210.mjs.map +1 -0
  9. package/fesm2022/acorex-components-conversation-audio-composer.payload-DiMDlVl9.mjs +59 -0
  10. package/fesm2022/acorex-components-conversation-audio-composer.payload-DiMDlVl9.mjs.map +1 -0
  11. package/fesm2022/acorex-components-conversation-audio-picker.component-CqrKBDIF.mjs +432 -0
  12. package/fesm2022/acorex-components-conversation-audio-picker.component-CqrKBDIF.mjs.map +1 -0
  13. package/fesm2022/acorex-components-conversation-audio-renderer.component-CO8owVrA.mjs +177 -0
  14. package/fesm2022/acorex-components-conversation-audio-renderer.component-CO8owVrA.mjs.map +1 -0
  15. package/fesm2022/acorex-components-conversation-audio.payload-CLnYjmYY.mjs +54 -0
  16. package/fesm2022/acorex-components-conversation-audio.payload-CLnYjmYY.mjs.map +1 -0
  17. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-CYutyq7i.mjs +101 -0
  18. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-CYutyq7i.mjs.map +1 -0
  19. package/fesm2022/acorex-components-conversation-conversation-audio.file-type-D-hIBwQ2.mjs +100 -0
  20. package/fesm2022/acorex-components-conversation-conversation-audio.file-type-D-hIBwQ2.mjs.map +1 -0
  21. package/fesm2022/acorex-components-conversation-conversation-file.file-type-DQUy3C64.mjs +121 -0
  22. package/fesm2022/acorex-components-conversation-conversation-file.file-type-DQUy3C64.mjs.map +1 -0
  23. package/fesm2022/acorex-components-conversation-conversation-image.file-type-Bd_SkwR0.mjs +84 -0
  24. package/fesm2022/acorex-components-conversation-conversation-image.file-type-Bd_SkwR0.mjs.map +1 -0
  25. package/fesm2022/acorex-components-conversation-conversation-info-media-view.component-BalIIAFB.mjs +238 -0
  26. package/fesm2022/acorex-components-conversation-conversation-info-media-view.component-BalIIAFB.mjs.map +1 -0
  27. package/fesm2022/acorex-components-conversation-conversation-info-panel.component-BJMo9bDd.mjs +1080 -0
  28. package/fesm2022/acorex-components-conversation-conversation-info-panel.component-BJMo9bDd.mjs.map +1 -0
  29. package/fesm2022/acorex-components-conversation-conversation-video.file-type-DyK0bLE5.mjs +102 -0
  30. package/fesm2022/acorex-components-conversation-conversation-video.file-type-DyK0bLE5.mjs.map +1 -0
  31. package/fesm2022/acorex-components-conversation-conversation-voice.file-type-v3rFWDv6.mjs +90 -0
  32. package/fesm2022/acorex-components-conversation-conversation-voice.file-type-v3rFWDv6.mjs.map +1 -0
  33. package/fesm2022/acorex-components-conversation-emoji-categories-C7Gm95V0.mjs +1840 -0
  34. package/fesm2022/acorex-components-conversation-emoji-categories-C7Gm95V0.mjs.map +1 -0
  35. package/fesm2022/acorex-components-conversation-fallback-renderer.component-DOQkZWwP.mjs +44 -0
  36. package/fesm2022/acorex-components-conversation-fallback-renderer.component-DOQkZWwP.mjs.map +1 -0
  37. package/fesm2022/acorex-components-conversation-file-composer.payload-azPSH99m.mjs +64 -0
  38. package/fesm2022/acorex-components-conversation-file-composer.payload-azPSH99m.mjs.map +1 -0
  39. package/fesm2022/acorex-components-conversation-file-picker.component-cmUkgSF3.mjs +468 -0
  40. package/fesm2022/acorex-components-conversation-file-picker.component-cmUkgSF3.mjs.map +1 -0
  41. package/fesm2022/acorex-components-conversation-file-renderer.component-CpUgRTR4.mjs +125 -0
  42. package/fesm2022/acorex-components-conversation-file-renderer.component-CpUgRTR4.mjs.map +1 -0
  43. package/fesm2022/acorex-components-conversation-file.payload-DXwzNWxT.mjs +50 -0
  44. package/fesm2022/acorex-components-conversation-file.payload-DXwzNWxT.mjs.map +1 -0
  45. package/fesm2022/acorex-components-conversation-format-media-DUD4vA6F.mjs +21 -0
  46. package/fesm2022/acorex-components-conversation-format-media-DUD4vA6F.mjs.map +1 -0
  47. package/fesm2022/acorex-components-conversation-image-attachment.component-BZto5LFo.mjs +77 -0
  48. package/fesm2022/acorex-components-conversation-image-attachment.component-BZto5LFo.mjs.map +1 -0
  49. package/fesm2022/acorex-components-conversation-image-picker.component-G9EEOyDg.mjs +407 -0
  50. package/fesm2022/acorex-components-conversation-image-picker.component-G9EEOyDg.mjs.map +1 -0
  51. package/fesm2022/acorex-components-conversation-image-renderer.component-Bwa6rG6C.mjs +83 -0
  52. package/fesm2022/acorex-components-conversation-image-renderer.component-Bwa6rG6C.mjs.map +1 -0
  53. package/fesm2022/acorex-components-conversation-index-BbrYsQ84.mjs +180 -0
  54. package/fesm2022/acorex-components-conversation-index-BbrYsQ84.mjs.map +1 -0
  55. package/fesm2022/acorex-components-conversation-index-DtGEWeKN.mjs +266 -0
  56. package/fesm2022/acorex-components-conversation-index-DtGEWeKN.mjs.map +1 -0
  57. package/fesm2022/acorex-components-conversation-location-picker.component-Cx993j_c.mjs +149 -0
  58. package/fesm2022/acorex-components-conversation-location-picker.component-Cx993j_c.mjs.map +1 -0
  59. package/fesm2022/acorex-components-conversation-location-renderer.component-BiynmAJw.mjs +118 -0
  60. package/fesm2022/acorex-components-conversation-location-renderer.component-BiynmAJw.mjs.map +1 -0
  61. package/fesm2022/acorex-components-conversation-media-formatters-DV3wEEno.mjs +17 -0
  62. package/fesm2022/acorex-components-conversation-media-formatters-DV3wEEno.mjs.map +1 -0
  63. package/fesm2022/acorex-components-conversation-media-playback-info-bar-banner.component-a7OSpfB1.mjs +140 -0
  64. package/fesm2022/acorex-components-conversation-media-playback-info-bar-banner.component-a7OSpfB1.mjs.map +1 -0
  65. package/fesm2022/acorex-components-conversation-message-renderer-copy-host.component-D_eAnM6v.mjs +33 -0
  66. package/fesm2022/acorex-components-conversation-message-renderer-copy-host.component-D_eAnM6v.mjs.map +1 -0
  67. package/fesm2022/acorex-components-conversation-message-renderer-state.component-DSnNoz1N.mjs +172 -0
  68. package/fesm2022/acorex-components-conversation-message-renderer-state.component-DSnNoz1N.mjs.map +1 -0
  69. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-CbNyy2Ws.mjs +224 -0
  70. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-CbNyy2Ws.mjs.map +1 -0
  71. package/fesm2022/acorex-components-conversation-pagination-demo-data-DRr9PXjJ.mjs +81 -0
  72. package/fesm2022/acorex-components-conversation-pagination-demo-data-DRr9PXjJ.mjs.map +1 -0
  73. package/fesm2022/acorex-components-conversation-picker-header.component-BhTzlufI.mjs +91 -0
  74. package/fesm2022/acorex-components-conversation-picker-header.component-BhTzlufI.mjs.map +1 -0
  75. package/fesm2022/acorex-components-conversation-picker-toolbar.component-CpyS0j6P.mjs +537 -0
  76. package/fesm2022/acorex-components-conversation-picker-toolbar.component-CpyS0j6P.mjs.map +1 -0
  77. package/fesm2022/acorex-components-conversation-picker-upload-C-PlKPaU.mjs +163 -0
  78. package/fesm2022/acorex-components-conversation-picker-upload-C-PlKPaU.mjs.map +1 -0
  79. package/fesm2022/acorex-components-conversation-playback-banner-sync-BMsx6Fuy.mjs +68 -0
  80. package/fesm2022/acorex-components-conversation-playback-banner-sync-BMsx6Fuy.mjs.map +1 -0
  81. package/fesm2022/acorex-components-conversation-renderer-shared.styles-Digah3Zn.mjs +95 -0
  82. package/fesm2022/acorex-components-conversation-renderer-shared.styles-Digah3Zn.mjs.map +1 -0
  83. package/fesm2022/acorex-components-conversation-search.component-96NI2ERG.mjs +187 -0
  84. package/fesm2022/acorex-components-conversation-search.component-96NI2ERG.mjs.map +1 -0
  85. package/fesm2022/acorex-components-conversation-send-message-media--Rbrne7k.mjs +170 -0
  86. package/fesm2022/acorex-components-conversation-send-message-media--Rbrne7k.mjs.map +1 -0
  87. package/fesm2022/acorex-components-conversation-shared-storage.seed-zFjNXfKF.mjs +750 -0
  88. package/fesm2022/acorex-components-conversation-shared-storage.seed-zFjNXfKF.mjs.map +1 -0
  89. package/fesm2022/acorex-components-conversation-sticker-renderer.component-BZgx_Ylk.mjs +103 -0
  90. package/fesm2022/acorex-components-conversation-sticker-renderer.component-BZgx_Ylk.mjs.map +1 -0
  91. package/fesm2022/acorex-components-conversation-system-renderer.component-D1Aj-LuF.mjs +55 -0
  92. package/fesm2022/acorex-components-conversation-system-renderer.component-D1Aj-LuF.mjs.map +1 -0
  93. package/fesm2022/acorex-components-conversation-text-renderer.component-Cxvwjr2p.mjs +109 -0
  94. package/fesm2022/acorex-components-conversation-text-renderer.component-Cxvwjr2p.mjs.map +1 -0
  95. package/fesm2022/acorex-components-conversation-video-attachment.component-DBY_4Ri2.mjs +105 -0
  96. package/fesm2022/acorex-components-conversation-video-attachment.component-DBY_4Ri2.mjs.map +1 -0
  97. package/fesm2022/acorex-components-conversation-video-composer.payload-CWGxsPg5.mjs +62 -0
  98. package/fesm2022/acorex-components-conversation-video-composer.payload-CWGxsPg5.mjs.map +1 -0
  99. package/fesm2022/acorex-components-conversation-video-picker.component-D1JYwEm_.mjs +446 -0
  100. package/fesm2022/acorex-components-conversation-video-picker.component-D1JYwEm_.mjs.map +1 -0
  101. package/fesm2022/acorex-components-conversation-video-renderer.component-iwf2bU29.mjs +181 -0
  102. package/fesm2022/acorex-components-conversation-video-renderer.component-iwf2bU29.mjs.map +1 -0
  103. package/fesm2022/acorex-components-conversation-video.payload-DfBEjqQ4.mjs +54 -0
  104. package/fesm2022/acorex-components-conversation-video.payload-DfBEjqQ4.mjs.map +1 -0
  105. package/fesm2022/acorex-components-conversation-voice-composer.payload-DLVow7ex.mjs +17 -0
  106. package/fesm2022/acorex-components-conversation-voice-composer.payload-DLVow7ex.mjs.map +1 -0
  107. package/fesm2022/acorex-components-conversation-voice-recorder.component-P8J_5OH0.mjs +328 -0
  108. package/fesm2022/acorex-components-conversation-voice-recorder.component-P8J_5OH0.mjs.map +1 -0
  109. package/fesm2022/acorex-components-conversation-voice-renderer.component-CZpEqbXL.mjs +270 -0
  110. package/fesm2022/acorex-components-conversation-voice-renderer.component-CZpEqbXL.mjs.map +1 -0
  111. package/fesm2022/acorex-components-conversation.mjs +1 -1402
  112. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  113. package/fesm2022/acorex-components-data-table.mjs +2 -2
  114. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  115. package/fesm2022/acorex-components-rest-api-generator.mjs +2 -2
  116. package/fesm2022/acorex-components-rest-api-generator.mjs.map +1 -1
  117. package/fesm2022/acorex-components-scheduler-picker.mjs +22 -14
  118. package/fesm2022/acorex-components-scheduler-picker.mjs.map +1 -1
  119. package/fesm2022/acorex-components-step-wizard.mjs +2 -2
  120. package/fesm2022/acorex-components-step-wizard.mjs.map +1 -1
  121. package/fesm2022/acorex-components-tree-view-legacy.mjs +2 -2
  122. package/fesm2022/acorex-components-tree-view-legacy.mjs.map +1 -1
  123. package/package.json +35 -39
  124. package/scheduler-picker/index.d.ts +2 -0
  125. package/conversation2/README.md +0 -463
  126. package/conversation2/index.d.ts +0 -6410
  127. package/fesm2022/acorex-components-conversation2.mjs +0 -22331
  128. package/fesm2022/acorex-components-conversation2.mjs.map +0 -1
@@ -1,3 +1,463 @@
1
- # @acorex/components/chat
1
+ # @acorex/components/conversation
2
2
 
3
- Secondary entry point of `@acorex/components`. It can be used by importing from `@acorex/components/chat`.
3
+ A modern, fully-featured conversation/chat component for Angular 18+. Built with signals, standalone components, and extensibility in mind.
4
+
5
+ ## ๐Ÿš€ Features
6
+
7
+ - **Real-time Messaging** - Live message updates with WebSocket support
8
+ - **Multiple Message Types** - Text, images, videos, audio, voice, files, locations, stickers, contacts
9
+ - **Rich Interactions** - Reactions, replies, message editing, deletion, forwarding
10
+ - **Group & Private Chats** - Support for 1-on-1 and group conversations
11
+ - **Typing Indicators** - Real-time typing status
12
+ - **Read Receipts** - Message delivery and read status
13
+ - **Infinite Scroll** - Efficient pagination for message history
14
+ - **Search** - Search within conversations and messages
15
+ - **Extensible** - Plugin system for custom message renderers and actions
16
+ - **Responsive** - Mobile-friendly design
17
+ - **Accessibility** - ARIA labels and keyboard navigation
18
+
19
+ ## ๐Ÿ“ฆ Installation
20
+
21
+ ```bash
22
+ npm install @acorex/components/conversation
23
+ ```
24
+
25
+ ## ๐Ÿ”ง Peer Dependencies
26
+
27
+ This package requires the following peer dependencies:
28
+
29
+ ### Required Angular Dependencies
30
+
31
+ ```json
32
+ {
33
+ "@angular/common": "^18.0.0",
34
+ "@angular/core": "^18.0.0",
35
+ "@angular/forms": "^18.0.0",
36
+ "rxjs": "^7.8.0"
37
+ }
38
+ ```
39
+
40
+ ### Required Acorex Dependencies
41
+
42
+ #### Core Packages
43
+
44
+ - `@acorex/cdk/common` - Common utilities and directives
45
+ - `@acorex/core/date-time` - Date and time formatting
46
+ - `@acorex/core/format` - General formatting utilities
47
+
48
+ #### Component Packages
49
+
50
+ - `@acorex/components/avatar` - User avatars
51
+ - `@acorex/components/badge` - Notification badges
52
+ - `@acorex/components/button` - Button components
53
+ - `@acorex/components/decorators` - Decorative elements
54
+ - `@acorex/components/dialog` - Dialog service
55
+ - `@acorex/components/dropdown` - Dropdown panels
56
+ - `@acorex/components/image` - Image components
57
+ - `@acorex/components/label` - Label components
58
+ - `@acorex/components/loading` - Loading indicators
59
+ - `@acorex/components/menu` - Context menus
60
+ - `@acorex/components/popover` - Popover components
61
+ - `@acorex/components/popup` - Popup service
62
+ - `@acorex/components/search-box` - Search functionality
63
+ - `@acorex/components/select-box` - Select dropdowns
64
+ - `@acorex/components/tabs` - Tab components
65
+ - `@acorex/components/text-area` - Text input areas
66
+ - `@acorex/components/text-box` - Text input boxes
67
+ - `@acorex/components/toast` - Toast notifications
68
+ - `@acorex/components/tooltip` - Tooltips
69
+ - `@acorex/components/uploader` - File upload functionality
70
+
71
+ ## ๐ŸŽฏ Quick Start
72
+
73
+ > **New to conversation?** Check out our [5-Minute Quick Start Guide](./docs/QUICK-START.md) for the fastest way to get started!
74
+
75
+ ### Detailed Setup
76
+
77
+ ### 1. Standalone Application (Recommended)
78
+
79
+ ```typescript
80
+ import { ApplicationConfig } from '@angular/core';
81
+ import {
82
+ provideConversation,
83
+ AXIndexedDBUserApi,
84
+ AXIndexedDBConversationApi,
85
+ AXIndexedDBMessageApi,
86
+ AXIndexedDBRealtimeApi,
87
+ } from '@acorex/components/conversation';
88
+
89
+ export const appConfig: ApplicationConfig = {
90
+ providers: [
91
+ MyAppUploaderService,
92
+ provideConversation({
93
+ userApi: AXIndexedDBUserApi,
94
+ conversationApi: AXIndexedDBConversationApi,
95
+ messageApi: AXIndexedDBMessageApi,
96
+ realtimeApi: AXIndexedDBRealtimeApi, // optional
97
+ config: {
98
+ messagePageSize: 50,
99
+ conversationPageSize: 30,
100
+ },
101
+ registry: {
102
+ // Optional: Register custom message renderers, actions, etc.
103
+ },
104
+ }),
105
+ ],
106
+ };
107
+ ```
108
+
109
+ ### 2. NgModule Application (Legacy)
110
+
111
+ ```typescript
112
+ import { NgModule } from '@angular/core';
113
+ import {
114
+ AXConversationModule,
115
+ AXIndexedDBUserApi,
116
+ AXIndexedDBConversationApi,
117
+ AXIndexedDBMessageApi,
118
+ AXIndexedDBRealtimeApi,
119
+ } from '@acorex/components/conversation';
120
+
121
+ @NgModule({
122
+ imports: [
123
+ AXConversationModule.forRoot({
124
+ userApi: AXIndexedDBUserApi,
125
+ conversationApi: AXIndexedDBConversationApi,
126
+ messageApi: AXIndexedDBMessageApi,
127
+ realtimeApi: AXIndexedDBRealtimeApi,
128
+ config: { /* ... */ },
129
+ }),
130
+ ],
131
+ })
132
+ export class AppModule {}
133
+ ```
134
+
135
+ ### 3. Use in Template
136
+
137
+ ```html
138
+ <ax-conversation-container></ax-conversation-container>
139
+ ```
140
+
141
+ ## ๐Ÿ”Œ API Implementation
142
+
143
+ You must provide an API implementation that extends `AXConversationApi`:
144
+
145
+ ```typescript
146
+ import { Injectable } from '@angular/core';
147
+ import { HttpClient } from '@angular/common/http';
148
+ import { AXConversationApi, AXConversationPagination, AXConversationPaginatedResult } from '@acorex/components/conversation';
149
+
150
+ @Injectable()
151
+ export class MyConversationApi extends AXConversationApi {
152
+ constructor(private http: HttpClient) {
153
+ super();
154
+ }
155
+
156
+ async connect(): Promise<void> {
157
+ // Initialize WebSocket connection
158
+ }
159
+
160
+ async fetchConversations(pagination: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversation>> {
161
+ const response = await this.http.get('/api/conversations', {
162
+ params: { page: pagination.page, pageSize: pagination.pageSize }
163
+ }).toPromise();
164
+ return response;
165
+ }
166
+
167
+ // Implement other required methods...
168
+ }
169
+ ```
170
+
171
+ ### Built-in API Implementations
172
+
173
+ #### IndexedDB API (Development/Demo)
174
+
175
+ ```typescript
176
+ import {
177
+ provideConversation,
178
+ AXIndexedDBUserApi,
179
+ AXIndexedDBConversationApi,
180
+ AXIndexedDBMessageApi,
181
+ AXIndexedDBRealtimeApi,
182
+ } from '@acorex/components/conversation';
183
+
184
+ // Provides in-memory storage with sample data
185
+ // Perfect for development and demos
186
+ provideConversation({
187
+ userApi: AXIndexedDBUserApi,
188
+ conversationApi: AXIndexedDBConversationApi,
189
+ messageApi: AXIndexedDBMessageApi,
190
+ realtimeApi: AXIndexedDBRealtimeApi,
191
+ });
192
+ ```
193
+
194
+ Register a service that subscribes to `AXUploaderService.onUpload`, `onResolveUrl`, and `onDeleteMedia` (see showcase `AXShowcaseConversationIndexedDbUploaderService`).
195
+
196
+ #### IndexedDB with AI API (AI-Powered Demo)
197
+
198
+ ```typescript
199
+ import {
200
+ provideConversation,
201
+ AXIndexedDBUserApi,
202
+ AXIndexedDBConversationApi,
203
+ AXIndexedDBMessageAIApi,
204
+ AXIndexedDBRealtimeApi,
205
+ } from '@acorex/components/conversation';
206
+
207
+ // Includes AI-powered auto-responses via message API
208
+ provideConversation({
209
+ userApi: AXIndexedDBUserApi,
210
+ conversationApi: AXIndexedDBConversationApi,
211
+ messageApi: AXIndexedDBMessageAIApi,
212
+ realtimeApi: AXIndexedDBRealtimeApi,
213
+ });
214
+ ```
215
+
216
+ ## โš™๏ธ Configuration
217
+
218
+ ### Conversation Config
219
+
220
+ ```typescript
221
+ interface AXConversationConfig {
222
+ // Pagination
223
+ messagePageSize?: number; // Default: 50
224
+ conversationPageSize?: number; // Default: 30
225
+ infiniteScrollThreshold?: number; // Default: 200px
226
+ scrollThreshold?: number; // Default: 100px
227
+
228
+ // UI Behavior
229
+ messageHighlightDuration?: number; // Default: 2000ms
230
+ typingIndicatorTimeout?: number; // Default: 3000ms
231
+ }
232
+ ```
233
+
234
+ ### Registry Configuration
235
+
236
+ ```typescript
237
+ interface AXConversationRegistryConfiguration {
238
+ messageRenderers?: AXConversationMessageRenderer[];
239
+ messageActions?: AXConversationMessageAction[];
240
+ composerActions?: AXConversationComposerAction[];
241
+ composerTabs?: AXConversationComposerTab[];
242
+ conversationTabs?: AXConversationTab[];
243
+ infoBarActions?: AXConversationInfoBarAction[];
244
+ conversationItemActions?: AXConversationItemAction[];
245
+ }
246
+ ```
247
+
248
+ ## ๐ŸŽจ Customization
249
+
250
+ ### Custom Message Renderer
251
+
252
+ ```typescript
253
+ import { Component, input } from '@angular/core';
254
+ import { AXConversationMessageRenderer } from '@acorex/components/conversation';
255
+
256
+ @Component({
257
+ selector: 'my-custom-renderer',
258
+ template: `<div>{{ message().payload.customData }}</div>`
259
+ })
260
+ export class MyCustomRendererComponent {
261
+ message = input.required<AXConversationMessage>();
262
+ }
263
+
264
+ const myRenderer: AXConversationMessageRenderer = {
265
+ type: 'custom',
266
+ component: MyCustomRendererComponent,
267
+ priority: 100
268
+ };
269
+
270
+ // Register in config
271
+ provideConversation({
272
+ api: MyApi,
273
+ registry: {
274
+ messageRenderers: [myRenderer]
275
+ }
276
+ });
277
+ ```
278
+
279
+ ### Custom Message Action
280
+
281
+ ```typescript
282
+ const forwardAction: AXConversationMessageAction = {
283
+ id: 'forward',
284
+ label: 'Forward',
285
+ icon: 'forward',
286
+ shortcut: 'Ctrl+F',
287
+ enabled: (message, user) => message.senderId === user.id,
288
+ execute: async (message, service) => {
289
+ // Forward logic
290
+ }
291
+ };
292
+
293
+ provideConversation({
294
+ api: MyApi,
295
+ registry: {
296
+ messageActions: [forwardAction]
297
+ }
298
+ });
299
+ ```
300
+
301
+ ## ๐Ÿ“ฑ Components
302
+
303
+ ### Main Components
304
+
305
+ - `<ax-conversation-container>` - Full conversation UI with sidebar, messages, and composer
306
+ - `<ax-conversation-sidebar>` - Conversation list sidebar
307
+ - `<ax-conversation-message-list>` - Message list with virtual scrolling
308
+ - `<ax-conversation-composer>` - Message input area
309
+ - `<ax-conversation-info-bar>` - Conversation header with actions
310
+
311
+ ### Usage Examples
312
+
313
+ ```html
314
+ <!-- Full conversation UI -->
315
+ <ax-conversation-container></ax-conversation-container>
316
+
317
+ <!-- Custom layout -->
318
+ <div class="my-chat-layout">
319
+ <ax-conversation-sidebar></ax-conversation-sidebar>
320
+ <div class="chat-main">
321
+ <ax-conversation-info-bar></ax-conversation-info-bar>
322
+ <ax-conversation-message-list></ax-conversation-message-list>
323
+ <ax-conversation-composer></ax-conversation-composer>
324
+ </div>
325
+ </div>
326
+ ```
327
+
328
+ ## ๐ŸŽญ Services
329
+
330
+ ### AXConversationService
331
+
332
+ Main service for conversation operations:
333
+
334
+ ```typescript
335
+ import { inject } from '@angular/core';
336
+ import { AXConversationService } from '@acorex/components/conversation';
337
+
338
+ export class MyComponent {
339
+ private conversationService = inject(AXConversationService);
340
+
341
+ async sendMessage() {
342
+ await this.conversationService.sendMessage({
343
+ conversationId: 'conv-123',
344
+ type: 'text',
345
+ payload: { text: 'Hello!' }
346
+ });
347
+ }
348
+
349
+ async createConversation() {
350
+ const conv = await this.conversationService.createConversation(
351
+ ['user-1', 'user-2'],
352
+ 'private'
353
+ );
354
+ }
355
+ }
356
+ ```
357
+
358
+ ## ๐Ÿงช Testing
359
+
360
+ ```typescript
361
+ import { TestBed } from '@angular/core/testing';
362
+ import { provideConversation, AXConversationService } from '@acorex/components/conversation';
363
+ import { MockUserApi, MockConversationApi, MockMessageApi } from './mocks/mock-apis';
364
+
365
+ describe('MyComponent', () => {
366
+ beforeEach(() => {
367
+ TestBed.configureTestingModule({
368
+ providers: [
369
+ provideConversation({
370
+ userApi: MockUserApi,
371
+ conversationApi: MockConversationApi,
372
+ messageApi: MockMessageApi,
373
+ }),
374
+ ],
375
+ });
376
+ });
377
+
378
+ it('should send message', async () => {
379
+ const service = TestBed.inject(AXConversationService);
380
+ const message = await service.sendMessage({
381
+ conversationId: 'test',
382
+ type: 'text',
383
+ payload: { text: 'Test' },
384
+ });
385
+ expect(message).toBeDefined();
386
+ });
387
+ });
388
+ ```
389
+
390
+ ## ๐ŸŽฏ Message Types
391
+
392
+ Supported message types out of the box:
393
+
394
+ - **text** - Plain text messages
395
+ - **image** - Image messages with thumbnails
396
+ - **video** - Video messages with playback
397
+ - **audio** - Audio file messages
398
+ - **voice** - Voice recordings
399
+ - **file** - Generic file attachments
400
+ - **location** - Location sharing
401
+ - **sticker** - Sticker messages
402
+ - **contact** - Contact card sharing
403
+ - **system** - System notifications
404
+
405
+ ## ๐Ÿ”’ Security Considerations
406
+
407
+ - **API Keys**: Never hardcode API keys in source code. Use environment variables or injection tokens.
408
+ - **File Upload**: Validate file types and sizes on both client and server.
409
+ - **XSS Protection**: All user content is sanitized by default.
410
+ - **Authentication**: Implement proper authentication in your API layer.
411
+
412
+ ## ๐Ÿ“Š Performance Tips
413
+
414
+ 1. **Virtual Scrolling**: Enabled by default for large message lists
415
+ 2. **Lazy Loading**: Images and media are loaded on demand
416
+ 3. **Pagination**: Messages are loaded in pages to reduce initial load
417
+ 4. **Debouncing**: Typing indicators are debounced to reduce network traffic
418
+ 5. **Memoization**: Use computed signals for expensive calculations
419
+
420
+ ## ๐Ÿ› Troubleshooting
421
+
422
+ ### Common Issues
423
+
424
+ **Issue**: Messages not appearing
425
+
426
+ - Check if API is connected: `conversationService.connectionStatus$()`
427
+ - Verify API implementation returns correct data structure
428
+
429
+ **Issue**: File upload fails
430
+
431
+ - Check composer file-type catalogs and per-action `uploadConstraints` (`allowedMimeTypes`, `minSize`, `maxSize`)
432
+ - Register a handler service subscribed to `AXUploaderService.onUpload` (and resolve/delete events) with progress and `AbortSignal` support
433
+
434
+ **Issue**: Styling issues
435
+
436
+ - Ensure all Acorex component styles are imported
437
+ - Check for CSS conflicts with global styles
438
+
439
+ ## ๐Ÿ“š Additional Resources
440
+
441
+ - [Quick Start Guide](./docs/QUICK-START.md) - Get started in 5 minutes
442
+ - [Architecture Overview](./docs/ARCHITECTURE-OVERVIEW.md) - Understand the module structure
443
+ - [API Documentation](./docs/ARCHITECTURE-APIS.md) - Implement custom backends
444
+ - [Component Guide](./docs/ARCHITECTURE-COMPONENTS.md) - Learn about components
445
+ - [Plugin System](./docs/ARCHITECTURE-PLUGINS.md) - Extend functionality
446
+ - [Usage Guide](./docs/USAGE-GUIDE.md) - Advanced usage patterns
447
+
448
+ ## ๐Ÿค Contributing
449
+
450
+ Contributions are welcome! Please read our [Contributing Guide](./CONTRIBUTING.md) for details.
451
+
452
+ ## ๐Ÿ“„ License
453
+
454
+ MIT License - see LICENSE file for details
455
+
456
+ ## ๐Ÿ”„ Changelog
457
+
458
+ See [CHANGELOG.md](./CHANGELOG.md) for version history and updates.
459
+
460
+ ## ๐Ÿ’ฌ Support
461
+
462
+ - GitHub Issues: [Report a bug](https://github.com/acorexui/acorex-ui/issues)
463
+ - Discussions: [Ask questions](https://github.com/acorexui/acorex-ui/discussions)