@acorex/components 21.0.0-next.3 → 21.0.0-next.31
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.
- package/accordion/index.d.ts +0 -1
- package/autocomplete/index.d.ts +23 -9
- package/button/index.d.ts +38 -17
- package/chips/index.d.ts +3 -8
- package/code-editor/README.md +291 -1
- package/code-editor/index.d.ts +260 -12
- package/command/index.d.ts +1 -0
- package/conversation2/README.md +426 -0
- package/conversation2/index.d.ts +6139 -0
- package/data-table/index.d.ts +79 -7
- package/dialog/index.d.ts +1 -1
- package/drawer/README.md +2 -2
- package/drawer/index.d.ts +33 -57
- package/drawer-legacy/README.md +3 -0
- package/drawer-legacy/index.d.ts +86 -0
- package/editor/README.md +3 -0
- package/editor/index.d.ts +79 -0
- package/fesm2022/acorex-components-accordion.mjs +19 -24
- package/fesm2022/acorex-components-accordion.mjs.map +1 -1
- package/fesm2022/acorex-components-action-sheet.mjs +12 -12
- package/fesm2022/acorex-components-action-sheet.mjs.map +1 -1
- package/fesm2022/acorex-components-alert.mjs +14 -14
- package/fesm2022/acorex-components-alert.mjs.map +1 -1
- package/fesm2022/acorex-components-aspect-ratio.mjs +4 -4
- package/fesm2022/acorex-components-aspect-ratio.mjs.map +1 -1
- package/fesm2022/acorex-components-audio-wave.mjs +12 -11
- package/fesm2022/acorex-components-audio-wave.mjs.map +1 -1
- package/fesm2022/acorex-components-autocomplete.mjs +30 -13
- package/fesm2022/acorex-components-autocomplete.mjs.map +1 -1
- package/fesm2022/acorex-components-avatar.mjs +13 -13
- package/fesm2022/acorex-components-avatar.mjs.map +1 -1
- package/fesm2022/acorex-components-badge.mjs +10 -10
- package/fesm2022/acorex-components-badge.mjs.map +1 -1
- package/fesm2022/acorex-components-bottom-navigation.mjs +12 -12
- package/fesm2022/acorex-components-bottom-navigation.mjs.map +1 -1
- package/fesm2022/acorex-components-breadcrumbs.mjs +12 -12
- package/fesm2022/acorex-components-breadcrumbs.mjs.map +1 -1
- package/fesm2022/acorex-components-button-group.mjs +17 -19
- package/fesm2022/acorex-components-button-group.mjs.map +1 -1
- package/fesm2022/acorex-components-button.mjs +78 -29
- package/fesm2022/acorex-components-button.mjs.map +1 -1
- package/fesm2022/acorex-components-calendar.mjs +18 -18
- package/fesm2022/acorex-components-calendar.mjs.map +1 -1
- package/fesm2022/acorex-components-check-box.mjs +11 -11
- package/fesm2022/acorex-components-check-box.mjs.map +1 -1
- package/fesm2022/acorex-components-chips.mjs +12 -14
- package/fesm2022/acorex-components-chips.mjs.map +1 -1
- package/fesm2022/acorex-components-circular-progress.mjs +13 -11
- package/fesm2022/acorex-components-circular-progress.mjs.map +1 -1
- package/fesm2022/acorex-components-code-editor.mjs +494 -162
- package/fesm2022/acorex-components-code-editor.mjs.map +1 -1
- package/fesm2022/acorex-components-collapse.mjs +13 -28
- package/fesm2022/acorex-components-collapse.mjs.map +1 -1
- package/fesm2022/acorex-components-color-box.mjs +11 -11
- package/fesm2022/acorex-components-color-box.mjs.map +1 -1
- package/fesm2022/acorex-components-color-palette.mjs +32 -32
- package/fesm2022/acorex-components-color-palette.mjs.map +1 -1
- package/fesm2022/acorex-components-command.mjs +18 -11
- package/fesm2022/acorex-components-command.mjs.map +1 -1
- package/fesm2022/acorex-components-comment.mjs +34 -34
- package/fesm2022/acorex-components-comment.mjs.map +1 -1
- package/fesm2022/acorex-components-conversation.mjs +56 -65
- package/fesm2022/acorex-components-conversation.mjs.map +1 -1
- package/fesm2022/acorex-components-conversation2.mjs +17641 -0
- package/fesm2022/acorex-components-conversation2.mjs.map +1 -0
- package/fesm2022/acorex-components-cron-job.mjs +53 -53
- package/fesm2022/acorex-components-cron-job.mjs.map +1 -1
- package/fesm2022/acorex-components-data-list.mjs +5 -5
- package/fesm2022/acorex-components-data-list.mjs.map +1 -1
- package/fesm2022/acorex-components-data-pager.mjs +53 -41
- package/fesm2022/acorex-components-data-pager.mjs.map +1 -1
- package/fesm2022/acorex-components-data-table.mjs +462 -105
- package/fesm2022/acorex-components-data-table.mjs.map +1 -1
- package/fesm2022/acorex-components-datetime-box.mjs +10 -10
- package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
- package/fesm2022/acorex-components-datetime-input.mjs +8 -8
- package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
- package/fesm2022/acorex-components-datetime-picker.mjs +11 -11
- package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
- package/fesm2022/acorex-components-decorators.mjs +96 -54
- package/fesm2022/acorex-components-decorators.mjs.map +1 -1
- package/fesm2022/acorex-components-dialog.mjs +26 -16
- package/fesm2022/acorex-components-dialog.mjs.map +1 -1
- package/fesm2022/acorex-components-drawer-legacy.mjs +218 -0
- package/fesm2022/acorex-components-drawer-legacy.mjs.map +1 -0
- package/fesm2022/acorex-components-drawer.mjs +66 -150
- package/fesm2022/acorex-components-drawer.mjs.map +1 -1
- package/fesm2022/acorex-components-dropdown-button.mjs +9 -9
- package/fesm2022/acorex-components-dropdown-button.mjs.map +1 -1
- package/fesm2022/acorex-components-dropdown.mjs +18 -16
- package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
- package/fesm2022/acorex-components-editor.mjs +195 -0
- package/fesm2022/acorex-components-editor.mjs.map +1 -0
- package/fesm2022/acorex-components-file-explorer.mjs +28 -28
- package/fesm2022/acorex-components-file-explorer.mjs.map +1 -1
- package/fesm2022/acorex-components-flow-chart.mjs +18 -18
- package/fesm2022/acorex-components-flow-chart.mjs.map +1 -1
- package/fesm2022/acorex-components-form.mjs +52 -35
- package/fesm2022/acorex-components-form.mjs.map +1 -1
- package/fesm2022/acorex-components-grid-layout-builder.mjs +14 -15
- package/fesm2022/acorex-components-grid-layout-builder.mjs.map +1 -1
- package/fesm2022/acorex-components-image-editor.mjs +166 -126
- package/fesm2022/acorex-components-image-editor.mjs.map +1 -1
- package/fesm2022/acorex-components-image.mjs +10 -10
- package/fesm2022/acorex-components-image.mjs.map +1 -1
- package/fesm2022/acorex-components-json-viewer.mjs +9 -9
- package/fesm2022/acorex-components-json-viewer.mjs.map +1 -1
- package/fesm2022/acorex-components-kanban.mjs +9 -7
- package/fesm2022/acorex-components-kanban.mjs.map +1 -1
- package/fesm2022/acorex-components-kbd.mjs +8 -8
- package/fesm2022/acorex-components-kbd.mjs.map +1 -1
- package/fesm2022/acorex-components-label.mjs +9 -9
- package/fesm2022/acorex-components-label.mjs.map +1 -1
- package/fesm2022/acorex-components-list.mjs +10 -10
- package/fesm2022/acorex-components-list.mjs.map +1 -1
- package/fesm2022/acorex-components-loading-dialog.mjs +22 -13
- package/fesm2022/acorex-components-loading-dialog.mjs.map +1 -1
- package/fesm2022/acorex-components-loading.mjs +23 -23
- package/fesm2022/acorex-components-loading.mjs.map +1 -1
- package/fesm2022/acorex-components-map.mjs +16 -15
- package/fesm2022/acorex-components-map.mjs.map +1 -1
- package/fesm2022/acorex-components-media-viewer.mjs +78 -97
- package/fesm2022/acorex-components-media-viewer.mjs.map +1 -1
- package/fesm2022/acorex-components-menu.mjs +24 -24
- package/fesm2022/acorex-components-menu.mjs.map +1 -1
- package/fesm2022/{acorex-components-modal-acorex-components-modal-h5Y-qcbh.mjs → acorex-components-modal-acorex-components-modal-BmmAkCKJ.mjs} +24 -24
- package/fesm2022/acorex-components-modal-acorex-components-modal-BmmAkCKJ.mjs.map +1 -0
- package/fesm2022/acorex-components-modal-modal-content.component-5GqTzNOs.mjs +214 -0
- package/fesm2022/acorex-components-modal-modal-content.component-5GqTzNOs.mjs.map +1 -0
- package/fesm2022/acorex-components-modal.mjs +1 -1
- package/fesm2022/acorex-components-navbar.mjs +9 -9
- package/fesm2022/acorex-components-navbar.mjs.map +1 -1
- package/fesm2022/acorex-components-notification.mjs +16 -23
- package/fesm2022/acorex-components-notification.mjs.map +1 -1
- package/fesm2022/acorex-components-number-box-legacy.mjs +412 -0
- package/fesm2022/acorex-components-number-box-legacy.mjs.map +1 -0
- package/fesm2022/acorex-components-number-box.mjs +98 -331
- package/fesm2022/acorex-components-number-box.mjs.map +1 -1
- package/fesm2022/acorex-components-otp.mjs +10 -10
- package/fesm2022/acorex-components-otp.mjs.map +1 -1
- package/fesm2022/acorex-components-page.mjs +10 -10
- package/fesm2022/acorex-components-page.mjs.map +1 -1
- package/fesm2022/acorex-components-paint.mjs +35 -40
- package/fesm2022/acorex-components-paint.mjs.map +1 -1
- package/fesm2022/acorex-components-password-box.mjs +13 -13
- package/fesm2022/acorex-components-password-box.mjs.map +1 -1
- package/fesm2022/acorex-components-pdf-reader.mjs +8 -8
- package/fesm2022/acorex-components-pdf-reader.mjs.map +1 -1
- package/fesm2022/acorex-components-phone-box.mjs +10 -10
- package/fesm2022/acorex-components-phone-box.mjs.map +1 -1
- package/fesm2022/acorex-components-picker.mjs +17 -17
- package/fesm2022/acorex-components-picker.mjs.map +1 -1
- package/fesm2022/acorex-components-popover.mjs +12 -12
- package/fesm2022/acorex-components-popover.mjs.map +1 -1
- package/fesm2022/acorex-components-popup.mjs +13 -13
- package/fesm2022/acorex-components-popup.mjs.map +1 -1
- package/fesm2022/acorex-components-progress-bar.mjs +11 -9
- package/fesm2022/acorex-components-progress-bar.mjs.map +1 -1
- package/fesm2022/acorex-components-qrcode.mjs +8 -8
- package/fesm2022/acorex-components-qrcode.mjs.map +1 -1
- package/fesm2022/acorex-components-query-builder.mjs +9 -9
- package/fesm2022/acorex-components-query-builder.mjs.map +1 -1
- package/fesm2022/acorex-components-radio.mjs +7 -7
- package/fesm2022/acorex-components-radio.mjs.map +1 -1
- package/fesm2022/acorex-components-rail-navigation.mjs +40 -38
- package/fesm2022/acorex-components-rail-navigation.mjs.map +1 -1
- package/fesm2022/acorex-components-range-slider.mjs +11 -11
- package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
- package/fesm2022/acorex-components-rate-picker.mjs +20 -35
- package/fesm2022/acorex-components-rate-picker.mjs.map +1 -1
- package/fesm2022/acorex-components-rest-api-generator.mjs +23 -23
- package/fesm2022/acorex-components-rest-api-generator.mjs.map +1 -1
- package/fesm2022/acorex-components-result.mjs +8 -8
- package/fesm2022/acorex-components-result.mjs.map +1 -1
- package/fesm2022/acorex-components-routing-progress.mjs +8 -8
- package/fesm2022/acorex-components-routing-progress.mjs.map +1 -1
- package/fesm2022/acorex-components-rrule.mjs +111 -16
- package/fesm2022/acorex-components-rrule.mjs.map +1 -1
- package/fesm2022/acorex-components-scheduler-picker.mjs +2339 -0
- package/fesm2022/acorex-components-scheduler-picker.mjs.map +1 -0
- package/fesm2022/acorex-components-scheduler.mjs +52 -52
- package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
- package/fesm2022/acorex-components-scss.mjs +4 -4
- package/fesm2022/acorex-components-scss.mjs.map +1 -1
- package/fesm2022/acorex-components-search-box.mjs +23 -12
- package/fesm2022/acorex-components-search-box.mjs.map +1 -1
- package/fesm2022/acorex-components-select-box.mjs +36 -17
- package/fesm2022/acorex-components-select-box.mjs.map +1 -1
- package/fesm2022/acorex-components-selection-list-2.mjs +10 -10
- package/fesm2022/acorex-components-selection-list-2.mjs.map +1 -1
- package/fesm2022/acorex-components-selection-list.mjs +10 -10
- package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
- package/fesm2022/acorex-components-side-menu.mjs +31 -38
- package/fesm2022/acorex-components-side-menu.mjs.map +1 -1
- package/fesm2022/acorex-components-skeleton.mjs +8 -8
- package/fesm2022/acorex-components-skeleton.mjs.map +1 -1
- package/fesm2022/acorex-components-slider.mjs +11 -11
- package/fesm2022/acorex-components-slider.mjs.map +1 -1
- package/fesm2022/acorex-components-sliding-item.mjs +17 -17
- package/fesm2022/acorex-components-sliding-item.mjs.map +1 -1
- package/fesm2022/acorex-components-step-wizard.mjs +16 -16
- package/fesm2022/acorex-components-step-wizard.mjs.map +1 -1
- package/fesm2022/acorex-components-switch.mjs +14 -14
- package/fesm2022/acorex-components-switch.mjs.map +1 -1
- package/fesm2022/acorex-components-tabs.mjs +20 -16
- package/fesm2022/acorex-components-tabs.mjs.map +1 -1
- package/fesm2022/acorex-components-tag-box.mjs +51 -21
- package/fesm2022/acorex-components-tag-box.mjs.map +1 -1
- package/fesm2022/acorex-components-tag.mjs +47 -11
- package/fesm2022/acorex-components-tag.mjs.map +1 -1
- package/fesm2022/acorex-components-text-area.mjs +9 -9
- package/fesm2022/acorex-components-text-area.mjs.map +1 -1
- package/fesm2022/acorex-components-text-box.mjs +13 -13
- package/fesm2022/acorex-components-text-box.mjs.map +1 -1
- package/fesm2022/acorex-components-time-duration.mjs +54 -14
- package/fesm2022/acorex-components-time-duration.mjs.map +1 -1
- package/fesm2022/acorex-components-time-line.mjs +14 -29
- package/fesm2022/acorex-components-time-line.mjs.map +1 -1
- package/fesm2022/acorex-components-toast.mjs +14 -14
- package/fesm2022/acorex-components-toast.mjs.map +1 -1
- package/fesm2022/acorex-components-toolbar.mjs +9 -9
- package/fesm2022/acorex-components-toolbar.mjs.map +1 -1
- package/fesm2022/acorex-components-tooltip.mjs +12 -12
- package/fesm2022/acorex-components-tooltip.mjs.map +1 -1
- package/fesm2022/acorex-components-tree-view.mjs +16 -45
- package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
- package/fesm2022/acorex-components-tree2.mjs +689 -0
- package/fesm2022/acorex-components-tree2.mjs.map +1 -0
- package/fesm2022/acorex-components-uploader.mjs +28 -641
- package/fesm2022/acorex-components-uploader.mjs.map +1 -1
- package/fesm2022/acorex-components-video-player.mjs +8 -8
- package/fesm2022/acorex-components-video-player.mjs.map +1 -1
- package/fesm2022/acorex-components-wysiwyg.mjs +213 -462
- package/fesm2022/acorex-components-wysiwyg.mjs.map +1 -1
- package/fesm2022/acorex-components.mjs.map +1 -1
- package/form/index.d.ts +3 -3
- package/grid-layout-builder/index.d.ts +1 -2
- package/image-editor/index.d.ts +8 -5
- package/loading/index.d.ts +1 -1
- package/media-viewer/index.d.ts +2 -3
- package/notification/index.d.ts +0 -2
- package/number-box/README.md +2 -2
- package/number-box/index.d.ts +31 -171
- package/number-box-legacy/README.md +3 -0
- package/number-box-legacy/index.d.ts +191 -0
- package/package.json +53 -26
- package/paint/index.d.ts +1 -6
- package/phone-box/index.d.ts +4 -4
- package/rate-picker/index.d.ts +5 -15
- package/rrule/index.d.ts +96 -1
- package/scheduler-picker/README.md +15 -0
- package/scheduler-picker/index.d.ts +1360 -0
- package/search-box/index.d.ts +6 -1
- package/select-box/index.d.ts +15 -10
- package/side-menu/index.d.ts +3 -2
- package/tag/index.d.ts +8 -2
- package/tag-box/index.d.ts +12 -3
- package/time-duration/index.d.ts +19 -3
- package/tree2/README.md +3 -0
- package/tree2/index.d.ts +337 -0
- package/uploader/index.d.ts +4 -331
- package/wysiwyg/index.d.ts +57 -159
- package/drawer-2/README.md +0 -3
- package/drawer-2/index.d.ts +0 -62
- package/fesm2022/acorex-components-drawer-2.mjs +0 -134
- package/fesm2022/acorex-components-drawer-2.mjs.map +0 -1
- package/fesm2022/acorex-components-modal-acorex-components-modal-h5Y-qcbh.mjs.map +0 -1
- package/fesm2022/acorex-components-modal-modal-content.component-B6tyMLdU.mjs +0 -235
- package/fesm2022/acorex-components-modal-modal-content.component-B6tyMLdU.mjs.map +0 -1
- package/fesm2022/acorex-components-number-box-2.mjs +0 -183
- package/fesm2022/acorex-components-number-box-2.mjs.map +0 -1
- package/number-box-2/README.md +0 -3
- package/number-box-2/index.d.ts +0 -41
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-components-conversation2.mjs","sources":["../../../../packages/components/conversation2/src/lib/services/api/api-types.ts","../../../../packages/components/conversation2/src/lib/services/api/user-api.abstract.ts","../../../../packages/components/conversation2/src/lib/services/api/conversation-api.abstract.ts","../../../../packages/components/conversation2/src/lib/services/api/message-api.abstract.ts","../../../../packages/components/conversation2/src/lib/services/api/realtime-api.abstract.ts","../../../../packages/components/conversation2/src/lib/services/api/index.ts","../../../../packages/components/conversation2/src/lib/tokens/conversation-config.interface.ts","../../../../packages/components/conversation2/src/lib/tokens/conversation-config.defaults.ts","../../../../packages/components/conversation2/src/lib/tokens/conversation.tokens.ts","../../../../packages/components/conversation2/src/lib/tokens/registry-config.tokens.ts","../../../../packages/components/conversation2/src/lib/services/error-handler.service.ts","../../../../packages/components/conversation2/src/lib/services/conversation-store.service.ts","../../../../packages/components/conversation2/src/lib/utils/validation.utils.ts","../../../../packages/components/conversation2/src/lib/registries/composer-action.registry.ts","../../../../packages/components/conversation2/src/lib/registries/composer-tab.registry.ts","../../../../packages/components/conversation2/src/lib/registries/base-registry.abstract.ts","../../../../packages/components/conversation2/src/lib/registries/conversation-item-action.registry.ts","../../../../packages/components/conversation2/src/lib/registries/conversation-tab.registry.ts","../../../../packages/components/conversation2/src/lib/registries/info-bar-action.registry.ts","../../../../packages/components/conversation2/src/lib/registries/message-action.registry.ts","../../../../packages/components/conversation2/src/lib/plugins/apis/indexeddb-storage.ts","../../../../packages/components/conversation2/src/lib/plugins/apis/shared-storage.ts","../../../../packages/components/conversation2/src/lib/plugins/apis/indexeddb-user-api.service.ts","../../../../packages/components/conversation2/src/lib/plugins/apis/indexeddb-conversation-api.service.ts","../../../../packages/components/conversation2/src/lib/plugins/apis/indexeddb-message-api.service.ts","../../../../packages/components/conversation2/src/lib/plugins/apis/indexeddb-realtime-api.service.ts","../../../../packages/components/conversation2/src/lib/plugins/apis/ai-responder.service.ts","../../../../packages/components/conversation2/src/lib/plugins/apis/indexeddb-message-ai-api.service.ts","../../../../packages/components/conversation2/src/lib/plugins/apis/index.ts","../../../../packages/components/conversation2/src/lib/services/file-upload.service.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/picker-footer/picker-footer.component.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/picker-header/picker-header.component.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/audio-picker/audio-picker.component.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/emoji-tab/emoji-tab.component.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/emoji-tab/index.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/sticker-tab/sticker-tab.component.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/composer-tabs/default-tabs.plugin.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/composer-tabs/index.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/contact-picker/contact-picker.component.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/file-picker/file-picker.component.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/image-picker/image-picker.component.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/location-picker/location-picker.component.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/video-picker/video-picker.component.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/components/voice-recorder/voice-recorder.component.ts","../../../../packages/components/conversation2/src/lib/plugins/composer/composer-actions/composer-actions.plugin.ts","../../../../packages/components/conversation2/src/lib/components/shared/avatar-picker.component.ts","../../../../packages/components/conversation2/src/lib/utils/date-utils.service.ts","../../../../packages/components/conversation2/src/lib/utils/message-utils.service.ts","../../../../packages/components/conversation2/src/lib/plugins/info-bar/components/conversation-info-panel.component.ts","../../../../packages/components/conversation2/src/lib/plugins/info-bar/components/search.component.ts","../../../../packages/components/conversation2/src/lib/plugins/info-bar/info-bar-actions/default-actions.plugin.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/components/audio-renderer/audio-renderer.component.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/components/contact-renderer/contact-renderer.component.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/components/fallback-renderer/fallback-renderer.component.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/components/file-renderer/file-renderer.component.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/components/image-renderer/image-renderer.component.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/components/location-renderer/location-renderer.component.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/components/sticker-renderer/sticker-renderer.component.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/components/system-renderer/system-renderer.component.ts","../../../../packages/components/conversation2/src/lib/utils/sanitizer.service.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/components/text-renderer/text-renderer.component.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/components/video-renderer/video-renderer.component.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/components/voice-renderer/voice-renderer.component.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/message-actions/default-actions.plugin.ts","../../../../packages/components/conversation2/src/lib/plugins/message-list/message-renderers/default-renderers.plugin.ts","../../../../packages/components/conversation2/src/lib/plugins/sidebar/conversation-item-actions/default-actions.plugin.ts","../../../../packages/components/conversation2/src/lib/plugins/sidebar/conversation-tabs/default-tabs.plugin.ts","../../../../packages/components/conversation2/src/lib/plugins/sidebar/conversation-tabs/index.ts","../../../../packages/components/conversation2/src/lib/registries/message-renderer.registry.ts","../../../../packages/components/conversation2/src/lib/services/registry.service.ts","../../../../packages/components/conversation2/src/lib/services/conversation.service.ts","../../../../packages/components/conversation2/src/lib/components/composer/composer-popup.component.ts","../../../../packages/components/conversation2/src/lib/components/composer/composer.service.ts","../../../../packages/components/conversation2/src/lib/components/message-list/message-list.service.ts","../../../../packages/components/conversation2/src/lib/components/composer/composer.component.ts","../../../../packages/components/conversation2/src/lib/components/container/conversation-container.component.ts","../../../../packages/components/conversation2/src/lib/components/container/conversation-container.directive.ts","../../../../packages/components/conversation2/src/lib/components/info-bar/info-bar.service.ts","../../../../packages/components/conversation2/src/lib/components/info-bar/members-popover.component.ts","../../../../packages/components/conversation2/src/lib/components/info-bar/info-bar.component.ts","../../../../packages/components/conversation2/src/lib/directives/infinite-scroll.directive.ts","../../../../packages/components/conversation2/src/lib/components/message-list/message-list.component.ts","../../../../packages/components/conversation2/src/lib/components/message-list/forward-message-dialog.component.ts","../../../../packages/components/conversation2/src/lib/components/sidebar/new-conversation-dialog.component.ts","../../../../packages/components/conversation2/src/lib/components/sidebar/conversation-item.component.ts","../../../../packages/components/conversation2/src/lib/components/sidebar/sidebar.service.ts","../../../../packages/components/conversation2/src/lib/components/sidebar/sidebar.component.ts","../../../../packages/components/conversation2/src/lib/models/conversation.model.ts","../../../../packages/components/conversation2/src/lib/models/message-payloads.model.ts","../../../../packages/components/conversation2/src/lib/models/message.model.ts","../../../../packages/components/conversation2/src/lib/models/participant.model.ts","../../../../packages/components/conversation2/src/lib/conversation2.module.ts","../../../../packages/components/conversation2/src/lib/constants/error-messages.constants.ts","../../../../packages/components/conversation2/src/lib/constants/index.ts","../../../../packages/components/conversation2/src/lib/index.ts","../../../../packages/components/conversation2/src/acorex-components-conversation2.ts"],"sourcesContent":["/**\n * Shared API Types\n * Common types used across all API services\n */\n\n/**\n * Pagination parameters\n */\nexport interface AXPagination {\n /** Page number (0-based) */\n page: number;\n\n /** Items per page */\n pageSize: number;\n\n /** Cursor for cursor-based pagination (optional) */\n cursor?: string;\n\n /** Sort field */\n sortBy?: string;\n\n /** Sort direction */\n sortDirection?: 'asc' | 'desc';\n}\n\n/**\n * Paginated response\n */\nexport interface AXPaginatedResult<T> {\n /** Result items */\n items: T[];\n\n /** Total count (if available) */\n total?: number;\n\n /** Next page cursor (for cursor-based pagination) */\n nextCursor?: string;\n\n /** Previous page cursor */\n prevCursor?: string;\n\n /** Whether there are more pages */\n hasMore: boolean;\n\n /** Current page number */\n page?: number;\n\n /** Total pages */\n totalPages?: number;\n}\n\n/**\n * Connection status\n */\nexport type AXConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';\n\n/**\n * API Error with details\n */\nexport interface AXApiError {\n /** Error code */\n code: string;\n\n /** Error message */\n message: string;\n\n /** HTTP status code */\n statusCode?: number;\n\n /** Additional details */\n details?: unknown;\n\n /** Timestamp */\n timestamp?: Date;\n}\n\n/**\n * User presence status\n */\nexport type AXPresenceStatus = 'online' | 'offline' | 'away' | 'busy' | 'invisible';\n\n/**\n * User role in conversation\n */\nexport type AXUserRole = 'owner' | 'admin' | 'member' | 'guest';\n","/**\n * Abstract User Management API\n * Handle user profile management and user operations for conversations\n */\n\nimport type { AXParticipant, AXPresenceUpdate } from '../../models';\nimport type { AXApiError, AXPresenceStatus } from './api-types';\n\n/**\n * User profile update data\n */\nexport interface AXUserProfileUpdate {\n /** Display name */\n name?: string;\n /** Avatar URL */\n avatar?: string;\n /** Bio/status text */\n bio?: string;\n /** Phone number */\n phone?: string;\n /** Email */\n email?: string;\n /** Custom fields */\n custom?: Record<string, any>;\n}\n\n/**\n * User search filters\n */\nexport interface AXUserSearchFilters {\n /** Search query */\n query?: string;\n /** Filter by online status */\n onlineOnly?: boolean;\n /** Exclude blocked users */\n excludeBlocked?: boolean;\n /** Limit results */\n limit?: number;\n}\n\n/**\n * Block/Report reason\n */\nexport interface AXBlockReportReason {\n /** Reason code */\n code: string;\n /** Description */\n description?: string;\n}\n\n/**\n * Abstract User Management API\n *\n * Implement this abstract class to handle user management for conversations.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyUserApi extends AXUserApi {\n * constructor(private http: HttpClient) {\n * super();\n * }\n *\n * async getCurrentUser(): Promise<AXParticipant> {\n * const response = await this.http.get('/api/users/me').toPromise();\n * return response;\n * }\n *\n * // ... implement other methods\n * }\n * ```\n */\nexport abstract class AXUserApi {\n\n // =====================\n // User Profile\n // =====================\n\n /**\n * Get current authenticated user\n *\n * @returns Current user information\n * @throws {AXApiError} If user is not authenticated\n */\n abstract getCurrentUser(): Promise<AXParticipant>;\n\n /**\n * Update current user profile\n *\n * @param updates - Profile updates\n * @returns Updated user information\n * @throws {AXApiError} If update fails\n */\n abstract updateProfile(updates: AXUserProfileUpdate): Promise<AXParticipant>;\n\n /**\n * Upload user avatar\n *\n * @param file - Avatar image file\n * @returns Avatar URL\n * @throws {AXApiError} If upload fails\n */\n abstract uploadAvatar(file: File): Promise<string>;\n\n // =====================\n // User Discovery\n // =====================\n\n /**\n * Get available users for conversation creation\n *\n * @param filters - Search filters\n * @returns List of users\n * @throws {AXApiError} If request fails\n */\n abstract getUsers(filters?: AXUserSearchFilters): Promise<AXParticipant[]>;\n\n /**\n * Search users by query\n *\n * @param query - Search query\n * @returns Matching users\n * @throws {AXApiError} If search fails\n */\n abstract searchUsers(query: string): Promise<AXParticipant[]>;\n\n /**\n * Get user by ID\n *\n * @param userId - User ID\n * @returns User information\n * @throws {AXApiError} If user not found\n */\n abstract getUserById(userId: string): Promise<AXParticipant>;\n\n /**\n * Get multiple users by IDs\n *\n * @param userIds - Array of user IDs\n * @returns Array of users\n * @throws {AXApiError} If request fails\n */\n abstract getUsersByIds(userIds: string[]): Promise<AXParticipant[]>;\n\n // =====================\n // Presence Management\n // =====================\n\n /**\n * Get user presence status\n *\n * @param userId - User ID\n * @returns Presence information\n * @throws {AXApiError} If request fails\n */\n abstract getUserPresence(userId: string): Promise<AXPresenceUpdate>;\n\n /**\n * Update current user presence\n *\n * @param status - Presence status\n * @param statusText - Optional status text\n * @throws {AXApiError} If update fails\n */\n abstract updatePresence(status: AXPresenceStatus, statusText?: string): Promise<void>;\n\n // =====================\n // User Blocking & Reporting\n // =====================\n\n /**\n * Block a user\n *\n * @param userId - User ID to block\n * @param reason - Optional reason\n * @throws {AXApiError} If blocking fails\n */\n abstract blockUser(userId: string, reason?: AXBlockReportReason): Promise<void>;\n\n /**\n * Unblock a user\n *\n * @param userId - User ID to unblock\n * @throws {AXApiError} If unblocking fails\n */\n abstract unblockUser(userId: string): Promise<void>;\n\n /**\n * Get list of blocked users\n *\n * @returns Array of blocked user IDs\n * @throws {AXApiError} If request fails\n */\n abstract getBlockedUsers(): Promise<string[]>;\n\n /**\n * Report a user\n *\n * @param userId - User ID to report\n * @param reason - Report reason\n * @throws {AXApiError} If reporting fails\n */\n abstract reportUser(userId: string, reason: AXBlockReportReason): Promise<void>;\n\n // =====================\n // User Settings & Preferences\n // =====================\n\n /**\n * Get user settings\n *\n * @returns User settings\n * @throws {AXApiError} If request fails\n */\n abstract getUserSettings(): Promise<Record<string, any>>;\n\n /**\n * Update user settings\n *\n * @param settings - Settings to update\n * @throws {AXApiError} If update fails\n */\n abstract updateUserSettings(settings: Record<string, any>): Promise<void>;\n\n // =====================\n // Error Handling Helper\n // =====================\n\n /**\n * Create an API error\n * Helper method for consistent error creation\n *\n * @param code - Error code\n * @param message - Error message\n * @param statusCode - HTTP status code\n * @param details - Additional details\n * @returns API error object\n */\n protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXApiError {\n return {\n code,\n message,\n statusCode,\n details,\n timestamp: new Date(),\n };\n }\n}\n","/**\n * Abstract Conversation Management API\n * Handle conversation CRUD operations, participants, and settings\n */\n\nimport type { AXConversation, AXConversationType, AXParticipant } from '../../models';\nimport type { AXApiError, AXPaginatedResult, AXPagination, AXUserRole } from './api-types';\n\n/**\n * Conversation creation data\n */\nexport interface AXConversationCreateData {\n /** Conversation type */\n type: AXConversationType;\n /** Participant user IDs */\n participantIds: string[];\n /** Conversation title (for groups/channels) */\n title?: string;\n /** Conversation description */\n description?: string;\n /** Avatar URL */\n avatar?: string;\n /** Custom metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Conversation update data\n */\nexport interface AXConversationUpdateData {\n /** Conversation title */\n title?: string;\n /** Conversation description */\n description?: string;\n /** Avatar URL */\n avatar?: string;\n /** Custom metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Conversation filter options\n */\nexport interface AXConversationFilters {\n /** Filter by type */\n type?: AXConversationType;\n /** Filter by unread */\n unread?: boolean;\n /** Filter by archived */\n archived?: boolean;\n /** Filter by pinned */\n pinned?: boolean;\n /** Search query */\n searchQuery?: string;\n /** Filter by tags */\n tags?: string[];\n /** Custom filters */\n custom?: Record<string, any>;\n}\n\n/**\n * Conversation settings update\n */\nexport interface AXConversationSettingsUpdate {\n /** Muted until timestamp */\n mutedUntil?: Date;\n /** Show notifications */\n notifications?: boolean;\n /** Custom notification sound */\n notificationSound?: string;\n /** Show message preview in notifications */\n showPreview?: boolean;\n /** Custom settings */\n custom?: Record<string, any>;\n}\n\n/**\n * Participant update data\n */\nexport interface AXParticipantUpdate {\n /** User ID */\n userId: string;\n /** New role */\n role?: AXUserRole;\n /** Custom permissions */\n permissions?: Record<string, boolean>;\n}\n\n/**\n * Abstract Conversation Management API\n *\n * Implement this abstract class to handle conversation operations.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyConversationApi extends AXConversationManagementApi {\n * constructor(private http: HttpClient) {\n * super();\n * }\n *\n * async createConversation(data: AXConversationCreateData): Promise<AXConversation> {\n * const response = await this.http.post('/api/conversations', data).toPromise();\n * return response;\n * }\n *\n * // ... implement other methods\n * }\n * ```\n */\nexport abstract class AXConversationApi {\n // =====================\n // Conversation CRUD\n // =====================\n\n /**\n * Create a new conversation\n *\n * @param data - Conversation creation data\n * @returns Created conversation\n * @throws {AXApiError} If creation fails\n */\n abstract createConversation(data: AXConversationCreateData): Promise<AXConversation>;\n\n /**\n * Get conversation by ID\n *\n * @param conversationId - Conversation ID\n * @returns Conversation details\n * @throws {AXApiError} If conversation not found\n */\n abstract getConversation(conversationId: string): Promise<AXConversation>;\n\n /**\n * Get conversations list with pagination\n *\n * @param pagination - Pagination parameters\n * @param filters - Optional filters\n * @returns Paginated conversation list\n * @throws {AXApiError} If request fails\n */\n abstract getConversations(\n pagination: AXPagination,\n filters?: AXConversationFilters,\n ): Promise<AXPaginatedResult<AXConversation>>;\n\n /**\n * Update conversation details\n *\n * @param conversationId - Conversation ID\n * @param updates - Update data\n * @returns Updated conversation\n * @throws {AXApiError} If update fails\n */\n abstract updateConversation(conversationId: string, updates: AXConversationUpdateData): Promise<AXConversation>;\n\n /**\n * Delete conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If deletion fails\n */\n abstract deleteConversation(conversationId: string): Promise<boolean>;\n\n // =====================\n // Conversation Actions\n // =====================\n\n /**\n * Archive conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If archiving fails\n */\n abstract archiveConversation(conversationId: string): Promise<void>;\n\n /**\n * Unarchive conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If unarchiving fails\n */\n abstract unarchiveConversation(conversationId: string): Promise<void>;\n\n /**\n * Pin conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If pinning fails\n */\n abstract pinConversation(conversationId: string): Promise<void>;\n\n /**\n * Unpin conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If unpinning fails\n */\n abstract unpinConversation(conversationId: string): Promise<void>;\n\n /**\n * Mark conversation as read\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If marking fails\n */\n abstract markConversationAsRead(conversationId: string): Promise<void>;\n\n /**\n * Mark conversation as unread\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If marking fails\n */\n abstract markConversationAsUnread(conversationId: string): Promise<void>;\n\n // =====================\n // Search & Filter\n // =====================\n\n /**\n * Search conversations\n *\n * @param query - Search query\n * @returns Matching conversations\n * @throws {AXApiError} If search fails\n */\n abstract searchConversations(query: string): Promise<AXConversation[]>;\n\n /**\n * Filter conversations\n *\n * @param filters - Filter options\n * @param pagination - Pagination parameters\n * @returns Filtered conversations\n * @throws {AXApiError} If filtering fails\n */\n abstract filterConversations(\n filters: AXConversationFilters,\n pagination?: AXPagination,\n ): Promise<AXPaginatedResult<AXConversation>>;\n\n // =====================\n // Participant Management\n // =====================\n\n /**\n * Get conversation participants\n *\n * @param conversationId - Conversation ID\n * @returns List of participants\n * @throws {AXApiError} If request fails\n */\n abstract getParticipants(conversationId: string): Promise<AXParticipant[]>;\n\n /**\n * Add participants to conversation\n *\n * @param conversationId - Conversation ID\n * @param userIds - User IDs to add\n * @returns Updated conversation\n * @throws {AXApiError} If adding fails\n */\n abstract addParticipants(conversationId: string, userIds: string[]): Promise<AXConversation>;\n\n /**\n * Remove participant from conversation\n *\n * @param conversationId - Conversation ID\n * @param userId - User ID to remove\n * @returns Updated conversation\n * @throws {AXApiError} If removal fails\n */\n abstract removeParticipant(conversationId: string, userId: string): Promise<AXConversation>;\n\n /**\n * Leave conversation (remove self)\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If leaving fails\n */\n abstract leaveConversation(conversationId: string): Promise<void>;\n\n /**\n * Update participant role/permissions\n *\n * @param conversationId - Conversation ID\n * @param update - Participant update data\n * @returns Updated conversation\n * @throws {AXApiError} If update fails\n */\n abstract updateParticipant(conversationId: string, update: AXParticipantUpdate): Promise<AXConversation>;\n\n // =====================\n // Settings Management\n // =====================\n\n /**\n * Get conversation settings\n *\n * @param conversationId - Conversation ID\n * @returns Conversation settings\n * @throws {AXApiError} If request fails\n */\n abstract getConversationSettings(conversationId: string): Promise<AXConversationSettingsUpdate>;\n\n /**\n * Update conversation settings\n *\n * @param conversationId - Conversation ID\n * @param settings - Settings to update\n * @throws {AXApiError} If update fails\n */\n abstract updateConversationSettings(conversationId: string, settings: AXConversationSettingsUpdate): Promise<void>;\n\n /**\n * Mute conversation\n *\n * @param conversationId - Conversation ID\n * @param duration - Mute duration in milliseconds (undefined = forever)\n * @throws {AXApiError} If muting fails\n */\n abstract muteConversation(conversationId: string, duration?: number): Promise<void>;\n\n /**\n * Unmute conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If unmuting fails\n */\n abstract unmuteConversation(conversationId: string): Promise<void>;\n\n // =====================\n // Media & Files\n // =====================\n\n /**\n * Upload conversation avatar\n *\n * @param conversationId - Conversation ID\n * @param file - Avatar image file\n * @returns Avatar URL\n * @throws {AXApiError} If upload fails\n */\n abstract uploadConversationAvatar(conversationId: string, file: File): Promise<string>;\n\n /**\n * Get conversation media gallery\n *\n * @param conversationId - Conversation ID\n * @param pagination - Pagination parameters\n * @returns Paginated media items\n * @throws {AXApiError} If request fails\n */\n abstract getConversationMedia(conversationId: string, pagination?: AXPagination): Promise<AXPaginatedResult<any>>;\n\n // =====================\n // Conversation Metadata & Tags\n // =====================\n\n /**\n * Add tags to conversation\n *\n * @param conversationId - Conversation ID\n * @param tags - Tags to add\n * @throws {AXApiError} If adding fails\n */\n abstract addConversationTags(conversationId: string, tags: string[]): Promise<void>;\n\n /**\n * Remove tags from conversation\n *\n * @param conversationId - Conversation ID\n * @param tags - Tags to remove\n * @throws {AXApiError} If removal fails\n */\n abstract removeConversationTags(conversationId: string, tags: string[]): Promise<void>;\n\n /**\n * Get conversation tags\n *\n * @param conversationId - Conversation ID\n * @returns Array of tags\n * @throws {AXApiError} If request fails\n */\n abstract getConversationTags(conversationId: string): Promise<string[]>;\n\n // =====================\n // Conversation Permissions\n // =====================\n\n /**\n * Get conversation permissions for current user\n *\n * @param conversationId - Conversation ID\n * @returns User permissions\n * @throws {AXApiError} If request fails\n */\n abstract getConversationPermissions(conversationId: string): Promise<Record<string, boolean>>;\n\n /**\n * Update conversation permissions\n *\n * @param conversationId - Conversation ID\n * @param permissions - Permissions to update\n * @throws {AXApiError} If update fails\n */\n abstract updateConversationPermissions(conversationId: string, permissions: Record<string, boolean>): Promise<void>;\n\n // =====================\n // Draft Management\n // =====================\n\n /**\n * Save draft message for conversation\n *\n * @param conversationId - Conversation ID\n * @param draft - Draft text\n * @throws {AXApiError} If saving fails\n */\n abstract saveDraft(conversationId: string, draft: string): Promise<void>;\n\n /**\n * Get draft message for conversation\n *\n * @param conversationId - Conversation ID\n * @returns Draft text or null\n * @throws {AXApiError} If request fails\n */\n abstract getDraft(conversationId: string): Promise<string | null>;\n\n /**\n * Clear draft message for conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If clearing fails\n */\n abstract clearDraft(conversationId: string): Promise<void>;\n\n // =====================\n // Error Handling Helper\n // =====================\n\n /**\n * Create an API error\n * Helper method for consistent error creation\n *\n * @param code - Error code\n * @param message - Error message\n * @param statusCode - HTTP status code\n * @param details - Additional details\n * @returns API error object\n */\n protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXApiError {\n return {\n code,\n message,\n statusCode,\n details,\n timestamp: new Date(),\n };\n }\n}\n","/**\n * Abstract Message Management API\n * Handle message CRUD operations, reactions, and interactions\n */\n\nimport type { AXMessage, AXMessagePayload, AXSendMessageCommand } from '../../models';\nimport type { AXApiError, AXPaginatedResult, AXPagination } from './api-types';\n\n/**\n * Message search filters\n */\nexport interface AXMessageSearchFilters {\n /** Search query */\n query: string;\n /** Filter by sender ID */\n senderId?: string;\n /** Filter by message type */\n type?: string;\n /** Date range start */\n dateFrom?: Date;\n /** Date range end */\n dateTo?: Date;\n /** Include only messages with media */\n mediaOnly?: boolean;\n}\n\n/**\n * Message forward data\n */\nexport interface AXMessageForwardData {\n /** Message ID to forward */\n messageId: string;\n /** Target conversation IDs */\n conversationIds: string[];\n /** Optional caption */\n caption?: string;\n}\n\n/**\n * Read receipt information\n */\nexport interface AXReadReceipt {\n /** User ID */\n userId: string;\n /** User name */\n userName: string;\n /** Read timestamp */\n readAt: Date;\n}\n\n/**\n * Pinned message information\n */\nexport interface AXPinnedMessage {\n /** Message ID */\n messageId: string;\n /** Pinned by user ID */\n pinnedBy: string;\n /** Pinned timestamp */\n pinnedAt: Date;\n}\n\n/**\n * Abstract Message Management API\n *\n * Implement this abstract class to handle message operations.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyMessageApi extends AXMessageApi {\n * constructor(private http: HttpClient) {\n * super();\n * }\n *\n * async sendMessage(command: AXSendMessageCommand): Promise<AXMessage> {\n * const response = await this.http.post('/api/messages', command).toPromise();\n * return response;\n * }\n *\n * // ... implement other methods\n * }\n * ```\n */\nexport abstract class AXMessageApi {\n // =====================\n // Message CRUD\n // =====================\n\n /**\n * Send a new message\n *\n * @param command - Message send command\n * @returns Sent message with server-generated ID\n * @throws {AXApiError} If send fails\n */\n abstract sendMessage(command: AXSendMessageCommand): Promise<AXMessage>;\n\n /**\n * Get message by ID\n *\n * @param messageId - Message ID\n * @returns Message details\n * @throws {AXApiError} If message not found\n */\n abstract getMessage(messageId: string): Promise<AXMessage>;\n\n /**\n * Get messages for a conversation\n *\n * @param conversationId - Conversation ID\n * @param pagination - Pagination parameters\n * @returns Paginated message list\n * @throws {AXApiError} If request fails\n */\n abstract getMessages(conversationId: string, pagination: AXPagination): Promise<AXPaginatedResult<AXMessage>>;\n\n /**\n * Edit an existing message\n *\n * @param messageId - Message ID to edit\n * @param payload - New message payload\n * @returns Updated message\n * @throws {AXApiError} If edit fails or message not found\n */\n abstract editMessage(messageId: string, payload: AXMessagePayload): Promise<AXMessage>;\n\n /**\n * Delete a message\n *\n * @param messageId - Message ID to delete\n * @param forEveryone - Delete for all participants (vs just for current user)\n * @throws {AXApiError} If deletion fails\n */\n abstract deleteMessage(messageId: string, forEveryone?: boolean): Promise<void>;\n\n /**\n * Delete multiple messages\n *\n * @param messageIds - Array of message IDs to delete\n * @param forEveryone - Delete for all participants\n * @throws {AXApiError} If deletion fails\n */\n abstract deleteMessages(messageIds: string[], forEveryone?: boolean): Promise<void>;\n\n // =====================\n // Message Search\n // =====================\n\n /**\n * Search messages in a conversation\n *\n * @param conversationId - Conversation ID\n * @param filters - Search filters\n * @param pagination - Pagination parameters\n * @returns Matching messages\n * @throws {AXApiError} If search fails\n */\n abstract searchMessages(\n conversationId: string,\n filters: AXMessageSearchFilters,\n pagination?: AXPagination,\n ): Promise<AXPaginatedResult<AXMessage>>;\n\n /**\n * Search messages across all conversations\n *\n * @param filters - Search filters\n * @param pagination - Pagination parameters\n * @returns Matching messages\n * @throws {AXApiError} If search fails\n */\n abstract searchAllMessages(\n filters: AXMessageSearchFilters,\n pagination?: AXPagination,\n ): Promise<AXPaginatedResult<AXMessage>>;\n\n // =====================\n // Reactions\n // =====================\n\n /**\n * Add a reaction to a message\n *\n * @param messageId - Message ID\n * @param emoji - Emoji reaction\n * @throws {AXApiError} If reaction fails\n */\n abstract addReaction(messageId: string, emoji: string): Promise<void>;\n\n /**\n * Remove a reaction from a message\n *\n * @param messageId - Message ID\n * @param emoji - Emoji reaction to remove\n * @throws {AXApiError} If removal fails\n */\n abstract removeReaction(messageId: string, emoji: string): Promise<void>;\n\n /**\n * Get available reaction emojis\n *\n * @returns Array of available emoji reactions\n * @throws {AXApiError} If fetching fails\n */\n abstract getAvailableReactions(): Promise<string[]>;\n\n // =====================\n // Read Receipts\n // =====================\n\n /**\n * Mark messages as read\n *\n * @param conversationId - Conversation ID\n * @param messageIds - Array of message IDs to mark as read\n * @throws {AXApiError} If marking fails\n */\n abstract markAsRead(conversationId: string, messageIds: string[]): Promise<void>;\n\n /**\n * Mark conversation as unread\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If marking fails\n */\n abstract markAsUnread(conversationId: string): Promise<void>;\n\n /**\n * Get read receipts for a message\n *\n * @param messageId - Message ID\n * @returns Array of read receipts\n * @throws {AXApiError} If request fails\n */\n abstract getReadReceipts(messageId: string): Promise<AXReadReceipt[]>;\n\n // =====================\n // Message Actions\n // =====================\n\n /**\n * Forward message to other conversations\n *\n * @param data - Forward data\n * @returns Array of forwarded messages\n * @throws {AXApiError} If forwarding fails\n */\n abstract forwardMessage(data: AXMessageForwardData): Promise<AXMessage[]>;\n\n /**\n * Pin message in conversation\n *\n * @param conversationId - Conversation ID\n * @param messageId - Message ID to pin\n * @throws {AXApiError} If pinning fails\n */\n abstract pinMessage(conversationId: string, messageId: string): Promise<void>;\n\n /**\n * Unpin message from conversation\n *\n * @param conversationId - Conversation ID\n * @param messageId - Message ID to unpin\n * @throws {AXApiError} If unpinning fails\n */\n abstract unpinMessage(conversationId: string, messageId: string): Promise<void>;\n\n /**\n * Get pinned messages in conversation\n *\n * @param conversationId - Conversation ID\n * @returns Array of pinned messages\n * @throws {AXApiError} If request fails\n */\n abstract getPinnedMessages(conversationId: string): Promise<AXPinnedMessage[]>;\n\n // =====================\n // Message Threads (Replies)\n // =====================\n\n /**\n * Get replies to a message\n *\n * @param messageId - Original message ID\n * @param pagination - Pagination parameters\n * @returns Paginated replies\n * @throws {AXApiError} If request fails\n */\n abstract getMessageReplies(messageId: string, pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>>;\n\n /**\n * Get reply count for a message\n *\n * @param messageId - Original message ID\n * @returns Number of replies\n * @throws {AXApiError} If fetching fails\n */\n abstract getReplyCount(messageId: string): Promise<number>;\n\n /**\n * Get forward count for a message\n *\n * @param messageId - Original message ID\n * @returns Number of times forwarded\n * @throws {AXApiError} If fetching fails\n */\n abstract getForwardCount(messageId: string): Promise<number>;\n\n // =====================\n // Typing Indicators\n // =====================\n\n /**\n * Send typing indicator\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If sending fails\n */\n abstract sendTypingIndicator(conversationId: string): Promise<void>;\n\n /**\n * Stop typing indicator\n *\n * @param conversationId - Conversation ID\n * @throws {AXApiError} If stopping fails\n */\n abstract stopTypingIndicator(conversationId: string): Promise<void>;\n\n // =====================\n // File Upload\n // =====================\n\n /**\n * Upload a file/media\n *\n * @param file - File to upload\n * @param conversationId - Conversation ID for context\n * @returns Upload result with URL and metadata\n * @throws {AXApiError} If upload fails\n */\n abstract uploadFile(\n file: File,\n conversationId: string,\n ): Promise<{\n url: string;\n thumbnailUrl?: string;\n size: number;\n mimeType: string;\n metadata?: Record<string, any>;\n }>;\n\n // =====================\n // Message Metadata\n // =====================\n\n /**\n * Update message metadata\n *\n * @param messageId - Message ID\n * @param metadata - Metadata to update\n * @throws {AXApiError} If update fails\n */\n abstract updateMessageMetadata(messageId: string, metadata: Record<string, any>): Promise<void>;\n\n /**\n * Get message metadata\n *\n * @param messageId - Message ID\n * @returns Message metadata\n * @throws {AXApiError} If request fails\n */\n abstract getMessageMetadata(messageId: string): Promise<Record<string, any>>;\n\n // =====================\n // Message Status\n // =====================\n\n /**\n * Update message status\n *\n * @param messageId - Message ID\n * @param status - New status\n * @throws {AXApiError} If update fails\n */\n abstract updateMessageStatus(messageId: string, status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed'): Promise<void>;\n\n /**\n * Get message delivery status\n *\n * @param messageId - Message ID\n * @returns Delivery status information\n * @throws {AXApiError} If request fails\n */\n abstract getMessageDeliveryStatus(messageId: string): Promise<{\n delivered: number;\n read: number;\n total: number;\n }>;\n\n // =====================\n // Bulk Operations\n // =====================\n\n /**\n * Mark multiple messages as read\n *\n * @param messageIds - Array of message IDs\n * @throws {AXApiError} If marking fails\n */\n abstract markMessagesAsRead(messageIds: string[]): Promise<void>;\n\n /**\n * Delete multiple messages in bulk\n *\n * @param conversationId - Conversation ID\n * @param messageIds - Array of message IDs\n * @param forEveryone - Delete for all participants\n * @throws {AXApiError} If deletion fails\n */\n abstract bulkDeleteMessages(conversationId: string, messageIds: string[], forEveryone?: boolean): Promise<void>;\n\n // =====================\n // Message Export\n // =====================\n\n /**\n * Export conversation messages\n *\n * @param conversationId - Conversation ID\n * @param format - Export format (json, csv, txt)\n * @returns Export data or download URL\n * @throws {AXApiError} If export fails\n */\n abstract exportMessages(conversationId: string, format: 'json' | 'csv' | 'txt'): Promise<string | Blob>;\n\n // =====================\n // Error Handling Helper\n // =====================\n\n /**\n * Create an API error\n * Helper method for consistent error creation\n *\n * @param code - Error code\n * @param message - Error message\n * @param statusCode - HTTP status code\n * @param details - Additional details\n * @returns API error object\n */\n protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXApiError {\n return {\n code,\n message,\n statusCode,\n details,\n timestamp: new Date(),\n };\n }\n}\n","/**\n * Abstract Real-time Events API\n * Handle WebSocket/SSE connections and real-time event subscriptions\n */\n\nimport { Observable } from 'rxjs';\nimport type { AXConversation, AXMessage, AXPresenceUpdate, AXTypingIndicator } from '../../models';\nimport type { AXConnectionStatus } from './api-types';\n\n/**\n * Connection options\n */\nexport interface AXConnectionOptions {\n /** WebSocket/SSE endpoint URL */\n url?: string;\n /** Authentication token */\n token?: string;\n /** Reconnect automatically on disconnect */\n autoReconnect?: boolean;\n /** Reconnect delay in milliseconds */\n reconnectDelay?: number;\n /** Maximum reconnect attempts */\n maxReconnectAttempts?: number;\n /** Heartbeat interval in milliseconds */\n heartbeatInterval?: number;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Connection event\n */\nexport interface AXConnectionEvent {\n /** Event type */\n type: 'connected' | 'disconnected' | 'reconnecting' | 'error';\n /** Timestamp */\n timestamp: Date;\n /** Error message if applicable */\n error?: string;\n /** Attempt number for reconnecting */\n attempt?: number;\n}\n\n/**\n * Notification event\n */\nexport interface AXNotificationEvent {\n /** Notification ID */\n id: string;\n /** Notification type */\n type: 'message' | 'mention' | 'reaction' | 'call' | 'system';\n /** Title */\n title: string;\n /** Body text */\n body: string;\n /** Related conversation ID */\n conversationId?: string;\n /** Related message ID */\n messageId?: string;\n /** Icon URL */\n icon?: string;\n /** Timestamp */\n timestamp: Date;\n /** Custom data */\n data?: Record<string, any>;\n}\n\n/**\n * Call event\n */\nexport interface AXCallEvent {\n /** Call ID */\n callId: string;\n /** Call type */\n type: 'voice' | 'video';\n /** Call status */\n status: 'incoming' | 'outgoing' | 'accepted' | 'rejected' | 'ended' | 'missed';\n /** Caller user ID */\n callerId: string;\n /** Conversation ID */\n conversationId: string;\n /** Timestamp */\n timestamp: Date;\n /** Call duration in seconds (for ended calls) */\n duration?: number;\n}\n\n/**\n * Abstract Real-time Events API\n *\n * Implement this abstract class to handle real-time event subscriptions.\n * Supports WebSocket, SSE, or any other real-time protocol.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyRealtimeApi extends AXRealtimeApi {\n * private socket: WebSocket;\n * private connectionStatus$ = new BehaviorSubject<AXConnectionStatus>('disconnected');\n *\n * async connect(options?: AXConnectionOptions): Promise<void> {\n * this.socket = new WebSocket(options?.url || 'ws://localhost:3000');\n * this.socket.onopen = () => this.connectionStatus$.next('connected');\n * // ... handle other events\n * }\n *\n * subscribeToMessages(conversationId: string): Observable<AXMessage> {\n * return new Observable(subscriber => {\n * this.socket.addEventListener('message', (event) => {\n * const data = JSON.parse(event.data);\n * if (data.type === 'message' && data.conversationId === conversationId) {\n * subscriber.next(data.message);\n * }\n * });\n * });\n * }\n *\n * // ... implement other methods\n * }\n * ```\n */\nexport abstract class AXRealtimeApi {\n /**\n * Current connection status\n * Emit connection status changes through this observable\n */\n abstract readonly connectionStatus$: Observable<AXConnectionStatus>;\n\n // =====================\n // Connection Management\n // =====================\n\n /**\n * Connect to real-time server\n * Establish WebSocket/SSE connection\n *\n * @param options - Connection options\n * @throws {Error} If connection fails\n */\n abstract connect(options?: AXConnectionOptions): Promise<void>;\n\n /**\n * Disconnect from real-time server\n * Close connection and clean up resources\n */\n abstract disconnect(): Promise<void>;\n\n /**\n * Check if currently connected\n *\n * @returns True if connected\n */\n abstract isConnected(): boolean;\n\n /**\n * Reconnect to server\n * Manually trigger reconnection\n */\n abstract reconnect(): Promise<void>;\n\n /**\n * Subscribe to connection events\n *\n * @returns Observable of connection events\n */\n abstract subscribeToConnectionEvents(): Observable<AXConnectionEvent>;\n\n // =====================\n // Message Events\n // =====================\n\n /**\n * Subscribe to new messages in a conversation\n *\n * @param conversationId - Conversation ID (empty string for all conversations)\n * @returns Observable stream of new messages\n */\n abstract subscribeToMessages(conversationId: string): Observable<AXMessage>;\n\n /**\n * Subscribe to message updates (edits, status changes)\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of updated messages\n */\n abstract subscribeToMessageUpdates(conversationId?: string): Observable<AXMessage>;\n\n /**\n * Subscribe to message deletions\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of deleted message IDs\n */\n abstract subscribeToMessageDeletions(conversationId?: string): Observable<string>;\n\n /**\n * Subscribe to message reactions\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of updated messages with reactions\n */\n abstract subscribeToMessageReactions(conversationId?: string): Observable<AXMessage>;\n\n // =====================\n // Conversation Events\n // =====================\n\n /**\n * Subscribe to conversation updates\n * Fires when conversation details change (title, avatar, participants, etc.)\n *\n * @returns Observable stream of updated conversations\n */\n abstract subscribeToConversationUpdates(): Observable<AXConversation>;\n\n /**\n * Subscribe to conversation creation\n * Fires when user is added to a new conversation\n *\n * @returns Observable stream of new conversations\n */\n abstract subscribeToConversationCreated(): Observable<AXConversation>;\n\n /**\n * Subscribe to conversation deletion\n * Fires when a conversation is deleted\n *\n * @returns Observable stream of deleted conversation IDs\n */\n abstract subscribeToConversationDeleted(): Observable<string>;\n\n // =====================\n // Typing Indicators\n // =====================\n\n /**\n * Subscribe to typing indicators\n *\n * @param conversationId - Conversation ID (empty string for all conversations)\n * @returns Observable stream of typing indicators\n */\n abstract subscribeToTypingIndicators(conversationId: string): Observable<AXTypingIndicator>;\n\n // =====================\n // Presence Updates\n // =====================\n\n /**\n * Subscribe to presence updates (online/offline status)\n *\n * @param userIds - Optional array of user IDs to filter (empty for all users)\n * @returns Observable stream of presence updates\n */\n abstract subscribeToPresenceUpdates(userIds?: string[]): Observable<AXPresenceUpdate>;\n\n // =====================\n // Read Receipts\n // =====================\n\n /**\n * Subscribe to read receipt updates\n * Fires when someone reads messages\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of message IDs that were read\n */\n abstract subscribeToReadReceipts(conversationId?: string): Observable<{ messageId: string; userId: string; readAt: Date }>;\n\n // =====================\n // Notifications\n // =====================\n\n /**\n * Subscribe to push notifications\n * Fires for mentions, calls, and other important events\n *\n * @returns Observable stream of notification events\n */\n abstract subscribeToNotifications(): Observable<AXNotificationEvent>;\n\n // =====================\n // Call Events (Optional)\n // =====================\n\n /**\n * Subscribe to call events\n * Fires for incoming/outgoing calls\n *\n * @returns Observable stream of call events\n */\n abstract subscribeToCallEvents?(): Observable<AXCallEvent>;\n\n // =====================\n // User Events\n // =====================\n\n /**\n * Subscribe to user blocked/unblocked events\n *\n * @returns Observable stream of user IDs and block status\n */\n abstract subscribeToUserBlockEvents(): Observable<{ userId: string; blocked: boolean }>;\n\n /**\n * Subscribe to participant added/removed events\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of participant changes\n */\n abstract subscribeToParticipantEvents(\n conversationId?: string,\n ): Observable<{ conversationId: string; userId: string; action: 'added' | 'removed' }>;\n\n // =====================\n // System Events\n // =====================\n\n /**\n * Subscribe to system events\n * Fires for maintenance, updates, or other system-wide events\n *\n * @returns Observable stream of system events\n */\n abstract subscribeToSystemEvents(): Observable<{ type: string; message: string; data?: unknown }>;\n\n // =====================\n // Message Status Events\n // =====================\n\n /**\n * Subscribe to message status changes\n * Fires when message status changes (sending -> sent -> delivered -> read)\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of message status updates\n */\n abstract subscribeToMessageStatusChanges(conversationId?: string): Observable<{\n messageId: string;\n status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed';\n timestamp: Date;\n }>;\n\n // =====================\n // Conversation Settings Events\n // =====================\n\n /**\n * Subscribe to conversation settings changes\n * Fires when conversation settings are updated\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of settings updates\n */\n abstract subscribeToConversationSettingsChanges(conversationId?: string): Observable<{\n conversationId: string;\n settings: Record<string, any>;\n }>;\n\n // =====================\n // Draft Events\n // =====================\n\n /**\n * Subscribe to draft changes\n * Fires when draft is saved/updated in a conversation\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of draft updates\n */\n abstract subscribeToDraftChanges(conversationId?: string): Observable<{\n conversationId: string;\n draft: string | null;\n }>;\n}\n","/**\n * API Services\n * Export all abstract API classes and types\n */\n\n// Shared types\nexport * from './api-types';\n\n// API abstracts\nexport * from './user-api.abstract';\nexport * from './conversation-api.abstract';\nexport * from './message-api.abstract';\nexport * from './realtime-api.abstract';\n","/**\n * Conversation Configuration Interface\n * Centralized configuration values to avoid magic numbers\n */\n\n/**\n * Main configuration interface for the conversation component\n */\nexport interface AXConversationConfig {\n // Pagination\n /** Number of messages to load per page */\n messagePageSize?: number;\n\n /** Number of conversations to load per page */\n conversationPageSize?: number;\n\n // Scroll Configuration\n /** Scroll threshold for detecting scroll events */\n scrollThreshold?: number;\n\n /** Infinite scroll threshold */\n infiniteScrollThreshold?: number;\n\n // Timeout Durations (milliseconds)\n /** Typing indicator timeout in milliseconds */\n typingIndicatorTimeout?: number;\n\n /** Typing indicator throttle in milliseconds (for rate limiting) */\n typingIndicatorThrottle?: number;\n\n /** Message highlight duration in milliseconds */\n messageHighlightDuration?: number;\n\n /** Search debounce delay in milliseconds */\n debounceSearch?: number;\n\n /** Date separator inactivity fade delay in milliseconds */\n // dateSeparatorFadeDelay?: number;\n\n // Message Storage Limits\n /** Maximum messages per conversation */\n maxMessagesPerConversation?: number;\n\n /** Maximum total messages in store */\n maxTotalMessages?: number;\n\n /** Maximum cached conversations */\n maxCachedConversations?: number;\n\n // UI Dimensions\n /** Minimum sidebar width in pixels */\n minSidebarWidth?: number;\n\n /** Maximum sidebar width in pixels */\n maxSidebarWidth?: number;\n\n /** Default sidebar width in pixels */\n defaultSidebarWidth?: number;\n\n // Virtual Scrolling\n /** Virtual scroll item size in pixels */\n virtualScrollItemSize?: number;\n\n /** Virtual scroll minimum buffer in pixels */\n virtualScrollMinBuffer?: number;\n\n /** Virtual scroll maximum buffer in pixels */\n virtualScrollMaxBuffer?: number;\n\n // Cache\n /** Filter cache size */\n filterCacheSize?: number;\n\n // File Upload\n /** Maximum file size in bytes */\n maxFileSize?: number;\n\n /** Allowed file types (glob patterns like 'image/*') */\n allowedFileTypes?: string[];\n\n // Message Validation\n /** Maximum message length in characters */\n maxMessageLength?: number;\n\n /** Minimum message length in characters */\n minMessageLength?: number;\n\n // Intersection Observer\n /** Threshold for marking messages as read (0.0 to 1.0, default: 0.3) */\n messageReadThreshold?: number;\n}\n","/**\n * Default Configuration Values\n * Centralized defaults to avoid magic numbers throughout the codebase\n */\n\nimport type { AXConversationConfig } from './conversation-config.interface';\n\n/**\n * Default conversation configuration\n * All values are explicitly defined here for easy maintenance and documentation\n */\nexport const AX_DEFAULT_CONVERSATION_CONFIG: Required<AXConversationConfig> = {\n // Pagination\n messagePageSize: 50,\n conversationPageSize: 30,\n\n // Scroll Configuration\n scrollThreshold: 100,\n infiniteScrollThreshold: 200,\n\n // Timeout Durations (milliseconds)\n typingIndicatorTimeout: 3000,\n typingIndicatorThrottle: 1000,\n messageHighlightDuration: 2000,\n debounceSearch: 300,\n\n // Message Storage Limits\n maxMessagesPerConversation: 1000,\n maxTotalMessages: 10000,\n maxCachedConversations: 50,\n\n // UI Dimensions (pixels)\n minSidebarWidth: 250,\n maxSidebarWidth: 500,\n defaultSidebarWidth: 320,\n\n // Virtual Scrolling\n virtualScrollItemSize: 80,\n virtualScrollMinBuffer: 800,\n virtualScrollMaxBuffer: 1600,\n\n // Cache\n filterCacheSize: 100,\n\n // File Upload\n maxFileSize: 10 * 1024 * 1024, // 10MB\n allowedFileTypes: ['image/*', 'video/*', 'audio/*', 'application/pdf', 'application/msword'],\n\n // Message Validation\n maxMessageLength: 10000,\n minMessageLength: 1,\n\n // Intersection Observer\n messageReadThreshold: 0.3,\n};\n\n/**\n * Helper function to merge user config with defaults\n * Properly handles array merging to avoid reference issues\n * @param userConfig - User-provided configuration\n * @returns Merged configuration with all required fields\n */\nexport function mergeWithDefaults(userConfig?: Partial<AXConversationConfig>): Required<AXConversationConfig> {\n if (!userConfig) {\n return { ...AX_DEFAULT_CONVERSATION_CONFIG };\n }\n\n const merged = {\n ...AX_DEFAULT_CONVERSATION_CONFIG,\n ...userConfig,\n };\n\n // Ensure allowedFileTypes is a new array to avoid reference issues\n if (userConfig.allowedFileTypes) {\n merged.allowedFileTypes = [...userConfig.allowedFileTypes];\n } else {\n merged.allowedFileTypes = [...AX_DEFAULT_CONVERSATION_CONFIG.allowedFileTypes];\n }\n\n return merged;\n}\n","/**\n * Dependency Injection Tokens\n * InjectionTokens for configuration and dependencies\n */\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXErrorHandlerConfig } from '../services/error-handler.service';\nimport type { AXConversationConfig } from './conversation-config.interface';\nimport { AX_DEFAULT_CONVERSATION_CONFIG } from './conversation-config.defaults';\n\n/**\n * Configuration token for conversation component\n * Uses centralized defaults from AX_DEFAULT_CONVERSATION_CONFIG\n */\nexport const CONVERSATION_CONFIG = new InjectionToken<AXConversationConfig>('CONVERSATION_CONFIG', {\n providedIn: 'root',\n factory: () => AX_DEFAULT_CONVERSATION_CONFIG,\n});\n\n/**\n * Token for configuring AXErrorHandlerService\n */\nexport const ERROR_HANDLER_CONFIG = new InjectionToken<Partial<AXErrorHandlerConfig>>('ERROR_HANDLER_CONFIG', {\n providedIn: 'root',\n factory: () => ({}),\n});\n","/**\n * Registry Configuration Tokens\n * Injection tokens for configuring default registry values\n */\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXComposerAction } from '../registries/composer-action.registry';\nimport type { AXComposerTab } from '../registries/composer-tab.registry';\nimport type { AXConversationItemAction } from '../registries/conversation-item-action.registry';\nimport type { AXConversationTab } from '../registries/conversation-tab.registry';\nimport type { AXInfoBarAction } from '../registries/info-bar-action.registry';\nimport type { AXMessageAction } from '../registries/message-action.registry';\nimport type { AXMessageRenderer } from '../registries/message-renderer.registry';\n\n/**\n * Additional message renderers configuration\n * Provide this token to add custom message renderers in addition to built-in ones\n * Note: Built-in renderers (text, image, video, audio, voice, file, location, sticker, contact, system, fallback) are automatically registered\n */\nexport const DEFAULT_MESSAGE_RENDERERS = new InjectionToken<AXMessageRenderer[]>('DEFAULT_MESSAGE_RENDERERS', {\n providedIn: 'root',\n factory: () => [],\n});\n\n/**\n * Default message actions configuration\n * Provide this token to override default message actions\n */\nexport const DEFAULT_MESSAGE_ACTIONS = new InjectionToken<AXMessageAction[]>('DEFAULT_MESSAGE_ACTIONS', {\n providedIn: 'root',\n factory: () => [],\n});\n\n/**\n * Default composer tabs configuration\n * Provide this token to override default composer tabs (emoji, stickers, etc.)\n */\nexport const DEFAULT_COMPOSER_TABS = new InjectionToken<AXComposerTab[]>('DEFAULT_COMPOSER_TABS', {\n providedIn: 'root',\n factory: () => [],\n});\n\n/**\n * Default composer actions configuration\n * Provide this token to override default composer actions (attach, voice, etc.)\n */\nexport const DEFAULT_COMPOSER_ACTIONS = new InjectionToken<AXComposerAction[]>('DEFAULT_COMPOSER_ACTIONS', {\n providedIn: 'root',\n factory: () => [],\n});\n\n/**\n * Default conversation tabs configuration\n * Provide this token to override default conversation tabs (all, private, groups, etc.)\n */\nexport const DEFAULT_CONVERSATION_TABS = new InjectionToken<AXConversationTab[]>('DEFAULT_CONVERSATION_TABS', {\n providedIn: 'root',\n factory: () => [],\n});\n\n/**\n * Default info bar actions configuration\n * Provide this token to override default info bar actions (mute, archive, block, etc.)\n */\nexport const DEFAULT_INFO_BAR_ACTIONS = new InjectionToken<AXInfoBarAction[]>('DEFAULT_INFO_BAR_ACTIONS', {\n providedIn: 'root',\n factory: () => [],\n});\n\n/**\n * Default conversation item actions configuration\n * Provide this token to override default conversation item actions (mute, delete, archive, etc.)\n */\nexport const DEFAULT_CONVERSATION_ITEM_ACTIONS = new InjectionToken<AXConversationItemAction[]>(\n 'DEFAULT_CONVERSATION_ITEM_ACTIONS',\n {\n providedIn: 'root',\n factory: () => [],\n },\n);\n\n/**\n * Registry configuration interface\n */\nexport interface AXRegistryConfiguration {\n /** Additional message renderers to register (built-in renderers are automatic) */\n messageRenderers?: AXMessageRenderer[];\n\n /** Message actions to register by default */\n messageActions?: AXMessageAction[];\n\n /** Composer tabs to register by default */\n composerTabs?: AXComposerTab[];\n\n /** Composer actions to register by default */\n composerActions?: AXComposerAction[];\n\n /** Conversation tabs to register by default */\n conversationTabs?: AXConversationTab[];\n\n /** Info bar actions to register by default */\n infoBarActions?: AXInfoBarAction[];\n\n /** Conversation item actions to register by default */\n conversationItemActions?: AXConversationItemAction[];\n}\n\n/**\n * Complete registry configuration token\n * Provide this for comprehensive registry configuration\n */\nexport const REGISTRY_CONFIG = new InjectionToken<AXRegistryConfiguration>('REGISTRY_CONFIG', {\n providedIn: 'root',\n factory: () => ({}),\n});\n","/**\n * Error Handler Service\n * Centralized error handling and logging\n */\n\nimport { inject, Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { ERROR_HANDLER_CONFIG } from '../tokens';\nimport { AXApiError } from './api';\n\n/**\n * Error severity levels\n */\nexport type AXErrorSeverity = 'info' | 'warning' | 'error' | 'critical';\n\n/**\n * Conversation error event\n */\nexport interface AXConversationError {\n /** Error code */\n code: string;\n\n /** Error message */\n message: string;\n\n /** Severity level */\n severity: AXErrorSeverity;\n\n /** Source operation */\n operation: string;\n\n /** Original error */\n originalError?: unknown;\n\n /** HTTP status code (if applicable) */\n statusCode?: number;\n\n /** Additional context */\n context?: Record<string, unknown>;\n\n /** Timestamp */\n timestamp: Date;\n\n /** Whether error was handled */\n handled: boolean;\n\n /** Recovery suggestions */\n recoverySuggestions?: string[];\n}\n\n/**\n * Error Handler Configuration\n */\nexport interface AXErrorHandlerConfig {\n /** Log errors to console */\n logToConsole?: boolean;\n\n /** Show user-friendly error messages */\n showUserMessages?: boolean;\n\n /** Retry failed operations automatically */\n autoRetry?: boolean;\n\n /** Number of retry attempts */\n maxRetries?: number;\n\n /** Custom error handler */\n customHandler?: (error: AXConversationError) => void;\n}\n\n/**\n * Error Handler Service\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXErrorHandlerService {\n private readonly injectedConfig = inject(ERROR_HANDLER_CONFIG);\n private readonly _errors$ = new Subject<AXConversationError>();\n private readonly _config: AXErrorHandlerConfig = {\n logToConsole: true,\n showUserMessages: true,\n autoRetry: false,\n maxRetries: 3,\n };\n\n /** Error stream */\n readonly errors$ = this._errors$.asObservable();\n\n constructor() {\n // Apply injected configuration at construction\n if (this.injectedConfig) {\n this.configure(this.injectedConfig);\n }\n }\n\n /**\n * Configure error handler\n */\n configure(config: Partial<AXErrorHandlerConfig>): void {\n Object.assign(this._config, config);\n }\n\n /**\n * Handle an error\n */\n handle(error: unknown, operation: string, context?: Record<string, unknown>): AXConversationError {\n const conversationError = this.normalizeError(error, operation, context);\n\n // Emit error event\n this._errors$.next(conversationError);\n\n // Log to console if enabled\n if (this._config.logToConsole) {\n this.logError(conversationError);\n }\n\n // Call custom handler if provided\n if (this._config.customHandler) {\n this._config.customHandler(conversationError);\n }\n\n return conversationError;\n }\n\n /**\n * Handle API error\n */\n handleApiError(apiError: AXApiError, operation: string, context?: Record<string, unknown>): AXConversationError {\n const conversationError: AXConversationError = {\n code: apiError.code,\n message: apiError.message,\n severity: this.determineSeverity(apiError.statusCode),\n operation,\n originalError: apiError,\n statusCode: apiError.statusCode,\n context,\n timestamp: apiError.timestamp || new Date(),\n handled: false,\n recoverySuggestions: this.getRecoverySuggestions(apiError),\n };\n\n this._errors$.next(conversationError);\n\n if (this._config.logToConsole) {\n this.logError(conversationError);\n }\n\n if (this._config.customHandler) {\n this._config.customHandler(conversationError);\n }\n\n return conversationError;\n }\n\n /**\n * Normalize any error to conversation error format\n */\n private normalizeError(error: unknown, operation: string, context?: Record<string, unknown>): AXConversationError {\n // Handle AXApiError\n if (this.isApiError(error)) {\n return this.handleApiError(error as AXApiError, operation, context);\n }\n\n // Handle standard Error\n const errorObj = error as Record<string, any>;\n const message = errorObj?.['message'] || String(error) || 'An unknown error occurred';\n const code = errorObj?.['code'] || 'UNKNOWN_ERROR';\n const statusCode = errorObj?.['statusCode'] || errorObj?.['status'];\n\n return {\n code,\n message,\n severity: 'error',\n operation,\n originalError: error,\n statusCode,\n context,\n timestamp: new Date(),\n handled: false,\n recoverySuggestions: this.getDefaultRecoverySuggestions(code),\n };\n }\n\n /**\n * Check if error is API error\n */\n private isApiError(error: unknown): boolean {\n return error && typeof error === 'object' && 'code' in error && 'message' in error;\n }\n\n /**\n * Determine severity based on status code\n */\n private determineSeverity(statusCode?: number): AXErrorSeverity {\n if (!statusCode) return 'error';\n\n if (statusCode >= 500) return 'critical';\n if (statusCode >= 400) return 'error';\n if (statusCode >= 300) return 'warning';\n return 'info';\n }\n\n /**\n * Get recovery suggestions based on error\n */\n private getRecoverySuggestions(error: AXApiError): string[] {\n const suggestions: string[] = [];\n\n if (error.statusCode === 401 || error.code === 'UNAUTHORIZED') {\n suggestions.push('Please log in again');\n suggestions.push('Check if your session has expired');\n } else if (error.statusCode === 403 || error.code === 'FORBIDDEN') {\n suggestions.push('You do not have permission for this action');\n suggestions.push('Contact your administrator for access');\n } else if (error.statusCode === 404 || error.code === 'NOT_FOUND') {\n suggestions.push('The requested resource was not found');\n suggestions.push('It may have been deleted or moved');\n } else if (error.statusCode === 429 || error.code === 'RATE_LIMIT_EXCEEDED') {\n suggestions.push('Too many requests. Please wait and try again');\n } else if (error.statusCode && error.statusCode >= 500) {\n suggestions.push('Server error occurred');\n suggestions.push('Please try again later');\n suggestions.push('If the problem persists, contact support');\n } else if (error.code === 'NETWORK_ERROR') {\n suggestions.push('Check your internet connection');\n suggestions.push('Try refreshing the page');\n }\n\n return suggestions;\n }\n\n /**\n * Get default recovery suggestions\n */\n private getDefaultRecoverySuggestions(code: string): string[] {\n const suggestions: string[] = [];\n\n if (code.includes('NETWORK') || code.includes('CONNECTION')) {\n suggestions.push('Check your internet connection');\n suggestions.push('Try refreshing the page');\n } else if (code.includes('TIMEOUT')) {\n suggestions.push('The operation took too long');\n suggestions.push('Please try again');\n } else {\n suggestions.push('Please try again');\n suggestions.push('If the problem persists, contact support');\n }\n\n return suggestions;\n }\n\n /**\n * Log error to console\n */\n private logError(error: AXConversationError): void {\n const isError = error.severity === 'critical' || error.severity === 'error';\n const header = `[Conversation ${error.severity.toUpperCase()}] ${error.operation}:`;\n if (isError) {\n console.error(header, error.message, error.context || '');\n } else {\n console.warn(header, error.message, error.context || '');\n }\n\n if (error.originalError && error.severity !== 'info') {\n console.error('Original error:', error.originalError);\n }\n\n if (error.recoverySuggestions && error.recoverySuggestions.length > 0) {\n console.info('Recovery suggestions:', error.recoverySuggestions);\n }\n }\n\n /**\n * Get user-friendly error message\n */\n getUserFriendlyMessage(error: AXConversationError): string {\n // Map technical errors to user-friendly messages\n const messageMap: Record<string, string> = {\n NETWORK_ERROR: 'Unable to connect. Please check your internet connection.',\n UNAUTHORIZED: 'You are not authorized. Please log in again.',\n FORBIDDEN: 'You do not have permission to perform this action.',\n NOT_FOUND: 'The requested item could not be found.',\n RATE_LIMIT_EXCEEDED: 'Too many requests. Please slow down.',\n VALIDATION_ERROR: 'The provided data is invalid.',\n SERVER_ERROR: 'A server error occurred. Please try again later.',\n TIMEOUT: 'The operation timed out. Please try again.',\n };\n\n return messageMap[error.code] || error.message || 'An unexpected error occurred.';\n }\n\n /**\n * Check if error is retryable\n */\n isRetryable(error: AXConversationError): boolean {\n const retryableCodes = ['NETWORK_ERROR', 'TIMEOUT', 'RATE_LIMIT_EXCEEDED', 'SERVER_ERROR'];\n const retryableStatusCodes = [408, 429, 500, 502, 503, 504];\n\n return (\n retryableCodes.includes(error.code) ||\n (error.statusCode !== undefined && retryableStatusCodes.includes(error.statusCode))\n );\n }\n\n /**\n * Execute an operation with automatic retry logic\n * @param operation - The async operation to execute\n * @param operationName - Name of the operation for error tracking\n * @param context - Additional context for error handling\n * @returns Promise resolving to the operation result\n * @throws {AXConversationError} If all retries fail\n */\n async executeWithRetry<T>(\n operation: () => Promise<T>,\n operationName: string,\n context?: Record<string, unknown>,\n ): Promise<T> {\n if (!this._config.autoRetry) {\n // If auto-retry is disabled, just execute once\n return operation();\n }\n\n const maxRetries = this._config.maxRetries ?? 3;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n const conversationError = this.handle(error, operationName, { ...context, attempt });\n\n // Don't retry if error is not retryable or if this was the last attempt\n if (!this.isRetryable(conversationError) || attempt >= maxRetries) {\n throw conversationError;\n }\n\n // Exponential backoff: 1s, 2s, 4s, 8s...\n const delayMs = Math.pow(2, attempt) * 1000;\n await this.delay(delayMs);\n }\n }\n\n // This should never be reached, but TypeScript needs it\n throw this.handle(lastError, operationName, context);\n }\n\n /**\n * Delay helper for retry backoff\n * @param ms - Milliseconds to delay\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Clear error history\n */\n clear(): void {\n // Errors are not stored, just emitted through observable\n // This method is here for future extensions if needed\n }\n}\n","/**\n * Conversation Store Service\n * Single signal store for managing all conversation and message state\n *\n * This is the single source of truth for:\n * - Conversations list and metadata\n * - Messages for all conversations\n * - Active conversation selection\n * - In-memory state management\n */\n\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport type { AXConversation, AXMessage, AXParticipantStatus } from '../models';\nimport { CONVERSATION_CONFIG } from '../tokens';\nimport { AXErrorHandlerService } from './error-handler.service';\n\n/**\n * Conversation Store Service\n * Unified signal-based store for conversations and messages\n */\n@Injectable()\nexport class AXConversationStoreService {\n private readonly config = inject(CONVERSATION_CONFIG);\n private readonly errorHandler = inject(AXErrorHandlerService);\n\n // =====================\n // State Signals\n // =====================\n\n /** All conversations (keyed by ID) */\n private readonly _conversations = signal<Map<string, AXConversation>>(new Map());\n\n /** All messages (keyed by message ID) */\n private readonly _messages = signal<Map<string, AXMessage>>(new Map());\n\n /** Message IDs grouped by conversation */\n private readonly _conversationMessages = signal<Map<string, string[]>>(new Map());\n\n // =====================\n // Public Computed Signals\n // =====================\n\n /** All conversations as array (unsorted - sorting is handled by consumers) */\n readonly conversations = computed(\n () => {\n const convMap = this._conversations();\n return Array.from(convMap.values());\n },\n {\n equal: (a, b) => a.length === b.length && a.every((v, i) => v === b[i]),\n },\n );\n\n /** All messages as array */\n readonly messages = computed(\n () => Array.from(this._messages().values()),\n { equal: (a, b) => a.length === b.length && a.every((v, i) => v === b[i]) },\n );\n\n // =====================\n // Initialization\n // =====================\n\n /**\n * Initialize the store\n */\n async initialize(): Promise<void> {\n // Store is initialized with empty state\n // Data will be loaded from API\n }\n\n // =====================\n // Conversation Operations\n // =====================\n\n /**\n * Set all conversations (replaces existing)\n * @param conversations - Array of conversations\n */\n setConversations(conversations: AXConversation[]): void {\n const convMap = new Map<string, AXConversation>();\n conversations.forEach((conv) => convMap.set(conv.id, conv));\n this._conversations.set(convMap);\n }\n\n /**\n * Add multiple conversations (append to existing)\n * Used for pagination - appends new conversations without replacing existing ones\n * @param conversations - Array of conversations to add\n */\n addConversations(conversations: AXConversation[]): void {\n this._conversations.update((existingConversations) => {\n const newConversations = new Map(existingConversations);\n conversations.forEach((conv) => newConversations.set(conv.id, conv));\n \n // Cleanup old conversations if cache is too large\n const maxCached = this.config.maxCachedConversations;\n if (newConversations.size > maxCached) {\n // Sort by last activity and keep only the most recent\n const sorted = Array.from(newConversations.values()).sort(\n (a, b) => (b.lastMessageAt?.getTime() ?? 0) - (a.lastMessageAt?.getTime() ?? 0)\n );\n \n // Keep only the most recent conversations\n const toKeep = sorted.slice(0, maxCached);\n const cleanedMap = new Map<string, AXConversation>();\n toKeep.forEach((conv) => cleanedMap.set(conv.id, conv));\n return cleanedMap;\n }\n \n return newConversations;\n });\n }\n\n /**\n * Add or update a single conversation\n * @param conversation - Conversation to add/update\n */\n setConversation(conversation: AXConversation): void {\n this._conversations.update((conversations) => {\n const newConversations = new Map(conversations);\n newConversations.set(conversation.id, conversation);\n return newConversations;\n });\n }\n\n /**\n * Get a conversation by ID\n * @param conversationId - Conversation ID\n * @returns Conversation or undefined\n */\n getConversation(conversationId: string): AXConversation | undefined {\n return this._conversations().get(conversationId);\n }\n\n /**\n * Update a conversation with partial data\n * @param conversationId - Conversation ID\n * @param updates - Partial conversation updates\n */\n updateConversation(conversationId: string, updates: Partial<AXConversation>): void {\n const conversation = this._conversations().get(conversationId);\n if (!conversation) return;\n\n const updatedConversation = { ...conversation, ...updates };\n this.setConversation(updatedConversation);\n }\n\n /**\n * Delete a conversation\n * @param conversationId - Conversation ID\n */\n deleteConversation(conversationId: string): void {\n // Remove conversation\n this._conversations.update((conversations) => {\n const newConversations = new Map(conversations);\n newConversations.delete(conversationId);\n return newConversations;\n });\n\n // Remove all messages for this conversation\n const messageIds = this._conversationMessages().get(conversationId) || [];\n this._messages.update((messages) => {\n const newMessages = new Map(messages);\n messageIds.forEach((id) => newMessages.delete(id));\n return newMessages;\n });\n\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n newMap.delete(conversationId);\n return newMap;\n });\n }\n\n // =====================\n // Conversation Updates\n // =====================\n\n /**\n * Update conversation's last message\n * @param message - The message to set as last message\n */\n updateLastMessage(message: AXMessage): void {\n this.updateConversation(message.conversationId, {\n lastMessage: message,\n lastMessageAt: message.timestamp,\n updatedAt: message.timestamp,\n });\n }\n\n /**\n * Increment unread count\n * @param conversationId - Conversation ID\n */\n incrementUnreadCount(conversationId: string): void {\n const conversation = this._conversations().get(conversationId);\n if (!conversation) return;\n this.updateConversation(conversationId, { unreadCount: conversation.unreadCount + 1 });\n }\n\n /**\n * Reset unread count to zero\n * @param conversationId - Conversation ID\n */\n resetUnreadCount(conversationId: string): void {\n this.updateConversation(conversationId, { unreadCount: 0 });\n }\n\n /**\n * Update conversation settings\n * @param conversationId - Conversation ID\n * @param settings - Settings to merge\n */\n updateSettings(conversationId: string, settings: Partial<AXConversation['settings']>): void {\n const conversation = this._conversations().get(conversationId);\n if (!conversation) return;\n\n this.updateConversation(conversationId, {\n settings: { ...conversation.settings, ...settings },\n updatedAt: new Date(),\n });\n }\n\n /**\n * Update conversation title\n * @param conversationId - Conversation ID\n * @param title - New title\n */\n updateTitle(conversationId: string, title: string): void {\n this.updateConversation(conversationId, { title, updatedAt: new Date() });\n }\n\n /**\n * Update conversation metadata\n * @param conversationId - Conversation ID\n * @param metadata - Metadata to merge\n */\n updateMetadata(conversationId: string, metadata: Record<string, unknown>): void {\n const conversation = this._conversations().get(conversationId);\n if (!conversation) return;\n\n this.updateConversation(conversationId, {\n metadata: { ...conversation.metadata, ...metadata },\n updatedAt: new Date(),\n });\n }\n\n /**\n * Update typing indicator\n * @param conversationId - Conversation ID\n * @param userId - User ID\n * @param isTyping - Whether user is typing\n */\n updateTypingIndicator(conversationId: string, userId: string, isTyping: boolean): void {\n const conversation = this._conversations().get(conversationId);\n if (!conversation) return;\n\n let typingUsers = [...conversation.status.typingUsers];\n\n if (isTyping) {\n if (!typingUsers.includes(userId)) {\n typingUsers.push(userId);\n }\n } else {\n typingUsers = typingUsers.filter((id) => id !== userId);\n }\n\n this.updateConversation(conversationId, {\n status: {\n ...conversation.status,\n isTyping: typingUsers.length > 0,\n typingUsers,\n },\n });\n }\n\n /**\n * Update participant presence across all conversations\n * @param userId - User ID\n * @param status - Presence status\n * @param lastSeen - Last seen date\n */\n updateParticipantPresence(userId: string, status: AXParticipantStatus, lastSeen?: Date): void {\n this._conversations.update((conversations) => {\n const newConversations = new Map(conversations);\n\n for (const [id, conv] of conversations) {\n const participant = conv.participants.find((p) => p.id === userId);\n if (participant) {\n const updatedConversation: AXConversation = {\n ...conv,\n participants: conv.participants.map((p) => (p.id === userId ? { ...p, status, lastSeen } : p)),\n status: conv.type === 'private' ? { ...conv.status, presence: status, lastSeen } : conv.status,\n };\n newConversations.set(id, updatedConversation);\n }\n }\n\n return newConversations;\n });\n }\n\n // =====================\n // Message Operations\n // =====================\n\n /**\n * Add a message to the store\n * @param message - Message to add\n */\n addMessage(message: AXMessage): void {\n // Add to messages map\n this._messages.update((messages) => {\n const newMessages = new Map(messages);\n newMessages.set(message.id, message);\n return newMessages;\n });\n\n // Update conversation messages list (sorted)\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n const messageIds = newMap.get(message.conversationId) || [];\n\n if (!messageIds.includes(message.id)) {\n messageIds.push(message.id);\n // Sort by timestamp\n messageIds.sort((a, b) => {\n const msgA = this._messages().get(a);\n const msgB = this._messages().get(b);\n if (!msgA || !msgB) return 0;\n return msgA.timestamp.getTime() - msgB.timestamp.getTime();\n });\n newMap.set(message.conversationId, messageIds);\n }\n\n return newMap;\n });\n }\n\n /**\n * Add multiple messages\n * @param messages - Messages to add\n */\n addMessages(messages: AXMessage[]): void {\n if (messages.length === 0) return;\n\n // Add all messages to map\n this._messages.update((msgs) => {\n const newMessages = new Map(msgs);\n messages.forEach((msg) => newMessages.set(msg.id, msg));\n return newMessages;\n });\n\n // Update conversation messages lists\n const conversationGroups = new Map<string, string[]>();\n messages.forEach((msg) => {\n const existing = conversationGroups.get(msg.conversationId) || [];\n existing.push(msg.id);\n conversationGroups.set(msg.conversationId, existing);\n });\n\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n\n for (const [conversationId, newMsgIds] of conversationGroups) {\n const messageIds = newMap.get(conversationId) || [];\n newMsgIds.forEach((id) => {\n if (!messageIds.includes(id)) {\n messageIds.push(id);\n }\n });\n\n // Sort by timestamp\n messageIds.sort((a, b) => {\n const msgA = this._messages().get(a);\n const msgB = this._messages().get(b);\n if (!msgA || !msgB) return 0;\n return msgA.timestamp.getTime() - msgB.timestamp.getTime();\n });\n\n newMap.set(conversationId, messageIds);\n }\n\n return newMap;\n });\n\n // Cleanup old messages to prevent memory leaks\n this.cleanupOldMessages();\n this.cleanupConversationMessages();\n }\n\n /**\n * Get a message by ID\n * @param messageId - Message ID\n * @returns Message or undefined\n */\n getMessage(messageId: string): AXMessage | undefined {\n return this._messages().get(messageId);\n }\n\n /**\n * Get messages for a conversation\n * @param conversationId - Conversation ID\n * @returns Array of messages sorted by timestamp\n */\n getConversationMessages(conversationId: string): AXMessage[] {\n const messageIds = this._conversationMessages().get(conversationId) || [];\n return messageIds.map((id) => this._messages().get(id)).filter((msg): msg is AXMessage => msg !== undefined);\n }\n\n /**\n * Get messages signal for a conversation\n * @param conversationId - Conversation ID\n * @returns Computed signal of messages\n */\n getConversationMessagesSignal(conversationId: string) {\n return computed(() => this.getConversationMessages(conversationId));\n }\n\n /**\n * Update a message\n * @param messageId - Message ID\n * @param updates - Partial message updates\n */\n updateMessage(messageId: string, updates: Partial<AXMessage>): void {\n const message = this._messages().get(messageId);\n if (!message) return;\n\n const updatedMessage = { ...message, ...updates };\n this.addMessage(updatedMessage);\n }\n\n /**\n * Delete a message\n * @param messageId - Message ID\n */\n deleteMessage(messageId: string): void {\n const message = this._messages().get(messageId);\n if (!message) return;\n\n // Remove from messages map\n this._messages.update((messages) => {\n const newMessages = new Map(messages);\n newMessages.delete(messageId);\n return newMessages;\n });\n\n // Remove from conversation messages list\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n const messageIds = newMap.get(message.conversationId) || [];\n const index = messageIds.indexOf(messageId);\n if (index > -1) {\n messageIds.splice(index, 1);\n newMap.set(message.conversationId, messageIds);\n }\n return newMap;\n });\n }\n\n /**\n * Clear messages for a conversation\n * @param conversationId - Conversation ID\n */\n clearConversationMessages(conversationId: string): void {\n const messageIds = this._conversationMessages().get(conversationId) || [];\n\n // Remove messages\n this._messages.update((messages) => {\n const newMessages = new Map(messages);\n messageIds.forEach((id) => newMessages.delete(id));\n return newMessages;\n });\n\n // Clear conversation messages list\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n newMap.delete(conversationId);\n return newMap;\n });\n }\n\n /**\n * Clear all data\n */\n clearAll(): void {\n this._conversations.set(new Map());\n this._messages.set(new Map());\n this._conversationMessages.set(new Map());\n }\n\n // =====================\n // Memory Management\n // =====================\n\n /**\n * Cleanup old messages to prevent unbounded memory growth\n * Keeps only the most recent messages up to MAX_TOTAL_MESSAGES\n */\n private cleanupOldMessages(): void {\n const totalMessages = this._messages().size;\n\n if (totalMessages > this.config.maxTotalMessages) {\n // Get all messages sorted by timestamp (newest first)\n const allMessages = Array.from(this._messages().values()).sort(\n (a, b) => b.timestamp.getTime() - a.timestamp.getTime(),\n );\n\n // Keep only the newest messages\n const toKeep = allMessages.slice(0, this.config.maxTotalMessages);\n const toKeepIds = new Set(toKeep.map((m) => m.id));\n\n // Remove old messages\n this._messages.update(() => {\n const newMessages = new Map<string, AXMessage>();\n toKeep.forEach((msg) => newMessages.set(msg.id, msg));\n return newMessages;\n });\n\n // Update conversation messages lists to remove deleted message IDs\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n for (const [convId, messageIds] of newMap) {\n const filteredIds = messageIds.filter((id) => toKeepIds.has(id));\n newMap.set(convId, filteredIds);\n }\n return newMap;\n });\n }\n }\n\n /**\n * Cleanup messages per conversation to prevent memory leaks\n * Keeps only recent messages per conversation\n */\n private cleanupConversationMessages(): void {\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n\n for (const [convId, messageIds] of newMap) {\n const maxMessages = this.config.maxMessagesPerConversation;\n if (messageIds.length > maxMessages) {\n // Keep only recent messages\n const toKeep = messageIds.slice(-maxMessages);\n newMap.set(convId, toKeep);\n\n // Remove old message objects\n const toRemove = messageIds.slice(0, messageIds.length - maxMessages);\n this._messages.update((messages) => {\n const newMessages = new Map(messages);\n toRemove.forEach((id) => newMessages.delete(id));\n return newMessages;\n });\n }\n }\n\n return newMap;\n });\n }\n\n // =====================\n // Statistics\n // =====================\n\n /**\n * Get store statistics\n */\n getStats() {\n return {\n conversationCount: this._conversations().size,\n messageCount: this._messages().size,\n conversationsWithMessages: this._conversationMessages().size,\n };\n }\n}\n","/**\n * Validation Utilities\n * Centralized validation functions for messages, files, and user input\n */\n\nimport type { AXMessagePayload, AXMessageType } from '../models';\nimport type { AXConversationConfig } from '../tokens';\n\n/**\n * Validation result interface\n */\nexport interface AXValidationResult {\n /** Whether validation passed */\n valid: boolean;\n /** Error message if validation failed */\n error?: string;\n /** Error code for programmatic handling */\n errorCode?: string;\n}\n\n/**\n * File validation result with additional metadata\n */\nexport interface AXFileValidationResult extends AXValidationResult {\n /** File size in bytes */\n size?: number;\n /** File type/MIME type */\n type?: string;\n}\n\n/**\n * Validate message text content\n * @param text - Text to validate\n * @param config - Configuration for validation rules\n * @returns Validation result\n */\nexport function validateMessageText(text: string | undefined, config: AXConversationConfig): AXValidationResult {\n // Check for empty text\n if (!text || text.trim().length === 0) {\n return {\n valid: false,\n error: 'Message text cannot be empty',\n errorCode: 'EMPTY_MESSAGE',\n };\n }\n\n // Check minimum length\n const minLength = config.minMessageLength ?? 1;\n if (text.trim().length < minLength) {\n return {\n valid: false,\n error: `Message must be at least ${minLength} character(s)`,\n errorCode: 'MESSAGE_TOO_SHORT',\n };\n }\n\n // Check maximum length\n const maxLength = config.maxMessageLength ?? 10000;\n if (text.length > maxLength) {\n return {\n valid: false,\n error: `Message exceeds ${maxLength} character limit`,\n errorCode: 'MESSAGE_TOO_LONG',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate file upload\n * @param file - File to validate\n * @param config - Configuration for validation rules\n * @returns File validation result\n */\nexport function validateFile(file: File, config: AXConversationConfig): AXFileValidationResult {\n // Check file size\n const maxSize = config.maxFileSize ?? 10 * 1024 * 1024; // 10MB default\n if (file.size > maxSize) {\n return {\n valid: false,\n error: `File size exceeds ${formatFileSize(maxSize)} limit`,\n errorCode: 'FILE_TOO_LARGE',\n size: file.size,\n type: file.type,\n };\n }\n\n // Check file type if restrictions exist\n const allowedTypes = config.allowedFileTypes;\n if (allowedTypes && allowedTypes.length > 0) {\n const isAllowed = allowedTypes.some((pattern) => matchMimeType(file.type, pattern));\n if (!isAllowed) {\n return {\n valid: false,\n error: `File type \"${file.type}\" is not allowed`,\n errorCode: 'FILE_TYPE_NOT_ALLOWED',\n size: file.size,\n type: file.type,\n };\n }\n }\n\n return {\n valid: true,\n size: file.size,\n type: file.type,\n };\n}\n\n/**\n * Validate conversation ID\n * @param conversationId - Conversation ID to validate\n * @returns Validation result\n */\nexport function validateConversationId(conversationId: string | undefined): AXValidationResult {\n if (!conversationId || typeof conversationId !== 'string' || conversationId.trim().length === 0) {\n return {\n valid: false,\n error: 'Conversation ID is required',\n errorCode: 'MISSING_CONVERSATION_ID',\n };\n }\n\n // Check for reasonable length\n if (conversationId.length > 255) {\n return {\n valid: false,\n error: 'Conversation ID is too long',\n errorCode: 'MISSING_CONVERSATION_ID',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate message type\n * @param type - Message type to validate\n * @returns Validation result\n */\nexport function validateMessageType(type: AXMessageType | undefined): AXValidationResult {\n if (!type || type.trim().length === 0) {\n return {\n valid: false,\n error: 'Message type is required',\n errorCode: 'MISSING_MESSAGE_TYPE',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate message payload\n * @param payload - Message payload to validate\n * @param type - Message type\n * @returns Validation result\n */\nexport function validateMessagePayload(payload: AXMessagePayload | undefined, type: AXMessageType): AXValidationResult {\n if (!payload) {\n return {\n valid: false,\n error: 'Message payload is required',\n errorCode: 'MISSING_PAYLOAD',\n };\n }\n\n // Type-specific validation\n switch (type) {\n case 'text':\n if (!('text' in payload) || typeof payload.text !== 'string') {\n return {\n valid: false,\n error: 'Text message must have a text property',\n errorCode: 'INVALID_TEXT_PAYLOAD',\n };\n }\n break;\n\n case 'image':\n case 'video':\n case 'audio':\n case 'voice':\n case 'file':\n if (!('url' in payload) || typeof payload.url !== 'string') {\n return {\n valid: false,\n error: `${type} message must have a url property`,\n errorCode: 'INVALID_MEDIA_PAYLOAD',\n };\n }\n break;\n\n case 'location':\n if (\n !('latitude' in payload) ||\n !('longitude' in payload) ||\n typeof payload.latitude !== 'number' ||\n typeof payload.longitude !== 'number'\n ) {\n return {\n valid: false,\n error: 'Location message must have latitude and longitude properties',\n errorCode: 'INVALID_LOCATION_PAYLOAD',\n };\n }\n break;\n }\n\n return { valid: true };\n}\n\n/**\n * Validate user ID\n * @param userId - User ID to validate\n * @returns Validation result\n */\nexport function validateUserId(userId: string | undefined): AXValidationResult {\n if (!userId || typeof userId !== 'string' || userId.trim().length === 0) {\n return {\n valid: false,\n error: 'User ID is required',\n errorCode: 'MISSING_USER_ID',\n };\n }\n\n // Check for reasonable length (prevent extremely long IDs)\n if (userId.length > 255) {\n return {\n valid: false,\n error: 'User ID is too long',\n errorCode: 'INVALID_USER_ID',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate array of user IDs\n * @param userIds - Array of user IDs to validate\n * @param minCount - Minimum number of users required\n * @param maxCount - Maximum number of users allowed\n * @returns Validation result\n */\nexport function validateUserIds(userIds: string[] | undefined, minCount = 1, maxCount?: number): AXValidationResult {\n if (!userIds || !Array.isArray(userIds)) {\n return {\n valid: false,\n error: 'User IDs must be an array',\n errorCode: 'INVALID_USER_IDS',\n };\n }\n\n if (userIds.length < minCount) {\n return {\n valid: false,\n error: `At least ${minCount} user(s) required`,\n errorCode: 'TOO_FEW_USERS',\n };\n }\n\n if (maxCount && userIds.length > maxCount) {\n return {\n valid: false,\n error: `Maximum ${maxCount} user(s) allowed`,\n errorCode: 'TOO_MANY_USERS',\n };\n }\n\n // Check for empty or invalid IDs\n const invalidIds = userIds.filter((id) => !id || id.trim().length === 0);\n if (invalidIds.length > 0) {\n return {\n valid: false,\n error: 'All user IDs must be non-empty strings',\n errorCode: 'INVALID_USER_ID',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate email address\n * @param email - Email to validate\n * @returns Validation result\n */\nexport function validateEmail(email: string | undefined): AXValidationResult {\n if (!email || email.trim().length === 0) {\n return {\n valid: false,\n error: 'Email is required',\n errorCode: 'MISSING_EMAIL',\n };\n }\n\n // Trim whitespace\n const trimmedEmail = email.trim();\n\n // Check length constraints\n if (trimmedEmail.length > 254) {\n return {\n valid: false,\n error: 'Email is too long',\n errorCode: 'INVALID_EMAIL',\n };\n }\n\n // Enhanced email regex with better validation\n const emailRegex =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n if (!emailRegex.test(trimmedEmail)) {\n return {\n valid: false,\n error: 'Invalid email format',\n errorCode: 'INVALID_EMAIL',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate URL\n * @param url - URL to validate\n * @returns Validation result\n */\nexport function validateUrl(url: string | undefined): AXValidationResult {\n if (!url || url.trim().length === 0) {\n return {\n valid: false,\n error: 'URL is required',\n errorCode: 'MISSING_URL',\n };\n }\n\n const trimmedUrl = url.trim();\n\n // Check for common URL issues\n if (trimmedUrl.length > 2048) {\n return {\n valid: false,\n error: 'URL is too long',\n errorCode: 'INVALID_URL',\n };\n }\n\n try {\n const urlObj = new URL(trimmedUrl);\n\n // Validate protocol\n if (!['http:', 'https:', 'ftp:', 'ftps:'].includes(urlObj.protocol)) {\n return {\n valid: false,\n error: 'Invalid URL protocol',\n errorCode: 'INVALID_URL',\n };\n }\n\n return { valid: true };\n } catch {\n return {\n valid: false,\n error: 'Invalid URL format',\n errorCode: 'INVALID_URL',\n };\n }\n}\n\n// =====================\n// Helper Functions\n// =====================\n\n/**\n * Match MIME type against a pattern (supports wildcards)\n * @param mimeType - MIME type to check\n * @param pattern - Pattern to match (e.g., \"image/*\", \"video/mp4\")\n * @returns Whether the MIME type matches the pattern\n */\nfunction matchMimeType(mimeType: string, pattern: string): boolean {\n if (pattern === '*/*' || pattern === '*') {\n return true;\n }\n\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n return mimeType.startsWith(prefix);\n }\n\n return mimeType === pattern;\n}\n\n/**\n * Format file size in human-readable format\n * @param bytes - File size in bytes\n * @returns Formatted file size string\n */\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1);\n\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n}\n\n/**\n * Sanitize user input to prevent XSS\n * Note: Angular provides built-in sanitization, but this is an additional layer\n * @param input - User input to sanitize\n * @returns Sanitized input\n */\nexport function sanitizeInput(input: string): string {\n if (!input) return '';\n\n return input\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\//g, '/')\n .replace(/`/g, '`')\n .replace(/=/g, '=');\n}\n\n/**\n * Validate latitude coordinate\n * @param latitude - Latitude to validate\n * @returns Validation result\n */\nexport function validateLatitude(latitude: number | undefined | null): AXValidationResult {\n if (latitude === undefined || latitude === null || typeof latitude !== 'number' || isNaN(latitude)) {\n return {\n valid: false,\n error: 'Latitude is required',\n errorCode: 'MISSING_LATITUDE',\n };\n }\n\n if (latitude < -90 || latitude > 90) {\n return {\n valid: false,\n error: 'Latitude must be between -90 and 90',\n errorCode: 'INVALID_LATITUDE',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate longitude coordinate\n * @param longitude - Longitude to validate\n * @returns Validation result\n */\nexport function validateLongitude(longitude: number | undefined | null): AXValidationResult {\n if (longitude === undefined || longitude === null || typeof longitude !== 'number' || isNaN(longitude)) {\n return {\n valid: false,\n error: 'Longitude is required',\n errorCode: 'MISSING_LONGITUDE',\n };\n }\n\n if (longitude < -180 || longitude > 180) {\n return {\n valid: false,\n error: 'Longitude must be between -180 and 180',\n errorCode: 'INVALID_LONGITUDE',\n };\n }\n\n return { valid: true };\n}\n","/**\n * Composer Action Registry\n * Register custom action buttons for the composer (attach, voice, location, etc.)\n */\n\nimport { computed, Injectable, signal, Type, inject } from '@angular/core';\nimport { AXComposerService } from '../components';\nimport type { AXConversationService } from '../services/conversation.service';\nimport { DEFAULT_COMPOSER_ACTIONS, REGISTRY_CONFIG } from '../tokens';\n\n/**\n * Composer context provided to actions\n */\nexport interface AXComposerActionContext {\n /** Current draft text */\n draftText: string;\n\n /** Conversation ID */\n conversationId: string;\n\n /** Whether editing a message */\n isEditing: boolean;\n\n /** Message being edited (if any) */\n editingMessageId?: string;\n\n /** Whether replying to a message */\n isReplying: boolean;\n\n /** Message being replied to (if any) */\n replyingToMessageId?: string;\n\n /** Composer service for composer operations */\n composerService?: AXComposerService;\n\n /** Conversation service for conversation operations */\n conversationService?: AXConversationService;\n\n /** Custom context data */\n custom?: Record<string, any>;\n}\n\n/**\n * Composer action registration\n */\nexport interface AXComposerAction {\n /** Unique action identifier */\n id: string;\n\n /** Display label (for accessibility) */\n label: string;\n\n /** Icon name/class */\n icon: string;\n\n /** Position: left or right */\n position: 'left' | 'right';\n\n /** Location: inline (show as button) or menu (show in dropdown menu) */\n location?: 'inline' | 'menu';\n\n /** Display order priority (higher = earlier) */\n priority?: number;\n\n /** Visibility condition */\n visible: (context: AXComposerActionContext) => boolean;\n\n /** Enabled condition */\n enabled?: (context: AXComposerActionContext) => boolean;\n\n /**\n * Component to show when action is activated\n * If provided, clicking the action will show this component in full-width mode\n */\n component?: Type<unknown>;\n\n /**\n * Whether this action is toggleable (shows/hides component)\n */\n toggleable?: boolean;\n\n /** Action handler (optional if component is provided) */\n handler?: (context: AXComposerActionContext) => void | Promise<void>;\n\n /** Tooltip text */\n tooltip?: string;\n\n /** Keyboard shortcut */\n shortcut?: string;\n\n /** Custom class for styling */\n className?: string;\n\n /** Badge text/count */\n badge?: string | number;\n}\n\n/**\n * Composer Action Registry Service\n */\n@Injectable()\nexport class AXComposerActionRegistry {\n private readonly _actions = signal<AXComposerAction[]>([]);\n\n constructor() {\n // Register default actions from individual token\n inject(DEFAULT_COMPOSER_ACTIONS, { optional: true })?.forEach((action) => this.register(action));\n\n // Register actions from REGISTRY_CONFIG\n const config = inject(REGISTRY_CONFIG, { optional: true });\n config?.composerActions?.forEach((action) => this.register(action));\n }\n\n /** All registered actions */\n readonly actions = this._actions.asReadonly();\n\n /** Left-side actions sorted by priority */\n readonly leftActions = computed(() =>\n [...this._actions()]\n .filter((action) => action.position === 'left')\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n );\n\n /** Right-side actions sorted by priority */\n readonly rightActions = computed(() =>\n [...this._actions()]\n .filter((action) => action.position === 'right')\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n );\n\n /** Left-side inline actions (location = 'inline' or undefined) */\n readonly leftInlineActions = computed(() =>\n this.leftActions().filter((action) => action.location !== 'menu'),\n );\n\n /** Left-side menu actions (location = 'menu') */\n readonly leftMenuActions = computed(() =>\n this.leftActions().filter((action) => action.location === 'menu'),\n );\n\n /** Right-side inline actions (location = 'inline' or undefined) */\n readonly rightInlineActions = computed(() =>\n this.rightActions().filter((action) => action.location !== 'menu'),\n );\n\n /** Right-side menu actions (location = 'menu') */\n readonly rightMenuActions = computed(() =>\n this.rightActions().filter((action) => action.location === 'menu'),\n );\n\n /**\n * Register a composer action\n */\n register(action: AXComposerAction): void {\n // Validate action\n if (!action.id) {\n throw new Error('Composer action must have an id');\n }\n if (!action.label) {\n throw new Error('Composer action must have a label');\n }\n if (!action.icon) {\n throw new Error('Composer action must have an icon');\n }\n if (!action.handler && !action.component) {\n throw new Error('Composer action must have either a handler or a component');\n }\n\n // Check for duplicates\n const existing = this._actions().find((a) => a.id === action.id);\n if (existing) {\n console.warn(`Composer action \"${action.id}\" is already registered. Replacing...`);\n this.unregister(action.id);\n }\n\n // Add to registry\n this._actions.update((actions) => [...actions, action]);\n }\n\n /**\n * Unregister a composer action\n */\n unregister(id: string): void {\n this._actions.update((actions) => actions.filter((a) => a.id !== id));\n }\n\n /**\n * Get visible actions for a position\n */\n getVisibleActions(position: 'left' | 'right', context: AXComposerActionContext): AXComposerAction[] {\n const actions = position === 'left' ? this.leftActions() : this.rightActions();\n return actions.filter((action) => action.visible(context));\n }\n\n /**\n * Get enabled actions for a position\n */\n getEnabledActions(position: 'left' | 'right', context: AXComposerActionContext): AXComposerAction[] {\n return this.getVisibleActions(position, context).filter((action) => action.enabled?.(context) !== false);\n }\n\n /**\n * Get action by ID\n */\n getActionById(id: string): AXComposerAction | undefined {\n return this._actions().find((a) => a.id === id);\n }\n\n /**\n * Execute an action\n */\n async executeAction(actionId: string, context: AXComposerActionContext): Promise<void> {\n const action = this.getActionById(actionId);\n if (!action) {\n throw new Error(`Action \"${actionId}\" not found`);\n }\n\n // Check if visible and enabled\n if (!action.visible(context)) {\n throw new Error(`Action \"${actionId}\" is not visible`);\n }\n if (action.enabled && !action.enabled(context)) {\n throw new Error(`Action \"${actionId}\" is not enabled`);\n }\n\n // Execute handler\n await action.handler(context);\n }\n\n /**\n * Update action badge\n */\n setBadge(id: string, badge: string | number | undefined): void {\n this._actions.update((actions) => actions.map((action) => (action.id === id ? { ...action, badge } : action)));\n }\n\n /**\n * Clear all actions\n */\n clear(): void {\n this._actions.set([]);\n }\n}\n","/**\n * Composer Tab Registry\n * Register custom tabs for the composer popup (emoji, stickers, GIFs, etc.)\n */\n\nimport { computed, inject, Injectable, signal, Type } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { DEFAULT_COMPOSER_TABS, REGISTRY_CONFIG } from '../tokens';\n\n/**\n * Composer tab registration\n */\nexport interface AXComposerTab {\n /** Unique tab identifier */\n id: string;\n\n /** Display title */\n title: string;\n\n /** Icon name/class */\n icon?: string;\n\n /** Display order priority (higher = earlier) */\n priority?: number;\n\n /** Angular component for tab content */\n component: Type<any>;\n\n /** Default data provider (optional) */\n dataProvider?: () => Observable<any>;\n\n /** Whether tab is enabled */\n enabled?: boolean;\n\n /** Custom class for styling */\n className?: string;\n\n /** Badge text/count */\n badge?: string | number;\n}\n\n/**\n * Composer Tab Registry Service\n */\n@Injectable()\nexport class AXComposerTabRegistry {\n private readonly _tabs = signal<AXComposerTab[]>([]);\n\n constructor() {\n // Register default tabs from individual token\n inject(DEFAULT_COMPOSER_TABS, { optional: true })?.forEach((tab) => this.register(tab));\n \n // Register tabs from REGISTRY_CONFIG\n const config = inject(REGISTRY_CONFIG, { optional: true });\n config?.composerTabs?.forEach((tab) => this.register(tab));\n }\n\n /** All registered tabs */\n readonly tabs = this._tabs.asReadonly();\n\n /** Enabled tabs sorted by priority */\n readonly enabledTabs = computed(() =>\n [...this._tabs()].filter((tab) => tab.enabled !== false).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n );\n\n /**\n * Register a composer tab\n */\n register(tab: AXComposerTab): void {\n // Validate tab\n if (!tab.id) {\n throw new Error('Composer tab must have an id');\n }\n if (!tab.title) {\n throw new Error('Composer tab must have a title');\n }\n if (!tab.component) {\n throw new Error('Composer tab must have a component');\n }\n\n // Check for duplicates\n const existing = this._tabs().find((t) => t.id === tab.id);\n if (existing) {\n console.warn(`Composer tab \"${tab.id}\" is already registered. Replacing...`);\n this.unregister(tab.id);\n }\n\n // Add to registry\n this._tabs.update((tabs) => [...tabs, tab]);\n }\n\n /**\n * Unregister a composer tab\n */\n unregister(id: string): void {\n this._tabs.update((tabs) => tabs.filter((t) => t.id !== id));\n }\n\n /**\n * Get tab by ID\n */\n getTabById(id: string): AXComposerTab | undefined {\n return this._tabs().find((t) => t.id === id);\n }\n\n /**\n * Enable/disable a tab\n */\n setEnabled(id: string, enabled: boolean): void {\n this._tabs.update((tabs) => tabs.map((tab) => (tab.id === id ? { ...tab, enabled } : tab)));\n }\n\n /**\n * Update tab badge\n */\n setBadge(id: string, badge: string | number | undefined): void {\n this._tabs.update((tabs) => tabs.map((tab) => (tab.id === id ? { ...tab, badge } : tab)));\n }\n\n /**\n * Clear all tabs\n */\n clear(): void {\n this._tabs.set([]);\n }\n}\n","/**\n * Abstract Base Registry\n * Base class for all registries with common functionality\n */\n\nimport { computed, signal, Signal, WritableSignal } from '@angular/core';\n\n/**\n * Base registry interface\n */\nexport interface AXRegistryItem {\n /** Unique identifier */\n id: string;\n\n /** Display order priority (higher = earlier) */\n priority?: number;\n\n /** Whether item is enabled */\n enabled?: boolean;\n}\n\n/**\n * Abstract Base Registry Class\n * Provides common registry functionality\n */\nexport abstract class AXBaseRegistry<T extends AXRegistryItem> {\n protected readonly _items: WritableSignal<T[]> = signal([]);\n\n /** All registered items */\n readonly items: Signal<T[]> = this._items.asReadonly();\n\n /** Enabled items sorted by priority */\n readonly enabledItems: Signal<T[]> = computed(() =>\n [...this._items()].filter((item) => item.enabled !== false).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n );\n\n /**\n * Register an item\n */\n register(item: T): void {\n this.validateItem(item);\n\n // Check for duplicates\n const existing = this._items().find((i) => i.id === item.id);\n if (existing) {\n console.warn(`${this.getRegistryName()}: Item \"${item.id}\" is already registered. Replacing...`);\n this.unregister(item.id);\n }\n\n // Add to registry\n this._items.update((items) => [...items, item]);\n }\n\n /**\n * Register multiple items\n */\n registerMany(items: T[]): void {\n items.forEach((item) => this.register(item));\n }\n\n /**\n * Unregister an item by ID\n */\n unregister(id: string): void {\n this._items.update((items) => items.filter((i) => i.id !== id));\n }\n\n /**\n * Get item by ID\n */\n getById(id: string): T | undefined {\n return this._items().find((i) => i.id === id);\n }\n\n /**\n * Check if item exists\n */\n has(id: string): boolean {\n return this.getById(id) !== undefined;\n }\n\n /**\n * Enable/disable an item\n */\n setEnabled(id: string, enabled: boolean): void {\n this._items.update((items) => items.map((item) => (item.id === id ? { ...item, enabled } : item)));\n }\n\n /**\n * Update an item\n */\n update(id: string, updates: Partial<T>): void {\n this._items.update((items) => items.map((item) => (item.id === id ? { ...item, ...updates } : item)));\n }\n\n /**\n * Clear all items\n */\n clear(): void {\n this._items.set([]);\n }\n\n /**\n * Get count of registered items\n */\n get count(): number {\n return this._items().length;\n }\n\n /**\n * Get count of enabled items\n */\n get enabledCount(): number {\n return this.enabledItems().length;\n }\n\n /**\n * Validate item before registration\n * Override in child classes for custom validation\n */\n protected validateItem(item: T): void {\n if (!item.id) {\n throw new Error(`${this.getRegistryName()}: Item must have an id`);\n }\n }\n\n /**\n * Get registry name for logging\n * Override in child classes\n */\n protected abstract getRegistryName(): string;\n}\n","/**\n * Conversation Item Action Registry\n * Manages actions available in the conversation list item context menu\n */\n\nimport { Injectable, inject } from '@angular/core';\nimport type { AXConversation } from '../models';\nimport type { AXConversationService } from '../services/conversation.service';\nimport { DEFAULT_CONVERSATION_ITEM_ACTIONS, REGISTRY_CONFIG } from '../tokens';\nimport { AXBaseRegistry, AXRegistryItem } from './base-registry.abstract';\n\n/**\n * Context provided to action handlers\n */\nexport interface AXConversationItemActionContext {\n /** The conversation */\n conversation: AXConversation;\n\n /** Conversation service for conversation operations */\n conversationService?: AXConversationService;\n\n /** Additional context data */\n data?: Record<string, any>;\n}\n\n/**\n * Conversation item action configuration\n */\nexport interface AXConversationItemAction extends AXRegistryItem {\n /** Action label */\n label: string | ((context: AXConversationItemActionContext) => string);\n\n /** Action icon (emoji or icon class) */\n icon?: string | ((context: AXConversationItemActionContext) => string);\n\n /** Tooltip text */\n tooltip?: string | ((context: AXConversationItemActionContext) => string);\n\n /** Whether this action is destructive */\n destructive?: boolean;\n\n /** Whether this is a divider */\n divider?: boolean;\n\n /**\n * Visibility condition\n * @returns true if action should be visible\n */\n visible?: (context: AXConversationItemActionContext) => boolean;\n\n /**\n * Dynamic enabled condition\n * @returns true if action should be enabled\n * Note: Use the `enabled` property from AXRegistryItem for static enable/disable\n */\n enabledWhen?: (context: AXConversationItemActionContext) => boolean;\n\n /**\n * Action handler\n * Called when the action is clicked\n */\n handler?: (context: AXConversationItemActionContext) => void | Promise<void>;\n}\n\n/**\n * Conversation Item Action Registry Service\n * Manages available actions in the conversation list item context menu\n */\n@Injectable()\nexport class AXConversationItemActionRegistry extends AXBaseRegistry<AXConversationItemAction> {\n constructor() {\n super();\n\n // Register default actions from individual token\n inject(DEFAULT_CONVERSATION_ITEM_ACTIONS, { optional: true })?.forEach((action) => this.register(action));\n\n // Register actions from REGISTRY_CONFIG\n const config = inject(REGISTRY_CONFIG, { optional: true });\n config?.conversationItemActions?.forEach((action) => this.register(action));\n }\n\n /**\n * Get registry name for logging\n */\n protected getRegistryName(): string {\n return 'ConversationItemActionRegistry';\n }\n\n /**\n * Get actions for a specific conversation\n */\n getActionsForConversation(conversation: AXConversation): AXConversationItemAction[] {\n const context: AXConversationItemActionContext = { conversation };\n\n return this.enabledItems()\n .filter((action) => {\n // Filter by visibility\n if (action.visible && !action.visible(context)) {\n return false;\n }\n return true;\n })\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n }\n\n /**\n * Get label for an action\n */\n getActionLabel(action: AXConversationItemAction, conversation: AXConversation): string {\n if (typeof action.label === 'function') {\n return action.label({ conversation });\n }\n return action.label;\n }\n\n /**\n * Get icon for an action\n */\n getActionIcon(action: AXConversationItemAction, conversation: AXConversation): string | undefined {\n if (!action.icon) return undefined;\n\n if (typeof action.icon === 'function') {\n return action.icon({ conversation });\n }\n return action.icon;\n }\n\n /**\n * Get tooltip for an action\n */\n getActionTooltip(action: AXConversationItemAction, conversation: AXConversation): string | undefined {\n if (!action.tooltip) return undefined;\n\n if (typeof action.tooltip === 'function') {\n return action.tooltip({ conversation });\n }\n return action.tooltip;\n }\n}\n","/**\n * Conversation Tab Registry\n * Register custom tabs for filtering conversations in the sidebar\n */\n\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport type { AXConversation } from '../models';\nimport { DEFAULT_CONVERSATION_TABS, REGISTRY_CONFIG } from '../tokens';\n\n/**\n * Conversation tab registration\n */\nexport interface AXConversationTab {\n /** Unique tab identifier */\n id: string;\n\n /** Display label */\n label: string;\n\n /** Icon name/class */\n icon?: string;\n\n /** Display order priority (higher = earlier) */\n priority?: number;\n\n /** Filter function to determine which conversations to show */\n filter: (conversations: AXConversation[]) => AXConversation[];\n\n /** Badge function to compute badge count/text */\n badge?: (conversations: AXConversation[]) => number | string | undefined;\n\n /** Whether tab is enabled */\n enabled?: boolean;\n\n /** Custom class for styling */\n className?: string;\n\n /** Whether this is the default active tab */\n default?: boolean;\n}\n\n/**\n * Conversation Tab Registry Service\n */\n@Injectable()\nexport class AXConversationTabRegistry {\n private readonly _tabs = signal<AXConversationTab[]>([]);\n\n constructor() {\n // Register default tabs from individual token\n inject(DEFAULT_CONVERSATION_TABS, { optional: true })?.forEach((tab) => this.register(tab));\n \n // Register tabs from REGISTRY_CONFIG\n const config = inject(REGISTRY_CONFIG, { optional: true });\n config?.conversationTabs?.forEach((tab) => this.register(tab));\n }\n\n /** All registered tabs */\n readonly tabs = this._tabs.asReadonly();\n\n /** Enabled tabs sorted by priority */\n readonly enabledTabs = computed(() =>\n [...this._tabs()].filter((tab) => tab.enabled !== false).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n );\n\n /** Default active tab */\n readonly defaultTab = computed(() => this.enabledTabs().find((tab) => tab.default === true) || this.enabledTabs()[0]);\n\n /**\n * Register a conversation tab\n */\n register(tab: AXConversationTab): void {\n // Validate tab\n if (!tab.id) {\n throw new Error('Conversation tab must have an id');\n }\n if (!tab.label) {\n throw new Error('Conversation tab must have a label');\n }\n if (!tab.filter) {\n throw new Error('Conversation tab must have a filter function');\n }\n\n // Check for duplicates\n const existing = this._tabs().find((t) => t.id === tab.id);\n if (existing) {\n console.warn(`Conversation tab \"${tab.id}\" is already registered. Replacing...`);\n this.unregister(tab.id);\n }\n\n // Add to registry\n this._tabs.update((tabs) => [...tabs, tab]);\n }\n\n /**\n * Unregister a conversation tab\n */\n unregister(id: string): void {\n this._tabs.update((tabs) => tabs.filter((t) => t.id !== id));\n }\n\n /**\n * Get tab by ID\n */\n getTabById(id: string): AXConversationTab | undefined {\n return this._tabs().find((t) => t.id === id);\n }\n\n /**\n * Apply tab filter to conversations\n */\n filterConversations(tabId: string, conversations: AXConversation[]): AXConversation[] {\n const tab = this.getTabById(tabId);\n if (!tab) {\n throw new Error(`Tab \"${tabId}\" not found`);\n }\n return tab.filter(conversations);\n }\n\n /**\n * Get badge for a tab\n */\n getBadge(tabId: string, conversations: AXConversation[]): number | string | undefined {\n const tab = this.getTabById(tabId);\n if (!tab || !tab.badge) {\n return undefined;\n }\n return tab.badge(conversations);\n }\n\n /**\n * Enable/disable a tab\n */\n setEnabled(id: string, enabled: boolean): void {\n this._tabs.update((tabs) => tabs.map((tab) => (tab.id === id ? { ...tab, enabled } : tab)));\n }\n\n /**\n * Set default tab\n */\n setDefault(id: string): void {\n this._tabs.update((tabs) =>\n tabs.map((tab) => ({\n ...tab,\n default: tab.id === id,\n })),\n );\n }\n\n /**\n * Clear all tabs\n */\n clear(): void {\n this._tabs.set([]);\n }\n}\n","/**\n * Info Bar Action Registry\n * Manages actions available in the conversation info bar\n */\n\nimport { Injectable, Type, inject } from '@angular/core';\nimport { AXInfoBarService } from '../components';\nimport type { AXConversation } from '../models';\nimport type { AXConversationService } from '../services/conversation.service';\nimport { DEFAULT_INFO_BAR_ACTIONS, REGISTRY_CONFIG } from '../tokens';\nimport { AXBaseRegistry, AXRegistryItem } from './base-registry.abstract';\n\n/**\n * Context provided to action handlers\n */\nexport interface AXInfoBarActionContext {\n /** The conversation */\n conversation: AXConversation;\n\n /** Conversation service for conversation operations */\n conversationService?: AXConversationService;\n\n /** Info bar service for UI operations */\n infoBarService?: AXInfoBarService;\n\n /** Additional context data */\n data?: Record<string, any>;\n}\n\n/**\n * Info bar action configuration\n */\nexport interface AXInfoBarAction extends AXRegistryItem {\n /** Action label */\n label: string | ((context: AXInfoBarActionContext) => string);\n\n /** Action icon (emoji or icon class) */\n icon?: string | ((context: AXInfoBarActionContext) => string);\n\n /** Tooltip text */\n tooltip?: string | ((context: AXInfoBarActionContext) => string);\n\n /** Whether this action is destructive */\n destructive?: boolean;\n\n /** Whether this is a divider */\n divider?: boolean;\n\n /** Display location: 'inline' for toolbar buttons, 'menu' for dropdown menu */\n location?: 'inline' | 'menu';\n\n /**\n * Component to show when action is activated (for inline actions)\n * If provided, clicking the action will show this component in the info-bar\n */\n component?: Type<unknown>;\n\n /**\n * Whether this action is toggleable (shows/hides component)\n */\n toggleable?: boolean;\n\n /**\n * Visibility condition\n * @returns true if action should be visible\n */\n visible?: (context: AXInfoBarActionContext) => boolean;\n\n /**\n * Dynamic enabled condition\n * @returns true if action should be enabled\n * Note: Use the `enabled` property from AXRegistryItem for static enable/disable\n */\n enabledWhen?: (context: AXInfoBarActionContext) => boolean;\n\n /**\n * Action handler\n * Called when the action is clicked\n */\n handler?: (context: AXInfoBarActionContext) => void | Promise<void>;\n}\n\n/**\n * Info Bar Action Registry Service\n * Manages available actions in the conversation info bar\n */\n@Injectable()\nexport class AXInfoBarActionRegistry extends AXBaseRegistry<AXInfoBarAction> {\n constructor() {\n super();\n\n // Register default actions from individual token\n inject(DEFAULT_INFO_BAR_ACTIONS, { optional: true })?.forEach((action) => this.register(action));\n\n // Register actions from REGISTRY_CONFIG\n const config = inject(REGISTRY_CONFIG, { optional: true });\n config?.infoBarActions?.forEach((action) => this.register(action));\n }\n\n /**\n * Get registry name for logging\n */\n protected getRegistryName(): string {\n return 'InfoBarActionRegistry';\n }\n\n /**\n * Get actions for a specific conversation\n */\n getActionsForConversation(conversation: AXConversation, location?: 'inline' | 'menu'): AXInfoBarAction[] {\n const context: AXInfoBarActionContext = { conversation };\n\n return this.enabledItems()\n .filter((action) => {\n // Filter by location if specified\n if (location && action.location && action.location !== location) {\n return false;\n }\n // Filter by visibility\n if (action.visible && !action.visible(context)) {\n return false;\n }\n return true;\n })\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n }\n\n /**\n * Get inline actions (toolbar buttons)\n */\n getInlineActions(conversation: AXConversation): AXInfoBarAction[] {\n return this.getActionsForConversation(conversation, 'inline');\n }\n\n /**\n * Get menu actions (dropdown items)\n */\n getMenuActions(conversation: AXConversation): AXInfoBarAction[] {\n return this.getActionsForConversation(conversation, 'menu');\n }\n\n /**\n * Get label for an action\n */\n getActionLabel(action: AXInfoBarAction, conversation: AXConversation): string {\n if (typeof action.label === 'function') {\n return action.label({ conversation });\n }\n return action.label;\n }\n\n /**\n * Get icon for an action\n */\n getActionIcon(action: AXInfoBarAction, conversation: AXConversation): string | undefined {\n if (!action.icon) return undefined;\n\n if (typeof action.icon === 'function') {\n return action.icon({ conversation });\n }\n return action.icon;\n }\n\n /**\n * Get tooltip for an action\n */\n getActionTooltip(action: AXInfoBarAction, conversation: AXConversation): string | undefined {\n if (!action.tooltip) return undefined;\n\n if (typeof action.tooltip === 'function') {\n return action.tooltip({ conversation });\n }\n return action.tooltip;\n }\n}\n","/**\n * Message Action Registry\n * Register custom actions that can be performed on messages\n */\n\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { AXComposerService, AXMessageListService } from '../components';\nimport { AXMessage, AXParticipant } from '../models';\nimport type { AXConversationService } from '../services/conversation.service';\nimport { DEFAULT_MESSAGE_ACTIONS, REGISTRY_CONFIG } from '../tokens/registry-config.tokens';\n\n/**\n * Action context provided to handlers\n */\nexport interface AXMessageActionContext {\n /** The message */\n message: AXMessage;\n\n /** Current user */\n currentUser: AXParticipant;\n\n /** All conversation participants */\n participants: AXParticipant[];\n\n /** Composer service for reply/edit operations */\n composerService: AXComposerService;\n\n /** Conversation service for message operations */\n conversationService: AXConversationService;\n\n /** Message list service for UI operations */\n messageListService: AXMessageListService;\n\n /** Custom context data */\n custom?: Record<string, any>;\n}\n\n/**\n * Message action registration\n */\nexport interface AXMessageAction {\n /** Unique action identifier */\n id: string;\n\n /** Display label */\n label: string;\n\n /** Icon name/class */\n icon?: string;\n\n /** Display order priority (higher = earlier) */\n priority?: number;\n\n /** Show as inline button */\n showInline?: boolean;\n\n /** Visibility condition */\n visible: (message: AXMessage, currentUser: AXParticipant) => boolean;\n\n /** Enabled condition */\n enabled: (message: AXMessage, currentUser: AXParticipant) => boolean;\n\n /** Action handler */\n handler: (context: AXMessageActionContext) => void | Promise<void>;\n\n /** Confirmation message (if required) */\n confirmMessage?: string;\n\n /** Keyboard shortcut */\n shortcut?: string;\n\n /** Custom class for styling */\n className?: string;\n\n /** Destructive action (shows warning) */\n destructive?: boolean;\n}\n\n/**\n * Message Action Registry Service\n */\n@Injectable()\nexport class AXMessageActionRegistry {\n private readonly _actions = signal<AXMessageAction[]>([]);\n\n constructor() {\n // Register default actions from individual token\n const defaultActions = inject(DEFAULT_MESSAGE_ACTIONS, { optional: true });\n if (defaultActions) {\n defaultActions.forEach((action) => this.register(action));\n }\n\n // Register actions from REGISTRY_CONFIG\n const config = inject(REGISTRY_CONFIG, { optional: true });\n config?.messageActions?.forEach((action) => this.register(action));\n }\n\n /** All registered actions */\n readonly actions = this._actions.asReadonly();\n\n /** Actions sorted by priority */\n readonly sortedActions = computed(() => [...this._actions()].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)));\n\n /**\n * Register a message action\n */\n register(action: AXMessageAction): void {\n // Validate action\n if (!action.id) {\n throw new Error('Message action must have an id');\n }\n if (!action.label) {\n throw new Error('Message action must have a label');\n }\n if (!action.handler) {\n throw new Error('Message action must have a handler');\n }\n\n // Check for duplicates\n const existing = this._actions().find((a) => a.id === action.id);\n if (existing) {\n console.warn(`Message action \"${action.id}\" is already registered. Replacing...`);\n this.unregister(action.id);\n }\n\n // Add to registry\n this._actions.update((actions) => [...actions, action]);\n }\n\n /**\n * Unregister a message action\n */\n unregister(id: string): void {\n this._actions.update((actions) => actions.filter((a) => a.id !== id));\n }\n\n /**\n * Get all actions for a specific message\n */\n getActions(message: AXMessage, currentUser: AXParticipant): AXMessageAction[] {\n return this.sortedActions().filter(\n (action) => action.visible(message, currentUser) && action.enabled(message, currentUser),\n );\n }\n\n /**\n * Get menu actions for a message\n */\n getMenuActions(message: AXMessage, currentUser: AXParticipant): AXMessageAction[] {\n return this.getActions(message, currentUser);\n }\n\n /**\n * Get inline actions for a message\n */\n getInlineActions(message: AXMessage, currentUser: AXParticipant): AXMessageAction[] {\n return this.getActions(message, currentUser).filter((action) => action.showInline === true);\n }\n\n /**\n * Get action by ID\n */\n getActionById(id: string): AXMessageAction | undefined {\n return this._actions().find((a) => a.id === id);\n }\n\n /**\n * Execute an action\n */\n async executeAction(actionId: string, context: AXMessageActionContext): Promise<void> {\n const action = this.getActionById(actionId);\n if (!action) {\n throw new Error(`Action \"${actionId}\" not found`);\n }\n\n // Check if enabled\n if (!action.enabled(context.message, context.currentUser)) {\n throw new Error(`Action \"${actionId}\" is not enabled`);\n }\n\n // Execute handler\n await action.handler(context);\n }\n\n /**\n * Clear all actions\n */\n clear(): void {\n this._actions.set([]);\n }\n}\n","/**\n * IndexedDB Storage Wrapper\n * Provides persistent storage for conversation data\n */\n\nimport type { AXConversation, AXMessage, AXParticipant } from '../../models';\n\nconst DB_NAME = 'acorex-conversation-db';\nconst DB_VERSION = 1;\n\n// Store names\nconst STORES = {\n PARTICIPANTS: 'participants',\n CONVERSATIONS: 'conversations',\n MESSAGES: 'messages',\n SETTINGS: 'settings',\n} as const;\n\nclass IndexedDBStorage {\n private db: IDBDatabase | null = null;\n private initPromise: Promise<void> | null = null;\n\n /**\n * Initialize IndexedDB\n */\n async init(): Promise<void> {\n if (this.db) return;\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => {\n this.db = request.result;\n resolve();\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n\n // Create object stores if they don't exist\n if (!db.objectStoreNames.contains(STORES.PARTICIPANTS)) {\n db.createObjectStore(STORES.PARTICIPANTS, { keyPath: 'id' });\n }\n if (!db.objectStoreNames.contains(STORES.CONVERSATIONS)) {\n const convStore = db.createObjectStore(STORES.CONVERSATIONS, { keyPath: 'id' });\n convStore.createIndex('lastMessageAt', 'lastMessageAt', { unique: false });\n }\n if (!db.objectStoreNames.contains(STORES.MESSAGES)) {\n const msgStore = db.createObjectStore(STORES.MESSAGES, { keyPath: 'id' });\n msgStore.createIndex('conversationId', 'conversationId', { unique: false });\n msgStore.createIndex('timestamp', 'timestamp', { unique: false });\n }\n if (!db.objectStoreNames.contains(STORES.SETTINGS)) {\n db.createObjectStore(STORES.SETTINGS, { keyPath: 'key' });\n }\n };\n });\n\n return this.initPromise;\n }\n\n /**\n * Get a value from a store\n */\n async get<T>(storeName: string, key: string): Promise<T | undefined> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.get(key);\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Get all values from a store\n */\n async getAll<T>(storeName: string): Promise<T[]> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.getAll();\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Get values by index\n */\n async getAllByIndex<T>(storeName: string, indexName: string, query: IDBValidKey): Promise<T[]> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const index = store.index(indexName);\n const request = index.getAll(query);\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Put a value into a store\n */\n async put<T>(storeName: string, value: T): Promise<void> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.put(value);\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Delete a value from a store\n */\n async delete(storeName: string, key: string): Promise<void> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.delete(key);\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Clear all data from a store\n */\n async clear(storeName: string): Promise<void> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.clear();\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n // =====================\n // Convenience Methods\n // =====================\n\n async getParticipant(id: string): Promise<AXParticipant | undefined> {\n return this.get<AXParticipant>(STORES.PARTICIPANTS, id);\n }\n\n async getAllParticipants(): Promise<AXParticipant[]> {\n return this.getAll<AXParticipant>(STORES.PARTICIPANTS);\n }\n\n async putParticipant(participant: AXParticipant): Promise<void> {\n return this.put(STORES.PARTICIPANTS, participant);\n }\n\n async getConversation(id: string): Promise<AXConversation | undefined> {\n return this.get<AXConversation>(STORES.CONVERSATIONS, id);\n }\n\n async getAllConversations(): Promise<AXConversation[]> {\n return this.getAll<AXConversation>(STORES.CONVERSATIONS);\n }\n\n async putConversation(conversation: AXConversation): Promise<void> {\n return this.put(STORES.CONVERSATIONS, conversation);\n }\n\n async deleteConversation(id: string): Promise<void> {\n return this.delete(STORES.CONVERSATIONS, id);\n }\n\n async getMessage(id: string): Promise<AXMessage | undefined> {\n return this.get<AXMessage>(STORES.MESSAGES, id);\n }\n\n async getAllMessages(): Promise<AXMessage[]> {\n return this.getAll<AXMessage>(STORES.MESSAGES);\n }\n\n async getMessagesByConversation(conversationId: string): Promise<AXMessage[]> {\n return this.getAllByIndex<AXMessage>(STORES.MESSAGES, 'conversationId', conversationId);\n }\n\n async putMessage(message: AXMessage): Promise<void> {\n return this.put(STORES.MESSAGES, message);\n }\n\n async deleteMessage(id: string): Promise<void> {\n return this.delete(STORES.MESSAGES, id);\n }\n\n async getSetting(key: string): Promise<any> {\n const result = await this.get<{ key: string; value: any }>(STORES.SETTINGS, key);\n return result?.value;\n }\n\n async putSetting(key: string, value: any): Promise<void> {\n return this.put(STORES.SETTINGS, { key, value });\n }\n}\n\n// Export singleton instance\nexport const indexedDBStorage = new IndexedDBStorage();\nexport { STORES };\n","/**\n * Shared In-Memory Storage\n * Internal storage shared between all IndexedDB API implementations\n * This is NOT a service - just a shared data structure\n */\n\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport type { AXConversation, AXMessage, AXParticipant, AXPresenceUpdate, AXTypingIndicator } from '../../models';\nimport type { AXConnectionStatus } from '../../services/api';\nimport { indexedDBStorage } from './indexeddb-storage';\n\n// Shared storage instance\nclass SharedStorage {\n // Connection status\n readonly connectionStatus$ = new BehaviorSubject<AXConnectionStatus>('disconnected');\n\n // Data storage\n readonly participants = new Map<string, AXParticipant>();\n readonly conversations = new Map<string, AXConversation>();\n readonly messages = new Map<string, AXMessage>();\n readonly messagesByConversation = new Map<string, string[]>();\n\n // Event streams\n readonly messageStream$ = new Subject<AXMessage>();\n readonly messageUpdates$ = new Subject<AXMessage>();\n readonly messageDeletions$ = new Subject<string>();\n readonly typingIndicators$ = new Subject<AXTypingIndicator>();\n readonly presenceUpdates$ = new Subject<AXPresenceUpdate>();\n readonly conversationUpdates$ = new Subject<AXConversation>();\n\n readonly currentUserId = 'current-user';\n private isSeeded = false;\n private presenceInterval?: any;\n private messageSimulationInterval?: any;\n private isLoadedFromDB = false;\n\n /**\n * Load data from IndexedDB\n */\n async loadFromIndexedDB(): Promise<void> {\n if (this.isLoadedFromDB) return;\n\n try {\n console.log('📂 Loading data from IndexedDB...');\n\n // Load participants\n const participants = await indexedDBStorage.getAllParticipants();\n participants.forEach((p) => this.participants.set(p.id, p));\n\n // Load conversations\n const conversations = await indexedDBStorage.getAllConversations();\n conversations.forEach((c) => this.conversations.set(c.id, c));\n\n // Load messages\n const messages = await indexedDBStorage.getAllMessages();\n messages.forEach((m) => {\n this.messages.set(m.id, m);\n const convMessages = this.messagesByConversation.get(m.conversationId) || [];\n if (!convMessages.includes(m.id)) {\n convMessages.push(m.id);\n this.messagesByConversation.set(m.conversationId, convMessages);\n }\n });\n\n // Check if we loaded the seeded flag\n const seededFlag = await indexedDBStorage.getSetting('isSeeded');\n this.isSeeded = seededFlag === true;\n\n this.isLoadedFromDB = true;\n console.log('✅ Loaded from IndexedDB:', {\n participants: participants.length,\n conversations: conversations.length,\n messages: messages.length,\n isSeeded: this.isSeeded,\n });\n } catch (error) {\n console.error('❌ Error loading from IndexedDB:', error);\n }\n }\n\n /**\n * Seed initial data if not already seeded\n */\n async seedIfEmpty(): Promise<void> {\n // First, try to load from IndexedDB\n await this.loadFromIndexedDB();\n\n if (this.isSeeded || this.participants.size > 0) {\n console.log('✅ Data already exists, skipping seed');\n if (this.participants.size > 0) {\n this.startPresenceSimulation();\n }\n return;\n }\n\n console.log('🌱 Seeding initial data...');\n\n // Create participants (15 users for realistic data) with profile information\n const participants: AXParticipant[] = [\n {\n id: 'current-user',\n name: 'You',\n avatar: 'https://i.pravatar.cc/150?img=1',\n status: 'online',\n lastSeen: new Date(),\n metadata: {\n profile: {\n bio: 'Software developer passionate about creating amazing user experiences',\n email: 'you@example.com',\n phone: '+1 (555) 123-4567',\n location: 'San Francisco, CA',\n company: 'Tech Corp',\n title: 'Senior Developer',\n },\n },\n },\n {\n id: 'user-2',\n name: 'Alice Johnson',\n avatar: 'https://i.pravatar.cc/150?img=5',\n status: 'online',\n lastSeen: new Date(),\n metadata: {\n profile: {\n bio: 'Product designer with a love for minimalist aesthetics',\n email: 'alice.johnson@example.com',\n phone: '+1 (555) 234-5678',\n location: 'New York, NY',\n company: 'Design Studio',\n title: 'Lead Designer',\n },\n },\n },\n {\n id: 'user-3',\n name: 'Bob Smith',\n avatar: 'https://i.pravatar.cc/150?img=12',\n status: 'away',\n lastSeen: new Date(Date.now() - 300000),\n metadata: {\n profile: {\n bio: 'Full-stack developer and open source enthusiast',\n email: 'bob.smith@example.com',\n phone: '+1 (555) 345-6789',\n location: 'Austin, TX',\n company: 'Startup Inc',\n title: 'Tech Lead',\n },\n },\n },\n {\n id: 'user-4',\n name: 'Carol Williams',\n avatar: 'https://i.pravatar.cc/150?img=20',\n status: 'offline',\n lastSeen: new Date(Date.now() - 3600000),\n metadata: {\n profile: {\n bio: 'Marketing specialist focused on digital strategies',\n email: 'carol.williams@example.com',\n phone: '+1 (555) 456-7890',\n location: 'Los Angeles, CA',\n company: 'Marketing Pro',\n title: 'Marketing Manager',\n },\n },\n },\n {\n id: 'user-5',\n name: 'David Brown',\n avatar: 'https://i.pravatar.cc/150?img=13',\n status: 'online',\n lastSeen: new Date(),\n metadata: {\n profile: {\n bio: 'DevOps engineer passionate about automation',\n email: 'david.brown@example.com',\n phone: '+1 (555) 567-8901',\n location: 'Seattle, WA',\n company: 'Cloud Systems',\n title: 'DevOps Lead',\n },\n },\n },\n {\n id: 'user-6',\n name: 'Emma Davis',\n avatar: 'https://i.pravatar.cc/150?img=24',\n status: 'offline',\n lastSeen: new Date(Date.now() - 7200000),\n metadata: {\n profile: {\n bio: 'UX researcher exploring human behavior',\n email: 'emma.davis@example.com',\n phone: '+1 (555) 678-9012',\n location: 'Boston, MA',\n company: 'Research Lab',\n title: 'UX Researcher',\n },\n },\n },\n {\n id: 'user-7',\n name: 'Frank Miller',\n avatar: 'https://i.pravatar.cc/150?img=33',\n status: 'online',\n lastSeen: new Date(),\n metadata: {\n profile: {\n bio: 'Data scientist turning data into insights',\n email: 'frank.miller@example.com',\n phone: '+1 (555) 789-0123',\n location: 'Chicago, IL',\n company: 'Data Corp',\n title: 'Data Scientist',\n },\n },\n },\n {\n id: 'user-8',\n name: 'Grace Wilson',\n avatar: 'https://i.pravatar.cc/150?img=44',\n status: 'away',\n lastSeen: new Date(Date.now() - 600000),\n metadata: {\n profile: {\n bio: 'Mobile app developer for iOS and Android',\n email: 'grace.wilson@example.com',\n phone: '+1 (555) 890-1234',\n location: 'Miami, FL',\n company: 'Mobile Solutions',\n title: 'Mobile Developer',\n },\n },\n },\n {\n id: 'user-9',\n name: 'Henry Moore',\n avatar: 'https://i.pravatar.cc/150?img=52',\n status: 'online',\n lastSeen: new Date(),\n metadata: {\n profile: {\n bio: 'Security engineer protecting digital assets',\n email: 'henry.moore@example.com',\n phone: '+1 (555) 901-2345',\n location: 'Denver, CO',\n company: 'SecureNet',\n title: 'Security Engineer',\n },\n },\n },\n {\n id: 'user-10',\n name: 'Ivy Taylor',\n avatar: 'https://i.pravatar.cc/150?img=47',\n status: 'offline',\n lastSeen: new Date(Date.now() - 10800000),\n metadata: {\n profile: {\n bio: 'Content strategist crafting compelling narratives',\n email: 'ivy.taylor@example.com',\n phone: '+1 (555) 012-3456',\n location: 'Portland, OR',\n company: 'Content Agency',\n title: 'Content Strategist',\n },\n },\n },\n {\n id: 'user-11',\n name: 'Jack Anderson',\n avatar: 'https://i.pravatar.cc/150?img=68',\n status: 'online',\n lastSeen: new Date(),\n metadata: {\n profile: {\n bio: 'Backend engineer building scalable systems',\n email: 'jack.anderson@example.com',\n phone: '+1 (555) 123-4560',\n location: 'Phoenix, AZ',\n company: 'Backend Systems',\n title: 'Backend Engineer',\n },\n },\n },\n {\n id: 'user-12',\n name: 'Kate Thomas',\n avatar: 'https://i.pravatar.cc/150?img=32',\n status: 'away',\n lastSeen: new Date(Date.now() - 900000),\n metadata: {\n profile: {\n bio: 'Project manager keeping teams on track',\n email: 'kate.thomas@example.com',\n phone: '+1 (555) 234-5601',\n location: 'Atlanta, GA',\n company: 'Project Solutions',\n title: 'Project Manager',\n },\n },\n },\n {\n id: 'user-13',\n name: 'Leo Jackson',\n avatar: 'https://i.pravatar.cc/150?img=59',\n status: 'online',\n lastSeen: new Date(),\n metadata: {\n profile: {\n bio: 'AI/ML engineer exploring artificial intelligence',\n email: 'leo.jackson@example.com',\n phone: '+1 (555) 345-6012',\n location: 'San Jose, CA',\n company: 'AI Labs',\n title: 'ML Engineer',\n },\n },\n },\n {\n id: 'user-14',\n name: 'Mia White',\n avatar: 'https://i.pravatar.cc/150?img=45',\n status: 'offline',\n lastSeen: new Date(Date.now() - 14400000),\n metadata: {\n profile: {\n bio: 'Business analyst bridging tech and business',\n email: 'mia.white@example.com',\n phone: '+1 (555) 456-0123',\n location: 'Dallas, TX',\n company: 'Business Analytics',\n title: 'Business Analyst',\n },\n },\n },\n {\n id: 'user-15',\n name: 'Noah Harris',\n avatar: 'https://i.pravatar.cc/150?img=70',\n status: 'online',\n lastSeen: new Date(),\n metadata: {\n profile: {\n bio: 'QA engineer ensuring quality in every release',\n email: 'noah.harris@example.com',\n phone: '+1 (555) 567-0124',\n location: 'Nashville, TN',\n company: 'Quality Assurance',\n title: 'QA Engineer',\n },\n },\n },\n ];\n\n // Store participants in memory and IndexedDB\n for (const p of participants) {\n this.participants.set(p.id, p);\n await indexedDBStorage.putParticipant(p);\n }\n\n // Start presence simulation\n this.startPresenceSimulation();\n\n // Start message simulation\n this.startMessageSimulation();\n\n // Create conversations: 2 private + 2 groups\n const now = new Date();\n const conversations: AXConversation[] = [\n // Private Chat 1: Alice Johnson\n {\n id: 'conv-1',\n type: 'private',\n title: 'Alice Johnson',\n participants: [participants[0], { ...participants[1], role: 'member' }],\n lastMessageAt: new Date(now.getTime() - 60000),\n unreadCount: 2,\n status: { isTyping: false, typingUsers: [] },\n permissions: {\n canSendMessages: true,\n canSendMedia: true,\n canDeleteMessages: true,\n canAddMembers: false,\n canRemoveMembers: false,\n canEditInfo: false,\n canPinMessages: true,\n },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: {\n profile: {\n description: 'Private conversation with Alice Johnson',\n tags: ['work', 'design'],\n favorite: true,\n },\n },\n createdAt: new Date(now.getTime() - 86400000),\n updatedAt: new Date(now.getTime() - 60000),\n },\n // Private Chat 2: Bob Smith\n {\n id: 'conv-2',\n type: 'private',\n title: 'Bob Smith',\n participants: [participants[0], { ...participants[2], role: 'member' }],\n lastMessageAt: new Date(now.getTime() - 7200000),\n unreadCount: 0,\n status: { isTyping: false, typingUsers: [] },\n permissions: {\n canSendMessages: true,\n canSendMedia: true,\n canDeleteMessages: true,\n canAddMembers: false,\n canRemoveMembers: false,\n canEditInfo: false,\n canPinMessages: true,\n },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: {\n profile: {\n description: 'Private conversation with Bob Smith',\n tags: ['development', 'tech'],\n favorite: false,\n },\n },\n createdAt: new Date(now.getTime() - 259200000),\n updatedAt: new Date(now.getTime() - 7200000),\n },\n // Group Chat 1: Project Team (3-5 members)\n {\n id: 'conv-3',\n type: 'group',\n title: 'Project Team',\n avatar: 'https://i.pravatar.cc/150?img=50',\n participants: [\n { ...participants[0], role: 'admin' },\n { ...participants[1], role: 'member' },\n { ...participants[2], role: 'member' },\n { ...participants[4], role: 'member' },\n ],\n lastMessageAt: new Date(now.getTime() - 3600000),\n unreadCount: 1,\n status: { isTyping: false, typingUsers: [] },\n permissions: {\n canSendMessages: true,\n canSendMedia: true,\n canDeleteMessages: true,\n canAddMembers: true,\n canRemoveMembers: true,\n canEditInfo: true,\n canPinMessages: true,\n },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: {\n profile: {\n description: 'Team collaboration for current project',\n tags: ['work', 'project', 'team'],\n favorite: true,\n groupInfo: {\n createdBy: 'current-user',\n purpose: 'Project coordination and updates',\n },\n },\n },\n createdAt: new Date(now.getTime() - 604800000),\n updatedAt: new Date(now.getTime() - 3600000),\n },\n // Group Chat 2: Design Team (5-10 members)\n {\n id: 'conv-4',\n type: 'group',\n title: 'Design Team',\n avatar: 'https://i.pravatar.cc/150?img=65',\n participants: [\n { ...participants[0], role: 'admin' },\n { ...participants[1], role: 'member' },\n { ...participants[3], role: 'member' },\n { ...participants[5], role: 'member' },\n { ...participants[6], role: 'member' },\n { ...participants[7], role: 'member' },\n { ...participants[8], role: 'member' },\n { ...participants[10], role: 'member' },\n ],\n lastMessageAt: new Date(now.getTime() - 10800000),\n unreadCount: 0,\n status: { isTyping: false, typingUsers: [] },\n permissions: {\n canSendMessages: true,\n canSendMedia: true,\n canDeleteMessages: true,\n canAddMembers: true,\n canRemoveMembers: true,\n canEditInfo: true,\n canPinMessages: true,\n },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: {\n profile: {\n description: 'Design team collaboration and brainstorming',\n tags: ['design', 'creative', 'team'],\n favorite: false,\n groupInfo: {\n createdBy: 'user-2',\n purpose: 'Design reviews and creative discussions',\n },\n },\n },\n createdAt: new Date(now.getTime() - 1209600000),\n updatedAt: new Date(now.getTime() - 10800000),\n },\n ];\n\n // Store conversations in memory and IndexedDB\n for (const c of conversations) {\n this.conversations.set(c.id, c);\n await indexedDBStorage.putConversation(c);\n }\n\n // Create messages with ALL types for each conversation\n const messages: AXMessage[] = [];\n\n // Conv-1 (Private: Alice) - All message types\n messages.push(\n {\n id: 'msg-1-1',\n conversationId: 'conv-1',\n senderId: 'user-2',\n type: 'text',\n timestamp: new Date(now.getTime() - 300000),\n payload: { type: 'text', text: 'Hey! How are you doing?' },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-1-2',\n conversationId: 'conv-1',\n senderId: 'current-user',\n type: 'text',\n timestamp: new Date(now.getTime() - 270000),\n payload: { type: 'text', text: \"I'm good! Working on the new project.\" },\n status: 'read',\n reactions: [{ emoji: '👍', userId: 'user-2', timestamp: new Date(now.getTime() - 265000) }],\n metadata: {},\n },\n {\n id: 'msg-1-3',\n conversationId: 'conv-1',\n senderId: 'user-2',\n type: 'image',\n timestamp: new Date(now.getTime() - 240000),\n payload: {\n type: 'image',\n url: 'https://picsum.photos/400/300',\n thumbnailUrl: 'https://picsum.photos/200/150',\n width: 400,\n height: 300,\n caption: 'Check out this design!',\n },\n status: 'read',\n reactions: [{ emoji: '🔥', userId: 'current-user', timestamp: new Date(now.getTime() - 235000) }],\n metadata: {},\n },\n {\n id: 'msg-1-4',\n conversationId: 'conv-1',\n senderId: 'current-user',\n type: 'voice',\n timestamp: new Date(now.getTime() - 180000),\n payload: {\n type: 'voice',\n url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',\n duration: 15,\n size: 245760,\n waveform: [0.2, 0.4, 0.6, 0.8, 0.5, 0.3, 0.7, 0.9, 0.4, 0.2],\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-1-5',\n conversationId: 'conv-1',\n senderId: 'user-2',\n type: 'audio',\n timestamp: new Date(now.getTime() - 120000),\n payload: {\n type: 'audio',\n url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3',\n title: 'Background Music',\n duration: 180,\n size: 3145728,\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-1-6',\n conversationId: 'conv-1',\n senderId: 'current-user',\n type: 'location',\n timestamp: new Date(now.getTime() - 90000),\n payload: {\n type: 'location',\n latitude: 37.7749,\n longitude: -122.4194,\n address: 'San Francisco, CA',\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-1-7',\n conversationId: 'conv-1',\n senderId: 'user-2',\n type: 'sticker',\n timestamp: new Date(now.getTime() - 60000),\n payload: {\n type: 'sticker',\n url: 'https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f44d.png',\n packId: 'pack-1',\n id: 'sticker-thumbs-up',\n animated: false,\n },\n status: 'delivered',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-1-8',\n conversationId: 'conv-1',\n senderId: 'user-2',\n type: 'file',\n timestamp: new Date(now.getTime() - 30000),\n payload: {\n type: 'file',\n url: 'https://example.com/document.pdf',\n name: 'Project_Proposal.pdf',\n size: 2048576,\n mimeType: 'application/pdf',\n },\n status: 'delivered',\n reactions: [],\n metadata: {},\n },\n );\n\n // Conv-2 (Private: Bob) - Mixed messages\n messages.push(\n {\n id: 'msg-2-1',\n conversationId: 'conv-2',\n senderId: 'user-3',\n type: 'text',\n timestamp: new Date(now.getTime() - 7200000),\n payload: { type: 'text', text: 'Did you see the latest updates?' },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-2-2',\n conversationId: 'conv-2',\n senderId: 'current-user',\n type: 'video',\n timestamp: new Date(now.getTime() - 7180000),\n payload: {\n type: 'video',\n url: 'https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4',\n thumbnailUrl: 'https://picsum.photos/640/360',\n duration: 60,\n size: 1048576,\n width: 1280,\n height: 720,\n },\n status: 'read',\n reactions: [{ emoji: '😂', userId: 'user-3', timestamp: new Date(now.getTime() - 7175000) }],\n metadata: {},\n },\n );\n\n // Conv-3 (Group: Project Team) - Group messages\n messages.push(\n {\n id: 'msg-3-1',\n conversationId: 'conv-3',\n senderId: 'user-2',\n type: 'text',\n timestamp: new Date(now.getTime() - 3700000),\n payload: { type: 'text', text: 'Team meeting at 3 PM today!' },\n status: 'read',\n reactions: [\n { emoji: '👍', userId: 'current-user', timestamp: new Date(now.getTime() - 3695000) },\n { emoji: '👍', userId: 'user-3', timestamp: new Date(now.getTime() - 3690000) },\n ],\n metadata: {},\n },\n {\n id: 'msg-3-2',\n conversationId: 'conv-3',\n senderId: 'user-5',\n type: 'image',\n timestamp: new Date(now.getTime() - 3650000),\n payload: {\n type: 'image',\n url: 'https://picsum.photos/800/600',\n thumbnailUrl: 'https://picsum.photos/200/150',\n width: 800,\n height: 600,\n caption: 'Sprint planning board',\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-3-3',\n conversationId: 'conv-3',\n senderId: 'current-user',\n type: 'text',\n timestamp: new Date(now.getTime() - 3600000),\n payload: { type: 'text', text: 'Great work everyone! 🎉' },\n status: 'read',\n reactions: [{ emoji: '🎉', userId: 'user-2', timestamp: new Date(now.getTime() - 3595000) }],\n metadata: {},\n },\n {\n id: 'msg-3-4',\n conversationId: 'conv-3',\n senderId: 'user-2',\n type: 'text',\n timestamp: new Date(now.getTime() - 3550000),\n payload: { type: 'text', text: 'Thanks! Looking forward to it.' },\n status: 'delivered',\n reactions: [],\n metadata: {},\n },\n );\n\n // Conv-4 (Group: Design Team) - Design-related messages\n messages.push(\n {\n id: 'msg-4-1',\n conversationId: 'conv-4',\n senderId: 'user-7',\n type: 'text',\n timestamp: new Date(now.getTime() - 10900000),\n payload: { type: 'text', text: 'New design mockups are ready for review' },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-4-2',\n conversationId: 'conv-4',\n senderId: 'user-8',\n type: 'file',\n timestamp: new Date(now.getTime() - 10850000),\n payload: {\n type: 'file',\n url: 'https://example.com/designs.zip',\n name: 'UI_Designs_v2.zip',\n size: 15728640,\n mimeType: 'application/zip',\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-4-3',\n conversationId: 'conv-4',\n senderId: 'current-user',\n type: 'sticker',\n timestamp: new Date(now.getTime() - 10800000),\n payload: {\n type: 'sticker',\n url: 'https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f389.png',\n packId: 'pack-1',\n id: 'sticker-party',\n animated: false,\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n );\n\n // Store all messages in memory and IndexedDB\n for (const m of messages) {\n this.messages.set(m.id, m);\n const convMessages = this.messagesByConversation.get(m.conversationId) || [];\n convMessages.push(m.id);\n this.messagesByConversation.set(m.conversationId, convMessages);\n await indexedDBStorage.putMessage(m);\n }\n\n // Update conversations with last messages\n conversations[0].lastMessage = messages.find((m) => m.id === 'msg-1-8');\n conversations[1].lastMessage = messages.find((m) => m.id === 'msg-2-2');\n conversations[2].lastMessage = messages.find((m) => m.id === 'msg-3-3');\n conversations[3].lastMessage = messages.find((m) => m.id === 'msg-4-3');\n\n // Update in memory and IndexedDB\n for (const c of conversations) {\n this.conversations.set(c.id, c);\n await indexedDBStorage.putConversation(c);\n }\n\n this.isSeeded = true;\n await indexedDBStorage.putSetting('isSeeded', true);\n console.log('✅ Initial data seeded successfully!');\n\n // Start message simulation\n this.startMessageSimulation();\n }\n\n /**\n * Simulate user presence changes (online/offline/away)\n */\n private startPresenceSimulation(): void {\n // Change user status every 20-40 seconds\n const scheduleNextPresenceChange = () => {\n const delay = 20000 + Math.random() * 20000; // 20-40 seconds\n setTimeout(() => {\n const users = Array.from(this.participants.values()).filter((u) => u.id !== this.currentUserId);\n const randomUser = users[Math.floor(Math.random() * users.length)];\n\n if (randomUser) {\n const statuses: ('online' | 'offline' | 'away')[] = ['online', 'offline', 'away'];\n const newStatus = statuses[Math.floor(Math.random() * statuses.length)];\n\n randomUser.status = newStatus;\n randomUser.lastSeen = newStatus === 'online' ? new Date() : randomUser.lastSeen;\n this.participants.set(randomUser.id, randomUser);\n\n // Emit presence update\n this.presenceUpdates$.next({\n userId: randomUser.id,\n status: newStatus,\n lastSeen: randomUser.lastSeen,\n });\n\n console.log(`👤 ${randomUser.name} is now ${newStatus}`);\n }\n\n scheduleNextPresenceChange();\n }, delay);\n };\n\n scheduleNextPresenceChange();\n }\n\n /**\n * Simulate random messages from users\n */\n private startMessageSimulation(): void {\n // Contextual message templates based on conversation type\n const getMessageTemplate = (convType: 'private' | 'group' | 'channel'): string => {\n const privateMessages = [\n 'Hey! How are you doing today?',\n 'Did you see my last message?',\n 'Can we schedule a quick call?',\n 'Thanks for getting back to me!',\n 'I have a question about the project',\n \"Let me know when you're available\",\n 'That makes sense, thanks!',\n 'Looking forward to catching up',\n 'Could you review this when you get a chance?',\n \"Perfect! Let's do it\",\n \"I'll send you the details shortly\",\n 'Sounds good to me',\n 'What do you think about this?',\n 'I completely agree',\n 'Need your help with something',\n 'Just wanted to check in',\n 'Awesome work! 🎉',\n 'Let me get back to you on that',\n \"I'm looking into it now\",\n 'Should have an update soon',\n 'Coffee later? ☕',\n 'Have a great day!',\n 'See you tomorrow!',\n 'Thanks again for your help',\n ];\n \n const groupMessages = [\n 'Morning everyone! ☀️',\n 'Quick update on the project status',\n 'Can we schedule a team meeting?',\n 'Great work team! 🎉',\n 'I have some questions about the requirements',\n 'Who\\'s available for a sync?',\n 'Thanks for the update!',\n 'Looking forward to the demo',\n 'Could someone review the PR?',\n 'Let\\'s discuss this in the meeting',\n 'I\\'ll share the docs in a moment',\n 'That\\'s a solid approach',\n 'What does everyone think?',\n 'Agreed with the direction',\n 'Need input from the team',\n 'Status update: on track ✅',\n 'Fantastic progress everyone!',\n 'I\\'ll follow up on this',\n 'Working on it as we speak',\n 'ETA: end of day',\n 'Anyone free for a quick huddle?',\n 'Pushing the changes now',\n 'Tests are passing! ✨',\n 'Ready for review',\n 'Deployed to staging 🚀',\n ];\n \n const channelMessages = [\n '📢 Important announcement for everyone',\n '🎯 New feature released!',\n '📊 Weekly metrics are looking great',\n '🔔 Reminder: Team standup in 10 minutes',\n '✨ Check out the latest updates',\n '🚀 Deployment completed successfully',\n '📝 New documentation available',\n '🎉 Milestone achieved!',\n '⚠️ Scheduled maintenance tonight',\n '💡 Pro tip: Use the new shortcuts',\n '📢 All hands meeting tomorrow',\n '🔥 Hot fix deployed',\n '📈 Performance improvements live',\n '🎊 Celebrating our success!',\n '📣 Don\\'t miss the upcoming event',\n '🌟 Featured project of the week',\n '🔧 System update in progress',\n '📌 Pinned: Important resources',\n '🎁 New benefits announced',\n '🏆 Team recognition time!',\n '📅 Mark your calendars',\n '💪 Keep up the great work!',\n '🔐 Security update required',\n '🎨 New design system released',\n '📱 Mobile app update available',\n ];\n \n if (convType === 'channel') {\n return channelMessages[Math.floor(Math.random() * channelMessages.length)];\n } else if (convType === 'group') {\n return groupMessages[Math.floor(Math.random() * groupMessages.length)];\n } else {\n return privateMessages[Math.floor(Math.random() * privateMessages.length)];\n }\n };\n\n // Send random message every 30-90 seconds\n const scheduleNextMessage = () => {\n const delay = 30000 + Math.random() * 60000; // 30-90 seconds\n setTimeout(async () => {\n const conversations = Array.from(this.conversations.values());\n const randomConv = conversations[Math.floor(Math.random() * conversations.length)];\n\n if (randomConv) {\n // Get online users from this conversation (excluding current user)\n const onlineUsers = randomConv.participants\n .filter((p) => p.id !== this.currentUserId && this.participants.get(p.id)?.status === 'online')\n .map((p) => p.id);\n\n if (onlineUsers.length > 0) {\n const randomSender = onlineUsers[Math.floor(Math.random() * onlineUsers.length)];\n const messageText = getMessageTemplate(randomConv.type);\n\n // Show typing indicator first\n this.typingIndicators$.next({\n conversationId: randomConv.id,\n userId: randomSender,\n userName: this.participants.get(randomSender)?.name,\n timestamp: new Date(),\n });\n\n // Wait 2-4 seconds (typing simulation)\n setTimeout(\n async () => {\n // Stop typing (emit with old timestamp to clear)\n this.typingIndicators$.next({\n conversationId: randomConv.id,\n userId: randomSender,\n userName: this.participants.get(randomSender)?.name,\n timestamp: new Date(Date.now() - 10000), // Old timestamp to clear\n });\n\n // Create message\n const newMessage: AXMessage = {\n id: `msg-sim-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n conversationId: randomConv.id,\n senderId: randomSender,\n type: 'text',\n timestamp: new Date(),\n payload: { type: 'text', text: messageText },\n status: 'sent',\n reactions: [],\n metadata: {},\n };\n\n // Store message\n this.messages.set(newMessage.id, newMessage);\n const convMessages = this.messagesByConversation.get(randomConv.id) || [];\n convMessages.push(newMessage.id);\n this.messagesByConversation.set(randomConv.id, convMessages);\n await indexedDBStorage.putMessage(newMessage);\n\n // Update conversation\n randomConv.lastMessage = newMessage;\n randomConv.lastMessageAt = newMessage.timestamp;\n randomConv.unreadCount = (randomConv.unreadCount || 0) + 1;\n this.conversations.set(randomConv.id, randomConv);\n await indexedDBStorage.putConversation(randomConv);\n\n // Emit message\n this.messageStream$.next(newMessage);\n this.conversationUpdates$.next(randomConv);\n\n const senderName = this.participants.get(randomSender)?.name || 'User';\n console.log(`💬 ${senderName} sent: \"${messageText}\" in ${randomConv.title}`);\n },\n 2000 + Math.random() * 2000,\n );\n }\n }\n\n scheduleNextMessage();\n }, delay);\n };\n\n // Start after 10 seconds\n setTimeout(() => scheduleNextMessage(), 10000);\n }\n\n /**\n * Stop presence simulation\n */\n stopPresenceSimulation(): void {\n if (this.presenceInterval) {\n clearInterval(this.presenceInterval);\n this.presenceInterval = undefined;\n }\n }\n\n /**\n * Stop message simulation\n */\n stopMessageSimulation(): void {\n if (this.messageSimulationInterval) {\n clearInterval(this.messageSimulationInterval);\n this.messageSimulationInterval = undefined;\n }\n }\n}\n\n// Export singleton instance\nexport const sharedStorage = new SharedStorage();\n","/**\n * IndexedDB User API Implementation\n * Implements AXUserApi using IndexedDB backend\n */\n\nimport { Injectable } from '@angular/core';\nimport type { AXParticipant, AXPresenceUpdate } from '../../models';\nimport {\n AXUserApi,\n AXBlockReportReason,\n AXPresenceStatus,\n AXUserProfileUpdate,\n AXUserSearchFilters,\n} from '../../services/api';\nimport { sharedStorage } from './shared-storage';\n\n@Injectable()\nexport class AXIndexedDBUserApi extends AXUserApi {\n\n // =====================\n // User Profile\n // =====================\n\n async getCurrentUser(): Promise<AXParticipant> {\n const user = sharedStorage.participants.get(sharedStorage.currentUserId);\n if (!user) {\n throw this.createError('USER_NOT_FOUND', 'Current user not found', 404);\n }\n return user;\n }\n\n async updateProfile(updates: AXUserProfileUpdate): Promise<AXParticipant> {\n // Mock update - in real implementation, this would update backend\n const user = await this.getCurrentUser();\n return {\n ...user,\n ...updates,\n };\n }\n\n async uploadAvatar(file: File): Promise<string> {\n // Mock upload - return a data URL\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.readAsDataURL(file);\n });\n }\n\n // =====================\n // User Discovery\n // =====================\n\n async getUsers(filters?: AXUserSearchFilters): Promise<AXParticipant[]> {\n const users = Array.from(sharedStorage.participants.values());\n const filtered = users.filter((u) => u.id !== sharedStorage.currentUserId);\n if (!filters?.query) return filtered;\n const q = filters.query.toLowerCase();\n return filtered.filter((u) => u.name.toLowerCase().includes(q));\n }\n\n async searchUsers(query: string): Promise<AXParticipant[]> {\n return this.getUsers({ query });\n }\n\n async getUserById(userId: string): Promise<AXParticipant> {\n const user = sharedStorage.participants.get(userId);\n if (!user) {\n throw this.createError('USER_NOT_FOUND', `User ${userId} not found`, 404);\n }\n return user;\n }\n\n async getUsersByIds(userIds: string[]): Promise<AXParticipant[]> {\n return userIds\n .map((id) => sharedStorage.participants.get(id))\n .filter((u): u is AXParticipant => u !== undefined);\n }\n\n // =====================\n // Presence Management\n // =====================\n\n async getUserPresence(userId: string): Promise<AXPresenceUpdate> {\n return {\n userId,\n status: 'online',\n lastSeen: new Date(),\n };\n }\n\n async updatePresence(_status: AXPresenceStatus, _statusText?: string): Promise<void> {\n // Mock presence update\n await Promise.resolve();\n }\n\n // =====================\n // User Blocking & Reporting\n // =====================\n\n async blockUser(_userId: string, _reason?: AXBlockReportReason): Promise<void> {\n // Mock block\n await Promise.resolve();\n }\n\n async unblockUser(_userId: string): Promise<void> {\n // Mock unblock\n await Promise.resolve();\n }\n\n async getBlockedUsers(): Promise<string[]> {\n // Mock blocked users list\n return [];\n }\n\n async reportUser(_userId: string, _reason: AXBlockReportReason): Promise<void> {\n // Mock report\n await Promise.resolve();\n }\n\n // =====================\n // User Settings & Preferences\n // =====================\n\n async getUserSettings(): Promise<Record<string, any>> {\n // Mock user settings\n return {\n theme: 'light',\n language: 'en',\n notifications: true,\n };\n }\n\n async updateUserSettings(_settings: Record<string, any>): Promise<void> {\n // Mock update settings\n await Promise.resolve();\n }\n}\n","/**\n * IndexedDB Conversation Management API Implementation\n * Implements AXConversationManagementApi using IndexedDB backend\n */\n\nimport { Injectable } from '@angular/core';\nimport type { AXConversation, AXParticipant } from '../../models';\nimport {\n AXConversationApi,\n AXConversationCreateData,\n AXConversationFilters,\n AXConversationSettingsUpdate,\n AXConversationUpdateData,\n AXPaginatedResult,\n AXPagination,\n AXParticipantUpdate,\n} from '../../services/api';\nimport { indexedDBStorage } from './indexeddb-storage';\nimport { sharedStorage } from './shared-storage';\n\n@Injectable()\nexport class AXIndexedDBConversationApi extends AXConversationApi {\n // =====================\n // Conversation CRUD\n // =====================\n\n async createConversation(data: AXConversationCreateData): Promise<AXConversation> {\n const conversation: AXConversation = {\n id: `conv-${Date.now()}`,\n type: data.type,\n title: data.title || (data.type === 'private' ? 'New Chat' : data.type === 'group' ? 'New Group' : 'New Channel'),\n avatar: data.avatar,\n description: data.description,\n participants: data.participantIds.map((id) => {\n const participant = sharedStorage.participants.get(id);\n if (!participant) {\n throw this.createError('PARTICIPANT_NOT_FOUND', `Participant ${id} not found`, 404);\n }\n return {\n ...participant,\n role: id === sharedStorage.currentUserId ? 'admin' : 'member',\n };\n }),\n lastMessageAt: new Date(),\n unreadCount: 0,\n status: { isTyping: false, typingUsers: [] },\n permissions: {\n canSendMessages: true,\n canSendMedia: true,\n canDeleteMessages: true,\n canAddMembers: data.type !== 'private',\n canRemoveMembers: data.type !== 'private',\n canEditInfo: data.type !== 'private',\n canPinMessages: true,\n },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: data.metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n sharedStorage.conversations.set(conversation.id, conversation);\n await indexedDBStorage.putConversation(conversation);\n sharedStorage.conversationUpdates$.next(conversation);\n return conversation;\n }\n\n async getConversation(conversationId: string): Promise<AXConversation> {\n const conversation = sharedStorage.conversations.get(conversationId);\n if (!conversation) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n return conversation;\n }\n\n async getConversations(\n pagination: AXPagination,\n _filters?: AXConversationFilters,\n ): Promise<AXPaginatedResult<AXConversation>> {\n const items = Array.from(sharedStorage.conversations.values()).sort(\n (a, b) => b.lastMessageAt.getTime() - a.lastMessageAt.getTime(),\n );\n const start = pagination.page * pagination.pageSize;\n const end = start + pagination.pageSize;\n return {\n items: items.slice(start, end),\n total: items.length,\n hasMore: end < items.length,\n page: pagination.page,\n totalPages: Math.ceil(items.length / pagination.pageSize),\n };\n }\n\n async updateConversation(conversationId: string, updates: AXConversationUpdateData): Promise<AXConversation> {\n const conversation = await this.getConversation(conversationId);\n const updated = {\n ...conversation,\n ...updates,\n updatedAt: new Date(),\n };\n sharedStorage.conversations.set(conversationId, updated);\n await indexedDBStorage.putConversation(updated);\n sharedStorage.conversationUpdates$.next(updated);\n return updated;\n }\n\n async deleteConversation(conversationId: string): Promise<boolean> {\n sharedStorage.conversations.delete(conversationId);\n await indexedDBStorage.deleteConversation(conversationId);\n // Also delete associated messages\n const messageIds = sharedStorage.messagesByConversation.get(conversationId) || [];\n for (const id of messageIds) {\n sharedStorage.messages.delete(id);\n await indexedDBStorage.deleteMessage(id);\n }\n sharedStorage.messagesByConversation.delete(conversationId);\n return true;\n }\n\n // =====================\n // Conversation Actions\n // =====================\n\n async archiveConversation(conversationId: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.archived = true;\n sharedStorage.conversations.set(conversationId, conversation);\n await indexedDBStorage.putConversation(conversation);\n }\n\n async unarchiveConversation(conversationId: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.archived = false;\n sharedStorage.conversations.set(conversationId, conversation);\n await indexedDBStorage.putConversation(conversation);\n }\n\n async pinConversation(_conversationId: string): Promise<void> {\n // Mock pin - would set pinned flag in real implementation\n await Promise.resolve();\n }\n\n async unpinConversation(_conversationId: string): Promise<void> {\n // Mock unpin - would remove pinned flag in real implementation\n await Promise.resolve();\n }\n\n async markConversationAsRead(conversationId: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.unreadCount = 0;\n sharedStorage.conversations.set(conversationId, conversation);\n await indexedDBStorage.putConversation(conversation);\n sharedStorage.conversationUpdates$.next(conversation);\n }\n\n async markConversationAsUnread(conversationId: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.unreadCount = Math.max(1, conversation.unreadCount);\n sharedStorage.conversations.set(conversationId, conversation);\n await indexedDBStorage.putConversation(conversation);\n sharedStorage.conversationUpdates$.next(conversation);\n }\n\n // =====================\n // Search & Filter\n // =====================\n\n async searchConversations(query: string): Promise<AXConversation[]> {\n const allConversations = Array.from(sharedStorage.conversations.values());\n const lowerQuery = query.toLowerCase();\n return allConversations.filter(\n (c) =>\n c.title.toLowerCase().includes(lowerQuery) ||\n c.participants.some((p) => p.name.toLowerCase().includes(lowerQuery)),\n );\n }\n\n async filterConversations(\n _filters: AXConversationFilters,\n pagination?: AXPagination,\n ): Promise<AXPaginatedResult<AXConversation>> {\n // Mock filter - in real implementation, apply filters\n return this.getConversations(pagination || { page: 0, pageSize: 30 });\n }\n\n // =====================\n // Participant Management\n // =====================\n\n async getParticipants(conversationId: string): Promise<AXParticipant[]> {\n const conversation = await this.getConversation(conversationId);\n return conversation.participants;\n }\n\n async addParticipants(_conversationId: string, _userIds: string[]): Promise<AXConversation> {\n const conversation = await this.getConversation(_conversationId);\n // Mock add - in real implementation, add to backend\n return conversation;\n }\n\n async removeParticipant(conversationId: string, _userId: string): Promise<AXConversation> {\n const conversation = await this.getConversation(conversationId);\n // Mock remove - in real implementation, remove from backend\n return conversation;\n }\n\n async leaveConversation(_conversationId: string): Promise<void> {\n // Mock leave\n await Promise.resolve();\n }\n\n async updateParticipant(conversationId: string, _update: AXParticipantUpdate): Promise<AXConversation> {\n const conversation = await this.getConversation(conversationId);\n // Mock update - in real implementation, update backend\n return conversation;\n }\n\n // =====================\n // Settings Management\n // =====================\n\n async getConversationSettings(conversationId: string): Promise<AXConversationSettingsUpdate> {\n const conversation = await this.getConversation(conversationId);\n return conversation.settings;\n }\n\n async updateConversationSettings(_conversationId: string, _settings: AXConversationSettingsUpdate): Promise<void> {\n // Mock update settings\n await Promise.resolve();\n }\n\n async muteConversation(_conversationId: string, _duration?: number): Promise<void> {\n // Mock mute\n await Promise.resolve();\n }\n\n async unmuteConversation(_conversationId: string): Promise<void> {\n // Mock unmute\n await Promise.resolve();\n }\n\n // =====================\n // Media & Files\n // =====================\n\n async uploadConversationAvatar(_conversationId: string, file: File): Promise<string> {\n // Mock upload - return a data URL\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.readAsDataURL(file);\n });\n }\n\n async getConversationMedia(_conversationId: string, _pagination?: AXPagination): Promise<AXPaginatedResult<any>> {\n // Mock media gallery\n return {\n items: [],\n hasMore: false,\n total: 0,\n };\n }\n\n // =====================\n // Conversation Metadata & Tags\n // =====================\n\n async addConversationTags(_conversationId: string, _tags: string[]): Promise<void> {\n // Mock add tags\n await Promise.resolve();\n }\n\n async removeConversationTags(_conversationId: string, _tags: string[]): Promise<void> {\n // Mock remove tags\n await Promise.resolve();\n }\n\n async getConversationTags(_conversationId: string): Promise<string[]> {\n // Mock get tags\n return [];\n }\n\n // =====================\n // Conversation Permissions\n // =====================\n\n async getConversationPermissions(_conversationId: string): Promise<Record<string, boolean>> {\n // Mock permissions\n return {\n canSendMessages: true,\n canSendMedia: true,\n canDeleteMessages: true,\n };\n }\n\n async updateConversationPermissions(_conversationId: string, _permissions: Record<string, boolean>): Promise<void> {\n // Mock update permissions\n await Promise.resolve();\n }\n\n // =====================\n // Draft Management\n // =====================\n\n async saveDraft(_conversationId: string, _draft: string): Promise<void> {\n // Mock save draft\n await Promise.resolve();\n }\n\n async getDraft(_conversationId: string): Promise<string | null> {\n // Mock get draft\n return null;\n }\n\n async clearDraft(_conversationId: string): Promise<void> {\n // Mock clear draft\n await Promise.resolve();\n }\n}\n","/**\n * IndexedDB Message API Implementation\n * Implements AXMessageApi using IndexedDB backend\n */\n\nimport { Injectable } from '@angular/core';\nimport type { AXMessage, AXMessagePayload, AXSendMessageCommand } from '../../models';\nimport {\n AXMessageApi,\n AXMessageForwardData,\n AXMessageSearchFilters,\n AXPaginatedResult,\n AXPagination,\n AXPinnedMessage,\n AXReadReceipt,\n} from '../../services/api';\nimport { indexedDBStorage } from './indexeddb-storage';\nimport { sharedStorage } from './shared-storage';\n\n@Injectable()\nexport class AXIndexedDBMessageApi extends AXMessageApi {\n // =====================\n // Message CRUD\n // =====================\n\n async sendMessage(command: AXSendMessageCommand): Promise<AXMessage> {\n const currentUser = sharedStorage.participants.get(sharedStorage.currentUserId);\n if (!currentUser) {\n throw this.createError('USER_NOT_FOUND', 'Current user not found', 404);\n }\n\n const message: AXMessage = {\n id: command.tempId || `msg-${Date.now()}`,\n conversationId: command.conversationId,\n senderId: currentUser.id,\n type: command.type,\n timestamp: new Date(),\n payload: command.payload,\n status: 'sent',\n reactions: [],\n forwarded: command.forwarded,\n forwardedFrom: command.forwardedFrom,\n metadata: command.metadata || {},\n replyTo: command.replyToId ? sharedStorage.messages.get(command.replyToId) : undefined,\n };\n\n // Store message in memory and IndexedDB\n sharedStorage.messages.set(message.id, message);\n const convMessages = sharedStorage.messagesByConversation.get(command.conversationId) || [];\n convMessages.push(message.id);\n sharedStorage.messagesByConversation.set(command.conversationId, convMessages);\n await indexedDBStorage.putMessage(message);\n\n // Update conversation\n const conversation = sharedStorage.conversations.get(command.conversationId);\n if (conversation) {\n conversation.lastMessageAt = message.timestamp;\n conversation.lastMessage = message;\n sharedStorage.conversations.set(conversation.id, conversation);\n await indexedDBStorage.putConversation(conversation);\n sharedStorage.conversationUpdates$.next(conversation);\n }\n\n sharedStorage.messageStream$.next(message);\n return message;\n }\n\n async getMessage(messageId: string): Promise<AXMessage> {\n const message = sharedStorage.messages.get(messageId);\n if (!message) {\n throw this.createError('MESSAGE_NOT_FOUND', 'Message not found', 404);\n }\n return message;\n }\n\n async getMessages(conversationId: string, pagination: AXPagination): Promise<AXPaginatedResult<AXMessage>> {\n const messageIds = sharedStorage.messagesByConversation.get(conversationId) || [];\n const allMessages = messageIds\n .map((id) => sharedStorage.messages.get(id))\n .filter((m): m is AXMessage => m !== undefined);\n const sorted = allMessages.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n const start = pagination.page * pagination.pageSize;\n const end = start + pagination.pageSize;\n const items = sorted.slice(start, end);\n return {\n items,\n total: sorted.length,\n hasMore: end < sorted.length,\n page: pagination.page,\n totalPages: Math.ceil(sorted.length / pagination.pageSize),\n };\n }\n\n async editMessage(messageId: string, payload: AXMessagePayload): Promise<AXMessage> {\n const message = await this.getMessage(messageId);\n message.payload = payload;\n message.metadata = { ...message.metadata, editedAt: new Date() };\n sharedStorage.messages.set(messageId, message);\n await indexedDBStorage.putMessage(message);\n sharedStorage.messageUpdates$.next(message);\n return message;\n }\n\n async deleteMessage(messageId: string, _forEveryone?: boolean): Promise<void> {\n const message = await this.getMessage(messageId);\n sharedStorage.messages.delete(messageId);\n await indexedDBStorage.deleteMessage(messageId);\n const conversationMessages = sharedStorage.messagesByConversation.get(message.conversationId) || [];\n sharedStorage.messagesByConversation.set(\n message.conversationId,\n conversationMessages.filter((id) => id !== messageId),\n );\n sharedStorage.messageDeletions$.next(messageId);\n }\n\n async deleteMessages(messageIds: string[], forEveryone?: boolean): Promise<void> {\n // Mock bulk delete\n for (const id of messageIds) {\n await this.deleteMessage(id, forEveryone);\n }\n }\n\n // =====================\n // Message Search\n // =====================\n\n async searchMessages(\n conversationId: string,\n filters: AXMessageSearchFilters,\n _pagination?: AXPagination,\n ): Promise<AXPaginatedResult<AXMessage>> {\n const messageIds = sharedStorage.messagesByConversation.get(conversationId) || [];\n const allMessages = messageIds\n .map((id) => sharedStorage.messages.get(id))\n .filter((m): m is AXMessage => m !== undefined);\n const lowerQuery = filters.query.toLowerCase();\n const filtered = allMessages.filter((m) => {\n if (m.type === 'text' && 'text' in m.payload) {\n return m.payload.text?.toLowerCase().includes(lowerQuery);\n }\n return false;\n });\n return {\n items: filtered,\n hasMore: false,\n total: filtered.length,\n };\n }\n\n async searchAllMessages(\n _filters: AXMessageSearchFilters,\n _pagination?: AXPagination,\n ): Promise<AXPaginatedResult<AXMessage>> {\n // Mock global search\n return {\n items: [],\n hasMore: false,\n total: 0,\n };\n }\n\n // =====================\n // Reactions\n // =====================\n\n async addReaction(messageId: string, emoji: string): Promise<void> {\n const message = await this.getMessage(messageId);\n const currentUser = sharedStorage.participants.get(sharedStorage.currentUserId);\n if (!currentUser) return;\n\n const existingReaction = message.reactions.find((r) => r.emoji === emoji && r.userId === currentUser.id);\n if (existingReaction) {\n message.reactions = message.reactions.filter((r) => !(r.emoji === emoji && r.userId === currentUser.id));\n } else {\n message.reactions.push({ emoji, userId: currentUser.id, timestamp: new Date() });\n }\n sharedStorage.messages.set(messageId, message);\n await indexedDBStorage.putMessage(message);\n sharedStorage.messageUpdates$.next(message);\n }\n\n async removeReaction(messageId: string, emoji: string): Promise<void> {\n const message = await this.getMessage(messageId);\n const currentUser = sharedStorage.participants.get(sharedStorage.currentUserId);\n if (!currentUser) return;\n\n message.reactions = message.reactions.filter((r) => !(r.emoji === emoji && r.userId === currentUser.id));\n sharedStorage.messages.set(messageId, message);\n await indexedDBStorage.putMessage(message);\n sharedStorage.messageUpdates$.next(message);\n }\n\n async getAvailableReactions(): Promise<string[]> {\n return ['👍', '❤️', '😂', '😮', '😢', '🙏', '🎉', '🔥'];\n }\n\n // =====================\n // Read Receipts\n // =====================\n\n async markAsRead(conversationId: string, messageIds: string[]): Promise<void> {\n for (const messageId of messageIds) {\n const message = sharedStorage.messages.get(messageId);\n if (message && message.status !== 'read') {\n message.status = 'read';\n sharedStorage.messages.set(messageId, message);\n await indexedDBStorage.putMessage(message);\n sharedStorage.messageUpdates$.next(message);\n }\n }\n const conversation = sharedStorage.conversations.get(conversationId);\n if (conversation) {\n conversation.unreadCount = Math.max(0, conversation.unreadCount - messageIds.length);\n sharedStorage.conversations.set(conversationId, conversation);\n await indexedDBStorage.putConversation(conversation);\n sharedStorage.conversationUpdates$.next(conversation);\n }\n }\n\n async markAsUnread(conversationId: string): Promise<void> {\n const conversation = sharedStorage.conversations.get(conversationId);\n if (conversation) {\n conversation.unreadCount = Math.max(1, conversation.unreadCount);\n sharedStorage.conversations.set(conversationId, conversation);\n sharedStorage.conversationUpdates$.next(conversation);\n }\n }\n\n async getReadReceipts(_messageId: string): Promise<AXReadReceipt[]> {\n // Mock read receipts\n return [];\n }\n\n // =====================\n // Message Actions\n // =====================\n\n async forwardMessage(_data: AXMessageForwardData): Promise<AXMessage[]> {\n // Mock forward\n return [];\n }\n\n async pinMessage(_conversationId: string, _messageId: string): Promise<void> {\n // Mock pin\n await Promise.resolve();\n }\n\n async unpinMessage(_conversationId: string, _messageId: string): Promise<void> {\n // Mock unpin\n await Promise.resolve();\n }\n\n async getPinnedMessages(_conversationId: string): Promise<AXPinnedMessage[]> {\n // Mock pinned messages\n return [];\n }\n\n // =====================\n // Message Threads (Replies)\n // =====================\n\n async getMessageReplies(messageId: string, pagination?: AXPagination): Promise<AXPaginatedResult<AXMessage>> {\n // Get all messages that reply to this message\n const allMessages = Array.from(sharedStorage.messages.values());\n const replies = allMessages\n .filter((m) => m.replyTo?.id === messageId)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n if (!pagination) {\n return {\n items: replies,\n hasMore: false,\n total: replies.length,\n };\n }\n\n const start = pagination.page * pagination.pageSize;\n const end = start + pagination.pageSize;\n const items = replies.slice(start, end);\n\n return {\n items,\n total: replies.length,\n hasMore: end < replies.length,\n page: pagination.page,\n totalPages: Math.ceil(replies.length / pagination.pageSize),\n };\n }\n\n async getReplyCount(messageId: string): Promise<number> {\n // Count messages that reply to this message\n const allMessages = Array.from(sharedStorage.messages.values());\n const replyCount = allMessages.filter((m) => m.replyTo?.id === messageId).length;\n return replyCount;\n }\n\n async getForwardCount(messageId: string): Promise<number> {\n // Count messages that were forwarded from this message\n const allMessages = Array.from(sharedStorage.messages.values());\n const forwardCount = allMessages.filter((m) => m.forwardedFrom?.messageId === messageId).length;\n return forwardCount;\n }\n\n // =====================\n // Typing Indicators\n // =====================\n\n async sendTypingIndicator(conversationId: string): Promise<void> {\n const currentUser = sharedStorage.participants.get(sharedStorage.currentUserId);\n sharedStorage.typingIndicators$.next({\n conversationId,\n userId: sharedStorage.currentUserId,\n userName: currentUser?.name || 'You',\n timestamp: new Date(),\n });\n }\n\n async stopTypingIndicator(conversationId: string): Promise<void> {\n const currentUser = sharedStorage.participants.get(sharedStorage.currentUserId);\n sharedStorage.typingIndicators$.next({\n conversationId,\n userId: sharedStorage.currentUserId,\n userName: currentUser?.name || 'You',\n timestamp: new Date(),\n });\n }\n\n // =====================\n // File Upload\n // =====================\n\n async uploadFile(\n file: File,\n _conversationId: string,\n ): Promise<{\n url: string;\n thumbnailUrl?: string;\n size: number;\n mimeType: string;\n metadata?: Record<string, any>;\n }> {\n // Mock upload - return a data URL\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n resolve({\n url: reader.result as string,\n size: file.size,\n mimeType: file.type,\n metadata: { name: file.name },\n });\n };\n reader.readAsDataURL(file);\n });\n }\n\n // =====================\n // Message Metadata\n // =====================\n\n async updateMessageMetadata(_messageId: string, _metadata: Record<string, any>): Promise<void> {\n // Mock update metadata\n await Promise.resolve();\n }\n\n async getMessageMetadata(_messageId: string): Promise<Record<string, any>> {\n // Mock get metadata\n return {};\n }\n\n // =====================\n // Message Status\n // =====================\n\n async updateMessageStatus(\n _messageId: string,\n _status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed',\n ): Promise<void> {\n // Mock update status\n await Promise.resolve();\n }\n\n async getMessageDeliveryStatus(_messageId: string): Promise<{\n delivered: number;\n read: number;\n total: number;\n }> {\n // Mock delivery status\n return {\n delivered: 0,\n read: 0,\n total: 0,\n };\n }\n\n // =====================\n // Bulk Operations\n // =====================\n\n async markMessagesAsRead(_messageIds: string[]): Promise<void> {\n // Mock bulk mark as read\n await Promise.resolve();\n }\n\n async bulkDeleteMessages(_conversationId: string, _messageIds: string[], _forEveryone?: boolean): Promise<void> {\n // Mock bulk delete\n await Promise.resolve();\n }\n\n // =====================\n // Message Export\n // =====================\n\n async exportMessages(_conversationId: string, _format: 'json' | 'csv' | 'txt'): Promise<string | Blob> {\n // Mock export - return empty JSON\n return JSON.stringify({ messages: [] });\n }\n}\n","/**\n * IndexedDB Realtime API Implementation\n * Implements AXRealtimeApi using IndexedDB backend\n */\n\nimport { Injectable } from '@angular/core';\nimport { filter, Observable } from 'rxjs';\nimport type { AXConversation, AXMessage, AXPresenceUpdate, AXTypingIndicator } from '../../models';\nimport {\n AXCallEvent,\n AXConnectionEvent,\n AXConnectionOptions,\n AXConnectionStatus,\n AXNotificationEvent,\n AXRealtimeApi,\n} from '../../services/api';\nimport { sharedStorage } from './shared-storage';\n\n@Injectable()\nexport class AXIndexedDBRealtimeApi extends AXRealtimeApi {\n readonly connectionStatus$: Observable<AXConnectionStatus> = sharedStorage.connectionStatus$;\n\n // =====================\n // Connection Management\n // =====================\n\n async connect(_options?: AXConnectionOptions): Promise<void> {\n sharedStorage.connectionStatus$.next('connecting');\n await sharedStorage.seedIfEmpty();\n sharedStorage.connectionStatus$.next('connected');\n }\n\n async disconnect(): Promise<void> {\n sharedStorage.connectionStatus$.next('disconnected');\n }\n\n isConnected(): boolean {\n return sharedStorage.connectionStatus$.value === 'connected';\n }\n\n async reconnect(): Promise<void> {\n await this.disconnect();\n await this.connect();\n }\n\n subscribeToConnectionEvents(): Observable<AXConnectionEvent> {\n // Mock connection events\n return new Observable((subscriber) => {\n subscriber.next({\n type: 'connected',\n timestamp: new Date(),\n });\n });\n }\n\n // =====================\n // Message Events\n // =====================\n\n subscribeToMessages(conversationId: string): Observable<AXMessage> {\n return sharedStorage.messageStream$.pipe(filter((msg) => msg.conversationId === conversationId));\n }\n\n subscribeToMessageUpdates(_conversationId?: string): Observable<AXMessage> {\n return sharedStorage.messageUpdates$;\n }\n\n subscribeToMessageDeletions(_conversationId?: string): Observable<string> {\n return sharedStorage.messageDeletions$;\n }\n\n subscribeToMessageReactions(_conversationId?: string): Observable<AXMessage> {\n // Mock reactions - reuse message updates\n return sharedStorage.messageUpdates$;\n }\n\n // =====================\n // Conversation Events\n // =====================\n\n subscribeToConversationUpdates(): Observable<AXConversation> {\n return sharedStorage.conversationUpdates$;\n }\n\n subscribeToConversationCreated(): Observable<AXConversation> {\n // Mock conversation created\n return new Observable(() => {});\n }\n\n subscribeToConversationDeleted(): Observable<string> {\n // Mock conversation deleted\n return new Observable(() => {});\n }\n\n // =====================\n // Typing Indicators\n // =====================\n\n subscribeToTypingIndicators(conversationId: string): Observable<AXTypingIndicator> {\n // If conversationId is empty, return all typing indicators (for global subscription)\n if (!conversationId) {\n return sharedStorage.typingIndicators$;\n }\n // Otherwise filter by specific conversation\n return sharedStorage.typingIndicators$.pipe(filter((ind) => ind.conversationId === conversationId));\n }\n\n // =====================\n // Presence Updates\n // =====================\n\n subscribeToPresenceUpdates(_userIds?: string[]): Observable<AXPresenceUpdate> {\n return sharedStorage.presenceUpdates$;\n }\n\n // =====================\n // Read Receipts\n // =====================\n\n subscribeToReadReceipts(_conversationId?: string): Observable<{ messageId: string; userId: string; readAt: Date }> {\n // Mock read receipts\n return new Observable(() => {});\n }\n\n // =====================\n // Notifications\n // =====================\n\n subscribeToNotifications(): Observable<AXNotificationEvent> {\n // Mock notifications\n return new Observable(() => {});\n }\n\n // =====================\n // Call Events (Optional)\n // =====================\n\n subscribeToCallEvents(): Observable<AXCallEvent> {\n // Mock call events\n return new Observable(() => {});\n }\n\n // =====================\n // User Events\n // =====================\n\n subscribeToUserBlockEvents(): Observable<{ userId: string; blocked: boolean }> {\n // Mock block events\n return new Observable(() => {});\n }\n\n subscribeToParticipantEvents(\n _conversationId?: string,\n ): Observable<{ conversationId: string; userId: string; action: 'added' | 'removed' }> {\n // Mock participant events\n return new Observable(() => {});\n }\n\n // =====================\n // System Events\n // =====================\n\n subscribeToSystemEvents(): Observable<{ type: string; message: string; data?: any }> {\n // Mock system events\n return new Observable(() => {});\n }\n\n // =====================\n // Message Status Events\n // =====================\n\n subscribeToMessageStatusChanges(_conversationId?: string): Observable<{\n messageId: string;\n status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed';\n timestamp: Date;\n }> {\n // Mock message status changes\n return new Observable(() => {});\n }\n\n // =====================\n // Conversation Settings Events\n // =====================\n\n subscribeToConversationSettingsChanges(_conversationId?: string): Observable<{\n conversationId: string;\n settings: Record<string, any>;\n }> {\n // Mock settings changes\n return new Observable(() => {});\n }\n\n // =====================\n // Draft Events\n // =====================\n\n subscribeToDraftChanges(_conversationId?: string): Observable<{\n conversationId: string;\n draft: string | null;\n }> {\n // Mock draft changes\n return new Observable(() => {});\n }\n}\n","/**\n * AI Responder Service\n * Provides AI-powered automatic responses using Google Gemini API\n *\n * @security API key should be provided via injection token in production\n * @example\n * ```typescript\n * export const AI_API_KEY = new InjectionToken<string>('AI_API_KEY');\n *\n * providers: [\n * { provide: AI_API_KEY, useValue: environment.geminiApiKey }\n * ]\n * ```\n */\n\nimport { inject, Injectable, InjectionToken } from '@angular/core';\n\n/**\n * Injection token for AI API key\n * Provide this in your app config to avoid hardcoding the API key\n */\nexport const AI_API_KEY = new InjectionToken<string>('AI_API_KEY');\n\n/**\n * Configuration for AI Responder\n */\nexport interface AXAIResponderConfig {\n /** Maximum retry attempts for failed requests */\n maxRetries?: number;\n /** Timeout for API requests in milliseconds */\n timeout?: number;\n /** Enable fallback to random replies on error */\n useFallbackReplies?: boolean;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<AXAIResponderConfig> = {\n maxRetries: 0,\n timeout: 2000,\n useFallbackReplies: true,\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXAIResponderService {\n private readonly injectedApiKey = inject(AI_API_KEY, { optional: true });\n private readonly config: Required<AXAIResponderConfig> = DEFAULT_CONFIG;\n\n /**\n * Get API key from injection token\n * Returns undefined if not configured - service will use fallback responses\n */\n private getApiKey(): string | undefined {\n return this.injectedApiKey || undefined;\n }\n\n /**\n * Get AI-powered response for a given prompt\n * @param prompt - The user's message to respond to\n * @param retryCount - Current retry attempt (internal use)\n * @returns AI-generated response or fallback message\n */\n async getAIResponse(prompt: string, retryCount = 0): Promise<string> {\n // Validate prompt\n if (!prompt || prompt.trim().length === 0) {\n return this.getFallbackReply();\n }\n\n // Check if API key is available\n const apiKey = this.getApiKey();\n if (!apiKey) {\n // No API key configured - use fallback replies\n return this.getFallbackReply();\n }\n\n try {\n const response = await this.fetchWithTimeout(\n 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-goog-api-key': apiKey,\n },\n body: JSON.stringify({\n contents: [{ parts: [{ text: prompt }] }],\n generationConfig: {\n temperature: 0.7,\n maxOutputTokens: 200,\n },\n }),\n },\n this.config.timeout,\n );\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`AI API returned status ${response.status}: ${errorBody}`);\n }\n\n const data = await response.json();\n const aiText = data.candidates?.[0]?.content?.parts?.[0]?.text;\n\n if (aiText && aiText.trim().length > 0) {\n return aiText.trim();\n }\n\n // No valid response from AI\n throw new Error('AI returned empty response');\n } catch (error: any) {\n console.error(`AI response error (attempt ${retryCount + 1}/${this.config.maxRetries + 1}):`, error);\n\n // Retry logic\n if (retryCount < this.config.maxRetries) {\n console.log(`Retrying AI request... (${retryCount + 1}/${this.config.maxRetries})`);\n // On auth error, fall back to simple responses\n if (retryCount === 0) {\n return this.getFallbackReply();\n }\n }\n\n // All retries exhausted, use fallback\n if (this.config.useFallbackReplies) {\n console.warn('AI service unavailable. Using fallback reply.');\n return this.getFallbackReply();\n }\n\n // Return user-friendly error message\n return \"I'm having trouble connecting right now. Please try again later.\";\n }\n }\n\n /**\n * Fetch with timeout\n */\n private async fetchWithTimeout(url: string, options: RequestInit, timeout: number): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n return response;\n } catch (error: any) {\n clearTimeout(timeoutId);\n if (error.name === 'AbortError') {\n throw new Error('Request timeout');\n }\n throw error;\n }\n }\n\n /**\n * Delay helper for retry logic\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Get a random fallback reply when AI is unavailable\n */\n private getFallbackReply(): string {\n const fallbackReplies = [\n 'That is a great point!',\n 'Interesting, tell me more.',\n \"I'm not so sure about that.\",\n 'Could you elaborate?',\n 'Thanks for sharing!',\n 'Got it.',\n 'lol 😂',\n 'Let me check and get back to you.',\n 'Totally agree.',\n 'What do you think?',\n 'Sounds good!',\n 'Perfect!',\n 'I see what you mean.',\n 'That makes sense.',\n 'Interesting perspective!',\n 'Tell me more about that.',\n 'I appreciate you sharing that.',\n 'Good to know!',\n ];\n return fallbackReplies[Math.floor(Math.random() * fallbackReplies.length)];\n }\n\n /**\n * Check if AI service is available\n * @returns true if API key is configured\n */\n isAvailable(): boolean {\n return !!this.getApiKey();\n }\n\n /**\n * Update configuration\n */\n configure(config: Partial<AXAIResponderConfig>): void {\n Object.assign(this.config, config);\n }\n}\n","/**\n * IndexedDB Message API with AI Auto-Responder\n * Extends IndexedDB Message API to automatically respond to user messages with AI\n */\n\nimport { inject, Injectable } from '@angular/core';\nimport type { AXMessage, AXSendMessageCommand } from '../../models';\nimport { AXAIResponderService } from './ai-responder.service';\nimport { AXIndexedDBMessageApi } from './indexeddb-message-api.service';\n\n@Injectable()\nexport class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {\n private readonly aiResponder = inject(AXAIResponderService);\n private readonly AI_TYPING_INDICATOR_DELAY = 1000; // 1 second delay to simulate typing\n private readonly AI_RESPONSE_DELAY = 2000; // 2 seconds delay to simulate typing\n\n /**\n * Override sendMessage to trigger AI auto-response\n */\n override async sendMessage(command: AXSendMessageCommand): Promise<AXMessage> {\n // Send the user's message first\n const userMessage = await super.sendMessage(command);\n\n // Auto-respond to any message type from the current user\n console.log('🤖 AI Auto-Responder: Detected user message, generating response...');\n \n // Extract context from different message types\n const messageContext = this.extractMessageContext(command);\n \n // Trigger AI response asynchronously (don't await), pass the user message ID\n this.generateAIResponse(command.conversationId, messageContext, userMessage.id).catch((error) => {\n console.error('❌ Failed to generate AI response:', error);\n });\n\n return userMessage;\n }\n\n /**\n * Extract context from different message types for AI processing\n */\n private extractMessageContext(command: AXSendMessageCommand): string {\n switch (command.type) {\n case 'text':\n return 'text' in command.payload ? (command.payload.text as string) : 'sent a message';\n \n case 'image': {\n const imageCaption = 'caption' in command.payload ? command.payload.caption : '';\n return imageCaption ? `sent an image with caption: \"${imageCaption}\"` : 'sent an image';\n }\n \n case 'video': {\n const videoCaption = 'caption' in command.payload ? command.payload.caption : '';\n return videoCaption ? `sent a video with caption: \"${videoCaption}\"` : 'sent a video';\n }\n \n case 'audio':\n return 'sent an audio message';\n \n case 'file': {\n const fileName = 'name' in command.payload ? command.payload.name : 'a file';\n return `sent a file: ${fileName}`;\n }\n \n case 'location': {\n const address = 'address' in command.payload ? command.payload.address : 'a location';\n return `shared location: ${address}`;\n }\n \n case 'contact': {\n const contactName = 'name' in command.payload ? command.payload.name : 'a contact';\n return `shared contact: ${contactName}`;\n }\n \n default:\n return `sent a ${command.type} message`;\n }\n }\n\n /**\n * Generate AI response to user message\n */\n private async generateAIResponse(conversationId: string, userText: string, replyToId: string): Promise<void> {\n try {\n const { sharedStorage } = await import('./shared-storage');\n\n // Get the conversation to find an AI bot or other participant\n const conversation = await this.getConversationForAI(conversationId);\n if (!conversation) {\n console.warn('⚠️ Conversation not found for AI response');\n return;\n }\n\n // Find all participants that are not the current user\n const otherParticipants = conversation.participants.filter((p) => p.id !== 'current-user');\n if (otherParticipants.length === 0) {\n console.warn('⚠️ No other participants found in conversation');\n return;\n }\n\n // In group conversations, randomly select a participant to respond\n // In 1-on-1 conversations, use the only other participant\n const randomIndex = Math.floor(Math.random() * otherParticipants.length);\n const aiSender = otherParticipants[randomIndex];\n \n console.log('🎲 Selected random responder:', aiSender.name, `(${randomIndex + 1}/${otherParticipants.length})`);\n\n console.log('🤖 AI Bot:', aiSender.name, 'is preparing to respond...');\n\n // 1. Mark user's message as READ by AI\n console.log('👁️ AI reading your message...');\n const userMessage = sharedStorage.messages.get(replyToId);\n if (userMessage) {\n userMessage.status = 'read';\n sharedStorage.messages.set(replyToId, userMessage);\n sharedStorage.messageUpdates$.next(userMessage);\n }\n\n // 2. Set AI user to ONLINE\n console.log('🟢 AI coming online...');\n const aiUser = sharedStorage.participants.get(aiSender.id);\n if (aiUser) {\n aiUser.status = 'online';\n aiUser.lastSeen = new Date();\n sharedStorage.participants.set(aiSender.id, aiUser);\n sharedStorage.presenceUpdates$.next({\n userId: aiSender.id,\n status: 'online',\n lastSeen: aiUser.lastSeen,\n });\n }\n\n // Small delay before typing\n await this.delay(500);\n\n // 3. Show TYPING indicator\n console.log('✍️ AI is typing...');\n sharedStorage.typingIndicators$.next({\n conversationId,\n userId: aiSender.id,\n userName: aiSender.name,\n timestamp: new Date(),\n });\n\n // Update conversation typing status\n conversation.status.isTyping = true;\n conversation.status.typingUsers = [aiSender.id];\n sharedStorage.conversations.set(conversationId, conversation);\n sharedStorage.conversationUpdates$.next(conversation);\n\n // 4. Get conversation history (last 20 messages)\n const conversationHistory = await this.getConversationHistory(conversationId, 20);\n console.log('📚 Loaded conversation history:', conversationHistory.split('\\n').length, 'messages');\n\n // 5. Generate AI response with full context\n const contextPrompt = conversationHistory ? `${conversationHistory}\\nYou: ${userText}` : userText;\n console.log('🧠 Generating AI response with conversation context...');\n const aiResponse = await this.aiResponder.getAIResponse(contextPrompt);\n console.log('✅ AI Response received:', aiResponse);\n\n // Simulate realistic typing delay based on message length\n const typingDelay = Math.min(Math.max(aiResponse.length * 50, 2000), 5000);\n await this.delay(typingDelay);\n\n // 6. Stop TYPING indicator\n console.log('🛑 AI stopped typing...');\n sharedStorage.typingIndicators$.next({\n conversationId,\n userId: aiSender.id,\n userName: aiSender.name,\n timestamp: new Date(),\n });\n\n conversation.status.isTyping = false;\n conversation.status.typingUsers = [];\n sharedStorage.conversations.set(conversationId, conversation);\n sharedStorage.conversationUpdates$.next(conversation);\n\n // 7. Send AI message\n console.log('📤 Sending AI message from:', aiSender.name);\n await this.createAIMessage(conversationId, aiSender.id, aiResponse, replyToId);\n console.log('✅ AI message sent successfully!');\n\n // 8. After a delay, set AI back to away/offline (optional)\n setTimeout(() => {\n if (aiUser) {\n aiUser.status = 'away';\n sharedStorage.participants.set(aiSender.id, aiUser);\n sharedStorage.presenceUpdates$.next({\n userId: aiSender.id,\n status: 'away',\n lastSeen: new Date(),\n });\n console.log('🟡 AI went away...');\n }\n }, 10000); // Go away after 10 seconds\n } catch (error) {\n console.error('❌ Error generating AI response:', error);\n }\n }\n\n /**\n * Get conversation for AI response\n */\n private async getConversationForAI(conversationId: string): Promise<any> {\n try {\n // Access shared storage directly\n const { sharedStorage } = await import('./shared-storage');\n return sharedStorage.conversations.get(conversationId);\n } catch {\n return null;\n }\n }\n\n /**\n * Get conversation history (last N messages)\n */\n private async getConversationHistory(conversationId: string, limit = 20): Promise<string> {\n try {\n const { sharedStorage } = await import('./shared-storage');\n \n // Get all messages for this conversation\n const messageIds = sharedStorage.messagesByConversation.get(conversationId) || [];\n \n // Get last N messages (excluding the very last one which is the current user message)\n const recentMessageIds = messageIds.slice(-limit - 1, -1);\n const messages: AXMessage[] = [];\n \n for (const msgId of recentMessageIds) {\n const msg = sharedStorage.messages.get(msgId);\n if (msg) {\n messages.push(msg);\n }\n }\n \n // Format messages for AI context\n const formattedHistory = messages\n .map((msg) => {\n const sender = sharedStorage.participants.get(msg.senderId);\n const senderName = sender?.name || (msg.senderId === 'current-user' ? 'You' : 'Unknown');\n \n // Extract text from different message types\n let text = '';\n if (msg.type === 'text' && 'text' in msg.payload) {\n text = msg.payload.text as string;\n } else if (msg.type === 'image' && 'caption' in msg.payload) {\n text = `[Image: ${msg.payload.caption || 'no caption'}]`;\n } else if (msg.type === 'file' && 'name' in msg.payload) {\n text = `[File: ${msg.payload.name}]`;\n } else if (msg.type === 'audio') {\n text = '[Audio message]';\n } else if (msg.type === 'video' && 'caption' in msg.payload) {\n text = `[Video: ${msg.payload.caption || 'no caption'}]`;\n } else if (msg.type === 'location' && 'address' in msg.payload) {\n text = `[Location: ${msg.payload.address || 'shared location'}]`;\n } else {\n text = `[${msg.type} message]`;\n }\n \n return `${senderName}: ${text}`;\n })\n .join('\\n');\n \n return formattedHistory;\n } catch (error) {\n console.error('Error getting conversation history:', error);\n return '';\n }\n }\n\n /**\n * Create AI message directly in storage\n */\n private async createAIMessage(\n conversationId: string,\n senderId: string,\n text: string,\n replyToId: string,\n ): Promise<void> {\n try {\n const { sharedStorage } = await import('./shared-storage');\n\n const message: AXMessage = {\n id: `msg-ai-${Date.now()}`,\n conversationId,\n senderId,\n type: 'text',\n timestamp: new Date(),\n payload: {\n type: 'text',\n text,\n },\n status: 'sent',\n reactions: [],\n metadata: { isAI: true },\n replyTo: sharedStorage.messages.get(replyToId),\n };\n\n // Store message in memory and IndexedDB\n const { indexedDBStorage } = await import('./indexeddb-storage');\n sharedStorage.messages.set(message.id, message);\n const convMessages = sharedStorage.messagesByConversation.get(conversationId) || [];\n convMessages.push(message.id);\n sharedStorage.messagesByConversation.set(conversationId, convMessages);\n await indexedDBStorage.putMessage(message);\n\n // Update conversation\n const conversation = sharedStorage.conversations.get(conversationId);\n if (conversation) {\n conversation.lastMessageAt = message.timestamp;\n conversation.lastMessage = message;\n sharedStorage.conversations.set(conversationId, conversation);\n await indexedDBStorage.putConversation(conversation);\n sharedStorage.conversationUpdates$.next(conversation);\n }\n\n // Emit message\n sharedStorage.messageStream$.next(message);\n } catch (error) {\n console.error('Error creating AI message:', error);\n }\n }\n\n /**\n * Delay helper\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * IndexedDB API Implementations\n * \n * These implementations use a shared in-memory storage (shared-storage.ts)\n * to provide mock data for development and testing.\n */\n\n// Separated API implementations\nexport * from './indexeddb-user-api.service';\nexport * from './indexeddb-conversation-api.service';\nexport * from './indexeddb-message-api.service';\nexport * from './indexeddb-realtime-api.service';\n\n// AI-enhanced API implementations\nexport * from './ai-responder.service';\nexport * from './indexeddb-message-ai-api.service';\n","/**\n * File Upload Service\n * Centralized service for handling file uploads and processing\n */\n\nimport { Injectable, inject } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { CONVERSATION_CONFIG } from '../tokens';\n\nexport interface FileUploadProgress {\n file: File;\n progress: number;\n status: 'pending' | 'uploading' | 'completed' | 'error';\n error?: string;\n}\n\nexport interface FilePreview {\n file: File;\n preview?: string;\n type: 'image' | 'video' | 'audio' | 'file';\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXFileUploadService {\n private readonly config = inject(CONVERSATION_CONFIG);\n private uploadProgress$ = new Subject<FileUploadProgress>();\n\n /**\n * Get upload progress observable\n */\n getUploadProgress(): Observable<FileUploadProgress> {\n return this.uploadProgress$.asObservable();\n }\n\n /**\n * Read file as data URL for preview\n */\n async readFileAsDataURL(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => resolve(e.target?.result as string);\n reader.onerror = (e) => reject(e);\n reader.readAsDataURL(file);\n });\n }\n\n /**\n * Get file type category\n */\n getFileType(file: File): 'image' | 'video' | 'audio' | 'file' {\n if (file.type.startsWith('image/')) return 'image';\n if (file.type.startsWith('video/')) return 'video';\n if (file.type.startsWith('audio/')) return 'audio';\n return 'file';\n }\n\n /**\n * Generate file preview\n */\n async generatePreview(file: File): Promise<FilePreview> {\n const type = this.getFileType(file);\n let preview: string | undefined;\n\n if (type === 'image' || type === 'video') {\n try {\n preview = await this.readFileAsDataURL(file);\n } catch (error) {\n console.error('Failed to generate preview:', error);\n }\n }\n\n return { file, preview, type };\n }\n\n /**\n * Generate previews for multiple files\n */\n async generatePreviews(files: File[]): Promise<FilePreview[]> {\n return Promise.all(files.map((file) => this.generatePreview(file)));\n }\n\n /**\n * Get video duration\n */\n async getVideoDuration(file: File): Promise<number> {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.preload = 'metadata';\n \n video.onloadedmetadata = () => {\n URL.revokeObjectURL(video.src);\n resolve(video.duration);\n };\n \n video.onerror = () => {\n URL.revokeObjectURL(video.src);\n reject(new Error('Failed to load video metadata'));\n };\n \n video.src = URL.createObjectURL(file);\n });\n }\n\n /**\n * Get audio duration\n */\n async getAudioDuration(file: File): Promise<number> {\n return new Promise((resolve, reject) => {\n const audio = new Audio();\n \n audio.onloadedmetadata = () => {\n URL.revokeObjectURL(audio.src);\n resolve(audio.duration);\n };\n \n audio.onerror = () => {\n URL.revokeObjectURL(audio.src);\n reject(new Error('Failed to load audio metadata'));\n };\n \n audio.src = URL.createObjectURL(file);\n });\n }\n\n /**\n * Format file size\n */\n formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n }\n\n /**\n * Format duration (seconds to mm:ss)\n */\n formatDuration(seconds: number): string {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n }\n\n /**\n * Validate file type\n */\n validateFileType(file: File, allowedTypes: string[]): boolean {\n return allowedTypes.some((type) => {\n if (type.endsWith('/*')) {\n const category = type.replace('/*', '');\n return file.type.startsWith(`${category}/`);\n }\n return file.type === type;\n });\n }\n\n /**\n * Validate file size\n */\n validateFileSize(file: File, maxSizeInMB: number): boolean {\n const maxSizeInBytes = maxSizeInMB * 1024 * 1024;\n return file.size <= maxSizeInBytes;\n }\n\n /**\n * Filter files by type\n */\n filterFilesByType(files: File[], allowedTypes: string[]): File[] {\n return files.filter((file) => this.validateFileType(file, allowedTypes));\n }\n\n /**\n * Validate file type against conversation config\n */\n isFileTypeAllowed(file: File): boolean {\n return this.validateFileType(file, this.config.allowedFileTypes);\n }\n\n /**\n * Validate file size against conversation config\n */\n isFileSizeAllowed(file: File): boolean {\n return file.size <= this.config.maxFileSize;\n }\n\n /**\n * Validate a set of files using conversation config\n */\n validateFilesWithConfig(files: File[]): { accepted: File[]; rejected: { file: File; reason: string }[] } {\n const accepted: File[] = [];\n const rejected: { file: File; reason: string }[] = [];\n\n for (const file of files) {\n if (!this.isFileTypeAllowed(file)) {\n rejected.push({ file, reason: 'type' });\n continue;\n }\n if (!this.isFileSizeAllowed(file)) {\n rejected.push({ file, reason: 'size' });\n continue;\n }\n accepted.push(file);\n }\n\n return { accepted, rejected };\n }\n}\n","/**\n * Picker Footer Component\n * Reusable footer for all picker components\n */\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { Component, input, output } from '@angular/core';\n\n@Component({\n selector: 'ax-picker-footer',\n imports: [AXButtonModule],\n template: `\n <div class=\"picker-footer\">\n <ax-button text=\"Cancel\" look=\"solid\" color=\"danger\" (onClick)=\"onCancel.emit()\" />\n <ax-button\n [text]=\"sendText()\"\n [look]=\"'outline'\"\n color=\"primary\"\n [disabled]=\"sendDisabled()\"\n (onClick)=\"onSend.emit()\"\n />\n </div>\n `,\n styles: [\n `\n .picker-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n border-top: 1px solid rgb(var(--ax-sys-color-border));\n }\n `,\n ],\n})\nexport class AXPickerFooterComponent {\n readonly sendText = input.required<string>();\n readonly sendDisabled = input<boolean>(false);\n readonly onCancel = output<void>();\n readonly onSend = output<void>();\n}\n","/**\n * Picker Header Component\n * Reusable header for all picker components\n */\n\nimport { Component, input, output } from '@angular/core';\n\n@Component({\n selector: 'ax-picker-header',\n template: `\n <div class=\"picker-header\">\n <span class=\"picker-title\">{{ title() }}</span>\n <button type=\"button\" class=\"close-button\" (click)=\"onClose.emit()\" aria-label=\"Close\">\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n `,\n styles: [\n `\n .picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border));\n }\n\n .picker-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: none;\n background: transparent;\n border-radius: 0.25rem;\n cursor: pointer;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n transition: all 0.2s;\n font-size: 1.125rem;\n }\n\n .close-button:hover {\n background: rgb(var(--ax-sys-color-error) / 0.1);\n color: rgb(var(--ax-sys-color-error));\n }\n `,\n ],\n})\nexport class AXPickerHeaderComponent {\n readonly title = input.required<string>();\n readonly onClose = output<void>();\n}\n","/**\n * Audio Picker Component\n * Full-width audio file selection interface for the composer\n */\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { CommonModule } from '@angular/common';\nimport { Component, ElementRef, inject, input, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXComposerService } from '../../../../components';\nimport { AXConversation, AXSendMessageCommand } from '../../../../models';\nimport { AXConversationService } from '../../../../services';\nimport { AXFileUploadService } from '../../../../services/file-upload.service';\nimport { AXPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXPickerHeaderComponent } from '../picker-header/picker-header.component';\n\ninterface AudioFile {\n file: File;\n duration?: number;\n dataUrl?: string;\n}\n\n@Component({\n selector: 'ax-conversation-audio-picker',\n imports: [\n CommonModule,\n AXButtonModule,\n AXDecoratorModule,\n AXTextBoxModule,\n FormsModule,\n AXPickerHeaderComponent,\n AXPickerFooterComponent,\n ],\n template: `\n <div class=\"audio-picker\">\n <ax-picker-header [title]=\"'Send Audio'\" (onClose)=\"cancel()\" />\n\n <!-- Audio Selection Area -->\n @if (audioFiles().length === 0) {\n <div\n class=\"picker-empty\"\n [class.drag-over]=\"isDragging()\"\n (click)=\"triggerFileInput()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div class=\"empty-icon\">\n <i class=\"fa-light\" [class.fa-music]=\"!isDragging()\" [class.fa-cloud-arrow-up]=\"isDragging()\"></i>\n </div>\n <div class=\"empty-text\">\n <div class=\"empty-title\">{{ isDragging() ? 'Drop audio files to attach' : 'Select audio files' }}</div>\n <div class=\"empty-subtitle\">{{ isDragging() ? 'Release to upload' : 'or click to browse' }}</div>\n </div>\n </div>\n } @else {\n <!-- Audio File List -->\n <div class=\"picker-audio\">\n <div class=\"audio-header\">\n <span class=\"audio-count\">{{ audioFiles().length }} audio file(s) selected</span>\n <ax-button text=\"Add More\" [look]=\"'ghost'\" (onClick)=\"triggerFileInput()\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-plus\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n\n <div class=\"audio-list\">\n @for (audio of audioFiles(); track $index) {\n <div class=\"audio-item\">\n <div class=\"audio-icon\">\n <i class=\"fa-light fa-music\"></i>\n </div>\n <div class=\"audio-info\">\n <div class=\"audio-name\">{{ audio.file.name }}</div>\n <div class=\"audio-meta\">\n <span class=\"audio-size\">{{ formatFileSize(audio.file.size) }}</span>\n @if (audio.duration) {\n <span class=\"audio-duration\">{{ formatDuration(audio.duration) }}</span>\n }\n </div>\n </div>\n <button type=\"button\" class=\"remove-button\" (click)=\"removeAudio($index)\" aria-label=\"Remove\">\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n\n <!-- Caption Input -->\n <div class=\"caption-input\">\n <ax-text-box [(value)]=\"caption\" [placeholder]=\"'Add a caption (optional)'\" />\n </div>\n </div>\n }\n\n <!-- Footer Actions -->\n @if (audioFiles().length > 0) {\n <ax-picker-footer \n [sendText]=\"'Send ' + audioFiles().length + ' Audio File(s)'\" \n (onCancel)=\"cancel()\" \n (onSend)=\"sendAudio()\" \n />\n }\n\n <!-- Hidden File Input -->\n <input\n #fileInput\n type=\"file\"\n accept=\"audio/*\"\n multiple\n style=\"display: none;\"\n (change)=\"onFileInputChange($event)\"\n />\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .audio-picker {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border));\n background: rgb(var(--ax-sys-color-surface));\n }\n\n .picker-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: none;\n background: transparent;\n border-radius: 0.25rem;\n cursor: pointer;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n transition: all 0.2s;\n font-size: 1.125rem;\n }\n\n .close-button:hover {\n background: rgb(var(--ax-sys-color-error) / 0.1);\n color: rgb(var(--ax-sys-color-error));\n }\n\n .picker-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 0.25rem;\n max-height: 450px;\n cursor: pointer;\n border: 2px dashed rgb(var(--ax-sys-color-border));\n border-radius: 0.5rem;\n margin: 0.75rem;\n transition: all 0.2s;\n }\n\n .picker-empty:hover,\n .picker-empty.drag-over {\n border-color: rgb(var(--ax-sys-color-primary));\n background: rgb(var(--ax-sys-color-primary) / 0.05);\n }\n\n .empty-icon {\n font-size: 2.5rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n margin-bottom: 0.75rem;\n }\n\n .empty-text {\n text-align: center;\n }\n\n .empty-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n margin-bottom: 0.25rem;\n }\n\n .empty-subtitle {\n font-size: 0.8125rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .picker-audio {\n padding: 0.75rem;\n }\n\n .audio-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 0.75rem;\n }\n\n .audio-count {\n font-size: 0.8125rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .audio-list {\n display: flex;\n flex-direction: column;\n gap: 0.625rem;\n margin-bottom: 0.75rem;\n }\n\n .audio-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.625rem;\n background: rgb(var(--ax-sys-color-surface));\n border-radius: 0.375rem;\n border: 1px solid rgb(var(--ax-sys-color-border));\n transition: background-color 0.2s;\n }\n\n .audio-item:hover {\n background: rgb(var(--ax-sys-color-surface-variant));\n }\n\n .audio-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 0.375rem;\n background: rgb(var(--ax-sys-color-primary) / 0.1);\n color: rgb(var(--ax-sys-color-primary));\n font-size: 1.125rem;\n flex-shrink: 0;\n }\n\n .audio-info {\n flex: 1;\n min-width: 0;\n }\n\n .audio-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-bottom: 0.25rem;\n }\n\n .audio-meta {\n display: flex;\n gap: 1rem;\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .remove-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: none;\n background: transparent;\n border-radius: 0.25rem;\n cursor: pointer;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n transition: all 0.2s;\n flex-shrink: 0;\n font-size: 1rem;\n }\n\n .remove-button:hover {\n background: rgb(var(--ax-sys-color-error) / 0.1);\n color: rgb(var(--ax-sys-color-error));\n }\n\n .caption-input {\n margin-top: 0.75rem;\n }\n\n .picker-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n border-top: 1px solid rgb(var(--ax-sys-color-border));\n background: rgb(var(--ax-sys-color-surface));\n }\n `,\n ],\n})\nexport class AXAudioPickerComponent {\n private readonly composerService = inject(AXComposerService);\n private readonly conversationService = inject(AXConversationService);\n private readonly fileUploadService = inject(AXFileUploadService);\n\n readonly conversation = input.required<AXConversation>();\n readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n readonly audioFiles = signal<AudioFile[]>([]);\n readonly isDragging = signal(false);\n caption = '';\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n async handleFiles(files: File[]): Promise<void> {\n const audioFileList = this.fileUploadService.filterFilesByType(files, ['audio/*']);\n\n for (const file of audioFileList) {\n try {\n const duration = await this.fileUploadService.getAudioDuration(file);\n const dataUrl = await this.fileUploadService.readFileAsDataURL(file);\n this.audioFiles.update((audios) => [...audios, { file, duration, dataUrl }]);\n } catch (error) {\n console.error('Failed to process audio:', error);\n }\n }\n }\n\n onFileInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const files = Array.from(input.files || []);\n if (files.length > 0) {\n this.handleFiles(files);\n }\n input.value = '';\n }\n\n removeAudio(index: number): void {\n this.audioFiles.update((audios) => audios.filter((_, i) => i !== index));\n }\n\n onDragEnter(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(true);\n }\n\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(false);\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(false);\n\n const files = Array.from(event.dataTransfer?.files || []);\n if (files.length > 0) {\n this.handleFiles(files);\n }\n }\n\n async sendAudio(): Promise<void> {\n const audioList = this.audioFiles();\n if (audioList.length === 0) return;\n\n // Send each audio file as a separate message\n for (const audio of audioList) {\n const command: AXSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'audio',\n payload: {\n type: 'audio',\n url: audio.dataUrl || '', // Using data URL for demo, upload to server in production\n duration: audio.duration || 0,\n size: audio.file.size,\n title: audio.file.name,\n mimeType: audio.file.type,\n },\n };\n\n await this.conversationService.sendMessage(command);\n }\n\n this.cancel();\n }\n\n cancel(): void {\n this.audioFiles.set([]);\n this.caption = '';\n this.composerService.hideComponent();\n }\n\n formatFileSize(bytes: number): string {\n return this.fileUploadService.formatFileSize(bytes);\n }\n\n formatDuration(seconds: number): string {\n return this.fileUploadService.formatDuration(seconds);\n }\n}\n","/**\n * Emoji Tab Component\n * Emoji picker for composer popup\n */\n\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\ninterface Emoji {\n char: string;\n name: string;\n keywords: string[];\n}\n\ninterface EmojiCategory {\n id: string;\n name: string;\n icon: string;\n emojis: Emoji[];\n}\n\nconst EMOJI_CATEGORIES: EmojiCategory[] = [\n {\n id: 'smileys',\n name: 'Smileys & People',\n icon: '😀',\n emojis: [\n { char: '😀', name: 'grinning face', keywords: ['smile', 'happy', 'joy', 'grin'] },\n { char: '😃', name: 'grinning face with big eyes', keywords: ['smile', 'happy', 'joy'] },\n { char: '😄', name: 'grinning face with smiling eyes', keywords: ['smile', 'happy', 'joy', 'laugh'] },\n { char: '😁', name: 'beaming face with smiling eyes', keywords: ['smile', 'happy', 'grin'] },\n { char: '😆', name: 'grinning squinting face', keywords: ['laugh', 'happy', 'smile'] },\n { char: '😅', name: 'grinning face with sweat', keywords: ['smile', 'hot', 'happy', 'laugh', 'relief'] },\n { char: '🤣', name: 'rolling on the floor laughing', keywords: ['laugh', 'lol', 'rofl', 'funny'] },\n { char: '😂', name: 'face with tears of joy', keywords: ['laugh', 'cry', 'tears', 'joy', 'lol'] },\n { char: '🙂', name: 'slightly smiling face', keywords: ['smile', 'happy'] },\n { char: '🙃', name: 'upside down face', keywords: ['silly', 'sarcasm'] },\n { char: '😉', name: 'winking face', keywords: ['wink', 'flirt'] },\n { char: '😊', name: 'smiling face with smiling eyes', keywords: ['smile', 'happy', 'blush'] },\n { char: '😇', name: 'smiling face with halo', keywords: ['angel', 'innocent', 'halo'] },\n { char: '🥰', name: 'smiling face with hearts', keywords: ['love', 'hearts', 'adore'] },\n { char: '😍', name: 'smiling face with heart eyes', keywords: ['love', 'heart', 'crush'] },\n { char: '🤩', name: 'star struck', keywords: ['star', 'eyes', 'excited'] },\n { char: '😘', name: 'face blowing a kiss', keywords: ['kiss', 'love', 'heart'] },\n { char: '😗', name: 'kissing face', keywords: ['kiss', 'love'] },\n { char: '😚', name: 'kissing face with closed eyes', keywords: ['kiss', 'love'] },\n { char: '😙', name: 'kissing face with smiling eyes', keywords: ['kiss', 'love', 'smile'] },\n { char: '😋', name: 'face savoring food', keywords: ['yum', 'delicious', 'food'] },\n { char: '😛', name: 'face with tongue', keywords: ['tongue', 'silly'] },\n { char: '😜', name: 'winking face with tongue', keywords: ['wink', 'tongue', 'silly'] },\n { char: '🤪', name: 'zany face', keywords: ['crazy', 'silly', 'goofy'] },\n { char: '😝', name: 'squinting face with tongue', keywords: ['tongue', 'silly'] },\n { char: '🤑', name: 'money mouth face', keywords: ['money', 'rich', 'dollar'] },\n { char: '🤗', name: 'hugging face', keywords: ['hug', 'love', 'care'] },\n { char: '🤭', name: 'face with hand over mouth', keywords: ['oops', 'surprise', 'giggle'] },\n { char: '🤫', name: 'shushing face', keywords: ['quiet', 'shh', 'secret'] },\n { char: '🤔', name: 'thinking face', keywords: ['think', 'hmm', 'consider'] },\n ],\n },\n {\n id: 'animals',\n name: 'Animals & Nature',\n icon: '🐶',\n emojis: [\n { char: '🐶', name: 'dog face', keywords: ['dog', 'puppy', 'pet'] },\n { char: '🐱', name: 'cat face', keywords: ['cat', 'kitten', 'pet'] },\n { char: '🐭', name: 'mouse face', keywords: ['mouse', 'rodent'] },\n { char: '🐹', name: 'hamster', keywords: ['hamster', 'pet'] },\n { char: '🐰', name: 'rabbit face', keywords: ['rabbit', 'bunny'] },\n { char: '🦊', name: 'fox', keywords: ['fox', 'animal'] },\n { char: '🐻', name: 'bear', keywords: ['bear', 'animal'] },\n { char: '🐼', name: 'panda', keywords: ['panda', 'bear'] },\n { char: '🐨', name: 'koala', keywords: ['koala', 'bear'] },\n { char: '🐯', name: 'tiger face', keywords: ['tiger', 'cat'] },\n { char: '🦁', name: 'lion', keywords: ['lion', 'cat'] },\n { char: '🐮', name: 'cow face', keywords: ['cow', 'cattle'] },\n { char: '🐷', name: 'pig face', keywords: ['pig', 'pork'] },\n { char: '🐸', name: 'frog', keywords: ['frog', 'toad'] },\n { char: '🐵', name: 'monkey face', keywords: ['monkey', 'ape'] },\n { char: '🐔', name: 'chicken', keywords: ['chicken', 'bird'] },\n { char: '🐧', name: 'penguin', keywords: ['penguin', 'bird'] },\n { char: '🐦', name: 'bird', keywords: ['bird'] },\n { char: '🐤', name: 'baby chick', keywords: ['chick', 'bird', 'baby'] },\n { char: '🦆', name: 'duck', keywords: ['duck', 'bird'] },\n { char: '🦅', name: 'eagle', keywords: ['eagle', 'bird'] },\n { char: '🦉', name: 'owl', keywords: ['owl', 'bird'] },\n { char: '🦇', name: 'bat', keywords: ['bat', 'vampire'] },\n { char: '🐺', name: 'wolf', keywords: ['wolf', 'dog'] },\n { char: '🐗', name: 'boar', keywords: ['boar', 'pig'] },\n { char: '🐴', name: 'horse face', keywords: ['horse', 'pony'] },\n { char: '🦄', name: 'unicorn', keywords: ['unicorn', 'fantasy'] },\n { char: '🐝', name: 'honeybee', keywords: ['bee', 'honey', 'insect'] },\n { char: '🐛', name: 'bug', keywords: ['bug', 'insect', 'caterpillar'] },\n { char: '🦋', name: 'butterfly', keywords: ['butterfly', 'insect'] },\n ],\n },\n {\n id: 'food',\n name: 'Food & Drink',\n icon: '🍕',\n emojis: [\n { char: '🍇', name: 'grapes', keywords: ['grapes', 'fruit'] },\n { char: '🍈', name: 'melon', keywords: ['melon', 'fruit'] },\n { char: '🍉', name: 'watermelon', keywords: ['watermelon', 'fruit'] },\n { char: '🍊', name: 'tangerine', keywords: ['orange', 'fruit', 'citrus'] },\n { char: '🍋', name: 'lemon', keywords: ['lemon', 'fruit', 'citrus'] },\n { char: '🍌', name: 'banana', keywords: ['banana', 'fruit'] },\n { char: '🍍', name: 'pineapple', keywords: ['pineapple', 'fruit'] },\n { char: '🥭', name: 'mango', keywords: ['mango', 'fruit'] },\n { char: '🍎', name: 'red apple', keywords: ['apple', 'fruit', 'red'] },\n { char: '🍏', name: 'green apple', keywords: ['apple', 'fruit', 'green'] },\n { char: '🍐', name: 'pear', keywords: ['pear', 'fruit'] },\n { char: '🍑', name: 'peach', keywords: ['peach', 'fruit'] },\n { char: '🍒', name: 'cherries', keywords: ['cherry', 'fruit'] },\n { char: '🍓', name: 'strawberry', keywords: ['strawberry', 'fruit', 'berry'] },\n { char: '🥝', name: 'kiwi fruit', keywords: ['kiwi', 'fruit'] },\n { char: '🍅', name: 'tomato', keywords: ['tomato', 'vegetable'] },\n { char: '🥥', name: 'coconut', keywords: ['coconut', 'fruit'] },\n { char: '🥑', name: 'avocado', keywords: ['avocado', 'fruit'] },\n { char: '🍆', name: 'eggplant', keywords: ['eggplant', 'vegetable'] },\n { char: '🥔', name: 'potato', keywords: ['potato', 'vegetable'] },\n { char: '🥕', name: 'carrot', keywords: ['carrot', 'vegetable'] },\n { char: '🌽', name: 'corn', keywords: ['corn', 'vegetable'] },\n { char: '🌶️', name: 'hot pepper', keywords: ['pepper', 'hot', 'spicy'] },\n { char: '🥒', name: 'cucumber', keywords: ['cucumber', 'vegetable'] },\n { char: '🥬', name: 'leafy green', keywords: ['lettuce', 'vegetable', 'green'] },\n { char: '🥦', name: 'broccoli', keywords: ['broccoli', 'vegetable'] },\n { char: '🍄', name: 'mushroom', keywords: ['mushroom', 'vegetable'] },\n { char: '🥜', name: 'peanuts', keywords: ['peanut', 'nut'] },\n { char: '🌰', name: 'chestnut', keywords: ['chestnut', 'nut'] },\n { char: '🍞', name: 'bread', keywords: ['bread', 'food'] },\n ],\n },\n {\n id: 'activities',\n name: 'Activities',\n icon: '⚽',\n emojis: [\n { char: '⚽', name: 'soccer ball', keywords: ['soccer', 'football', 'sport', 'ball'] },\n { char: '🏀', name: 'basketball', keywords: ['basketball', 'sport', 'ball'] },\n { char: '🏈', name: 'american football', keywords: ['football', 'sport', 'ball'] },\n { char: '⚾', name: 'baseball', keywords: ['baseball', 'sport', 'ball'] },\n { char: '🥎', name: 'softball', keywords: ['softball', 'sport', 'ball'] },\n { char: '🎾', name: 'tennis', keywords: ['tennis', 'sport', 'ball'] },\n { char: '🏐', name: 'volleyball', keywords: ['volleyball', 'sport', 'ball'] },\n { char: '🏉', name: 'rugby football', keywords: ['rugby', 'sport', 'ball'] },\n { char: '🥏', name: 'flying disc', keywords: ['frisbee', 'disc', 'sport'] },\n { char: '🎱', name: 'pool 8 ball', keywords: ['pool', 'billiards', 'ball'] },\n { char: '🏓', name: 'ping pong', keywords: ['ping pong', 'table tennis', 'sport'] },\n { char: '🏸', name: 'badminton', keywords: ['badminton', 'sport'] },\n { char: '🏒', name: 'ice hockey', keywords: ['hockey', 'ice', 'sport'] },\n { char: '🏑', name: 'field hockey', keywords: ['hockey', 'field', 'sport'] },\n { char: '🥍', name: 'lacrosse', keywords: ['lacrosse', 'sport'] },\n { char: '🏏', name: 'cricket game', keywords: ['cricket', 'sport'] },\n { char: '🥅', name: 'goal net', keywords: ['goal', 'net', 'sport'] },\n { char: '⛳', name: 'flag in hole', keywords: ['golf', 'sport'] },\n { char: '🏹', name: 'bow and arrow', keywords: ['archery', 'bow', 'arrow'] },\n { char: '🎣', name: 'fishing pole', keywords: ['fishing', 'fish'] },\n { char: '🤿', name: 'diving mask', keywords: ['diving', 'snorkel'] },\n { char: '🥊', name: 'boxing glove', keywords: ['boxing', 'glove', 'sport'] },\n { char: '🥋', name: 'martial arts uniform', keywords: ['martial arts', 'karate', 'judo'] },\n { char: '🎽', name: 'running shirt', keywords: ['running', 'sport', 'shirt'] },\n { char: '🛹', name: 'skateboard', keywords: ['skateboard', 'sport'] },\n { char: '🛷', name: 'sled', keywords: ['sled', 'snow'] },\n { char: '⛸️', name: 'ice skate', keywords: ['ice skate', 'skating'] },\n { char: '🥌', name: 'curling stone', keywords: ['curling', 'sport'] },\n { char: '🎿', name: 'skis', keywords: ['ski', 'snow', 'sport'] },\n { char: '⛷️', name: 'skier', keywords: ['ski', 'snow', 'sport'] },\n ],\n },\n {\n id: 'travel',\n name: 'Travel & Places',\n icon: '✈️',\n emojis: [\n { char: '🚗', name: 'automobile', keywords: ['car', 'vehicle', 'drive'] },\n { char: '🚕', name: 'taxi', keywords: ['taxi', 'cab', 'car'] },\n { char: '🚙', name: 'sport utility vehicle', keywords: ['suv', 'car', 'vehicle'] },\n { char: '🚌', name: 'bus', keywords: ['bus', 'vehicle'] },\n { char: '🚎', name: 'trolleybus', keywords: ['trolley', 'bus'] },\n { char: '🏎️', name: 'racing car', keywords: ['race', 'car', 'fast'] },\n { char: '🚓', name: 'police car', keywords: ['police', 'car', 'cop'] },\n { char: '🚑', name: 'ambulance', keywords: ['ambulance', 'emergency'] },\n { char: '🚒', name: 'fire engine', keywords: ['fire', 'truck', 'emergency'] },\n { char: '🚐', name: 'minibus', keywords: ['minibus', 'van'] },\n { char: '🚚', name: 'delivery truck', keywords: ['truck', 'delivery'] },\n { char: '🚛', name: 'articulated lorry', keywords: ['truck', 'semi'] },\n { char: '🚜', name: 'tractor', keywords: ['tractor', 'farm'] },\n { char: '🛴', name: 'kick scooter', keywords: ['scooter', 'kick'] },\n { char: '🚲', name: 'bicycle', keywords: ['bike', 'bicycle', 'cycle'] },\n { char: '🛵', name: 'motor scooter', keywords: ['scooter', 'moped'] },\n { char: '🏍️', name: 'motorcycle', keywords: ['motorcycle', 'bike'] },\n { char: '🚨', name: 'police car light', keywords: ['police', 'siren', 'emergency'] },\n { char: '🚔', name: 'oncoming police car', keywords: ['police', 'car'] },\n { char: '🚍', name: 'oncoming bus', keywords: ['bus'] },\n { char: '🚘', name: 'oncoming automobile', keywords: ['car'] },\n { char: '🚖', name: 'oncoming taxi', keywords: ['taxi', 'cab'] },\n { char: '🚡', name: 'aerial tramway', keywords: ['cable', 'car', 'tramway'] },\n { char: '🚠', name: 'mountain cableway', keywords: ['cable', 'car', 'mountain'] },\n { char: '🚟', name: 'suspension railway', keywords: ['train', 'railway'] },\n { char: '🚃', name: 'railway car', keywords: ['train', 'railway'] },\n { char: '🚋', name: 'tram car', keywords: ['tram', 'trolley'] },\n { char: '🚞', name: 'mountain railway', keywords: ['train', 'mountain'] },\n { char: '🚝', name: 'monorail', keywords: ['monorail', 'train'] },\n { char: '🚄', name: 'high-speed train', keywords: ['train', 'fast', 'bullet'] },\n ],\n },\n {\n id: 'objects',\n name: 'Objects',\n icon: '💡',\n emojis: [\n { char: '⌚', name: 'watch', keywords: ['watch', 'time'] },\n { char: '📱', name: 'mobile phone', keywords: ['phone', 'mobile', 'cell'] },\n { char: '📲', name: 'mobile phone with arrow', keywords: ['phone', 'call'] },\n { char: '💻', name: 'laptop', keywords: ['laptop', 'computer'] },\n { char: '⌨️', name: 'keyboard', keywords: ['keyboard', 'type'] },\n { char: '🖥️', name: 'desktop computer', keywords: ['computer', 'desktop', 'pc'] },\n { char: '🖨️', name: 'printer', keywords: ['printer', 'print'] },\n { char: '🖱️', name: 'computer mouse', keywords: ['mouse', 'computer'] },\n { char: '🖲️', name: 'trackball', keywords: ['trackball', 'mouse'] },\n { char: '🕹️', name: 'joystick', keywords: ['joystick', 'game'] },\n { char: '🗜️', name: 'clamp', keywords: ['clamp', 'tool'] },\n { char: '💽', name: 'computer disk', keywords: ['disk', 'minidisc'] },\n { char: '💾', name: 'floppy disk', keywords: ['floppy', 'disk', 'save'] },\n { char: '💿', name: 'optical disk', keywords: ['cd', 'disk'] },\n { char: '📀', name: 'dvd', keywords: ['dvd', 'disk'] },\n { char: '📼', name: 'videocassette', keywords: ['vhs', 'tape', 'video'] },\n { char: '📷', name: 'camera', keywords: ['camera', 'photo'] },\n { char: '📸', name: 'camera with flash', keywords: ['camera', 'photo', 'flash'] },\n { char: '📹', name: 'video camera', keywords: ['video', 'camera'] },\n { char: '🎥', name: 'movie camera', keywords: ['movie', 'camera', 'film'] },\n { char: '📽️', name: 'film projector', keywords: ['projector', 'film', 'movie'] },\n { char: '🎞️', name: 'film frames', keywords: ['film', 'movie'] },\n { char: '📞', name: 'telephone receiver', keywords: ['phone', 'call'] },\n { char: '☎️', name: 'telephone', keywords: ['phone', 'call'] },\n { char: '📟', name: 'pager', keywords: ['pager', 'beeper'] },\n { char: '📠', name: 'fax machine', keywords: ['fax'] },\n { char: '📺', name: 'television', keywords: ['tv', 'television'] },\n { char: '📻', name: 'radio', keywords: ['radio'] },\n { char: '🎙️', name: 'studio microphone', keywords: ['microphone', 'mic', 'studio'] },\n { char: '🎚️', name: 'level slider', keywords: ['slider', 'control'] },\n ],\n },\n {\n id: 'symbols',\n name: 'Symbols',\n icon: '❤️',\n emojis: [\n { char: '❤️', name: 'red heart', keywords: ['heart', 'love', 'red'] },\n { char: '🧡', name: 'orange heart', keywords: ['heart', 'love', 'orange'] },\n { char: '💛', name: 'yellow heart', keywords: ['heart', 'love', 'yellow'] },\n { char: '💚', name: 'green heart', keywords: ['heart', 'love', 'green'] },\n { char: '💙', name: 'blue heart', keywords: ['heart', 'love', 'blue'] },\n { char: '💜', name: 'purple heart', keywords: ['heart', 'love', 'purple'] },\n { char: '🖤', name: 'black heart', keywords: ['heart', 'love', 'black'] },\n { char: '🤍', name: 'white heart', keywords: ['heart', 'love', 'white'] },\n { char: '🤎', name: 'brown heart', keywords: ['heart', 'love', 'brown'] },\n { char: '💔', name: 'broken heart', keywords: ['heart', 'broken', 'sad'] },\n { char: '❣️', name: 'heart exclamation', keywords: ['heart', 'love', 'exclamation'] },\n { char: '💕', name: 'two hearts', keywords: ['heart', 'love', 'two'] },\n { char: '💞', name: 'revolving hearts', keywords: ['heart', 'love', 'revolving'] },\n { char: '💓', name: 'beating heart', keywords: ['heart', 'love', 'beat'] },\n { char: '💗', name: 'growing heart', keywords: ['heart', 'love', 'grow'] },\n { char: '💖', name: 'sparkling heart', keywords: ['heart', 'love', 'sparkle'] },\n { char: '💘', name: 'heart with arrow', keywords: ['heart', 'love', 'arrow', 'cupid'] },\n { char: '💝', name: 'heart with ribbon', keywords: ['heart', 'love', 'gift'] },\n { char: '💟', name: 'heart decoration', keywords: ['heart', 'love', 'decoration'] },\n { char: '☮️', name: 'peace symbol', keywords: ['peace', 'symbol'] },\n { char: '✝️', name: 'latin cross', keywords: ['cross', 'christian', 'religion'] },\n { char: '☪️', name: 'star and crescent', keywords: ['islam', 'muslim', 'religion'] },\n { char: '🕉️', name: 'om', keywords: ['om', 'hindu', 'religion'] },\n { char: '☸️', name: 'wheel of dharma', keywords: ['dharma', 'buddhist', 'religion'] },\n { char: '✡️', name: 'star of david', keywords: ['jewish', 'star', 'religion'] },\n { char: '🔯', name: 'dotted six-pointed star', keywords: ['star', 'symbol'] },\n { char: '🕎', name: 'menorah', keywords: ['menorah', 'jewish', 'religion'] },\n { char: '☯️', name: 'yin yang', keywords: ['yin', 'yang', 'balance'] },\n { char: '☦️', name: 'orthodox cross', keywords: ['cross', 'orthodox', 'religion'] },\n { char: '🛐', name: 'place of worship', keywords: ['worship', 'religion', 'pray'] },\n ],\n },\n];\n\n@Component({\n selector: 'ax-emoji-tab',\n imports: [CommonModule, FormsModule, AXSearchBoxModule],\n template: `\n <div class=\"emoji-tab\">\n <!-- Search -->\n <div class=\"emoji-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search emoji...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"emoji-categories\">\n @for (category of categories; track category.id) {\n <button\n type=\"button\"\n [class]=\"getCategoryClasses(category.id)\"\n (click)=\"selectCategory(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Emoji Grid -->\n <div class=\"emoji-grid\">\n @for (emoji of filteredEmojis(); track emoji.char) {\n <button\n type=\"button\"\n class=\"emoji-button\"\n (click)=\"selectEmoji(emoji.char)\"\n [attr.aria-label]=\"emoji.name\"\n [title]=\"emoji.name\"\n >\n {{ emoji.char }}\n </button>\n }\n </div>\n\n @if (filteredEmojis().length === 0) {\n <div class=\"emoji-empty\">\n <p>No emojis found</p>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .emoji-tab {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .emoji-search {\n position: sticky;\n top: 0;\n z-index: 10;\n padding-block: 0.75rem;\n }\n\n .emoji-categories {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 0.25rem;\n margin-bottom: 0.75rem;\n padding-bottom: 0.75rem;\n overflow-x: auto;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .category-button {\n height: 3rem;\n width: 3rem;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 0.5rem;\n border: none;\n background: transparent;\n border-radius: 0.375rem;\n cursor: pointer;\n font-size: 1.25rem;\n transition: all 0.15s;\n font-family: 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Apple Color Emoji', 'Twemoji Mozilla', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .category-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .category-button-active {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n color: rgb(var(--ax-sys-color-on-primary-lightest-surface));\n }\n\n .emoji-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, 40px);\n gap: 0.25rem;\n // overflow-y: auto;\n max-height: 240px;\n }\n\n .emoji-button {\n width: 3rem;\n height: 3rem;\n padding: 0.5rem;\n border: none;\n background: transparent;\n border-radius: 0.375rem;\n cursor: pointer;\n font-size: 1.5rem;\n transition: all 0.15s;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Apple Color Emoji', 'Twemoji Mozilla', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .emoji-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n // transform: scale(1.2);\n }\n\n .emoji-empty {\n padding: 2rem;\n text-align: center;\n opacity: 0.6;\n }\n `,\n ],\n})\nexport class AXEmojiTabComponent {\n /** Emoji selected event */\n readonly itemSelected = output<string>();\n\n /** Search query */\n readonly searchQuery = signal('');\n\n /** Active category */\n private readonly activeCategoryId = signal<string>('smileys');\n\n /** Categories */\n readonly categories = EMOJI_CATEGORIES;\n\n /** Filtered emojis */\n readonly filteredEmojis = computed(() => {\n const query = this.searchQuery().toLowerCase().trim();\n const categoryId = this.activeCategoryId();\n\n if (query) {\n // Search across all categories by name and keywords\n return EMOJI_CATEGORIES.flatMap((cat) => cat.emojis).filter((emoji) => {\n const searchText = `${emoji.name} ${emoji.keywords.join(' ')}`.toLowerCase();\n return searchText.includes(query);\n });\n } else {\n // Show active category\n const category = EMOJI_CATEGORIES.find((c) => c.id === categoryId);\n return category ? category.emojis : [];\n }\n });\n\n /** Select category */\n selectCategory(categoryId: string): void {\n this.activeCategoryId.set(categoryId);\n this.searchQuery.set('');\n }\n\n /** Get category CSS classes */\n getCategoryClasses(categoryId: string): string {\n const classes = ['category-button'];\n if (this.activeCategoryId() === categoryId) {\n classes.push('category-button-active');\n }\n return classes.join(' ');\n }\n\n /** Handle search change */\n onSearchChange(event: any): void {\n this.searchQuery.set(event?.value || '');\n }\n\n /** Select emoji */\n selectEmoji(emoji: string): void {\n this.itemSelected.emit(emoji);\n }\n}\n","/**\n * Emoji Tab Component\n */\n\nexport { AXEmojiTabComponent } from './emoji-tab.component';\n","/**\n * Sticker Tab Component\n * Sticker picker for composer popup\n */\n\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { CommonModule } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport { Component, effect, inject, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXStickerPayload } from '../../../../models';\n\ninterface StickerCategory {\n id: string;\n name: string;\n icon: string;\n searchTerm: string;\n}\n\n// Sticker categories using Giphy API\nconst STICKER_CATEGORIES: StickerCategory[] = [\n { id: 'trending', name: 'Trending', icon: '🔥', searchTerm: 'trending' },\n { id: 'happy', name: 'Happy', icon: '😊', searchTerm: 'happy' },\n { id: 'love', name: 'Love', icon: '❤️', searchTerm: 'love' },\n { id: 'funny', name: 'Funny', icon: '😂', searchTerm: 'funny' },\n { id: 'cool', name: 'Cool', icon: '😎', searchTerm: 'cool' },\n { id: 'party', name: 'Party', icon: '🎉', searchTerm: 'party' },\n];\n\n@Component({\n selector: 'ax-sticker-tab',\n imports: [CommonModule, FormsModule, AXSkeletonModule, AXSearchBoxModule],\n template: `\n <div class=\"sticker-tab\">\n <!-- Search -->\n <div class=\"sticker-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search stickers...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"sticker-packs\">\n @for (category of stickerCategories; track category.id) {\n <button\n type=\"button\"\n [class]=\"getPackClasses(category.id)\"\n (click)=\"selectPack(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Loading State -->\n @if (loading()) {\n <div class=\"sticker-grid\">\n @for (i of skeletonItems; track i) {\n <div class=\"sticker-skeleton\">\n <ax-skeleton [animated]=\"true\" class=\"skeleton-item\"></ax-skeleton>\n </div>\n }\n </div>\n }\n\n <!-- Stickers Grid -->\n @if (!loading() && activeStickers().length > 0) {\n <div class=\"sticker-grid\">\n @for (sticker of activeStickers(); track sticker.id) {\n <button\n type=\"button\"\n class=\"sticker-button\"\n (click)=\"selectSticker(sticker)\"\n [attr.aria-label]=\"sticker.emoji\"\n >\n <img [src]=\"sticker.url\" [alt]=\"sticker.emoji || 'Sticker'\" class=\"sticker-image\" loading=\"lazy\" />\n </button>\n }\n </div>\n }\n\n <!-- Empty State -->\n @if (!loading() && activeStickers().length === 0) {\n <div class=\"sticker-empty\">\n <p>No stickers available</p>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .sticker-tab {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .sticker-search {\n position: sticky;\n top: 0;\n z-index: 10;\n padding-block: 0.75rem;\n }\n\n .sticker-packs {\n display: flex;\n gap: 0.25rem;\n padding-top: 0.75rem;\n margin-bottom: 0.75rem;\n padding-bottom: 0.75rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .pack-button {\n width: 3rem;\n height: 3rem;\n padding: 0.5rem;\n border: none;\n background: transparent;\n border-radius: 0.375rem;\n cursor: pointer;\n font-size: 1.25rem;\n transition: all 0.15s;\n font-family:\n 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Apple Color Emoji', 'Twemoji Mozilla', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .pack-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .pack-button-active {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n }\n\n .sticker-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 0.5rem;\n overflow-y: auto;\n max-height: 240px;\n }\n\n .sticker-button {\n padding: 0.5rem;\n border: none;\n background: transparent;\n border-radius: 0.375rem;\n cursor: pointer;\n transition: all 0.15s;\n aspect-ratio: 1;\n }\n\n .sticker-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n // transform: scale(1.05);\n }\n\n .sticker-image {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n .sticker-empty {\n padding: 2rem;\n text-align: center;\n opacity: 0.6;\n }\n\n .sticker-skeleton {\n height: 5rem;\n aspect-ratio: 1;\n border-radius: 0.375rem;\n overflow: hidden;\n }\n\n .skeleton-item {\n width: 100%;\n height: 100%;\n border-radius: 0.375rem;\n }\n `,\n ],\n})\nexport class AXStickerTabComponent {\n private readonly http = inject(HttpClient);\n\n /** Sticker selected event */\n readonly itemSelected = output<AXStickerPayload>();\n\n /** Search query */\n readonly searchQuery = signal('');\n\n /** Active category ID */\n private readonly activeCategoryId = signal<string>('trending');\n\n /** Sticker categories */\n readonly stickerCategories = STICKER_CATEGORIES;\n\n /** Active stickers */\n readonly activeStickers = signal<AXStickerPayload[]>([]);\n\n /** Loading state */\n readonly loading = signal<boolean>(false);\n\n /** Skeleton items array */\n readonly skeletonItems = Array.from({ length: 20 }, (_, i) => i);\n\n // Giphy API key - using public demo key (replace with your own in production)\n private readonly GIPHY_API_KEY = 'sXpGFDGZs0Dv1mmNFvYaGUvYwKX0PWIh';\n\n /** Search debounce timeout */\n private searchTimeout?: number;\n\n constructor() {\n // Load stickers when category changes\n effect(() => {\n const categoryId = this.activeCategoryId();\n const query = this.searchQuery();\n\n // If searching, use search API, otherwise use category\n if (query.trim()) {\n this.searchStickers(query);\n } else {\n this.loadStickers(categoryId);\n }\n });\n }\n\n /** Load stickers from Giphy API */\n private async loadStickers(categoryId: string): Promise<void> {\n this.loading.set(true);\n try {\n const category = STICKER_CATEGORIES.find((c) => c.id === categoryId);\n if (!category) return;\n\n const endpoint =\n categoryId === 'trending'\n ? `https://api.giphy.com/v1/stickers/trending?api_key=${this.GIPHY_API_KEY}&limit=20`\n : `https://api.giphy.com/v1/stickers/search?api_key=${this.GIPHY_API_KEY}&q=${category.searchTerm}&limit=20`;\n\n const response = await this.http.get<any>(endpoint).toPromise();\n\n if (response?.data) {\n const stickers: AXStickerPayload[] = response.data.map((item: any) => ({\n type: 'sticker',\n id: item.id,\n packId: categoryId,\n url: item.images.fixed_height.url,\n animated: item.images.fixed_height.url.endsWith('.gif'),\n width: parseInt(item.images.fixed_height.width),\n height: parseInt(item.images.fixed_height.height),\n emoji: item.title || 'Sticker',\n }));\n this.activeStickers.set(stickers);\n }\n } catch (error) {\n console.error('Failed to load stickers:', error);\n this.activeStickers.set([]);\n } finally {\n this.loading.set(false);\n }\n }\n\n /** Select category */\n selectPack(categoryId: string): void {\n this.activeCategoryId.set(categoryId);\n this.searchQuery.set('');\n }\n\n /** Search stickers using Giphy API */\n private async searchStickers(query: string): Promise<void> {\n if (!query.trim()) {\n // If empty, reload current category\n this.loadStickers(this.activeCategoryId());\n return;\n }\n\n this.loading.set(true);\n try {\n const endpoint = `https://api.giphy.com/v1/stickers/search?api_key=${this.GIPHY_API_KEY}&q=${encodeURIComponent(query)}&limit=20`;\n const response = await this.http.get<any>(endpoint).toPromise();\n\n if (response?.data) {\n const stickers: AXStickerPayload[] = response.data.map((item: any) => ({\n type: 'sticker',\n id: item.id,\n packId: 'search',\n url: item.images.fixed_height.url,\n animated: item.images.fixed_height.url.endsWith('.gif'),\n width: parseInt(item.images.fixed_height.width),\n height: parseInt(item.images.fixed_height.height),\n emoji: item.title || 'Sticker',\n }));\n this.activeStickers.set(stickers);\n }\n } catch (error) {\n console.error('Failed to search stickers:', error);\n this.activeStickers.set([]);\n } finally {\n this.loading.set(false);\n }\n }\n\n /** Handle search change with debouncing */\n onSearchChange(event: any): void {\n const query = event?.value || '';\n\n // Clear existing timeout\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n // Debounce search by 500ms\n this.searchTimeout = window.setTimeout(() => {\n this.searchQuery.set(query);\n }, 500);\n }\n\n /** Get category CSS classes */\n getPackClasses(categoryId: string): string {\n const classes = ['pack-button'];\n if (this.activeCategoryId() === categoryId) {\n classes.push('pack-button-active');\n }\n return classes.join(' ');\n }\n\n /** Select sticker */\n selectSticker(sticker: AXStickerPayload): void {\n this.itemSelected.emit(sticker);\n }\n}\n","import { AXComposerTab } from '../../../../registries';\nimport { AXEmojiTabComponent } from '../emoji-tab';\nimport { AXStickerTabComponent } from '../sticker-tab';\n\n// Individual composer tab constants (no aggregate arrays)\nexport const AX_CONVERSATION_COMPOSER_EMOJI_TAB: AXComposerTab = {\n id: 'emoji',\n title: 'Emoji',\n icon: 'fa-light fa-face-smile',\n priority: 100,\n component: AXEmojiTabComponent,\n enabled: true,\n};\n\nexport const AX_CONVERSATION_COMPOSER_STICKER_TAB: AXComposerTab = {\n id: 'sticker',\n title: 'Stickers',\n icon: 'fa-light fa-note-sticky',\n priority: 90,\n component: AXStickerTabComponent,\n enabled: true,\n};\n","/**\n * Composer Tabs Plugins\n */\n\nexport * from './default-tabs.plugin';\n","/**\n * Contact Picker Component\n * Full-width contact selection interface for the composer\n */\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXComposerService } from '../../../../components';\nimport { AXContactPayload, AXConversation, AXSendMessageCommand } from '../../../../models';\nimport { AXConversationService } from '../../../../services';\nimport { AXPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXPickerHeaderComponent } from '../picker-header/picker-header.component';\n\n@Component({\n selector: 'ax-conversation-contact-picker',\n imports: [\n CommonModule,\n AXButtonModule,\n AXDecoratorModule,\n AXLabelModule,\n AXSearchBoxModule,\n AXTextBoxModule,\n FormsModule,\n AXPickerHeaderComponent,\n AXPickerFooterComponent,\n ],\n template: `\n <div class=\"contact-picker\">\n <ax-picker-header [title]=\"'Send Contact'\" (onClose)=\"cancel()\" />\n\n <div class=\"picker-content\">\n <div class=\"content-grid\">\n <!-- Manual Contact Entry -->\n <div class=\"manual-entry\">\n <h4 class=\"section-title\">New Contact</h4>\n\n <div class=\"form-fields\">\n <div class=\"form-field\">\n <ax-label>Name *</ax-label>\n <ax-text-box [(value)]=\"contactName\" [placeholder]=\"'Contact name'\" />\n </div>\n\n <div class=\"form-field\">\n <ax-label>Phone Number *</ax-label>\n <ax-text-box [(value)]=\"contactPhone\" [placeholder]=\"'+1 234 567 8900'\" />\n </div>\n\n <div class=\"form-field\">\n <ax-label>Email (Optional)</ax-label>\n <ax-text-box [(value)]=\"contactEmail\" [placeholder]=\"'email@example.com'\" />\n </div>\n </div>\n </div>\n\n <!-- Or Divider -->\n <div class=\"divider-vertical\">\n <span class=\"divider-text\">OR</span>\n </div>\n\n <!-- Contact List -->\n <div class=\"contact-list-section\">\n <div class=\"section-header\">\n <h4 class=\"section-title\">From Contacts</h4>\n @if (isContactPickerSupported()) {\n <ax-button look=\"outline\" size=\"sm\" (onClick)=\"openDeviceContacts()\">\n <i class=\"fa-light fa-mobile\"></i>\n Device Contacts\n </ax-button>\n }\n </div>\n\n <div class=\"search-box\">\n <ax-search-box [(value)]=\"searchQuery\" [placeholder]=\"'Search contacts...'\" />\n </div>\n\n <div class=\"contact-list\">\n @if (filteredContacts().length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-light fa-address-book\"></i>\n <span>No contacts found</span>\n </div>\n } @else {\n @for (contact of filteredContacts(); track contact.id) {\n <div\n class=\"contact-item\"\n [class.selected]=\"selectedContact()?.id === contact.id\"\n (click)=\"selectContact(contact)\"\n >\n <div class=\"contact-avatar\">\n @if (contact.avatar) {\n <img [src]=\"contact.avatar\" [alt]=\"contact.name\" />\n } @else {\n <div class=\"avatar-placeholder\">\n {{ getInitials(contact.name) }}\n </div>\n }\n </div>\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{ contact.name }}</div>\n <div class=\"contact-phone\">{{ contact?.phoneNumber }}</div>\n </div>\n @if (selectedContact()?.id === contact.id) {\n <i class=\"fa-light fa-check\"></i>\n }\n </div>\n }\n }\n </div>\n </div>\n </div>\n\n <!-- Footer Actions -->\n <ax-picker-footer\n [sendText]=\"'Send Contact'\"\n [sendDisabled]=\"!canSend()\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendContact()\"\n />\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .contact-picker {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n border-radius: 0.5rem;\n overflow: hidden;\n max-height: 450px;\n }\n\n .picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border));\n background: rgb(var(--ax-sys-color-surface));\n }\n\n .picker-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: none;\n background: transparent;\n border-radius: 0.25rem;\n cursor: pointer;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n transition: all 0.2s;\n font-size: 1.125rem;\n }\n\n .close-button:hover {\n background: rgb(var(--ax-sys-color-error) / 0.1);\n color: rgb(var(--ax-sys-color-error));\n }\n\n .picker-content {\n flex: 1;\n overflow-y: auto;\n padding: 0.75rem;\n }\n\n .content-grid {\n display: grid;\n grid-template-columns: 1fr auto 1fr;\n gap: 1rem;\n height: 100%;\n }\n\n @media (max-width: 768px) {\n .content-grid {\n grid-template-columns: 1fr;\n gap: 0;\n }\n\n .divider-vertical {\n display: none;\n }\n\n .manual-entry {\n border-bottom: 1px solid rgb(var(--ax-sys-color-border));\n padding-bottom: 1rem;\n margin-bottom: 1rem;\n }\n }\n\n .section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n gap: 0.5rem;\n }\n\n .section-title {\n margin: 0;\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .section-title::before {\n content: '';\n width: 3px;\n height: 1rem;\n background: rgb(var(--ax-sys-color-primary));\n border-radius: 2px;\n }\n\n .manual-entry {\n display: flex;\n flex-direction: column;\n }\n\n .form-fields {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .form-field {\n margin-bottom: 0.75rem;\n }\n\n .form-field ax-label {\n display: block;\n margin-bottom: 0.5rem;\n }\n\n .divider-vertical {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n position: relative;\n }\n\n .divider-vertical::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n background: rgb(var(--ax-sys-color-border));\n transform: translateX(-50%);\n }\n\n .divider-text {\n position: relative;\n z-index: 1;\n padding: 0.5rem;\n background: rgb(var(--ax-sys-color-lightest-surface));\n color: rgb(var(--ax-sys-color-on-surface-variant));\n font-size: 0.75rem;\n font-weight: 600;\n border-radius: 0.25rem;\n }\n\n .contact-list-section {\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .search-box {\n margin-bottom: 0.75rem;\n }\n\n .contact-list {\n flex: 1;\n overflow-y: auto;\n border: 1px solid rgb(var(--ax-sys-color-border));\n border-radius: 0.5rem;\n background: rgb(var(--ax-sys-color-surface));\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 2rem 1rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n gap: 0.5rem;\n }\n\n .empty-state i {\n font-size: 1.75rem;\n }\n\n .contact-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem;\n cursor: pointer;\n transition: all 0.2s;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border));\n }\n\n .contact-item:last-child {\n border-bottom: none;\n }\n\n .contact-item:hover {\n background: rgb(var(--ax-sys-color-surface-variant));\n // transform: translateX(2px);\n }\n\n .contact-item.selected {\n background: rgb(var(--ax-sys-color-primary) / 0.1);\n border-left: 3px solid rgb(var(--ax-sys-color-primary));\n padding-left: calc(0.75rem - 3px);\n }\n\n .contact-avatar {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .contact-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .avatar-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: rgb(var(--ax-sys-color-primary));\n color: rgb(var(--ax-sys-color-on-primary));\n font-weight: 600;\n font-size: 0.875rem;\n }\n\n .contact-info {\n flex: 1;\n }\n\n .contact-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n margin-bottom: 0.25rem;\n }\n\n .contact-phone {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .contact-item i {\n color: rgb(var(--ax-sys-color-primary));\n }\n\n .picker-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n border-top: 1px solid rgb(var(--ax-sys-color-border));\n background: rgb(var(--ax-sys-color-surface));\n }\n `,\n ],\n})\nexport class AXContactPickerComponent {\n private readonly composerService = inject(AXComposerService);\n private readonly conversationService = inject(AXConversationService);\n\n readonly conversation = input.required<AXConversation>();\n readonly onClose = output<void>();\n\n // Manual entry fields\n contactName = '';\n contactPhone = '';\n contactEmail = '';\n\n // Contact list\n readonly searchQuery = signal('');\n readonly selectedContact = signal<AXContactPayload | null>(null);\n\n // Contacts list (populated from device or API)\n readonly allContacts = signal<AXContactPayload[]>([]);\n\n readonly filteredContacts = computed(() => {\n const query = this.searchQuery().toLowerCase();\n if (!query) return this.allContacts();\n\n return this.allContacts().filter(\n (contact) =>\n contact.name.toLowerCase().includes(query) ||\n contact.phoneNumber?.includes(query) ||\n contact.email?.toLowerCase().includes(query),\n );\n });\n\n readonly canSend = computed(() => {\n // Can send if either manual entry is filled or a contact is selected\n const hasManualEntry = this.contactName.trim() && this.contactPhone.trim();\n const hasSelectedContact = this.selectedContact() !== null;\n return hasManualEntry || hasSelectedContact;\n });\n\n selectContact(contact: AXContactPayload): void {\n this.selectedContact.set(contact);\n // Clear manual entry when selecting from list\n this.contactName = '';\n this.contactPhone = '';\n this.contactEmail = '';\n }\n\n async sendContact(): Promise<void> {\n let contactData: AXContactPayload;\n\n const selected = this.selectedContact();\n if (selected) {\n contactData = selected;\n } else {\n contactData = {\n type: 'contact',\n id: `temp-${Date.now()}`,\n name: this.contactName,\n phoneNumber: this.contactPhone,\n email: this.contactEmail || undefined,\n };\n }\n\n const command: AXSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'contact',\n payload: contactData,\n };\n\n await this.conversationService.sendMessage(command);\n this.cancel();\n }\n\n cancel(): void {\n this.contactName = '';\n this.contactPhone = '';\n this.contactEmail = '';\n this.selectedContact.set(null);\n this.searchQuery.set('');\n this.composerService.hideComponent();\n }\n\n getInitials(name: string): string {\n return name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n }\n\n /** Check if Contact Picker API is supported */\n isContactPickerSupported(): boolean {\n return typeof navigator !== 'undefined' && 'contacts' in navigator && 'ContactsManager' in window;\n }\n\n /** Open device contacts using Contact Picker API */\n async openDeviceContacts(): Promise<void> {\n if (!this.isContactPickerSupported()) {\n console.warn('Contact Picker API is not supported in this browser');\n return;\n }\n\n try {\n const props = ['name', 'tel', 'email'];\n const opts = { multiple: true };\n\n // @ts-expect-error - Contact Picker API types may not be available\n const contacts = await navigator.contacts.select(props, opts);\n\n // Convert native contacts to our format\n const convertedContacts: AXContactPayload[] = contacts.map((contact: any, index: number) => ({\n type: 'contact' as const,\n id: `device-${Date.now()}-${index}`,\n name: contact.name?.[0] || 'Unknown',\n phoneNumber: contact.tel?.[0] || '',\n email: contact.email?.[0],\n }));\n\n // Add to existing contacts (avoid duplicates)\n const existingContacts = this.allContacts();\n const newContacts = convertedContacts.filter(\n (newContact) =>\n !existingContacts.some(\n (existing) => existing.phoneNumber === newContact.phoneNumber || existing.name === newContact.name,\n ),\n );\n\n this.allContacts.set([...existingContacts, ...newContacts]);\n } catch (error) {\n // User cancelled or error occurred\n if ((error as Error).name !== 'AbortError') {\n console.error('Failed to access contacts:', error);\n }\n }\n }\n}\n","/**\n * File Picker Component\n * General-purpose file attachment interface for the composer\n */\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { CommonModule } from '@angular/common';\nimport { Component, ElementRef, inject, input, signal, viewChild } from '@angular/core';\nimport { AXComposerService } from '../../../../components';\nimport { AXConversation, AXSendMessageCommand } from '../../../../models';\nimport { AXConversationService } from '../../../../services';\nimport { AXMessageApi } from '../../../../services/api';\nimport { AXFileUploadService } from '../../../../services/file-upload.service';\nimport { AXPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXPickerHeaderComponent } from '../picker-header/picker-header.component';\n\ninterface AttachedFile {\n file: File;\n preview?: string;\n type: 'image' | 'video' | 'audio' | 'file';\n uploadProgress?: number;\n uploading?: boolean;\n uploaded?: boolean;\n uploadedUrl?: string;\n error?: string;\n}\n\n@Component({\n selector: 'ax-conversation-file-picker',\n imports: [CommonModule, AXButtonModule, AXDecoratorModule, AXProgressBarModule, AXPickerHeaderComponent, AXPickerFooterComponent],\n template: `\n <div class=\"file-picker\">\n <ax-picker-header [title]=\"'Attach Files'\" (onClose)=\"cancel()\" />\n\n <!-- Content -->\n <div class=\"picker-content\">\n @if (files().length === 0) {\n <!-- Empty State -->\n <div\n class=\"picker-empty\"\n [class.drag-over]=\"isDragging()\"\n (click)=\"triggerFileInput()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div class=\"empty-icon\">\n <i class=\"fa-light\" [class.fa-paperclip]=\"!isDragging()\" [class.fa-cloud-arrow-up]=\"isDragging()\"></i>\n </div>\n <div class=\"empty-text\">\n <div class=\"empty-title\">{{ isDragging() ? 'Drop files here' : 'Select files' }}</div>\n <div class=\"empty-subtitle\">{{ isDragging() ? 'Release to upload' : 'or click to browse' }}</div>\n </div>\n </div>\n } @else {\n <!-- Files List -->\n <div class=\"picker-body\">\n <div class=\"body-header\">\n <span class=\"item-count\">{{ files().length }} file(s) selected</span>\n <ax-button text=\"Add More\" [look]=\"'ghost'\" (onClick)=\"triggerFileInput()\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-plus\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n\n <div class=\"files-list\">\n @for (file of files(); track $index) {\n <div class=\"file-item\">\n <div class=\"file-icon\">\n @if (file.type === 'image' && file.preview) {\n <img [src]=\"file.preview\" [alt]=\"file.file.name\" />\n } @else if (file.type === 'image') {\n <i class=\"fa-light fa-image\"></i>\n } @else if (file.type === 'video') {\n <i class=\"fa-light fa-video\"></i>\n } @else if (file.type === 'audio') {\n <i class=\"fa-light fa-music\"></i>\n } @else {\n <i class=\"fa-light fa-file\"></i>\n }\n </div>\n <div class=\"file-info\">\n <div class=\"file-name\">{{ file.file.name }}</div>\n <div class=\"file-size\">\n @if (file.uploading) {\n <span>Uploading... {{ file.uploadProgress }}%</span>\n } @else if (file.uploaded) {\n <span class=\"upload-success\">✓ Uploaded</span>\n } @else if (file.error) {\n <span class=\"upload-error\">✗ {{ file.error }}</span>\n } @else {\n <span>{{ formatFileSize(file.file.size) }}</span>\n }\n </div>\n @if (file.uploading || file.uploaded) {\n <div class=\"progress-container\">\n <ax-progress-bar\n [progress]=\"file.uploadProgress || 0\"\n [mode]=\"file.uploading ? 'determinate' : 'determinate'\"\n [height]=\"4\"\n />\n </div>\n }\n </div>\n @if (!file.uploading && !file.uploaded) {\n <button type=\"button\" class=\"remove-button\" (click)=\"removeFile($index)\" aria-label=\"Remove\">\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Footer -->\n @if (files().length > 0) {\n <ax-picker-footer \n [sendText]=\"getSendButtonText()\" \n [sendDisabled]=\"!canSend()\"\n (onCancel)=\"cancel()\" \n (onSend)=\"sendFiles()\" \n />\n }\n\n <!-- Hidden File Input -->\n <input\n #fileInput\n type=\"file\"\n accept=\"*/*\"\n multiple\n style=\"display: none;\"\n (change)=\"onFileInputChange($event)\"\n />\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .file-picker {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n border-radius: 0.5rem;\n overflow: hidden;\n max-height: 450px;\n }\n\n .picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border));\n background: rgb(var(--ax-sys-color-surface));\n }\n\n .picker-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: none;\n background: transparent;\n border-radius: 0.25rem;\n cursor: pointer;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n transition: all 0.2s;\n font-size: 1.125rem;\n }\n\n .close-button:hover {\n background: rgb(var(--ax-sys-color-error) / 0.1);\n color: rgb(var(--ax-sys-color-error));\n }\n\n .picker-content {\n flex: 1;\n overflow-y: auto;\n }\n\n .picker-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 0.25rem;\n min-height: 160px;\n cursor: pointer;\n border: 2px dashed rgb(var(--ax-sys-color-border));\n border-radius: 0.5rem;\n margin: 0.75rem;\n transition: all 0.2s;\n }\n\n .picker-empty:hover,\n .picker-empty.drag-over {\n border-color: rgb(var(--ax-sys-color-primary));\n background: rgb(var(--ax-sys-color-primary) / 0.05);\n }\n\n .empty-icon {\n font-size: 2.5rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n margin-bottom: 0.75rem;\n }\n\n .empty-text {\n text-align: center;\n }\n\n .empty-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n margin-bottom: 0.25rem;\n }\n\n .empty-subtitle {\n font-size: 0.8125rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .picker-body {\n padding: 0.75rem;\n }\n\n .body-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 0.75rem;\n }\n\n .item-count {\n font-size: 0.8125rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .files-list {\n display: flex;\n flex-direction: column;\n gap: 0.625rem;\n }\n\n .file-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.625rem;\n background: rgb(var(--ax-sys-color-surface));\n border-radius: 0.375rem;\n border: 1px solid rgb(var(--ax-sys-color-border));\n transition: background-color 0.2s;\n }\n\n .file-item:hover {\n background: rgb(var(--ax-sys-color-surface-variant));\n }\n\n .file-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: 0.375rem;\n background: rgb(var(--ax-sys-color-primary) / 0.1);\n color: rgb(var(--ax-sys-color-primary));\n font-size: 1.25rem;\n flex-shrink: 0;\n overflow: hidden;\n }\n\n .file-icon img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .file-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .file-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .file-size {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .progress-container {\n width: 100%;\n margin-top: 0.125rem;\n }\n\n .upload-success {\n color: rgb(var(--ax-sys-color-success));\n font-weight: 500;\n }\n\n .upload-error {\n color: rgb(var(--ax-sys-color-error));\n font-weight: 500;\n }\n\n .remove-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: none;\n background: transparent;\n border-radius: 0.25rem;\n cursor: pointer;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n transition: all 0.2s;\n flex-shrink: 0;\n font-size: 1rem;\n }\n\n .remove-button:hover {\n background: rgb(var(--ax-sys-color-error) / 0.1);\n color: rgb(var(--ax-sys-color-error));\n }\n\n .picker-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n border-top: 1px solid rgb(var(--ax-sys-color-border));\n background: rgb(var(--ax-sys-color-surface));\n }\n `,\n ],\n})\nexport class AXFilePickerComponent {\n private readonly conversationService = inject(AXConversationService);\n private readonly fileUploadService = inject(AXFileUploadService);\n private readonly messageApi = inject(AXMessageApi);\n\n readonly conversation = input.required<AXConversation>();\n readonly service = input<AXComposerService>();\n readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n \n private get composerService(): AXComposerService {\n return this.service() || inject(AXComposerService);\n }\n\n readonly files = signal<AttachedFile[]>([]);\n readonly isDragging = signal(false);\n readonly isUploading = signal(false);\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n async handleFiles(fileList: File[]): Promise<void> {\n for (const file of fileList) {\n try {\n const fileType = this.fileUploadService.getFileType(file);\n let preview: string | undefined;\n\n // Generate preview for images\n if (fileType === 'image') {\n preview = await this.fileUploadService.readFileAsDataURL(file);\n }\n\n // Add file to list\n const fileIndex = this.files().length;\n this.files.update((files) => [...files, { file, preview, type: fileType, uploadProgress: 0, uploading: true }]);\n\n // Start upload immediately\n this.uploadFile(fileIndex, file);\n } catch (error) {\n console.error('Failed to process file:', error);\n }\n }\n }\n\n private async uploadFile(index: number, file: File): Promise<void> {\n try {\n // Upload using API with progress tracking\n const result = await this.uploadFileWithProgress(file, (progress) => {\n this.updateFileProgress(index, progress, true);\n });\n\n // Mark as uploaded\n this.updateFileProgress(index, 100, false, true, result.url);\n } catch (error) {\n console.error('Failed to upload file:', error);\n this.updateFileProgress(index, 0, false, false, undefined, 'Upload failed');\n }\n }\n\n onFileInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const fileList = Array.from(input.files || []);\n if (fileList.length > 0) {\n this.handleFiles(fileList);\n }\n input.value = '';\n }\n\n removeFile(index: number): void {\n this.files.update((files) => files.filter((_, i) => i !== index));\n }\n\n onDragEnter(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(true);\n }\n\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(false);\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(false);\n\n const fileList = Array.from(event.dataTransfer?.files || []);\n if (fileList.length > 0) {\n this.handleFiles(fileList);\n }\n }\n\n async sendFiles(): Promise<void> {\n const fileList = this.files();\n if (fileList.length === 0) return;\n\n // Check if all files are uploaded\n const allUploaded = fileList.every(f => f.uploaded && !f.error);\n if (!allUploaded) {\n console.warn('Some files are still uploading or failed');\n return;\n }\n\n // Send messages for all uploaded files\n for (const attachedFile of fileList) {\n if (!attachedFile.uploadedUrl) continue;\n\n const command: AXSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'file',\n payload: {\n type: 'file',\n url: attachedFile.uploadedUrl,\n name: attachedFile.file.name,\n size: attachedFile.file.size,\n mimeType: attachedFile.file.type,\n },\n };\n\n await this.conversationService.sendMessage(command);\n }\n\n this.cancel();\n }\n\n private updateFileProgress(\n index: number,\n progress: number,\n uploading: boolean,\n uploaded = false,\n uploadedUrl?: string,\n error?: string\n ): void {\n this.files.update((files) => {\n const updated = [...files];\n updated[index] = {\n ...updated[index],\n uploadProgress: progress,\n uploading,\n uploaded,\n uploadedUrl,\n error,\n };\n return updated;\n });\n }\n\n private async uploadFileWithProgress(\n file: File,\n onProgress: (progress: number) => void\n ): Promise<{ url: string; thumbnailUrl?: string; size: number; mimeType: string }> {\n // Use the API's uploadFile method\n // Note: The abstract API doesn't support progress callbacks yet\n // We simulate progress until the API implementation is updated\n \n // Simulate progress during upload\n let simulatedProgress = 0;\n const progressInterval = setInterval(() => {\n if (simulatedProgress < 90) {\n simulatedProgress += 10;\n onProgress(simulatedProgress);\n }\n }, 100);\n\n try {\n // Call the actual API method\n const result = await this.messageApi.uploadFile(file, this.conversation().id);\n \n // Complete progress\n clearInterval(progressInterval);\n onProgress(100);\n \n return result;\n } catch (error) {\n clearInterval(progressInterval);\n throw error;\n }\n }\n\n cancel(): void {\n this.files.set([]);\n this.composerService.hideComponent();\n }\n\n formatFileSize(bytes: number): string {\n return this.fileUploadService.formatFileSize(bytes);\n }\n\n canSend(): boolean {\n const fileList = this.files();\n if (fileList.length === 0) return false;\n \n // Can send if all files are uploaded and no errors\n return fileList.every(f => f.uploaded && !f.error && !f.uploading);\n }\n\n getSendButtonText(): string {\n const fileList = this.files();\n const uploadingCount = fileList.filter(f => f.uploading).length;\n const uploadedCount = fileList.filter(f => f.uploaded).length;\n \n if (uploadingCount > 0) {\n return `Uploading ${uploadingCount} file(s)...`;\n }\n \n if (uploadedCount === fileList.length) {\n return `Send ${fileList.length} File(s)`;\n }\n \n return `${uploadedCount}/${fileList.length} Ready`;\n }\n}\n","/**\n * Image Picker Component\n * Full-width image selection and preview interface for the composer\n */\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { CommonModule } from '@angular/common';\nimport { Component, ElementRef, inject, input, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXComposerService } from '../../../../components';\nimport { AXConversation, AXSendMessageCommand } from '../../../../models';\nimport { AXConversationService } from '../../../../services';\nimport { AXFileUploadService } from '../../../../services/file-upload.service';\nimport { AXPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXPickerHeaderComponent } from '../picker-header/picker-header.component';\n\ninterface ImageFile {\n file: File;\n preview: string;\n}\n\n@Component({\n selector: 'ax-conversation-image-picker',\n imports: [\n CommonModule,\n AXButtonModule,\n AXDecoratorModule,\n AXTextBoxModule,\n FormsModule,\n AXPickerHeaderComponent,\n AXPickerFooterComponent,\n ],\n template: `\n <div class=\"image-picker\">\n <ax-picker-header [title]=\"'Send Images'\" (onClose)=\"cancel()\" />\n\n <!-- Image Selection Area -->\n @if (images().length === 0) {\n <div\n class=\"picker-empty\"\n [class.drag-over]=\"isDragging()\"\n (click)=\"triggerFileInput()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div class=\"empty-icon\">\n <i class=\"fa-light\" [class.fa-image]=\"!isDragging()\" [class.fa-cloud-arrow-up]=\"isDragging()\"></i>\n </div>\n <div class=\"empty-text\">\n <div class=\"empty-title\">{{ isDragging() ? 'Drop images to attach' : 'Select images' }}</div>\n <div class=\"empty-subtitle\">{{ isDragging() ? 'Release to upload' : 'or click to browse' }}</div>\n </div>\n </div>\n } @else {\n <!-- Image Preview Grid -->\n <div class=\"picker-images\">\n <div class=\"images-header\">\n <span class=\"images-count\">{{ images().length }} image(s) selected</span>\n <ax-button text=\"Add More\" [look]=\"'ghost'\" (onClick)=\"triggerFileInput()\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-plus\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n\n <div class=\"images-grid\">\n @for (image of images(); track $index) {\n <div class=\"image-item\">\n <div class=\"image-preview\">\n <img [src]=\"image.preview\" [alt]=\"image.file.name\" />\n <button type=\"button\" class=\"remove-button\" (click)=\"removeImage($index)\" aria-label=\"Remove\">\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n <div class=\"image-info\">\n <span class=\"image-name\">{{ image.file.name }}</span>\n <span class=\"image-size\">{{ formatFileSize(image.file.size) }}</span>\n </div>\n </div>\n }\n </div>\n\n <!-- Caption Input -->\n <div class=\"caption-input\">\n <ax-text-box [(value)]=\"caption\" [placeholder]=\"'Add a caption (optional)'\" />\n </div>\n </div>\n }\n\n <!-- Footer Actions -->\n @if (images().length > 0) {\n <ax-picker-footer \n [sendText]=\"'Send ' + images().length + ' Image(s)'\" \n (onCancel)=\"cancel()\" \n (onSend)=\"sendImages()\" \n />\n }\n\n <!-- Hidden File Input -->\n <input\n #fileInput\n type=\"file\"\n accept=\"image/*\"\n multiple\n style=\"display: none;\"\n (change)=\"onFileInputChange($event)\"\n />\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .image-picker {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border));\n background: rgb(var(--ax-sys-color-surface));\n }\n\n .picker-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: none;\n background: transparent;\n border-radius: 0.25rem;\n cursor: pointer;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n transition: all 0.2s;\n font-size: 1.125rem;\n }\n\n .close-button:hover {\n background: rgb(var(--ax-sys-color-error) / 0.1);\n color: rgb(var(--ax-sys-color-error));\n }\n\n .picker-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 0.25rem;\n max-height: 450px;\n cursor: pointer;\n border: 2px dashed rgb(var(--ax-sys-color-border));\n border-radius: 0.5rem;\n margin: 0.75rem;\n transition: all 0.2s;\n }\n\n .picker-empty:hover,\n .picker-empty.drag-over {\n border-color: rgb(var(--ax-sys-color-primary));\n background: rgb(var(--ax-sys-color-primary) / 0.05);\n }\n\n .empty-icon {\n font-size: 2.5rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n margin-bottom: 0.75rem;\n }\n\n .empty-text {\n text-align: center;\n }\n\n .empty-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n margin-bottom: 0.25rem;\n }\n\n .empty-subtitle {\n font-size: 0.8125rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .picker-images {\n padding: 0.75rem;\n }\n\n .images-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 0.75rem;\n }\n\n .images-count {\n font-size: 0.8125rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .images-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));\n gap: 0.5rem;\n margin-bottom: 0.75rem;\n }\n\n .image-item {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .image-preview {\n position: relative;\n aspect-ratio: 1;\n border-radius: 0.375rem;\n overflow: hidden;\n background: rgb(var(--ax-sys-color-surface-variant));\n border: 1px solid rgb(var(--ax-sys-color-border));\n }\n\n .image-preview img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .remove-button {\n position: absolute;\n top: 0.25rem;\n right: 0.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.25rem;\n height: 1.25rem;\n border: none;\n background: rgb(var(--ax-sys-color-error));\n color: rgb(var(--ax-sys-color-on-error));\n border-radius: 50%;\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.2s;\n font-size: 0.75rem;\n box-shadow: 0 2px 4px rgb(0 0 0 / 0.2);\n }\n\n .image-item:hover .remove-button {\n opacity: 1;\n }\n\n .image-info {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .image-name {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .image-size {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .caption-input {\n margin-top: 0.75rem;\n }\n\n .picker-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n border-top: 1px solid rgb(var(--ax-sys-color-border));\n background: rgb(var(--ax-sys-color-surface));\n }\n `,\n ],\n})\nexport class AXImagePickerComponent {\n private readonly composerService = inject(AXComposerService);\n private readonly conversationService = inject(AXConversationService);\n private readonly fileUploadService = inject(AXFileUploadService);\n\n readonly conversation = input.required<AXConversation>();\n readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n readonly images = signal<ImageFile[]>([]);\n readonly isDragging = signal(false);\n caption = '';\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n async handleFiles(files: File[]): Promise<void> {\n const imageFiles = this.fileUploadService.filterFilesByType(files, ['image/*']);\n\n for (const file of imageFiles) {\n try {\n const preview = await this.fileUploadService.readFileAsDataURL(file);\n this.images.update((images) => [...images, { file, preview }]);\n } catch (error) {\n console.error('Failed to process image:', error);\n }\n }\n }\n\n onFileInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const files = Array.from(input.files || []);\n if (files.length > 0) {\n this.handleFiles(files);\n }\n input.value = '';\n }\n\n removeImage(index: number): void {\n this.images.update((images) => images.filter((_, i) => i !== index));\n }\n\n onDragEnter(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(true);\n }\n\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(false);\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(false);\n\n const files = Array.from(event.dataTransfer?.files || []);\n if (files.length > 0) {\n this.handleFiles(files);\n }\n }\n\n async sendImages(): Promise<void> {\n const imageList = this.images();\n if (imageList.length === 0) return;\n\n // Send each image as a separate message\n for (const image of imageList) {\n const command: AXSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'image',\n payload: {\n type: 'image',\n url: image.preview, // In real app, upload to server first\n caption: this.caption || undefined,\n width: 0,\n height: 0,\n },\n };\n\n await this.conversationService.sendMessage(command);\n }\n\n this.cancel();\n }\n\n cancel(): void {\n this.images.set([]);\n this.caption = '';\n this.composerService.hideComponent();\n }\n\n formatFileSize(bytes: number): string {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n }\n}\n","/**\n * Location Picker Component\n * Full-width location selection interface for the composer\n */\n\nimport { AXMapMarker, AXMapModule } from '@acorex/components/map';\nimport { CommonModule } from '@angular/common';\nimport { Component, inject, input, output, signal } from '@angular/core';\nimport { AXComposerService } from '../../../../components';\nimport { AXConversation, AXLocationPayload, AXSendMessageCommand } from '../../../../models';\nimport { AXConversationService } from '../../../../services';\nimport { AXPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXPickerHeaderComponent } from '../picker-header/picker-header.component';\n\n@Component({\n selector: 'ax-conversation-location-picker',\n imports: [CommonModule, AXMapModule, AXPickerHeaderComponent, AXPickerFooterComponent],\n template: `\n <div class=\"location-picker\">\n <ax-picker-header [title]=\"'Send Location'\" (onClose)=\"cancel()\" />\n\n <div class=\"picker-content\">\n <!-- Map with Single Marker -->\n <div class=\"map-container\">\n <ax-map\n [latitude]=\"currentLocation().latitude\"\n [longitude]=\"currentLocation().longitude\"\n [maxMarker]=\"1\"\n [addMarkerOnTap]=\"true\"\n [hasLocator]=\"true\"\n (onMarkerAdded)=\"onMarkerAdded($event)\"\n />\n </div>\n\n <!-- Location Info -->\n <div class=\"location-info\">\n <div class=\"info-row\">\n <i class=\"fa-light fa-location-dot\"></i>\n <div class=\"info-text\">\n <div class=\"info-label\">Coordinates</div>\n <div class=\"info-value\">\n {{ currentLocation().latitude.toFixed(6) }}, {{ currentLocation().longitude.toFixed(6) }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <ax-picker-footer\n [sendText]=\"'Send Location'\"\n [sendDisabled]=\"false\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendLocation()\"\n />\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .location-picker {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n border-radius: 0.5rem;\n overflow: hidden;\n height: 400px;\n }\n\n .picker-content {\n flex: 1;\n overflow-y: auto;\n }\n\n .map-container {\n height: 10rem;\n }\n\n .location-info {\n padding: 0.75rem 1rem;\n background: rgb(var(--ax-sys-color-surface));\n border-top: 1px solid rgb(var(--ax-sys-color-border));\n }\n\n .info-row {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n .info-row i {\n font-size: 1.25rem;\n color: rgb(var(--ax-sys-color-primary));\n }\n\n .info-text {\n flex: 1;\n }\n\n .info-label {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n margin-bottom: 0.25rem;\n }\n\n .info-value {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n font-family: monospace;\n }\n `,\n ],\n})\nexport class AXLocationPickerComponent {\n private readonly composerService = inject(AXComposerService);\n private readonly conversationService = inject(AXConversationService);\n\n readonly conversation = input.required<AXConversation>();\n readonly onClose = output<void>();\n\n // Default location\n readonly currentLocation = signal<AXLocationPayload>({\n type: 'location',\n latitude: 30,\n longitude: 50,\n });\n\n onMarkerAdded(event: AXMapMarker): void {\n // Event from ax-map markerAdded\n this.currentLocation.set({\n type: 'location',\n\n latitude: event.latitude,\n longitude: event.longitude,\n });\n }\n\n async sendLocation(): Promise<void> {\n const location = this.currentLocation();\n\n const command: AXSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'location',\n payload: location,\n };\n\n await this.conversationService.sendMessage(command);\n this.cancel();\n }\n\n cancel(): void {\n // Reset to default location\n this.currentLocation.set({\n type: 'location',\n latitude: 0,\n longitude: 0,\n });\n this.composerService.hideComponent();\n }\n}\n","/**\n * Video Picker Component\n * Full-width video selection and preview interface for the composer\n */\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { CommonModule } from '@angular/common';\nimport { Component, ElementRef, inject, input, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXComposerService } from '../../../../components';\nimport { AXConversation, AXSendMessageCommand } from '../../../../models';\nimport { AXConversationService } from '../../../../services';\nimport { AXFileUploadService } from '../../../../services/file-upload.service';\nimport { AXPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXPickerHeaderComponent } from '../picker-header/picker-header.component';\n\ninterface VideoFile {\n file: File;\n preview?: string;\n duration?: number;\n}\n\n@Component({\n selector: 'ax-conversation-video-picker',\n imports: [\n CommonModule,\n AXButtonModule,\n AXDecoratorModule,\n AXTextBoxModule,\n FormsModule,\n AXPickerHeaderComponent,\n AXPickerFooterComponent,\n ],\n template: `\n <div class=\"video-picker\">\n <ax-picker-header [title]=\"'Send Video'\" (onClose)=\"cancel()\" />\n\n <!-- Video Selection Area -->\n @if (videos().length === 0) {\n <div\n class=\"picker-empty\"\n [class.drag-over]=\"isDragging()\"\n (click)=\"triggerFileInput()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div class=\"empty-icon\">\n <i class=\"fa-light\" [class.fa-video]=\"!isDragging()\" [class.fa-cloud-arrow-up]=\"isDragging()\"></i>\n </div>\n <div class=\"empty-text\">\n <div class=\"empty-title\">{{ isDragging() ? 'Drop videos to attach' : 'Select videos' }}</div>\n <div class=\"empty-subtitle\">{{ isDragging() ? 'Release to upload' : 'or click to browse' }}</div>\n </div>\n </div>\n } @else {\n <!-- Video Preview List -->\n <div class=\"picker-videos\">\n <div class=\"videos-header\">\n <span class=\"videos-count\">{{ videos().length }} video(s) selected</span>\n <ax-button text=\"Add More\" [look]=\"'ghost'\" (onClick)=\"triggerFileInput()\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-plus\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n\n <div class=\"videos-list\">\n @for (video of videos(); track $index) {\n <div class=\"video-item\">\n <div class=\"video-preview\">\n @if (video.preview) {\n <video [src]=\"video.preview\" controls></video>\n } @else {\n <div class=\"video-placeholder\">\n <i class=\"fa-light fa-video\"></i>\n </div>\n }\n <button type=\"button\" class=\"remove-button\" (click)=\"removeVideo($index)\" aria-label=\"Remove\">\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n <div class=\"video-info\">\n <span class=\"video-name\">{{ video.file.name }}</span>\n <div class=\"video-meta\">\n <span class=\"video-size\">{{ formatFileSize(video.file.size) }}</span>\n @if (video.duration) {\n <span class=\"video-duration\">{{ formatDuration(video.duration) }}</span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Caption Input -->\n <div class=\"caption-input\">\n <ax-text-box [(value)]=\"caption\" [placeholder]=\"'Add a caption (optional)'\" />\n </div>\n </div>\n }\n\n <!-- Footer Actions -->\n @if (videos().length > 0) {\n <ax-picker-footer \n [sendText]=\"'Send ' + videos().length + ' Video(s)'\" \n (onCancel)=\"cancel()\" \n (onSend)=\"sendVideos()\" \n />\n }\n\n <!-- Hidden File Input -->\n <input\n #fileInput\n type=\"file\"\n accept=\"video/*\"\n multiple\n style=\"display: none;\"\n (change)=\"onFileInputChange($event)\"\n />\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .video-picker {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border));\n background: rgb(var(--ax-sys-color-surface));\n }\n\n .picker-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: none;\n background: transparent;\n border-radius: 0.25rem;\n cursor: pointer;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n transition: all 0.2s;\n font-size: 1.125rem;\n }\n\n .close-button:hover {\n background: rgb(var(--ax-sys-color-error) / 0.1);\n color: rgb(var(--ax-sys-color-error));\n }\n\n .picker-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 0.25rem;\n max-height: 450px;\n cursor: pointer;\n border: 2px dashed rgb(var(--ax-sys-color-border));\n border-radius: 0.5rem;\n margin: 0.75rem;\n transition: all 0.2s;\n }\n\n .picker-empty:hover,\n .picker-empty.drag-over {\n border-color: rgb(var(--ax-sys-color-primary));\n background: rgb(var(--ax-sys-color-primary) / 0.05);\n }\n\n .empty-icon {\n font-size: 2.5rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n margin-bottom: 0.75rem;\n }\n\n .empty-text {\n text-align: center;\n }\n\n .empty-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n margin-bottom: 0.25rem;\n }\n\n .empty-subtitle {\n font-size: 0.8125rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .picker-videos {\n padding: 0.75rem;\n }\n\n .videos-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 0.75rem;\n }\n\n .videos-count {\n font-size: 0.8125rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .videos-list {\n display: flex;\n flex-direction: column;\n gap: 0.625rem;\n margin-bottom: 0.75rem;\n }\n\n .video-item {\n display: flex;\n gap: 0.75rem;\n padding: 0.625rem;\n background: rgb(var(--ax-sys-color-surface));\n border-radius: 0.375rem;\n border: 1px solid rgb(var(--ax-sys-color-border));\n }\n\n .video-preview {\n position: relative;\n width: 120px;\n height: 68px;\n flex-shrink: 0;\n border-radius: 0.375rem;\n overflow: hidden;\n background: rgb(var(--ax-sys-color-surface-variant));\n }\n\n .video-preview video {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .video-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n font-size: 2rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .remove-button {\n position: absolute;\n top: 0.25rem;\n right: 0.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.25rem;\n height: 1.25rem;\n border: none;\n background: rgb(var(--ax-sys-color-error));\n color: rgb(var(--ax-sys-color-on-error));\n border-radius: 50%;\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.2s;\n font-size: 0.75rem;\n box-shadow: 0 2px 4px rgb(0 0 0 / 0.2);\n }\n\n .video-item:hover .remove-button {\n opacity: 1;\n }\n\n .video-info {\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 0.5rem;\n flex: 1;\n }\n\n .video-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .video-meta {\n display: flex;\n gap: 1rem;\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n }\n\n .caption-input {\n margin-top: 0.75rem;\n }\n\n .picker-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n border-top: 1px solid rgb(var(--ax-sys-color-border));\n background: rgb(var(--ax-sys-color-surface));\n }\n `,\n ],\n})\nexport class AXVideoPickerComponent {\n private readonly composerService = inject(AXComposerService);\n private readonly conversationService = inject(AXConversationService);\n private readonly fileUploadService = inject(AXFileUploadService);\n\n readonly conversation = input.required<AXConversation>();\n readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n readonly videos = signal<VideoFile[]>([]);\n readonly isDragging = signal(false);\n caption = '';\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n async handleFiles(files: File[]): Promise<void> {\n const videoFiles = this.fileUploadService.filterFilesByType(files, ['video/*']);\n\n for (const file of videoFiles) {\n try {\n const preview = await this.fileUploadService.readFileAsDataURL(file);\n const duration = await this.fileUploadService.getVideoDuration(file);\n this.videos.update((videos) => [...videos, { file, preview, duration }]);\n } catch (error) {\n console.error('Failed to process video:', error);\n }\n }\n }\n\n onFileInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const files = Array.from(input.files || []);\n if (files.length > 0) {\n this.handleFiles(files);\n }\n input.value = '';\n }\n\n removeVideo(index: number): void {\n this.videos.update((videos) => videos.filter((_, i) => i !== index));\n }\n\n onDragEnter(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(true);\n }\n\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(false);\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(false);\n\n const files = Array.from(event.dataTransfer?.files || []);\n if (files.length > 0) {\n this.handleFiles(files);\n }\n }\n\n async sendVideos(): Promise<void> {\n const videoList = this.videos();\n if (videoList.length === 0) return;\n\n // Send each video as a separate message\n for (const video of videoList) {\n const command: AXSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'video',\n payload: {\n type: 'video',\n url: video.preview || '', // In real app, upload to server first\n caption: this.caption || undefined,\n duration: video.duration || 0,\n thumbnailUrl: video.preview,\n width: 0,\n height: 0,\n size: video.file.size,\n },\n };\n\n await this.conversationService.sendMessage(command);\n }\n\n this.cancel();\n }\n\n cancel(): void {\n this.videos.set([]);\n this.caption = '';\n this.composerService.hideComponent();\n }\n\n formatFileSize(bytes: number): string {\n return this.fileUploadService.formatFileSize(bytes);\n }\n\n formatDuration(seconds: number): string {\n return this.fileUploadService.formatDuration(seconds);\n }\n}\n","/**\n * Voice Recorder Component\n * Full-width voice recording interface for the composer\n */\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, output, signal } from '@angular/core';\nimport { AXComposerService } from '../../../../components';\nimport type { AXConversation, AXSendMessageCommand } from '../../../../models';\nimport { AXMessageApi } from '../../../../services/api';\nimport { AXConversationService } from '../../../../services/conversation.service';\n\n@Component({\n selector: 'ax-conversation-voice-recorder',\n imports: [CommonModule, AXButtonModule, AXDecoratorModule, AXLabelModule],\n template: `\n <div class=\"voice-recorder\">\n <!-- Header with Close Button -->\n <div class=\"recorder-header\">\n <h3 class=\"recorder-title\">Voice Message</h3>\n <button type=\"button\" class=\"close-button\" (click)=\"cancel()\" aria-label=\"Close\">\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"recorder-content\">\n @if (!isRecording()) {\n <!-- Start Recording State -->\n <div class=\"recorder-idle\">\n <button class=\"record-button\" (click)=\"startRecording()\">\n <i class=\"fa-light fa-microphone\"></i>\n </button>\n <span class=\"recorder-hint\">Tap to start recording</span>\n </div>\n } @else {\n <!-- Recording State -->\n <div class=\"recorder-active\">\n <div class=\"recorder-info\">\n <div class=\"recording-indicator\">\n <span class=\"pulse-dot\"></span>\n <span class=\"recording-text\">Recording</span>\n </div>\n <div class=\"recording-time\">{{ formattedTime() }}</div>\n </div>\n\n <div class=\"recorder-actions\">\n <ax-button text=\"Cancel\" [look]=\"'ghost'\" (onClick)=\"cancelRecording()\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-xmark\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n\n <ax-button text=\"Send\" [look]=\"'primary'\" (onClick)=\"stopRecording()\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-paper-plane\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n }\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .voice-recorder {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n }\n\n .recorder-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .recorder-title {\n margin: 0;\n font-size: 0.875rem;\n font-weight: 600;\n }\n\n .close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n font-size: 1rem;\n cursor: pointer;\n transition: all 0.2s;\n opacity: 0.7;\n }\n\n .close-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n opacity: 1;\n }\n\n .recorder-content {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 1rem;\n }\n\n .recorder-idle {\n display: flex;\n align-items: center;\n gap: 1rem;\n width: 100%;\n }\n\n .record-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n border: none;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n border-radius: 50%;\n font-size: 1.5rem;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px rgba(var(--ax-sys-color-primary-500), 0.3);\n }\n\n .record-button:hover {\n background: rgb(var(--ax-sys-color-primary-600));\n // transform: scale(1.05);\n }\n\n .record-button:active {\n // transform: scale(0.95);\n }\n\n .recorder-hint {\n font-size: 0.875rem;\n opacity: 0.7;\n }\n\n .recorder-active {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n gap: 1rem;\n }\n\n .recorder-info {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n flex: 1;\n }\n\n .recording-indicator {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .pulse-dot {\n width: 12px;\n height: 12px;\n background: rgb(var(--ax-sys-color-danger-500));\n border-radius: 50%;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n // transform: scale(1);\n }\n 50% {\n opacity: 0.5;\n // transform: scale(1.2);\n }\n }\n\n .recording-text {\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-danger-500));\n }\n\n .recording-time {\n font-size: 1.25rem;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n min-width: 80px;\n }\n\n .recorder-actions {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n /* Mobile Responsive */\n @media (max-width: 768px) {\n .voice-recorder {\n padding: 0.75rem;\n }\n\n .record-button {\n width: 48px;\n height: 48px;\n font-size: 1.25rem;\n }\n\n .recorder-info {\n gap: 1rem;\n }\n\n .recording-time {\n font-size: 1.125rem;\n font-variant-numeric: tabular-nums;\n }\n\n .recorder-actions {\n gap: 0.5rem;\n }\n }\n\n @media (max-width: 480px) {\n .recorder-hint {\n font-size: 0.8125rem;\n }\n\n .recording-text {\n display: none;\n }\n\n .recording-time {\n font-size: 1rem;\n min-width: 60px;\n font-variant-numeric: tabular-nums;\n }\n }\n `,\n ],\n})\nexport class AXVoiceRecorderComponent {\n private readonly composerService = inject(AXComposerService);\n private readonly conversationService = inject(AXConversationService);\n private readonly messageApi = inject(AXMessageApi);\n\n /** Conversation context */\n readonly conversation = input<AXConversation>();\n\n /** Service reference */\n readonly service = input<AXComposerService>();\n\n /** Recording completed event */\n readonly recordingComplete = output<Blob>();\n\n /** Recording cancelled event */\n readonly recordingCancelled = output<void>();\n\n /** Recording state */\n readonly isRecording = signal(false);\n\n /** Recording start time */\n private recordingStartTime = 0;\n\n /** Recording duration in seconds */\n readonly recordingDuration = signal(0);\n\n /** Timer interval */\n private timerInterval?: number;\n\n /** Media recorder instance */\n private mediaRecorder?: MediaRecorder;\n\n /** Recorded audio chunks */\n private audioChunks: Blob[] = [];\n\n /** Formatted time display */\n readonly formattedTime = computed(() => {\n const duration = this.recordingDuration();\n const minutes = Math.floor(duration / 60);\n const seconds = duration % 60;\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n });\n\n /** Start recording */\n async startRecording(): Promise<void> {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n this.mediaRecorder = new MediaRecorder(stream);\n this.audioChunks = [];\n\n this.mediaRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n this.audioChunks.push(event.data);\n }\n };\n\n this.mediaRecorder.onstop = async () => {\n const audioBlob = new Blob(this.audioChunks, { type: 'audio/webm' });\n this.recordingComplete.emit(audioBlob);\n stream.getTracks().forEach((track) => track.stop());\n\n // Send voice message if we have a conversation\n const conv = this.conversation();\n if (conv && this.audioChunks.length > 0) {\n await this.sendVoiceMessage(audioBlob, conv);\n }\n };\n\n this.mediaRecorder.start();\n this.isRecording.set(true);\n this.recordingStartTime = Date.now();\n this.recordingDuration.set(0);\n\n // Start timer\n this.timerInterval = window.setInterval(() => {\n const elapsed = Math.floor((Date.now() - this.recordingStartTime) / 1000);\n this.recordingDuration.set(elapsed);\n }, 1000);\n } catch (error) {\n console.error('Failed to start recording:', error);\n alert('Could not access microphone. Please check permissions.');\n }\n }\n\n /** Stop recording and send */\n stopRecording(): void {\n if (this.mediaRecorder && this.isRecording()) {\n this.mediaRecorder.stop();\n this.isRecording.set(false);\n this.clearTimer();\n // Close the full-width component\n this.composerService.hideComponent();\n }\n }\n\n /** Cancel recording */\n cancelRecording(): void {\n if (this.mediaRecorder && this.isRecording()) {\n this.mediaRecorder.stop();\n this.isRecording.set(false);\n this.clearTimer();\n this.audioChunks = [];\n this.recordingCancelled.emit();\n // Close the full-width component\n this.composerService.hideComponent();\n }\n }\n\n /** Close the voice recorder */\n cancel(): void {\n // If recording, cancel it first\n if (this.isRecording()) {\n this.cancelRecording();\n } else {\n // Just close the component\n this.composerService.hideComponent();\n }\n }\n\n /** Clear timer */\n private clearTimer(): void {\n if (this.timerInterval) {\n clearInterval(this.timerInterval);\n this.timerInterval = undefined;\n }\n }\n\n /** Send voice message */\n private async sendVoiceMessage(audioBlob: Blob, conversation: AXConversation): Promise<void> {\n try {\n // Convert blob to file\n const audioFile = new File([audioBlob], `voice-${Date.now()}.webm`, { type: 'audio/webm' });\n\n // Upload the audio file first\n const uploadResult = await this.messageApi.uploadFile(audioFile, conversation.id);\n\n // Create voice message command with the uploaded URL\n const command: AXSendMessageCommand = {\n conversationId: conversation.id,\n type: 'voice',\n payload: {\n type: 'voice',\n url: uploadResult.url,\n duration: this.recordingDuration(),\n size: uploadResult.size,\n mimeType: uploadResult.mimeType,\n },\n };\n\n // Send message\n await this.conversationService.sendMessage(command);\n } catch (error) {\n console.error('Failed to send voice message:', error);\n alert('Failed to send voice message. Please try again.');\n }\n }\n}\n","/**\n * Composer Actions Plugin\n * Individual composer action constants\n *\n * Priority Standard (lower number = higher priority):\n * - 10: Emoji (most common)\n * - 20: File attachment (common)\n * - 30: Voice recording (common)\n * - 40: Image (media)\n * - 50: Video (media)\n * - 60: Audio (media)\n * - 70: Contact (special)\n * - 80: Location (special)\n */\n\nimport { AXComposerAction } from '../../../registries';\nimport {\n AXAudioPickerComponent,\n AXContactPickerComponent,\n AXFilePickerComponent,\n AXImagePickerComponent,\n AXLocationPickerComponent,\n AXVideoPickerComponent,\n AXVoiceRecorderComponent,\n} from '../components';\n\n/**\n * Emoji & Stickers picker action\n */\nexport const AX_CONVERSATION_COMPOSER_EMOJI_ACTION: AXComposerAction = {\n id: 'emoji',\n label: 'Emoji & Stickers',\n icon: 'fa-light fa-face-smile',\n position: 'left',\n priority: 10,\n visible: () => true,\n handler: async () => {\n // This will be handled by the composer component's popup\n },\n tooltip: 'Emoji & Stickers',\n};\n\n/**\n * Image picker action\n */\nexport const AX_CONVERSATION_COMPOSER_IMAGE_ACTION: AXComposerAction = {\n id: 'image',\n label: 'Image',\n icon: 'fa-light fa-image',\n position: 'right',\n location: 'menu',\n priority: 40,\n component: AXImagePickerComponent,\n toggleable: true,\n visible: (context) => {\n return !context.draftText?.trim() && !context.isEditing;\n },\n tooltip: 'Send image',\n};\n\n/**\n * Video picker action\n */\nexport const AX_CONVERSATION_COMPOSER_VIDEO_ACTION: AXComposerAction = {\n id: 'video',\n label: 'Video',\n icon: 'fa-light fa-video',\n position: 'right',\n location: 'menu',\n priority: 50,\n component: AXVideoPickerComponent,\n toggleable: true,\n visible: (context) => {\n return !context.draftText?.trim() && !context.isEditing;\n },\n tooltip: 'Send video',\n};\n\n/**\n * File picker action\n */\nexport const AX_CONVERSATION_COMPOSER_FILE_ACTION: AXComposerAction = {\n id: 'file',\n label: 'File',\n icon: 'fa-light fa-paperclip',\n position: 'right',\n // location: 'menu',\n priority: 20,\n component: AXFilePickerComponent,\n toggleable: true,\n visible: (context) => {\n return !context.draftText?.trim() && !context.isEditing;\n },\n tooltip: 'Attach file',\n};\n\n/**\n * Voice recording action\n */\nexport const AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION: AXComposerAction = {\n id: 'voice-recording',\n label: 'Voice message',\n icon: 'fa-light fa-microphone',\n position: 'right',\n // location: 'menu',\n priority: 30,\n component: AXVoiceRecorderComponent,\n toggleable: true,\n visible: (context) => {\n return !context.draftText?.trim() && !context.isEditing;\n },\n tooltip: 'Record voice message',\n};\n\n/**\n * Audio file picker action\n */\nexport const AX_CONVERSATION_COMPOSER_AUDIO_ACTION: AXComposerAction = {\n id: 'audio',\n label: 'Audio',\n icon: 'fa-light fa-music',\n position: 'right',\n location: 'menu',\n priority: 60,\n component: AXAudioPickerComponent,\n toggleable: true,\n visible: (context) => {\n return !context.draftText?.trim() && !context.isEditing;\n },\n tooltip: 'Send audio file',\n};\n\n/**\n * Contact picker action\n */\nexport const AX_CONVERSATION_COMPOSER_CONTACT_ACTION: AXComposerAction = {\n id: 'contact',\n label: 'Contact',\n icon: 'fa-light fa-address-book',\n position: 'right',\n location: 'menu',\n priority: 70,\n component: AXContactPickerComponent,\n toggleable: true,\n visible: (context) => {\n return !context.draftText?.trim() && !context.isEditing;\n },\n tooltip: 'Send contact',\n};\n\n/**\n * Location picker action\n */\nexport const AX_CONVERSATION_COMPOSER_LOCATION_ACTION: AXComposerAction = {\n id: 'location',\n label: 'Location',\n icon: 'fa-light fa-location-dot',\n position: 'right',\n location: 'menu',\n priority: 80,\n component: AXLocationPickerComponent,\n toggleable: true,\n visible: (context) => {\n return !context.draftText?.trim() && !context.isEditing;\n },\n tooltip: 'Send location',\n};\n","/**\n * Avatar Picker Component\n * Allows selecting an avatar via file upload with preview\n */\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { CommonModule } from '@angular/common';\nimport { Component, ElementRef, input, model, output, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'ax-avatar-picker',\n imports: [CommonModule, FormsModule, AXButtonModule, AXDecoratorModule, AXImageComponent],\n template: `\n <div class=\"avatar-picker\">\n <!-- Preview -->\n <div class=\"avatar-preview\" (click)=\"triggerFileInput()\">\n @if (avatarUrl()) {\n <ax-image [src]=\"avatarUrl()\" [alt]=\"'Avatar preview'\"></ax-image>\n <div class=\"preview-overlay\">\n <i class=\"fa-light fa-camera\"></i>\n </div>\n } @else {\n <div class=\"avatar-placeholder\">\n <i class=\"fa-light fa-camera\"></i>\n <span class=\"placeholder-text\">Choose Image</span>\n </div>\n }\n </div>\n\n <!-- Action Buttons -->\n <div class=\"avatar-actions\">\n <ax-button\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [text]=\"avatarUrl() ? 'Change Image' : 'Upload Image'\"\n (onClick)=\"triggerFileInput()\"\n >\n <ax-prefix>\n <ax-icon><i [class]=\"avatarUrl() ? 'fa-light fa-image' : 'fa-light fa-upload'\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n @if (showClearButton() && avatarUrl()) {\n <ax-button [look]=\"'outline'\" [color]=\"'danger'\" [text]=\"'Remove Image'\" (onClick)=\"clearAvatar()\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-trash-can\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n </div>\n\n <!-- Hidden File Input -->\n <input #fileInput type=\"file\" accept=\"image/*\" style=\"display: none;\" (change)=\"onFileInputChange($event)\" />\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .avatar-picker {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 1.5rem;\n padding: 1rem;\n border-radius: 0.75rem;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .avatar-preview {\n position: relative;\n width: 100px;\n height: 100px;\n border-radius: 50%;\n overflow: hidden;\n background: rgb(var(--ax-sys-color-surface));\n border: 3px solid rgb(var(--ax-sys-color-border-light-surface));\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.25s ease;\n flex-shrink: 0;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n .avatar-preview:hover {\n border-color: rgb(var(--ax-sys-color-primary-500));\n // transform: scale(1.05);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n }\n\n .avatar-preview:hover .preview-overlay {\n opacity: 1;\n }\n\n .avatar-preview ax-image {\n width: 100%;\n height: 100%;\n }\n\n .preview-overlay {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.65);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.25s ease;\n color: white;\n font-size: 1.75rem;\n }\n\n .avatar-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.375rem;\n font-size: 2rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n text-align: center;\n padding: 0.5rem;\n }\n\n .placeholder-text {\n font-size: 0.625rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n opacity: 0.8;\n }\n\n .avatar-actions {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n flex: 1;\n }\n\n .avatar-actions ax-button {\n width: 100%;\n }\n `,\n ],\n})\nexport class AXAvatarPickerComponent {\n readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n // Inputs\n readonly showClearButton = input<boolean>(true);\n\n // Two-way binding for avatar URL\n readonly avatarUrl = model<string>('');\n\n // Output for file selection (returns data URL)\n readonly onFileSelected = output<string>();\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n async onFileInputChange(event: Event): Promise<void> {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n\n if (file && file.type.startsWith('image/')) {\n try {\n const reader = new FileReader();\n reader.onload = (e) => {\n const dataUrl = e.target?.result as string;\n this.avatarUrl.set(dataUrl);\n this.onFileSelected.emit(dataUrl);\n };\n reader.readAsDataURL(file);\n } catch (error) {\n console.error('Failed to read file:', error);\n }\n }\n\n // Reset input\n input.value = '';\n }\n\n clearAvatar(): void {\n this.avatarUrl.set('');\n }\n}\n","export class AXConversationDateUtilsService {\n /**\n * Format relative time (e.g., \"2m ago\", \"1h ago\")\n */\n static formatRelativeTime(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n\n if (seconds < 60) return 'just now';\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;\n if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago`;\n\n return date.toLocaleDateString();\n }\n\n /**\n * Format date label (Today, Yesterday, or date)\n */\n static formatDateLabel(date: Date): string {\n const today = new Date();\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n if (AXConversationDateUtilsService.isSameDay(date, today)) return 'Today';\n if (AXConversationDateUtilsService.isSameDay(date, yesterday)) return 'Yesterday';\n\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n }\n\n /**\n * Check if two dates are the same day\n */\n static isSameDay(date1: Date, date2: Date): boolean {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n }\n\n /**\n * Get date key for grouping (YYYY-MM-DD)\n */\n static getDateKey(date: Date): string {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n }\n\n /**\n * Format time (HH:MM)\n */\n static formatTime(date: Date): string {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n }\n}\n","import type { AXConversation } from '../models/conversation.model';\nimport type { AXMessagePayload, AXTextPayload } from '../models/message-payloads.model';\nimport type { AXMessage } from '../models/message.model';\n\nexport class AXConversationMessageUtilsService {\n /**\n * Get sender name from message\n */\n static getSenderName(message: AXMessage, conversation: AXConversation): string {\n const participant = conversation.participants.find((p) => p.id === message.senderId);\n return participant?.name || 'Unknown';\n }\n\n /**\n * Get sender avatar\n */\n static getSenderAvatar(message: AXMessage, conversation: AXConversation): string | undefined {\n const participant = conversation.participants.find((p) => p.id === message.senderId);\n return participant?.avatar;\n }\n\n /**\n * Get initials from name\n */\n static getInitials(name: string): string {\n if (!name) return '?';\n\n return name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .substring(0, 2);\n }\n\n /**\n * Type guard for text payload\n */\n static isTextPayload(payload: AXMessagePayload): payload is AXTextPayload {\n return 'text' in payload && typeof (payload as AXTextPayload).text === 'string';\n }\n\n /**\n * Get message text content\n */\n static getMessageText(message: AXMessage): string {\n if (message.type === 'text' && AXConversationMessageUtilsService.isTextPayload(message.payload)) {\n return message.payload.text;\n }\n return `[${message.type}]`;\n }\n\n /**\n * Format message preview text\n */\n static getPreviewText(message: AXMessage, maxLength = 50): { value: string; type: string; icon: string } {\n // Handle different message types\n switch (message.type) {\n case 'text': {\n const textPayload = message.payload as { text?: string };\n const text = textPayload.text || '';\n const truncatedText = text.length > maxLength ? text.substring(0, maxLength) + '...' : text;\n return {\n value: truncatedText,\n type: 'text',\n icon: 'fa-light fa-message',\n };\n }\n case 'image': {\n const imagePayload = message.payload as { url?: string };\n return {\n value: imagePayload.url || '',\n type: 'image',\n icon: 'fa-light fa-image',\n };\n }\n case 'video': {\n const videoPayload = message.payload as { url?: string };\n return {\n value: videoPayload.url || '',\n type: 'video',\n icon: 'fa-light fa-video',\n };\n }\n case 'audio':\n case 'voice': {\n const audioPayload = message.payload as { url?: string };\n return {\n value: audioPayload.url || '',\n type: message.type,\n icon: 'fa-light fa-microphone',\n };\n }\n case 'file': {\n const filePayload = message.payload as { name?: string; url?: string };\n return {\n value: filePayload.url || '',\n type: 'file',\n icon: 'fa-light fa-file',\n };\n }\n case 'location': {\n const locationPayload = message.payload as { latitude?: number; longitude?: number };\n return {\n value: locationPayload.latitude && locationPayload.longitude \n ? `${locationPayload.latitude},${locationPayload.longitude}` \n : '',\n type: 'location',\n icon: 'fa-light fa-location-dot',\n };\n }\n case 'sticker': {\n const stickerPayload = message.payload as { url?: string };\n return {\n value: stickerPayload.url || '',\n type: 'sticker',\n icon: 'fa-light fa-face-smile',\n };\n }\n default:\n return {\n value: '',\n type: message.type,\n icon: 'fa-light fa-message',\n };\n }\n }\n\n /**\n * Check if message is from current user\n */\n static isOwnMessage(message: AXMessage, currentUserId: string): boolean {\n return message.senderId === currentUserId;\n }\n\n /**\n * Get message status icon\n */\n static getStatusIcon(message: AXMessage): string {\n switch (message.status) {\n case 'sending':\n return '○';\n case 'sent':\n return '✓';\n case 'delivered':\n return '✓✓';\n case 'read':\n return '✓✓';\n case 'failed':\n return '⚠';\n default:\n return '';\n }\n }\n\n /**\n * Check if message should show avatar\n */\n static shouldShowAvatar(\n message: AXMessage,\n previousMessage: AXMessage | undefined,\n conversation: AXConversation,\n ): boolean {\n // Always show avatar for group conversations\n if (conversation.type === 'group' || conversation.type === 'channel') {\n // Don't show if same sender as previous message within 5 minutes\n if (previousMessage && previousMessage.senderId === message.senderId) {\n const timeDiff = message.timestamp.getTime() - previousMessage.timestamp.getTime();\n return timeDiff > 5 * 60 * 1000; // 5 minutes\n }\n return true;\n }\n\n return false;\n }\n\n /**\n * Group messages by sender for consecutive messages\n */\n static shouldGroupWithPrevious(message: AXMessage, previousMessage: AXMessage | undefined): boolean {\n if (!previousMessage) return false;\n\n // Same sender\n if (message.senderId !== previousMessage.senderId) return false;\n\n // Within 5 minutes\n const timeDiff = message.timestamp.getTime() - previousMessage.timestamp.getTime();\n return timeDiff < 5 * 60 * 1000;\n }\n\n /**\n * Get conversation status for avatar (private conversations only)\n */\n static getConversationStatus(conversation: AXConversation): 'online' | 'offline' | 'away' | undefined {\n if (conversation.type === 'private') {\n return conversation.status.presence;\n }\n return undefined;\n }\n\n /**\n * Get typing indicator text for conversation\n */\n static getTypingText(conversation: AXConversation): string {\n const typingUsers = conversation.status.typingUsers;\n if (typingUsers.length === 0) return '';\n\n if (conversation.type === 'private') {\n return 'typing...';\n }\n\n const firstUser = conversation.participants.find((p) => p.id === typingUsers[0]);\n if (typingUsers.length === 1) {\n return `${firstUser?.name || 'Someone'} is typing...`;\n }\n\n return `${typingUsers.length} people are typing...`;\n }\n\n /**\n * Format last seen time\n */\n static formatLastSeen(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n\n if (seconds < 60) return 'just now';\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;\n if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago`;\n\n return date.toLocaleDateString();\n }\n\n /**\n * Get conversation subtitle (status or member count)\n */\n static getConversationSubtitle(conversation: AXConversation): string {\n if (conversation.status.isTyping) {\n return AXConversationMessageUtilsService.getTypingText(conversation);\n }\n\n switch (conversation.type) {\n case 'private':\n if (conversation.status.presence === 'online') {\n return 'online';\n }\n if (conversation.status.lastSeen) {\n return `last seen ${AXConversationMessageUtilsService.formatLastSeen(conversation.status.lastSeen)}`;\n }\n return 'offline';\n\n case 'group':\n return `${conversation.participants.length} members`;\n\n case 'channel':\n return `${conversation.participants.length} subscribers`;\n\n default:\n return '';\n }\n }\n}\n","/**\n * Conversation Info Panel Component\n * Modern popup panel showing conversation details with tabs\n */\n\nimport { AXClosableComponent, AXComponentCloseEvent } from '@acorex/cdk/common';\nimport { AXAvatarComponent } from '@acorex/components/avatar';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSwitchModule } from '@acorex/components/switch';\nimport { AXTabsModule } from '@acorex/components/tabs';\nimport { AXTextBoxComponent } from '@acorex/components/text-box';\nimport { AXAvatarPickerComponent } from '../../../components/shared/avatar-picker.component';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTooltipModule } from '@acorex/components/tooltip';\nimport { CommonModule } from '@angular/common';\nimport { Component, inject, OnDestroy, OnInit, output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport type { AXConversation } from '../../../models';\nimport { AXConversationService } from '../../../services/conversation.service';\nimport { AXConversationMessageUtilsService } from '../../../utils';\n\n@Component({\n selector: 'ax-conversation-info-panel',\n imports: [\n CommonModule,\n FormsModule,\n AXTabsModule,\n AXButtonModule,\n AXAvatarComponent,\n AXImageComponent,\n AXDecoratorModule,\n AXLabelComponent,\n AXTooltipModule,\n AXSwitchModule,\n AXSearchBoxComponent,\n AXTextBoxComponent,\n AXAvatarPickerComponent,\n ],\n template: `\n @if (conversation) {\n <div class=\"conversation-info-panel\">\n <!-- Header with Avatar and Title -->\n <div class=\"panel-header\">\n <ax-avatar [size]=\"80\">\n @if (conversation.avatar) {\n <ax-image [src]=\"conversation.avatar\" [alt]=\"conversation.title\"></ax-image>\n } @else {\n <ax-label>{{ getInitials(conversation.title) }}</ax-label>\n }\n </ax-avatar>\n <div class=\"conversation-title-container\">\n <h2 class=\"conversation-title\">{{ conversation.title }}</h2>\n <h3>{{ conversation.description }}</h3>\n </div>\n </div>\n\n <!-- Tabs -->\n <ax-tabs (onActiveTabChanged)=\"onTabChange($event)\" [look]=\"'with-line'\">\n <ax-tab-item [text]=\"'About'\" [key]=\"'about'\"></ax-tab-item>\n <ax-tab-item [text]=\"'Members (' + conversation.participants.length + ')'\" [key]=\"'members'\"></ax-tab-item>\n <ax-tab-item [text]=\"'Settings'\" [key]=\"'settings'\"></ax-tab-item>\n </ax-tabs>\n\n <!-- Tab Content -->\n <div class=\"tab-content-wrapper\">\n <!-- About Tab Content -->\n @if (activeTab === 'about') {\n <div class=\"tab-content\">\n <div class=\"about-stats\">\n <div class=\"stat-card\">\n <div class=\"stat-icon\">\n <i class=\"fa-light fa-users\"></i>\n </div>\n <div class=\"stat-content\">\n <span class=\"stat-value\">{{ conversation.participants.length }}</span>\n <span class=\"stat-label\">Members</span>\n </div>\n </div>\n\n @if (conversation.unreadCount > 0) {\n <div class=\"stat-card highlight\">\n <div class=\"stat-icon\">\n <i class=\"fa-light fa-envelope\"></i>\n </div>\n <div class=\"stat-content\">\n <span class=\"stat-value\">{{ conversation.unreadCount }}</span>\n <span class=\"stat-label\">Unread</span>\n </div>\n </div>\n }\n\n <div class=\"stat-card\">\n <div class=\"stat-icon\">\n <i class=\"fa-light fa-tag\"></i>\n </div>\n <div class=\"stat-content\">\n <span class=\"stat-value\">{{ getTypeLabel() }}</span>\n <span class=\"stat-label\">Type</span>\n </div>\n </div>\n </div>\n\n <div class=\"about-timeline\">\n @if (conversation.createdAt) {\n <div class=\"timeline-item\">\n <div class=\"timeline-icon\">\n <i class=\"fa-light fa-calendar-plus\"></i>\n </div>\n <div class=\"timeline-content\">\n <span class=\"timeline-label\">Created</span>\n <span class=\"timeline-value\" [axTooltip]=\"conversation.createdAt | date: 'full'\">\n {{ getFormattedDate(conversation.createdAt) }}\n </span>\n </div>\n </div>\n }\n\n @if (conversation.lastMessageAt) {\n <div class=\"timeline-item\">\n <div class=\"timeline-icon\">\n <i class=\"fa-light fa-clock\"></i>\n </div>\n <div class=\"timeline-content\">\n <span class=\"timeline-label\">Last Activity</span>\n <span class=\"timeline-value\" [axTooltip]=\"conversation.lastMessageAt | date: 'full'\">\n {{ getFormattedDate(conversation.lastMessageAt) }}\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Members Tab Content -->\n @if (activeTab === 'members') {\n <div class=\"tab-content\">\n <!-- Search Box -->\n @if (conversation.participants.length > 5) {\n <div class=\"members-search\">\n <ax-search-box [(ngModel)]=\"memberSearchQuery\" [placeholder]=\"'Search members...'\"></ax-search-box>\n </div>\n }\n\n <div class=\"members-list\">\n @for (participant of filteredMembers; track participant.id) {\n <div class=\"member-card\">\n <ax-avatar [size]=\"40\">\n @if (participant.avatar) {\n <ax-image [src]=\"participant.avatar\" [alt]=\"participant.name\"></ax-image>\n } @else {\n <ax-label>{{ getInitials(participant.name) }}</ax-label>\n }\n </ax-avatar>\n <div class=\"member-details\">\n <span class=\"member-name\">{{ participant.name }}</span>\n <span class=\"member-role\">{{ participant.role || 'member' }}</span>\n </div>\n @if (participant.status) {\n <span\n class=\"status-indicator\"\n [class.online]=\"participant.status === 'online'\"\n [class.away]=\"participant.status === 'away'\"\n [class.offline]=\"participant.status === 'offline'\"\n [axTooltip]=\"participant.status\"\n ></span>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Settings Tab Content -->\n @if (activeTab === 'settings') {\n <div class=\"tab-content\">\n <!-- Edit Group Details -->\n @if (conversation.type !== 'private') {\n <div class=\"edit-group-section\">\n <div class=\"section-header\">\n <ax-label class=\"section-title\">Group Details</ax-label>\n </div>\n <div class=\"edit-field\">\n <ax-label class=\"edit-label\">Group Title</ax-label>\n <ax-text-box [(value)]=\"editTitle\" [placeholder]=\"'Enter group title'\"></ax-text-box>\n </div>\n <div class=\"edit-field\">\n <ax-avatar-picker [(avatarUrl)]=\"editAvatar\"></ax-avatar-picker>\n </div>\n <div class=\"edit-actions\">\n <ax-button\n [text]=\"'Save Changes'\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canSaveEdit()\"\n (onClick)=\"saveEdit()\"\n ></ax-button>\n </div>\n </div>\n }\n\n <div class=\"settings-list\">\n <div class=\"setting-item\">\n <div class=\"setting-info\">\n <span class=\"setting-label\">Notifications</span>\n <span class=\"setting-description\">Receive notifications for new messages</span>\n </div>\n <ax-switch\n [(ngModel)]=\"notificationsEnabled\"\n (ngModelChange)=\"onNotificationsChange($event)\"\n ></ax-switch>\n </div>\n\n <div class=\"setting-item\">\n <div class=\"setting-info\">\n <span class=\"setting-label\">Show Preview</span>\n <span class=\"setting-description\">Show message preview in notifications</span>\n </div>\n <ax-switch [(ngModel)]=\"showPreview\" (ngModelChange)=\"onShowPreviewChange($event)\"></ax-switch>\n </div>\n\n <div class=\"setting-item\">\n <div class=\"setting-info\">\n <span class=\"setting-label\">Archived</span>\n <span class=\"setting-description\">Hide this conversation from the list</span>\n </div>\n <ax-switch [(ngModel)]=\"archived\" (ngModelChange)=\"onArchivedChange($event)\"></ax-switch>\n </div>\n </div>\n\n @if (conversation.type !== 'private') {\n <div class=\"danger-zone\">\n <ax-button\n [look]=\"'solid'\"\n [color]=\"'danger'\"\n [text]=\"'Leave Conversation'\"\n (onClick)=\"onLeave()\"\n ></ax-button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .conversation-info-panel {\n display: flex;\n flex-direction: column;\n background: rgb(var(--ax-sys-color-surface));\n overflow: hidden;\n }\n\n /* Header */\n .panel-header {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 1rem 2rem;\n background: linear-gradient(180deg, rgb(var(--ax-sys-color-lighter-surface)), rgb(var(--ax-sys-color-surface)));\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n gap: 0.5rem;\n position: relative;\n }\n\n .conversation-title-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.25rem;\n }\n\n .conversation-title {\n margin: 0;\n font-size: 1.625rem;\n font-weight: 700;\n color: rgb(var(--ax-sys-color-on-surface));\n text-align: center;\n letter-spacing: -0.02em;\n }\n\n /* Edit Group Section */\n .edit-group-section {\n padding: 1.5rem;\n background: rgb(var(--ax-sys-color-lighter-surface));\n border-radius: 0.75rem;\n margin-bottom: 1.5rem;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .section-header {\n margin-bottom: 1.25rem;\n padding-bottom: 0.75rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .section-title {\n font-size: 1rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .edit-field {\n margin-bottom: 1rem;\n }\n\n .edit-label {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n margin-bottom: 0.5rem;\n }\n\n .edit-actions {\n display: flex;\n gap: 0.75rem;\n justify-content: flex-start;\n margin-top: 1rem;\n }\n\n /* Tab Content */\n .tab-content-wrapper {\n flex: 1;\n overflow-y: auto;\n max-height: 50vh;\n }\n\n .tab-content {\n padding: 2rem;\n animation: fadeIn 0.3s ease-in-out;\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* About Section - Stats */\n .about-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 1rem;\n margin-bottom: 1.5rem;\n }\n\n .stat-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 1rem;\n background: rgb(var(--ax-sys-color-lighter-surface));\n border-radius: 0.75rem;\n transition: all 0.2s;\n border: 2px solid transparent;\n }\n\n .stat-card:hover {\n background: rgb(var(--ax-sys-color-border-light-surface));\n // transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n }\n\n .stat-card.highlight {\n background: rgb(var(--ax-sys-color-primary-500) / 0.1);\n border-color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .stat-icon {\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-surface));\n border-radius: 0.5rem;\n font-size: 1.125rem;\n color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .stat-card.highlight .stat-icon {\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary));\n }\n\n .stat-content {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n }\n\n .stat-value {\n font-size: 1.25rem;\n font-weight: 700;\n color: rgb(var(--ax-sys-color-on-surface));\n line-height: 1;\n }\n\n .stat-label {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.7;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n /* About Section - Timeline */\n .about-timeline {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .timeline-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 0.875rem 1rem;\n background: rgb(var(--ax-sys-color-lighter-surface));\n border-radius: 0.5rem;\n transition: background 0.2s;\n }\n\n .timeline-item:hover {\n background: rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .timeline-icon {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-surface));\n border-radius: 50%;\n font-size: 0.875rem;\n color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .timeline-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 1rem;\n }\n\n .timeline-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .timeline-value {\n font-size: 0.875rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.7;\n cursor: help;\n }\n\n /* Members List */\n .members-search {\n margin-bottom: 1rem;\n }\n\n .members-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .member-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.875rem;\n background: rgb(var(--ax-sys-color-lighter-surface));\n border-radius: 0.75rem;\n transition: all 0.2s ease;\n border: 1px solid transparent;\n cursor: pointer;\n }\n\n .member-card:hover {\n background: rgb(var(--ax-sys-color-surface));\n border-color: rgb(var(--ax-sys-color-primary-500) / 0.3);\n // transform: translateX(4px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n .member-details {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n }\n\n .member-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .member-role {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-primary-500));\n text-transform: capitalize;\n }\n\n .status-indicator {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .status-indicator.online {\n background: rgb(var(--ax-sys-color-success-500));\n }\n\n .status-indicator.away {\n background: rgb(var(--ax-sys-color-warning-500));\n }\n\n .status-indicator.offline {\n background: rgb(var(--ax-sys-color-neutral-400));\n }\n\n /* Settings List */\n .settings-list {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .setting-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 1rem;\n padding: 1.25rem;\n background: rgb(var(--ax-sys-color-lighter-surface));\n border-radius: 0.75rem;\n border: 1px solid transparent;\n transition: all 0.2s ease;\n }\n\n .setting-item:hover {\n background: rgb(var(--ax-sys-color-surface));\n border-color: rgb(var(--ax-sys-color-border-light-surface));\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);\n }\n\n .setting-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .setting-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .setting-description {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.7;\n }\n\n /* Danger Zone */\n .danger-zone {\n padding: 1.5rem;\n margin-top: 1.5rem;\n background: rgb(var(--ax-sys-color-danger-500) / 0.05);\n border: 1px solid rgb(var(--ax-sys-color-danger-500) / 0.2);\n border-radius: 0.75rem;\n }\n\n .danger-zone ax-button {\n width: 100%;\n }\n `,\n ],\n providers: [{ provide: AXClosableComponent, useExisting: AXConversationInfoPanelComponent }],\n})\nexport class AXConversationInfoPanelComponent extends AXClosableComponent implements OnInit, OnDestroy {\n private readonly toastService = inject(AXToastService);\n\n /** Event emitted when popup should close */\n readonly onClosed = output<AXComponentCloseEvent>();\n\n /** Conversation (passed via popup data) */\n conversation!: AXConversation;\n\n /** Conversation service (passed via popup data) */\n conversationService!: AXConversationService;\n\n // Settings state\n notificationsEnabled = false;\n showPreview = false;\n archived = false;\n\n // Track initial settings values\n private initialNotifications = false;\n private initialShowPreview = false;\n private initialArchived = false;\n\n // Members search\n memberSearchQuery = '';\n\n // Active tab\n activeTab = 'about';\n\n // Edit fields\n editTitle = '';\n editAvatar = '';\n\n /** Get filtered members based on search */\n get filteredMembers() {\n if (!this.memberSearchQuery.trim()) {\n return this.conversation.participants;\n }\n const query = this.memberSearchQuery.toLowerCase();\n return this.conversation.participants.filter(\n (p) => p.name.toLowerCase().includes(query) || p.role?.toLowerCase().includes(query),\n );\n }\n\n /** Handle tab change */\n onTabChange(event: any): void {\n if (event.tab?.key) {\n this.activeTab = event.tab.key;\n }\n }\n\n ngOnInit(): void {\n if (this.conversation) {\n this.notificationsEnabled = this.conversation.settings?.notifications ?? true;\n this.showPreview = this.conversation.settings?.showPreview ?? true;\n this.archived = this.conversation.archived ?? false;\n\n // Store initial values\n this.initialNotifications = this.notificationsEnabled;\n this.initialShowPreview = this.showPreview;\n this.initialArchived = this.archived;\n\n // Initialize edit fields\n this.editTitle = this.conversation.title || '';\n this.editAvatar = this.conversation.avatar || '';\n }\n }\n\n /** Get initials from name */\n getInitials(name: string): string {\n return AXConversationMessageUtilsService.getInitials(name);\n }\n\n /** Get conversation subtitle */\n getSubtitle(): string {\n return AXConversationMessageUtilsService.getConversationSubtitle(this.conversation);\n }\n\n /** Get type label */\n getTypeLabel(): string {\n const types = {\n private: 'Private Chat',\n group: 'Group Conversation',\n channel: 'Channel',\n };\n return types[this.conversation.type] || this.conversation.type;\n }\n\n /** Handle notifications change */\n async onNotificationsChange(value: boolean): Promise<void> {\n try {\n await this.conversationService.updateConversationSettings(this.conversation.id, {\n notifications: value,\n });\n // this.toastService.success('Notifications updated');\n } catch (error) {\n // this.toastService.danger('Failed to update notifications');\n this.notificationsEnabled = !value; // Revert\n }\n }\n\n /** Handle show preview change */\n async onShowPreviewChange(value: boolean): Promise<void> {\n try {\n await this.conversationService.updateConversationSettings(this.conversation.id, {\n showPreview: value,\n });\n // this.toastService.success('Preview setting updated');\n } catch (error) {\n // this.toastService.danger('Failed to update preview setting');\n this.showPreview = !value; // Revert\n }\n }\n\n /** Handle archived change */\n async onArchivedChange(value: boolean): Promise<void> {\n try {\n await this.conversationService.updateConversation(this.conversation.id, {\n archived: value,\n });\n // this.toastService.success(value ? 'Conversation archived' : 'Conversation unarchived');\n } catch (error) {\n // this.toastService.danger('Failed to update archive status');\n this.archived = !value; // Revert\n }\n }\n\n /** Implement AXClosableComponent.close() */\n close(data?: unknown): void {\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = data;\n this.onClosed.emit(event);\n }\n\n /** Implement AXClosableComponent.closeAll() */\n closeAll(): void {\n this.close();\n }\n\n /** Handle leave conversation */\n async onLeave(): Promise<void> {\n const isGroup = this.conversation.type === 'group' || this.conversation.type === 'channel';\n\n // Service handles confirmation dialog internally\n await this.conversationService.deleteConversation(this.conversation.id);\n\n // Close the active conversation if it's being left\n if (this.conversationService.activeConversation()?.id === this.conversation.id) {\n this.conversationService.closeActiveConversation();\n }\n\n // Show success toast\n this.toastService.success(isGroup ? 'You have left the conversation' : 'Conversation deleted successfully');\n\n // Close the info panel popup\n this.close();\n }\n\n /** Get member count text */\n getMemberCountText(): string {\n const count = this.conversation.participants.length;\n return `${count} ${count === 1 ? 'member' : 'members'}`;\n }\n\n /** Get formatted date */\n getFormattedDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n if (days < 365) return `${Math.floor(days / 30)} months ago`;\n return `${Math.floor(days / 365)} years ago`;\n }\n\n /** Check if can save edit */\n canSaveEdit(): boolean {\n return this.editTitle.trim().length > 0;\n }\n\n /** Save edit */\n async saveEdit(): Promise<void> {\n if (!this.canSaveEdit()) return;\n\n try {\n await this.conversationService.updateConversation(this.conversation.id, {\n title: this.editTitle.trim(),\n avatar: this.editAvatar.trim() || undefined,\n });\n\n // Update local conversation object\n this.conversation.title = this.editTitle.trim();\n this.conversation.avatar = this.editAvatar.trim() || undefined;\n\n this.toastService.success('Group details updated successfully');\n } catch (error) {\n console.error('Failed to update group details:', error);\n this.toastService.danger('Failed to update group details');\n }\n }\n ngOnDestroy(): void {\n // Check if any settings have changed\n const hasChanges =\n this.notificationsEnabled !== this.initialNotifications ||\n this.showPreview !== this.initialShowPreview ||\n this.archived !== this.initialArchived;\n\n if (hasChanges) {\n this.toastService.success('Settings saved successfully');\n }\n }\n}\n","/**\n * Search Component for Info Bar\n * Provides search functionality within conversations\n */\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, input } from '@angular/core';\nimport { AXInfoBarService } from '../../../components';\nimport type { AXConversation } from '../../../models';\nimport { AXConversationService } from '../../../services/conversation.service';\n\n@Component({\n selector: 'ax-info-bar-search',\n imports: [CommonModule, AXSearchBoxComponent, AXButtonModule, AXLabelComponent],\n template: `\n <div class=\"search-wrapper\">\n <ax-search-box\n class=\"search-input\"\n [placeholder]=\"'Search in conversation'\"\n [value]=\"searchQuery()\"\n (onValueChanged)=\"onSearchChange($event.value)\"\n ></ax-search-box>\n\n @if (searchQuery() && resultsCount() > 0) {\n <div class=\"search-results\">\n <ax-label class=\"results-text\"> {{ currentIndex() + 1 }} / {{ resultsCount() }} </ax-label>\n <ax-button\n class=\"nav-button\"\n [text]=\"'↑'\"\n [look]=\"'ghost'\"\n [size]=\"'sm'\"\n (onClick)=\"onPrevious()\"\n [disabled]=\"resultsCount() === 0\"\n ></ax-button>\n <ax-button\n class=\"nav-button\"\n [text]=\"'↓'\"\n [look]=\"'ghost'\"\n [size]=\"'sm'\"\n (onClick)=\"onNext()\"\n [disabled]=\"resultsCount() === 0\"\n ></ax-button>\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n flex: 1;\n min-width: 0;\n }\n\n .search-wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n }\n\n .search-input {\n flex: 1;\n min-width: 0;\n }\n\n .search-results {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n flex-shrink: 0;\n }\n\n .results-text {\n font-size: 0.75rem;\n color: var(--ax-text-secondary, #6b7280);\n white-space: nowrap;\n }\n\n .nav-button {\n min-width: 28px;\n height: 28px;\n padding: 0;\n }\n `,\n ],\n})\nexport class AXInfoBarSearchComponent {\n private readonly infoBarService = inject(AXInfoBarService);\n private readonly conversationService = inject(AXConversationService);\n\n /** Conversation input */\n readonly conversation = input.required<AXConversation>();\n\n /** Service input */\n readonly service = input<AXInfoBarService>();\n\n /** Search query from service */\n readonly searchQuery = this.infoBarService.searchQuery;\n\n /** Results count from service */\n readonly resultsCount = this.infoBarService.searchResultsCount;\n\n /** Current index from service */\n readonly currentIndex = this.infoBarService.currentSearchIndex;\n\n /** Messages from conversation */\n readonly messages = computed(() => {\n // Get messages from active conversation\n const activeConv = this.conversationService.activeConversation();\n if (activeConv?.id === this.conversation().id) {\n return this.conversationService.activeMessages();\n }\n return [];\n });\n\n constructor() {\n // Auto-search when query changes\n effect(() => {\n const query = this.searchQuery();\n if (query) {\n this.performSearch(query);\n } else {\n this.infoBarService.setSearchResults(0, 0);\n }\n });\n }\n\n /** Handle search input change */\n onSearchChange(value: string): void {\n this.infoBarService.setSearchQuery(value);\n }\n\n /** Perform search in messages */\n private performSearch(query: string): void {\n const messages = this.messages();\n const lowerQuery = query.toLowerCase();\n\n // Search in text messages\n const results = messages.filter((msg) => {\n if (msg.type === 'text') {\n const text = (msg.payload as any)?.text || '';\n return text.toLowerCase().includes(lowerQuery);\n }\n return false;\n });\n\n this.infoBarService.setSearchResults(results.length, 0);\n\n // Scroll to first result if exists\n if (results.length > 0) {\n this.scrollToResult(results[0].id);\n }\n }\n\n /** Navigate to next result */\n onNext(): void {\n this.infoBarService.nextSearchResult();\n this.scrollToCurrentResult();\n }\n\n /** Navigate to previous result */\n onPrevious(): void {\n this.infoBarService.previousSearchResult();\n this.scrollToCurrentResult();\n }\n\n /** Scroll to current search result */\n private scrollToCurrentResult(): void {\n const query = this.searchQuery();\n const currentIdx = this.currentIndex();\n const messages = this.messages();\n const lowerQuery = query.toLowerCase();\n\n // Find the nth matching message\n let matchCount = 0;\n for (const msg of messages) {\n if (msg.type === 'text') {\n const text = (msg.payload as any)?.text || '';\n if (text.toLowerCase().includes(lowerQuery)) {\n if (matchCount === currentIdx) {\n this.scrollToResult(msg.id);\n break;\n }\n matchCount++;\n }\n }\n }\n }\n\n /** Scroll to a specific message */\n private scrollToResult(messageId: string): void {\n // Use setTimeout to ensure DOM is ready\n setTimeout(() => {\n const element = document.querySelector(`[data-message-id=\"${messageId}\"]`);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }, 100);\n }\n}\n","/**\n * Info Bar Actions Plugin\n * Individual info bar action constants\n */\n\nimport { AXInfoBarAction } from '../../../registries';\nimport { AXConversationInfoPanelComponent, AXInfoBarSearchComponent } from '../components';\n\n/**\n * Search in conversation action (inline)\n */\nexport const AX_CONVERSATION_INFO_BAR_SEARCH_ACTION: AXInfoBarAction = {\n id: 'search',\n label: 'Search',\n icon: 'fa-light fa-magnifying-glass',\n tooltip: 'Search in conversation',\n location: 'inline',\n toggleable: true,\n component: AXInfoBarSearchComponent,\n priority: 200,\n};\n\n/**\n * Show conversation info action (menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_INFO_ACTION: AXInfoBarAction = {\n id: 'info',\n label: 'Conversation Info',\n icon: 'fa-light fa-info',\n location: 'menu',\n priority: 100,\n handler: async (context) => {\n if (context.conversationService) {\n // Open conversation info panel as popup\n await context.conversationService.popupService.open(AXConversationInfoPanelComponent, {\n title: 'Conversation Info',\n data: {\n conversation: context.conversation,\n conversationService: context.conversationService,\n },\n size: 'sm',\n });\n }\n },\n};\n\n/**\n * Mute/Unmute notifications action (menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_MUTE_ACTION: AXInfoBarAction = {\n id: 'mute',\n label: (context) => (context.conversation.settings.notifications ? 'Mute' : 'Unmute'),\n icon: (context) => (context.conversation.settings.notifications ? 'fa-light fa-bell-slash' : 'fa-light fa-bell'),\n location: 'menu',\n priority: 90,\n handler: async (context) => {\n if (context.conversationService) {\n await context.conversationService.updateConversationSettings(context.conversation.id, {\n notifications: !context.conversation.settings.notifications,\n });\n }\n },\n};\n\n/**\n * Divider separator (menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_DIVIDER: AXInfoBarAction = {\n id: 'divider-1',\n label: '',\n divider: true,\n location: 'menu',\n priority: 80,\n};\n\n/**\n * Archive/Unarchive conversation action (menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION: AXInfoBarAction = {\n id: 'archive',\n label: (context) => (context.conversation.archived ? 'Unarchive' : 'Archive'),\n icon: (context) => (context.conversation.archived ? 'fa-light fa-box-open' : 'fa-light fa-box'),\n location: 'menu',\n priority: 70,\n handler: async (context) => {\n if (context.conversationService) {\n await context.conversationService.updateConversation(context.conversation.id, {\n archived: !context.conversation.archived,\n });\n }\n },\n};\n\n/**\n * Delete/Leave conversation action (smart action that adapts based on conversation type)\n * - Private: \"Delete\" - Deletes the conversation\n * - Group/Channel: \"Leave & Delete\" - Leaves the group and removes it from list\n */\nexport const AX_CONVERSATION_INFO_BAR_DELETE_ACTION: AXInfoBarAction = {\n id: 'delete',\n label: (context) => {\n const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n return isGroup ? 'Leave & Delete' : 'Delete';\n },\n icon: (context) => {\n const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n return isGroup ? 'fa-light fa-door-open' : 'fa-light fa-trash';\n },\n location: 'menu',\n priority: 60,\n destructive: true,\n handler: async (context) => {\n if (context.conversationService) {\n // Service handles confirmation dialog\n const result = await context.conversationService.deleteConversation(context.conversation.id);\n\n // Close the active conversation if it's being deleted/left\n if (context.conversationService.activeConversation()?.id === context.conversation.id && result) {\n context.conversationService.closeActiveConversation();\n }\n }\n },\n};\n\n/**\n * Block user action (private chats only, menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_BLOCK_ACTION: AXInfoBarAction = {\n id: 'block',\n label: (context) => (context.conversation.blocked ? 'Unblock' : 'Block'),\n icon: 'fa-light fa-user-slash',\n location: 'menu',\n priority: 50,\n destructive: true,\n visible: (context) => context.conversation.type === 'private',\n handler: async (context) => {\n if (context.conversationService) {\n const currentBlocked = context.conversation.blocked;\n await context.conversationService.updateConversation(context.conversation.id, {\n blocked: !currentBlocked,\n });\n }\n },\n};\n","/**\n * Audio Message Renderer Component\n * Renders audio messages with playback controls\n */\n\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, ElementRef, PLATFORM_ID, computed, effect, inject, input, signal, viewChild } from '@angular/core';\nimport { AXAudioPayload, AXMessage } from '../../../../models';\n\n@Component({\n selector: 'ax-conversation-audio-renderer',\n imports: [CommonModule],\n template: `\n <div class=\"audio-renderer\">\n <div class=\"audio-controls\">\n <!-- Play/Pause Button -->\n <button\n type=\"button\"\n class=\"control-button\"\n (click)=\"togglePlay()\"\n [attr.aria-label]=\"isPlaying() ? 'Pause' : 'Play'\"\n >\n <i class=\"fa-solid\" [class.fa-pause]=\"isPlaying()\" [class.fa-play]=\"!isPlaying()\"></i>\n </button>\n\n <!-- Progress Bar -->\n <div class=\"audio-progress-container\">\n <div class=\"audio-info\">\n <span class=\"audio-title\">{{ title() || 'Audio' }}</span>\n <span class=\"audio-time\">{{ currentTimeFormatted() }} / {{ durationFormatted() }}</span>\n </div>\n <div class=\"audio-progress\" (click)=\"onProgressClick($event)\">\n <div class=\"progress-bar\" [style.width.%]=\"progress()\"></div>\n </div>\n </div>\n\n <!-- Volume Control (optional) -->\n <button\n type=\"button\"\n class=\"control-button volume-button\"\n (click)=\"toggleMute()\"\n [attr.aria-label]=\"isMuted() ? 'Unmute' : 'Mute'\"\n >\n <i class=\"fa-light\" [class.fa-volume-xmark]=\"isMuted()\" [class.fa-volume]=\"!isMuted()\"></i>\n </button>\n </div>\n\n @if (error()) {\n <div class=\"audio-error\">\n <span class=\"error-icon\">🎵</span>\n <span class=\"error-text\">Failed to load audio</span>\n </div>\n }\n\n <!-- Hidden audio element -->\n <audio #audioElement [src]=\"audioUrl()\" (error)=\"onError()\" (timeupdate)=\"onTimeUpdate()\" (ended)=\"onEnded()\">\n Your browser does not support the audio element.\n </audio>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .audio-renderer {\n width: 100%;\n }\n\n .audio-controls {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem;\n background: rgb(var(--ax-sys-color-lighter-surface));\n color: rgb(var(--ax-sys-color-on-lighter-surface));\n border-radius: 0.5rem;\n }\n\n .control-button {\n flex-shrink: 0;\n padding-inline-start: 0.2rem;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n border: none;\n border-radius: 50%;\n font-size: 1rem;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .control-button:hover {\n background: rgb(var(--ax-sys-color-primary-600));\n }\n\n .volume-button {\n background: transparent;\n color: rgb(var(--ax-sys-color-primary-600));\n font-size: 1.25rem;\n }\n\n .volume-button:hover {\n color: rgb(var(--ax-sys-color-primary-700));\n }\n\n .audio-progress-container {\n flex: 1;\n min-width: 0;\n }\n\n .audio-info {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 0.25rem;\n font-size: 0.75rem;\n }\n\n .audio-title {\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .audio-time {\n font-variant-numeric: tabular-nums;\n opacity: 0.7;\n flex-shrink: 0;\n margin-left: 0.5rem;\n }\n\n .audio-progress {\n height: 4px;\n background: rgb(var(--ax-sys-color-border-light-surface));\n border-radius: 2px;\n cursor: pointer;\n overflow: hidden;\n }\n\n .progress-bar {\n height: 100%;\n background: rgb(var(--ax-sys-color-primary-500));\n transition: width 0.1s linear;\n }\n\n .audio-error {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: rgb(var(--ax-sys-color-danger-500));\n border-radius: 0.5rem;\n font-size: 0.875rem;\n }\n\n .error-icon {\n font-size: 1.25rem;\n }\n\n audio {\n display: none;\n }\n `,\n ],\n})\nexport class AudioRendererComponent {\n private readonly platformId = inject(PLATFORM_ID);\n\n /** Message to render */\n readonly message = input.required<AXMessage>();\n\n /** Audio element reference */\n private readonly audioElementRef = viewChild<ElementRef<HTMLAudioElement>>('audioElement');\n\n /** Playing state */\n readonly isPlaying = signal(false);\n\n /** Muted state */\n readonly isMuted = signal(false);\n\n /** Current time in seconds */\n readonly currentTime = signal(0);\n\n /** Duration in seconds */\n readonly duration = signal(0);\n\n /** Error state */\n readonly error = signal(false);\n\n /** Audio payload */\n readonly payload = computed(() => this.message().payload as AXAudioPayload);\n\n /** Audio URL */\n readonly audioUrl = computed(() => this.payload().url);\n\n /** Title */\n readonly title = computed(() => this.payload().title);\n\n /** Progress percentage */\n readonly progress = computed(() => {\n const dur = this.duration();\n return dur > 0 ? (this.currentTime() / dur) * 100 : 0;\n });\n\n /** Formatted current time */\n readonly currentTimeFormatted = computed(() => this.formatTime(this.currentTime()));\n\n /** Formatted duration */\n readonly durationFormatted = computed(() => this.formatTime(this.duration()));\n\n constructor() {\n // Update duration when audio metadata loads\n effect(() => {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl && isPlatformBrowser(this.platformId)) {\n audioEl.addEventListener('loadedmetadata', () => {\n this.duration.set(audioEl.duration);\n });\n }\n });\n }\n\n /** Toggle play/pause */\n togglePlay(): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl) return;\n\n if (this.isPlaying()) {\n audioEl.pause();\n this.isPlaying.set(false);\n } else {\n audioEl.play();\n this.isPlaying.set(true);\n }\n }\n\n /** Toggle mute */\n toggleMute(): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl) return;\n\n audioEl.muted = !audioEl.muted;\n this.isMuted.set(audioEl.muted);\n }\n\n /** Handle time update */\n onTimeUpdate(): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl) {\n this.currentTime.set(audioEl.currentTime);\n }\n }\n\n /** Handle audio ended */\n onEnded(): void {\n this.isPlaying.set(false);\n this.currentTime.set(0);\n }\n\n /** Handle audio error */\n onError(): void {\n this.error.set(true);\n this.isPlaying.set(false);\n }\n\n /** Handle progress bar click */\n onProgressClick(event: MouseEvent): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl) return;\n\n const progressBar = event.currentTarget as HTMLElement;\n const rect = progressBar.getBoundingClientRect();\n const percent = (event.clientX - rect.left) / rect.width;\n audioEl.currentTime = percent * audioEl.duration;\n }\n\n /** Format time (seconds to MM:SS) */\n private formatTime(seconds: number): string {\n if (!isFinite(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n }\n}\n","/**\n * Contact Message Renderer\n * Renders contact card messages\n */\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXToastService } from '@acorex/components/toast';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input } from '@angular/core';\nimport type { AXContactPayload, AXMessage } from '../../../../models';\n\n@Component({\n selector: 'ax-conversation-contact-renderer',\n imports: [CommonModule, AXButtonModule, AXDecoratorModule],\n template: `\n <div class=\"contact-renderer\">\n <div class=\"contact-card\">\n <div class=\"contact-avatar\">\n @if (payload().avatar) {\n <img [src]=\"payload().avatar\" [alt]=\"payload().name\" class=\"avatar-img\" />\n } @else {\n <div class=\"avatar-initials\">{{ getInitials(payload().name) }}</div>\n }\n </div>\n\n <div class=\"contact-info\">\n <div class=\"contact-name\">{{ payload().name }}</div>\n\n @if (payload().phoneNumber) {\n <a [href]=\"'tel:' + payload().phoneNumber\" class=\"contact-detail contact-link\">\n <i class=\"fa-light fa-phone\"></i>\n <span>{{ payload().phoneNumber }}</span>\n </a>\n }\n\n @if (payload().email) {\n <a [href]=\"'mailto:' + payload().email\" class=\"contact-detail contact-link\">\n <i class=\"fa-light fa-envelope\"></i>\n <span>{{ payload().email }}</span>\n </a>\n }\n\n @if (payload().url) {\n <a [href]=\"payload().url\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"contact-detail contact-link\">\n <i class=\"fa-light fa-link\"></i>\n <span>{{ payload().url }}</span>\n </a>\n }\n </div>\n </div>\n\n <div class=\"contact-actions\">\n <ax-button class=\"contact-button\" text=\"Copy Contact\" [look]=\"'outline'\" (onClick)=\"copyContact()\">\n <ax-prefix>\n <i class=\"fa-light fa-copy\"></i>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .contact-renderer {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 0.5rem;\n background: rgb(var(--ax-sys-color-lightest-surface));\n color: rgb(var(--ax-sys-color-on-lightest-surface));\n border-radius: 0.5rem;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n max-width: 320px;\n }\n\n .contact-card {\n display: flex;\n gap: 0.75rem;\n align-items: center;\n }\n\n .contact-avatar {\n flex-shrink: 0;\n }\n\n .avatar-img {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n object-fit: cover;\n }\n\n .avatar-initials {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n font-size: 1rem;\n }\n\n .contact-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .contact-name {\n font-weight: 600;\n font-size: 1rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .contact-detail {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n opacity: 0.7;\n }\n\n .contact-link {\n text-decoration: none;\n color: inherit;\n transition: all 0.2s;\n border-radius: 0.25rem;\n }\n\n .contact-link:hover {\n opacity: 1;\n color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .contact-link:active {\n // transform: scale(0.98);\n }\n\n .contact-detail i {\n width: 14px;\n font-size: 0.75rem;\n opacity: 0.7;\n }\n\n .contact-detail span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .contact-actions {\n display: flex;\n gap: 0.5rem;\n }\n\n .contact-button {\n width: 100%;\n }\n `,\n ],\n})\nexport class ContactRendererComponent {\n private readonly toastService = inject(AXToastService);\n\n /** Message to render */\n readonly message = input.required<AXMessage>();\n\n /** Contact payload */\n readonly payload = computed(() => this.message().payload as AXContactPayload);\n\n /** Get initials from name */\n getInitials(name: string): string {\n return name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .substring(0, 2);\n }\n\n /** Copy contact information to clipboard */\n async copyContact(): Promise<void> {\n const contact = this.payload();\n const contactText = this.formatContactText(contact);\n\n try {\n await navigator.clipboard.writeText(contactText);\n this.toastService.success('Contact copied to clipboard');\n } catch (error) {\n console.error('Failed to copy contact:', error);\n this.toastService.danger('Failed to copy contact');\n }\n }\n\n /** Format contact information as text */\n private formatContactText(contact: AXContactPayload): string {\n const parts: string[] = [];\n\n parts.push(`Name: ${contact.name}`);\n\n if (contact.phoneNumber) {\n parts.push(`Phone: ${contact.phoneNumber}`);\n }\n\n if (contact.email) {\n parts.push(`Email: ${contact.email}`);\n }\n\n if (contact.url) {\n parts.push(`URL: ${contact.url}`);\n }\n\n return parts.join('\\n');\n }\n}\n","/**\n * Fallback Message Renderer Component\n * Renders unknown message types with basic info\n */\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal } from '@angular/core';\nimport type { AXMessage } from '../../../../models';\n\n@Component({\n selector: 'ax-conversation-fallback-renderer',\n imports: [CommonModule, AXButtonModule],\n template: `\n <div class=\"fallback-renderer\">\n <div class=\"fallback-icon\">📦</div>\n <div class=\"fallback-content\">\n <div class=\"fallback-title\">{{ messageTypeLabel() }}</div>\n <div class=\"fallback-subtitle\">This message type is not supported</div>\n @if (hasPayloadData()) {\n <ax-button\n class=\"view-raw-button\"\n [text]=\"showRaw() ? 'Hide raw data' : 'View raw data'\"\n [look]=\"'outline'\"\n [size]=\"'sm'\"\n (onClick)=\"toggleRaw()\"\n >\n </ax-button>\n }\n </div>\n\n @if (showRaw()) {\n <div class=\"fallback-raw\">\n <pre class=\"raw-content\">{{ rawPayload() }}</pre>\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .fallback-renderer {\n padding: 1rem;\n background: rgb(var(--ax-sys-color-warning-lightest-surface));\n border: 1px solid rgb(var(--ax-sys-color-warning-500));\n border-radius: 0.5rem;\n max-width: 320px;\n }\n\n .fallback-icon {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n text-align: center;\n }\n\n .fallback-content {\n text-align: center;\n }\n\n .fallback-title {\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 0.25rem;\n text-transform: capitalize;\n }\n\n .fallback-subtitle {\n font-size: 0.75rem;\n margin-bottom: 0.75rem;\n opacity: 0.7;\n }\n\n .view-raw-button {\n margin-top: 0.5rem;\n }\n\n .fallback-raw {\n margin-top: 0.75rem;\n padding: 0.75rem;\n background: rgb(var(--ax-sys-color-darker-surface));\n border-radius: 0.375rem;\n max-height: 200px;\n overflow: auto;\n }\n\n .raw-content {\n margin: 0;\n font-size: 0.6875rem;\n font-family: 'Courier New', Courier, monospace;\n color: rgb(var(--ax-sys-color-on-darker-surface));\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n `,\n ],\n})\nexport class FallbackRendererComponent {\n /** Message to render */\n readonly message = input.required<AXMessage>();\n\n /** Show raw data */\n readonly showRaw = signal(false);\n\n /** Message type label */\n readonly messageTypeLabel = computed(() => {\n const type = this.message().type;\n return type.replace(/_/g, ' ');\n });\n\n /** Has payload data */\n readonly hasPayloadData = computed(() => {\n const payload = this.message().payload;\n return payload && Object.keys(payload).length > 0;\n });\n\n /** Raw payload as JSON string */\n readonly rawPayload = computed(() => {\n const payload = this.message().payload;\n return JSON.stringify(payload, null, 2);\n });\n\n /** Toggle raw data display */\n toggleRaw(): void {\n this.showRaw.update((value) => !value);\n }\n}\n","/**\n * File Message Renderer Component\n * Renders file attachments with download support\n */\n\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, input } from '@angular/core';\nimport type { AXFilePayload, AXMessage } from '../../../../models';\n\n@Component({\n selector: 'ax-conversation-file-renderer',\n imports: [CommonModule],\n template: `\n <div class=\"file-renderer\">\n <a [href]=\"fileUrl()\" [download]=\"fileName()\" class=\"file-container\" target=\"_blank\" rel=\"noopener noreferrer\">\n <!-- File Icon -->\n <div class=\"file-icon\" [style.background]=\"fileIconColor()\">\n <span class=\"icon-text\">{{ fileExtension() }}</span>\n </div>\n\n <!-- File Info -->\n <div class=\"file-info\">\n <div class=\"file-name\">{{ fileName() }}</div>\n <div class=\"file-meta\">\n <span class=\"file-size\">{{ formattedSize() }}</span>\n @if (mimeType()) {\n <span class=\"file-type\"> • {{ mimeType() }}</span>\n }\n </div>\n </div>\n\n <!-- Download Icon -->\n <div class=\"file-action\">\n <span class=\"download-icon\">⬇</span>\n </div>\n </a>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .file-renderer {\n width: 100%;\n max-width: 320px;\n }\n\n .file-container {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem;\n background: rgb(var(--ax-sys-color-lighter-surface));\n color: rgb(var(--ax-sys-color-on-lighter-surface));\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n border-radius: 0.5rem;\n text-decoration: none;\n transition: all 0.2s;\n cursor: pointer;\n }\n\n .file-container:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n border-color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .file-icon {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 0.5rem;\n font-weight: 600;\n font-size: 0.625rem;\n text-transform: uppercase;\n color: rgb(var(--ax-sys-color-light));\n }\n\n .icon-text {\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n padding: 0 0.25rem;\n }\n\n .file-info {\n flex: 1;\n min-width: 0;\n }\n\n .file-name {\n font-size: 0.875rem;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-bottom: 0.125rem;\n }\n\n .file-meta {\n font-size: 0.75rem;\n opacity: 0.7;\n }\n\n .file-type {\n text-transform: uppercase;\n }\n\n .file-action {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-surface));\n border-radius: 0.375rem;\n transition: background 0.2s;\n }\n\n .file-container:hover .file-action {\n background: rgb(var(--ax-sys-color-primary-500));\n }\n\n .download-icon {\n font-size: 1.125rem;\n transition: transform 0.2s;\n }\n\n .file-container:hover .download-icon {\n transform: translateY(2px);\n }\n `,\n ],\n})\nexport class FileRendererComponent {\n /** Message to render */\n readonly message = input.required<AXMessage>();\n\n /** File payload */\n readonly payload = computed(() => this.message().payload as AXFilePayload);\n\n /** File URL */\n readonly fileUrl = computed(() => this.payload().url);\n\n /** File name */\n readonly fileName = computed(() => this.payload().name || 'file');\n\n /** File size in bytes */\n readonly fileSize = computed(() => this.payload().size || 0);\n\n /** MIME type */\n readonly mimeType = computed(() => this.payload().mimeType);\n\n /** File extension */\n readonly fileExtension = computed(() => {\n const name = this.fileName();\n const parts = name.split('.');\n return parts.length > 1 ? parts[parts.length - 1] : 'FILE';\n });\n\n /** File icon color based on extension */\n readonly fileIconColor = computed(() => {\n const ext = this.fileExtension().toLowerCase();\n const colorMap: Record<string, string> = {\n pdf: '#ef4444',\n doc: '#3b82f6',\n docx: '#3b82f6',\n xls: '#10b981',\n xlsx: '#10b981',\n ppt: '#f59e0b',\n pptx: '#f59e0b',\n txt: '#6b7280',\n zip: '#8b5cf6',\n rar: '#8b5cf6',\n jpg: '#ec4899',\n jpeg: '#ec4899',\n png: '#ec4899',\n gif: '#ec4899',\n mp3: '#14b8a6',\n mp4: '#14b8a6',\n file: '#6b7280',\n };\n return colorMap[ext] || '#6b7280';\n });\n\n /** Formatted file size */\n readonly formattedSize = computed(() => {\n const bytes = this.fileSize();\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n });\n}\n","/**\n * Image Message Renderer Component\n * Renders image messages with lazy loading and lightbox support\n */\n\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, PLATFORM_ID, computed, inject, input, output, signal } from '@angular/core';\nimport type { AXImagePayload, AXMessage } from '../../../../models';\n\n@Component({\n selector: 'ax-conversation-image-renderer',\n imports: [CommonModule],\n template: `\n <div class=\"image-renderer\">\n @if (loading()) {\n <div class=\"image-loading\">\n <div class=\"spinner\"></div>\n </div>\n }\n\n <img\n [src]=\"thumbnailUrl()\"\n [alt]=\"alt()\"\n [class.loaded]=\"!loading()\"\n (load)=\"onLoad()\"\n (error)=\"onError()\"\n (click)=\"onClick()\"\n loading=\"lazy\"\n class=\"message-image\"\n />\n\n @if (error()) {\n <div class=\"image-error\">\n <span class=\"error-icon\">🖼️</span>\n <span class=\"error-text\">Failed to load image</span>\n </div>\n }\n\n @if (caption()) {\n <div class=\"image-caption\">{{ caption() }}</div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .image-renderer {\n position: relative;\n max-width: 100%;\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .message-image {\n display: block;\n max-width: 100%;\n max-height: 400px;\n width: auto;\n height: auto;\n cursor: pointer;\n transition: opacity 0.3s;\n opacity: 0;\n }\n\n .message-image.loaded {\n opacity: 1;\n }\n\n .image-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n background: rgb(var(--ax-sys-color-lighter-surface));\n }\n\n .spinner {\n width: 24px;\n height: 24px;\n border: 2px solid rgb(var(--ax-sys-color-border-light-surface));\n border-top-color: rgb(var(--ax-sys-color-primary-500));\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .image-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n background: rgb(var(--ax-sys-color-danger-lightest-surface));\n color: rgb(var(--ax-sys-color-danger-500));\n padding: 1rem;\n text-align: center;\n }\n\n .error-icon {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n }\n\n .error-text {\n font-size: 0.875rem;\n }\n\n .image-caption {\n padding: 0.5rem;\n font-size: 0.875rem;\n background: rgba(0, 0, 0, 0.05);\n opacity: 0.9;\n }\n `,\n ],\n})\nexport class ImageRendererComponent {\n private readonly platformId = inject(PLATFORM_ID);\n\n /** Message to render */\n readonly message = input.required<AXMessage>();\n\n /** Loading state */\n readonly loading = signal(true);\n\n /** Error state */\n readonly error = signal(false);\n\n /** Image clicked event */\n readonly imageClick = output<string>();\n\n /** Image payload */\n readonly payload = computed(() => this.message().payload as AXImagePayload);\n\n /** Thumbnail URL */\n readonly thumbnailUrl = computed(() => this.payload().thumbnailUrl || this.payload().url);\n\n /** Alt text */\n readonly alt = computed(() => this.payload().caption || 'Image');\n\n /** Caption */\n readonly caption = computed(() => this.payload().caption);\n\n /** Handle image load */\n onLoad(): void {\n this.loading.set(false);\n this.error.set(false);\n }\n\n /** Handle image error */\n onError(): void {\n this.loading.set(false);\n this.error.set(true);\n }\n\n /** Handle image click */\n onClick(): void {\n if (!this.error() && isPlatformBrowser(this.platformId)) {\n this.imageClick.emit(this.payload().url);\n }\n }\n}\n","/**\n * Location Message Renderer Component\n * Renders location messages with interactive Leaflet map\n */\n\nimport { AXMapModule } from '@acorex/components/map';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, input } from '@angular/core';\nimport type { AXLocationPayload, AXMessage } from '../../../../models';\n\n@Component({\n selector: 'ax-conversation-location-renderer',\n imports: [CommonModule, AXMapModule],\n template: `\n <div class=\"location-renderer\">\n <div class=\"location-container\">\n <!-- Interactive Map Preview -->\n <div class=\"location-map\">\n <ax-map\n [latitude]=\"latitude()\"\n [longitude]=\"longitude()\"\n [zoomLevel]=\"15\"\n [markers]=\"markers()\"\n [hasLocator]=\"false\"\n [hasDraw]=\"false\"\n >\n </ax-map>\n </div>\n\n <!-- Location Info -->\n <div class=\"location-info\">\n <div class=\"location-name\">\n <span class=\"pin-icon\">📍</span>\n <span class=\"name-text\">{{ locationName() }}</span>\n </div>\n\n @if (address()) {\n <div class=\"location-address\">{{ address() }}</div>\n }\n\n <div class=\"location-coordinates\">{{ coordinatesText() }}</div>\n </div>\n\n <!-- Action -->\n <a [href]=\"mapsUrl()\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"location-action\">\n <span class=\"action-text\">Open in Google Maps</span>\n <span class=\"action-icon\">→</span>\n </a>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .location-renderer {\n width: 100%;\n max-width: 280px;\n }\n\n .location-container {\n display: flex;\n flex-direction: column;\n background: rgb(var(--ax-sys-color-lighter-surface));\n color: rgb(var(--ax-sys-color-on-lighter-surface));\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n border-radius: 0.75rem;\n overflow: hidden;\n }\n\n .location-map {\n position: relative;\n width: 100%;\n height: 200px;\n overflow: hidden;\n }\n\n .location-map ::ng-deep ax-map {\n height: 100%;\n width: 100%;\n }\n\n .location-info {\n padding: 0.75rem;\n }\n\n .location-name {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.875rem;\n font-weight: 600;\n }\n\n .pin-icon {\n font-size: 1rem;\n }\n\n .name-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .location-address {\n font-size: 0.75rem;\n opacity: 0.7;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .location-coordinates {\n font-size: 0.6875rem;\n opacity: 0.6;\n font-family: monospace;\n }\n\n .location-action {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n background: rgb(var(--ax-sys-color-surface));\n border-top: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n font-size: 0.75rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-primary-500));\n text-decoration: none;\n transition: background 0.2s;\n cursor: pointer;\n }\n\n .location-action:hover {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n }\n\n .action-icon {\n transition: transform 0.2s;\n }\n\n .location-action:hover .action-icon {\n transform: translateX(4px);\n }\n `,\n ],\n})\nexport class LocationRendererComponent {\n /** Message to render */\n readonly message = input.required<AXMessage>();\n\n /** Location payload */\n readonly payload = computed(() => this.message().payload as AXLocationPayload);\n\n /** Latitude */\n readonly latitude = computed(() => this.payload().latitude);\n\n /** Longitude */\n readonly longitude = computed(() => this.payload().longitude);\n\n /** Location name */\n readonly locationName = computed(() => this.payload().name || 'Location');\n\n /** Address */\n readonly address = computed(() => this.payload().address);\n\n /** Coordinates text */\n readonly coordinatesText = computed(() => {\n const lat = this.latitude().toFixed(6);\n const lng = this.longitude().toFixed(6);\n return `${lat}, ${lng}`;\n });\n\n /** Google Maps URL */\n readonly mapsUrl = computed(() => {\n const lat = this.latitude();\n const lng = this.longitude();\n return `https://www.google.com/maps?q=${lat},${lng}`;\n });\n\n /** Markers for the map */\n readonly markers = computed(() => [\n {\n latitude: this.latitude(),\n longitude: this.longitude(),\n popup: this.locationName(),\n popupOpen: false,\n popupCloseButton: true,\n },\n ]);\n}\n","/**\n * Sticker Message Renderer Component\n * Renders sticker messages with optimized loading\n */\n\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal } from '@angular/core';\nimport type { AXMessage, AXStickerPayload } from '../../../../models';\n\n@Component({\n selector: 'ax-conversation-sticker-renderer',\n imports: [CommonModule],\n template: `\n <div class=\"sticker-renderer\">\n @if (loading()) {\n <div class=\"sticker-loading\">\n <div class=\"spinner\"></div>\n </div>\n }\n\n <img\n [src]=\"stickerUrl()\"\n [alt]=\"alt()\"\n [class.loaded]=\"!loading()\"\n (load)=\"onLoad()\"\n (error)=\"onError()\"\n loading=\"lazy\"\n class=\"sticker-image\"\n />\n\n @if (error()) {\n <div class=\"sticker-error\">\n <span class=\"error-icon\">😕</span>\n <span class=\"error-text\">Sticker not available</span>\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .sticker-renderer {\n position: relative;\n display: inline-block;\n max-width: 180px;\n margin: 0.25rem 0;\n }\n\n .sticker-image {\n display: block;\n width: 100%;\n height: auto;\n max-height: 180px;\n object-fit: contain;\n transition:\n opacity 0.2s,\n transform 0.2s;\n opacity: 0;\n cursor: pointer;\n }\n\n .sticker-image.loaded {\n opacity: 1;\n }\n\n .sticker-image:hover {\n // transform: scale(1.05);\n }\n\n .sticker-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 120px;\n height: 120px;\n background: rgb(var(--ax-sys-color-lighter-surface));\n border-radius: 0.5rem;\n }\n\n .spinner {\n width: 24px;\n height: 24px;\n border: 2px solid rgb(var(--ax-sys-color-border-light-surface));\n border-top-color: rgb(var(--ax-sys-color-primary-500));\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .sticker-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 120px;\n height: 120px;\n background: rgb(var(--ax-sys-color-danger-lightest-surface));\n color: rgb(var(--ax-sys-color-danger-500));\n border-radius: 0.5rem;\n padding: 1rem;\n text-align: center;\n }\n\n .error-icon {\n font-size: 2rem;\n margin-bottom: 0.25rem;\n }\n\n .error-text {\n font-size: 0.75rem;\n }\n `,\n ],\n})\nexport class StickerRendererComponent {\n /** Message to render */\n readonly message = input.required<AXMessage>();\n\n /** Loading state */\n readonly loading = signal(true);\n\n /** Error state */\n readonly error = signal(false);\n\n /** Sticker payload */\n readonly payload = computed(() => this.message().payload as AXStickerPayload);\n\n /** Sticker URL */\n readonly stickerUrl = computed(() => this.payload().url);\n\n /** Alt text */\n readonly alt = computed(() => this.payload().emoji || 'Sticker');\n\n /** Handle image load */\n onLoad(): void {\n this.loading.set(false);\n this.error.set(false);\n }\n\n /** Handle image error */\n onError(): void {\n this.loading.set(false);\n this.error.set(true);\n }\n}\n","/**\n * System Message Renderer Component\n * Renders system/notification messages (user joined, title changed, etc.)\n */\n\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, input } from '@angular/core';\nimport type { AXMessage, AXSystemPayload } from '../../../../models';\n\n@Component({\n selector: 'ax-conversation-system-renderer',\n imports: [CommonModule],\n template: `\n <div class=\"system-renderer\">\n <div class=\"system-icon\">\n <i [class]=\"iconClass()\"></i>\n </div>\n <div class=\"system-text\">{{ payload().text }}</div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .system-renderer {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n margin: 0.5rem 0;\n }\n\n .system-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n font-size: 0.75rem;\n opacity: 0.6;\n }\n\n .system-text {\n font-size: 0.8125rem;\n text-align: center;\n font-style: italic;\n opacity: 0.6;\n }\n `,\n ],\n})\nexport class SystemRendererComponent {\n /** Message to render */\n readonly message = input.required<AXMessage>();\n\n /** System payload */\n readonly payload = computed(() => this.message().payload as AXSystemPayload);\n\n /** Icon class based on system message type */\n readonly iconClass = computed(() => {\n const type = this.payload().eventType;\n\n switch (type) {\n case 'user_joined':\n return 'fa-light fa-user-plus';\n case 'user_left':\n return 'fa-light fa-user-minus';\n case 'title_changed':\n return 'fa-light fa-pen';\n case 'avatar_changed':\n return 'fa-light fa-image';\n default:\n return 'fa-light fa-info-circle';\n }\n });\n}\n","/**\n * Sanitizer Utility Service\n * Centralized DOM sanitization helpers for user-generated content\n */\n\nimport { Injectable, SecurityContext, inject } from '@angular/core';\nimport { DomSanitizer, SafeHtml, SafeUrl } from '@angular/platform-browser';\n\n@Injectable({ providedIn: 'root' })\nexport class AXSanitizerService {\n private readonly dom = inject(DomSanitizer);\n\n /** Sanitize HTML string, returns empty string when unsafe */\n sanitizeHtml(html: string): string {\n return this.dom.sanitize(SecurityContext.HTML, html) || '';\n }\n\n /** Sanitize and return SafeHtml for bindings expecting SafeHtml */\n safeHtml(html: string): SafeHtml {\n // We first sanitize to strip dangerous content, then bypass to mark as safe\n const sanitized = this.sanitizeHtml(html);\n return this.dom.bypassSecurityTrustHtml(sanitized);\n }\n\n /** Escape plain text into safe HTML text */\n escapeHtml(text: string): string {\n return this.dom.sanitize(SecurityContext.HTML, text) || '';\n }\n\n /** Sanitize URL for href/src usage; returns null if unsafe */\n sanitizeUrl(url: string): string | null {\n return this.dom.sanitize(SecurityContext.URL, url);\n }\n\n /** Sanitize and return SafeUrl for bindings expecting SafeUrl */\n safeUrl(url: string): SafeUrl {\n const clean = this.sanitizeUrl(url) || '';\n return this.dom.bypassSecurityTrustUrl(clean);\n }\n}\n","/**\n * Text Message Renderer Component\n * Renders text messages with link detection and formatting\n */\n\nimport { Component, computed, inject, input } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { AXSanitizerService } from '../../../../utils/sanitizer.service';\nimport { AXInfoBarService } from '../../../../components';\nimport type { AXMessage, AXTextPayload } from '../../../../models';\n\n@Component({\n selector: 'ax-conversation-text-renderer',\n template: `\n <div class=\"text-renderer\">\n <div class=\"text-content\" [innerHTML]=\"formattedText()\"></div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .text-renderer {\n word-wrap: break-word;\n overflow-wrap: break-word;\n }\n\n .text-content {\n word-break: break-word;\n text-wrap: pretty;\n white-space: pre-wrap;\n line-height: 1.6;\n font-size: 0.9375rem;\n letter-spacing: 0.01em;\n }\n\n .text-content ::ng-deep a {\n color: rgb(var(--ax-sys-color-primary-600));\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 2px;\n transition: all 0.2s;\n }\n\n .text-content ::ng-deep a:hover {\n color: rgb(var(--ax-sys-color-primary-700));\n text-decoration-thickness: 2px;\n }\n\n .text-content ::ng-deep mark {\n background: rgb(var(--ax-sys-color-warning-lightest-surface));\n padding: 0.125rem 0.375rem;\n border-radius: 0.375rem;\n font-weight: 500;\n box-shadow: 0 0 0 2px rgb(var(--ax-sys-color-warning-500) / 0.2);\n }\n `,\n ],\n})\nexport class TextRendererComponent {\n private readonly infoBarService = inject(AXInfoBarService);\n private readonly sanitizer = inject(AXSanitizerService);\n\n /** Message to render */\n readonly message = input.required<AXMessage>();\n\n /** Search query from service */\n readonly searchQuery = this.infoBarService.searchQuery;\n\n /** Formatted text with links and search highlights */\n readonly formattedText = computed((): SafeHtml => {\n const msg = this.message();\n const payload = msg.payload as AXTextPayload;\n const text = payload.text || '';\n const query = this.searchQuery();\n\n // Escape HTML first\n let escaped = this.escapeHtml(text);\n\n // Apply search highlighting if query exists\n if (query && query.trim()) {\n escaped = this.highlightSearch(escaped, query);\n }\n\n // Convert URLs to links\n const htmlContent = this.linkify(escaped);\n\n // Sanitize the HTML content and return SafeHtml\n return this.sanitizer.safeHtml(htmlContent);\n });\n\n /** Escape HTML to prevent XSS */\n private escapeHtml(text: string): string {\n // Use sanitizer utility for proper escaping\n return this.sanitizer.escapeHtml(text);\n }\n\n /** Convert URLs to clickable links */\n private linkify(text: string): string {\n const urlRegex = /(https?:\\/\\/[^\\s]+)/g;\n return text.replace(urlRegex, (url) => {\n const safeUrl = this.sanitizer.sanitizeUrl(url) || '#';\n return `<a href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">${url}</a>`;\n });\n }\n\n /** Highlight search query in text */\n private highlightSearch(text: string, query: string): string {\n const trimmedQuery = query.trim();\n if (!trimmedQuery) return text;\n\n // Create a case-insensitive regex that matches whole or partial words\n const escapedQuery = trimmedQuery.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`(${escapedQuery})`, 'gi');\n\n // Replace matches with <mark> tags\n return text.replace(regex, '<mark>$1</mark>');\n }\n}\n","/**\n * Video Message Renderer Component\n * Renders video messages with player controls\n */\n\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, PLATFORM_ID, computed, inject, input, signal } from '@angular/core';\nimport type { AXMessage, AXVideoPayload } from '../../../../models';\n\n@Component({\n selector: 'ax-conversation-video-renderer',\n imports: [CommonModule],\n template: `\n <div class=\"video-renderer\">\n @if (!showPlayer()) {\n <!-- Video Thumbnail Preview -->\n <div class=\"video-preview\" (click)=\"playVideo()\">\n @if (thumbnailUrl()) {\n <img [src]=\"thumbnailUrl()\" [alt]=\"'Video thumbnail'\" class=\"video-thumbnail\" />\n } @else {\n <div class=\"video-placeholder\">\n <span class=\"video-icon\">🎥</span>\n </div>\n }\n <div class=\"video-overlay\">\n <button type=\"button\" class=\"play-button\" aria-label=\"Play video\">▶</button>\n </div>\n @if (duration()) {\n <div class=\"video-duration\">{{ formatDuration(duration()!) }}</div>\n }\n </div>\n } @else {\n <!-- Video Player -->\n <video [src]=\"videoUrl()\" controls class=\"video-player\" (error)=\"onError()\">\n Your browser does not support the video tag.\n </video>\n }\n\n @if (error()) {\n <div class=\"video-error\">\n <span class=\"error-icon\">🎥</span>\n <span class=\"error-text\">Failed to load video</span>\n </div>\n }\n\n @if (caption()) {\n <div class=\"video-caption\">{{ caption() }}</div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .video-renderer {\n position: relative;\n max-width: 100%;\n border-radius: 0.5rem;\n overflow: hidden;\n background: rgb(var(--ax-sys-color-dark));\n }\n\n .video-preview {\n position: relative;\n cursor: pointer;\n min-height: 200px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .video-thumbnail {\n display: block;\n width: 100%;\n height: auto;\n max-height: 400px;\n object-fit: cover;\n }\n\n .video-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-height: 200px;\n background: rgb(var(--ax-sys-color-darker-surface));\n }\n\n .video-icon {\n font-size: 3rem;\n opacity: 0.5;\n }\n\n .video-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.3);\n transition: background 0.2s;\n }\n\n .video-preview:hover .video-overlay {\n background: rgba(0, 0, 0, 0.5);\n }\n\n .play-button {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-primary-400));\n border: none;\n border-radius: 50%;\n font-size: 1.5rem;\n cursor: pointer;\n transition: transform 0.2s;\n padding-left: 4px;\n }\n\n .play-button:hover {\n // transform: scale(1.1);\n }\n\n .video-duration {\n position: absolute;\n bottom: 0.5rem;\n right: 0.5rem;\n padding: 0.25rem 0.5rem;\n background: rgba(0, 0, 0, 0.7);\n color: rgb(var(--ax-sys-color-light));\n font-size: 0.75rem;\n border-radius: 0.25rem;\n }\n\n .video-player {\n display: block;\n width: 100%;\n max-height: 400px;\n outline: none;\n }\n\n .video-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-danger-lightest-surface));\n color: rgb(var(--ax-sys-color-danger-500));\n padding: 0.5rem;\n text-align: center;\n }\n\n .error-icon {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n }\n\n .error-text {\n font-size: 0.875rem;\n }\n\n .video-caption {\n padding: 0.5rem;\n font-size: 0.875rem;\n background: rgba(0, 0, 0, 0.05);\n opacity: 0.8;\n }\n `,\n ],\n})\nexport class VideoRendererComponent {\n private readonly platformId = inject(PLATFORM_ID);\n\n /** Message to render */\n readonly message = input.required<AXMessage>();\n\n /** Show video player */\n readonly showPlayer = signal(false);\n\n /** Error state */\n readonly error = signal(false);\n\n /** Video payload */\n readonly payload = computed(() => this.message().payload as AXVideoPayload);\n\n /** Video URL */\n readonly videoUrl = computed(() => this.payload().url);\n\n /** Thumbnail URL */\n readonly thumbnailUrl = computed(() => this.payload().thumbnailUrl);\n\n /** Duration in seconds */\n readonly duration = computed(() => this.payload().duration);\n\n /** Caption */\n readonly caption = computed(() => this.payload().caption);\n\n /** Play video */\n playVideo(): void {\n if (isPlatformBrowser(this.platformId)) {\n this.showPlayer.set(true);\n }\n }\n\n /** Handle video error */\n onError(): void {\n this.error.set(true);\n }\n\n /** Format duration (seconds to MM:SS) */\n formatDuration(seconds: number): string {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n }\n}\n","/**\n * Voice Message Renderer Component\n * Renders voice messages with waveform visualization\n */\n\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, ElementRef, PLATFORM_ID, computed, effect, inject, input, signal, viewChild } from '@angular/core';\nimport type { AXMessage, AXVoicePayload } from '../../../../models';\n\n@Component({\n selector: 'ax-conversation-voice-renderer',\n imports: [CommonModule],\n template: `\n <div class=\"voice-renderer\">\n <div class=\"voice-controls\">\n <!-- Play/Pause Button -->\n <button\n type=\"button\"\n class=\"play-button\"\n (click)=\"togglePlay()\"\n [attr.aria-label]=\"isPlaying() ? 'Pause' : 'Play voice message'\"\n >\n <i class=\"fa-solid\" [class.fa-pause]=\"isPlaying()\" [class.fa-play]=\"!isPlaying()\"></i>\n </button>\n\n <!-- Waveform Visualization -->\n <div class=\"voice-waveform\">\n <div class=\"waveform-bars\">\n @for (bar of waveformBars(); track $index) {\n <div class=\"waveform-bar\" [style.height.%]=\"bar\" [class.active]=\"$index < activeBarIndex()\"></div>\n }\n </div>\n </div>\n\n <div class=\"voice-box\">\n <!-- Playback Speed Button -->\n <button\n type=\"button\"\n class=\"speed-button\"\n (click)=\"cyclePlaybackSpeed()\"\n [attr.aria-label]=\"'Playback speed: ' + playbackSpeed() + 'x'\"\n >\n {{ playbackSpeed() }}x\n </button>\n <div class=\"voice-duration\">{{ currentTimeFormatted() }}</div>\n </div>\n </div>\n\n @if (error()) {\n <div class=\"voice-error\">\n <span class=\"error-text\">Failed to load voice message</span>\n </div>\n }\n\n <!-- Hidden audio element -->\n <audio #audioElement [src]=\"voiceUrl()\" (error)=\"onError()\" (timeupdate)=\"onTimeUpdate()\" (ended)=\"onEnded()\">\n Your browser does not support the audio element.\n </audio>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .voice-renderer {\n width: 100%;\n max-width: 280px;\n }\n\n .voice-controls {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem;\n background: rgb(var(--ax-sys-color-lighter-surface));\n border-radius: 1.25rem;\n }\n\n .play-button {\n flex-shrink: 0;\n padding-inline-start: 0.2rem;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n border: none;\n border-radius: 50%;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .play-button:hover {\n // transform: scale(1.05);\n background: rgb(var(--ax-sys-color-primary-600));\n }\n\n .play-button > i {\n padding-right: 1px;\n padding-top: 1px;\n }\n\n .voice-waveform {\n flex: 1;\n min-width: 0;\n }\n\n .waveform-bars {\n display: flex;\n align-items: center;\n gap: 2px;\n height: 32px;\n margin-bottom: 0.25rem;\n }\n\n .waveform-bar {\n flex: 1;\n min-width: 2px;\n background: rgb(var(--ax-sys-color-border-light-surface));\n border-radius: 2px;\n transition: all 0.2s;\n }\n\n .waveform-bar.active {\n background: rgb(var(--ax-sys-color-primary-500));\n }\n\n .voice-box {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.25rem;\n }\n\n .voice-duration {\n font-size: 0.6875rem;\n opacity: 0.7;\n text-align: right;\n color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .speed-button {\n flex-shrink: 0;\n min-width: 42px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n color: rgb(var(--ax-sys-color-primary-500));\n border: 1px solid rgb(var(--ax-sys-color-primary-500));\n border-radius: 14px;\n font-size: 0.75rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .speed-button:hover {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n }\n\n .speed-button:active {\n // transform: scale(0.95);\n }\n\n .voice-error {\n margin-top: 0.5rem;\n padding: 0.25rem;\n background: rgb(var(--ax-sys-color-danger-lightest-surface));\n color: rgb(var(--ax-sys-color-danger-500));\n border-radius: 1.25rem;\n font-size: 0.75rem;\n text-align: center;\n }\n\n audio {\n display: none;\n }\n `,\n ],\n})\nexport class VoiceRendererComponent {\n private readonly platformId = inject(PLATFORM_ID);\n\n /** Message to render */\n readonly message = input.required<AXMessage>();\n\n /** Audio element reference */\n private readonly audioElementRef = viewChild<ElementRef<HTMLAudioElement>>('audioElement');\n\n /** Playing state */\n readonly isPlaying = signal(false);\n\n /** Current time in seconds */\n readonly currentTime = signal(0);\n\n /** Duration in seconds */\n readonly duration = signal(0);\n\n /** Error state */\n readonly error = signal(false);\n\n /** Playback speed */\n readonly playbackSpeed = signal(1.0);\n\n /** Available playback speeds */\n private readonly speeds = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0];\n\n /** Voice payload */\n readonly payload = computed(() => this.message().payload as AXVoicePayload);\n\n /** Voice URL */\n readonly voiceUrl = computed(() => this.payload().url);\n\n /** Waveform data (simplified visualization) */\n readonly waveformBars = computed(() => {\n const waveform = this.payload().waveform;\n if (waveform && waveform.length > 0) {\n return waveform;\n }\n // Generate dummy waveform if not provided\n return Array.from({ length: 20 }, () => Math.random() * 60 + 40);\n });\n\n /** Active bar index based on progress */\n readonly activeBarIndex = computed(() => {\n const dur = this.duration();\n const bars = this.waveformBars().length;\n return dur > 0 ? Math.floor((this.currentTime() / dur) * bars) : 0;\n });\n\n /** Formatted current time or duration */\n readonly currentTimeFormatted = computed(() => {\n const time = this.isPlaying() ? this.currentTime() : this.duration();\n return this.formatTime(time);\n });\n\n constructor() {\n // Update duration when audio metadata loads\n effect(() => {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl && isPlatformBrowser(this.platformId)) {\n audioEl.addEventListener('loadedmetadata', () => {\n this.duration.set(audioEl.duration);\n });\n }\n });\n }\n\n /** Toggle play/pause */\n togglePlay(): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl) return;\n\n if (this.isPlaying()) {\n audioEl.pause();\n this.isPlaying.set(false);\n } else {\n audioEl.play();\n this.isPlaying.set(true);\n }\n }\n\n /** Cycle through playback speeds */\n cyclePlaybackSpeed(): void {\n const currentSpeed = this.playbackSpeed();\n const currentIndex = this.speeds.indexOf(currentSpeed);\n const nextIndex = (currentIndex + 1) % this.speeds.length;\n const nextSpeed = this.speeds[nextIndex];\n\n this.playbackSpeed.set(nextSpeed);\n\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl) {\n audioEl.playbackRate = nextSpeed;\n }\n }\n\n /** Handle time update */\n onTimeUpdate(): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl) {\n this.currentTime.set(audioEl.currentTime);\n }\n }\n\n /** Handle audio ended */\n onEnded(): void {\n this.isPlaying.set(false);\n this.currentTime.set(0);\n }\n\n /** Handle audio error */\n onError(): void {\n this.error.set(true);\n this.isPlaying.set(false);\n }\n\n /** Format time (seconds to MM:SS) */\n private formatTime(seconds: number): string {\n if (!isFinite(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n }\n}\n","/**\n * Default Message Actions Plugin\n * Individual message action constants\n */\n\nimport { AXForwardMessageDialogComponent } from '../../../components';\nimport { AXTextPayload } from '../../../models';\nimport { AXMessageAction } from '../../../registries';\n\n/**\n * Copy message text to clipboard\n */\nexport const AX_CONVERSATION_MESSAGE_COPY_ACTION: AXMessageAction = {\n id: 'copy',\n label: 'Copy',\n icon: 'fa-light fa-copy',\n priority: 80,\n visible: (message) => message.type === 'text',\n enabled: () => true,\n handler: async (context) => {\n const text = (context.message.payload as AXTextPayload).text;\n try {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n } catch {\n console.error('Failed to copy text');\n }\n },\n};\n\n/**\n * Reply to message\n */\nexport const AX_CONVERSATION_MESSAGE_REPLY_ACTION: AXMessageAction = {\n id: 'reply',\n label: 'Reply',\n icon: 'fa-light fa-reply',\n priority: 90,\n visible: () => true,\n enabled: () => true,\n handler: async (context) => {\n context.composerService.startReply(context.message);\n },\n};\n\n/**\n * Edit own message (text only)\n */\nexport const AX_CONVERSATION_MESSAGE_EDIT_ACTION: AXMessageAction = {\n id: 'edit',\n label: 'Edit',\n icon: 'fa-light fa-pen',\n priority: 80,\n visible: (message, currentUser) => message.type === 'text' && message.senderId === currentUser.id,\n enabled: (message, currentUser) => message.senderId === currentUser.id,\n handler: async (context) => {\n context.composerService.startEdit(context.message);\n },\n};\n\n/**\n * Delete own message\n */\nexport const AX_CONVERSATION_MESSAGE_DELETE_ACTION: AXMessageAction = {\n id: 'delete',\n label: 'Delete',\n icon: 'fa-light fa-trash',\n priority: 70,\n destructive: true,\n visible: (message, currentUser) => message.senderId === currentUser.id,\n enabled: (message, currentUser) => message.senderId === currentUser.id,\n handler: async (context) => {\n await context.conversationService.deleteMessage(context.message.id, false);\n },\n};\n\n/**\n * Forward message to another conversation\n */\nexport const AX_CONVERSATION_MESSAGE_FORWARD_ACTION: AXMessageAction = {\n id: 'forward',\n label: 'Forward',\n icon: 'fa-light fa-share',\n priority: 75,\n visible: () => true,\n enabled: () => true,\n handler: async (context) => {\n // Open forward dialog\n await context.conversationService.popupService.open(AXForwardMessageDialogComponent, {\n title: 'Forward Message',\n size: 'sm',\n closeButton: true,\n data: {\n conversationService: context.conversationService,\n message: context.message,\n },\n });\n },\n};\n","/**\n * Default Message Renderers Plugin\n * Provides standard message type renderers (text, image, video, etc.)\n */\nimport type { AXMessageRenderer } from '../../../registries/message-renderer.registry';\nimport {\n AudioRendererComponent,\n ContactRendererComponent,\n FallbackRendererComponent,\n FileRendererComponent,\n ImageRendererComponent,\n LocationRendererComponent,\n StickerRendererComponent,\n SystemRendererComponent,\n TextRendererComponent,\n VideoRendererComponent,\n VoiceRendererComponent,\n} from '../components';\n\n// Individual renderer constants (no aggregate arrays)\nexport const AX_CONVERSATION_TEXT_RENDERER: AXMessageRenderer = {\n type: 'text',\n component: TextRendererComponent,\n canHandle: (message) => message.type === 'text',\n capabilities: {\n supportsReactions: true,\n supportsReplies: true,\n supportsEdit: true,\n supportsForward: true,\n supportsSelection: true,\n },\n displayName: 'Text',\n icon: 'fa-light fa-font',\n};\n\nexport const AX_CONVERSATION_IMAGE_RENDERER: AXMessageRenderer = {\n type: 'image',\n component: ImageRendererComponent,\n canHandle: (message) => message.type === 'image',\n capabilities: {\n supportsReactions: true,\n supportsReplies: true,\n supportsEdit: false,\n supportsForward: true,\n supportsSelection: true,\n },\n displayName: 'Image',\n icon: 'fa-light fa-image',\n};\n\nexport const AX_CONVERSATION_VIDEO_RENDERER: AXMessageRenderer = {\n type: 'video',\n component: VideoRendererComponent,\n canHandle: (message) => message.type === 'video',\n capabilities: {\n supportsReactions: true,\n supportsReplies: true,\n supportsEdit: false,\n supportsForward: true,\n supportsSelection: true,\n },\n displayName: 'Video',\n icon: 'fa-light fa-video',\n};\n\nexport const AX_CONVERSATION_AUDIO_RENDERER: AXMessageRenderer = {\n type: 'audio',\n component: AudioRendererComponent,\n canHandle: (message) => message.type === 'audio',\n capabilities: {\n supportsReactions: true,\n supportsReplies: true,\n supportsEdit: false,\n supportsForward: true,\n supportsSelection: true,\n },\n displayName: 'Audio',\n icon: 'fa-light fa-music',\n};\n\nexport const AX_CONVERSATION_VOICE_RENDERER: AXMessageRenderer = {\n type: 'voice',\n component: VoiceRendererComponent,\n canHandle: (message) => message.type === 'voice',\n capabilities: {\n supportsReactions: true,\n supportsReplies: true,\n supportsEdit: false,\n supportsForward: true,\n supportsSelection: true,\n },\n displayName: 'Voice',\n icon: 'fa-light fa-microphone',\n};\n\nexport const AX_CONVERSATION_FILE_RENDERER: AXMessageRenderer = {\n type: 'file',\n component: FileRendererComponent,\n canHandle: (message) => message.type === 'file',\n capabilities: {\n supportsReactions: true,\n supportsReplies: true,\n supportsEdit: false,\n supportsForward: true,\n supportsSelection: true,\n },\n displayName: 'File',\n icon: 'fa-light fa-file',\n};\n\nexport const AX_CONVERSATION_LOCATION_RENDERER: AXMessageRenderer = {\n type: 'location',\n component: LocationRendererComponent,\n canHandle: (message) => message.type === 'location',\n capabilities: {\n supportsReactions: true,\n supportsReplies: true,\n supportsEdit: false,\n supportsForward: true,\n supportsSelection: true,\n },\n displayName: 'Location',\n icon: 'fa-light fa-location-dot',\n};\n\nexport const AX_CONVERSATION_STICKER_RENDERER: AXMessageRenderer = {\n type: 'sticker',\n component: StickerRendererComponent,\n canHandle: (message) => message.type === 'sticker',\n capabilities: {\n supportsReactions: true,\n supportsReplies: true,\n supportsEdit: false,\n supportsForward: true,\n supportsSelection: true,\n },\n displayName: 'Sticker',\n icon: 'fa-light fa-note-sticky',\n};\n\nexport const AX_CONVERSATION_CONTACT_RENDERER: AXMessageRenderer = {\n type: 'contact',\n component: ContactRendererComponent,\n canHandle: (message) => message.type === 'contact',\n capabilities: {\n supportsReactions: true,\n supportsReplies: true,\n supportsEdit: false,\n supportsForward: true,\n supportsSelection: true,\n },\n displayName: 'Contact',\n icon: 'fa-light fa-address-card',\n};\n\nexport const AX_CONVERSATION_SYSTEM_RENDERER: AXMessageRenderer = {\n type: 'system',\n component: SystemRendererComponent,\n canHandle: (message) => message.type === 'system',\n capabilities: {\n supportsReactions: false,\n supportsReplies: false,\n supportsEdit: false,\n supportsForward: false,\n supportsSelection: false,\n },\n displayName: 'System',\n icon: 'fa-light fa-info-circle',\n};\n\n// Fallback renderer (catch-all) - keep last when assembling\nexport const AX_CONVERSATION_FALLBACK_RENDERER: AXMessageRenderer = {\n type: 'fallback',\n component: FallbackRendererComponent,\n canHandle: () => true,\n capabilities: {\n supportsReactions: false,\n supportsReplies: false,\n supportsEdit: false,\n supportsForward: false,\n supportsSelection: false,\n },\n displayName: 'Unknown',\n icon: 'fa-light fa-question-circle',\n};\n","/**\n * Default Conversation Item Actions Plugin\n * Individual action constants with AX_ prefix naming convention\n */\n\nimport { AXConversationItemAction } from '../../../registries';\n\n/**\n * Mute/Unmute conversation notifications\n */\nexport const AX_CONVERSATION_ITEM_MUTE_ACTION: AXConversationItemAction = {\n id: 'mute',\n label: (context) => (context.conversation.settings?.notifications === false ? 'Unmute' : 'Mute'),\n icon: (context) =>\n context.conversation.settings?.notifications === false ? 'fa-light fa-bell-slash' : 'fa-light fa-bell',\n tooltip: 'Toggle notifications',\n priority: 100,\n handler: async (context) => {\n if (context.conversationService) {\n const currentNotifications = context.conversation.settings?.notifications ?? true;\n await context.conversationService.updateConversationSettings(context.conversation.id, {\n notifications: !currentNotifications,\n });\n }\n },\n};\n\n/**\n * Pin/Unpin conversation to top\n */\nexport const AX_CONVERSATION_ITEM_PIN_ACTION: AXConversationItemAction = {\n id: 'pin',\n label: (context) => (context.conversation.pinned ? 'Unpin' : 'Pin'),\n icon: (context) => (context.conversation.pinned ? 'fa-light fa-thumbtack' : 'fa-regular fa-thumbtack'),\n tooltip: 'Pin conversation',\n priority: 90,\n handler: async (context) => {\n if (context.conversationService) {\n const currentPinned = context.conversation.pinned;\n await context.conversationService.updateConversation(context.conversation.id, {\n pinned: !currentPinned,\n });\n }\n },\n};\n\n/**\n * Mark conversation as read\n */\nexport const AX_CONVERSATION_ITEM_MARK_READ_ACTION: AXConversationItemAction = {\n id: 'mark-read',\n label: 'Mark as Read',\n icon: 'fa-light fa-envelope-open',\n tooltip: 'Mark conversation as read',\n priority: 80,\n visible: (context) => (context.conversation.unreadCount ?? 0) > 0,\n handler: async (context) => {\n if (context.conversationService) {\n await context.conversationService.markConversationAsRead(context.conversation.id);\n }\n },\n};\n\n/**\n * Divider separator before destructive actions\n */\nexport const AX_CONVERSATION_ITEM_DIVIDER: AXConversationItemAction = {\n id: 'divider-1',\n label: '',\n divider: true,\n priority: 60,\n};\n\n/**\n * Delete/Leave conversation action (smart action that adapts based on conversation type)\n * - Private: \"Delete\" - Deletes the conversation\n * - Group/Channel: \"Leave & Delete\" - Leaves the group and removes it from list\n */\nexport const AX_CONVERSATION_ITEM_DELETE_ACTION: AXConversationItemAction = {\n id: 'delete',\n label: (context) => {\n const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n return isGroup ? 'Leave & Delete' : 'Delete';\n },\n icon: (context) => {\n const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n return isGroup ? 'fa-light fa-door-open' : 'fa-light fa-trash';\n },\n tooltip: (context) => {\n const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n return isGroup ? 'Leave and delete this group' : 'Delete this conversation';\n },\n destructive: true,\n priority: 50,\n handler: async (context) => {\n if (context.conversationService) {\n // Service handles confirmation dialog\n await context.conversationService.deleteConversation(context.conversation.id);\n }\n },\n};\n\n/**\n * Block/Unblock user (private conversations only)\n */\nexport const AX_CONVERSATION_ITEM_BLOCK_ACTION: AXConversationItemAction = {\n id: 'block',\n label: (context) => (context.conversation.blocked ? 'Unblock' : 'Block'),\n icon: 'fa-light fa-ban',\n tooltip: 'Block this conversation',\n destructive: true,\n priority: 40,\n visible: (context) => context.conversation.type === 'private',\n handler: async (context) => {\n if (context.conversationService) {\n const currentBlocked = context.conversation.blocked;\n await context.conversationService.updateConversation(context.conversation.id, {\n blocked: !currentBlocked,\n });\n }\n },\n};\n\n/**\n * Get all default conversation item actions\n * @deprecated Use individual action constants instead (e.g., AX_CONVERSATION_ITEM_MUTE_ACTION)\n */\nexport function getDefaultConversationItemActions(): AXConversationItemAction[] {\n return [\n AX_CONVERSATION_ITEM_MUTE_ACTION,\n AX_CONVERSATION_ITEM_PIN_ACTION,\n AX_CONVERSATION_ITEM_MARK_READ_ACTION,\n AX_CONVERSATION_ITEM_DIVIDER,\n AX_CONVERSATION_ITEM_DELETE_ACTION,\n AX_CONVERSATION_ITEM_BLOCK_ACTION,\n ];\n}\n","/**\n * Default Conversation Tabs Plugin\n * Provides sidebar conversation filter tabs (all, private, groups, etc.)\n */\n\nimport { AXConversationTab } from '../../../registries';\n\n// Individual conversation tab constants (no aggregate arrays)\nexport const AX_CONVERSATION_TAB_ALL: AXConversationTab = {\n id: 'all',\n label: 'All',\n icon: 'chat',\n priority: 100,\n filter: (conversations) => conversations,\n badge: (conversations) => conversations.length || undefined,\n default: true,\n};\n\nexport const AX_CONVERSATION_TAB_PRIVATE: AXConversationTab = {\n id: 'private',\n label: 'Private',\n icon: 'person',\n priority: 90,\n filter: (conversations) => conversations.filter((c) => c.type === 'private'),\n badge: (conversations) => conversations.filter((c) => c.type === 'private').length || undefined,\n};\n\nexport const AX_CONVERSATION_TAB_GROUPS: AXConversationTab = {\n id: 'groups',\n label: 'Groups',\n icon: 'group',\n priority: 80,\n filter: (conversations) => conversations.filter((c) => c.type === 'group'),\n badge: (conversations) => conversations.filter((c) => c.type === 'group').length || undefined,\n};\n\nexport const AX_CONVERSATION_TAB_CHANNELS: AXConversationTab = {\n id: 'channels',\n label: 'Channels',\n icon: 'campaign',\n priority: 70,\n filter: (conversations) => conversations.filter((c) => c.type === 'channel'),\n badge: (conversations) => conversations.filter((c) => c.type === 'channel').length || undefined,\n};\n\nexport const AX_CONVERSATION_TAB_UNREAD: AXConversationTab = {\n id: 'unread',\n label: 'Unread',\n icon: 'mark_chat_unread',\n priority: 60,\n filter: (conversations) => conversations.filter((c) => c.unreadCount > 0),\n badge: (conversations) => {\n const unreadCount = conversations.reduce((sum, c) => sum + c.unreadCount, 0);\n return unreadCount || undefined;\n },\n};\n\nexport const AX_CONVERSATION_TAB_ARCHIVED: AXConversationTab = {\n id: 'archived',\n label: 'Archived',\n icon: 'archive',\n priority: 50,\n filter: (conversations) => conversations.filter((c) => c.archived),\n badge: (conversations) => conversations.filter((c) => c.archived).length || undefined,\n enabled: false, // Disabled by default\n};\n","/**\n * Conversation Tabs Plugins\n */\n\nexport * from './default-tabs.plugin';\n","/**\n * Message Renderer Registry\n * Register custom message renderers for different message types\n */\n\nimport { computed, inject, Injectable, signal, Type } from '@angular/core';\nimport type { AXMessage } from '../models';\nimport {\n AX_CONVERSATION_FALLBACK_RENDERER,\n AX_CONVERSATION_SYSTEM_RENDERER,\n AX_CONVERSATION_TEXT_RENDERER,\n} from '../plugins';\nimport { DEFAULT_MESSAGE_RENDERERS, REGISTRY_CONFIG } from '../tokens';\n\n/**\n * Message renderer capabilities\n */\nexport interface AXMessageRendererCapabilities {\n /** Supports reactions */\n supportsReactions: boolean;\n\n /** Supports replies */\n supportsReplies: boolean;\n\n /** Supports editing */\n supportsEdit: boolean;\n\n /** Supports forwarding */\n supportsForward: boolean;\n\n /** Supports selection */\n supportsSelection: boolean;\n\n /** Custom capabilities */\n custom?: Record<string, boolean>;\n}\n\n/**\n * Message renderer registration\n */\nexport interface AXMessageRenderer {\n /** Unique type identifier */\n type: string;\n\n /** Angular component to render this message type */\n component: Type<any>;\n\n /** Function to determine if this renderer can handle a message */\n canHandle: (message: AXMessage) => boolean;\n\n /** Renderer capabilities */\n capabilities: AXMessageRendererCapabilities;\n\n /** Display name */\n displayName?: string;\n\n /** Icon name/class */\n icon?: string;\n}\n\n/**\n * Message Renderer Registry Service\n */\n@Injectable()\nexport class AXMessageRendererRegistry {\n private readonly _renderers = signal<AXMessageRenderer[]>([]);\n\n constructor() {\n // Register built-in default renderers text, system, fallback\n const builtInRenderers = [\n AX_CONVERSATION_TEXT_RENDERER,\n AX_CONVERSATION_SYSTEM_RENDERER,\n AX_CONVERSATION_FALLBACK_RENDERER,\n ];\n builtInRenderers.forEach((renderer) => this.register(renderer));\n\n // Register additional renderers from token (optional)\n const defaultRenderers = inject(DEFAULT_MESSAGE_RENDERERS, { optional: true });\n defaultRenderers?.forEach((renderer) => this.register(renderer));\n\n // Register renderers from REGISTRY_CONFIG (optional)\n const config = inject(REGISTRY_CONFIG, { optional: true });\n config?.messageRenderers?.forEach((renderer) => this.register(renderer));\n }\n\n /** All registered renderers */\n readonly renderers = this._renderers.asReadonly();\n\n /** Renderers sorted by priority (highest first) */\n readonly sortedRenderers = computed(() => [...this._renderers()]);\n\n /**\n * Register a message renderer\n */\n register(renderer: AXMessageRenderer): void {\n // Validate renderer\n if (!renderer.type) {\n throw new Error('Message renderer must have a type');\n }\n if (!renderer.component) {\n throw new Error('Message renderer must have a component');\n }\n if (!renderer.canHandle) {\n throw new Error('Message renderer must have a canHandle function');\n }\n\n // Check for duplicates\n const existing = this._renderers().find((r) => r.type === renderer.type);\n if (existing) {\n console.warn(`Message renderer for type \"${renderer.type}\" is already registered. Replacing...`);\n this.unregister(renderer.type);\n }\n\n // Add to registry\n this._renderers.update((renderers) => [...renderers, renderer]);\n }\n\n /**\n * Unregister a message renderer by type\n */\n unregister(type: string): void {\n this._renderers.update((renderers) => renderers.filter((r) => r.type !== type));\n }\n\n /**\n * Get renderer for a specific message\n */\n getRenderer(message: AXMessage): AXMessageRenderer | undefined {\n const sorted = this.sortedRenderers();\n // return sorted.find((renderer) => renderer.canHandle(message));\n return sorted.find((renderer) => renderer.type === message.type);\n }\n\n /**\n * Get renderer by type\n */\n getRendererByType(type: string): AXMessageRenderer | undefined {\n return this._renderers().find((r) => r.type === type);\n }\n\n /**\n * Check if a message type is supported\n */\n isSupported(message: AXMessage): boolean {\n return this.getRenderer(message) !== undefined;\n }\n\n /**\n * Get all registered types\n */\n getTypes(): string[] {\n return this._renderers().map((r) => r.type);\n }\n\n /**\n * Clear all renderers\n */\n clear(): void {\n this._renderers.set([]);\n }\n}\n","/**\n * Registry Service\n * Central service for managing all registries and extensions\n */\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXComposerActionRegistry } from '../registries/composer-action.registry';\nimport { AXComposerTabRegistry } from '../registries/composer-tab.registry';\nimport { AXConversationItemActionRegistry } from '../registries/conversation-item-action.registry';\nimport { AXConversationTabRegistry } from '../registries/conversation-tab.registry';\nimport { AXInfoBarActionRegistry } from '../registries/info-bar-action.registry';\nimport { AXMessageActionRegistry } from '../registries/message-action.registry';\nimport { AXMessageRendererRegistry } from '../registries/message-renderer.registry';\n\n/**\n * Central Registry Service\n * Provides unified access to all registries\n * \n * This service is now pure - all default features are plugins.\n * Use tokens to register plugins in your app configuration.\n */\n@Injectable()\nexport class AXRegistryService {\n /** Message renderer registry */\n readonly messageRenderers = inject(AXMessageRendererRegistry);\n\n /** Message action registry */\n readonly messageActions = inject(AXMessageActionRegistry);\n\n /** Composer tab registry */\n readonly composerTabs = inject(AXComposerTabRegistry);\n\n /** Composer action registry */\n readonly composerActions = inject(AXComposerActionRegistry);\n\n /** Conversation tab registry */\n readonly conversationTabs = inject(AXConversationTabRegistry);\n\n /** Info bar action registry */\n readonly infoBarActions = inject(AXInfoBarActionRegistry);\n\n /** Conversation item action registry */\n readonly conversationItemActions = inject(AXConversationItemActionRegistry);\n\n /**\n * Clear all registries\n */\n clearAll(): void {\n this.messageRenderers.clear();\n this.messageActions.clear();\n this.composerTabs.clear();\n this.composerActions.clear();\n this.conversationTabs.clear();\n this.infoBarActions.clear();\n this.conversationItemActions.clear();\n }\n}\n","/**\n * Conversation Service\n * Main service for managing conversations, messages, and real-time updates\n *\n * All operations include comprehensive error handling with try-catch blocks\n */\n\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { catchError, EMPTY, of, Subject, takeUntil } from 'rxjs';\nimport type {\n AXConversation,\n AXMessage,\n AXMessagePayload,\n AXPresenceUpdate,\n AXSendMessageCommand,\n AXTypingIndicator,\n} from '../models';\nimport { CONVERSATION_CONFIG } from '../tokens';\nimport {\n validateConversationId,\n validateMessagePayload,\n validateMessageText,\n validateMessageType,\n} from '../utils/validation.utils';\nimport { AXConversationApi, AXMessageApi, AXRealtimeApi, AXUserApi } from './api';\nimport { AXConversationStoreService } from './conversation-store.service';\nimport { AXErrorHandlerService } from './error-handler.service';\nimport { AXRegistryService } from './registry.service';\n\n/**\n * Main Conversation Service\n *\n * This service orchestrates all conversation operations with:\n * - Comprehensive error handling\n * - Real-time event subscriptions\n * - Optimistic UI updates\n * - Automatic rollback on failures\n */\n@Injectable()\nexport class AXConversationService {\n private readonly config = inject(CONVERSATION_CONFIG);\n\n // New separated APIs\n readonly userApi = inject(AXUserApi);\n readonly conversationApi = inject(AXConversationApi);\n readonly messageApi = inject(AXMessageApi);\n readonly realtimeApi = inject(AXRealtimeApi, { optional: true });\n\n private readonly store = inject(AXConversationStoreService);\n private readonly errorHandler = inject(AXErrorHandlerService);\n readonly dialogService = inject(AXDialogService);\n readonly popupService = inject(AXPopupService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly destroy$ = new Subject<void>();\n\n /** Registry service - exposed for child services */\n readonly registry = inject(AXRegistryService);\n\n // State signals\n private readonly _activeConversationId = signal<string | null>(null);\n private readonly _loading = signal<boolean>(false);\n private readonly _error = signal<Error | null>(null);\n\n // Request cancellation tracking\n private readonly activeRequests = new Map<string, AbortController>();\n\n // Message queue for preventing race conditions\n private readonly messageQueue = new Map<string, AXSendMessageCommand>();\n private processingQueue = false;\n\n // Event subjects\n private readonly _messageReceived$ = new Subject<AXMessage>();\n private readonly _messageUpdated$ = new Subject<AXMessage>();\n private readonly _messageDeleted$ = new Subject<string>();\n private readonly _typingIndicator$ = new Subject<AXTypingIndicator>();\n private readonly _presenceUpdate$ = new Subject<AXPresenceUpdate>();\n\n /** All conversations */\n readonly conversations = this.store.conversations;\n\n /** Active conversation ID */\n readonly activeConversationId = this._activeConversationId.asReadonly();\n\n /** Active conversation */\n readonly activeConversation = computed(() => {\n const id = this._activeConversationId();\n return id ? this.store.getConversation(id) : null;\n });\n\n /** Messages for active conversation */\n readonly activeMessages = computed(() => {\n const convId = this._activeConversationId();\n return convId ? this.store.getConversationMessages(convId) : [];\n });\n\n /** Loading state */\n readonly loading = this._loading.asReadonly();\n\n /** Error state */\n readonly error = this._error.asReadonly();\n\n /** Connection status */\n readonly connectionStatus$ = this.realtimeApi?.connectionStatus$ ?? of<'disconnected'>('disconnected');\n\n /** Error stream */\n readonly errors$ = this.errorHandler.errors$;\n\n // Event observables\n readonly onMessageReceived = this._messageReceived$.asObservable();\n readonly onMessageUpdated = this._messageUpdated$.asObservable();\n readonly onMessageDeleted = this._messageDeleted$.asObservable();\n readonly onTypingIndicator = this._typingIndicator$.asObservable();\n readonly onPresenceChange = this._presenceUpdate$.asObservable();\n\n // Message count refresh event (emits messageId when counts need refresh)\n private readonly _messageCountRefresh$ = new Subject<{ messageId: string; type: 'reply' | 'forward' }>();\n readonly onMessageCountRefresh = this._messageCountRefresh$.asObservable();\n\n // Current user cache\n private _currentUser = signal<Awaited<ReturnType<typeof this.userApi.getCurrentUser>> | null>(null);\n readonly currentUser = this._currentUser.asReadonly();\n\n constructor() {\n // Register cleanup on destroy\n this.destroyRef.onDestroy(() => {\n this.destroy$.next();\n this.destroy$.complete();\n });\n\n this.initializeService();\n }\n\n /**\n * Initialize the service\n * Connects to API and loads initial data\n */\n private async initializeService(): Promise<void> {\n try {\n // Initialize store\n await this.store.initialize();\n\n // Connect to real-time API (optional)\n if (this.realtimeApi) {\n await this.realtimeApi.connect();\n }\n\n // Load current user\n const currentUser = await this.userApi.getCurrentUser();\n this._currentUser.set(currentUser);\n\n // Subscribe to real-time events\n this.subscribeToEvents();\n\n // Load initial data\n await this.loadConversations();\n } catch (error) {\n const handledError = this.errorHandler.handle(error, 'initializeService');\n this._error.set(new Error(handledError.message));\n }\n }\n\n /**\n * Subscribe to real-time events\n * All subscriptions include error handling to prevent stream termination\n */\n private subscribeToEvents(): void {\n // Skip if realtime API is not provided\n if (!this.realtimeApi) {\n return;\n }\n // Subscribe to message updates\n this.realtimeApi\n .subscribeToMessageUpdates()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToMessageUpdates');\n return EMPTY; // Keep subscription alive\n }),\n )\n .subscribe((message) => {\n this.handleMessageUpdate(message);\n this._messageUpdated$.next(message);\n\n // Check if this is a reply or forward and refresh counts\n this.handleMessageCountUpdate(message);\n });\n\n // Subscribe to message deletions\n this.realtimeApi\n .subscribeToMessageDeletions()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToMessageDeletions');\n return EMPTY;\n }),\n )\n .subscribe((messageId) => {\n this.handleMessageDeletion(messageId);\n this._messageDeleted$.next(messageId);\n });\n\n // Subscribe to typing indicators\n this.realtimeApi\n .subscribeToTypingIndicators('')\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToTypingIndicators');\n return EMPTY;\n }),\n )\n .subscribe((indicator) => {\n this.handleTypingIndicator(indicator);\n this._typingIndicator$.next(indicator);\n });\n\n // Subscribe to presence updates\n this.realtimeApi\n .subscribeToPresenceUpdates()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToPresenceUpdates');\n return EMPTY;\n }),\n )\n .subscribe((update) => {\n this.handlePresenceUpdate(update);\n this._presenceUpdate$.next(update);\n });\n\n // Subscribe to conversation updates (for badge updates, last message, etc.)\n this.realtimeApi\n .subscribeToConversationUpdates()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToConversationUpdates');\n return EMPTY;\n }),\n )\n .subscribe((conversation) => {\n this.handleConversationUpdate(conversation);\n });\n }\n\n /**\n * Load conversations from server\n * Includes comprehensive error handling\n */\n async loadConversations(): Promise<void> {\n this._loading.set(true);\n this._error.set(null);\n\n try {\n const result = await this.conversationApi.getConversations(\n {\n page: 0,\n pageSize: this.config.conversationPageSize,\n },\n undefined,\n );\n\n // Store conversations\n this.store.setConversations(result.items);\n } catch (error) {\n const handledError = this.errorHandler.handle(error, 'loadConversations');\n this._error.set(new Error(handledError.message));\n } finally {\n this._loading.set(false);\n }\n }\n\n /**\n * Load more conversations (pagination)\n * Returns true if there are more pages available\n */\n async loadMoreConversations(page: number): Promise<boolean> {\n try {\n const result = await this.conversationApi.getConversations(\n {\n page,\n pageSize: this.config.conversationPageSize,\n },\n undefined,\n );\n\n // Append new conversations to existing ones\n if (result.items.length > 0) {\n this.store.addConversations(result.items);\n }\n\n return result.hasMore;\n } catch (error) {\n this.errorHandler.handle(error, 'loadMoreConversations', { page });\n return false;\n }\n }\n\n /**\n * Select a conversation\n * Loads messages and subscribes to real-time updates\n * Note: Messages are now marked as read individually via intersection observer when viewed\n */\n async selectConversation(conversationId: string): Promise<void> {\n try {\n this._activeConversationId.set(conversationId);\n\n // Load messages for this conversation\n await this.loadMessages(conversationId);\n\n // Subscribe to new messages with error handling (only if realtime is available)\n if (this.realtimeApi) {\n this.realtimeApi\n .subscribeToMessages(conversationId)\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToMessages', { conversationId });\n return EMPTY;\n }),\n )\n .subscribe((message) => {\n this.handleNewMessage(message);\n this._messageReceived$.next(message);\n });\n }\n } catch (error) {\n this.errorHandler.handle(error, 'selectConversation', { conversationId });\n throw error; // Re-throw to notify caller\n }\n }\n\n closeActiveConversation() {\n if (this._activeConversationId()) {\n this._activeConversationId.set(null);\n }\n }\n\n /**\n * Load messages for a conversation\n * Fetches messages from server with request cancellation support\n */\n async loadMessages(conversationId: string, page = 0): Promise<AXMessage[]> {\n // Cancel previous request for this conversation\n const requestKey = `loadMessages-${conversationId}`;\n const prevController = this.activeRequests.get(requestKey);\n if (prevController) {\n prevController.abort();\n }\n\n const controller = new AbortController();\n this.activeRequests.set(requestKey, controller);\n\n try {\n // Fetch from server\n const result = await this.messageApi.getMessages(conversationId, {\n page,\n pageSize: this.config.messagePageSize,\n });\n\n this.store.addMessages(result.items);\n return result.items;\n } catch (error) {\n // Don't handle aborted requests as errors\n if ((error as Error).name === 'AbortError') {\n return [];\n }\n this.errorHandler.handle(error, 'loadMessages', { conversationId, page });\n return []; // Return empty array on failure\n } finally {\n this.activeRequests.delete(requestKey);\n }\n }\n\n /**\n * Send a message\n * Uses optimistic UI updates - message appears immediately\n * Improved with better temp ID generation to prevent collisions\n */\n async sendMessage(command: AXSendMessageCommand): Promise<void> {\n // Validate message content before sending\n this.validateMessageContent(command);\n\n // Generate unique temp ID using crypto.randomUUID if available, otherwise fallback\n const tempMessageId =\n command.tempId ||\n (typeof crypto !== 'undefined' && crypto.randomUUID\n ? `temp-${crypto.randomUUID()}`\n : `temp-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`);\n\n try {\n // Create temporary message for optimistic UI\n const tempMessage: AXMessage = {\n id: tempMessageId,\n conversationId: command.conversationId,\n senderId: this._currentUser()?.id ?? 'current-user',\n type: command.type,\n timestamp: new Date(),\n payload: command.payload,\n status: 'sending',\n reactions: [],\n isLocal: true,\n forwarded: command.forwarded,\n forwardedFrom: command.forwardedFrom,\n metadata: command.metadata,\n };\n\n // Add to store immediately (optimistic update)\n this.store.addMessage(tempMessage);\n\n // Send to server\n const sentMessage = await this.messageApi.sendMessage(command);\n\n // Replace temporary message with real one\n this.store.deleteMessage(tempMessageId);\n this.store.addMessage(sentMessage);\n\n // Update conversation's last message\n this.updateConversationLastMessage(sentMessage);\n\n // Emit forward count update if this is a forwarded message\n if (sentMessage.forwarded && sentMessage.forwardedFrom?.messageId) {\n this._messageCountRefresh$.next({\n messageId: sentMessage.forwardedFrom.messageId,\n type: 'forward',\n });\n }\n } catch (error) {\n // Mark temp message as failed\n this.store.updateMessage(tempMessageId, { status: 'failed' });\n\n this.errorHandler.handle(error, 'sendMessage', {\n conversationId: command.conversationId,\n type: command.type,\n });\n throw error; // Re-throw to notify caller\n }\n }\n\n /**\n * Retry a failed message\n */\n async retryFailedMessage(messageId: string): Promise<void> {\n const message = this.store.getMessage(messageId);\n if (!message || message.status !== 'failed') {\n return;\n }\n\n // Update status to sending\n this.store.updateMessage(messageId, { status: 'sending' });\n\n try {\n // Recreate command from message\n const command: AXSendMessageCommand = {\n conversationId: message.conversationId,\n type: message.type,\n payload: message.payload,\n tempId: messageId,\n forwarded: message.forwarded,\n forwardedFrom: message.forwardedFrom,\n metadata: message.metadata,\n };\n\n // Send to server\n const sentMessage = await this.messageApi.sendMessage(command);\n\n // Replace with real message\n this.store.deleteMessage(messageId);\n this.store.addMessage(sentMessage);\n\n // Update conversation's last message\n this.updateConversationLastMessage(sentMessage);\n } catch (error) {\n // Mark as failed again\n this.store.updateMessage(messageId, { status: 'failed' });\n this.errorHandler.handle(error, 'retryFailedMessage', { messageId });\n throw error;\n }\n }\n\n /**\n * Edit a message\n * Updates message locally and syncs with server\n */\n async editMessage(messageId: string, payload: AXMessagePayload): Promise<void> {\n // Store original message for rollback\n const originalMessage = this.store.getMessage(messageId);\n\n try {\n // Optimistic update\n this.store.updateMessage(messageId, {\n payload,\n editedAt: new Date(),\n });\n\n // Sync with server\n await this.messageApi.editMessage(messageId, payload);\n } catch (error) {\n // Rollback on failure\n if (originalMessage) {\n this.store.updateMessage(messageId, {\n payload: originalMessage.payload,\n editedAt: originalMessage.editedAt,\n });\n }\n\n this.errorHandler.handle(error, 'editMessage', { messageId });\n throw error;\n }\n }\n\n /**\n * Delete a message\n * Shows confirmation dialog, then deletes locally first (optimistic), then syncs with server\n */\n async deleteMessage(messageId: string, forEveryone = false): Promise<void> {\n // Show confirmation dialog\n const result = await this.dialogService.confirm(\n 'Delete Message',\n forEveryone ? 'Delete this message for everyone?' : 'Delete this message?',\n 'danger',\n 'vertical',\n false,\n );\n\n // User cancelled\n if (!result.result) {\n return;\n }\n\n // Store message for rollback\n const message = this.store.getMessage(messageId);\n\n try {\n // Optimistic delete\n this.store.deleteMessage(messageId);\n\n // Sync with server\n await this.messageApi.deleteMessage(messageId, forEveryone);\n } catch (error) {\n // Rollback on failure\n if (message) {\n this.store.addMessage(message);\n }\n\n this.errorHandler.handle(error, 'deleteMessage', { messageId, forEveryone });\n throw error;\n }\n }\n\n /**\n * React to a message\n * Adds reaction optimistically, server update comes via subscription\n */\n async reactToMessage(messageId: string, emoji: string): Promise<void> {\n try {\n await this.messageApi.addReaction(messageId, emoji);\n // Update will come through subscribeToMessageUpdates\n } catch (error) {\n this.errorHandler.handle(error, 'reactToMessage', { messageId, emoji });\n throw error;\n }\n }\n\n /**\n * Get available reaction emojis from API\n * Returns default reactions on error\n */\n async getAvailableReactions(): Promise<string[]> {\n try {\n return await this.messageApi.getAvailableReactions();\n } catch (error) {\n this.errorHandler.handle(error, 'getAvailableReactions');\n // Return default reactions on error (consistent with other methods)\n return ['👍', '❤️', '😂', '😮', '😢', '🙏'];\n }\n }\n\n /**\n * Mark a single message as read\n * Updates message status locally and syncs with server\n */\n async markMessageAsRead(messageId: string): Promise<void> {\n const message = this.store.getMessage(messageId);\n if (!message || message.status === 'read') return;\n\n try {\n // Optimistic update\n this.store.updateMessage(messageId, { status: 'read' });\n\n // Sync with server\n await this.messageApi.markAsRead(message.conversationId, [messageId]);\n\n // Update conversation unread count\n const conversation = this.store.getConversation(message.conversationId);\n if (conversation && conversation.unreadCount > 0) {\n this.store.updateConversation(message.conversationId, {\n unreadCount: Math.max(0, conversation.unreadCount - 1),\n });\n }\n } catch (error) {\n // Rollback on failure\n this.store.updateMessage(messageId, { status: message.status });\n this.errorHandler.handle(error, 'markMessageAsRead', { messageId });\n // Don't throw - marking as read failure shouldn't break the app\n }\n }\n\n /**\n * Mark conversation as read\n * Marks messages locally and syncs with server\n */\n async markAsRead(conversationId: string): Promise<void> {\n const messages = this.store.getConversationMessages(conversationId);\n const currentId = this._currentUser()?.id ?? 'current-user';\n const unreadMessageIds = messages.filter((m) => m.status !== 'read' && m.senderId !== currentId).map((m) => m.id);\n\n if (unreadMessageIds.length === 0) return;\n\n try {\n // Optimistic update\n this.store.resetUnreadCount(conversationId);\n\n // Sync with server\n await this.messageApi.markAsRead(conversationId, unreadMessageIds);\n } catch (error) {\n // Rollback on failure\n this.store.updateConversation(conversationId, {\n unreadCount: unreadMessageIds.length,\n });\n\n this.errorHandler.handle(error, 'markAsRead', { conversationId });\n // Don't throw - marking as read failure shouldn't break the app\n }\n }\n\n /**\n * Send typing indicator\n * Non-critical operation, doesn't throw on failure\n */\n async sendTypingIndicator(conversationId: string): Promise<void> {\n try {\n await this.messageApi.sendTypingIndicator(conversationId);\n } catch (error) {\n // Log but don't throw - typing indicators are not critical\n this.errorHandler.handle(error, 'sendTypingIndicator', { conversationId });\n }\n }\n\n /**\n * Search conversations\n * Returns empty array on failure\n */\n async searchConversations(query: string): Promise<AXConversation[]> {\n try {\n return await this.conversationApi.searchConversations(query);\n } catch (error) {\n this.errorHandler.handle(error, 'searchConversations', { query });\n return []; // Return empty array on failure\n }\n }\n\n /**\n * Handle new message received\n */\n private handleNewMessage(message: AXMessage): void {\n this.store.addMessage(message);\n this.store.updateLastMessage(message);\n\n // Increment unread count for messages from other users\n // The intersection observer will mark them as read when they become visible\n const currentId = this._currentUser()?.id ?? 'current-user';\n const isFromOtherUser = message.senderId !== currentId;\n\n if (isFromOtherUser) {\n this.store.incrementUnreadCount(message.conversationId);\n }\n }\n\n /**\n * Handle message update\n */\n private handleMessageUpdate(message: AXMessage): void {\n this.store.updateMessage(message.id, message);\n }\n\n /**\n * Handle message count update\n * Emits events when a message is a reply or forward so components can refresh counts\n */\n private handleMessageCountUpdate(message: AXMessage): void {\n // If this message is a reply, emit event to refresh the original message's reply count\n if (message.replyTo?.id) {\n this._messageCountRefresh$.next({ messageId: message.replyTo.id, type: 'reply' });\n }\n\n // If this message is a forward, emit event to refresh the original message's forward count\n if (message.forwardedFrom?.messageId) {\n this._messageCountRefresh$.next({ messageId: message.forwardedFrom.messageId, type: 'forward' });\n }\n }\n\n /**\n * Handle message deletion\n */\n private handleMessageDeletion(messageId: string): void {\n this.store.deleteMessage(messageId);\n }\n\n /**\n * Handle typing indicator\n */\n private handleTypingIndicator(indicator: AXTypingIndicator): void {\n // Ignore typing indicators from the current user\n const currentUser = this._currentUser();\n if (currentUser && indicator.userId === currentUser.id) {\n return;\n }\n\n // Set typing indicator\n // Set typing indicator\n this.store.updateTypingIndicator(indicator.conversationId, indicator.userId, true);\n\n // Clear typing indicator after timeout\n setTimeout(() => {\n this.store.updateTypingIndicator(indicator.conversationId, indicator.userId, false);\n }, this.config.typingIndicatorTimeout ?? 3000);\n }\n\n /**\n * Handle presence update\n */\n private handlePresenceUpdate(update: AXPresenceUpdate): void {\n this.store.updateParticipantPresence(update.userId, update.status, update.lastSeen);\n }\n\n /**\n * Handle conversation update\n * Updates conversation metadata including unread count, last message, etc.\n */\n private handleConversationUpdate(conversation: AXConversation): void {\n this.store.setConversation(conversation);\n }\n\n /**\n * Update conversation's last message\n */\n private updateConversationLastMessage(message: AXMessage): void {\n this.store.updateLastMessage(message);\n }\n\n // =====================\n // Conversation Update APIs\n // =====================\n\n /**\n * Update conversation properties\n * @param conversationId - Conversation ID\n * @param updates - Partial conversation updates\n */\n async updateConversation(conversationId: string, updates: Partial<AXConversation>): Promise<void> {\n try {\n this.store.updateConversation(conversationId, updates);\n } catch (error) {\n this.errorHandler.handle(error, 'updateConversation', { conversationId });\n throw error;\n }\n }\n\n /**\n * Update conversation settings\n * @param conversationId - Conversation ID\n * @param settings - Partial settings to update\n */\n async updateConversationSettings(\n conversationId: string,\n settings: Partial<AXConversation['settings']>,\n ): Promise<void> {\n try {\n this.store.updateSettings(conversationId, settings);\n } catch (error) {\n this.errorHandler.handle(error, 'updateConversationSettings', { conversationId });\n throw error;\n }\n }\n\n /**\n * Update conversation title\n * @param conversationId - Conversation ID\n * @param title - New title\n */\n async updateConversationTitle(conversationId: string, title: string): Promise<void> {\n try {\n this.store.updateTitle(conversationId, title);\n } catch (error) {\n this.errorHandler.handle(error, 'updateConversationTitle', { conversationId, title });\n throw error;\n }\n }\n\n /**\n * Update conversation metadata\n * @param conversationId - Conversation ID\n * @param metadata - Metadata to merge\n */\n async updateConversationMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\n try {\n this.store.updateMetadata(conversationId, metadata);\n } catch (error) {\n this.errorHandler.handle(error, 'updateConversationMetadata', { conversationId });\n throw error;\n }\n }\n\n /**\n * Get conversation by ID\n * @param conversationId - Conversation ID\n * @returns Conversation or null\n */\n getConversation(conversationId: string): AXConversation | null {\n return this.store.getConversation(conversationId) || null;\n }\n\n /**\n * Create a new conversation\n * @param participantIds - Array of participant user IDs\n * @param type - Conversation type (private, group, channel)\n * @param metadata - Optional metadata (title, avatar, etc.)\n * @returns Created conversation\n */\n async createConversation(\n participantIds: string[],\n type: 'private' | 'group' | 'channel',\n metadata?: Record<string, unknown>,\n ): Promise<AXConversation> {\n try {\n const conversation = await this.conversationApi.createConversation({\n type,\n participantIds,\n title: metadata?.['title'] as string | undefined,\n description: metadata?.['description'] as string | undefined,\n avatar: metadata?.['avatar'] as string | undefined,\n metadata,\n });\n this.store.setConversation(conversation);\n return conversation;\n } catch (error) {\n this.errorHandler.handle(error, 'createConversation', { participantIds, type });\n throw error;\n }\n }\n\n /**\n * Get available users for conversation creation\n * @param query - Optional search query\n * @returns List of users\n */\n async getUsers(query?: string): Promise<import('../models').AXParticipant[]> {\n try {\n return await this.userApi.getUsers({ query });\n } catch (error) {\n this.errorHandler.handle(error, 'getUsers', { query });\n return [];\n }\n }\n\n /**\n * Mark entire conversation as read\n * @param conversationId - Conversation ID\n */\n async markConversationAsRead(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.markConversationAsRead(conversationId);\n this.store.resetUnreadCount(conversationId);\n } catch (error) {\n this.errorHandler.handle(error, 'markConversationAsRead', { conversationId });\n throw error;\n }\n }\n\n /**\n * Delete a conversation\n * Shows confirmation dialog, then deletes from server and store\n * @param conversationId - Conversation ID\n */\n async deleteConversation(conversationId: string): Promise<boolean> {\n // Get conversation title for confirmation message\n const conversation = this.store.getConversation(conversationId);\n const conversationTitle = conversation?.title || 'this conversation';\n\n // Show confirmation dialog\n const result = await this.dialogService.confirm(\n 'Delete Conversation',\n `Delete \"${conversationTitle}\" Conversation?`,\n 'danger',\n 'vertical',\n false,\n );\n\n // User cancelled\n if (!result.result) {\n return false;\n }\n\n try {\n // Delete from server\n const result = await this.conversationApi.deleteConversation(conversationId);\n\n if (!result) return false;\n\n // Delete from store\n this.store.deleteConversation(conversationId);\n\n // If this was the active conversation, clear selection\n if (this._activeConversationId() === conversationId) {\n this._activeConversationId.set(null);\n }\n return true;\n } catch (error) {\n this.errorHandler.handle(error, 'deleteConversation', { conversationId });\n throw error;\n }\n }\n\n /**\n * Get reply count for a message\n * @param messageId - Message ID\n * @returns Number of replies\n */\n async getReplyCount(messageId: string): Promise<number> {\n try {\n return await this.messageApi.getReplyCount(messageId);\n } catch (error) {\n this.errorHandler.handle(error, 'getReplyCount', { messageId });\n return 0;\n }\n }\n\n /**\n * Get forward count for a message\n * @param messageId - Message ID\n * @returns Number of times forwarded\n */\n async getForwardCount(messageId: string): Promise<number> {\n try {\n return await this.messageApi.getForwardCount(messageId);\n } catch (error) {\n this.errorHandler.handle(error, 'getForwardCount', { messageId });\n return 0;\n }\n }\n\n /**\n * Disconnect and cleanup\n * Cleanly closes all connections and resources\n */\n async disconnect(): Promise<void> {\n try {\n if (this.realtimeApi) {\n await this.realtimeApi.disconnect();\n }\n } catch (error) {\n this.errorHandler.handle(error, 'disconnect');\n // Don't throw - we're disconnecting anyway\n }\n }\n\n // =====================\n // Extended Conversation APIs\n // =====================\n\n /**\n * Archive conversation\n * @param conversationId - Conversation ID\n */\n async archiveConversation(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.archiveConversation(conversationId);\n this.store.updateConversation(conversationId, { archived: true });\n } catch (error) {\n this.errorHandler.handle(error, 'archiveConversation', { conversationId });\n throw error;\n }\n }\n\n /**\n * Unarchive conversation\n * @param conversationId - Conversation ID\n */\n async unarchiveConversation(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.unarchiveConversation(conversationId);\n this.store.updateConversation(conversationId, { archived: false });\n } catch (error) {\n this.errorHandler.handle(error, 'unarchiveConversation', { conversationId });\n throw error;\n }\n }\n\n /**\n * Pin conversation\n * @param conversationId - Conversation ID\n */\n async pinConversation(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.pinConversation(conversationId);\n this.store.updateConversation(conversationId, { pinned: true });\n } catch (error) {\n this.errorHandler.handle(error, 'pinConversation', { conversationId });\n throw error;\n }\n }\n\n /**\n * Unpin conversation\n * @param conversationId - Conversation ID\n */\n async unpinConversation(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.unpinConversation(conversationId);\n this.store.updateConversation(conversationId, { pinned: false });\n } catch (error) {\n this.errorHandler.handle(error, 'unpinConversation', { conversationId });\n throw error;\n }\n }\n\n /**\n * Mute conversation\n * @param conversationId - Conversation ID\n * @param duration - Mute duration in milliseconds (undefined = forever)\n */\n async muteConversation(conversationId: string, duration?: number): Promise<void> {\n try {\n await this.conversationApi.muteConversation(conversationId, duration);\n const mutedUntil = duration ? new Date(Date.now() + duration) : undefined;\n this.store.updateSettings(conversationId, { mutedUntil, notifications: false });\n } catch (error) {\n this.errorHandler.handle(error, 'muteConversation', { conversationId, duration });\n throw error;\n }\n }\n\n /**\n * Unmute conversation\n * @param conversationId - Conversation ID\n */\n async unmuteConversation(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.unmuteConversation(conversationId);\n this.store.updateSettings(conversationId, { mutedUntil: undefined, notifications: true });\n } catch (error) {\n this.errorHandler.handle(error, 'unmuteConversation', { conversationId });\n throw error;\n }\n }\n\n /**\n * Add participants to conversation\n * @param conversationId - Conversation ID\n * @param userIds - User IDs to add\n */\n async addParticipants(conversationId: string, userIds: string[]): Promise<void> {\n try {\n const updatedConversation = await this.conversationApi.addParticipants(conversationId, userIds);\n this.store.setConversation(updatedConversation);\n } catch (error) {\n this.errorHandler.handle(error, 'addParticipants', { conversationId, userIds });\n throw error;\n }\n }\n\n /**\n * Remove participant from conversation\n * @param conversationId - Conversation ID\n * @param userId - User ID to remove\n */\n async removeParticipant(conversationId: string, userId: string): Promise<void> {\n try {\n const updatedConversation = await this.conversationApi.removeParticipant(conversationId, userId);\n this.store.setConversation(updatedConversation);\n } catch (error) {\n this.errorHandler.handle(error, 'removeParticipant', { conversationId, userId });\n throw error;\n }\n }\n\n /**\n * Leave conversation\n * @param conversationId - Conversation ID\n */\n async leaveConversation(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.leaveConversation(conversationId);\n this.store.deleteConversation(conversationId);\n if (this._activeConversationId() === conversationId) {\n this._activeConversationId.set(null);\n }\n } catch (error) {\n this.errorHandler.handle(error, 'leaveConversation', { conversationId });\n throw error;\n }\n }\n\n /**\n * Save draft message\n * @param conversationId - Conversation ID\n * @param draft - Draft text\n */\n async saveDraft(conversationId: string, draft: string): Promise<void> {\n try {\n await this.conversationApi.saveDraft(conversationId, draft);\n this.store.updateConversation(conversationId, { draft });\n } catch (error) {\n this.errorHandler.handle(error, 'saveDraft', { conversationId });\n // Don't throw - draft saving is not critical\n }\n }\n\n /**\n * Clear draft message\n * @param conversationId - Conversation ID\n */\n async clearDraft(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.clearDraft(conversationId);\n this.store.updateConversation(conversationId, { draft: undefined });\n } catch (error) {\n this.errorHandler.handle(error, 'clearDraft', { conversationId });\n // Don't throw - draft clearing is not critical\n }\n }\n\n // =====================\n // Extended Message APIs\n // =====================\n\n /**\n * Pin message in conversation\n * @param conversationId - Conversation ID\n * @param messageId - Message ID\n */\n async pinMessage(conversationId: string, messageId: string): Promise<void> {\n try {\n await this.messageApi.pinMessage(conversationId, messageId);\n this.store.updateMessage(messageId, { pinned: true });\n } catch (error) {\n this.errorHandler.handle(error, 'pinMessage', { conversationId, messageId });\n throw error;\n }\n }\n\n /**\n * Unpin message from conversation\n * @param conversationId - Conversation ID\n * @param messageId - Message ID\n */\n async unpinMessage(conversationId: string, messageId: string): Promise<void> {\n try {\n await this.messageApi.unpinMessage(conversationId, messageId);\n this.store.updateMessage(messageId, { pinned: false });\n } catch (error) {\n this.errorHandler.handle(error, 'unpinMessage', { conversationId, messageId });\n throw error;\n }\n }\n\n /**\n * Forward message to conversations\n * @param messageId - Message ID to forward\n * @param conversationIds - Target conversation IDs\n * @param caption - Optional caption\n */\n async forwardMessage(messageId: string, conversationIds: string[], caption?: string): Promise<void> {\n try {\n await this.messageApi.forwardMessage({\n messageId,\n conversationIds,\n caption,\n });\n // Emit forward count update\n this._messageCountRefresh$.next({ messageId, type: 'forward' });\n } catch (error) {\n this.errorHandler.handle(error, 'forwardMessage', { messageId, conversationIds });\n throw error;\n }\n }\n\n /**\n * Search messages in conversation\n * @param conversationId - Conversation ID\n * @param query - Search query\n * @returns Matching messages\n */\n async searchMessages(conversationId: string, query: string): Promise<AXMessage[]> {\n try {\n const result = await this.messageApi.searchMessages(conversationId, { query }, { page: 0, pageSize: 50 });\n return result.items;\n } catch (error) {\n this.errorHandler.handle(error, 'searchMessages', { conversationId, query });\n return [];\n }\n }\n\n /**\n * Get message replies\n * @param messageId - Message ID\n * @returns Array of reply messages\n */\n async getMessageReplies(messageId: string): Promise<AXMessage[]> {\n try {\n const result = await this.messageApi.getMessageReplies(messageId, { page: 0, pageSize: 50 });\n return result.items;\n } catch (error) {\n this.errorHandler.handle(error, 'getMessageReplies', { messageId });\n return [];\n }\n }\n\n /**\n * Export conversation messages\n * @param conversationId - Conversation ID\n * @param format - Export format\n * @returns Export data\n */\n async exportMessages(conversationId: string, format: 'json' | 'csv' | 'txt'): Promise<string | Blob> {\n try {\n return await this.messageApi.exportMessages(conversationId, format);\n } catch (error) {\n this.errorHandler.handle(error, 'exportMessages', { conversationId, format });\n throw error;\n }\n }\n\n // =====================\n // User Management APIs\n // =====================\n\n /**\n * Get user settings\n * @returns User settings\n */\n async getUserSettings(): Promise<Record<string, unknown>> {\n try {\n return await this.userApi.getUserSettings();\n } catch (error) {\n this.errorHandler.handle(error, 'getUserSettings');\n return {};\n }\n }\n\n /**\n * Update user settings\n * @param settings - Settings to update\n */\n async updateUserSettings(settings: Record<string, unknown>): Promise<void> {\n try {\n await this.userApi.updateUserSettings(settings);\n } catch (error) {\n this.errorHandler.handle(error, 'updateUserSettings', { settings });\n throw error;\n }\n }\n\n /**\n * Block user\n * @param userId - User ID to block\n * @param reason - Optional reason\n */\n async blockUser(userId: string, reason?: { code: string; description?: string }): Promise<void> {\n try {\n await this.userApi.blockUser(userId, reason);\n } catch (error) {\n this.errorHandler.handle(error, 'blockUser', { userId });\n throw error;\n }\n }\n\n /**\n * Unblock user\n * @param userId - User ID to unblock\n */\n async unblockUser(userId: string): Promise<void> {\n try {\n await this.userApi.unblockUser(userId);\n } catch (error) {\n this.errorHandler.handle(error, 'unblockUser', { userId });\n throw error;\n }\n }\n\n /**\n * Get blocked users\n * @returns Array of blocked user IDs\n */\n async getBlockedUsers(): Promise<string[]> {\n try {\n return await this.userApi.getBlockedUsers();\n } catch (error) {\n this.errorHandler.handle(error, 'getBlockedUsers');\n return [];\n }\n }\n\n /**\n * Update user presence\n * @param status - Presence status\n * @param statusText - Optional status text\n */\n async updatePresence(\n status: 'online' | 'offline' | 'away' | 'busy' | 'invisible',\n statusText?: string,\n ): Promise<void> {\n try {\n await this.userApi.updatePresence(status, statusText);\n } catch (error) {\n this.errorHandler.handle(error, 'updatePresence', { status });\n // Don't throw - presence update is not critical\n }\n }\n\n /**\n * Validate message content before sending\n * Uses centralized validation utilities for consistency\n * @param command - Message command to validate\n * @throws {Error} If message content is invalid\n */\n private validateMessageContent(command: AXSendMessageCommand): void {\n // Validate conversation ID\n const conversationIdResult = validateConversationId(command.conversationId);\n if (!conversationIdResult.valid) {\n throw new Error(conversationIdResult.error);\n }\n\n // Validate message type\n const typeResult = validateMessageType(command.type);\n if (!typeResult.valid) {\n throw new Error(typeResult.error);\n }\n\n // Validate payload exists\n const payloadResult = validateMessagePayload(command.payload, command.type);\n if (!payloadResult.valid) {\n throw new Error(payloadResult.error);\n }\n\n // Validate text messages\n if (command.type === 'text') {\n const payload = command.payload as { text?: string };\n const textResult = validateMessageText(payload.text, this.config);\n if (!textResult.valid) {\n throw new Error(textResult.error);\n }\n }\n }\n}\n","/**\n * Composer Popup Component\n * Container for emoji, sticker, and other tabs\n */\n\nimport { AXComponentCloseEvent } from '@acorex/cdk/common';\nimport { AXTabItemComponent, AXTabsComponent } from '@acorex/components/tabs';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ComponentRef,\n computed,\n effect,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { AXConversationService } from '../../services';\n\n@Component({\n selector: 'ax-composer-popup',\n imports: [CommonModule, AXTabsComponent, AXTabItemComponent],\n template: `\n <div class=\"composer-popup\">\n <!-- Tabs -->\n <ax-tabs (onActiveTabChanged)=\"onTabChange($event)\">\n @for (tab of enabledTabs(); track tab.id) {\n <ax-tab-item [text]=\"tab.title\" [key]=\"tab.id\">\n <ng-template #prefix>\n @if (tab.icon) {\n <span class=\"tab-icon fa-light\" [class]=\"tab.icon\"></span>\n }\n </ng-template>\n </ax-tab-item>\n }\n </ax-tabs>\n\n <!-- Tab Content -->\n <div class=\"popup-content\">\n <ng-container #contentContainer></ng-container>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .composer-popup {\n display: flex;\n padding: 1rem;\n flex-direction: column;\n width: 100%;\n height: 100%;\n height: max(400px, 50vh);\n }\n\n .popup-content {\n flex: 1;\n overflow-y: auto;\n }\n\n .tab-icon {\n font-size: 1.25rem;\n }\n `,\n ],\n})\nexport class AXComposerPopupComponent implements OnDestroy {\n private readonly conversationService = inject(AXConversationService);\n\n // Access registry through conversation service\n private get registry() {\n return this.conversationService.registry;\n }\n\n contentContainer = viewChild.required('contentContainer', {\n read: ViewContainerRef,\n });\n\n private currentComponentRef: ComponentRef<any> | null = null;\n\n /** Popup open state (for backward compatibility) */\n readonly isOpen = input<boolean>(false);\n\n /** Close event (for backward compatibility) */\n readonly closed = output<void>();\n\n /** Item selected event (for backward compatibility) */\n readonly itemSelected = output<any>();\n\n /** Item selected callback (for popover mode) */\n readonly onItemSelected = input<((item: any) => void) | undefined>(undefined);\n\n /** Close event for popup service */\n readonly onClosed = output<AXComponentCloseEvent>();\n\n /** Active tab ID */\n private readonly activeTabId = signal<string | null>(null);\n\n /** Enabled tabs from registry */\n readonly enabledTabs = computed(() => this.registry.composerTabs.enabledTabs());\n\n constructor() {\n // Load first tab by default\n effect(() => {\n if (!this.activeTabId() && this.enabledTabs().length > 0) {\n this.activeTabId.set(this.enabledTabs()[0].id);\n }\n });\n\n // Update content when active tab changes\n effect(() => {\n const tabId = this.activeTabId();\n if (tabId) {\n // Use setTimeout to ensure ViewChild is available\n setTimeout(() => this.loadTabContent(tabId));\n }\n });\n }\n\n /** Handle tab change */\n onTabChange(event: { tab?: { key?: string } }): void {\n if (event.tab?.key) {\n this.activeTabId.set(event.tab.key);\n }\n }\n\n /** Load tab content component */\n private loadTabContent(tabId: string): void {\n if (!this.contentContainer) return;\n\n const tab = this.registry.composerTabs.getTabById(tabId);\n if (!tab) return;\n\n // Clear previous component\n if (this.currentComponentRef) {\n this.currentComponentRef.destroy();\n this.currentComponentRef = null;\n }\n\n this.contentContainer().clear();\n\n // Create new component instance\n this.currentComponentRef = this.contentContainer().createComponent(tab.component);\n\n // Pass item selection handler if component has it\n const instance = this.currentComponentRef.instance;\n if (instance && typeof instance.itemSelected === 'object' && 'subscribe' in instance.itemSelected) {\n instance.itemSelected.subscribe((item: any) => {\n // Call callback if provided (popover mode)\n const callback = this.onItemSelected();\n if (callback) {\n callback(item);\n } else {\n // Emit event (popup mode)\n this.itemSelected.emit(item);\n this.closeWithData(item);\n }\n });\n }\n }\n\n ngOnDestroy(): void {\n if (this.currentComponentRef) {\n this.currentComponentRef.destroy();\n this.currentComponentRef = null;\n }\n }\n\n /** Close popup (for backward compatibility) */\n close(): void {\n this.closed.emit();\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = null;\n this.onClosed.emit(event);\n }\n\n /** Close popup with data (for popup service) */\n closeWithData(data: unknown): void {\n this.closed.emit();\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = data;\n this.onClosed.emit(event);\n }\n}\n","/**\n * AXComposerService\n * Facade/service for Composer to interact with conversation and manage reply/edit state.\n */\nimport { computed, inject, Injectable, signal, Type } from '@angular/core';\nimport { AXMessage, AXSendMessageCommand } from '../../models';\nimport { AXComposerAction, AXComposerActionContext } from '../../registries';\nimport { AXConversationService } from '../../services';\n\n/**\n * Active component state in composer\n */\nexport interface AXComposerActiveComponent {\n /** Action that triggered this component */\n action: AXComposerAction;\n /** Component to render */\n component: Type<unknown>;\n /** Component inputs */\n inputs?: Record<string, unknown>;\n}\n\n@Injectable()\nexport class AXComposerService {\n private readonly conversationService = inject(AXConversationService);\n\n // Access registry through conversation service\n private get registry() {\n return this.conversationService.registry;\n }\n\n // Reply/Edit state signals (public as readonly)\n private readonly _replyMessage = signal<AXMessage | null>(null);\n private readonly _editMessage = signal<AXMessage | null>(null);\n\n readonly replyMessage = this._replyMessage.asReadonly();\n readonly editMessage = this._editMessage.asReadonly();\n\n readonly activeConversation = this.conversationService.activeConversation;\n readonly activeMessages = this.conversationService.activeMessages;\n\n /** Active component being shown in composer (full-width mode) */\n private readonly _activeComponent = signal<AXComposerActiveComponent | null>(null);\n readonly activeComponent = this._activeComponent.asReadonly();\n\n /** Draft text */\n readonly draftText = signal('');\n\n /** Attachments */\n readonly attachments = signal<File[]>([]);\n\n /** Show typing indicator */\n readonly showTypingIndicator = signal(false);\n\n /** Input placeholder */\n readonly placeholder = computed(() => {\n const conversation = this.activeConversation();\n if (!conversation) return 'Select a conversation';\n return 'Type a message...';\n });\n\n /** Number of input rows */\n readonly inputRows = computed(() => {\n const text = this.draftText();\n const lines = text.split('\\n').length;\n return Math.min(Math.max(lines, 1), 4);\n });\n\n /** Can send message */\n readonly canSend = computed(() => {\n const text = this.draftText().trim();\n const attachments = this.attachments();\n return text.length > 0 || attachments.length > 0;\n });\n\n /** Composer action context */\n readonly actionContext = computed((): AXComposerActionContext => {\n const conversation = this.activeConversation();\n const editMsg = this.editMessage();\n const replyMsg = this.replyMessage();\n\n return {\n draftText: this.draftText(),\n conversationId: conversation?.id || '',\n isEditing: !!editMsg,\n editingMessageId: editMsg?.id,\n isReplying: !!replyMsg,\n replyingToMessageId: replyMsg?.id,\n composerService: this,\n conversationService: this.conversationService,\n };\n });\n\n /** Left actions from registry */\n readonly leftActions = computed(() => {\n const context = this.actionContext();\n return this.registry.composerActions\n .getVisibleActions('left', context)\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Right actions from registry */\n readonly rightActions = computed(() => {\n const context = this.actionContext();\n return this.registry.composerActions\n .getVisibleActions('right', context)\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Left inline actions (location = 'inline' or undefined) */\n readonly leftInlineActions = computed(() => {\n return this.leftActions()\n .filter((action) => action.location !== 'menu')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Left menu actions (location = 'menu') */\n readonly leftMenuActions = computed(() => {\n return this.leftActions()\n .filter((action) => action.location === 'menu')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Right inline actions (location = 'inline' or undefined) */\n readonly rightInlineActions = computed(() => {\n return this.rightActions()\n .filter((action) => action.location !== 'menu')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Right menu actions (location = 'menu') */\n readonly rightMenuActions = computed(() => {\n return this.rightActions()\n .filter((action) => action.location === 'menu')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n startReply(message: AXMessage): void {\n this._editMessage.set(null);\n this._replyMessage.set(message);\n }\n\n startEdit(message: AXMessage): void {\n this._replyMessage.set(null);\n this._editMessage.set(message);\n }\n\n clear(): void {\n this._replyMessage.set(null);\n this._editMessage.set(null);\n }\n\n async sendTypingIndicator(conversationId: string): Promise<void> {\n await this.conversationService.sendTypingIndicator(conversationId);\n }\n\n async sendMessage(command: AXSendMessageCommand): Promise<void> {\n await this.conversationService.sendMessage(command);\n this.clear();\n }\n\n /**\n * Show a component in the composer (full-width mode)\n */\n showComponent(action: AXComposerAction, inputs?: Record<string, unknown>): void {\n if (!action.component) return;\n\n this._activeComponent.set({\n action,\n component: action.component,\n inputs,\n });\n }\n\n /**\n * Hide the active component\n */\n hideComponent(): void {\n this._activeComponent.set(null);\n }\n\n /**\n * Toggle component visibility\n */\n toggleComponent(action: AXComposerAction, inputs?: Record<string, unknown>): void {\n const current = this._activeComponent();\n if (current?.action.id === action.id) {\n this.hideComponent();\n } else {\n this.showComponent(action, inputs);\n }\n }\n\n /**\n * Get actions for the active conversation\n */\n getActionsForPosition(position: 'left' | 'right', context: AXComposerActionContext) {\n return this.registry.composerActions.getVisibleActions(position, context);\n }\n\n /**\n * Execute an action\n */\n async executeAction(actionId: string, context: AXComposerActionContext): Promise<void> {\n return this.registry.composerActions.executeAction(actionId, context);\n }\n\n /**\n * Save draft to localStorage\n */\n saveDraft(conversationId: string, text: string): void {\n const key = `ax_conversation_draft_${conversationId}`;\n if (text.trim()) {\n try {\n localStorage.setItem(key, text);\n } catch (error) {\n console.warn('Failed to save draft:', error);\n }\n } else {\n localStorage.removeItem(key);\n }\n }\n\n /**\n * Load draft from localStorage\n */\n loadDraft(conversationId: string): string {\n const key = `ax_conversation_draft_${conversationId}`;\n try {\n return localStorage.getItem(key) ?? '';\n } catch (error) {\n console.warn('Failed to load draft:', error);\n return '';\n }\n }\n\n /**\n * Clear draft from localStorage\n */\n clearDraft(conversationId: string): void {\n const key = `ax_conversation_draft_${conversationId}`;\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.warn('Failed to clear draft:', error);\n }\n }\n}\n","/**\n * AXMessageListService\n * Facade/service for Message List to interact with conversation and registries.\n */\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { AXMessage } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationDateUtilsService } from '../../utils';\nimport { AXComposerService } from '../composer/composer.service';\n\n@Injectable()\nexport class AXMessageListService {\n private readonly conversationService = inject(AXConversationService);\n private readonly composerService = inject(AXComposerService);\n\n // Access registry through conversation service\n private get registry() {\n return this.conversationService.registry;\n }\n\n readonly activeConversation = this.conversationService.activeConversation;\n readonly activeMessages = this.conversationService.activeMessages;\n readonly currentUser = this.conversationService.currentUser;\n\n /** Loading state */\n readonly loading = signal(false);\n\n /** Loading more messages state */\n readonly loadingMore = signal(false);\n\n /** Show scroll to bottom button */\n readonly showScrollButton = signal(false);\n\n /** Scroll requests counter */\n readonly scrollRequests = signal(0);\n\n /** Current page for pagination */\n private readonly currentPage = signal(0);\n\n /** Has more messages to load */\n private readonly hasMoreMessages = signal(true);\n\n /** Message grouped by date */\n readonly messageGroups = computed(() => {\n const messages = this.activeMessages();\n const groups = new Map<string, AXMessage[]>();\n\n messages.forEach((message) => {\n const dateKey = AXConversationDateUtilsService.getDateKey(message.timestamp);\n if (!groups.has(dateKey)) {\n groups.set(dateKey, []);\n }\n const group = groups.get(dateKey);\n if (group) {\n group.push(message);\n }\n });\n\n return Array.from(groups.entries()).map(([dateKey, messages]) => ({\n date: dateKey,\n dateLabel: AXConversationDateUtilsService.formatDateLabel(new Date(dateKey)),\n messages,\n }));\n });\n\n // Date formatting methods moved to DateUtilsService\n\n /**\n * Load more messages (pagination)\n */\n async loadMoreMessages(): Promise<void> {\n if (!this.hasMoreMessages() || this.loadingMore() || this.loading()) {\n return;\n }\n\n this.loadingMore.set(true);\n try {\n const nextPage = this.currentPage() + 1;\n // Note: Implement loadMoreMessages in ConversationService if needed\n // For now, just mark as no more messages\n this.currentPage.set(nextPage);\n this.hasMoreMessages.set(false);\n } finally {\n this.loadingMore.set(false);\n }\n }\n\n /**\n * Reset pagination (call when conversation changes)\n */\n resetPagination(): void {\n this.currentPage.set(0);\n this.hasMoreMessages.set(true);\n }\n\n getMenuActions(message: AXMessage) {\n const user = this.currentUser();\n if (!user) return [];\n return this.registry.messageActions.getMenuActions(message, user);\n }\n\n async executeAction(message: AXMessage, actionId: string): Promise<void> {\n const user = this.currentUser();\n if (!user) return;\n const conversation = this.activeConversation();\n\n await this.registry.messageActions.executeAction(actionId, {\n message,\n currentUser: user,\n participants: conversation?.participants || [],\n composerService: this.composerService,\n conversationService: this.conversationService,\n messageListService: this,\n });\n }\n\n reactToMessage(messageId: string, emoji: string): Promise<void> {\n return this.conversationService.reactToMessage(messageId, emoji);\n }\n\n /** Request message list to scroll to bottom */\n requestScrollToBottom(): void {\n this.scrollRequests.update((n) => n + 1);\n }\n}\n","/**\n * Composer Component\n * Input area for composing and sending messages\n */\n\nimport { AXCommonModule, AXHtmlEvent } from '@acorex/cdk/common';\nimport { AXUploaderChangedEvent } from '@acorex/cdk/uploader';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownModule } from '@acorex/components/dropdown';\nimport { AXPopoverModule } from '@acorex/components/popover';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTextAreaModule } from '@acorex/components/text-area';\nimport { AXTooltipModule } from '@acorex/components/tooltip';\nimport { AXUploaderModule } from '@acorex/components/uploader';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n OnDestroy,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { throttleTime } from 'rxjs/operators';\nimport { AXMessage, AXSendMessageCommand, AXStickerPayload } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXMessageApi } from '../../services/api';\nimport { CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\nimport { AXMessageListService } from '../message-list/message-list.service';\nimport { AXComposerPopupComponent } from './composer-popup.component';\nimport { AXComposerService } from './composer.service';\n\n@Component({\n selector: 'ax-conversation-composer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n NgComponentOutlet,\n FormsModule,\n AXTextAreaModule,\n AXCommonModule,\n AXUploaderModule,\n AXTooltipModule,\n AXButtonModule,\n AXDecoratorModule,\n AXPopoverModule,\n AXDropdownModule,\n ],\n template: `\n @if (activeConversation()) {\n <div class=\"composer\">\n <!-- Full-Width Component Mode -->\n @if (activeComponent()) {\n <div class=\"composer-component-fullwidth\">\n <ng-container\n *ngComponentOutlet=\"activeComponent()!.component; inputs: getComponentInputs()\"\n ></ng-container>\n </div>\n } @else {\n <!-- Normal Composer Mode -->\n <!-- Edit/Reply Banner -->\n @if (editingMessage() || replyingToMessage()) {\n <div class=\"composer-banner\">\n <div class=\"banner-content\">\n @if (editingMessage()) {\n <span class=\"banner-icon\">✏️</span>\n <div class=\"banner-text\">\n <div class=\"banner-title\">Editing message</div>\n @if (getEditingPreview(); as preview) {\n <div class=\"banner-subtitle\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n @if (preview.type === 'text') {\n {{ preview.value }}\n } @else if (preview.type === 'image') {\n Image\n } @else if (preview.type === 'video') {\n Video\n } @else if (preview.type === 'audio' || preview.type === 'voice') {\n Voice message\n } @else if (preview.type === 'file') {\n File\n } @else if (preview.type === 'location') {\n Location\n } @else if (preview.type === 'sticker') {\n Sticker\n } @else {\n Message\n }\n </div>\n }\n </div>\n } @else if (replyingToMessage()) {\n <span class=\"banner-icon\">↩️</span>\n <div class=\"banner-text\" (click)=\"onReplyPreviewClick()\">\n <div class=\"banner-title\">Replying to {{ getReplyingSenderName() }}</div>\n @if (getReplyingPreview(); as preview) {\n <div class=\"banner-subtitle\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n @if (preview.type === 'text') {\n {{ preview.value }}\n } @else if (preview.type === 'image') {\n Image\n } @else if (preview.type === 'video') {\n Video\n } @else if (preview.type === 'audio' || preview.type === 'voice') {\n Voice message\n } @else if (preview.type === 'file') {\n File\n } @else if (preview.type === 'location') {\n Location\n } @else if (preview.type === 'sticker') {\n Sticker\n } @else {\n Message\n }\n </div>\n }\n </div>\n }\n </div>\n <button type=\"button\" class=\"banner-close\" (click)=\"cancelEditReply()\" aria-label=\"Cancel\">✕</button>\n </div>\n }\n\n <!-- Input Area -->\n <div class=\"composer-input-container\">\n <!-- Left Actions -->\n <div class=\"composer-actions-left\">\n @for (action of leftInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n #leftActionButton\n (click)=\"onActionClick(action.id, $event)\"\n [attr.aria-label]=\"action.label\"\n [axTooltip]=\"action.tooltip\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (leftMenuActions().length > 0) {\n <ax-button color=\"primary\" look=\"outline\" [axTooltip]=\"'More actions'\">\n <i class=\"fa-light fa-ellipsis\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of leftMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"action.label\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n\n <!-- Text Input -->\n <div class=\"composer-input-wrapper\">\n <ax-text-area\n #inputElement\n [(ngModel)]=\"draftText\"\n (onKeyDown)=\"onKeyDown($event)\"\n (onValueChanged)=\"onInput()\"\n [placeholder]=\"placeholder()\"\n (onKeyDown)=\"onEnter($event)\"\n [rows]=\"inputRows()\"\n ></ax-text-area>\n </div>\n\n <!-- Right Actions -->\n <div class=\"composer-actions-right\">\n @if (draftText().trim().length === 0 && !attachments().length) {\n <!-- Show action buttons when empty -->\n @for (action of rightInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n [class.action-voice]=\"action.id === 'voice-recording'\"\n (click)=\"onActionClick(action.id)\"\n [attr.aria-label]=\"action.label\"\n [axTooltip]=\"action.tooltip\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n [attr.axUploaderBrowseHandle]=\"action.id === 'attach' ? '' : null\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (rightMenuActions().length > 0) {\n <ax-button look=\"blank\" [axTooltip]=\"'More actions'\">\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of rightMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"action.label\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n } @else {\n <!-- Show send/save button when has content -->\n <button\n type=\"button\"\n class=\"action-button action-send\"\n (click)=\"onSendClick()\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"editingMessage() ? 'Save' : 'Send'\"\n [axTooltip]=\"editingMessage() ? 'Save' : 'Send'\"\n >\n <i\n [class]=\"editingMessage() ? 'send-icon fa-light fa-check' : 'send-icon fa-light fa-paper-plane'\"\n ></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Attachments Preview -->\n @if (attachments().length > 0) {\n <div class=\"composer-attachments\">\n @for (attachment of attachments(); track $index) {\n <div class=\"attachment-item\">\n <span class=\"attachment-icon\">📎</span>\n <span class=\"attachment-name\">{{ attachment.name }}</span>\n <button\n type=\"button\"\n class=\"attachment-remove\"\n (click)=\"removeAttachment($index)\"\n aria-label=\"Remove attachment\"\n >\n ✕\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Typing Indicator -->\n @if (showTypingIndicator()) {\n <div class=\"typing-indicator-container\">\n <span class=\"typing-indicator\">Someone is typing...</span>\n </div>\n }\n }\n </div>\n }\n\n <!-- Popover for emoji/sticker picker -->\n @if (emojiPopoverTarget()) {\n <ax-popover\n #emojiPopover\n [target]=\"emojiPopoverTarget()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'top-start'\"\n (onClosed)=\"onEmojiPopoverClosed()\"\n >\n <div class=\"ax-overlay-pane\" style=\"width: 400px; max-height: 500px;\">\n <ng-container *ngComponentOutlet=\"composerPopupComponent; inputs: getEmojiPopupInputs()\"></ng-container>\n </div>\n </ax-popover>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .composer-banner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n color: rgb(var(--ax-sys-color-on-primary-lightest-surface));\n }\n\n .banner-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n flex: 1;\n min-width: 0;\n }\n\n .banner-icon {\n font-size: 1.25rem;\n flex-shrink: 0;\n }\n\n .emoji-icon {\n font-size: 1.25rem;\n flex-shrink: 0;\n }\n\n .banner-text {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n .banner-text:hover {\n opacity: 0.8;\n }\n\n .banner-title {\n font-size: 0.75rem;\n font-weight: 600;\n }\n\n .banner-subtitle {\n font-size: 0.8125rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n opacity: 0.8;\n }\n\n .banner-close {\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 0.375rem;\n font-size: 1rem;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .banner-close:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .composer-input-container {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem;\n }\n\n .composer-actions-left,\n .composer-actions-right {\n display: flex;\n align-items: center;\n //gap: 0.5rem;\n }\n\n .composer-input-wrapper {\n display: flex;\n flex: 1;\n min-width: 0;\n }\n\n .composer-input {\n width: 100%;\n min-height: 40px;\n max-height: 120px;\n padding: 0.5rem 0.75rem;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n border-radius: 1.25rem;\n font-size: 0.9375rem;\n font-family: inherit;\n line-height: 1.5;\n resize: none;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .composer-input:focus {\n border-color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .action-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border: none;\n background: transparent;\n border-radius: 50%;\n font-size: 1.5rem;\n cursor: pointer;\n transition: all 0.2s;\n flex-shrink: 0;\n }\n\n .action-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .action-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .action-send {\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n }\n\n .action-send:hover:not(:disabled) {\n background: rgb(var(--ax-sys-color-primary-600));\n }\n\n .send-icon {\n font-size: 1rem;\n position: relative;\n left: -1px;\n }\n\n .action-voice {\n font-size: 1.25rem;\n }\n\n .composer-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n padding: 0 1rem 1rem;\n }\n\n .attachment-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n background: rgb(var(--ax-sys-color-light-surface));\n border-radius: 0.5rem;\n font-size: 0.875rem;\n }\n\n .attachment-icon {\n font-size: 1rem;\n }\n\n .attachment-name {\n max-width: 150px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .attachment-remove {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n background: transparent;\n border-radius: 50%;\n font-size: 0.875rem;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .attachment-remove:hover {\n background: rgb(var(--ax-sys-color-danger-lightest-surface));\n color: rgb(var(--ax-sys-color-danger-500));\n }\n\n .typing-indicator-container {\n padding: 0 1rem 0.5rem;\n font-size: 0.75rem;\n opacity: 0.7;\n }\n\n .composer-component-fullwidth {\n width: 100%;\n min-height: 72px;\n background: rgb(var(--ax-sys-color-lightest-surface));\n }\n\n .action-badge {\n position: absolute;\n top: 4px;\n right: 4px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n border-radius: 8px;\n font-size: 0.625rem;\n font-weight: 600;\n }\n\n .action-button {\n position: relative;\n }\n `,\n ],\n})\nexport class AXComposerComponent implements OnDestroy {\n private readonly conversationService = inject(AXConversationService);\n private readonly messageApi = inject(AXMessageApi);\n private readonly composerService = inject(AXComposerService);\n private readonly messageListService = inject(AXMessageListService);\n private readonly popupService = inject(AXPopupService);\n private readonly config = inject(CONVERSATION_CONFIG);\n\n /** Access registry through conversation service */\n private get registry() {\n return this.conversationService.registry;\n }\n\n /** Input element reference */\n private readonly inputElementRef = viewChild<ElementRef>('inputElement');\n\n /** Draft text - use service */\n readonly draftText = this.composerService.draftText;\n\n /** Attachments - use service */\n readonly attachments = this.composerService.attachments;\n\n /** Editing message */\n readonly editingMessage = signal<any>(null);\n\n /** Replying to message */\n readonly replyingToMessage = signal<AXMessage>(null);\n\n /** Show typing indicator - use service */\n readonly showTypingIndicator = this.composerService.showTypingIndicator;\n\n /** Message sent event */\n readonly messageSent = output<AXSendMessageCommand>();\n\n /** Emoji clicked event */\n readonly emojiClick = output<void>();\n\n /** Attach clicked event */\n readonly attachClick = output<void>();\n\n /** Voice clicked event */\n readonly voiceClick = output<void>();\n\n /** Active conversation */\n readonly activeConversation = this.conversationService.activeConversation;\n readonly activeMessages = this.conversationService.activeMessages;\n\n /** Active component from service */\n readonly activeComponent = this.composerService.activeComponent;\n\n /** Emoji popover state */\n private readonly emojiPopoverRef = viewChild<any>('emojiPopover');\n readonly emojiPopoverTarget = signal<HTMLElement | null>(null);\n readonly composerPopupComponent = AXComposerPopupComponent;\n\n /** Input placeholder - use service */\n readonly placeholder = this.composerService.placeholder;\n\n /** Sending message state */\n readonly sendingMessage = signal(false);\n\n /** Typing indicator subject for rate limiting */\n private readonly typingSubject = new Subject<string>();\n\n // Setup typing indicator throttling\n constructor() {\n this.typingSubject\n .pipe(throttleTime(this.config.typingIndicatorThrottle ?? 2000), takeUntilDestroyed())\n .subscribe((conversationId) => {\n this.conversationService.sendTypingIndicator(conversationId);\n });\n }\n\n // React to controller signals (reply/edit)\n #controllerEffect = effect(() => {\n const reply = this.composerService.replyMessage();\n const edit = this.composerService.editMessage();\n\n if (reply) {\n this.startReply(reply);\n } else if (edit) {\n this.startEdit(edit);\n } else {\n // Clear local state when service signals are cleared\n this.editingMessage.set(null);\n this.replyingToMessage.set(null);\n }\n });\n\n // Reset composer state when conversation changes\n #previousConversationId: string | undefined = undefined;\n #conversationChangeEffect = effect(() => {\n const conversation = this.activeConversation();\n const currentId = conversation?.id;\n\n // Save draft for previous conversation\n if (this.#previousConversationId && this.#previousConversationId !== currentId) {\n this.composerService.saveDraft(this.#previousConversationId, this.draftText());\n }\n\n // Only reset if conversation ID actually changed (not on initial load)\n if (currentId !== this.#previousConversationId && this.#previousConversationId !== undefined) {\n this.resetComposerState();\n }\n\n // Load draft for new conversation\n if (currentId && currentId !== this.#previousConversationId) {\n const draft = this.composerService.loadDraft(currentId);\n if (draft) {\n this.draftText.set(draft);\n }\n }\n\n this.#previousConversationId = currentId;\n });\n\n // Auto-save draft on text change\n #draftAutoSaveEffect = effect(() => {\n const text = this.draftText();\n const conversation = this.activeConversation();\n\n if (conversation?.id) {\n // Debounce auto-save\n if (this.draftSaveTimeout) {\n clearTimeout(this.draftSaveTimeout);\n }\n this.draftSaveTimeout = window.setTimeout(() => {\n this.composerService.saveDraft(conversation.id, text);\n }, 500);\n }\n });\n\n private draftSaveTimeout?: number;\n\n /** Number of input rows - use service */\n readonly inputRows = this.composerService.inputRows;\n\n /** Can send message - use service */\n readonly canSend = this.composerService.canSend;\n\n /** Left actions from registry - use service */\n readonly leftActions = this.composerService.leftActions;\n\n /** Right actions from registry - use service */\n readonly rightActions = this.composerService.rightActions;\n\n /** Left inline actions (location = 'inline' or undefined) */\n readonly leftInlineActions = this.composerService.leftInlineActions;\n\n /** Left menu actions (location = 'menu') */\n readonly leftMenuActions = this.composerService.leftMenuActions;\n\n /** Right inline actions (location = 'inline' or undefined) */\n readonly rightInlineActions = this.composerService.rightInlineActions;\n\n /** Right menu actions (location = 'menu') */\n readonly rightMenuActions = this.composerService.rightMenuActions;\n\n /** Handle key down */\n onKeyDown(event: AXHtmlEvent<KeyboardEvent>): void {\n const key = event?.nativeEvent?.key;\n const shiftKey = event?.nativeEvent?.shiftKey;\n\n // Send on Enter (without Shift)\n if (key === 'Enter' && !shiftKey) {\n event?.nativeEvent?.preventDefault();\n if (this.canSend()) {\n this.onSendClick();\n }\n }\n\n // Send typing indicator\n this.sendTypingIndicator();\n }\n\n /** Handle input */\n onInput(): void {\n this.sendTypingIndicator();\n }\n\n /** Send typing indicator (throttled via RxJS) */\n private sendTypingIndicator(): void {\n const conversation = this.activeConversation();\n if (!conversation) return;\n\n // Emit to throttled subject\n this.typingSubject.next(conversation.id);\n }\n\n /** Cleanup on destroy */\n ngOnDestroy(): void {\n this.typingSubject.complete();\n\n // Save draft before destroying\n const conversation = this.activeConversation();\n if (conversation?.id) {\n this.composerService.saveDraft(conversation.id, this.draftText());\n }\n\n // Clear timeout\n if (this.draftSaveTimeout) {\n clearTimeout(this.draftSaveTimeout);\n }\n }\n\n /** Handle send click */\n async onSendClick(): Promise<void> {\n if (!this.canSend() || this.sendingMessage()) return;\n\n const conversation = this.activeConversation();\n if (!conversation) return;\n\n const text = this.draftText().trim();\n const editingMsg = this.editingMessage();\n\n this.sendingMessage.set(true);\n try {\n // Check if we're editing a message\n if (editingMsg) {\n // Edit existing message\n await this.conversationService.editMessage(editingMsg.id, { type: 'text', text });\n } else {\n // Create send command for new message\n const command: AXSendMessageCommand = {\n conversationId: conversation.id,\n type: 'text',\n payload: { type: 'text', text },\n replyToId: this.replyingToMessage()?.id,\n };\n\n // Send new message\n this.conversationService.sendMessage(command);\n this.messageSent.emit(command);\n // Request message list to scroll to bottom after sending\n this.messageListService.requestScrollToBottom();\n }\n\n // Clear input and draft\n this.draftText.set('');\n this.attachments.set([]);\n this.cancelEditReply();\n this.composerService.clear();\n\n // Clear saved draft after successful send\n if (conversation.id) {\n this.composerService.clearDraft(conversation.id);\n }\n\n // Focus input\n setTimeout(() => {\n this.inputElementRef()?.nativeElement?.focus();\n }, 0);\n } catch (error) {\n console.error('Failed to send/edit message:', error);\n } finally {\n this.sendingMessage.set(false);\n }\n }\n\n /** Handle emoji click */\n async onEmojiClick(event?: MouseEvent): Promise<void> {\n this.emojiClick.emit();\n\n const target = event?.currentTarget as HTMLElement;\n if (!target) return;\n\n const popover = this.emojiPopoverRef();\n if (popover?.isOpen) {\n popover.close();\n } else {\n this.emojiPopoverTarget.set(target);\n setTimeout(() => {\n this.emojiPopoverRef()?.open();\n }, 0);\n }\n }\n\n /** Handle emoji popover closed */\n onEmojiPopoverClosed(): void {\n this.emojiPopoverTarget.set(null);\n }\n\n /** Handle emoji/sticker selection from popup */\n onEmojiItemSelected(item: string | AXStickerPayload): void {\n if (typeof item === 'string') {\n // Emoji selected\n this.draftText.update((text) => text + item);\n } else if (item && 'url' in item) {\n // Sticker selected - send immediately\n this.sendSticker(item);\n }\n this.emojiPopoverRef()?.close();\n }\n\n /** Send sticker message */\n private async sendSticker(sticker: AXStickerPayload): Promise<void> {\n const conversation = this.activeConversation();\n if (!conversation) return;\n\n const command: AXSendMessageCommand = {\n conversationId: conversation.id,\n type: 'sticker',\n payload: {\n type: 'sticker',\n id: sticker.id,\n packId: 'giphy',\n url: sticker.url,\n animated: sticker.url.endsWith('.gif'),\n width: sticker.width,\n height: sticker.height,\n },\n replyToId: this.replyingToMessage()?.id,\n };\n\n try {\n await this.conversationService.sendMessage(command);\n // Clear reply mode after sending\n this.cancelEditReply();\n // Request message list to scroll to bottom after sending sticker\n this.messageListService.requestScrollToBottom();\n } catch (error) {\n console.error('Failed to send sticker:', error);\n }\n }\n\n /** Get inputs for emoji popup component */\n getEmojiPopupInputs(): Record<string, any> {\n return {\n onItemSelected: (item: any) => this.onEmojiItemSelected(item),\n };\n }\n\n /** Handle attach click */\n onAttachClick(): void {\n this.attachClick.emit();\n }\n\n /** Handle voice click */\n onVoiceClick(): void {\n this.voiceClick.emit();\n }\n\n /** Remove attachment */\n removeAttachment(index: number): void {\n this.attachments.update((files) => files.filter((_, i) => i !== index));\n }\n\n /** Files selected via uploader */\n async onFilesSelected(e: AXUploaderChangedEvent): Promise<void> {\n const conversation = this.activeConversation();\n if (!conversation) return;\n\n for (const req of e.requests) {\n try {\n // Validate file before upload\n this.validateFile(req.file);\n\n await req.upload();\n const result = await this.messageApi.uploadFile(req.file, conversation.id);\n req.finish(result);\n // Keep local preview list\n this.attachments.update((files) => [...files, req.file]);\n } catch (err: unknown) {\n const errorMessage = err instanceof Error ? err.message : 'Upload failed';\n req.error(errorMessage);\n }\n }\n }\n\n /**\n * Validate file before upload\n * @param file - File to validate\n * @throws {Error} If file is invalid\n */\n private validateFile(file: File): void {\n // Check file size\n const maxSize = this.config.maxFileSize ?? 10 * 1024 * 1024; // Default 10MB\n if (file.size > maxSize) {\n throw new Error(`File size exceeds ${Math.round(maxSize / (1024 * 1024))}MB limit`);\n }\n\n // Check file type\n const allowedTypes = this.config.allowedFileTypes ?? [];\n if (allowedTypes.length > 0) {\n const isAllowed = allowedTypes.some((type) => {\n // Convert glob pattern to regex (e.g., \"image/*\" -> /^image\\/.*/\n const pattern = type.replace(/\\*/g, '.*');\n const regex = new RegExp(`^${pattern}$`);\n return regex.test(file.type);\n });\n\n if (!isAllowed) {\n throw new Error(`File type \"${file.type}\" is not allowed`);\n }\n }\n\n // Check for empty files\n if (file.size === 0) {\n throw new Error('Cannot upload empty file');\n }\n }\n\n /** Cancel edit/reply mode */\n cancelEditReply(): void {\n this.editingMessage.set(null);\n this.replyingToMessage.set(null);\n this.composerService.clear();\n }\n\n /** Reset all composer states (used when switching conversations) */\n private resetComposerState(): void {\n // Clear edit/reply states\n this.editingMessage.set(null);\n this.replyingToMessage.set(null);\n\n // Clear service states (reply/edit messages, active component)\n this.composerService.clear();\n\n // Close any open popover/popup\n this.emojiPopoverTarget.set(null);\n\n // Clear attachments\n this.attachments.set([]);\n\n // Clear draft text\n this.draftText.set('');\n }\n\n /** Start editing a message */\n startEdit(message: any): void {\n this.editingMessage.set(message);\n this.replyingToMessage.set(null);\n this.draftText.set(message.payload?.text || '');\n this.inputElementRef()?.nativeElement?.focus();\n }\n\n /** Start replying to a message */\n startReply(message: AXMessage): void {\n this.replyingToMessage.set(message);\n this.editingMessage.set(null);\n this.inputElementRef()?.nativeElement?.focus();\n }\n\n /** Handle action click */\n async onActionClick(actionId: string, event?: MouseEvent): Promise<void> {\n const action = this.registry.composerActions.getActionById(actionId);\n if (!action) return;\n\n const context = this.composerService.actionContext();\n\n // Special handling for emoji action\n if (actionId === 'emoji') {\n this.onEmojiClick(event);\n return;\n }\n\n // If action has a component and is toggleable, toggle it\n if (action.component && action.toggleable) {\n this.composerService.toggleComponent(action, {\n conversation: this.activeConversation(),\n service: this.composerService,\n });\n return;\n }\n\n // If action has a component, show it\n if (action.component) {\n this.composerService.showComponent(action, {\n conversation: this.activeConversation(),\n service: this.composerService,\n });\n return;\n }\n\n // Otherwise execute the handler\n if (action.handler) {\n try {\n await action.handler(context);\n } catch (error) {\n console.error('Failed to execute action:', error);\n }\n }\n }\n\n /** Check if action is enabled */\n isActionEnabled(action: any): boolean {\n const context = this.composerService.actionContext();\n return action.enabled ? action.enabled(context) : true;\n }\n\n /** Get replying sender name */\n getReplyingSenderName(): string {\n const message = this.replyingToMessage();\n if (!message) return '';\n\n const conversation = this.activeConversation();\n const participant = conversation?.participants.find((p) => p.id === message.senderId);\n return participant?.name || 'Unknown';\n }\n\n /** Get replying message text */\n getReplyingMessageText(): string {\n const message = this.replyingToMessage();\n if (!message) return '';\n\n if (message.type === 'text') {\n const text = (message.payload as any)?.text || '';\n return text.length > 50 ? text.substring(0, 50) + '...' : text;\n }\n return `[${message.type}]`;\n }\n\n /** Preview object for replying banner (type, icon, value) */\n getReplyingPreview(): { value: string; type: string; icon: string } | null {\n const message = this.replyingToMessage();\n if (!message) return null;\n return AXConversationMessageUtilsService.getPreviewText(message, 100);\n }\n\n /** Preview object for editing banner (type, icon, value) */\n getEditingPreview(): { value: string; type: string; icon: string } | null {\n const message = this.editingMessage() as AXMessage | null;\n if (!message) return null;\n return AXConversationMessageUtilsService.getPreviewText(message, 100);\n }\n\n /** Handle reply preview click - scroll to original message */\n onReplyPreviewClick(): void {\n const message = this.replyingToMessage();\n if (!message) return;\n\n const messageElement = document.getElementById(`message-${message.id}`);\n if (messageElement) {\n messageElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n // Highlight the message briefly\n messageElement.classList.add('message-highlight');\n setTimeout(() => {\n messageElement.classList.remove('message-highlight');\n }, this.config.messageHighlightDuration ?? 2000);\n }\n }\n\n /** Get inputs for dynamic component */\n getComponentInputs(): Record<string, any> {\n const activeComp = this.activeComponent();\n if (!activeComp) return {};\n\n return {\n ...activeComp.inputs,\n conversation: this.activeConversation(),\n service: this.composerService,\n };\n }\n\n async onEnter(event: AXHtmlEvent<KeyboardEvent>) {\n if (event.nativeEvent.key === 'Enter' && !event.nativeEvent.shiftKey) {\n event.nativeEvent.preventDefault();\n await this.onSendClick();\n }\n }\n}\n","/**\n * ConversationContainer Component\n * Top-level container that provides context and layout for the conversation system\n */\n\nimport { AXResizableDirective } from '@acorex/cdk/resizable';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { AXConversationService } from '../../services/conversation.service';\nimport { CONVERSATION_CONFIG } from '../../tokens';\n\n@Component({\n selector: 'ax-conversation-container',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AXResizableDirective],\n template: `\n <div [class]=\"containerClasses()\" role=\"main\" aria-label=\"Conversation interface\">\n <!-- Sidebar -->\n <div\n class=\"conversation-sidebar-container\"\n [axResizable]=\"true\"\n [minWidth]=\"config.minSidebarWidth ?? 250\"\n [maxWidth]=\"config.maxSidebarWidth ?? 500\"\n [width]=\"config.defaultSidebarWidth ?? 300\"\n role=\"navigation\"\n aria-label=\"Conversation list\"\n >\n <ng-content select=\"ax-conversation-sidebar, [ax-conversation-sidebar]\"></ng-content>\n </div>\n\n <!-- Main conversation view -->\n <div\n class=\"conversation-main-container\"\n role=\"region\"\n [attr.aria-label]=\"activeConversation() ? 'Active conversation' : 'No conversation selected'\"\n >\n @if (activeConversation(); as conversation) {\n <div class=\"conversation-view\">\n <!-- Info Bar -->\n <ng-content select=\"ax-conversation-info-bar, [ax-conversation-info-bar]\"></ng-content>\n\n <!-- Messages -->\n <div class=\"conversation-messages\">\n <ng-content select=\"ax-conversation-message-list, [ax-conversation-message-list]\"></ng-content>\n </div>\n\n <!-- Composer -->\n <ng-content select=\"ax-conversation-composer, [ax-conversation-composer]\"></ng-content>\n </div>\n } @else {\n <div class=\"conversation-empty-state\">\n <div class=\"empty-state-content\">\n <ng-content select=\"ax-conversation-empty\">\n <svg class=\"empty-state-icon\" width=\"120\" height=\"120\" viewBox=\"0 0 120 120\" fill=\"none\">\n <circle cx=\"60\" cy=\"60\" r=\"50\" fill=\"#f3f4f6\" />\n <path d=\"M40 50h40M40 70h30\" stroke=\"#9ca3af\" stroke-width=\"3\" stroke-linecap=\"round\" />\n </svg>\n <h3 class=\"empty-state-title\">No Conversation Selected</h3>\n <p class=\"empty-state-description\">Select a conversation from the sidebar to start messaging</p>\n </ng-content>\n </div>\n </div>\n }\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n outline: none; /* Remove focus outline since tabindex is only for keyboard events */\n }\n\n .conversation-container {\n display: flex;\n width: 100%;\n height: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n overflow: hidden;\n }\n\n .conversation-container-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .conversation-sidebar-container {\n flex-shrink: 0;\n height: 100%;\n display: none;\n width: 0;\n border-inline-end: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n /* Show sidebar container only when there is projected content */\n .conversation-sidebar-container:has(*) {\n display: block;\n width: var(--ax-conversation-sidebar-width, 320px);\n }\n\n .conversation-main-container {\n flex: 1;\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .conversation-view {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .conversation-messages {\n flex: 1;\n overflow: hidden;\n }\n\n .conversation-empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n }\n\n .empty-state-content {\n text-align: center;\n padding: 2rem;\n max-width: 400px;\n }\n\n .empty-state-icon {\n margin: 0 auto 1.5rem;\n opacity: 0.8;\n }\n\n .empty-state-title {\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0 0 0.5rem;\n }\n\n .empty-state-description {\n font-size: 1rem;\n margin: 0;\n opacity: 0.7;\n }\n `,\n ],\n host: {\n '[class.conversation-container-host]': 'true',\n '[tabindex]': '\"-1\"',\n '(keydown.escape)': 'closeActiveConversation()',\n },\n})\nexport class AXConversationContainerComponent {\n private readonly conversationService = inject(AXConversationService);\n protected readonly config = inject(CONVERSATION_CONFIG);\n\n /** Custom CSS class */\n readonly customClass = input<string>('');\n\n /** Loading state */\n readonly loading = this.conversationService.loading;\n\n /** Error state */\n readonly error = this.conversationService.error;\n\n /** Active conversation */\n readonly activeConversation = this.conversationService.activeConversation;\n\n /** Container CSS classes */\n readonly containerClasses = computed(() => {\n const classes = ['conversation-container'];\n\n if (this.loading()) {\n classes.push('conversation-container-loading');\n }\n\n if (this.customClass()) {\n classes.push(this.customClass());\n }\n\n return classes.join(' ');\n });\n\n closeActiveConversation(): void {\n this.conversationService.closeActiveConversation();\n }\n}\n","/**\n * Conversation Container Directive\n * Provides conversation context without imposing layout structure\n */\n\nimport { Directive, inject } from '@angular/core';\nimport { AXConversationService } from '../../services/conversation.service';\n\n@Directive({\n selector: '[axConversationContainer]',\n host: {\n '[class.ax-conversation-container]': 'true',\n '[tabindex]': '\"-1\"',\n '[style.outline]': '\"none\"',\n '(keydown.escape)': 'closeActiveConversation()',\n },\n})\nexport class AXConversationContainerDirective {\n private readonly conversationService = inject(AXConversationService);\n\n /** Active conversation */\n readonly activeConversation = this.conversationService.activeConversation;\n\n /** Loading state */\n readonly loading = this.conversationService.loading;\n\n /** Error state */\n readonly error = this.conversationService.error;\n\n closeActiveConversation(): void {\n this.conversationService.closeActiveConversation();\n }\n}\n","/**\n * AXInfoBarService\n * Facade/service for Info Bar to interact with registries and conversation state.\n */\nimport { inject, Injectable, signal, Type } from '@angular/core';\nimport { AXConversation } from '../../models';\nimport { AXInfoBarAction } from '../../registries';\nimport { AXConversationService } from '../../services';\n\n/**\n * Active component state in info-bar\n */\nexport interface AXInfoBarActiveComponent {\n /** Action that triggered this component */\n action: AXInfoBarAction;\n /** Component to render */\n component: Type<unknown>;\n /** Component inputs */\n inputs?: Record<string, unknown>;\n}\n\n/**\n * Info Bar Service\n * Manages info bar state and actions\n */\n@Injectable()\nexport class AXInfoBarService {\n private readonly conversationService = inject(AXConversationService);\n\n // Access registry through conversation service\n private get registry() {\n return this.conversationService.registry;\n }\n\n /** Active conversation */\n readonly activeConversation = this.conversationService.activeConversation;\n\n /** Active component being shown in info-bar */\n private readonly _activeComponent = signal<AXInfoBarActiveComponent | null>(null);\n readonly activeComponent = this._activeComponent.asReadonly();\n\n /** Search query signal */\n private readonly _searchQuery = signal<string>('');\n readonly searchQuery = this._searchQuery.asReadonly();\n\n private readonly _searchResultsCount = signal<number>(0);\n readonly searchResultsCount = this._searchResultsCount.asReadonly();\n\n /** Current search result index */\n private readonly _currentSearchIndex = signal<number>(0);\n readonly currentSearchIndex = this._currentSearchIndex.asReadonly();\n\n /**\n * Get actions for the active conversation\n */\n getActionsForConversation(conversation: AXConversation) {\n return this.registry.infoBarActions.getActionsForConversation(conversation);\n }\n\n /**\n * Execute an action\n */\n async executeAction(actionId: string, conversation: AXConversation, data?: Record<string, unknown>): Promise<void> {\n const action = this.registry.infoBarActions.getById(actionId);\n if (!action) {\n console.warn(`Action '${actionId}' not found in registry`);\n return;\n }\n\n // Check if action is enabled (static)\n if (action.enabled === false) {\n console.warn(`Action '${actionId}' is disabled`);\n return;\n }\n\n const context = {\n conversation,\n conversationService: this.conversationService,\n infoBarService: this,\n data,\n };\n\n // Check if action is enabled (dynamic)\n if (action.enabledWhen && !action.enabledWhen(context)) {\n console.warn(`Action '${actionId}' is disabled for this context`);\n return;\n }\n\n // Execute handler if provided\n if (action.handler) {\n await action.handler(context);\n }\n }\n\n /**\n * Get action label\n */\n getActionLabel(action: AXInfoBarAction, conversation: AXConversation): string {\n return this.registry.infoBarActions.getActionLabel(action, conversation);\n }\n\n /**\n * Get action icon\n */\n getActionIcon(action: AXInfoBarAction, conversation: AXConversation): string | undefined {\n return this.registry.infoBarActions.getActionIcon(action, conversation);\n }\n\n /**\n * Show a component in the info-bar\n */\n showComponent(action: AXInfoBarAction, inputs?: Record<string, unknown>): void {\n if (!action.component) return;\n\n this._activeComponent.set({\n action,\n component: action.component,\n inputs,\n });\n }\n\n /**\n * Hide the active component\n */\n hideComponent(): void {\n const current = this._activeComponent();\n\n // Clear any state associated with the active component\n if (current) {\n // If it's a search component, clear search state\n if (current.action.id === 'search') {\n this.clearSearch();\n }\n // Add more cleanup logic here for other component types if needed\n }\n\n this._activeComponent.set(null);\n }\n\n /**\n * Toggle component visibility\n */\n toggleComponent(action: AXInfoBarAction, inputs?: Record<string, unknown>): void {\n const current = this._activeComponent();\n if (current?.action.id === action.id) {\n this.hideComponent();\n } else {\n this.showComponent(action, inputs);\n }\n }\n\n /**\n * Set search query\n */\n setSearchQuery(query: string): void {\n this._searchQuery.set(query);\n }\n\n /**\n * Set search results\n */\n setSearchResults(count: number, currentIndex = 0): void {\n this._searchResultsCount.set(count);\n this._currentSearchIndex.set(currentIndex);\n }\n\n /**\n * Navigate to next search result\n */\n nextSearchResult(): void {\n const count = this._searchResultsCount();\n if (count === 0) return;\n\n const current = this._currentSearchIndex();\n this._currentSearchIndex.set((current + 1) % count);\n }\n\n /**\n * Navigate to previous search result\n */\n previousSearchResult(): void {\n const count = this._searchResultsCount();\n if (count === 0) return;\n\n const current = this._currentSearchIndex();\n this._currentSearchIndex.set(current === 0 ? count - 1 : current - 1);\n }\n\n /**\n * Clear search\n */\n clearSearch(): void {\n this._searchQuery.set('');\n this._searchResultsCount.set(0);\n this._currentSearchIndex.set(0);\n }\n}\n","/**\n * Members Popover Component\n * Shows list of conversation members with avatars\n */\n\nimport { AXAvatarComponent } from '@acorex/components/avatar';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { CommonModule } from '@angular/common';\nimport { Component, input } from '@angular/core';\nimport { AXConversation } from '../../models';\n\n@Component({\n selector: 'ax-conversation-members-popover',\n imports: [CommonModule, AXAvatarComponent, AXImageComponent, AXLabelComponent],\n template: `\n <div class=\"members-popover\">\n <div class=\"members-header\">\n <span class=\"members-title\">Members ({{ conversation().participants.length }})</span>\n </div>\n <div class=\"members-list\">\n @for (participant of conversation().participants; track participant.id) {\n <div class=\"member-item\">\n <ax-avatar [size]=\"36\">\n @if (participant.avatar) {\n <ax-image [src]=\"participant.avatar\" [alt]=\"participant.name\"></ax-image>\n } @else {\n <ax-label>{{ getInitials(participant.name) }}</ax-label>\n }\n </ax-avatar>\n <div class=\"member-info\">\n <span class=\"member-name\">{{ participant.name }}</span>\n @if (participant.role) {\n <span class=\"member-role\">{{ participant.role }}</span>\n }\n </div>\n @if (participant.status) {\n <span\n class=\"member-status\"\n [class.status-online]=\"participant.status === 'online'\"\n [class.status-offline]=\"participant.status === 'offline'\"\n [class.status-away]=\"participant.status === 'away'\"\n ></span>\n }\n </div>\n }\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .members-popover {\n width: 280px;\n max-height: 400px;\n border-radius: 0.5rem;\n display: flex;\n flex-direction: column;\n background: rgb(var(--ax-sys-color-surface));\n }\n\n .members-header {\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .members-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .members-list {\n overflow-y: auto;\n padding: 0.5rem;\n }\n\n .member-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem;\n border-radius: 0.5rem;\n transition: background 0.2s;\n cursor: pointer;\n }\n\n .member-item:hover {\n background: rgb(var(--ax-sys-color-lighter-surface));\n }\n\n .member-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n }\n\n .member-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .member-role {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-primary-500));\n text-transform: capitalize;\n }\n\n .member-status {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n // border: 2px solid rgb(var(--ax-sys-color-surface));\n flex-shrink: 0;\n }\n\n .member-status.status-online {\n background: rgb(var(--ax-sys-color-success-500));\n }\n\n .member-status.status-offline {\n background: rgb(var(--ax-sys-color-neutral-400));\n }\n\n .member-status.status-away {\n background: rgb(var(--ax-sys-color-warning-500));\n }\n `,\n ],\n})\nexport class MembersPopoverComponent {\n /** Conversation */\n readonly conversation = input.required<AXConversation>();\n\n /** Get initials from name */\n getInitials(name: string): string {\n return name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n }\n}\n","/**\n * InfoBar Component\n * Header bar showing conversation info and actions\n */\n\nimport { AXAvatarComponent } from '@acorex/components/avatar';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownPanelComponent } from '@acorex/components/dropdown';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipModule } from '@acorex/components/tooltip';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport { Component, computed, inject, output, signal, viewChild } from '@angular/core';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationMessageUtilsService } from '../../utils';\nimport { AXInfoBarService } from './info-bar.service';\nimport { MembersPopoverComponent } from './members-popover.component';\n\n// Keep dropdown menu types for backward compatibility\nexport interface DropdownMenuItem {\n id: string;\n label: string;\n icon?: string;\n disabled?: boolean;\n divider?: boolean;\n destructive?: boolean;\n shortcut?: string;\n}\n\n@Component({\n selector: 'ax-conversation-info-bar',\n imports: [\n CommonModule,\n NgComponentOutlet,\n AXAvatarComponent,\n AXButtonModule,\n AXDropdownPanelComponent,\n AXDecoratorModule,\n AXImageComponent,\n AXLabelComponent,\n AXTooltipModule,\n AXPopoverComponent,\n MembersPopoverComponent,\n ],\n template: `\n @if (activeConversation(); as conversation) {\n <div class=\"info-bar\">\n <!-- Left: Avatar and Info -->\n <ng-content select=\"ax-prefix\"></ng-content>\n <div class=\"info-left\">\n <div\n class=\"avatar-wrapper\"\n (click)=\"onAvatarClick()\"\n role=\"button\"\n tabindex=\"0\"\n (keydown.enter)=\"onAvatarClick()\"\n >\n <ax-avatar [size]=\"48\">\n @if (conversation.avatar) {\n <ax-image [src]=\"conversation.avatar\" alt=\"{{ conversation.title }}\"></ax-image>\n } @else {\n <ax-label>{{ getInitials(conversation.title) }}</ax-label>\n }\n </ax-avatar>\n @if (conversation.type === 'private') {\n <span\n class=\"avatar-status\"\n [class.status-online]=\"getStatus(conversation) === 'online'\"\n [class.status-offline]=\"getStatus(conversation) === 'offline'\"\n [class.status-away]=\"getStatus(conversation) === 'away'\"\n ></span>\n }\n </div>\n\n <div class=\"info-details\">\n <p class=\"info-title\">{{ conversation.title }}</p>\n @if (conversation.type !== 'private') {\n <p\n #membersTarget\n class=\"info-subtitle clickable\"\n (click)=\"onMembersClick($event)\"\n role=\"button\"\n tabindex=\"0\"\n >\n {{ getSubtitle(conversation) }}\n </p>\n } @else {\n <div class=\"info-subtitle-with-status\">\n @if (getStatus(conversation) === 'online') {\n <span class=\"online-badge\">●</span>\n }\n <p class=\"info-subtitle\">{{ getSubtitle(conversation) }}</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Members Popover -->\n <ax-popover #membersPopover [target]=\"membersPopoverTarget()\">\n <ax-conversation-members-popover [conversation]=\"activeConversation()!\"></ax-conversation-members-popover>\n </ax-popover>\n\n <!-- Right: Actions or Full-Width Component -->\n @if (!activeComponent()) {\n <div class=\"info-actions\">\n <!-- Inline action buttons from registry -->\n @for (action of inlineActions(); track action.id) {\n <ax-button\n class=\"action-button\"\n (onClick)=\"onInlineActionClick(action.id)\"\n [axTooltip]=\"registry.infoBarActions.getActionTooltip(action, activeConversation()!)\"\n >\n <ax-icon [icon]=\"registry.infoBarActions.getActionIcon(action, activeConversation()!)\"></ax-icon>\n </ax-button>\n }\n\n <ax-button look=\"blank\" [axTooltip]=\"'More'\">\n <ax-icon><i class=\"fa-light fa-ellipsis\"></i></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (item of menuItems(); track item.id) {\n @if (item.divider) {\n <ax-divider></ax-divider>\n } @else {\n <ax-button-item\n [text]=\"item.label\"\n [disabled]=\"item.disabled\"\n [color]=\"item.destructive ? 'danger' : 'default'\"\n (onClick)=\"onMenuItemClick(item)\"\n >\n @if (item.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"item.icon\"></ax-icon>\n </ax-prefix>\n }\n @if (item.shortcut) {\n <ax-suffix>\n <ax-label class=\"shortcut\">{{ item.shortcut }}</ax-label>\n </ax-suffix>\n }\n </ax-button-item>\n }\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n </div>\n }\n\n @if (activeComponent()) {\n <!-- Full-width component mode (e.g., search) - takes entire info-bar -->\n <div class=\"info-component-fullwidth\" animate.enter=\"slide-in\" animate.leave=\"slide-out\">\n <ng-container\n *ngComponentOutlet=\"activeComponent()!.component; inputs: getComponentInputs()\"\n ></ng-container>\n <ax-button\n class=\"action-button close-button\"\n (onClick)=\"onCloseComponent()\"\n [look]=\"'ghost'\"\n axTooltip=\"Close\"\n >\n <ax-icon><i class=\"fa-light fa-xmark\"></i></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .info-bar {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n overflow: hidden;\n padding: 0.5rem;\n line-height: 1.1rem;\n min-height: 65px;\n gap: 0.75rem;\n }\n\n .info-bar-empty {\n justify-content: center;\n opacity: 0.6;\n }\n\n .info-left {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n flex: 1;\n min-width: 0;\n }\n\n .info-details {\n flex: 1;\n min-width: 0;\n }\n\n .info-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .info-subtitle-with-status {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n margin: 0.125rem 0 0;\n }\n\n .online-badge {\n color: #22c55e;\n font-size: 0.625rem;\n line-height: 1;\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n }\n\n .info-subtitle {\n margin: 0;\n font-size: 0.85rem;\n letter-spacing: 0.02rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n opacity: 0.7;\n }\n\n .info-subtitle.clickable {\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n .info-subtitle.clickable:hover {\n opacity: 1;\n text-decoration: underline;\n }\n\n .info-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n }\n\n .info-component-fullwidth {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n background: rgb(var(--ax-sys-color-lightest-surface));\n z-index: 10;\n }\n\n /* Enter animation */\n .slide-in {\n animation: slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n }\n\n @keyframes slideInFromRight {\n from {\n opacity: 0;\n transform: translateX(100%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n /* Leave animation */\n .slide-out {\n opacity: 0;\n transform: translateX(100%);\n transition:\n opacity 250ms cubic-bezier(0.4, 0, 1, 1),\n transform 250ms cubic-bezier(0.4, 0, 1, 1);\n }\n\n .info-component-fullwidth > *:first-child {\n flex: 1;\n min-width: 0;\n }\n\n .action-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 0.5rem;\n font-size: 1.25rem;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .action-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .search-container {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n min-width: 200px;\n }\n\n .search-input {\n flex: 1;\n min-width: 0;\n }\n `,\n ],\n})\nexport class AXInfoBarComponent {\n private readonly conversationService = inject(AXConversationService);\n private readonly infoBar = inject(AXInfoBarService);\n\n // Access registry through conversation service\n protected get registry() {\n return this.conversationService.registry;\n }\n\n /** Active conversation */\n readonly activeConversation = this.infoBar.activeConversation;\n\n /** Active component from service */\n readonly activeComponent = this.infoBar.activeComponent;\n\n /** Members popover reference */\n readonly membersPopoverRef = viewChild<AXPopoverComponent>('membersPopover');\n\n /** Members popover target element */\n readonly membersPopoverTarget = signal<HTMLElement | null>(null);\n\n /** Loading state for async actions */\n readonly actionLoading = signal<boolean>(false);\n\n /** Avatar clicked event */\n readonly avatarClick = output<void>();\n\n /** Search clicked event */\n readonly searchClick = output<void>();\n\n /** Search query changed event */\n readonly searchQuery = output<string>();\n\n /** Menu item clicked event */\n readonly menuItemAction = output<string>();\n\n /** Inline action buttons from registry */\n readonly inlineActions = computed(() => {\n const conversation = this.activeConversation();\n if (!conversation) return [];\n return this.registry.infoBarActions.getInlineActions(conversation);\n });\n\n /** Dropdown menu items from registry */\n readonly menuItems = computed((): DropdownMenuItem[] => {\n const conversation = this.activeConversation();\n if (!conversation) return [];\n\n // Get menu actions from registry\n const actions = this.registry.infoBarActions.getMenuActions(conversation);\n\n // Convert actions to dropdown menu items\n const result = actions.map((action) => ({\n id: action.id,\n label: this.registry.infoBarActions.getActionLabel(action, conversation),\n icon: this.registry.infoBarActions.getActionIcon(action, conversation),\n divider: action.divider,\n destructive: action.destructive,\n disabled: action.enabled === false || (action.enabledWhen ? !action.enabledWhen({ conversation }) : false),\n }));\n return result;\n });\n\n /** Get conversation status - delegate to utils */\n getStatus(conversation: AXConversation): 'online' | 'offline' | 'away' | undefined {\n return AXConversationMessageUtilsService.getConversationStatus(conversation);\n }\n\n /** Get subtitle text - delegate to utils */\n getSubtitle(conversation: AXConversation): string {\n return AXConversationMessageUtilsService.getConversationSubtitle(conversation);\n }\n\n /** Get initials from name - delegate to utils */\n getInitials(name: string): string {\n return AXConversationMessageUtilsService.getInitials(name);\n }\n\n /** Handle avatar click */\n onAvatarClick(): void {\n this.avatarClick.emit();\n }\n\n /** Handle members click - open popover */\n onMembersClick(event: MouseEvent): void {\n const target = event.currentTarget as HTMLElement;\n if (!target) return;\n\n const popover = this.membersPopoverRef();\n if (popover?.isOpen) {\n popover.close();\n } else {\n this.membersPopoverTarget.set(target);\n setTimeout(() => {\n this.membersPopoverRef()?.open();\n }, 0);\n }\n }\n\n /** Handle inline action click */\n async onInlineActionClick(actionId: string): Promise<void> {\n const conversation = this.activeConversation();\n if (!conversation) return;\n\n const action = this.registry.infoBarActions.getById(actionId);\n if (!action) return;\n\n // If action has a component and is toggleable, toggle it\n if (action.component && action.toggleable) {\n this.infoBar.toggleComponent(action, {\n conversation,\n service: this.infoBar,\n });\n return;\n }\n\n // If action has a component, show it\n if (action.component) {\n this.infoBar.showComponent(action, {\n conversation,\n service: this.infoBar,\n });\n return;\n }\n\n // Otherwise execute the handler\n this.actionLoading.set(true);\n try {\n await this.infoBar.executeAction(actionId, conversation);\n } catch (error) {\n console.error('Failed to execute inline action:', error);\n } finally {\n this.actionLoading.set(false);\n }\n }\n\n /** Get inputs for dynamic component */\n getComponentInputs(): Record<string, any> {\n const activeComp = this.activeComponent();\n if (!activeComp) return {};\n\n return {\n ...activeComp.inputs,\n conversation: this.activeConversation(),\n service: this.infoBar,\n };\n }\n\n /** Handle close component */\n onCloseComponent(): void {\n this.infoBar.hideComponent();\n }\n\n /** Handle menu item click */\n async onMenuItemClick(item: DropdownMenuItem): Promise<void> {\n const conversation = this.activeConversation();\n if (!conversation) return;\n\n // Execute action through service\n this.actionLoading.set(true);\n try {\n await this.infoBar.executeAction(item.id, conversation);\n this.menuItemAction.emit(item.id);\n } catch (error) {\n console.error('Failed to execute action:', error);\n } finally {\n this.actionLoading.set(false);\n }\n }\n}\n","/**\n * Infinite Scroll Directive\n * Triggers an event when the user scrolls near the top or bottom of a container\n *\n * @deprecated This is a custom implementation. Consider using @acorex/cdk/common AXInfiniteScrollerDirective\n * Kept for backward compatibility with conversation2-specific API\n */\n\nimport { isPlatformBrowser } from '@angular/common';\nimport { Directive, ElementRef, PLATFORM_ID, afterNextRender, inject, input, output } from '@angular/core';\n\n@Directive({\n selector: '[axInfiniteScroll]',\n})\nexport class AXInfiniteScrollDirective {\n private readonly elementRef = inject(ElementRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n /** Threshold in pixels from the edge to trigger the event */\n readonly threshold = input<number>(200);\n\n /** Which edge to watch: 'top', 'bottom', or 'both' */\n readonly edge = input<'top' | 'bottom' | 'both'>('bottom');\n\n /** Event emitted when scrolling reaches the threshold */\n readonly scrollThreshold = output<'top' | 'bottom'>();\n\n private lastScrollTop = 0;\n private ticking = false;\n\n constructor() {\n afterNextRender(() => {\n if (isPlatformBrowser(this.platformId)) {\n this.setupScrollListener();\n }\n });\n }\n\n private setupScrollListener(): void {\n const element = this.elementRef.nativeElement as HTMLElement;\n\n element.addEventListener('scroll', () => {\n if (!this.ticking) {\n window.requestAnimationFrame(() => {\n this.handleScroll();\n this.ticking = false;\n });\n this.ticking = true;\n }\n });\n }\n\n private handleScroll(): void {\n const element = this.elementRef.nativeElement as HTMLElement;\n const scrollTop = element.scrollTop;\n const scrollHeight = element.scrollHeight;\n const clientHeight = element.clientHeight;\n const threshold = this.threshold();\n const edge = this.edge();\n\n // Check top threshold\n if ((edge === 'top' || edge === 'both') && scrollTop <= threshold && scrollTop < this.lastScrollTop) {\n this.scrollThreshold.emit('top');\n }\n\n // Check bottom threshold\n if (\n (edge === 'bottom' || edge === 'both') &&\n scrollTop + clientHeight >= scrollHeight - threshold &&\n scrollTop > this.lastScrollTop\n ) {\n this.scrollThreshold.emit('bottom');\n }\n\n this.lastScrollTop = scrollTop;\n }\n}\n","/**\n * MessageList Component\n * Displays messages with virtual scrolling, date separators, and actions\n */\nimport { AXAvatarComponent } from '@acorex/components/avatar';\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXLoadingComponent } from '@acorex/components/loading';\nimport {\n AXContextMenuComponent,\n AXContextMenuItemsClickEvent,\n AXContextMenuOpeningEvent,\n AXMenuItem,\n} from '@acorex/components/menu';\nimport { AXPopoverModule } from '@acorex/components/popover';\nimport { AXTooltipModule } from '@acorex/components/tooltip';\nimport { AXDateTimeModule } from '@acorex/core/date-time';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n TemplateRef,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AXInfiniteScrollDirective } from '../../directives';\nimport { AXMessage } from '../../models';\nimport { FallbackRendererComponent } from '../../plugins/message-list/components';\nimport { AXConversationService } from '../../services';\nimport { CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\nimport { AXMessageListService } from './message-list.service';\n\n@Component({\n selector: 'ax-conversation-message-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n AXBadgeComponent,\n AXAvatarComponent,\n AXButtonModule,\n AXContextMenuComponent,\n AXDecoratorModule,\n AXImageComponent,\n AXLabelComponent,\n AXLoadingComponent,\n AXFormatModule,\n AXDateTimeModule,\n AXTooltipModule,\n AXPopoverModule,\n AXInfiniteScrollDirective,\n ],\n template: `\n @if (activeConversation()) {\n <div class=\"message-list\" #messageList role=\"log\" aria-label=\"Message list\" aria-live=\"polite\">\n @if (loading()) {\n <div class=\"list-loading\" role=\"status\" aria-label=\"Loading messages\">\n <ax-loading></ax-loading>\n <ax-label>Loading messages...</ax-label>\n </div>\n } @else if (messages().length === 0) {\n <div class=\"list-empty\" role=\"status\" aria-label=\"No messages\">\n <div class=\"empty-icon\">✉️</div>\n <h3 class=\"empty-title\">No messages yet</h3>\n <p class=\"empty-description\">Be the first to send a message and start the conversation!</p>\n </div>\n } @else {\n <div\n class=\"messages-container\"\n (scroll)=\"onScroll($event)\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold\"\n [edge]=\"'top'\"\n (scrollThreshold)=\"onScrollThreshold($event)\"\n #messagesContainer\n role=\"feed\"\n aria-label=\"Messages\"\n >\n @if (loadingMore()) {\n <div class=\"list-loading-more\" role=\"status\" aria-label=\"Loading older messages\">\n <ax-loading></ax-loading>\n <ax-label>Loading older messages...</ax-label>\n </div>\n }\n @for (group of messageGroups(); track trackMessageGroup($index, group)) {\n <!-- Date Separator -->\n <div class=\"date-separator\" role=\"separator\" [attr.aria-label]=\"'Messages from ' + group.dateLabel\">\n <ax-badge [text]=\"group.dateLabel\" class=\"date-text\"></ax-badge>\n </div>\n\n <!-- Messages in this date group -->\n @for (message of group.messages; track trackMessage($index, message)) {\n <div\n [class]=\"getMessageClasses(message)\"\n role=\"article\"\n [attr.aria-label]=\"getMessageAriaLabel(message)\"\n [id]=\"'message-' + message.id\"\n animate.enter=\"fade-slide-in\"\n >\n <!-- Avatar (only for group conversations and received messages) -->\n @if (shouldShowAvatar(message)) {\n <div class=\"message-avatar\">\n @if (avatarTemplate()) {\n <ng-container\n *ngTemplateOutlet=\"\n avatarTemplate();\n context: {\n $implicit: message,\n size: 32,\n senderName: getSenderName(message),\n senderAvatar: getSenderAvatar(message),\n }\n \"\n ></ng-container>\n } @else {\n <ax-avatar [size]=\"32\" [color]=\"'primary'\">\n @if (getSenderAvatar(message)) {\n <ax-image [src]=\"getSenderAvatar(message)!\" [alt]=\"getSenderName(message)\"></ax-image>\n } @else {\n <ax-label>{{ getInitials(getSenderName(message)) }}</ax-label>\n }\n </ax-avatar>\n }\n </div>\n }\n\n <div\n class=\"message-bubble-container\"\n [id]=\"'message-bubble-' + message.id\"\n [attr.data-message-id]=\"message.id\"\n >\n <div\n [class]=\"getBubbleClasses(message)\"\n [class.message-bubble-sent]=\"message.senderId === currentUser()?.id\"\n [class.message-bubble-received]=\"message.senderId !== currentUser()?.id\"\n >\n <!-- Thread Reply Count Badge -->\n @if (getReplyCount(message) > 0) {\n <button\n type=\"button\"\n class=\"thread-badge\"\n (click)=\"showThread(message)\"\n [attr.aria-label]=\"getReplyCount(message) + ' replies'\"\n axTooltip=\"{{ getReplyCount(message) }} {{\n getReplyCount(message) === 1 ? 'reply' : 'replies'\n }}\"\n >\n <i class=\"fa-light fa-message\"></i>\n {{ getReplyCount(message) }}\n </button>\n }\n\n <!-- Forward Count Badge -->\n @if (getForwardCount(message) > 0) {\n <button\n type=\"button\"\n class=\"forward-badge\"\n [attr.aria-label]=\"getForwardCount(message) + ' forwards'\"\n axTooltip=\"{{ getForwardCount(message) }} {{\n getForwardCount(message) === 1 ? 'forward' : 'forwards'\n }}\"\n >\n <i class=\"fa-light fa-share\"></i>\n {{ getForwardCount(message) }}\n </button>\n }\n\n <!-- Reply Preview -->\n @if (message.replyTo) {\n <div\n class=\"reply-preview\"\n (click)=\"scrollToMessage(message.replyTo.id)\"\n role=\"button\"\n [attr.aria-label]=\"'Reply to ' + getSenderName(message.replyTo)\"\n (keydown.enter)=\"scrollToMessage(message.replyTo.id)\"\n (keydown.space)=\"scrollToMessage(message.replyTo.id)\"\n >\n <div class=\"reply-preview-line\"></div>\n <div class=\"reply-preview-content\">\n <div class=\"reply-preview-sender\">{{ getSenderName(message.replyTo) }}</div>\n <div class=\"reply-preview-text\">\n @if (getMessagePreviewText(message.replyTo); as preview) {\n <span class=\"last-message\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n @if (preview.type === 'text') {\n {{ preview.value }}\n } @else if (preview.type === 'image') {\n Image\n } @else if (preview.type === 'video') {\n Video\n } @else if (preview.type === 'audio' || preview.type === 'voice') {\n Voice message\n } @else if (preview.type === 'file') {\n File\n } @else if (preview.type === 'location') {\n Location\n } @else if (preview.type === 'sticker') {\n Sticker\n } @else {\n Message\n }\n </span>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Forwarded Indicator -->\n @if (message.forwarded) {\n <div class=\"forwarded-indicator\">\n <i class=\"fa-light fa-share\"></i>\n <span class=\"forwarded-text\">{{ getForwardedText(message) }}</span>\n </div>\n }\n\n <!-- Sender name (only for group conversations and received messages) -->\n @if (shouldShowSenderName(message)) {\n <div class=\"message-sender\">{{ getSenderName(message) }}:</div>\n }\n <ng-container\n *ngComponentOutlet=\"getRendererComponent(message); inputs: getRendererInputs(message)\"\n ></ng-container>\n\n <!-- Reactions Bubbles -->\n <div class=\"message-reactions-container\">\n @if (message.reactions.length > 0) {\n <div class=\"message-reactions-bubbles\">\n @for (reaction of getGroupedReactions(message); track reaction.emoji) {\n <button\n type=\"button\"\n class=\"reaction-bubble\"\n [class.reaction-bubble-active]=\"reaction.hasReacted\"\n (click)=\"onReactionClick(message, reaction.emoji)\"\n [axTooltip]=\"getReactionTooltip(reaction)\"\n [attr.aria-label]=\"reaction.emoji + ' ' + reaction.count\"\n >\n <span class=\"reaction-emoji\">{{ reaction.emoji }}</span>\n <span class=\"reaction-count\">{{ reaction.count }}</span>\n </button>\n }\n </div>\n }\n\n <!-- Add Reaction Button -->\n <button\n type=\"button\"\n class=\"add-reaction-button\"\n [class.add-reaction-visible]=\"reactionPickerTarget() === message.id\"\n (click)=\"toggleReactionPicker(message.id, $event)\"\n axTooltip=\"Add reaction\"\n [attr.aria-label]=\"'Add reaction to message'\"\n #reactionButton\n >\n <i class=\"fa-light fa-face-smile\"></i>\n </button>\n </div>\n </div>\n\n <!-- Message Footer -->\n <div class=\"message-footer\">\n <span class=\"message-time\">{{ message.timestamp | format: 'timeleft' | async }}</span>\n @if (message.editedAt) {\n <span\n class=\"edited-indicator\"\n [axTooltip]=\"'Edited ' + (message.editedAt | format: 'timeleft' | async)\"\n >\n <span>Edited</span>\n </span>\n }\n @if (isOwnMessage(message)) {\n <span [class]=\"getStatusIconClasses(message)\" [axTooltip]=\"getStatusTooltip(message)\">{{\n getStatusIcon(message)\n }}</span>\n }\n </div>\n </div>\n\n <!-- Context Menu for Message Actions -->\n <ax-context-menu\n [target]=\"'#message-bubble-' + message.id\"\n [openOn]=\"'click'\"\n [closeOn]=\"'click'\"\n (onOpening)=\"handleMessageContextMenuOpening($event, message)\"\n (onItemClick)=\"handleMessageContextMenuItemClick($event, message)\"\n >\n </ax-context-menu>\n </div>\n }\n }\n </div>\n\n <!-- Scroll to Bottom Button -->\n @if (showScrollButton()) {\n <ax-button\n class=\"scroll-to-bottom\"\n (onClick)=\"scrollToBottom()\"\n animate.enter=\"slide-in\"\n animate.leave=\"slide-out\"\n [text]=\"'↓'\"\n [look]=\"'solid'\"\n axTooltip=\"Scroll to bottom\"\n aria-label=\"Scroll to bottom of messages\"\n ></ax-button>\n }\n }\n </div>\n\n <!-- Reaction Picker Popover -->\n @if (reactionPickerTarget()) {\n <ax-popover\n #reactionPopover\n [target]=\"reactionPickerElement()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'top'\"\n (onClose)=\"closeReactionPicker()\"\n >\n <div class=\"reaction-picker-popup\">\n <div class=\"reaction-picker-header\">\n <span class=\"picker-title\">React to message</span>\n <button type=\"button\" class=\"picker-close\" (click)=\"closeReactionPicker()\" aria-label=\"Close\">\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n <div class=\"reaction-picker-emojis\">\n @for (emoji of availableReactions(); track emoji) {\n <button\n type=\"button\"\n class=\"reaction-picker-emoji\"\n [class.reaction-picker-emoji-active]=\"hasUserReactedById(reactionPickerTarget()!, emoji)\"\n (click)=\"onReactionClickById(reactionPickerTarget()!, emoji); closeReactionPicker()\"\n [attr.aria-label]=\"emoji\"\n >\n {{ emoji }}\n </button>\n }\n </div>\n </div>\n </ax-popover>\n }\n }\n `,\n styles: [\n `\n :host {\n display: block;\n height: 100%;\n position: relative;\n }\n\n .message-list {\n height: 100%;\n }\n\n .list-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n }\n\n .list-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 3rem 2rem;\n gap: 1.25rem;\n animation: fadeInUp 0.5s ease-out;\n }\n\n @keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .empty-icon {\n font-size: 5.5rem;\n line-height: 1;\n opacity: 0.35;\n margin-bottom: 0.5rem;\n filter: grayscale(0.2);\n }\n\n .empty-title {\n font-size: 1.625rem;\n font-weight: 600;\n margin: 0;\n color: rgb(var(--ax-sys-color-on-surface));\n letter-spacing: -0.02em;\n }\n\n .empty-description {\n font-size: 1.0625rem;\n margin: 0;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.65;\n max-width: 420px;\n line-height: 1.7;\n }\n\n .spinner {\n width: 32px;\n height: 32px;\n border: 3px solid rgb(var(--ax-sys-color-border-light-surface));\n border-top-color: rgb(var(--ax-sys-color-primary-500));\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n margin-bottom: 1rem;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .list-loading-more {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n text-align: center;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.7;\n }\n\n .messages-container {\n width: 100%;\n height: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .date-separator {\n position: sticky;\n z-index: 150;\n top: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0.5rem 0;\n }\n\n .date-text {\n padding: 0.25rem 0.75rem;\n background: rgb(var(--ax-sys-color-lighter-surface));\n font-size: 0.75rem;\n font-weight: 500;\n border-radius: 1rem;\n width: 7rem;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .unread-separator {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 1.5rem 0;\n padding: 0 1rem;\n }\n\n .unread-separator-line {\n flex: 1;\n height: 1px;\n background: rgb(var(--ax-sys-color-primary-500));\n opacity: 0.3;\n }\n\n .unread-separator-text {\n font-size: 0.75rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-primary-500));\n text-transform: uppercase;\n letter-spacing: 0.05em;\n white-space: nowrap;\n }\n\n .message-item:has(.message-reactions-bubbles) {\n padding-bottom: 2.5rem;\n }\n\n .message-item {\n position: relative;\n display: flex;\n padding: 1rem;\n border-radius: 0;\n gap: 0.5rem;\n margin-bottom: 2rem;\n line-height: 1rem;\n align-items: end;\n transition: background-color 0.3s ease;\n }\n\n .message-highlight {\n background-color: rgba(var(--ax-sys-color-primary-500), 0.1);\n border-radius: 0.5rem;\n }\n\n /* Enter animation */\n .fade-slide-in {\n animation: fadeSlideIn var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n }\n\n @keyframes fadeSlideIn {\n from {\n opacity: 0;\n // transform: translateX(20%);\n }\n to {\n opacity: 1;\n // transform: translateX(0);\n }\n }\n\n .message-own {\n flex-direction: row-reverse;\n }\n\n .message-avatar {\n flex-shrink: 0;\n margin-bottom: 0.25rem;\n }\n\n .message-bubble-container {\n display: flex;\n flex-direction: column;\n max-width: 70%;\n position: relative;\n }\n\n .message-own .message-bubble-container {\n align-items: flex-end;\n }\n\n .message-sender {\n font-size: 0.75rem;\n font-weight: 600;\n margin-bottom: 0.25rem;\n }\n\n .message-bubble {\n position: relative;\n padding: 0.5rem 0.75rem;\n padding-bottom: 0.5rem;\n border-radius: 1rem;\n background: rgb(var(--ax-sys-color-surface));\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n word-wrap: break-word;\n transition: background-color 0.3s ease;\n }\n\n /* Reply Preview */\n .reply-preview {\n display: flex;\n gap: 0.5rem;\n padding: 0.5rem;\n margin-bottom: 0.5rem;\n background: rgba(0, 0, 0, 0.05);\n border-radius: 0.5rem;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .reply-preview:hover {\n background: rgba(0, 0, 0, 0.08);\n }\n\n .message-own .reply-preview {\n background: rgba(255, 255, 255, 0.15);\n }\n\n .message-own .reply-preview:hover {\n background: rgba(255, 255, 255, 0.25);\n }\n\n .reply-preview-line {\n width: 3px;\n background: currentColor;\n opacity: 0.5;\n border-radius: 1.5px;\n flex-shrink: 0;\n }\n\n .reply-preview-content {\n flex: 1;\n min-width: 0;\n }\n\n .reply-preview-sender {\n font-size: 0.75rem;\n font-weight: 600;\n margin-bottom: 0.125rem;\n opacity: 0.9;\n }\n\n .reply-preview-text {\n font-size: 0.8125rem;\n opacity: 0.6;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* Forwarded Indicator */\n .forwarded-indicator {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.5rem;\n margin-bottom: 0.5rem;\n font-size: 0.75rem;\n font-weight: 500;\n font-style: italic;\n opacity: 0.7;\n border-left: 3px solid currentColor;\n border-radius: 0.5rem;\n padding-left: 0.5rem;\n }\n\n .forwarded-indicator i {\n font-size: 0.875rem;\n }\n\n .forwarded-text {\n font-size: 0.75rem;\n }\n\n /* Received messages - sharp bottom-left corner */\n .message-bubble-received {\n border-bottom-left-radius: 0.125rem;\n }\n\n /* Sent messages - sharp bottom-right corner */\n .message-bubble-sent {\n border-bottom-right-radius: 0.125rem;\n }\n\n .message-own .message-bubble {\n background: rgb(var(--ax-sys-color-primary-surface));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n }\n\n .message-content {\n font-size: 0.9375rem;\n line-height: 1.5;\n white-space: pre-wrap;\n }\n\n .message-footer {\n display: flex;\n align-items: end;\n gap: 0.25rem;\n margin-top: 0.25rem;\n font-size: 0.6875rem;\n opacity: 0.7;\n letter-spacing: 0.05rem;\n }\n\n .message-time {\n font-variant-numeric: tabular-nums;\n font-size: 0.675rem;\n }\n\n .edited-indicator {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: 0.675rem;\n opacity: 0.75;\n padding-inline-start: 0.35rem;\n border-inline-start: 1px solid lightgray;\n }\n\n .status-icon {\n cursor: help;\n display: inline-flex;\n font-size: 0.75rem;\n }\n\n .status-read {\n color: rgb(var(--ax-sys-color-primary-400));\n }\n\n .status-failed {\n color: rgb(var(--ax-sys-color-danger-500));\n }\n\n .message-reactions-bubbles {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n z-index: 1;\n }\n\n .reaction-bubble {\n display: flex;\n align-items: center;\n gap: 0.125rem;\n padding: 0.25rem;\n background: rgb(var(--ax-sys-color-surface));\n color: rgb(var(--ax-sys-color-on-surface));\n border: 1px solid rgb(var(--ax-sys-color-border));\n border-radius: 0.625rem;\n font-size: 0.625rem;\n cursor: pointer;\n transition: all 0.15s;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n min-height: 16px;\n font-family:\n 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Apple Color Emoji', 'Twemoji Mozilla', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .reaction-bubble:hover {\n // transform: scale(1.3);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n border-color: rgb(var(--ax-sys-color-primary));\n }\n\n .reaction-bubble-active {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n color: rgb(var(--ax-sys-color-on-primary-lightest-surface));\n border-color: rgb(var(--ax-sys-color-primary));\n border-width: 1.5px;\n }\n\n .reaction-emoji {\n font-size: 1.2rem;\n line-height: 1;\n }\n\n .reaction-count {\n font-size: 1rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n line-height: 1;\n }\n\n .reaction-bubble-active .reaction-count {\n color: rgb(var(--ax-sys-color-primary));\n }\n\n .reaction-bubble-active:hover {\n background: rgb(var(--ax-sys-color-primary-light-surface));\n border-color: rgb(var(--ax-sys-color-primary-600));\n }\n\n .message-reactions-container {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0.375rem;\n min-height: 20px;\n position: absolute;\n left: 0;\n top: calc(100% + 18px);\n }\n\n .add-reaction-button {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 30px;\n height: 30px;\n padding: 0.25rem;\n background: rgb(var(--ax-sys-color-surface));\n border: 1px solid rgb(var(--ax-sys-color-border));\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.15s;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n visibility: hidden;\n }\n\n .message-bubble-container:hover .add-reaction-button {\n visibility: visible;\n }\n\n .add-reaction-visible {\n visibility: visible !important;\n background: rgb(var(--ax-sys-color-primary) / 0.1);\n border-color: rgb(var(--ax-sys-color-primary));\n }\n\n .add-reaction-button:hover {\n // transform: scale(1.15);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n border-color: rgb(var(--ax-sys-color-primary));\n background: rgb(var(--ax-sys-color-primary) / 0.12);\n }\n\n .add-reaction-button i {\n font-size: 1rem;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .reaction-picker-popup {\n position: fixed;\n background: rgb(var(--ax-sys-color-surface));\n border: 1px solid rgb(var(--ax-sys-color-border));\n border-radius: 0.75rem;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);\n z-index: 1000;\n min-width: 260px;\n max-width: 300px;\n transform: translateY(-100%);\n margin-top: -0.5rem;\n }\n\n .reaction-picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border));\n }\n\n .picker-title {\n font-size: 0.8125rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .picker-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.5rem;\n height: 1.5rem;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 0.25rem;\n cursor: pointer;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n transition: all 0.2s;\n }\n\n .picker-close:hover {\n background: rgb(var(--ax-sys-color-error) / 0.1);\n color: rgb(var(--ax-sys-color-error));\n }\n\n .reaction-picker-emojis {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 0.375rem;\n padding: 0.75rem;\n padding-top: 0;\n }\n\n .reaction-picker-emoji {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n padding: 0;\n background: transparent;\n border: 1.5px solid transparent;\n border-radius: 0.5rem;\n font-size: 1.375rem;\n cursor: pointer;\n transition: all 0.15s;\n font-family:\n 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Apple Color Emoji', 'Twemoji Mozilla', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .reaction-picker-emoji:hover {\n // transform: scale(1.15);\n rotate: 20deg;\n background: rgb(var(--ax-sys-color-surface-variant));\n }\n\n .reaction-picker-emoji-active {\n background: rgb(var(--ax-sys-color-primary) / 0.15);\n border-color: rgb(var(--ax-sys-color-primary));\n }\n\n .reaction-picker-emoji-active:hover {\n background: rgb(var(--ax-sys-color-primary) / 0.25);\n }\n\n .message-actions {\n padding-bottom: 1.5rem;\n opacity: 0;\n transition: opacity 0.2s;\n z-index: 10;\n }\n\n .message-own .message-actions {\n }\n\n .message-item:hover .message-actions {\n opacity: 1;\n }\n\n .action-trigger {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-surface));\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n border-radius: 0.375rem;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n .action-trigger:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n // transform: scale(1.05);\n }\n\n .shortcut {\n font-size: 0.6875rem;\n opacity: 0.7;\n }\n\n .scroll-to-bottom {\n position: absolute;\n bottom: 1rem;\n right: 1rem;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n border: none;\n border-radius: 50%;\n font-size: 1.5rem;\n cursor: pointer;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n transition: transform 0.2s;\n z-index: 999;\n }\n\n .scroll-to-bottom:hover {\n // transform: scale(1.1);\n }\n\n /* Thread Reply Badge & Forward Badge - Shared Styles */\n .thread-badge,\n .forward-badge {\n position: absolute;\n top: -6px;\n min-width: 20px;\n height: 24px;\n padding: 0 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 3px;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n border: 2px solid rgb(var(--ax-sys-color-lightest-surface));\n border-radius: 10px;\n font-size: 0.6875rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n z-index: 10;\n\n i {\n font-size: 0.625rem;\n }\n }\n\n /* Position thread badge on top-right for received messages */\n .message-bubble-received .thread-badge {\n left: calc(100% - 5px);\n }\n\n /* Position thread badge on top-left for sent messages */\n .message-own .message-bubble-sent .thread-badge {\n right: calc(100% - 5px);\n }\n\n /* Forward Badge Specific Styles */\n .forward-badge {\n background: rgb(var(--ax-sys-color-success-500));\n pointer-events: none; /* Non-clickable, just informational */\n }\n\n /* Position forward badge below thread badge */\n .message-bubble-received .forward-badge {\n left: calc(100% - 5px);\n top: 18px; /* Below thread badge */\n }\n\n .message-own .message-bubble-sent .forward-badge {\n right: calc(100% - 5px);\n top: 18px; /* Below thread badge */\n }\n\n /* When only forward badge exists (no thread badge) */\n .message-bubble-received .forward-badge:first-of-type {\n top: -6px;\n }\n\n .message-own .message-bubble-sent .forward-badge:first-of-type {\n top: -6px;\n }\n\n .thread-badge:hover {\n // transform: scale(1.1);\n background: rgb(var(--ax-sys-color-primary-600));\n }\n\n .thread-badge:active {\n // transform: scale(0.95);\n }\n\n .forward-badge:hover {\n background: rgb(var(--ax-sys-color-success-600));\n }\n\n /* Enter animation */\n .slide-in {\n animation: slideInFromBottom var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n }\n\n @keyframes slideInFromBottom {\n from {\n opacity: 0;\n transform: translateY(100%);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Leave animation */\n .slide-out {\n opacity: 0;\n transform: translateY(100%);\n transition:\n opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),\n transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n }\n `,\n ],\n})\nexport class AXMessageListComponent implements OnDestroy {\n private readonly conversationService = inject(AXConversationService);\n private readonly messageListService = inject(AXMessageListService);\n protected readonly config = inject(CONVERSATION_CONFIG);\n\n /** Custom avatar template for message list items */\n readonly avatarTemplate = input<TemplateRef<AXMessageAvatarTemplateContext> | null>(null);\n\n // Timeout cleanup to prevent memory leaks\n private readonly timeouts = new Set<number>();\n\n // Store reply and forward counts from API\n private readonly replyCounts = signal<Map<string, number>>(new Map());\n private readonly forwardCounts = signal<Map<string, number>>(new Map());\n\n // Reaction picker state\n readonly reactionPickerTarget = signal<string | null>(null);\n readonly reactionPickerElement = signal<HTMLElement | null>(null);\n readonly reactionPopover = viewChild<any>('reactionPopover');\n\n // Available reaction emojis from API\n readonly availableReactions = signal<string[]>([]);\n\n // Access registry through conversation service\n private get registry() {\n return this.conversationService.registry;\n }\n\n /** Message list element reference */\n private readonly messageListRef = viewChild<ElementRef>('messageList');\n\n /** Messages container element reference */\n private readonly messagesContainerRef = viewChild<ElementRef<HTMLDivElement>>('messagesContainer');\n\n /** Loading state - use service */\n readonly loading = this.messageListService.loading;\n\n /** Loading more messages state - use service */\n readonly loadingMore = this.messageListService.loadingMore;\n\n /** Show scroll to bottom button - use service */\n readonly showScrollButton = this.messageListService.showScrollButton;\n\n /** Active conversation */\n readonly activeConversation = this.conversationService.activeConversation;\n\n /** Messages */\n readonly messages = this.conversationService.activeMessages;\n\n /** Message action event */\n readonly messageAction = output<{ message: AXMessage; action: string }>();\n\n /** Current user from service */\n readonly currentUser = this.conversationService.currentUser;\n\n /** Message grouped by date - use service */\n readonly messageGroups = this.messageListService.messageGroups;\n\n constructor() {\n // Load available reactions from API\n this.loadAvailableReactions();\n\n // Close reaction picker when clicking outside\n if (typeof document !== 'undefined') {\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n if (!target.closest('.message-reactions-container')) {\n this.closeReactionPicker();\n }\n });\n }\n\n // Track previous conversation ID to detect actual conversation switches\n let previousConversationId: string | null = null;\n\n // Scroll to bottom only when conversation ID changes (switching conversations)\n // Use untracked() to avoid triggering on conversation object updates\n effect(() => {\n const conversation = this.activeConversation();\n const currentConversationId = conversation?.id || null;\n\n // Use untracked to get previous ID without creating dependency\n untracked(() => {\n // Only scroll if the conversation ID actually changed (not just updated)\n if (currentConversationId && currentConversationId !== previousConversationId) {\n // Reset pagination state for new conversation\n this.messageListService.resetPagination();\n\n // Scroll to bottom when opening a conversation\n setTimeout(() => {\n this.scrollToBottom(false); // Instant scroll, no smooth animation\n }, 100);\n }\n\n // Update previous ID\n previousConversationId = currentConversationId;\n });\n });\n\n // Subscribe to global message count refresh events (works across all conversations)\n this.conversationService.onMessageCountRefresh.pipe(takeUntilDestroyed()).subscribe(({ messageId, type }) => {\n this.refreshCount(messageId, type);\n });\n\n // Handle scroll position when new messages are added\n let previousMessageCount = 0;\n\n effect(() => {\n const messages = this.messages();\n const conversation = this.activeConversation();\n const container = this.messagesContainerRef()?.nativeElement;\n\n if (!container || !conversation) {\n previousMessageCount = messages.length;\n return;\n }\n\n const currentCount = messages.length;\n const hasNewMessages = currentCount > previousMessageCount;\n\n if (hasNewMessages) {\n // Check if user is at bottom before DOM updates\n const { scrollTop, scrollHeight, clientHeight } = container;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n const isAtBottom = distanceFromBottom < this.config.scrollThreshold;\n\n // Only auto-scroll if user is at bottom\n if (isAtBottom) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n container.scrollTo({ top: container.scrollHeight, behavior: 'smooth' });\n });\n });\n }\n }\n\n previousMessageCount = currentCount;\n });\n\n // Setup intersection observer for marking messages as read\n this.setupIntersectionObserver();\n\n // Scroll to bottom when an external scroll request is issued (e.g., after sending a message)\n effect(() => {\n // Read the counter to create a dependency\n void this.messageListService.scrollRequests();\n // Defer to next tick to ensure DOM is updated\n setTimeout(() => this.scrollToBottom(false), 0);\n });\n }\n\n private intersectionObserver?: IntersectionObserver;\n\n /**\n * Setup intersection observer to mark messages as read when visible\n */\n private setupIntersectionObserver(): void {\n // Create observer with configurable threshold (default 30%)\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const messageId = entry.target.getAttribute('data-message-id');\n if (messageId) {\n this.markMessageAsRead(messageId);\n }\n }\n });\n },\n {\n root: this.messagesContainerRef()?.nativeElement,\n threshold: this.config.messageReadThreshold,\n },\n );\n\n // Observe unread messages\n effect(() => {\n const messages = this.messages();\n const currentUser = this.currentUser();\n\n if (!this.intersectionObserver || !currentUser) return;\n\n // Find unread messages not sent by current user\n const unreadMessages = messages.filter((m) => m.status !== 'read' && m.senderId !== currentUser.id);\n\n // Observe each unread message\n setTimeout(() => {\n unreadMessages.forEach((msg) => {\n const element = document.querySelector(`[data-message-id=\"${msg.id}\"]`);\n if (element && this.intersectionObserver) {\n this.intersectionObserver.observe(element);\n }\n });\n }, 100);\n });\n }\n\n /**\n * Mark message as read\n */\n private markMessageAsRead(messageId: string): void {\n const message = this.messages().find((m) => m.id === messageId);\n if (!message || message.status === 'read') return;\n\n // Update message status\n this.conversationService.markMessageAsRead(messageId);\n\n // Unobserve the message\n const element = document.querySelector(`[data-message-id=\"${messageId}\"]`);\n if (element && this.intersectionObserver) {\n this.intersectionObserver.unobserve(element);\n }\n }\n\n // Date grouping methods moved to service\n\n /** Get message CSS classes */\n getMessageClasses(message: AXMessage): string {\n const classes = ['message-item'];\n if (this.isOwnMessage(message)) {\n classes.push('message-own');\n }\n return classes.join(' ');\n }\n\n /** Get bubble CSS classes */\n getBubbleClasses(message: AXMessage): string {\n const classes = ['message-bubble'];\n if (message.type === 'system') {\n classes.push('message-system');\n }\n return classes.join(' ');\n }\n\n /** Check if message is from current user */\n isOwnMessage(message: AXMessage): boolean {\n const user = this.currentUser();\n if (!user) return false;\n return AXConversationMessageUtilsService.isOwnMessage(message, user.id);\n }\n\n /** Should show avatar */\n shouldShowAvatar(message: AXMessage): boolean {\n const conversation = this.activeConversation();\n return conversation?.type === 'group' && !this.isOwnMessage(message);\n }\n\n /** Should show sender name */\n shouldShowSenderName(message: AXMessage): boolean {\n const conversation = this.activeConversation();\n return conversation?.type === 'group' && !this.isOwnMessage(message);\n }\n\n /** Get sender name */\n getSenderName(message: AXMessage): string {\n const conversation = this.activeConversation();\n if (!conversation) return 'Unknown';\n return AXConversationMessageUtilsService.getSenderName(message, conversation);\n }\n\n /** Get sender avatar */\n getSenderAvatar(message: AXMessage): string | undefined {\n const conversation = this.activeConversation();\n if (!conversation) return undefined;\n return AXConversationMessageUtilsService.getSenderAvatar(message, conversation);\n }\n\n /** Get original sender name for forwarded messages */\n getOriginalSenderName(message: AXMessage): string {\n // Use new forwardedFrom object if available\n if (message.forwardedFrom) {\n return message.forwardedFrom.senderName;\n }\n\n // Fallback to old method for backward compatibility\n const conversation = this.activeConversation();\n if (!conversation || !message.forwardedFrom) return 'Unknown';\n\n const participant = conversation.participants.find((p) => p.id === message.forwardedFrom.senderId);\n return participant?.name || 'Unknown';\n }\n\n /** Get forwarded text with sender and conversation info */\n getForwardedText(message: AXMessage): string {\n if (!message.forwardedFrom) {\n return `Forwarded from ${this.getOriginalSenderName(message)}`;\n }\n\n const senderName = message.forwardedFrom.senderName;\n const conversationTitle = message.forwardedFrom.conversationTitle;\n\n // If conversation title exists and is different from sender name, show both\n if (conversationTitle && conversationTitle !== senderName) {\n return `Forwarded from ${senderName} (${conversationTitle})`;\n }\n // Otherwise just show sender name\n return `Forwarded from ${senderName}`;\n }\n\n /** Resolve renderer component for message */\n getRendererComponent(message: AXMessage) {\n const renderer = this.registry.messageRenderers.getRenderer(message);\n\n if (!renderer) {\n console.warn('⚠️ No renderer found for message type:', message.type, 'Using fallback');\n }\n return renderer?.component ?? FallbackRendererComponent;\n }\n\n /** Provide inputs for the dynamic renderer */\n getRendererInputs(message: AXMessage) {\n return { message };\n }\n\n /** Get status icon */\n getStatusIcon(message: AXMessage): string {\n return AXConversationMessageUtilsService.getStatusIcon(message);\n }\n\n /** Get status icon CSS classes */\n getStatusIconClasses(message: AXMessage): string {\n const classes = ['status-icon'];\n if (message.status === 'read') {\n classes.push('status-read');\n } else if (message.status === 'failed') {\n classes.push('status-failed');\n }\n return classes.join(' ');\n }\n\n /** Get status tooltip text */\n getStatusTooltip(message: AXMessage): string {\n switch (message.status) {\n case 'sending':\n return 'Sending...';\n case 'sent':\n return 'Sent';\n case 'delivered':\n return 'Delivered';\n case 'read':\n return 'Read';\n case 'failed':\n return 'Failed to send';\n default:\n return '';\n }\n }\n\n /** Get first unread message ID */\n readonly firstUnreadMessageId = computed(() => {\n const messages = this.messages();\n const currentUser = this.currentUser();\n if (!currentUser) return null;\n\n // Find first message that is not read and not sent by current user\n const firstUnread = messages.find((m) => m.status !== 'read' && m.senderId !== currentUser.id);\n\n return firstUnread?.id ?? null;\n });\n\n /** Get grouped reactions */\n getGroupedReactions(\n message: AXMessage,\n ): Array<{ emoji: string; count: number; userIds: string[]; hasReacted: boolean }> {\n const user = this.currentUser();\n const grouped = new Map<string, { count: number; userIds: string[]; hasReacted: boolean }>();\n\n message.reactions.forEach((reaction) => {\n if (!grouped.has(reaction.emoji)) {\n grouped.set(reaction.emoji, { count: 0, userIds: [], hasReacted: false });\n }\n const group = grouped.get(reaction.emoji);\n if (group) {\n group.count++;\n group.userIds.push(reaction.userId);\n if (user && reaction.userId === user.id) {\n group.hasReacted = true;\n }\n }\n });\n\n return Array.from(grouped.entries()).map(([emoji, data]) => ({\n emoji,\n ...data,\n }));\n }\n\n /** Get reaction tooltip text */\n getReactionTooltip(reaction: { emoji: string; count: number; userIds: string[]; hasReacted: boolean }): string {\n if (reaction.count === 1) {\n return reaction.userIds[0];\n }\n if (reaction.count <= 3) {\n return reaction.userIds.join(', ');\n }\n return `${reaction.userIds.slice(0, 3).join(', ')} and ${reaction.count - 3} more`;\n }\n\n /** Toggle reaction picker */\n toggleReactionPicker(messageId: string, event: MouseEvent): void {\n const button = event.target as HTMLElement;\n\n if (this.reactionPickerTarget() === messageId) {\n // Close if already open\n this.closeReactionPicker();\n } else {\n // Set target and element for popover\n this.reactionPickerElement.set(button);\n this.reactionPickerTarget.set(messageId);\n\n // Open popover on next tick\n setTimeout(() => {\n this.reactionPopover()?.open();\n });\n }\n }\n\n /** Close reaction picker */\n closeReactionPicker(): void {\n this.reactionPopover()?.close();\n this.reactionPickerTarget.set(null);\n this.reactionPickerElement.set(null);\n }\n\n /** Check if current user has reacted with specific emoji */\n hasUserReacted(message: AXMessage, emoji: string): boolean {\n const user = this.currentUser();\n if (!user) return false;\n return message.reactions.some((r) => r.emoji === emoji && r.userId === user.id);\n }\n\n /** Check if current user has reacted with specific emoji by message ID */\n hasUserReactedById(messageId: string, emoji: string): boolean {\n const message = this.getMessageById(messageId);\n if (!message) return false;\n return this.hasUserReacted(message, emoji);\n }\n\n /** Handle reaction click by message ID */\n onReactionClickById(messageId: string, emoji: string): void {\n const message = this.getMessageById(messageId);\n if (message) {\n this.onReactionClick(message, emoji);\n }\n }\n\n /** Get message by ID */\n getMessageById(messageId: string): AXMessage | undefined {\n const messages = this.messages();\n return messages.find((m) => m.id === messageId);\n }\n\n /** Load available reactions from API */\n private async loadAvailableReactions(): Promise<void> {\n try {\n // Fetch reactions from conversation service\n const reactions = await this.conversationService.getAvailableReactions();\n this.availableReactions.set(reactions);\n } catch (error) {\n console.error('Failed to load available reactions:', error);\n }\n }\n\n /** Get message actions from registry */\n getMessageActions(message: AXMessage) {\n return this.messageListService.getMenuActions(message);\n }\n\n /** Get initials from name */\n getInitials(name: string): string {\n return AXConversationMessageUtilsService.getInitials(name);\n }\n\n /** Handle reaction click */\n onReactionClick(message: AXMessage, emoji: string): void {\n this.messageListService.reactToMessage(message.id, emoji);\n }\n\n /** Handle message action */\n async onMessageAction(message: AXMessage, action: any): Promise<void> {\n await this.messageListService.executeAction(message, action.id);\n\n // Emit event for parent component\n this.messageAction.emit({ message, action: action.id });\n }\n\n /** Handle scroll events */\n onScroll(event: Event): void {\n const element = event.target as HTMLElement;\n const isNearBottom = this.isUserNearBottom(element);\n this.showScrollButton.set(!isNearBottom);\n }\n\n /** Handle infinite scroll threshold */\n async onScrollThreshold(edge: 'top' | 'bottom'): Promise<void> {\n if (edge === 'top') {\n await this.loadOlderMessages();\n }\n }\n\n /** Load older messages - delegate to service */\n private async loadOlderMessages(): Promise<void> {\n const container = this.messagesContainerRef()?.nativeElement;\n if (!container) return;\n\n // Save current scroll position and height\n const previousScrollHeight = container.scrollHeight;\n const previousScrollTop = container.scrollTop;\n\n await this.messageListService.loadMoreMessages();\n\n // Restore scroll position after new messages are added\n // The scroll position should be adjusted by the height difference\n setTimeout(() => {\n if (container) {\n const newScrollHeight = container.scrollHeight;\n const heightDifference = newScrollHeight - previousScrollHeight;\n\n // Maintain the user's position by adding the height of new content\n container.scrollTop = previousScrollTop + heightDifference;\n }\n }, 0);\n }\n\n /** Check if user is near bottom of scroll */\n private isUserNearBottom(element?: HTMLElement): boolean {\n const container = element || this.messagesContainerRef()?.nativeElement;\n if (!container) return false;\n\n const scrollTop = container.scrollTop;\n const scrollHeight = container.scrollHeight;\n const clientHeight = container.clientHeight;\n\n const isNearBottom = scrollHeight - scrollTop - clientHeight < this.config.scrollThreshold;\n return isNearBottom;\n }\n\n /** Scroll to bottom */\n scrollToBottom(smooth = true): void {\n const element = this.messagesContainerRef()?.nativeElement;\n if (element) {\n element.scrollTo({\n top: element.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto',\n });\n // Hide button when manually scrolling to bottom\n this.showScrollButton.set(false);\n }\n }\n\n /** Scroll to specific message */\n scrollToMessage(messageId: string): void {\n const messageElement = document.getElementById(`message-${messageId}`);\n if (messageElement) {\n messageElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n // Highlight the message briefly\n messageElement.classList.add('message-highlight');\n const timeout = window.setTimeout(() => {\n messageElement.classList.remove('message-highlight');\n this.timeouts.delete(timeout);\n }, this.config.messageHighlightDuration);\n this.timeouts.add(timeout);\n }\n }\n\n /** Cleanup timeouts and observers on destroy */\n ngOnDestroy(): void {\n // Disconnect intersection observer\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = undefined;\n }\n\n // Clear timeouts\n this.timeouts.forEach((t) => clearTimeout(t));\n this.timeouts.clear();\n }\n\n /** Get message preview text for reply */\n getMessagePreviewText(message: AXMessage): { value: string; type: string; icon: string } {\n return AXConversationMessageUtilsService.getPreviewText(message, 50);\n }\n\n /** Get ARIA label for message */\n getMessageAriaLabel(message: AXMessage): string {\n const sender = this.getSenderName(message);\n const time = message.timestamp.toLocaleTimeString();\n const isOwn = this.isOwnMessage(message);\n const prefix = isOwn ? 'You' : sender;\n const preview = AXConversationMessageUtilsService.getPreviewText(message, 100);\n const text = preview.type === 'text' ? preview.value : `[${preview.type}]`;\n const status = message.status ? `, ${message.status}` : '';\n return `${prefix} at ${time}: ${text}${status}`;\n }\n\n /** Get reply count for a message (fetches from API across all conversations) */\n getReplyCount(message: AXMessage): number {\n const counts = this.replyCounts();\n if (!counts.has(message.id)) {\n // Fetch from API asynchronously\n this.conversationService.getReplyCount(message.id).then((count) => {\n const newCounts = new Map(this.replyCounts());\n newCounts.set(message.id, count);\n this.replyCounts.set(newCounts);\n });\n return 0; // Return 0 while loading\n }\n return counts.get(message.id) || 0;\n }\n\n /** Get forward count for a message (fetches from API across all conversations) */\n getForwardCount(message: AXMessage): number {\n const counts = this.forwardCounts();\n if (!counts.has(message.id)) {\n // Fetch from API asynchronously\n this.conversationService.getForwardCount(message.id).then((count) => {\n const newCounts = new Map(this.forwardCounts());\n newCounts.set(message.id, count);\n this.forwardCounts.set(newCounts);\n });\n return 0; // Return 0 while loading\n }\n return counts.get(message.id) || 0;\n }\n\n /**\n * Refresh count for a specific message from API\n * This is called when a new reply or forward is detected globally\n */\n private refreshCount(messageId: string, type: 'reply' | 'forward'): void {\n if (type === 'reply') {\n // Fetch updated reply count from API\n this.conversationService.getReplyCount(messageId).then((count) => {\n const newCounts = new Map(this.replyCounts());\n newCounts.set(messageId, count);\n this.replyCounts.set(newCounts);\n });\n } else {\n // Fetch updated forward count from API\n this.conversationService.getForwardCount(messageId).then((count) => {\n const newCounts = new Map(this.forwardCounts());\n newCounts.set(messageId, count);\n this.forwardCounts.set(newCounts);\n });\n }\n }\n\n /** Show thread view for a message */\n showThread(message: AXMessage): void {\n // Get all replies to this message\n const allMessages = this.messages();\n const replies = allMessages.filter((m) => m.replyTo?.id === message.id);\n\n if (replies.length === 0) return;\n\n // Scroll to first reply\n const firstReply = replies[0];\n const replyElement = document.getElementById(`message-${firstReply.id}`);\n if (replyElement) {\n replyElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n // Highlight the reply briefly\n replyElement.classList.add('message-highlight');\n const timeout = window.setTimeout(() => {\n replyElement.classList.remove('message-highlight');\n }, this.config.messageHighlightDuration ?? 2000);\n this.timeouts.add(timeout);\n }\n }\n\n /** Handle context menu opening for messages */\n handleMessageContextMenuOpening(event: AXContextMenuOpeningEvent, message: AXMessage): void {\n const actions = this.getMessageActions(message);\n const currentUser = this.currentUser();\n\n if (!currentUser) return;\n\n // Convert message actions to context menu items\n const menuItems: AXMenuItem[] = actions.map((action) => ({\n text: action.label,\n suffix: action.shortcut ? { text: action.shortcut } : undefined,\n icon: action.icon,\n color: action.destructive ? 'danger' : undefined,\n disabled: !action.enabled(message, currentUser),\n data: action, // Store original action for later use\n }));\n\n event.items.push(...menuItems);\n }\n\n /** Handle context menu item click for messages */\n handleMessageContextMenuItemClick(event: AXContextMenuItemsClickEvent, message: AXMessage): void {\n const action = event.item.data;\n if (action) {\n // Execute the action using message list service\n this.messageListService.executeAction(message, action.id);\n\n // Emit event for parent component\n this.messageAction.emit({ message, action: action.id });\n }\n }\n\n /**\n * TrackBy function for message groups\n * Tracks by date only to prevent re-rendering when messages are added\n */\n trackMessageGroup(index: number, group: { date: string; messages: AXMessage[] }): string {\n return group.date;\n }\n\n /**\n * TrackBy function for messages\n * Tracks by ID only to prevent unnecessary re-renders\n */\n trackMessage(index: number, message: AXMessage): string {\n return message.id;\n }\n}\n\nexport interface AXMessageAvatarTemplateContext {\n $implicit: AXMessage;\n size: number;\n senderName: string;\n senderAvatar?: string;\n}\n","/**\n * Forward Message Dialog Component\n * Dialog for selecting conversations/users to forward a message to\n */\n\nimport { AXClosableComponent, AXComponentCloseEvent } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSelectBoxComponent } from '@acorex/components/select-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, OnInit, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversation, AXMessage } from '../../models';\nimport { AXConversationService } from '../../services';\n\n@Component({\n selector: 'ax-forward-message-dialog',\n imports: [CommonModule, FormsModule, AXSelectBoxComponent, AXSearchBoxComponent, AXButtonComponent, AXLabelComponent],\n template: `\n <div class=\"forward-message-dialog\">\n <div class=\"dialog-content\">\n <!-- Conversation Selection -->\n <div class=\"form-field\">\n <ax-label class=\"field-label\">Forward to</ax-label>\n <ax-select-box\n [(value)]=\"selectedConversationIds\"\n [dataSource]=\"availableConversations()\"\n [textField]=\"'title'\"\n [valueField]=\"'id'\"\n [multiple]=\"true\"\n [placeholder]=\"'Search and select conversations...'\"\n >\n <ax-search-box></ax-search-box>\n </ax-select-box>\n </div>\n\n <!-- Info Message -->\n <!-- <div class=\"info-message\">\n @if (selectedConversationIds().length === 0) {\n <ax-label class=\"info-text\">Please select at least one conversation</ax-label>\n } @else if (selectedConversationIds().length === 1) {\n <ax-label class=\"info-text\">Forward to 1 conversation</ax-label>\n } @else {\n <ax-label class=\"info-text\">Forward to {{ selectedConversationIds().length }} conversations</ax-label>\n }\n </div> -->\n </div>\n\n <div class=\"dialog-footer\">\n <ax-button [text]=\"'Cancel'\" [look]=\"'ghost'\" (onClick)=\"onCancel()\"></ax-button>\n <ax-button\n [text]=\"'Forward'\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canForward()\"\n (onClick)=\"onForward()\"\n ></ax-button>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .forward-message-dialog {\n display: flex;\n flex-direction: column;\n }\n\n .dialog-content {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n }\n\n .field-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--ax-text-secondary, #6b7280);\n }\n\n .info-message {\n padding: 0.75rem;\n background: var(--ax-info-bg, #f0f9ff);\n border: 1px solid var(--ax-info-border, #bfdbfe);\n border-radius: 0.5rem;\n }\n\n .info-text {\n font-size: 0.875rem;\n color: var(--ax-info-text, #1e40af);\n }\n\n .dialog-footer {\n padding: 1rem;\n border-top: 1px solid var(--ax-border-color, #e5e7eb);\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n }\n `,\n ],\n providers: [{ provide: AXClosableComponent, useExisting: AXForwardMessageDialogComponent }],\n})\nexport class AXForwardMessageDialogComponent implements OnInit {\n /** Toast service for notifications */\n private readonly toastService = inject(AXToastService);\n\n /** Conversation service (passed via popup data) */\n conversationService!: AXConversationService;\n\n /** Message to forward (passed via popup data) */\n message!: AXMessage;\n\n /** Close event emitter for popup */\n readonly onClosed = new EventEmitter<AXComponentCloseEvent>();\n\n /** Available conversations */\n readonly availableConversations = signal<AXConversation[]>([]);\n\n /** Selected conversation IDs */\n readonly selectedConversationIds = signal<string[]>([]);\n\n /** Can forward message */\n readonly canForward = computed(() => this.selectedConversationIds().length > 0);\n\n async ngOnInit(): Promise<void> {\n // Load available conversations (exclude current conversation)\n const conversations = this.conversationService.conversations();\n // Filter out the current conversation\n const filtered = conversations.filter((c) => c.id !== this.message.conversationId);\n this.availableConversations.set(filtered);\n }\n\n /** Handle cancel */\n onCancel(): void {\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = null;\n this.onClosed.emit(event);\n }\n\n /** Handle forward */\n async onForward(): Promise<void> {\n if (!this.conversationService || !this.message) return;\n\n const selectedIds = this.selectedConversationIds();\n if (selectedIds.length === 0) return;\n\n try {\n // Get original conversation info\n const originalConversation = this.conversationService\n .conversations()\n .find((c) => c.id === this.message.conversationId);\n\n // Get sender info\n const sender = originalConversation?.participants.find((p) => p.id === this.message.senderId);\n\n // Forward message to each selected conversation\n const forwardPromises = selectedIds.map(async (conversationId) => {\n const forwardCommand = {\n conversationId,\n type: this.message.type,\n payload: this.message.payload,\n forwarded: true,\n forwardedFrom: {\n messageId: this.message.id,\n senderId: this.message.senderId,\n senderName: sender?.name || 'Unknown',\n conversationId: this.message.conversationId,\n conversationTitle: originalConversation?.title,\n },\n originalSenderId: this.message.senderId, // Keep for backward compatibility\n metadata: this.message.metadata,\n };\n return this.conversationService.sendMessage(forwardCommand);\n });\n\n await Promise.all(forwardPromises);\n\n // Show success toast\n const count = selectedIds.length;\n this.toastService.success(`Message forwarded to ${count} conversation${count > 1 ? 's' : ''}`);\n\n // Close popup\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = { success: true, count };\n this.onClosed.emit(event);\n } catch (error: any) {\n console.error('Failed to forward message:', error);\n\n // Show error toast to user\n const errorMessage = error?.message || 'Failed to forward message. Please try again.';\n this.toastService.danger(errorMessage);\n }\n }\n}\n","/**\n * New Conversation Dialog Component\n * Dialog for creating new conversations with user selection\n */\n\nimport { AXClosableComponent, AXComponentCloseEvent } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSelectBoxComponent } from '@acorex/components/select-box';\nimport { AXTextBoxComponent } from '@acorex/components/text-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, OnInit, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXParticipant } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXAvatarPickerComponent } from '../shared/avatar-picker.component';\n\n@Component({\n selector: 'ax-new-conversation-dialog',\n imports: [\n CommonModule,\n FormsModule,\n AXSelectBoxComponent,\n AXSearchBoxComponent,\n AXTextBoxComponent,\n AXButtonComponent,\n AXLabelComponent,\n AXAvatarPickerComponent,\n ],\n template: `\n <div class=\"new-conversation-dialog\">\n <!-- <div class=\"dialog-header\">\n <ax-label class=\"dialog-title\">New Conversation</ax-label>\n </div> -->\n\n <div class=\"dialog-content\">\n <!-- Group Details (only if multiple users selected) -->\n @if (isGroupConversation()) {\n <div class=\"form-field\">\n <ax-label class=\"field-label\">Group Title</ax-label>\n <ax-text-box [(value)]=\"groupTitle\" [placeholder]=\"'Enter group title... (required)'\"></ax-text-box>\n </div>\n\n <div class=\"form-field\">\n <ax-avatar-picker [(avatarUrl)]=\"groupAvatar\"></ax-avatar-picker>\n </div>\n }\n\n <!-- User Selection -->\n <div class=\"form-field\">\n <ax-label class=\"field-label\">Select Users</ax-label>\n <ax-select-box\n [(value)]=\"selectedUserIds\"\n [dataSource]=\"availableUsers()\"\n [textField]=\"'name'\"\n [valueField]=\"'id'\"\n [multiple]=\"true\"\n [placeholder]=\"'Search and select users...'\"\n >\n <ax-search-box></ax-search-box>\n </ax-select-box>\n </div>\n\n <!-- Info Message -->\n <!-- <div class=\"info-message\">\n @if (selectedUserIds().length === 0) {\n <ax-label class=\"info-text\">Please select at least one user to start a conversation</ax-label>\n } @else if (selectedUserIds().length === 1) {\n <ax-label class=\"info-text\">Private conversation with 1 user</ax-label>\n } @else {\n <ax-label class=\"info-text\">Group conversation with {{ selectedUserIds().length }} users</ax-label>\n }\n </div> -->\n </div>\n\n <div class=\"dialog-footer\">\n <ax-button [text]=\"'Cancel'\" [look]=\"'ghost'\" (onClick)=\"onCancel()\"></ax-button>\n <ax-button\n [text]=\"'Create'\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canCreate()\"\n (onClick)=\"onCreate()\"\n ></ax-button>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .new-conversation-dialog {\n display: flex;\n flex-direction: column;\n }\n\n .dialog-header {\n padding: 1.5rem;\n border-bottom: 1px solid var(--ax-border-color, #e5e7eb);\n }\n\n .dialog-title {\n font-size: 1.25rem;\n font-weight: 600;\n color: var(--ax-text-primary, #111827);\n }\n\n .dialog-content {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n }\n\n .field-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--ax-text-secondary, #6b7280);\n }\n\n .info-message {\n padding: 0.75rem;\n background: var(--ax-info-bg, #f0f9ff);\n border: 1px solid var(--ax-info-border, #bfdbfe);\n border-radius: 0.5rem;\n }\n\n .info-text {\n font-size: 0.875rem;\n color: var(--ax-info-text, #1e40af);\n }\n\n .dialog-footer {\n padding: 1rem;\n border-top: 1px solid var(--ax-border-color, #e5e7eb);\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n }\n `,\n ],\n providers: [{ provide: AXClosableComponent, useExisting: AXNewConversationDialogComponent }],\n})\nexport class AXNewConversationDialogComponent implements OnInit {\n /** Toast service for notifications */\n private readonly toastService = inject(AXToastService);\n\n /** Conversation service (passed via popup data) */\n conversationService!: AXConversationService;\n\n /** Close event emitter for popup */\n readonly onClosed = new EventEmitter<AXComponentCloseEvent>();\n\n /** Available users */\n readonly availableUsers = signal<AXParticipant[]>([]);\n\n /** Selected user IDs */\n readonly selectedUserIds = signal<string[]>([]);\n\n /** Group title */\n groupTitle = signal('');\n\n /** Group avatar */\n groupAvatar = signal('');\n\n /** Is group conversation */\n readonly isGroupConversation = computed(() => this.selectedUserIds().length > 1);\n\n /** Can create conversation */\n readonly canCreate = computed(() => {\n const selectedCount = this.selectedUserIds().length;\n if (selectedCount === 0) return false;\n if (selectedCount === 1) return true;\n // For group, require title\n return this.groupTitle().trim().length > 0;\n });\n\n async ngOnInit(): Promise<void> {\n // Load available users\n const users = await this.conversationService.getUsers();\n this.availableUsers.set(users);\n }\n\n /** Handle cancel */\n onCancel(): void {\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = null;\n this.onClosed.emit(event);\n }\n\n /** Handle create */\n async onCreate(): Promise<void> {\n if (!this.conversationService) return;\n\n const selectedIds = this.selectedUserIds();\n if (selectedIds.length === 0) return;\n\n try {\n let conversation;\n\n if (selectedIds.length === 1) {\n // Private conversation - use the selected user's name and avatar\n const selectedUser = this.availableUsers().find((u) => u.id === selectedIds[0]);\n const metadata = {\n title: selectedUser?.name,\n avatar: selectedUser?.avatar,\n };\n conversation = await this.conversationService.createConversation(selectedIds, 'private', metadata);\n } else {\n // Group conversation\n const metadata = {\n title: this.groupTitle(),\n avatar: this.groupAvatar() || undefined,\n };\n conversation = await this.conversationService.createConversation(selectedIds, 'group', metadata);\n }\n\n // Close popup and return the created conversation\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = conversation;\n this.onClosed.emit(event);\n } catch (error: any) {\n console.error('Failed to create conversation:', error);\n\n // Show error toast to user\n const errorMessage = error?.message || 'Failed to create conversation. Please try again.';\n this.toastService.danger(errorMessage);\n }\n }\n}\n","/**\n * Conversation Item Component\n * Displays a single conversation in the sidebar list\n */\n\nimport { AXAvatarComponent } from '@acorex/components/avatar';\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport {\n AXContextMenuComponent,\n AXContextMenuItemsClickEvent,\n AXContextMenuOpeningEvent,\n AXMenuItem,\n} from '@acorex/components/menu';\nimport { AXDateTimeModule } from '@acorex/core/date-time';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, TemplateRef, computed, inject, input, output } from '@angular/core';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationMessageUtilsService } from '../../utils';\nimport { AXInfoBarService } from '../info-bar';\n\n@Component({\n selector: 'ax-conversation-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n AXAvatarComponent,\n AXBadgeComponent,\n AXImageComponent,\n AXLabelComponent,\n AXContextMenuComponent,\n AXFormatModule,\n AXDateTimeModule,\n ],\n template: `\n <div\n [class]=\"itemClasses()\"\n [id]=\"'conversation-item-' + conversation().id\"\n (click)=\"handleClick()\"\n (keydown.enter)=\"handleClick()\"\n (keydown.space)=\"handleClick()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Conversation with ' + conversation().title\"\n >\n <!-- Avatar -->\n <div class=\"item-avatar\">\n <div class=\"avatar-wrapper\">\n @if (avatarTemplate()) {\n <ng-container\n *ngTemplateOutlet=\"avatarTemplate(); context: { $implicit: conversation(), size: 48 }\"\n ></ng-container>\n } @else {\n <ax-avatar [size]=\"48\">\n @if (conversation().avatar) {\n <ax-image [src]=\"conversation().avatar\" alt=\"{{ conversation().title }}\"></ax-image>\n } @else {\n <ax-label>{{ getInitials(conversation().title) }}</ax-label>\n }\n </ax-avatar>\n }\n @if (conversation().type === 'private') {\n <span\n class=\"avatar-status\"\n [class.status-online]=\"conversationStatus() === 'online'\"\n [class.status-offline]=\"conversationStatus() === 'offline'\"\n [class.status-away]=\"conversationStatus() === 'away'\"\n ></span>\n }\n </div>\n </div>\n\n <!-- Content -->\n <div class=\"item-content\">\n <div class=\"item-header\">\n <span class=\"item-title\">\n <p class=\"item-title-text\">{{ liveConversation().title }}</p>\n @if (liveConversation().settings?.notifications === false) {\n <i class=\"fa-light fa-bell-slash mute-icon\"></i>\n }\n @if (liveConversation()?.blocked) {\n <i class=\"fa-ban fa-light block-icon\"></i>\n }\n </span>\n @if (liveConversation().lastMessageAt) {\n <span class=\"item-time\">{{ liveConversation().lastMessageAt | format: 'timeleft' | async }}</span>\n }\n </div>\n\n <div class=\"item-description\">\n @if (liveConversation().status.isTyping) {\n <span class=\"typing-indicator\">{{ typingText() }}</span>\n } @else if (liveConversation().lastMessage) {\n @if (lastMessagePreview(); as preview) {\n <span class=\"last-message\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n @if (preview.type === 'text') {\n {{ preview.value }}\n } @else if (preview.type === 'image') {\n Image\n } @else if (preview.type === 'video') {\n Video\n } @else if (preview.type === 'audio' || preview.type === 'voice') {\n Voice message\n } @else if (preview.type === 'file') {\n File\n } @else if (preview.type === 'location') {\n Location\n } @else if (preview.type === 'sticker') {\n Sticker\n } @else {\n Message\n }\n </span>\n }\n } @else {\n <span class=\"last-message no-message\">No messages</span>\n }\n <!-- Badge -->\n @if (liveConversation().unreadCount > 0) {\n <div class=\"item-badge\">\n <ax-badge [text]=\"liveConversation().unreadCount.toString()\" [color]=\"'primary'\" />\n </div>\n }\n <!-- Pin Icon -->\n @if (liveConversation().pinned) {\n <i class=\"fa-light fa-thumbtack pin-icon\"></i>\n }\n </div>\n </div>\n </div>\n\n <!-- Context Menu for Conversation Actions -->\n <ax-context-menu\n [target]=\"'#conversation-item-' + conversation().id\"\n [openOn]=\"'click'\"\n [closeOn]=\"'click'\"\n (onOpening)=\"handleContextMenuOpening($event)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .conversation-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .conversation-item:focus-visible,\n .conversation-item:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n outline: none;\n }\n\n .conversation-item-active {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n color: rgb(var(--ax-sys-color-on-primary-lightest-surface));\n }\n\n .conversation-item-active:hover {\n background: rgb(var(--ax-sys-color-primary-lighter-surface));\n }\n\n .item-avatar {\n flex-shrink: 0;\n }\n\n .avatar-wrapper {\n position: relative;\n }\n\n .avatar-status {\n position: absolute;\n bottom: 2px;\n right: 2px;\n width: 12px;\n height: 12px;\n border-radius: 50%;\n }\n\n .avatar-status.status-online {\n border: 2px solid rgb(var(--ax-sys-color-surface));\n background-color: rgb(var(--ax-sys-color-success-500));\n }\n\n // .avatar-status.status-offline {\n // border: 2px solid rgb(var(--ax-sys-color-surface));\n // background: rgb(var(--ax-sys-color-neutral));\n // }\n\n .avatar-status.status-away {\n border: 2px solid rgb(var(--ax-sys-color-surface));\n background-color: rgb(var(--ax-sys-color-warning-500));\n }\n\n .item-content {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n min-width: 0;\n line-height: 1.1rem;\n }\n\n .item-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.25rem;\n }\n\n .item-title {\n display: flex;\n align-items: center;\n // gap: 0.25rem;\n font-weight: 600;\n font-size: 0.875rem;\n flex: 1;\n min-width: 0;\n }\n\n .item-title-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n min-width: 0;\n }\n\n .item-time {\n font-variant-numeric: tabular-nums;\n flex-shrink: 0;\n font-size: 0.75rem;\n opacity: 0.7;\n }\n\n .item-description {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.8125rem;\n opacity: 0.7;\n min-width: 0;\n }\n\n .typing-indicator {\n color: rgb(var(--ax-sys-color-primary-500));\n font-style: italic;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .last-message {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .no-message {\n // font-weight: 600;\n }\n\n .item-badge {\n flex-shrink: 0;\n }\n\n .mute-icon {\n font-size: 0.75rem;\n margin-left: 0.375rem;\n opacity: 0.6;\n color: rgb(var(--ax-sys-color-warning-500));\n }\n .block-icon {\n font-size: 0.75rem;\n margin-left: 0.375rem;\n opacity: 0.6;\n color: rgb(var(--ax-sys-color-danger-500));\n }\n\n .pin-icon {\n font-size: 0.75rem;\n margin-left: 0.375rem;\n opacity: 0.6;\n color: rgb(var(--ax-sys-color-primary-500));\n flex-shrink: 0;\n }\n `,\n ],\n})\nexport class AXConversationItemComponent {\n private readonly conversationService = inject(AXConversationService);\n private readonly infoBarService = inject(AXInfoBarService);\n\n readonly avatarTemplate = input<TemplateRef<AXAvatarTemplateContext> | null>(null);\n\n // Access registry through conversation service\n private get registry() {\n return this.conversationService.registry;\n }\n\n /** Conversation data */\n readonly conversation = input.required<AXConversation>();\n\n /** Click event */\n readonly clicked = output<AXConversation>();\n\n /** Live conversation from store (reactive) */\n public readonly liveConversation = computed(() => {\n const convId = this.conversation().id;\n const conversations = this.conversationService.conversations();\n return conversations.find((c) => c.id === convId) || this.conversation();\n });\n\n /** Whether this conversation is active */\n readonly isActive = computed(() => {\n const activeConv = this.conversationService.activeConversation();\n return activeConv?.id === this.conversation().id;\n });\n\n /** Item CSS classes - delegate to component logic */\n readonly itemClasses = computed(() => {\n const classes = ['conversation-item'];\n if (this.isActive()) {\n classes.push('conversation-item-active');\n }\n return classes.join(' ');\n });\n\n /** Conversation status for avatar - delegate to utils */\n readonly conversationStatus = computed((): 'online' | 'offline' | 'away' | undefined => {\n return AXConversationMessageUtilsService.getConversationStatus(this.liveConversation());\n });\n\n /** Typing indicator text - delegate to utils */\n readonly typingText = computed((): string => {\n return AXConversationMessageUtilsService.getTypingText(this.liveConversation());\n });\n\n /** Last message preview - delegate to utils */\n readonly lastMessagePreview = computed((): { value: string; type: string; icon: string } | null => {\n const lastMessage = this.liveConversation().lastMessage;\n if (!lastMessage) return null;\n return AXConversationMessageUtilsService.getPreviewText(lastMessage);\n });\n\n /** Get initials from name - delegate to utils */\n getInitials(name: string): string {\n return AXConversationMessageUtilsService.getInitials(name);\n }\n\n /** Handle click event */\n handleClick(): void {\n this.clicked.emit(this.conversation());\n }\n\n /** Handle context menu opening for conversations */\n handleContextMenuOpening(event: AXContextMenuOpeningEvent): void {\n const conversation = this.liveConversation();\n const actions = this.registry.conversationItemActions.getActionsForConversation(conversation);\n\n // Convert conversation item actions to context menu items\n const menuItems: AXMenuItem[] = actions\n .filter((action) => !action.divider) // Skip divider items\n .map((action) => {\n // Check if the next item in the original actions array is a divider\n const originalIndex = actions.findIndex((a) => a.id === action.id);\n const nextAction = actions[originalIndex + 1];\n const hasBreakAfter = nextAction?.divider === true;\n\n return {\n text: this.registry.conversationItemActions.getActionLabel(action, conversation),\n icon: this.registry.conversationItemActions.getActionIcon(action, conversation),\n color: action.destructive ? 'danger' : undefined,\n disabled: action.enabled === false || (action.enabledWhen ? !action.enabledWhen({ conversation }) : false),\n break: hasBreakAfter, // Add break if next item is a divider\n data: action, // Store original action for later use\n };\n });\n\n event.items.push(...menuItems);\n }\n\n /** Handle context menu item click for conversations */\n async handleContextMenuItemClick(event: AXContextMenuItemsClickEvent): Promise<void> {\n const action = event.item.data;\n const conversation = this.liveConversation();\n\n if (action && conversation && action.handler) {\n try {\n await action.handler({\n conversation,\n conversationService: this.conversationService,\n });\n } catch (error) {\n console.error('Failed to execute conversation action:', error);\n }\n }\n }\n}\n\nexport interface AXAvatarTemplateContext {\n $implicit: AXConversation;\n size: number;\n}\n","/**\n * AXSidebarService\n * Facade/service for Sidebar-related state and actions.\n */\nimport { AXPopupService } from '@acorex/components/popup';\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\n\n@Injectable()\nexport class AXSidebarService {\n private readonly conversationService = inject(AXConversationService);\n private readonly popupService = inject(AXPopupService);\n private readonly config = inject(CONVERSATION_CONFIG);\n\n // Access registry through conversation service\n private get registry() {\n return this.conversationService.registry;\n }\n\n // Local UI state\n readonly searchQuery = signal('');\n readonly activeTabId = signal('all');\n private readonly currentPage = signal(0);\n private readonly hasMoreConversations = signal(true);\n readonly loadingMore = signal(false);\n\n // Derived state from ConversationService\n readonly conversations = this.conversationService.conversations;\n readonly loading = this.conversationService.loading;\n\n // Tabs\n readonly enabledTabs = this.registry.conversationTabs.enabledTabs;\n\n // Memoization cache for filtered conversations\n private filterCache = new Map<string, AXConversation[]>();\n\n // Filtered conversations with memoization\n readonly filteredConversations = computed(() => {\n const conversations = this.conversations();\n const query = this.searchQuery();\n const tabId = this.activeTabId();\n\n // Create cache key that includes pinned state, conversation order, and last message timestamps\n const pinnedIds = conversations\n .filter((c) => c.pinned)\n .map((c) => c.id)\n .join(',');\n\n // Include last message timestamps in cache key to detect order changes\n const timestampsHash = conversations\n .map((c) => {\n const time =\n c.lastMessageAt instanceof Date\n ? c.lastMessageAt.getTime()\n : c.lastMessage?.timestamp instanceof Date\n ? c.lastMessage.timestamp.getTime()\n : 0;\n return `${c.id}:${time}`;\n })\n .join('|');\n\n const cacheKey = `${conversations.length}-${query}-${tabId}-${pinnedIds}-${timestampsHash}`;\n\n // Return cached result if available\n if (this.filterCache.has(cacheKey)) {\n const cached = this.filterCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n }\n\n // Perform filtering and sorting\n const result = this.filterAndSort(conversations, query, tabId);\n\n // Cache the result\n this.filterCache.set(cacheKey, result);\n\n // Cleanup old cache entries if cache is too large (proper LRU cleanup)\n const maxCacheSize = this.config.filterCacheSize;\n if (this.filterCache.size > maxCacheSize) {\n // Delete oldest entries to maintain cache size\n const entriesToDelete = this.filterCache.size - maxCacheSize;\n const keys = Array.from(this.filterCache.keys());\n for (let i = 0; i < entriesToDelete; i++) {\n this.filterCache.delete(keys[i]);\n }\n }\n\n return result;\n });\n\n /**\n * Filter and sort conversations\n */\n private filterAndSort(conversations: AXConversation[], query: string, tabId: string): AXConversation[] {\n let filtered = conversations;\n\n // Apply tab filter\n const activeTab = this.registry.conversationTabs.getTabById(tabId);\n if (activeTab) {\n filtered = activeTab.filter(filtered);\n }\n\n // Apply search filter\n const lowerQuery = query.toLowerCase().trim();\n if (lowerQuery) {\n filtered = filtered.filter((conv) => {\n // Search in title\n if (conv.title.toLowerCase().includes(lowerQuery)) {\n return true;\n }\n // Search in last message text (type-safe)\n if (conv.lastMessage) {\n const messageText = AXConversationMessageUtilsService.getMessageText(conv.lastMessage);\n return messageText.toLowerCase().includes(lowerQuery);\n }\n return false;\n });\n }\n\n // Sort: pinned conversations first, then by last message time (newest first)\n return filtered.slice().sort((a, b) => {\n // Pinned conversations always come first\n if (a.pinned !== b.pinned) return a.pinned ? -1 : 1;\n\n // If both pinned or both not pinned, sort by last message time\n const aTime =\n (a.lastMessageAt instanceof Date ? a.lastMessageAt.getTime() : undefined) ??\n (a.lastMessage?.timestamp instanceof Date ? a.lastMessage.timestamp.getTime() : undefined) ??\n 0;\n const bTime =\n (b.lastMessageAt instanceof Date ? b.lastMessageAt.getTime() : undefined) ??\n (b.lastMessage?.timestamp instanceof Date ? b.lastMessage.timestamp.getTime() : undefined) ??\n 0;\n return bTime - aTime;\n });\n }\n\n setSearchQuery(q: string): void {\n this.searchQuery.set(q);\n }\n\n setActiveTab(tabId: string): void {\n this.activeTabId.set(tabId);\n }\n\n selectConversation(conversation: AXConversation): void {\n this.conversationService.selectConversation(conversation.id);\n }\n\n getBadgeValue(tabId: string): string | undefined {\n const v = this.registry.conversationTabs.getBadge(tabId, this.conversations());\n return v === undefined ? undefined : String(v);\n }\n\n async openNewConversationDialog(): Promise<AXConversation | null> {\n const { AXNewConversationDialogComponent } = await import('./new-conversation-dialog.component');\n\n const result = await this.popupService.open(AXNewConversationDialogComponent, {\n title: 'New Conversation',\n size: 'sm',\n closeButton: true,\n hasBackdrop: true,\n closeOnBackdropClick: false,\n data: {\n conversationService: this.conversationService,\n },\n });\n\n return (result?.data as AXConversation) || null;\n }\n\n /**\n * Load more conversations (pagination)\n */\n async loadMoreConversations(): Promise<void> {\n if (!this.hasMoreConversations() || this.loadingMore() || this.loading()) {\n return;\n }\n\n this.loadingMore.set(true);\n try {\n const nextPage = this.currentPage() + 1;\n const hasMore = await this.conversationService.loadMoreConversations(nextPage);\n\n if (hasMore) {\n this.currentPage.set(nextPage);\n }\n\n this.hasMoreConversations.set(hasMore);\n } finally {\n this.loadingMore.set(false);\n }\n }\n\n /**\n * Handle scroll threshold (for infinite scroll)\n */\n async onScrollThreshold(edge: 'top' | 'bottom'): Promise<void> {\n if (edge === 'bottom') {\n await this.loadMoreConversations();\n }\n }\n\n /**\n * Reset pagination (call when filters change)\n */\n resetPagination(): void {\n this.currentPage.set(0);\n this.hasMoreConversations.set(true);\n }\n}\n","/**\n * Sidebar Component (moved under conversation-view)\n * Uses AXSidebarService facade for state/actions\n */\n\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXLoadingComponent } from '@acorex/components/loading';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXTabItemComponent, AXTabsComponent } from '@acorex/components/tabs';\nimport { AXTooltipModule } from '@acorex/components/tooltip';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, OnDestroy, inject, output } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { AXInfiniteScrollDirective } from '../../directives';\nimport { AXConversation } from '../../models';\nimport { CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationItemComponent } from './conversation-item.component';\nimport { AXSidebarService } from './sidebar.service';\n\n@Component({\n selector: 'ax-conversation-sidebar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n AXTabsComponent,\n AXTabItemComponent,\n AXBadgeComponent,\n AXSearchBoxComponent,\n AXLabelComponent,\n AXLoadingComponent,\n AXButtonComponent,\n AXSkeletonModule,\n AXConversationItemComponent,\n AXInfiniteScrollDirective,\n AXTooltipModule,\n ],\n template: `\n <div class=\"sidebar\">\n <!-- Header with Menu and Search -->\n <div class=\"sidebar-header\">\n <!-- <ax-button [look]=\"'outline'\" [size]=\"'md'\" [axTooltip]=\"'Settings'\" class=\"menu-button\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button> -->\n <div class=\"sidebar-search\">\n <ax-search-box\n [value]=\"sidebar.searchQuery()\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"'Search conversations...'\"\n ></ax-search-box>\n </div>\n </div>\n\n <!-- Tabs -->\n <ax-tabs (onActiveTabChanged)=\"onTabChange($event)\" [look]=\"'with-line'\" [style.overflow]=\"'hidden'\">\n @for (tab of enabledTabs(); track tab.id) {\n <ax-tab-item [text]=\"tab.label\" [key]=\"tab.id\">\n <ng-template #prefix>\n @if (tab.icon) {\n <ax-label class=\"tab-icon\">{{ tab.icon }}</ax-label>\n }\n </ng-template>\n <ng-template #suffix>\n @if (tab.badge && getBadgeValue(tab.id)) {\n <ax-badge [text]=\"getBadgeValue(tab.id)\" [color]=\"'primary'\" />\n }\n </ng-template>\n </ax-tab-item>\n }\n </ax-tabs>\n\n <!-- Conversation List -->\n <div\n class=\"sidebar-list\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold ?? 200\"\n [edge]=\"'bottom'\"\n (scrollThreshold)=\"onScrollThreshold($event)\"\n >\n @if (loading()) {\n <!-- Skeleton Loading State -->\n @for (i of [1, 2, 3, 4]; track i) {\n <div class=\"conversation-skeleton\">\n <ax-skeleton class=\"skeleton-avatar\"></ax-skeleton>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-header\">\n <ax-skeleton class=\"skeleton-title\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-time\"></ax-skeleton>\n </div>\n <ax-skeleton class=\"skeleton-message\"></ax-skeleton>\n </div>\n </div>\n }\n } @else if (filteredConversations().length === 0) {\n <div class=\"list-empty\">\n <div class=\"empty-icon\">💬</div>\n <h3 class=\"empty-title\">No conversations yet</h3>\n <p class=\"empty-description\">\n @if (sidebar.searchQuery()) {\n No conversations match your search. Try a different keyword.\n } @else {\n Start a new conversation to begin chatting!\n }\n </p>\n </div>\n } @else {\n @for (conversation of filteredConversations(); track conversation.id) {\n <ax-conversation-item [conversation]=\"conversation\" (clicked)=\"selectConversation($event)\" />\n }\n @if (loadingMore()) {\n <div class=\"list-loading-more\">\n <ax-loading></ax-loading>\n <ax-label>Loading more...</ax-label>\n </div>\n }\n }\n </div>\n <!-- New Conversation Button (Fixed at Bottom) -->\n <div class=\"new-conversation-button-container\">\n <ax-button\n class=\"new-conversation-btn\"\n [text]=\"'+ New Conversation'\"\n [look]=\"'solid'\"\n (onClick)=\"onNewConversation()\"\n ></ax-button>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .sidebar {\n display: flex;\n flex-direction: column;\n height: 100%;\n //background: rgb(var(--ax-sys-color-lightest-surface));\n // border-inline-end: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n position: relative;\n }\n\n .sidebar-header {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.75rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .menu-button {\n flex-shrink: 0;\n }\n\n .sidebar-search {\n flex: 1;\n }\n\n .sidebar-list {\n flex: 1;\n overflow-y: auto;\n position: relative;\n padding-bottom: 4rem;\n }\n\n .new-conversation-button-container {\n position: absolute;\n bottom: 0.5rem;\n left: 0.5rem;\n right: 0.5rem;\n display: flex;\n justify-content: center;\n padding: 0.5rem 0.25rem;\n // backdrop-filter: blur(1px);\n }\n\n .list-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n text-align: center;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .list-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n color: rgb(var(--ax-sys-color-on-surface));\n gap: 1rem;\n }\n\n .empty-icon {\n font-size: 4rem;\n line-height: 1;\n opacity: 0.5;\n margin-bottom: 0.5rem;\n }\n\n .empty-title {\n font-size: 1.25rem;\n font-weight: 600;\n margin: 0;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .empty-description {\n font-size: 0.875rem;\n margin: 0;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.7;\n max-width: 300px;\n line-height: 1.5;\n }\n\n .empty-action {\n margin-top: 0.5rem;\n }\n\n .list-loading-more {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n text-align: center;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.7;\n }\n\n ax-conversation-item:not(:last-child) {\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .tab-icon {\n font-size: 1rem;\n }\n\n /* Skeleton Loading Styles */\n .conversation-skeleton {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .skeleton-avatar {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n border-radius: 50%;\n }\n\n .skeleton-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .skeleton-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 0.5rem;\n }\n\n .skeleton-title {\n flex: 1;\n height: 1rem;\n border-radius: 0.25rem;\n }\n\n .skeleton-time {\n font-variant-numeric: tabular-nums;\n width: 3rem;\n height: 0.75rem;\n border-radius: 0.25rem;\n }\n\n .skeleton-message {\n height: 0.75rem;\n width: 80%;\n border-radius: 0.25rem;\n }\n `,\n ],\n})\nexport class AXSidebarComponent implements OnDestroy {\n readonly sidebar = inject(AXSidebarService);\n protected readonly config = inject(CONVERSATION_CONFIG);\n\n /** Conversation selected event */\n readonly conversationSelected = output<AXConversation>();\n\n /** Search debouncing */\n private readonly searchSubject = new Subject<string>();\n\n /** Derived state for template */\n readonly enabledTabs = this.sidebar.enabledTabs;\n readonly filteredConversations = this.sidebar.filteredConversations;\n readonly loading = this.sidebar.loading;\n readonly loadingMore = this.sidebar.loadingMore;\n\n constructor() {\n // Setup debounced search\n this.searchSubject\n .pipe(debounceTime(this.config.debounceSearch ?? 300), distinctUntilChanged())\n .subscribe((query) => {\n this.sidebar.setSearchQuery(query);\n });\n }\n\n /** Handle search input change with debouncing */\n onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n /** Handle tab change from ax-tabs */\n onTabChange(event: { tab?: { key?: string } }): void {\n if (event.tab?.key) {\n this.sidebar.setActiveTab(event.tab.key);\n }\n }\n\n /** Select a conversation */\n selectConversation(conversation: AXConversation): void {\n this.sidebar.selectConversation(conversation);\n this.conversationSelected.emit(conversation);\n }\n\n /** Get badge value for tab */\n getBadgeValue(tabId: string): string | undefined {\n return this.sidebar.getBadgeValue(tabId);\n }\n\n /** Open new conversation dialog */\n async onNewConversation(): Promise<void> {\n const conversation = await this.sidebar.openNewConversationDialog();\n if (conversation) {\n this.selectConversation(conversation);\n }\n }\n\n /** Handle infinite scroll threshold - delegate to service */\n async onScrollThreshold(edge: 'top' | 'bottom'): Promise<void> {\n await this.sidebar.onScrollThreshold(edge);\n }\n\n /** Cleanup on destroy */\n ngOnDestroy(): void {\n this.searchSubject.complete();\n }\n}\n","/**\n * Conversation Model\n * Represents a chat conversation (private, group, or channel)\n */\n\nimport type { AXMessage } from './message.model';\nimport type { AXParticipant } from './participant.model';\n\nexport type AXConversationType = 'private' | 'group' | 'channel';\n\n/**\n * Conversation status information\n */\nexport interface AXConversationStatus {\n /** Whether someone is typing */\n isTyping: boolean;\n\n /** User IDs currently typing */\n typingUsers: string[];\n\n /** Online presence (for private chats) */\n presence?: 'online' | 'offline' | 'away';\n\n /** Last seen timestamp (for private chats when offline) */\n lastSeen?: Date;\n}\n\n/**\n * Conversation permissions\n */\nexport interface AXConversationPermissions {\n /** Can send messages */\n canSendMessages: boolean;\n\n /** Can send media */\n canSendMedia: boolean;\n\n /** Can add members (groups) */\n canAddMembers: boolean;\n\n /** Can remove members (groups) */\n canRemoveMembers: boolean;\n\n /** Can change conversation info */\n canEditInfo: boolean;\n\n /** Can pin messages */\n canPinMessages: boolean;\n\n /** Can delete messages */\n canDeleteMessages: boolean;\n\n /** Custom permissions */\n custom?: Record<string, boolean>;\n}\n\n/**\n * Conversation settings\n */\nexport interface AXConversationSettings {\n /** Muted until timestamp */\n mutedUntil?: Date;\n\n /** Show notifications */\n notifications: boolean;\n\n /** Custom notification sound */\n notificationSound?: string;\n\n /** Show message preview in notifications */\n showPreview: boolean;\n\n /** Custom settings */\n custom?: Record<string, unknown>;\n}\n\n/**\n * Main Conversation interface\n */\nexport interface AXConversation {\n /** Unique conversation identifier */\n id: string;\n\n /** Conversation type */\n type: AXConversationType;\n\n /** Conversation title/name */\n title: string;\n\n /** Conversation avatar/image URL */\n avatar?: string;\n\n /** Conversation description (for groups/channels) */\n description?: string;\n\n /** List of participants */\n participants: AXParticipant[];\n\n /** Last message in the conversation */\n lastMessage?: AXMessage;\n\n /** Timestamp of last message */\n lastMessageAt: Date;\n\n /** Number of unread messages */\n unreadCount: number;\n\n /** Number of unread mentions */\n unreadMentions?: number;\n\n /** Current status (typing, presence, etc.) */\n status: AXConversationStatus;\n\n /** User permissions in this conversation */\n permissions: AXConversationPermissions;\n\n /** User-specific settings */\n settings: AXConversationSettings;\n\n /** Pinned messages IDs */\n pinnedMessageIds?: string[];\n\n /** Conversation creation timestamp */\n createdAt: Date;\n\n /** Last update timestamp */\n updatedAt: Date;\n\n /** Whether conversation is blocked */\n blocked?: boolean;\n\n /** Whether conversation is pinned */\n pinned?: boolean;\n\n /** Whether conversation is archived */\n archived?: boolean;\n\n /** Draft message text */\n draft?: string;\n\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Typing indicator\n */\nexport interface AXTypingIndicator {\n /** Conversation ID */\n conversationId: string;\n\n /** User ID who is typing */\n userId: string;\n\n /** User name */\n userName?: string;\n\n /** Timestamp */\n timestamp: Date;\n}\n\n/**\n * Presence update\n */\nexport interface AXPresenceUpdate {\n /** User ID */\n userId: string;\n\n /** Presence status */\n status: 'online' | 'offline' | 'away';\n\n /** Last seen timestamp */\n lastSeen?: Date;\n\n /** Custom status text */\n statusText?: string;\n}\n\n/**\n * Conversation filter options\n */\nexport interface AXConversationFilter {\n /** Filter by type */\n type?: AXConversationType;\n\n /** Filter by unread */\n unread?: boolean;\n\n /** Filter by archived */\n archived?: boolean;\n\n /** Search query */\n searchQuery?: string;\n\n /** Filter by tags */\n tags?: string[];\n\n /** Custom filters */\n custom?: Record<string, unknown>;\n}\n\n/**\n * Conversation sort options\n */\nexport interface AXConversationSort {\n /** Sort field */\n field: 'lastMessageAt' | 'title' | 'unreadCount' | 'createdAt';\n\n /** Sort direction */\n direction: 'asc' | 'desc';\n}\n","/**\n * Message Payload Types\n * Type-specific data structures for different message types\n */\n\n/**\n * Text formatting information\n */\nexport interface AXTextFormat {\n /** Start position in text */\n start: number;\n /** End position in text */\n end: number;\n /** Format type: bold, italic, code, strikethrough, etc. */\n type: 'bold' | 'italic' | 'code' | 'strikethrough' | 'underline' | 'spoiler';\n}\n\n/**\n * Mention information\n */\nexport interface AXMention {\n /** Start position in text */\n start: number;\n /** End position in text */\n end: number;\n /** Mentioned user ID */\n userId: string;\n /** Mentioned user display name */\n userName: string;\n}\n\n/**\n * Link information\n */\nexport interface AXLink {\n /** Start position in text */\n start: number;\n /** End position in text */\n end: number;\n /** URL */\n url: string;\n /** Link preview data (optional) */\n preview?: AXLinkPreview;\n}\n\n/**\n * Link preview metadata\n */\nexport interface AXLinkPreview {\n /** Page title */\n title?: string;\n /** Page description */\n description?: string;\n /** Preview image URL */\n image?: string;\n /** Site name */\n siteName?: string;\n}\n\n/**\n * Text message payload\n */\nexport interface AXTextPayload {\n /** Message type */\n type: 'text';\n /** Message text content */\n text: string;\n /** Text formatting information */\n formatting?: AXTextFormat[];\n /** User mentions */\n mentions?: AXMention[];\n /** Links in the message */\n links?: AXLink[];\n}\n\n/**\n * Image message payload\n */\nexport interface AXImagePayload {\n /** Message type */\n type: 'image';\n /** Full-size image URL */\n url: string;\n /** Thumbnail URL for preview */\n thumbnailUrl?: string;\n /** Image width in pixels */\n width: number;\n /** Image height in pixels */\n height: number;\n /** Optional caption */\n caption?: string;\n /** File size in bytes */\n size?: number;\n /** MIME type */\n mimeType?: string;\n /** Blurhash for progressive loading */\n blurhash?: string;\n}\n\n/**\n * Video message payload\n */\nexport interface AXVideoPayload {\n /** Message type */\n type: 'video';\n /** Video file URL */\n url: string;\n /** Thumbnail/poster image URL */\n thumbnailUrl?: string;\n /** Video duration in seconds */\n duration: number;\n /** Video width in pixels */\n width: number;\n /** Video height in pixels */\n height: number;\n /** File size in bytes */\n size: number;\n /** MIME type */\n mimeType?: string;\n /** Optional caption */\n caption?: string;\n}\n\n/**\n * Audio message payload (e.g., music, podcast)\n */\nexport interface AXAudioPayload {\n /** Message type */\n type: 'audio';\n /** Audio file URL */\n url: string;\n /** Duration in seconds */\n duration: number;\n /** File size in bytes */\n size: number;\n /** MIME type */\n mimeType?: string;\n /** Audio title */\n title?: string;\n /** Artist name */\n artist?: string;\n /** Album art URL */\n coverUrl?: string;\n /** Waveform data for visualization */\n waveform?: number[];\n}\n\n/**\n * Voice message payload (recorded audio)\n */\nexport interface AXVoicePayload {\n /** Message type */\n type: 'voice';\n /** Voice recording URL */\n url: string;\n /** Duration in seconds */\n duration: number;\n /** File size in bytes */\n size: number;\n /** MIME type */\n mimeType?: string;\n /** Waveform data for visualization */\n waveform?: number[];\n /** Whether the voice message has been played */\n played?: boolean;\n}\n\n/**\n * File message payload\n */\nexport interface AXFilePayload {\n /** Message type */\n type: 'file';\n /** File download URL */\n url: string;\n /** File name */\n name: string;\n /** File size in bytes */\n size: number;\n /** MIME type */\n mimeType: string;\n /** Optional thumbnail for supported file types */\n thumbnailUrl?: string;\n /** File extension */\n extension?: string;\n}\n\n/**\n * Location message payload\n */\nexport interface AXLocationPayload {\n /** Message type */\n type: 'location';\n /** Latitude coordinate */\n latitude: number;\n /** Longitude coordinate */\n longitude: number;\n /** Location name */\n name?: string;\n /** Formatted address */\n address?: string;\n /** Static map image URL */\n mapImageUrl?: string;\n /** Accuracy in meters */\n accuracy?: number;\n}\n\n/**\n * Sticker message payload\n */\nexport interface AXStickerPayload {\n /** Message type */\n type: 'sticker';\n /** Sticker unique ID */\n id: string;\n /** Sticker pack ID */\n packId: string;\n /** Sticker image URL */\n url: string;\n /** Whether sticker is animated */\n animated: boolean;\n /** Sticker width */\n width?: number;\n /** Sticker height */\n height?: number;\n /** Emoji representation */\n emoji?: string;\n}\n\n/**\n * Contact message payload\n */\nexport interface AXContactPayload {\n /** Message type */\n type: 'contact';\n /** Contact ID */\n id: string;\n /** Contact name */\n name: string;\n /** Phone number */\n phoneNumber?: string;\n /** Email address */\n email?: string;\n /** URL address */\n url?: string;\n /** Avatar URL */\n avatar?: string;\n}\n\n/**\n * Poll message payload\n */\nexport interface AXPollPayload {\n /** Message type */\n type: 'poll';\n /** Poll question */\n question: string;\n /** Poll options */\n options: AXPollOption[];\n /** Whether multiple choices are allowed */\n multipleChoice: boolean;\n /** Whether poll is anonymous */\n anonymous: boolean;\n /** Poll expiry date */\n expiresAt?: Date;\n /** Total vote count */\n totalVotes?: number;\n}\n\n/**\n * Poll option\n */\nexport interface AXPollOption {\n /** Option ID */\n id: string;\n /** Option text */\n text: string;\n /** Vote count */\n votes: number;\n /** User IDs who voted for this option */\n voters?: string[];\n}\n\n/**\n * System message payload (for notifications, events, etc.)\n */\nexport interface AXSystemPayload {\n /** Message type */\n type: 'system';\n /** System event type */\n eventType: 'user_joined' | 'user_left' | 'title_changed' | 'avatar_changed' | 'custom';\n /** Message text */\n text: string;\n /** Related user IDs */\n userIds?: string[];\n /** Additional data */\n data?: Record<string, any>;\n}\n\n/**\n * Union type of all message payloads\n */\nexport type AXMessagePayload =\n | AXTextPayload\n | AXImagePayload\n | AXVideoPayload\n | AXAudioPayload\n | AXVoicePayload\n | AXFilePayload\n | AXLocationPayload\n | AXStickerPayload\n | AXContactPayload\n | AXPollPayload\n | AXSystemPayload;\n","/**\n * Message Model\n * Represents a single message in a conversation\n */\n\nimport type { AXMessagePayload } from './message-payloads.model';\n\nexport type AXMessageStatus = 'sending' | 'sent' | 'delivered' | 'read' | 'failed';\n\nexport type AXMessageType =\n | 'text'\n | 'image'\n | 'video'\n | 'audio'\n | 'voice'\n | 'file'\n | 'location'\n | 'sticker'\n | 'contact'\n | 'poll'\n | 'system'\n | string; // Allow custom types\n\n/**\n * Reaction on a message\n */\nexport interface AXReaction {\n /** Emoji character */\n emoji: string;\n /** User ID who reacted */\n userId: string;\n /** Reaction timestamp */\n timestamp: Date;\n}\n\n/**\n * Message interface\n */\nexport interface AXMessage {\n /** Unique message identifier */\n id: string;\n\n /** Conversation ID this message belongs to */\n conversationId: string;\n\n /** Sender user ID */\n senderId: string;\n\n /** Message type */\n type: AXMessageType;\n\n /** Message creation timestamp */\n timestamp: Date;\n\n /** Type-specific message payload */\n payload: AXMessagePayload;\n\n /** Message delivery/read status */\n status: AXMessageStatus;\n\n /** Replied message reference (for quote replies) */\n replyTo?: AXMessage;\n\n /** Whether this message was forwarded */\n forwarded?: boolean;\n\n /** Original sender information (if forwarded) */\n forwardedFrom?: {\n /** Original message ID */\n messageId: string;\n /** Original sender ID */\n senderId: string;\n /** Original sender name */\n senderName?: string;\n /** Original conversation ID */\n conversationId: string;\n /** Original conversation title */\n conversationTitle?: string;\n };\n\n /** Message reactions */\n reactions: AXReaction[];\n\n /** Whether message is pinned */\n pinned?: boolean;\n\n /** Edit timestamp (if edited) */\n editedAt?: Date;\n\n /** Whether message is deleted */\n deleted?: boolean;\n\n /** Deleted timestamp */\n deletedAt?: Date;\n\n /** Local-only flag (not synced to server yet) */\n isLocal?: boolean;\n\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Grouped reactions (emoji -> count and users)\n */\nexport interface AXGroupedReaction {\n /** Emoji character */\n emoji: string;\n /** Count of reactions */\n count: number;\n /** User IDs who reacted */\n userIds: string[];\n /** Whether current user reacted */\n hasReacted: boolean;\n}\n\n/**\n * Command to send a new message\n */\nexport interface AXSendMessageCommand {\n /** Conversation ID */\n conversationId: string;\n /** Message type */\n type: AXMessageType;\n /** Message payload */\n payload: AXMessagePayload;\n /** Reply to message ID (optional) */\n replyToId?: string;\n /** Temporary client-generated ID */\n tempId?: string;\n /** Whether this message is forwarded */\n forwarded?: boolean;\n /** Original sender information (if forwarded) */\n forwardedFrom?: {\n /** Original message ID */\n messageId: string;\n /** Original sender ID */\n senderId: string;\n /** Original conversation ID */\n conversationId: string;\n /** Original sender name */\n senderName?: string;\n /** Original conversation title */\n conversationTitle?: string;\n };\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Command to edit a message\n */\nexport interface AXEditMessageCommand {\n /** Message ID to edit */\n messageId: string;\n /** New payload */\n payload: AXMessagePayload;\n}\n\n/**\n * Command to delete a message\n */\nexport interface AXDeleteMessageCommand {\n /** Message ID to delete */\n messageId: string;\n /** Delete for everyone or just sender */\n forEveryone?: boolean;\n}\n","/**\n * Participant Model\n * Represents a user/member in a conversation\n */\n\nexport type AXParticipantRole = 'admin' | 'moderator' | 'member';\nexport type AXParticipantStatus = 'online' | 'offline' | 'away';\n\nexport interface AXParticipant {\n /** Unique identifier for the participant */\n id: string;\n\n /** Display name of the participant */\n name: string;\n\n /** Avatar/profile image URL */\n avatar?: string;\n\n /** Role in the conversation (for groups/channels) */\n role?: AXParticipantRole;\n\n /** Current online status */\n status?: AXParticipantStatus;\n\n /** Last seen timestamp (when offline/away) */\n lastSeen?: Date;\n\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n","/**\n * AXConversation2Module\n * Legacy NgModule wrapper for backward compatibility.\n * For new applications, prefer standalone components with provideConversation().\n */\n\nimport { CommonModule } from '@angular/common';\nimport { ModuleWithProviders, NgModule, Provider, Type } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n AXComposerComponent,\n AXComposerService,\n AXConversationContainerComponent,\n AXInfoBarComponent,\n AXInfoBarService,\n AXMessageListComponent,\n AXMessageListService,\n AXSidebarComponent,\n AXSidebarService,\n} from './components';\nimport { AXInfiniteScrollDirective } from './directives';\nimport {\n AudioRendererComponent,\n FallbackRendererComponent,\n FileRendererComponent,\n ImageRendererComponent,\n LocationRendererComponent,\n StickerRendererComponent,\n TextRendererComponent,\n VideoRendererComponent,\n VoiceRendererComponent,\n} from './plugins';\nimport {\n AXComposerActionRegistry,\n AXComposerTabRegistry,\n AXConversationItemActionRegistry,\n AXConversationTabRegistry,\n AXInfoBarActionRegistry,\n AXMessageActionRegistry,\n AXMessageRendererRegistry,\n} from './registries';\nimport { AXConversationService, AXConversationStoreService, AXRegistryService } from './services';\nimport { AXConversationApi, AXMessageApi, AXRealtimeApi, AXUserApi } from './services/api';\nimport {\n AXConversationConfig,\n AXRegistryConfiguration,\n CONVERSATION_CONFIG,\n mergeWithDefaults,\n REGISTRY_CONFIG,\n} from './tokens';\n\n/**\n * Configuration options for conversation module\n */\nexport interface AXConversationOptions {\n /** User API implementation (required) */\n userApi: Type<AXUserApi>;\n /** Conversation Management API implementation (required) */\n conversationApi: Type<AXConversationApi>;\n /** Message API implementation (required) */\n messageApi: Type<AXMessageApi>;\n /** Realtime API implementation (optional) */\n realtimeApi?: Type<AXRealtimeApi>;\n /** Configuration overrides */\n config?: Partial<AXConversationConfig>;\n /** Registry configuration */\n registry?: Partial<AXRegistryConfiguration>;\n}\n\nconst DECLARATIONS = [\n AXConversationContainerComponent,\n AXSidebarComponent,\n AXInfoBarComponent,\n AXMessageListComponent,\n AXComposerComponent,\n TextRendererComponent,\n ImageRendererComponent,\n VideoRendererComponent,\n AudioRendererComponent,\n VoiceRendererComponent,\n FileRendererComponent,\n LocationRendererComponent,\n StickerRendererComponent,\n FallbackRendererComponent,\n AXInfiniteScrollDirective,\n];\n\n/**\n * Creates providers array for conversation module\n */\nfunction createProviders(options: Partial<AXConversationOptions>, includeServices: boolean): Provider[] {\n const { userApi, conversationApi, messageApi, realtimeApi, config, registry } = options;\n const providers: Provider[] = [];\n\n if (includeServices) {\n if (!userApi || !conversationApi || !messageApi) {\n throw new Error(\n `Missing required API implementations: userApi, conversationApi, messageApi.\n Example: provideConversation({\n userApi: AXIndexedDBUserApi,\n conversationApi: AXIndexedDBConversationApi,\n messageApi: AXIndexedDBMessageApi,\n })\n Import from @acorex/components/conversation2`,\n );\n }\n providers.push(\n { provide: AXUserApi, useClass: userApi },\n { provide: AXConversationApi, useClass: conversationApi },\n { provide: AXMessageApi, useClass: messageApi },\n );\n\n if (realtimeApi) {\n providers.push(\n { provide: AXRealtimeApi, useClass: realtimeApi },\n );\n }\n\n providers.push(\n AXConversationStoreService,\n AXConversationService,\n AXComposerService,\n AXInfoBarService,\n AXMessageListService,\n AXSidebarService,\n );\n }\n\n if (config) {\n providers.push({ provide: CONVERSATION_CONFIG, useValue: mergeWithDefaults(config) });\n }\n\n if (registry) {\n providers.push({ provide: REGISTRY_CONFIG, useValue: registry });\n }\n\n if (includeServices) {\n providers.push(\n AXMessageRendererRegistry,\n AXMessageActionRegistry,\n AXComposerActionRegistry,\n AXComposerTabRegistry,\n AXConversationTabRegistry,\n AXInfoBarActionRegistry,\n AXConversationItemActionRegistry,\n AXRegistryService,\n );\n }\n\n return providers;\n}\n\n@NgModule({\n imports: [CommonModule, FormsModule, ...DECLARATIONS],\n exports: [...DECLARATIONS],\n providers: [],\n})\nexport class AXConversation2Module {\n /**\n * Configure module for root module with singleton services.\n * @deprecated Use standalone components with provideConversation()\n */\n static forRoot(options: AXConversationOptions): ModuleWithProviders<AXConversation2Module> {\n return {\n ngModule: AXConversation2Module,\n providers: createProviders(options, true),\n };\n }\n\n /**\n * Configure module for lazy-loaded feature modules.\n * Reuses singleton services from root, optionally overrides config/registry.\n */\n static forChild(\n options: Omit<AXConversationOptions, 'userApi' | 'conversationApi' | 'messageApi' | 'realtimeApi'> = {},\n ): ModuleWithProviders<AXConversation2Module> {\n return {\n ngModule: AXConversation2Module,\n providers: createProviders(options, false),\n };\n }\n}\n\n/**\n * Provides conversation functionality for standalone applications.\n * Use in app config or route providers.\n *\n * @example\n * ```typescript\n * import {\n * AXIndexedDBUserApi,\n * AXIndexedDBConversationApi,\n * AXIndexedDBMessageApi,\n * AXIndexedDBRealtimeApi\n * } from '@acorex/components/conversation2';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideConversation({\n * userApi: AXIndexedDBUserApi,\n * conversationApi: AXIndexedDBConversationApi,\n * messageApi: AXIndexedDBMessageApi,\n * realtimeApi: AXIndexedDBRealtimeApi,\n * config: { },\n * registry: { messageActions: [myCustomAction] }\n * })\n * ]\n * };\n * ```\n */\nexport function provideConversation(options: AXConversationOptions): Provider[] {\n return createProviders(options, true);\n}\n","/**\n * Error Message Constants\n * Centralized error messages with i18n support structure\n * \n * This file provides a foundation for internationalization.\n * Each error has a code and default English message.\n * Future i18n implementation can use these codes to look up translated messages.\n */\n\n/**\n * Error message interface\n */\nexport interface AXErrorMessage {\n /** Error code for programmatic handling and i18n lookup */\n code: string;\n /** Default English message */\n message: string;\n /** Optional message template with placeholders */\n template?: string;\n}\n\n/**\n * Message validation errors\n */\nexport const MESSAGE_ERRORS = {\n EMPTY_MESSAGE: {\n code: 'MESSAGE.EMPTY',\n message: 'Message text cannot be empty',\n },\n MESSAGE_TOO_SHORT: {\n code: 'MESSAGE.TOO_SHORT',\n message: 'Message is too short',\n template: 'Message must be at least {minLength} character(s)',\n },\n MESSAGE_TOO_LONG: {\n code: 'MESSAGE.TOO_LONG',\n message: 'Message is too long',\n template: 'Message exceeds {maxLength} character limit',\n },\n MISSING_CONVERSATION_ID: {\n code: 'MESSAGE.MISSING_CONVERSATION_ID',\n message: 'Conversation ID is required',\n },\n MISSING_MESSAGE_TYPE: {\n code: 'MESSAGE.MISSING_TYPE',\n message: 'Message type is required',\n },\n MISSING_PAYLOAD: {\n code: 'MESSAGE.MISSING_PAYLOAD',\n message: 'Message payload is required',\n },\n INVALID_TEXT_PAYLOAD: {\n code: 'MESSAGE.INVALID_TEXT_PAYLOAD',\n message: 'Text message must have a text property',\n },\n INVALID_MEDIA_PAYLOAD: {\n code: 'MESSAGE.INVALID_MEDIA_PAYLOAD',\n message: 'Media message must have a url property',\n },\n INVALID_LOCATION_PAYLOAD: {\n code: 'MESSAGE.INVALID_LOCATION_PAYLOAD',\n message: 'Location message must have latitude and longitude properties',\n },\n} as const;\n\n/**\n * File upload errors\n */\nexport const FILE_ERRORS = {\n FILE_TOO_LARGE: {\n code: 'FILE.TOO_LARGE',\n message: 'File is too large',\n template: 'File size exceeds {maxSize} limit',\n },\n FILE_TYPE_NOT_ALLOWED: {\n code: 'FILE.TYPE_NOT_ALLOWED',\n message: 'File type is not allowed',\n template: 'File type \"{fileType}\" is not allowed',\n },\n UPLOAD_FAILED: {\n code: 'FILE.UPLOAD_FAILED',\n message: 'File upload failed',\n },\n} as const;\n\n/**\n * User validation errors\n */\nexport const USER_ERRORS = {\n MISSING_USER_ID: {\n code: 'USER.MISSING_ID',\n message: 'User ID is required',\n },\n INVALID_USER_IDS: {\n code: 'USER.INVALID_IDS',\n message: 'User IDs must be an array',\n },\n TOO_FEW_USERS: {\n code: 'USER.TOO_FEW',\n message: 'Not enough users',\n template: 'At least {minCount} user(s) required',\n },\n TOO_MANY_USERS: {\n code: 'USER.TOO_MANY',\n message: 'Too many users',\n template: 'Maximum {maxCount} user(s) allowed',\n },\n INVALID_USER_ID: {\n code: 'USER.INVALID_ID',\n message: 'All user IDs must be non-empty strings',\n },\n MISSING_EMAIL: {\n code: 'USER.MISSING_EMAIL',\n message: 'Email is required',\n },\n INVALID_EMAIL: {\n code: 'USER.INVALID_EMAIL',\n message: 'Invalid email format',\n },\n} as const;\n\n/**\n * Conversation errors\n */\nexport const CONVERSATION_ERRORS = {\n NOT_FOUND: {\n code: 'CONVERSATION.NOT_FOUND',\n message: 'Conversation not found',\n },\n ALREADY_EXISTS: {\n code: 'CONVERSATION.ALREADY_EXISTS',\n message: 'Conversation already exists',\n },\n CREATE_FAILED: {\n code: 'CONVERSATION.CREATE_FAILED',\n message: 'Failed to create conversation',\n },\n DELETE_FAILED: {\n code: 'CONVERSATION.DELETE_FAILED',\n message: 'Failed to delete conversation',\n },\n UPDATE_FAILED: {\n code: 'CONVERSATION.UPDATE_FAILED',\n message: 'Failed to update conversation',\n },\n LOAD_FAILED: {\n code: 'CONVERSATION.LOAD_FAILED',\n message: 'Failed to load conversations',\n },\n} as const;\n\n/**\n * Connection errors\n */\nexport const CONNECTION_ERRORS = {\n DISCONNECTED: {\n code: 'CONNECTION.DISCONNECTED',\n message: 'Connection lost',\n },\n FAILED_TO_CONNECT: {\n code: 'CONNECTION.FAILED',\n message: 'Failed to connect to server',\n },\n TIMEOUT: {\n code: 'CONNECTION.TIMEOUT',\n message: 'Connection timeout',\n },\n UNAUTHORIZED: {\n code: 'CONNECTION.UNAUTHORIZED',\n message: 'Unauthorized access',\n },\n} as const;\n\n/**\n * Location validation errors\n */\nexport const LOCATION_ERRORS = {\n MISSING_LATITUDE: {\n code: 'LOCATION.MISSING_LATITUDE',\n message: 'Latitude is required',\n },\n MISSING_LONGITUDE: {\n code: 'LOCATION.MISSING_LONGITUDE',\n message: 'Longitude is required',\n },\n INVALID_LATITUDE: {\n code: 'LOCATION.INVALID_LATITUDE',\n message: 'Latitude must be between -90 and 90',\n },\n INVALID_LONGITUDE: {\n code: 'LOCATION.INVALID_LONGITUDE',\n message: 'Longitude must be between -180 and 180',\n },\n} as const;\n\n/**\n * URL validation errors\n */\nexport const URL_ERRORS = {\n MISSING_URL: {\n code: 'URL.MISSING',\n message: 'URL is required',\n },\n INVALID_URL: {\n code: 'URL.INVALID',\n message: 'Invalid URL format',\n },\n} as const;\n\n/**\n * Permission errors\n */\nexport const PERMISSION_ERRORS = {\n CANNOT_SEND_MESSAGES: {\n code: 'PERMISSION.CANNOT_SEND_MESSAGES',\n message: 'You do not have permission to send messages',\n },\n CANNOT_SEND_MEDIA: {\n code: 'PERMISSION.CANNOT_SEND_MEDIA',\n message: 'You do not have permission to send media',\n },\n CANNOT_ADD_MEMBERS: {\n code: 'PERMISSION.CANNOT_ADD_MEMBERS',\n message: 'You do not have permission to add members',\n },\n CANNOT_REMOVE_MEMBERS: {\n code: 'PERMISSION.CANNOT_REMOVE_MEMBERS',\n message: 'You do not have permission to remove members',\n },\n CANNOT_EDIT_INFO: {\n code: 'PERMISSION.CANNOT_EDIT_INFO',\n message: 'You do not have permission to edit conversation info',\n },\n CANNOT_DELETE_MESSAGES: {\n code: 'PERMISSION.CANNOT_DELETE_MESSAGES',\n message: 'You do not have permission to delete messages',\n },\n} as const;\n\n/**\n * All error messages combined\n */\nexport const ERROR_MESSAGES = {\n MESSAGE: MESSAGE_ERRORS,\n FILE: FILE_ERRORS,\n USER: USER_ERRORS,\n CONVERSATION: CONVERSATION_ERRORS,\n CONNECTION: CONNECTION_ERRORS,\n LOCATION: LOCATION_ERRORS,\n URL: URL_ERRORS,\n PERMISSION: PERMISSION_ERRORS,\n} as const;\n\n/**\n * Helper function to format error message with parameters\n * Optimized to avoid creating regex objects in loop\n * @param template - Message template with placeholders\n * @param params - Parameters to replace in template\n * @returns Formatted message\n * \n * @example\n * formatErrorMessage('Message exceeds {maxLength} character limit', { maxLength: 1000 })\n * // Returns: 'Message exceeds 1000 character limit'\n */\nexport function formatErrorMessage(template: string, params: Record<string, string | number>): string {\n if (!template || !params) {\n return template || '';\n }\n\n return template.replace(/\\{(\\w+)\\}/g, (match, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : match;\n });\n}\n\n/**\n * Error message lookup cache for performance\n * Built once on first access\n */\nlet errorLookupCache: Map<string, AXErrorMessage> | null = null;\n\n/**\n * Build error lookup cache\n * @returns Map of error codes to error messages\n */\nfunction buildErrorLookupCache(): Map<string, AXErrorMessage> {\n if (errorLookupCache) {\n return errorLookupCache;\n }\n\n errorLookupCache = new Map();\n \n for (const category of Object.values(ERROR_MESSAGES)) {\n for (const error of Object.values(category)) {\n errorLookupCache.set(error.code, error);\n }\n }\n \n return errorLookupCache;\n}\n\n/**\n * Get error message by code\n * This function can be extended to support i18n by looking up translations\n * Uses caching for better performance\n * @param code - Error code\n * @param params - Optional parameters for message template\n * @returns Error message\n */\nexport function getErrorMessage(code: string, params?: Record<string, string | number>): string {\n const cache = buildErrorLookupCache();\n const error = cache.get(code);\n \n if (!error) {\n return `Unknown error: ${code}`;\n }\n \n // Use template if available and params provided\n if (error.template && params) {\n return formatErrorMessage(error.template, params);\n }\n \n return error.message;\n}\n\n/**\n * Type for error codes\n * Useful for type-safe error handling\n */\nexport type AXErrorCode = \n | typeof MESSAGE_ERRORS[keyof typeof MESSAGE_ERRORS]['code']\n | typeof FILE_ERRORS[keyof typeof FILE_ERRORS]['code']\n | typeof USER_ERRORS[keyof typeof USER_ERRORS]['code']\n | typeof CONVERSATION_ERRORS[keyof typeof CONVERSATION_ERRORS]['code']\n | typeof CONNECTION_ERRORS[keyof typeof CONNECTION_ERRORS]['code']\n | typeof LOCATION_ERRORS[keyof typeof LOCATION_ERRORS]['code']\n | typeof URL_ERRORS[keyof typeof URL_ERRORS]['code']\n | typeof PERMISSION_ERRORS[keyof typeof PERMISSION_ERRORS]['code'];\n","/**\n * Constants\n * Export all constant values\n */\n\nexport * from './error-messages.constants';\n","// Components\nexport * from './components';\n\n// Models\nexport * from './models';\n\n// Services\nexport * from './services';\n\n// Registries\nexport * from './registries';\n\n// Directives\nexport * from './directives';\n\n// Tokens\nexport * from './tokens';\n\n// Pluggins\nexport * from './plugins';\n\n// Module & Providers\nexport * from './conversation2.module';\n\n// Utils\nexport * from './utils';\n\n// Constants\nexport * from './constants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3","i4","i6","i5"],"mappings":"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"}
|