@acorex/components 22.2.22 → 22.2.23

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"acorex-components-conversation-acorex-components-conversation-ck1BG3Hi.mjs","sources":["../../../../packages/components/conversation/src/lib/services/api/api-types.ts","../../../../packages/components/conversation/src/lib/tokens/conversation-config.interface.ts","../../../../packages/components/conversation/src/lib/tokens/conversation-config.defaults.ts","../../../../packages/components/conversation/src/lib/tokens/conversation.tokens.ts","../../../../packages/components/conversation/src/lib/tokens/conversation-avatar.tokens.ts","../../../../packages/components/conversation/src/lib/tokens/registry-config.tokens.ts","../../../../packages/components/conversation/src/lib/tokens/conversation-features.ts","../../../../packages/components/conversation/src/lib/services/api/conversation-api-logger.service.ts","../../../../packages/components/conversation/src/lib/services/api/conversation-api.abstract.ts","../../../../packages/components/conversation/src/lib/services/api/message-api.abstract.ts","../../../../packages/components/conversation/src/lib/services/api/realtime-api.abstract.ts","../../../../packages/components/conversation/src/lib/services/api/user-api.abstract.ts","../../../../packages/components/conversation/src/lib/services/api/index.ts","../../../../packages/components/conversation/src/lib/services/composer-generation-state.service.ts","../../../../packages/components/conversation/src/lib/models/message-file-type-catalog.ts","../../../../packages/components/conversation/src/lib/utils/conversation-display.utils.ts","../../../../packages/components/conversation/src/lib/utils/message-chrome.ts","../../../../packages/components/conversation/src/lib/utils/message-utils.service.ts","../../../../packages/components/conversation/src/lib/utils/avatar-context.utils.ts","../../../../packages/components/conversation/src/lib/utils/conversation-membership.utils.ts","../../../../packages/components/conversation/src/lib/utils/message-payload-normalize.ts","../../../../packages/components/conversation/src/lib/utils/validation.utils.ts","../../../../packages/components/conversation/src/lib/services/conversation-media-send.loader.ts","../../../../packages/components/conversation/src/lib/models/room-preferences.model.ts","../../../../packages/components/conversation/src/lib/utils/room-preferences.utils.ts","../../../../packages/components/conversation/src/lib/services/conversation-state.ts","../../../../packages/components/conversation/src/lib/services/error-handler.service.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/conversation-composer-file-types.provider.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/composer-file-types.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/composer-tabs/composer-tab.builtin.ts","../../../../packages/components/conversation/src/lib/registries/composer-tab.registry.ts","../../../../packages/components/conversation/src/lib/registries/composer-action.registry.ts","../../../../packages/components/conversation/src/lib/registries/base-registry.abstract.ts","../../../../packages/components/conversation/src/lib/registries/conversation-item-action.registry.ts","../../../../packages/components/conversation/src/lib/registries/conversation-tab.registry.ts","../../../../packages/components/conversation/src/lib/registries/info-bar-action.registry.ts","../../../../packages/components/conversation/src/lib/registries/message-action.registry.ts","../../../../packages/components/conversation/src/lib/registries/message-renderer.registry.ts","../../../../packages/components/conversation/src/lib/services/registry.service.ts","../../../../packages/components/conversation/src/lib/services/conversation.service.ts","../../../../packages/components/conversation/src/lib/components/composer/composer-popup.component.ts","../../../../packages/components/conversation/src/lib/components/composer/composer-popup.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/composer-upload.config.ts","../../../../packages/components/conversation/src/lib/utils/message-list-background.patterns.ts","../../../../packages/components/conversation/src/lib/utils/message-list-background.presets.ts","../../../../packages/components/conversation/src/lib/utils/message-list-background.utils.ts","../../../../packages/components/conversation/src/lib/utils/participant-profile.utils.ts","../../../../packages/components/conversation/src/lib/utils/date-utils.service.ts","../../../../packages/components/conversation/src/lib/utils/file-type-message.resolve.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/persisted-media-url.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/audio-renderer/audio.payload.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/file-renderer/file.payload.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/image-renderer/image.payload.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/video-renderer/video.payload.ts","../../../../packages/components/conversation/src/lib/utils/conversation-info-panel.utils.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list.service.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/clipboard-files.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-paste.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-upload.ts","../../../../packages/components/conversation/src/lib/components/message-list/open-composer-picker-popup.ts","../../../../packages/components/conversation/src/lib/components/message-list/open-composer-picker-for-files.ts","../../../../packages/components/conversation/src/lib/components/shared/registry-component-outlet.component.ts","../../../../packages/components/conversation/src/lib/components/shared/registry-component-outlet.component.html","../../../../packages/components/conversation/src/lib/components/composer/open-composer-action-overlay.ts","../../../../packages/components/conversation/src/lib/components/composer/composer.service.ts","../../../../packages/components/conversation/src/lib/components/composer/composer.component.ts","../../../../packages/components/conversation/src/lib/components/composer/composer.component.html","../../../../packages/components/conversation/src/lib/components/container/conversation-container.component.ts","../../../../packages/components/conversation/src/lib/components/container/conversation-container.component.html","../../../../packages/components/conversation/src/lib/components/container/conversation-container.directive.ts","../../../../packages/components/conversation/src/lib/utils/component-inputs.utils.ts","../../../../packages/components/conversation/src/lib/components/shared/conversation-avatar.component.ts","../../../../packages/components/conversation/src/lib/components/shared/conversation-avatar.component.html","../../../../packages/components/conversation/src/lib/components/info-bar/info-bar.service.ts","../../../../packages/components/conversation/src/lib/components/info-bar/info-bar.component.ts","../../../../packages/components/conversation/src/lib/components/info-bar/info-bar.component.html","../../../../packages/components/conversation/src/lib/components/message-list/forward-message-dialog.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/forward-message-dialog.component.html","../../../../packages/components/conversation/src/lib/directives/infinite-scroll.directive.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-gallery-layout.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/attachment-uploader-reference.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/file-badge.utils.ts","../../../../packages/components/conversation/src/lib/components/message-list/conversation-media-gallery.ts","../../../../packages/components/conversation/src/lib/utils/svgs/message-delivery-status-icons.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-delivery-status-icon.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-time.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-item.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-item.component.html","../../../../packages/components/conversation/src/lib/components/message-list/message-list-empty-default.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list-empty-default.component.html","../../../../packages/components/conversation/src/lib/components/message-list/message-list-no-active-default.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list-no-active-default.component.html","../../../../packages/components/conversation/src/lib/components/message-list/reaction-picker-placement.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list.component.html","../../../../packages/components/conversation/src/lib/components/shared/avatar-picker.component.ts","../../../../packages/components/conversation/src/lib/components/shared/avatar-picker.component.html","../../../../packages/components/conversation/src/lib/components/sidebar/conversation-item.component.ts","../../../../packages/components/conversation/src/lib/components/sidebar/conversation-item.component.html","../../../../packages/components/conversation/src/lib/components/sidebar/sidebar.service.ts","../../../../packages/components/conversation/src/lib/components/sidebar/sidebar.component.ts","../../../../packages/components/conversation/src/lib/components/sidebar/sidebar.component.html","../../../../packages/components/conversation/src/lib/components/sidebar/new-conversation-dialog.component.ts","../../../../packages/components/conversation/src/lib/components/sidebar/new-conversation-dialog.component.html","../../../../packages/components/conversation/src/lib/components/sidebar/delete-conversation-dialog.component.ts","../../../../packages/components/conversation/src/lib/components/sidebar/delete-conversation-dialog.component.html","../../../../packages/components/conversation/src/lib/models/conversation-upload.types.ts","../../../../packages/components/conversation/src/lib/models/conversation.model.ts","../../../../packages/components/conversation/src/lib/models/message-payloads.model.ts","../../../../packages/components/conversation/src/lib/models/message.model.ts","../../../../packages/components/conversation/src/lib/models/participant.model.ts","../../../../packages/components/conversation/src/lib/models/user-presence.model.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/media-formatters.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/audio-picker/conversation-audio.file-type.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/audio-picker/audio-composer.payload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/picker-header/picker-header.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/picker-header/picker-header.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/picker-footer/picker-footer.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/picker-footer/picker-footer.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/emoji-tab/emoji-tab.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/emoji-tab/emoji-tab.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-caption.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-caption.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-options.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-options.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-truncate.utils.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-file.utils.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-empty.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-empty.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-shell.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-shell.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-auto-run.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/file-picker/file-composer.payload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/audio-picker/audio-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/audio-picker/audio-picker.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/composer-tabs/index.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/file-picker/conversation-file.file-type.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/file-picker/file-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/file-picker/file-picker.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/image-picker/conversation-image.file-type.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/media-dimensions.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/image-picker/image-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/image-picker/image-picker.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/location-picker/location-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/location-picker/location-picker.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-drag-handlers.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-toolbar.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-toolbar.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/sticker-tab/sticker-tab.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/sticker-tab/sticker-tab.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/video-picker/conversation-video.file-type.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/video-picker/video-composer.payload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/video-picker/video-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/video-picker/video-picker.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/voice-recorder/conversation-voice.file-type.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/voice-recorder/voice-composer.payload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/voice-recorder/voice-recorder.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/voice-recorder/voice-recorder.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/emoji-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/image-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/video-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/file-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/voice-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/audio-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/location-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/send-message-media.ts","../../../../packages/components/conversation/src/lib/plugins/info-bar/components/search.component.ts","../../../../packages/components/conversation/src/lib/plugins/info-bar/components/search.component.html","../../../../packages/components/conversation/src/lib/plugins/info-bar/info-bar-actions/default-actions.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/format-media.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-url-resolve.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/audio-attachment.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/audio-attachment.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/file-kind.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/file-attachment.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/file-attachment.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-aspect.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/image-attachment.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/image-attachment.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-playback-info-bar-banner.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-playback-info-bar-banner.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/message-renderer-state.helpers.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-renderer-content-state.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/message-renderer-copy-host.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/message-renderer-state.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/message-renderer-state.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/playback-banner-sync.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/video-attachment.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/video-attachment.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-playback-inline-controls.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-playback-inline-controls.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/audio-renderer/audio-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/audio-renderer/audio-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/fallback-renderer/fallback-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/fallback-renderer/fallback-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/file-renderer/file-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/file-renderer/file-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/image-renderer/image-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/image-renderer/image-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/location-renderer/location-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/location-renderer/location-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/sticker-renderer/sticker-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/sticker-renderer/sticker-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/system-renderer/system-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/system-renderer/system-renderer.component.html","../../../../packages/components/conversation/src/lib/utils/sanitizer.service.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/text-renderer/text-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/text-renderer/text-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/video-renderer/video-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/video-renderer/video-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/voice-renderer/voice-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/voice-renderer/voice-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/message-actions/default-actions.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/text-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/image-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/video-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/audio-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/voice-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/file-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/location-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/sticker-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/system-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/fallback-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/sidebar/conversation-item-actions/default-actions.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/sidebar/conversation-tabs/default-tabs.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/sidebar/conversation-tabs/index.ts","../../../../packages/components/conversation/src/lib/components/shared/conversation-default-conversation-avatar.component.ts","../../../../packages/components/conversation/src/lib/components/shared/conversation-default-conversation-avatar.component.html","../../../../packages/components/conversation/src/lib/conversation.module.ts","../../../../packages/components/conversation/src/lib/constants/error-messages.constants.ts","../../../../packages/components/conversation/src/lib/constants/index.ts","../../../../packages/components/conversation/src/lib/index.ts","../../../../packages/components/conversation/src/acorex-components-conversation.ts"],"sourcesContent":["/**\r\r\n * Shared API Types\r\r\n * Common types used across all API services\r\r\n */\r\r\n\r\r\n/**\r\r\n * Pagination parameters\r\r\n */\r\r\nexport interface AXConversationPagination {\r\r\n /** Page number (0-based) */\r\r\n page: number;\r\r\n\r\r\n /** Items per page */\r\r\n pageSize: number;\r\r\n\r\r\n /** Cursor for cursor-based pagination (optional) */\r\r\n cursor?: string;\r\r\n\r\r\n /** Sort field */\r\r\n sortBy?: string;\r\r\n\r\r\n /** Sort direction */\r\r\n sortDirection?: 'asc' | 'desc';\r\r\n}\r\r\n\r\r\n/**\r\r\n * Paginated response\r\r\n */\r\r\nexport interface AXConversationPaginatedResult<T> {\r\r\n /** Result items */\r\r\n items: T[];\r\r\n\r\r\n /** Total count (if available) */\r\r\n total?: number;\r\r\n\r\r\n /** Next page cursor (for cursor-based pagination) */\r\r\n nextCursor?: string;\r\r\n\r\r\n /** Previous page cursor */\r\r\n prevCursor?: string;\r\r\n\r\r\n /** Whether there are more pages */\r\r\n hasMore: boolean;\r\r\n\r\r\n /** Current page number */\r\r\n page?: number;\r\r\n\r\r\n /** Total pages */\r\r\n totalPages?: number;\r\r\n}\r\r\n\r\r\n/**\r\r\n * Pagination cursor state for a single list (conversations or messages).\r\r\n */\r\r\nexport interface AXConversationPaginationState {\r\r\n page: number;\r\r\n hasMore: boolean;\r\r\n nextCursor?: string;\r\r\n}\r\r\n\r\r\n/**\r\r\n * Connection status\r\r\n */\r\r\nexport type AXConversationConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';\r\r\n\r\r\n/**\r\r\n * API Error with details\r\r\n */\r\r\nexport interface AXConversationApiError {\r\r\n /** Error code */\r\r\n code: string;\r\r\n\r\r\n /** Error message */\r\r\n message: string;\r\r\n\r\r\n /** HTTP status code */\r\r\n statusCode?: number;\r\r\n\r\r\n /** Additional details */\r\r\n details?: unknown;\r\r\n\r\r\n /** Timestamp */\r\r\n timestamp?: Date;\r\r\n}\r\r\n\r\r\n/** Re-export presence status from domain models. */\r\r\nexport type { AXConversationPresenceStatus } from '../../models/user-presence.model';\r\r\n","/**\n * Conversation Configuration Interface\n * Centralized configuration values to avoid magic numbers\n */\n\n/**\n * Sidebar conversation tabs layout.\n * - `vertical`: horizontal tab strip above the conversation list.\n * - `horizontal`: vertical tab strip at inline-start beside the list (`ax-tabs` location `start`).\n */\nexport type AXConversationSidebarTabsOrientation = 'vertical' | 'horizontal';\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 emit throttle in milliseconds while composing (default: 3000) */\n typingIndicatorThrottle?: number;\n\n /** How long to show received typing indicators in the UI (default: 4000) */\n typingDisplayDuration?: number;\n\n /** Message highlight duration in milliseconds */\n messageHighlightDuration?: number;\n\n /** Search debounce delay in milliseconds */\n debounceSearch?: 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 /**\n * Sidebar conversation tabs layout.\n * `vertical` places a horizontal tab strip above the list; `horizontal` places a vertical tab strip at inline-start beside the list.\n */\n sidebarTabsOrientation?: AXConversationSidebarTabsOrientation;\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 /** Max attachments per message when a composer action omits `maxFiles`. */\n maxFilesPerMessage?: 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 /** Debounce window (ms) before flushing batched read-receipt API calls (default: 3000) */\n messageReadDebounce?: number;\n\n /**\n * When true, marks the whole conversation as read once when it is selected (single API call).\n * Per-message intersection observer still handles new messages received while the chat is open.\n */\n markConversationReadOnSelect?: boolean;\n\n // Message list\n /**\n * CSS `background` for the message list (`ax-conversation-message-list` area, all states: loading, empty, messages).\n * Use full shorthand, or a bare `https://...` / `/path/to.png` (wrapped as `url(...)` with `center/cover`).\n * Pass a string for the same value in both themes, or `{ light, dark }` for theme-specific backgrounds.\n * Empty string = Telegram-inspired theme-aware library default (`{ light, dark }`). `transparent` or `none` = flat background.\n */\n messageListBackground?: import('../models').AXConversationMessageListBackground;\n\n /** Optional feature flags to reduce bundle size per app. */\n features?: import('./conversation-features').AXConversationFeatures;\n\n /** Log API calls made by AXConversationService to the console (default: false). */\n debugApiLogging?: boolean;\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: 30,\n conversationPageSize: 20,\n\n // Scroll Configuration\n scrollThreshold: 100,\n infiniteScrollThreshold: 200,\n\n // Timeout Durations (milliseconds)\n typingIndicatorTimeout: 3000,\n typingIndicatorThrottle: 3000,\n typingDisplayDuration: 4000,\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 sidebarTabsOrientation: 'vertical',\n\n // Message Validation\n maxMessageLength: 10000,\n minMessageLength: 1,\n\n maxFilesPerMessage: 10,\n\n // Intersection Observer\n messageReadThreshold: 0.3,\n messageReadDebounce: 3000,\n markConversationReadOnSelect: true,\n\n // Message list\n messageListBackground: '',\n\n features: {\n composerTabs: [],\n },\n\n debugApiLogging: false,\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 return {\n ...AX_DEFAULT_CONVERSATION_CONFIG,\n ...userConfig,\n features: {\n ...AX_DEFAULT_CONVERSATION_CONFIG.features,\n ...userConfig.features,\n composerTabs: userConfig.features?.composerTabs ?? AX_DEFAULT_CONVERSATION_CONFIG.features.composerTabs,\n },\n };\n}\n","/**\n * Dependency Injection Tokens\n * InjectionTokens for configuration and dependencies\n */\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXConversationErrorHandlerConfig } from '../services/error-handler.service';\nimport type { AXConversationConfig } from './conversation-config.interface';\nimport { mergeWithDefaults } from './conversation-config.defaults';\n\n/**\n * Configuration token for conversation component\n * Uses centralized defaults from AX_DEFAULT_CONVERSATION_CONFIG\n */\nexport const AX_CONVERSATION_CONFIG = new InjectionToken<Required<AXConversationConfig>>('AX_CONVERSATION_CONFIG', {\n providedIn: 'root',\n factory: () => mergeWithDefaults(),\n});\n\n/**\n * Token for configuring AXConversationErrorHandlerService\n */\nexport const AX_CONVERSATION_ERROR_HANDLER_CONFIG = new InjectionToken<Partial<AXConversationErrorHandlerConfig>>('AX_CONVERSATION_ERROR_HANDLER_CONFIG', {\n providedIn: 'root',\n factory: () => ({}),\n});\n","/**\n * Pluggable avatar components for the conversation UI.\n * Register via `provideConversation({ avatarComponents: { user, conversation } })`.\n * When only `user` is registered, a built-in conversation avatar host is wired automatically.\n */\n\nimport { InjectionToken, type InputSignal, type Type } from '@angular/core';\n\n/** Custom user avatar (e.g. platform `axp-user-avatar`). */\nexport interface AXConversationUserAvatarComponent {\n readonly userId: InputSignal<string>;\n readonly size: InputSignal<number>;\n /** Optional resolved display name (e.g. bot/assist peer title). */\n readonly displayName?: InputSignal<string | undefined>;\n /** Optional resolved avatar URL when `userId` is not a platform user row. */\n readonly displayAvatar?: InputSignal<string | undefined>;\n /** Optional icon class when no avatar image is available. */\n readonly displayIcon?: InputSignal<string | undefined>;\n}\n\n/** Optional custom group/channel conversation avatar. */\nexport interface AXConversationConversationAvatarComponent {\n readonly conversationId: InputSignal<string>;\n readonly size: InputSignal<number>;\n /** Optional resolved display name for the conversation. */\n readonly displayName?: InputSignal<string | undefined>;\n /** Optional resolved avatar URL when no platform conversation row exists. */\n readonly displayAvatar?: InputSignal<string | undefined>;\n /** Optional icon class when no avatar image is available. */\n readonly displayIcon?: InputSignal<string | undefined>;\n}\n\nexport type AXConversationAvatarKind = 'user' | 'conversation' | 'auto';\n\nexport const AX_CONVERSATION_USER_AVATAR_COMPONENT = new InjectionToken<\n Type<AXConversationUserAvatarComponent>\n>('AX_CONVERSATION_USER_AVATAR_COMPONENT');\n\nexport const AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT = new InjectionToken<\n Type<AXConversationConversationAvatarComponent>\n>('AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT');\n\nexport interface AXConversationAvatarComponents {\n user?: Type<AXConversationUserAvatarComponent>;\n conversation?: Type<AXConversationConversationAvatarComponent>;\n}\n","/**\n * Registry Configuration Tokens\n * Injection tokens for configuring default registry values\n */\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXConversationComposerAction } from '../registries/composer-action.registry';\nimport type { AXConversationComposerTab } from '../registries/composer-tab.registry';\nimport type { AXConversationItemAction } from '../registries/conversation-item-action.registry';\nimport type { AXConversationTab } from '../registries/conversation-tab.registry';\nimport type { AXConversationInfoBarAction } from '../registries/info-bar-action.registry';\nimport type { AXConversationMessageAction } from '../registries/message-action.registry';\nimport type { AXConversationMessageRenderer } 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, system, fallback) are registered by default; other types are provided via plugins/constants.\n */\nexport const AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS = new InjectionToken<AXConversationMessageRenderer[]>('AX_CONVERSATION_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 AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS = new InjectionToken<AXConversationMessageAction[]>('AX_CONVERSATION_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 AX_CONVERSATION_DEFAULT_COMPOSER_TABS = new InjectionToken<AXConversationComposerTab[]>('AX_CONVERSATION_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 AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS = new InjectionToken<AXConversationComposerAction[]>('AX_CONVERSATION_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 AX_CONVERSATION_DEFAULT_CONVERSATION_TABS = new InjectionToken<AXConversationTab[]>('AX_CONVERSATION_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 AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS = new InjectionToken<AXConversationInfoBarAction[]>('AX_CONVERSATION_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 AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS = new InjectionToken<AXConversationItemAction[]>(\n 'AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS',\n {\n providedIn: 'root',\n factory: () => [],\n },\n);\n\n/**\n * Registry configuration interface\n */\nexport interface AXConversationRegistryConfiguration {\n /**\n * Additional message renderers to register (built-in renderers are automatic).\n * Each {@link AXConversationMessageRenderer} may include optional `composerActions` for co-located send UX.\n */\n messageRenderers?: AXConversationMessageRenderer[];\n\n /** Message actions to register by default */\n messageActions?: AXConversationMessageAction[];\n\n /** Composer tabs to register by default */\n composerTabs?: AXConversationComposerTab[];\n\n /** Composer actions to register by default */\n composerActions?: AXConversationComposerAction[];\n\n /** Conversation tabs to register by default */\n conversationTabs?: AXConversationTab[];\n\n /** Info bar actions to register by default */\n infoBarActions?: AXConversationInfoBarAction[];\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 AX_CONVERSATION_REGISTRY_CONFIG = new InjectionToken<AXConversationRegistryConfiguration>('AX_CONVERSATION_REGISTRY_CONFIG', {\n providedIn: 'root',\n factory: () => ({}),\n});\n","/**\n * Conversation feature flags for configurable bundle size.\n */\nexport type AXConversationComposerTabFeature = 'emoji' | 'sticker';\n\nexport interface AXConversationFeatures {\n /** Enabled built-in composer popup tabs (`emoji`, `sticker`). Defaults to none when omitted. */\n composerTabs?: AXConversationComposerTabFeature[];\n}\n\nexport function resolveConversationComposerTabs(\n features?: AXConversationFeatures,\n): readonly AXConversationComposerTabFeature[] {\n return features?.composerTabs ?? [];\n}\n\nexport function isComposerTabEnabled(\n tab: AXConversationComposerTabFeature,\n features?: AXConversationFeatures,\n): boolean {\n return resolveConversationComposerTabs(features).includes(tab);\n}\n","/**\n * API call logger for AXConversationService.\n * Enabled via `debugApiLogging` in conversation config.\n */\n\nimport { inject, Injectable } from '@angular/core';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\n\nconst loggerFn = console.log;\n\nexport type AXConversationApiName = 'userApi' | 'conversationApi' | 'messageApi' | 'realtimeApi';\n\nexport interface AXConversationApiLogEntry {\n /** Public method on AXConversationService that triggered the API call. */\n serviceMethod: string;\n /** Injected API instance name. */\n api: AXConversationApiName;\n /** Method invoked on the API instance. */\n apiMethod: string;\n /** Positional arguments passed to the API method. */\n context: unknown[];\n}\n\n@Injectable()\nexport class AXConversationApiLoggerService {\n private readonly config = inject(AX_CONVERSATION_CONFIG);\n\n log(entry: AXConversationApiLogEntry): void {\n if (!this.config.debugApiLogging) {\n return;\n }\n\n loggerFn('[AXConversation API]', entry);\n }\n}\n","/**\n * Abstract Conversation Management API\n * Handle conversation CRUD operations, participants, and settings\n */\n\nimport type { AXConversation, AXConversationType, AXConversationParticipant, AXConversationParticipantRole } from '../../models';\nimport type { AXConversationApiError, AXConversationPaginatedResult, AXConversationPagination } 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 /** User who creates the conversation */\n creatorId?: string;\n /** Conversation title (for groups/channels) */\n title?: string;\n /** Conversation description */\n description?: string;\n /** Avatar URL */\n avatar?: string;\n /**\n * Font Awesome icon class(es) for this conversation when no image avatar is used.\n * Implementations should treat empty/whitespace `avatar` values as absent and use this icon fallback.\n */\n icon?: string;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n /**\n * When `true`, create a new private chat even if one already exists with the same participants.\n * Defaults to `false` for private conversations.\n */\n forceCreate?: boolean;\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 /**\n * Font Awesome icon class(es) for this conversation when no image avatar is used.\n * Implementations should treat empty/whitespace `avatar` values as absent and use this icon fallback.\n */\n icon?: string;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Options for {@link AXConversationApi.deleteConversation}.\n */\nexport interface AXConversationDeleteOptions {\n /**\n * Private: destroy the chat for every participant (Telegram \"delete for both\").\n * Group/channel: only valid for the creator — destroys the room for everyone.\n * Defaults to `false` (hide / clear history for the current user only).\n */\n forEveryone?: boolean;\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, unknown>;\n}\n\n/**\n * @deprecated Use {@link AXConversationRoomPreferences} on the user API instead.\n */\nexport type AXConversationSettingsUpdate = import('../../models').AXConversationRoomPreferences;\n\n/**\n * Participant update data\n */\nexport interface AXConversationParticipantUpdate {\n /** User ID */\n userId: string;\n /** New role */\n role?: AXConversationParticipantRole;\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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} If request fails\n */\n abstract getConversations(\n pagination: AXConversationPagination,\n filters?: AXConversationFilters,\n ): Promise<AXConversationPaginatedResult<AXConversation>>;\n\n /**\n * Update conversation details\n *\n * @param conversationId - Conversation ID\n * @param updates - Update data\n * @returns Updated conversation\n * @throws {AXConversationApiError} If update fails\n */\n abstract updateConversation(conversationId: string, updates: AXConversationUpdateData): Promise<AXConversation>;\n\n /**\n * Delete or hide a conversation for the current user.\n *\n * @param conversationId - Conversation ID\n * @param options - `forEveryone` destroys the room; omit/false hides it for the current user only\n * (private chats keep the peer's history). Group/channel leave should use {@link leaveConversation}.\n * @throws {AXConversationApiError} If deletion fails\n */\n abstract deleteConversation(conversationId: string, options?: AXConversationDeleteOptions): Promise<boolean>;\n\n // =====================\n // Conversation Actions\n // =====================\n\n /**\n * Archive conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXConversationApiError} If archiving fails\n */\n abstract archiveConversation(conversationId: string): Promise<void>;\n\n /**\n * Unarchive conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXConversationApiError} If unarchiving fails\n */\n abstract unarchiveConversation(conversationId: string): Promise<void>;\n\n /**\n * Pin conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXConversationApiError} If pinning fails\n */\n abstract pinConversation(conversationId: string): Promise<void>;\n\n /**\n * Unpin conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXConversationApiError} 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 {AXConversationApiError} If marking fails\n */\n abstract markConversationAsRead(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 {AXConversationApiError} 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 {AXConversationApiError} If filtering fails\n */\n abstract filterConversations(\n filters: AXConversationFilters,\n pagination?: AXConversationPagination,\n ): Promise<AXConversationPaginatedResult<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 {AXConversationApiError} If request fails\n */\n abstract getParticipants(conversationId: string): Promise<AXConversationParticipant[]>;\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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} If leaving fails\n */\n abstract leaveConversation(conversationId: string): Promise<void>;\n\n /**\n * Update participant role\n *\n * @param conversationId - Conversation ID\n * @param update - Participant update data\n * @returns Updated conversation\n * @throws {AXConversationApiError} If update fails\n */\n abstract updateParticipant(conversationId: string, update: AXConversationParticipantUpdate): Promise<AXConversation>;\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 {AXConversationApiError} 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 {AXConversationApiError} If request fails\n */\n abstract getConversationMedia(conversationId: string, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<unknown>>;\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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} If request fails\n */\n abstract getConversationTags(conversationId: string): Promise<string[]>;\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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} 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): AXConversationApiError {\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 { AXConversationMessage, AXConversationMessagePayload, AXConversationSendMessageCommand } from '../../models';\nimport type { AXConversationApiError, AXConversationPaginatedResult, AXConversationPagination } from './api-types';\n\n/**\n * Message search filters\n */\nexport interface AXConversationMessageSearchFilters {\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 AXConversationMessageForwardData {\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 AXConversationReadReceipt {\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 AXConversationPinnedMessage {\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 AXConversationMessageApi {\n * constructor(private http: HttpClient) {\n * super();\n * }\n *\n * async sendMessage(command: AXConversationSendMessageCommand): Promise<AXConversationMessage> {\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 AXConversationMessageApi {\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 {AXConversationApiError} If send fails\n */\n abstract sendMessage(command: AXConversationSendMessageCommand): Promise<AXConversationMessage>;\n\n /**\n * Get message by ID\n *\n * @param messageId - Message ID\n * @returns Message details\n * @throws {AXConversationApiError} If message not found\n */\n abstract getMessage(messageId: string): Promise<AXConversationMessage>;\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 {AXConversationApiError} If request fails\n */\n abstract getMessages(conversationId: string, pagination: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversationMessage>>;\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 {AXConversationApiError} If edit fails or message not found\n */\n abstract editMessage(messageId: string, payload: AXConversationMessagePayload): Promise<AXConversationMessage>;\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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} If search fails\n */\n abstract searchMessages(\n conversationId: string,\n filters: AXConversationMessageSearchFilters,\n pagination?: AXConversationPagination,\n ): Promise<AXConversationPaginatedResult<AXConversationMessage>>;\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 {AXConversationApiError} If search fails\n */\n abstract searchAllMessages(\n filters: AXConversationMessageSearchFilters,\n pagination?: AXConversationPagination,\n ): Promise<AXConversationPaginatedResult<AXConversationMessage>>;\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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} If request fails\n */\n abstract getReadReceipts(messageId: string): Promise<AXConversationReadReceipt[]>;\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 {AXConversationApiError} If forwarding fails\n */\n abstract forwardMessage(data: AXConversationMessageForwardData): Promise<AXConversationMessage[]>;\n\n /**\n * Pin message in conversation\n *\n * @param conversationId - Conversation ID\n * @param messageId - Message ID to pin\n * @throws {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} If request fails\n */\n abstract getPinnedMessages(conversationId: string): Promise<AXConversationPinnedMessage[]>;\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 {AXConversationApiError} If request fails\n */\n abstract getMessageReplies(messageId: string, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversationMessage>>;\n\n /**\n * Get reply count for a message\n *\n * @param messageId - Original message ID\n * @returns Number of replies\n * @throws {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} If stopping fails\n */\n abstract stopTypingIndicator(conversationId: string): Promise<void>;\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 {AXConversationApiError} If update fails\n */\n abstract updateMessageMetadata(messageId: string, metadata: Record<string, unknown>): Promise<void>;\n\n /**\n * Get message metadata\n *\n * @param messageId - Message ID\n * @returns Message metadata\n * @throws {AXConversationApiError} If request fails\n */\n abstract getMessageMetadata(messageId: string): Promise<Record<string, unknown>>;\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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} 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): AXConversationApiError {\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 event subscriptions for conversation domain updates\n */\n\nimport { Observable } from 'rxjs';\nimport type {\n AXConversation,\n AXConversationMessage,\n AXConversationPresenceUpdate,\n AXConversationTypingIndicator,\n} from '../../models';\n\n/**\n * Abstract Real-time Events API\n *\n * Implement this abstract class to expose domain event streams from your WebSocket/SSE layer.\n * Connection lifecycle is owned by the implementation — this contract only covers subscriptions.\n *\n * Covered domains: message CRUD, conversation (room) CRUD, typing indicators, and presence.\n * Message updates include edits, reactions, delivery/read status, and other message field changes.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyRealtimeApi extends AXConversationRealtimeApi {\n * private readonly messageCreated$ = new Subject<AXConversationMessage>();\n *\n * constructor(private readonly socket: MyChatSocketService) {\n * super();\n * this.socket.on('message.created', (message) => this.messageCreated$.next(message));\n * }\n *\n * subscribeToMessages(conversationId: string): Observable<AXConversationMessage> {\n * return this.messageCreated$.pipe(\n * filter((message) => !conversationId || message.conversationId === conversationId),\n * );\n * }\n *\n * // ... implement other methods\n * }\n * ```\n */\nexport abstract class AXConversationRealtimeApi {\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<AXConversationMessage>;\n\n /**\n * Subscribe to message updates (edits, reactions, status changes, metadata, etc.)\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of updated messages\n */\n abstract subscribeToMessageUpdates(conversationId?: string): Observable<AXConversationMessage>;\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 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 * 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<{\n messageId: string;\n userId: string;\n readAt: Date;\n }>;\n\n // =====================\n // Conversation Events\n // =====================\n\n /**\n * Subscribe to conversation updates\n * Fires when conversation details change (title, avatar, participants, last message, 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<AXConversationTypingIndicator>;\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<AXConversationPresenceUpdate>;\n}\n","/**\n * Abstract User Management API\n * Handle user profile management and user operations for conversations\n */\n\nimport type {\n AXConversationParticipant,\n AXConversationPresenceUpdate,\n AXConversationRoomPreferences,\n AXConversationRoomPreferencesMap,\n AXConversationUser,\n AXConversationUserProfile,\n} from '../../models';\nimport type {\n AXConversationApiError,\n AXConversationPaginatedResult,\n AXConversationPagination,\n AXConversationPresenceStatus,\n} from './api-types';\n\n/**\n * User profile update data\n */\nexport interface AXConversationUserProfileUpdate {\n /** Display name */\n name?: string;\n /** Avatar URL */\n avatar?: string;\n /** Short line under the name in lists (e.g. job title) */\n description?: string;\n /** Extended profile fields */\n profile?: Partial<AXConversationUserProfile>;\n /** @deprecated Prefer `profile.bio` */\n bio?: string;\n /** @deprecated Prefer `profile.phone` */\n phone?: string;\n /** @deprecated Prefer `profile.email` */\n email?: string;\n /** Custom fields */\n custom?: Record<string, unknown>;\n}\n\n/**\n * User search filters\n */\nexport interface AXConversationUserSearchFilters {\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 AXConversationBlockReportReason {\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 AXConversationUserApi {\n * constructor(private http: HttpClient) {\n * super();\n * }\n *\n * async getCurrentUser(): Promise<AXConversationParticipant> {\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 AXConversationUserApi {\n\n // =====================\n // User Profile\n // =====================\n\n /**\n * Get current authenticated user\n *\n * @returns Current user information\n * @throws {AXConversationApiError} If user is not authenticated\n */\n abstract getCurrentUser(): Promise<AXConversationUser>;\n\n /**\n * Update current user profile\n *\n * @param updates - Profile updates\n * @returns Updated user information\n * @throws {AXConversationApiError} If update fails\n */\n abstract updateProfile(updates: AXConversationUserProfileUpdate): Promise<AXConversationUser>;\n\n /**\n * Upload user avatar\n *\n * @param file - Avatar image file\n * @returns Avatar URL\n * @throws {AXConversationApiError} 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 pagination - Pagination parameters\n * @param filters - Search filters\n * @returns Paginated list of users\n * @throws {AXConversationApiError} If request fails\n */\n abstract getUsers(\n pagination?: AXConversationPagination,\n filters?: AXConversationUserSearchFilters,\n ): Promise<AXConversationPaginatedResult<AXConversationParticipant>>;\n\n /**\n * Search users by query\n *\n * @param query - Search query\n * @returns Matching users\n * @throws {AXConversationApiError} If search fails\n */\n abstract searchUsers(query: string): Promise<AXConversationParticipant[]>;\n\n /**\n * Get user by ID\n *\n * @param userId - User ID\n * @returns User information\n * @throws {AXConversationApiError} If user not found\n */\n abstract getUserById(userId: string): Promise<AXConversationParticipant>;\n\n /**\n * Get multiple users by IDs\n *\n * @param userIds - Array of user IDs\n * @returns Array of users\n * @throws {AXConversationApiError} If request fails\n */\n abstract getUsersByIds(userIds: string[]): Promise<AXConversationParticipant[]>;\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 {AXConversationApiError} If request fails\n */\n abstract getUserPresence(userId: string): Promise<AXConversationPresenceUpdate>;\n\n /**\n * Get presence for multiple users (bulk hydration).\n */\n abstract getUsersPresence(userIds: string[]): Promise<AXConversationPresenceUpdate[]>;\n\n /**\n * Update current user presence\n *\n * @param status - Presence status\n * @param statusText - Optional status text\n * @throws {AXConversationApiError} If update fails\n */\n abstract updatePresence(status: AXConversationPresenceStatus, 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 {AXConversationApiError} If blocking fails\n */\n abstract blockUser(userId: string, reason?: AXConversationBlockReportReason): Promise<void>;\n\n /**\n * Unblock a user\n *\n * @param userId - User ID to unblock\n * @throws {AXConversationApiError} 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 {AXConversationApiError} 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 {AXConversationApiError} If reporting fails\n */\n abstract reportUser(userId: string, reason: AXConversationBlockReportReason): Promise<void>;\n\n // =====================\n // User Settings & Preferences\n // =====================\n\n /**\n * Get user settings\n *\n * @returns User settings\n * @throws {AXConversationApiError} If request fails\n */\n abstract getUserSettings(): Promise<Record<string, unknown>>;\n\n /**\n * Update user settings\n *\n * @param settings - Settings to update\n * @throws {AXConversationApiError} If update fails\n */\n abstract updateUserSettings(settings: Record<string, unknown>): Promise<void>;\n\n // =====================\n // Per-conversation user preferences (mute, notifications, etc.)\n // =====================\n\n /**\n * Get all conversation preferences for the current user.\n */\n abstract getConversationPreferences(): Promise<AXConversationRoomPreferencesMap>;\n\n /**\n * Get preferences for a single conversation.\n */\n abstract getConversationPreferencesForRoom(conversationId: string): Promise<AXConversationRoomPreferences>;\n\n /**\n * Update preferences for a conversation (current user's view).\n */\n abstract updateConversationPreferences(\n conversationId: string,\n preferences: Partial<AXConversationRoomPreferences>,\n ): Promise<AXConversationRoomPreferences>;\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): AXConversationApiError {\n return {\n code,\n message,\n statusCode,\n details,\n timestamp: new Date(),\n };\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 logger\nexport * from './conversation-api-logger.service';\n\n// API abstracts\nexport * from './conversation-api.abstract';\nexport * from './message-api.abstract';\nexport * from './realtime-api.abstract';\nexport * from './user-api.abstract';\n","/**\n * Tracks composer primary-button generation state (e.g. AI response in progress).\n * Shared by ConversationService, ComposerService, and app-level Message APIs.\n */\nimport { computed, Injectable, signal } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nexport type AXConversationComposerGenerationPhase = 'idle' | 'generating' | 'stopping';\n\n@Injectable()\nexport class AXConversationComposerGenerationStateService {\n private readonly _phase = signal<AXConversationComposerGenerationPhase>('idle');\n private readonly _cancelled$ = new Subject<void>();\n\n /** Current generation lifecycle phase. */\n readonly phase = this._phase.asReadonly();\n\n /** Whether a background generation (e.g. AI response) is in progress. */\n readonly isGenerating = computed(() => this._phase() === 'generating');\n\n /** Whether generation is being cancelled (spinner / locked until API finishes). */\n readonly isStopping = computed(() => this._phase() === 'stopping');\n\n /** Whether generation or stop-cleanup is in progress. */\n readonly isBusy = computed(() => this._phase() !== 'idle');\n\n /** Emits when the user presses the composer cancel/stop button. */\n readonly onCancelled = this._cancelled$.asObservable();\n\n setGenerating(value: boolean): void {\n this._phase.set(value ? 'generating' : 'idle');\n }\n\n /** User requested cancel — enters `stopping` until {@link setGenerating}(false) is called. */\n cancel(): void {\n if (this._phase() !== 'generating') {\n return;\n }\n this._phase.set('stopping');\n this._cancelled$.next();\n }\n}\n","import type { AXConversationMessageType } from './message.model';\n\n/** Lightweight catalog ids — safe to import from plugin definitions without pulling pickers. */\nexport const AX_CONVERSATION_IMAGE_CATALOG = 'conversation-image' as const;\nexport const AX_CONVERSATION_VIDEO_CATALOG = 'conversation-video' as const;\nexport const AX_CONVERSATION_AUDIO_CATALOG = 'conversation-audio' as const;\nexport const AX_CONVERSATION_FILE_CATALOG = 'conversation-file' as const;\nexport const AX_CONVERSATION_VOICE_CATALOG = 'conversation-voice' as const;\n\n/** Catalog names for conversation media message types (no picker module imports). */\nexport const AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE: Partial<Record<AXConversationMessageType, string>> = {\n image: AX_CONVERSATION_IMAGE_CATALOG,\n video: AX_CONVERSATION_VIDEO_CATALOG,\n audio: AX_CONVERSATION_AUDIO_CATALOG,\n file: AX_CONVERSATION_FILE_CATALOG,\n voice: AX_CONVERSATION_VOICE_CATALOG,\n sticker: AX_CONVERSATION_IMAGE_CATALOG,\n};\n\n/** Resolves {@link AXConversationMessage.fileType} from command or message type. */\nexport function resolveConversationMessageFileType(type: AXConversationMessageType, fileType?: string): string | undefined {\n return fileType ?? AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE[type];\n}\n","import type { AXConversation } from '../models/conversation.model';\nimport type { AXConversationParticipant } from '../models/participant.model';\n\nexport interface AXConversationForwardUserSortEntry {\n user: AXConversationParticipant;\n conversation?: AXConversation;\n}\nimport {\n AX_CONVERSATION_PEER_AVATAR_TYPES,\n resolveConversationPeerParticipant,\n} from './avatar-context.utils';\n\nconst AX_CONVERSATION_GENERIC_PRIVATE_TITLES = new Set(['', 'new chat', 'new conversation']);\n\n/** Default Font Awesome icon for group conversations without a custom avatar image. */\nexport const AX_CONVERSATION_DEFAULT_GROUP_ICON = 'fa-light fa-users';\n\n/** Default Font Awesome icon for private/bot conversations without a custom avatar image. */\nexport const AX_CONVERSATION_DEFAULT_USER_ICON = 'fa-light fa-user';\n\n/** True when the stored title is a placeholder, not a user-defined name. */\nexport function isGenericPrivateConversationTitle(title: string | undefined): boolean {\n return AX_CONVERSATION_GENERIC_PRIVATE_TITLES.has((title ?? '').trim().toLowerCase());\n}\n\n/**\n * Find an existing private 1:1 conversation between the current user and a peer.\n * Matches conversations with exactly those two participants.\n */\nexport function findExistingPrivateConversation(\n conversations: AXConversation[],\n currentUserId: string,\n peerUserId: string,\n): AXConversation | undefined {\n return conversations.find((conversation) => {\n if (conversation.type !== 'private' || conversation.archived) {\n return false;\n }\n\n const participantIds = new Set(conversation.participants.map((participant) => participant.id));\n return participantIds.size === 2 && participantIds.has(currentUserId) && participantIds.has(peerUserId);\n });\n}\n\n/**\n * Sort users for forward picker: existing private chats first (most recent on top), then others by name.\n */\nexport function sortUsersForForward(\n users: AXConversationParticipant[],\n conversations: AXConversation[],\n currentUserId: string,\n): AXConversationParticipant[] {\n const entries: AXConversationForwardUserSortEntry[] = users.map((user) => ({\n user,\n conversation: findExistingPrivateConversation(conversations, currentUserId, user.id),\n }));\n\n return entries\n .sort((a, b) => {\n const aConversation = a.conversation;\n const bConversation = b.conversation;\n\n if (aConversation && !bConversation) {\n return -1;\n }\n if (!aConversation && bConversation) {\n return 1;\n }\n if (aConversation && bConversation) {\n const aTime = aConversation.lastMessageAt?.getTime() ?? 0;\n const bTime = bConversation.lastMessageAt?.getTime() ?? 0;\n if (bTime !== aTime) {\n return bTime - aTime;\n }\n }\n\n return a.user.name.localeCompare(b.user.name);\n })\n .map((entry) => entry.user);\n}\n\n/** Other participant in a private 1v1 chat (excludes the current viewer). */\nexport function resolvePrivatePeerParticipant(\n conversation: AXConversation,\n currentUserId?: string,\n): AXConversationParticipant | undefined {\n if (conversation.type !== 'private') {\n return undefined;\n }\n\n return resolveConversationPeerParticipant(conversation, currentUserId);\n}\n\n/**\n * Resolves the display title for the current viewer.\n * Private and bot peer-scoped chats show the other participant's name when no custom title is set.\n */\nexport function resolveConversationTitleForViewer(\n conversation: AXConversation,\n currentUserId?: string,\n): string {\n if (!AX_CONVERSATION_PEER_AVATAR_TYPES.has(conversation.type)) {\n return conversation.title;\n }\n\n const peer = resolveConversationPeerParticipant(conversation, currentUserId);\n if (peer?.name) {\n return peer.name;\n }\n\n if (conversation.type === 'private' && isGenericPrivateConversationTitle(conversation.title)) {\n return conversation.title || 'New Chat';\n }\n\n return conversation.title;\n}\n\n/**\n * Returns a viewer-scoped copy of a conversation with dynamic peer title/avatar/icon.\n * Does not mutate the source object.\n */\nexport function resolveConversationForViewer(\n conversation: AXConversation,\n currentUserId?: string,\n): AXConversation {\n if (!AX_CONVERSATION_PEER_AVATAR_TYPES.has(conversation.type) || !currentUserId) {\n return conversation;\n }\n\n const peer = resolveConversationPeerParticipant(conversation, currentUserId);\n if (!peer) {\n return conversation;\n }\n\n const title = resolveConversationTitleForViewer(conversation, currentUserId);\n const avatar = conversation.avatar ?? peer.avatar;\n const icon = conversation.icon ?? peer.icon;\n\n if (\n title === conversation.title &&\n avatar === conversation.avatar &&\n icon === conversation.icon\n ) {\n return conversation;\n }\n\n return {\n ...conversation,\n title,\n avatar,\n icon,\n };\n}\n\n/** Whether message reactions are enabled for a conversation. Defaults to `true` when omitted. */\nexport function isConversationReactionsEnabled(conversation?: AXConversation | null): boolean {\n const value = conversation?.metadata?.reactionsEnabled;\n return value !== false;\n}\n","import type { AXConversationMessage, AXConversationTextPayload } from '../models';\n\n/** Visual chrome around a message body in the list. */\nexport type AXConversationMessageChrome = 'bubble' | 'plain';\n\n/** Max consecutive emoji graphemes that render as a jumbo (sticker-sized) text message. */\nexport const AX_CONVERSATION_JUMBO_EMOJI_MAX = 3;\n\n/** One emoji grapheme: ZWJ sequences, skin tones, keycaps, and flags. */\nconst EMOJI_GRAPHEME =\n /^(?:\\p{Extended_Pictographic}(?:\\p{Emoji_Modifier}|\\uFE0F|\\u200D(?:\\p{Extended_Pictographic}|\\p{Emoji_Modifier}|[\\u2640\\u2642]\\uFE0F?))*|\\p{Regional_Indicator}{2}|\\d\\uFE0F?\\u20E3)$/u;\n\nconst EMOJI_SEQUENCE_GLOBAL =\n /(?:\\p{Extended_Pictographic}(?:\\p{Emoji_Modifier}|\\uFE0F|\\u200D(?:\\p{Extended_Pictographic}|\\p{Emoji_Modifier}|[\\u2640\\u2642]\\uFE0F?))*|\\p{Regional_Indicator}{2}|\\d\\uFE0F?\\u20E3)/gu;\n\n/**\n * Resolve registry chrome config to a concrete value.\n * Default is {@link AXConversationMessageChrome bubble}.\n */\nexport function resolveMessageChrome(\n chrome: AXConversationMessageChrome | ((message: AXConversationMessage) => AXConversationMessageChrome) | undefined,\n message: AXConversationMessage,\n): AXConversationMessageChrome {\n if (!chrome) {\n return 'bubble';\n }\n return typeof chrome === 'function' ? chrome(message) : chrome;\n}\n\n/** Visible graphemes in trimmed text (whitespace between emojis is dropped). */\nexport function listTextGraphemes(text: string | null | undefined): string[] {\n const trimmed = text?.trim() ?? '';\n if (!trimmed) {\n return [];\n }\n\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n return [...new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(trimmed)]\n .map((part) => part.segment)\n .filter((part) => part.trim().length > 0);\n }\n\n return trimmed.match(EMOJI_SEQUENCE_GLOBAL) ?? [...trimmed];\n}\n\n/** Count emoji graphemes in trimmed text; `0` when mixed with other characters. */\nexport function countLoneEmojis(text: string | null | undefined): number {\n const graphemes = listTextGraphemes(text);\n if (graphemes.length === 0 || graphemes.length > AX_CONVERSATION_JUMBO_EMOJI_MAX) {\n return 0;\n }\n\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n return graphemes.every((part) => EMOJI_GRAPHEME.test(part)) ? graphemes.length : 0;\n }\n\n const trimmed = text?.trim() ?? '';\n const matches = trimmed.match(EMOJI_SEQUENCE_GLOBAL);\n if (!matches || matches.length !== graphemes.length) {\n return 0;\n }\n const rest = trimmed.replace(EMOJI_SEQUENCE_GLOBAL, '').replace(/[\\s\\uFE0F\\u200D]/g, '');\n return rest.length === 0 ? matches.length : 0;\n}\n\nexport function isJumboEmojiText(text: string | null | undefined): boolean {\n return countLoneEmojis(text) > 0;\n}\n\nexport function isJumboEmojiTextMessage(message: AXConversationMessage): boolean {\n if (message.type !== 'text') {\n return false;\n }\n return isJumboEmojiText((message.payload as AXConversationTextPayload | undefined)?.text);\n}\n\n/** Types that never sit inside a bubble cluster with neighboring messages. */\nexport function isPlainChromeMessage(message: AXConversationMessage): boolean {\n return message.type === 'sticker' || isJumboEmojiTextMessage(message);\n}\n","/**\n * Message Utilities Service\n * Helper functions for message formatting and display\n */\n\nimport { translateSync } from '@acorex/core/translation';\nimport type { AXConversation, AXConversationMessage, AXConversationPresenceStatus, AXConversationUserPresence } from '../models';\nimport { resolveConversationPeerUserId } from './avatar-context.utils';\nimport { isPlainChromeMessage } from './message-chrome';\n\n/** Position of a message inside a consecutive same-sender cluster (Telegram grouping). */\nexport type AXConversationMessageClusterRole = 'single' | 'start' | 'middle' | 'end';\n\nexport class AXConversationMessageUtilsService {\n static getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].charAt(0).toUpperCase();\n return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();\n }\n\n static getMessageText(message: AXConversationMessage): string {\n const payload = message.payload;\n if (!payload) return '';\n\n if (payload.type === 'text' && 'text' in payload && typeof payload.text === 'string') {\n return payload.text;\n }\n\n if ('caption' in payload && typeof payload.caption === 'string') {\n return payload.caption;\n }\n\n return '';\n }\n\n static getPreviewText(message: AXConversationMessage, maxLength?: number): { value: string; type: string; icon: string } {\n const type = message.type;\n let text = AXConversationMessageUtilsService.getMessageText(message);\n if (maxLength && text.length > maxLength) {\n text = text.substring(0, maxLength) + '...';\n }\n\n switch (type) {\n case 'image':\n return { value: text, type: 'image', icon: 'fa-light fa-image' };\n case 'video':\n return { value: text, type: 'video', icon: 'fa-light fa-video' };\n case 'audio':\n case 'voice':\n return { value: text, type: type, icon: 'fa-light fa-microphone' };\n case 'file':\n return { value: text, type: 'file', icon: 'fa-light fa-file' };\n case 'location':\n return { value: text, type: 'location', icon: 'fa-light fa-location-dot' };\n case 'sticker':\n return { value: text, type: 'sticker', icon: 'fa-light fa-note-sticky' };\n default:\n return { value: text, type: 'text', icon: 'fa-light fa-message' };\n }\n }\n\n static isOwnMessage(message: AXConversationMessage, currentUserId: string): boolean {\n return message.senderId === currentUserId;\n }\n\n static getSenderName(message: AXConversationMessage, conversation: AXConversation): string {\n const participant = conversation.participants.find((p) => p.id === message.senderId);\n return participant?.name ?? translateSync('@acorex:chat.fallbacks.unknown-user');\n }\n\n static getSenderAvatar(message: AXConversationMessage, conversation: AXConversation): string | undefined {\n return conversation.participants.find((p) => p.id === message.senderId)?.avatar;\n }\n\n static getSenderAvatarIcon(message: AXConversationMessage, conversation: AXConversation): string | undefined {\n return conversation.participants.find((p) => p.id === message.senderId)?.icon;\n }\n\n static getConversationAvatar(conversation: AXConversation): string | undefined {\n const avatar = conversation.avatar?.trim();\n return avatar && avatar.length > 0 ? avatar : undefined;\n }\n\n static getConversationAvatarIcon(conversation: AXConversation): string | undefined {\n const icon = conversation.icon?.trim();\n return icon && icon.length > 0 ? icon : undefined;\n }\n\n static getConversationStatus(\n conversation: AXConversation,\n presence?: AXConversationUserPresence,\n ): AXConversationPresenceStatus | undefined {\n if (conversation.type !== 'private') {\n return undefined;\n }\n return presence?.status;\n }\n\n /** Consecutive same-sender messages within this window share one Telegram-style cluster. */\n static readonly MESSAGE_CLUSTER_MAX_GAP_MS = 5 * 60 * 1000;\n\n /** Palette of existing theme tokens used to color group sender names (not bubble chrome). */\n private static readonly SENDER_NAME_COLORS = [\n 'rgb(var(--ax-sys-color-primary-600))',\n 'rgb(var(--ax-sys-color-success-600))',\n 'rgb(var(--ax-sys-color-warning-600))',\n 'rgb(var(--ax-sys-color-danger-600))',\n 'rgb(var(--ax-sys-color-primary-800))',\n 'rgb(var(--ax-sys-color-success-500))',\n ] as const;\n\n static toTimestampMs(value: Date | string | number): number {\n if (value instanceof Date) {\n return value.getTime();\n }\n return new Date(value).getTime();\n }\n\n static shouldGroupMessages(message: AXConversationMessage, previousMessage?: AXConversationMessage): boolean {\n if (!previousMessage) return false;\n if (message.type === 'system' || previousMessage.type === 'system') return false;\n if (isPlainChromeMessage(message) || isPlainChromeMessage(previousMessage)) return false;\n if (message.senderId !== previousMessage.senderId) return false;\n\n const timeDiff = Math.abs(\n AXConversationMessageUtilsService.toTimestampMs(message.timestamp) -\n AXConversationMessageUtilsService.toTimestampMs(previousMessage.timestamp),\n );\n return timeDiff < AXConversationMessageUtilsService.MESSAGE_CLUSTER_MAX_GAP_MS;\n }\n\n static getMessageClusterRole(\n message: AXConversationMessage,\n previousMessage?: AXConversationMessage,\n nextMessage?: AXConversationMessage,\n ): AXConversationMessageClusterRole {\n if (message.type === 'system') {\n return 'single';\n }\n const withPrev = AXConversationMessageUtilsService.shouldGroupMessages(message, previousMessage);\n const withNext = nextMessage\n ? AXConversationMessageUtilsService.shouldGroupMessages(nextMessage, message)\n : false;\n if (!withPrev && !withNext) return 'single';\n if (!withPrev && withNext) return 'start';\n if (withPrev && withNext) return 'middle';\n return 'end';\n }\n\n static getSenderNameColor(senderId: string): string {\n let hash = 0;\n for (let i = 0; i < senderId.length; i++) {\n hash = (Math.imul(31, hash) + senderId.charCodeAt(i)) | 0;\n }\n const colors = AXConversationMessageUtilsService.SENDER_NAME_COLORS;\n const index = Math.abs(hash) % colors.length;\n return colors[index];\n }\n\n static getUserPresenceStatus(presence?: AXConversationUserPresence): AXConversationPresenceStatus | undefined {\n return presence?.status;\n }\n\n static getTypingText(conversation: AXConversation, typingUserIds: string[]): string {\n if (typingUserIds.length === 0) return '';\n\n if (conversation.type === 'private') {\n return translateSync('@acorex:chat.status.typing');\n }\n\n const firstUser = conversation.participants.find((p) => p.id === typingUserIds[0]);\n if (typingUserIds.length === 1) {\n return translateSync('@acorex:chat.status.user-is-typing', {\n params: { userName: firstUser?.name || translateSync('@acorex:chat.fallbacks.someone') },\n });\n }\n\n return translateSync('@acorex:chat.status.people-typing', { params: { count: typingUserIds.length } });\n }\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 translateSync('@acorex:chat.time.just-now');\n if (seconds < 3600) return translateSync('@acorex:chat.time.minutes-ago', { params: { count: Math.floor(seconds / 60) } });\n if (seconds < 86400) return translateSync('@acorex:chat.time.hours-ago', { params: { count: Math.floor(seconds / 3600) } });\n if (seconds < 604800) return translateSync('@acorex:chat.time.days-ago', { params: { count: Math.floor(seconds / 86400) } });\n\n return date.toLocaleDateString();\n }\n\n static getPrivateChatSubtitle(\n conversation: AXConversation,\n presence?: AXConversationUserPresence,\n currentUserId?: string,\n ): string {\n const peerPresence = presence;\n\n if (peerPresence?.status === 'online') {\n return translateSync('@acorex:chat.status.online');\n }\n if (peerPresence?.lastSeen) {\n return translateSync('@acorex:chat.status.last-seen', {\n params: { value: AXConversationMessageUtilsService.formatLastSeen(peerPresence.lastSeen) },\n });\n }\n return translateSync('@acorex:chat.status.offline');\n }\n\n static getConversationSubtitle(\n conversation: AXConversation,\n options?: {\n typingUserIds?: string[];\n peerPresence?: AXConversationUserPresence;\n currentUserId?: string;\n },\n ): string {\n const typingUserIds = options?.typingUserIds ?? [];\n if (typingUserIds.length > 0) {\n return AXConversationMessageUtilsService.getTypingText(conversation, typingUserIds);\n }\n\n switch (conversation.type) {\n case 'private':\n return AXConversationMessageUtilsService.getPrivateChatSubtitle(\n conversation,\n options?.peerPresence,\n options?.currentUserId,\n );\n\n case 'group':\n return translateSync('@acorex:chat.members.count', { params: { count: conversation.participants.length } });\n\n case 'channel':\n return translateSync('@acorex:chat.members.subscribers-count', { params: { count: conversation.participants.length } });\n\n case 'bot':\n return translateSync('@acorex:chat.bot');\n\n default:\n return '';\n }\n }\n}\n","import type { AXConversation, AXConversationType } from '../models/conversation.model';\nimport type { AXConversationMessage } from '../models/message.model';\nimport type { AXConversationParticipant } from '../models/participant.model';\nimport { resolveConversationTitleForViewer } from './conversation-display.utils';\nimport { AXConversationMessageUtilsService } from './message-utils.service';\n\nexport interface AXConversationAvatarDisplay {\n name: string;\n avatar?: string;\n icon?: string;\n}\n\n/** Conversation types that resolve a single peer participant for viewer-scoped avatar/title. */\nexport const AX_CONVERSATION_PEER_AVATAR_TYPES: ReadonlySet<AXConversationType> = new Set([\n 'private',\n 'bot',\n]);\n\nfunction normalizeOptionalMediaValue(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\n/**\n * Other participant in a peer-scoped conversation (excludes the current viewer).\n * Applies to private 1:1 and bot assist chats with exactly one non-viewer participant.\n */\nexport function resolveConversationPeerUserId(\n conversation: AXConversation,\n currentUserId?: string,\n): string | undefined {\n if (!AX_CONVERSATION_PEER_AVATAR_TYPES.has(conversation.type)) {\n return undefined;\n }\n\n const currentId = currentUserId ?? 'current-user';\n const peers = conversation.participants.filter((participant) => participant.id !== currentId);\n if (peers.length !== 1) {\n return undefined;\n }\n\n return peers[0].id;\n}\n\n/** Other participant in a private chat (excludes the current user). */\nexport function resolvePrivatePeerUserId(\n conversation: AXConversation,\n currentUserId?: string,\n): string | undefined {\n if (conversation.type !== 'private') {\n return undefined;\n }\n\n return resolveConversationPeerUserId(conversation, currentUserId);\n}\n\n/** Peer participant for private and bot conversations. */\nexport function resolveConversationPeerParticipant(\n conversation: AXConversation,\n currentUserId?: string,\n): AXConversationParticipant | undefined {\n const peerId = resolveConversationPeerUserId(conversation, currentUserId);\n if (!peerId) {\n return undefined;\n }\n\n return conversation.participants.find((participant) => participant.id === peerId);\n}\n\n/** Whether `auto` kind should render a registered user avatar for this conversation. */\nexport function shouldUseUserAvatarForConversation(\n conversation: AXConversation,\n currentUserId?: string,\n): boolean {\n return !!resolveConversationPeerUserId(conversation, currentUserId);\n}\n\nexport function resolveUserAvatarDisplay(\n userId: string,\n conversation: AXConversation | undefined,\n message?: AXConversationMessage,\n): AXConversationAvatarDisplay {\n if (message && conversation) {\n return {\n name: AXConversationMessageUtilsService.getSenderName(message, conversation),\n avatar: AXConversationMessageUtilsService.getSenderAvatar(message, conversation),\n icon: AXConversationMessageUtilsService.getSenderAvatarIcon(message, conversation),\n };\n }\n\n const participant = conversation?.participants.find((p) => p.id === userId);\n return {\n name: participant?.name ?? userId,\n avatar: participant?.avatar,\n icon: participant?.icon,\n };\n}\n\nexport function resolveConversationAvatarDisplay(\n conversation: AXConversation,\n currentUserId?: string,\n): AXConversationAvatarDisplay {\n const title =\n currentUserId !== undefined\n ? resolveConversationTitleForViewer(conversation, currentUserId)\n : conversation.title;\n\n const peer = resolveConversationPeerParticipant(conversation, currentUserId);\n const conversationAvatar = AXConversationMessageUtilsService.getConversationAvatar(conversation);\n const conversationIcon = AXConversationMessageUtilsService.getConversationAvatarIcon(conversation);\n const peerAvatar = normalizeOptionalMediaValue(peer?.avatar);\n const peerIcon = normalizeOptionalMediaValue(peer?.icon);\n\n return {\n name: title,\n avatar: conversationAvatar ?? peerAvatar,\n icon: conversationIcon ?? (conversationAvatar ? undefined : peerIcon),\n };\n}\n","import type { AXConversation, AXConversationType } from '../models/conversation.model';\nimport type { AXConversationParticipant } from '../models/participant.model';\n\n/** Group and channel rooms share join/leave and creator-destroy rules. */\nexport function isGroupLikeConversation(\n conversationOrType: AXConversation | AXConversationType | undefined,\n): boolean {\n const type = typeof conversationOrType === 'string' ? conversationOrType : conversationOrType?.type;\n return type === 'group' || type === 'channel';\n}\n\n/** True when `userId` created this room (falls back to owner/admin if `creatorId` is missing). */\nexport function isConversationRoomCreator(conversation: AXConversation, userId?: string): boolean {\n if (!userId) {\n return false;\n }\n if (conversation.creatorId) {\n return conversation.creatorId === userId;\n }\n const self = conversation.participants.find((participant) => participant.id === userId);\n return self?.role === 'owner' || self?.role === 'admin';\n}\n\n/** Earliest joiner; stable tie-break by participant id. */\nexport function pickEarliestJoinedParticipant(\n participants: AXConversationParticipant[],\n): AXConversationParticipant | undefined {\n if (participants.length === 0) {\n return undefined;\n }\n\n return [...participants].sort((left, right) => {\n const leftTime = joinedAtTime(left.joinedAt);\n const rightTime = joinedAtTime(right.joinedAt);\n if (leftTime !== rightTime) {\n return leftTime - rightTime;\n }\n return left.id.localeCompare(right.id);\n })[0];\n}\n\n/**\n * Whether a message should appear for a viewer after a one-sided history clear.\n * Exclusive: the cutoff instant itself is hidden (cleared \"up to now\").\n */\nexport function isMessageVisibleAfterHistoryCutoff(\n timestamp: Date | string | number,\n historyClearedAt?: Date | string | number | null,\n): boolean {\n if (historyClearedAt == null) {\n return true;\n }\n return toTime(timestamp) > toTime(historyClearedAt);\n}\n\nfunction joinedAtTime(value: Date | string | number | undefined): number {\n const time = toTime(value);\n return Number.isFinite(time) ? time : Number.POSITIVE_INFINITY;\n}\n\nfunction toTime(value: Date | string | number | undefined | null): number {\n if (value == null) {\n return Number.NaN;\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n return new Date(value).getTime();\n}\n","import type { AXConversationMessagePayload } from '../models';\n\ntype AXConversationMediaPayloadType = 'image' | 'video' | 'audio' | 'file';\ntype AXConversationMediaNormalizer = (payload: AXConversationMessagePayload) => AXConversationMessagePayload;\n\nconst AX_CONVERSATION_MEDIA_TYPES = new Set<AXConversationMediaPayloadType>(['image', 'video', 'audio', 'file']);\n\nconst normalizers: Partial<Record<AXConversationMediaPayloadType, AXConversationMediaNormalizer>> = {};\nconst loading = new Map<AXConversationMediaPayloadType, Promise<void>>();\n\nfunction isMediaPayloadType(type: string): type is AXConversationMediaPayloadType {\n return AX_CONVERSATION_MEDIA_TYPES.has(type as AXConversationMediaPayloadType);\n}\n\nasync function loadNormalizer(type: AXConversationMediaPayloadType): Promise<void> {\n if (normalizers[type]) {\n return;\n }\n\n const pending = loading.get(type);\n if (pending) {\n await pending;\n return;\n }\n\n const promise = (async () => {\n switch (type) {\n case 'image': {\n const mod = await import('../plugins/message-list/components/image-renderer/image.payload');\n normalizers.image = mod.normalizeImagePayload as AXConversationMediaNormalizer;\n break;\n }\n case 'video': {\n const mod = await import('../plugins/message-list/components/video-renderer/video.payload');\n normalizers.video = mod.normalizeVideoPayload as AXConversationMediaNormalizer;\n break;\n }\n case 'audio': {\n const mod = await import('../plugins/message-list/components/audio-renderer/audio.payload');\n normalizers.audio = mod.normalizeAudioPayload as AXConversationMediaNormalizer;\n break;\n }\n case 'file': {\n const mod = await import('../plugins/message-list/components/file-renderer/file.payload');\n normalizers.file = mod.normalizeFilePayload as AXConversationMediaNormalizer;\n break;\n }\n }\n })();\n\n loading.set(type, promise);\n await promise;\n}\n\n/** Normalize payload; loads media normalizers on demand. */\nexport async function normalizeMessagePayloadAsync(payload: AXConversationMessagePayload): Promise<AXConversationMessagePayload> {\n if (!isMediaPayloadType(payload.type)) {\n return payload;\n }\n await loadNormalizer(payload.type);\n const normalize = normalizers[payload.type];\n return normalize ? normalize(payload) : payload;\n}\n\n/**\n * Sync normalize — uses cached normalizers when available.\n * Media payloads pass through until a normalizer chunk has loaded (renderers normalize on display).\n */\nexport function normalizeMessagePayload(payload: AXConversationMessagePayload): AXConversationMessagePayload {\n if (!isMediaPayloadType(payload.type)) {\n return payload;\n }\n const normalize = normalizers[payload.type];\n if (normalize) {\n return normalize(payload);\n }\n void loadNormalizer(payload.type);\n return payload;\n}\n","/**\n * Validation Utilities\n * Centralized validation functions for messages and user input\n */\n\nimport type { AXConversationMessagePayload, AXConversationMessageType } from '../models';\nimport type { AXConversationConfig } from '../tokens';\nimport { normalizeMessagePayloadAsync } from '../utils/message-payload-normalize';\n\n/**\n * Validation result interface\n */\nexport interface AXConversationValidationResult {\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 * 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): AXConversationValidationResult {\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 conversation ID\n * @param conversationId - Conversation ID to validate\n * @returns Validation result\n */\nexport function validateConversationId(conversationId: string | undefined): AXConversationValidationResult {\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: AXConversationMessageType | undefined): AXConversationValidationResult {\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\nfunction validateMediaItems(\n items: { url?: string; mediaId?: string }[] | undefined,\n label: string,\n): AXConversationValidationResult {\n if (!Array.isArray(items) || items.length === 0) {\n return {\n valid: false,\n error: `${label} message must include at least one attachment`,\n errorCode: 'INVALID_MEDIA_PAYLOAD',\n };\n }\n for (const item of items) {\n const ok =\n (typeof item.url === 'string' && item.url.length > 0) ||\n (typeof item.mediaId === 'string' && item.mediaId.length > 0);\n if (!ok) {\n return {\n valid: false,\n error: `Each ${label.toLowerCase()} attachment must have a url or mediaId`,\n errorCode: 'INVALID_MEDIA_PAYLOAD',\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 async function validateMessagePayload(\n payload: AXConversationMessagePayload | undefined,\n type: AXConversationMessageType,\n): Promise<AXConversationValidationResult> {\n if (!payload) {\n return {\n valid: false,\n error: 'Message payload is required',\n errorCode: 'MISSING_PAYLOAD',\n };\n }\n\n const normalized =\n type === 'image' || type === 'video' || type === 'audio' || type === 'file'\n ? await normalizeMessagePayloadAsync(payload)\n : payload;\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 return validateMediaItems(\n (normalized as { images?: { url?: string; mediaId?: string }[] }).images,\n 'Image',\n );\n case 'video':\n return validateMediaItems(\n (normalized as { videos?: { url?: string; mediaId?: string }[] }).videos,\n 'Video',\n );\n case 'audio':\n return validateMediaItems(\n (normalized as { audios?: { url?: string; mediaId?: string }[] }).audios,\n 'Audio',\n );\n case 'file':\n return validateMediaItems(\n (normalized as { files?: { url?: string; mediaId?: string }[] }).files,\n 'File',\n );\n case 'voice':\n case 'sticker': {\n const media = payload as { url?: string; mediaId?: string };\n const hasUrl = typeof media.url === 'string' && media.url.length > 0;\n const hasMediaId = typeof media.mediaId === 'string' && media.mediaId.length > 0;\n if (!hasUrl && !hasMediaId) {\n return {\n valid: false,\n error: `${type} message must have a url or mediaId`,\n errorCode: 'INVALID_MEDIA_PAYLOAD',\n };\n }\n break;\n }\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): AXConversationValidationResult {\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): AXConversationValidationResult {\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): AXConversationValidationResult {\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): AXConversationValidationResult {\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 * 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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;')\n .replace(/\\//g, '&#x2F;')\n .replace(/`/g, '&#x60;')\n .replace(/=/g, '&#x3D;');\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): AXConversationValidationResult {\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): AXConversationValidationResult {\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","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXFileService } from '@acorex/core/file';\nimport type { AXConversationMessagePayload, AXConversationMessageType } from '../models';\nimport type { AXConversationUploaderReference } from '../models/conversation-upload.types';\n\ntype AXConversationSendMessageMediaModule = typeof import('../plugins/composer/composer-actions/send-message-media');\n\nlet modulePromise: Promise<AXConversationSendMessageMediaModule> | null = null;\n\nfunction loadSendMessageMedia(): Promise<AXConversationSendMessageMediaModule> {\n modulePromise ??= import('../plugins/composer/composer-actions/send-message-media');\n return modulePromise;\n}\n\nexport async function applyLocalPreview(\n type: AXConversationMessageType,\n payload: AXConversationMessagePayload,\n localUrl: string,\n mimeType = 'application/octet-stream',\n): Promise<AXConversationMessagePayload> {\n const mod = await loadSendMessageMedia();\n return mod.applyLocalPreview(type, payload, localUrl, mimeType);\n}\n\nexport async function createLocalPreviewUrl(\n fileService: AXFileService,\n platformId: object,\n source: File | Blob,\n messageType: AXConversationMessageType,\n): Promise<string | undefined> {\n const mod = await loadSendMessageMedia();\n return mod.createLocalPreviewUrl(fileService, platformId, source, messageType);\n}\n\nexport async function mergeUploadResult(\n type: AXConversationMessageType,\n payload: AXConversationMessagePayload,\n result: AXUploadResult,\n): Promise<AXConversationMessagePayload> {\n const mod = await loadSendMessageMedia();\n return mod.mergeUploadResult(type, payload, result);\n}\n\nexport async function revokeObjectUrl(platformId: object, url: string): Promise<void> {\n const mod = await loadSendMessageMedia();\n mod.revokeObjectUrl(platformId, url);\n}\n\nexport async function toUploaderReference(payload: AXConversationMessagePayload): Promise<AXConversationUploaderReference> {\n const mod = await loadSendMessageMedia();\n return mod.toUploaderReference(payload);\n}\n","/**\n * Per-user preferences for a specific conversation (mute, notifications, etc.).\n * Stored on the user account, keyed by conversation ID — not on the room entity.\n */\n\nexport interface AXConversationRoomPreferences {\n /** Muted until timestamp */\n mutedUntil?: Date;\n\n /** Show notifications for this conversation */\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\nexport const AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES: AXConversationRoomPreferences = {\n notifications: true,\n showPreview: true,\n};\n\n/** Map of conversation ID → user-specific room preferences. */\nexport type AXConversationRoomPreferencesMap = Record<string, AXConversationRoomPreferences>;\n","import type { AXConversationRoomPreferences } from '../models';\nimport { AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES } from '../models/room-preferences.model';\n\nexport function mergeRoomPreferences(\n preferences?: Partial<AXConversationRoomPreferences> | null,\n): AXConversationRoomPreferences {\n return {\n ...AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES,\n ...preferences,\n notifications: preferences?.notifications ?? AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES.notifications,\n showPreview: preferences?.showPreview ?? AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES.showPreview,\n };\n}\n","/**\n * In-memory conversation and message graph (signal-based).\n * Plain class — not DI-registered; instantiated by `AXConversationService`.\n */\n\nimport { computed, signal } from '@angular/core';\nimport type {\n AXConversation,\n AXConversationMessage,\n AXConversationPresenceUpdate,\n AXConversationRoomPreferences,\n AXConversationRoomPreferencesMap,\n AXConversationUserPresence,\n} from '../models';\nimport { AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES } from '../models/room-preferences.model';\nimport { normalizeMessagePayload } from '../utils/message-payload-normalize';\nimport { mergeRoomPreferences } from '../utils/room-preferences.utils';\nimport type { AXConversationConfig } from '../tokens';\n\nfunction withNormalizedPayload(message: AXConversationMessage): AXConversationMessage {\n const timestamp =\n message.timestamp instanceof Date ? message.timestamp : new Date(message.timestamp as string | number);\n return { ...message, timestamp, payload: normalizeMessagePayload(message.payload) };\n}\n\nexport class AXConversationState {\n private readonly _conversations = signal<Map<string, AXConversation>>(new Map());\n private readonly _messages = signal<Map<string, AXConversationMessage>>(new Map());\n private readonly _conversationMessages = signal<Map<string, string[]>>(new Map());\n private readonly _userPresence = signal<Map<string, AXConversationUserPresence>>(new Map());\n private readonly _typingExpiry = signal<Map<string, Map<string, number>>>(new Map());\n private readonly _roomPreferences = signal<Map<string, AXConversationRoomPreferences>>(new Map());\n private readonly _presenceTimeTick = signal(0);\n private readonly _typingRevision = signal(0);\n private readonly _inboxRevision = signal(0);\n\n readonly conversations = computed(() => {\n this._inboxRevision();\n return Array.from(this._conversations().values());\n });\n\n readonly userPresenceMap = computed(() => this._userPresence());\n\n readonly presenceTimeTick = this._presenceTimeTick.asReadonly();\n\n readonly typingRevision = computed(() => {\n this._typingRevision();\n return this._typingExpiry();\n });\n\n private bumpInboxRevision(): void {\n this._inboxRevision.update((revision) => revision + 1);\n }\n\n private bumpTypingRevision(): void {\n this._typingRevision.update((revision) => revision + 1);\n }\n\n constructor(private readonly config: Required<AXConversationConfig>) {}\n\n bumpPresenceTimeTick(): void {\n this._presenceTimeTick.update((tick) => tick + 1);\n }\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 this.bumpInboxRevision();\n }\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 const maxCached = this.config.maxCachedConversations;\n if (newConversations.size > maxCached) {\n const sorted = Array.from(newConversations.values()).sort(\n (a, b) => (b.lastMessageAt?.getTime() ?? 0) - (a.lastMessageAt?.getTime() ?? 0),\n );\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 this.bumpInboxRevision();\n }\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 this.bumpInboxRevision();\n }\n\n getConversation(conversationId: string): AXConversation | undefined {\n return this._conversations().get(conversationId);\n }\n\n updateConversation(conversationId: string, updates: Partial<AXConversation>): void {\n const conversation = this._conversations().get(conversationId);\n if (!conversation) return;\n\n this.setConversation({ ...conversation, ...updates });\n }\n\n deleteConversation(conversationId: string): void {\n this._conversations.update((conversations) => {\n const newConversations = new Map(conversations);\n newConversations.delete(conversationId);\n return newConversations;\n });\n this.bumpInboxRevision();\n\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 this._typingExpiry.update((map) => {\n const next = new Map(map);\n next.delete(conversationId);\n return next;\n });\n this.bumpTypingRevision();\n }\n\n updateLastMessage(message: AXConversationMessage): void {\n this.updateConversation(message.conversationId, {\n lastMessage: message,\n lastMessageAt: message.timestamp,\n updatedAt: message.timestamp,\n });\n }\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 resetUnreadCount(conversationId: string): void {\n this.updateConversation(conversationId, { unreadCount: 0 });\n }\n\n updateTitle(conversationId: string, title: string): void {\n this.updateConversation(conversationId, { title, updatedAt: new Date() });\n }\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 updateUserPresence(update: AXConversationPresenceUpdate): void {\n const lastSeen =\n update.lastSeen instanceof Date\n ? update.lastSeen\n : update.lastSeen\n ? new Date(update.lastSeen as string | number)\n : undefined;\n\n this._userPresence.update((map) => {\n const next = new Map(map);\n next.set(update.userId, {\n userId: update.userId,\n status: update.status,\n lastSeen,\n statusText: update.statusText,\n updatedAt: new Date(),\n });\n return next;\n });\n }\n\n bulkSetUserPresence(updates: AXConversationPresenceUpdate[]): void {\n if (updates.length === 0) return;\n\n this._userPresence.update((map) => {\n const next = new Map(map);\n for (const update of updates) {\n const lastSeen =\n update.lastSeen instanceof Date\n ? update.lastSeen\n : update.lastSeen\n ? new Date(update.lastSeen as string | number)\n : undefined;\n next.set(update.userId, {\n userId: update.userId,\n status: update.status,\n lastSeen,\n statusText: update.statusText,\n updatedAt: new Date(),\n });\n }\n return next;\n });\n }\n\n getUserPresence(userId: string): AXConversationUserPresence | undefined {\n return this._userPresence().get(userId);\n }\n\n setTypingActive(conversationId: string, userId: string, displayDurationMs: number): void {\n const expiresAt = Date.now() + displayDurationMs;\n\n this._typingExpiry.update((map) => {\n const next = new Map(map);\n const room = new Map(next.get(conversationId) ?? []);\n room.set(userId, expiresAt);\n next.set(conversationId, room);\n return next;\n });\n this.bumpTypingRevision();\n }\n\n clearTypingUser(conversationId: string, userId: string): void {\n this._typingExpiry.update((map) => {\n const room = map.get(conversationId);\n if (!room?.has(userId)) {\n return map;\n }\n const next = new Map(map);\n const nextRoom = new Map(room);\n nextRoom.delete(userId);\n if (nextRoom.size === 0) {\n next.delete(conversationId);\n } else {\n next.set(conversationId, nextRoom);\n }\n return next;\n });\n this.bumpTypingRevision();\n }\n\n getActiveTypingUserIds(conversationId: string): string[] {\n const now = Date.now();\n const room = this._typingExpiry().get(conversationId);\n if (!room) return [];\n\n const active: string[] = [];\n for (const [userId, expiresAt] of room) {\n if (expiresAt > now) {\n active.push(userId);\n }\n }\n return active;\n }\n\n isAnyoneTyping(conversationId: string): boolean {\n return this.getActiveTypingUserIds(conversationId).length > 0;\n }\n\n pruneExpiredTyping(): void {\n const now = Date.now();\n let changed = false;\n\n this._typingExpiry.update((map) => {\n const next = new Map<string, Map<string, number>>();\n for (const [conversationId, room] of map) {\n const activeRoom = new Map<string, number>();\n for (const [userId, expiresAt] of room) {\n if (expiresAt > now) {\n activeRoom.set(userId, expiresAt);\n } else {\n changed = true;\n }\n }\n if (activeRoom.size > 0) {\n next.set(conversationId, activeRoom);\n } else if (room.size > 0) {\n changed = true;\n }\n }\n return changed ? next : map;\n });\n\n if (changed) {\n this.bumpTypingRevision();\n }\n }\n\n setRoomPreferencesBulk(preferences: AXConversationRoomPreferencesMap): void {\n this._roomPreferences.update(() => {\n const next = new Map<string, AXConversationRoomPreferences>();\n for (const [conversationId, prefs] of Object.entries(preferences)) {\n next.set(conversationId, mergeRoomPreferences(prefs));\n }\n return next;\n });\n }\n\n getRoomPreferences(conversationId: string): AXConversationRoomPreferences {\n return this._roomPreferences().get(conversationId) ?? { ...AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES };\n }\n\n updateRoomPreferences(conversationId: string, updates: Partial<AXConversationRoomPreferences>): void {\n this._roomPreferences.update((map) => {\n const next = new Map(map);\n const current = next.get(conversationId) ?? { ...AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES };\n next.set(conversationId, mergeRoomPreferences({ ...current, ...updates }));\n return next;\n });\n }\n\n addMessage(message: AXConversationMessage): void {\n const normalized = withNormalizedPayload(message);\n\n this._messages.update((messages) => {\n const newMessages = new Map(messages);\n newMessages.set(normalized.id, normalized);\n return newMessages;\n });\n\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n const existing = newMap.get(normalized.conversationId) || [];\n\n if (existing.includes(normalized.id)) {\n return newMap;\n }\n\n const updated = [...existing, normalized.id].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(normalized.conversationId, updated);\n return newMap;\n });\n }\n\n setConversationMessages(conversationId: string, messages: AXConversationMessage[]): void {\n const sorted = [...messages]\n .map(withNormalizedPayload)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n const sortedIds = sorted.map((m) => m.id);\n\n this._messages.update((msgs) => {\n const newMessages = new Map(msgs);\n const previousIds = this._conversationMessages().get(conversationId) || [];\n for (const id of previousIds) {\n newMessages.delete(id);\n }\n for (const msg of sorted) {\n newMessages.set(msg.id, msg);\n }\n return newMessages;\n });\n\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n newMap.set(conversationId, sortedIds);\n return newMap;\n });\n\n this.cleanupOldMessages();\n }\n\n addMessages(messages: AXConversationMessage[]): void {\n if (messages.length === 0) return;\n\n const normalized = messages.map(withNormalizedPayload);\n\n this._messages.update((msgs) => {\n const newMessages = new Map(msgs);\n normalized.forEach((msg) => newMessages.set(msg.id, msg));\n return newMessages;\n });\n\n const conversationGroups = new Map<string, string[]>();\n normalized.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 existing = newMap.get(conversationId) || [];\n const idSet = new Set(existing);\n const merged = [...existing];\n for (const id of newMsgIds) {\n if (!idSet.has(id)) {\n merged.push(id);\n idSet.add(id);\n }\n }\n\n const sorted = merged.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, sorted);\n }\n\n return newMap;\n });\n\n this.cleanupOldMessages();\n this.cleanupConversationMessages();\n }\n\n getMessage(messageId: string): AXConversationMessage | undefined {\n return this._messages().get(messageId);\n }\n\n getConversationMessages(conversationId: string): AXConversationMessage[] {\n const messageIds = this._conversationMessages().get(conversationId) || [];\n return messageIds.map((id) => this._messages().get(id)).filter((msg): msg is AXConversationMessage => msg !== undefined);\n }\n\n updateMessage(messageId: string, updates: Partial<AXConversationMessage>): void {\n const message = this._messages().get(messageId);\n if (!message) return;\n\n const merged = { ...message, ...updates };\n if (updates.payload) {\n merged.payload = normalizeMessagePayload(merged.payload);\n }\n this.addMessage(merged);\n }\n\n deleteMessage(messageId: string): void {\n const message = this._messages().get(messageId);\n if (!message) return;\n\n this._messages.update((messages) => {\n const newMessages = new Map(messages);\n newMessages.delete(messageId);\n return newMessages;\n });\n\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n const existing = newMap.get(message.conversationId);\n if (existing) {\n newMap.set(\n message.conversationId,\n existing.filter((id) => id !== messageId),\n );\n }\n return newMap;\n });\n }\n\n private cleanupOldMessages(): void {\n const totalMessages = this._messages().size;\n\n if (totalMessages > this.config.maxTotalMessages) {\n const allMessages = Array.from(this._messages().values()).sort(\n (a, b) => b.timestamp.getTime() - a.timestamp.getTime(),\n );\n\n const toKeep = allMessages.slice(0, this.config.maxTotalMessages);\n const toKeepIds = new Set(toKeep.map((m) => m.id));\n\n this._messages.update(() => {\n const newMessages = new Map<string, AXConversationMessage>();\n toKeep.forEach((msg) => newMessages.set(msg.id, msg));\n return newMessages;\n });\n\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 private cleanupConversationMessages(): void {\n const maxMessages = this.config.maxMessagesPerConversation;\n const idsToRemove: string[] = [];\n\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n\n for (const [convId, messageIds] of newMap) {\n if (messageIds.length > maxMessages) {\n idsToRemove.push(...messageIds.slice(0, messageIds.length - maxMessages));\n newMap.set(convId, messageIds.slice(-maxMessages));\n }\n }\n\n return newMap;\n });\n\n if (idsToRemove.length > 0) {\n this._messages.update((messages) => {\n const newMessages = new Map(messages);\n idsToRemove.forEach((id) => newMessages.delete(id));\n return newMessages;\n });\n }\n }\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 { AX_CONVERSATION_ERROR_HANDLER_CONFIG } from '../tokens';\nimport { AXConversationApiError } from './api';\n\n/**\n * Error severity levels\n */\nexport type AXConversationErrorSeverity = '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: AXConversationErrorSeverity;\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 AXConversationErrorHandlerConfig {\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 AXConversationErrorHandlerService {\n private readonly injectedConfig = inject(AX_CONVERSATION_ERROR_HANDLER_CONFIG);\n private readonly _errors$ = new Subject<AXConversationError>();\n private readonly _config: AXConversationErrorHandlerConfig = {\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 this.configure(this.injectedConfig);\n }\n\n /**\n * Configure error handler\n */\n configure(config: Partial<AXConversationErrorHandlerConfig>): 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 this.publish(conversationError);\n return conversationError;\n }\n\n /**\n * Handle API error (same pipeline as {@link handle}, for typed API failures)\n */\n handleApiError(apiError: AXConversationApiError, operation: string, context?: Record<string, unknown>): AXConversationError {\n const conversationError = this.conversationErrorFromApi(apiError, operation, context);\n this.publish(conversationError);\n return conversationError;\n }\n\n private publish(conversationError: AXConversationError): void {\n this._errors$.next(conversationError);\n if (this._config.logToConsole) {\n this.logError(conversationError);\n }\n if (this._config.customHandler) {\n this._config.customHandler(conversationError);\n }\n }\n\n /**\n * Normalize any error to conversation error format (does not publish — use {@link handle})\n */\n private normalizeError(error: unknown, operation: string, context?: Record<string, unknown>): AXConversationError {\n if (this.isApiError(error)) {\n return this.conversationErrorFromApi(error, operation, context);\n }\n\n const errorObj = error as Record<string, unknown>;\n const message =\n (typeof errorObj['message'] === 'string' && errorObj['message']) ||\n (error instanceof Error ? error.message : String(error)) ||\n 'An unknown error occurred';\n const code = (typeof errorObj['code'] === 'string' && errorObj['code']) || 'UNKNOWN_ERROR';\n const statusCodeRaw = errorObj['statusCode'] ?? errorObj['status'];\n const statusCode = typeof statusCodeRaw === 'number' ? statusCodeRaw : undefined;\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 private conversationErrorFromApi(\n apiError: AXConversationApiError,\n operation: string,\n context?: Record<string, unknown>,\n ): AXConversationError {\n return {\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\n private isApiError(error: unknown): error is AXConversationApiError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n 'message' in error &&\n typeof (error as AXConversationApiError).code === 'string' &&\n typeof (error as AXConversationApiError).message === 'string'\n );\n }\n\n /**\n * Determine severity based on status code\n */\n private determineSeverity(statusCode?: number): AXConversationErrorSeverity {\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: AXConversationApiError): 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('Ask 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, reach out to 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, reach out to 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 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","import type { AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, type AXFileTypeRegistryService } from '@acorex/core/file';\nimport { Injectable } from '@angular/core';\nimport {\n AX_CONVERSATION_AUDIO_CATALOG,\n AX_CONVERSATION_FILE_CATALOG,\n AX_CONVERSATION_IMAGE_CATALOG,\n AX_CONVERSATION_VIDEO_CATALOG,\n AX_CONVERSATION_VOICE_CATALOG,\n} from '../../../models/message-file-type-catalog';\n\ntype AXConversationFileCatalogLoader = () => Promise<AXFileType>;\n\nconst AX_CONVERSATION_FILE_CATALOG_LOADERS: Record<string, AXConversationFileCatalogLoader> = {\n [AX_CONVERSATION_IMAGE_CATALOG]: async () => {\n const mod = await import('../components/image-picker/conversation-image.file-type');\n return mod.createConversationImageFileType();\n },\n [AX_CONVERSATION_VIDEO_CATALOG]: async () => {\n const mod = await import('../components/video-picker/conversation-video.file-type');\n return mod.createConversationVideoFileType();\n },\n [AX_CONVERSATION_AUDIO_CATALOG]: async () => {\n const mod = await import('../components/audio-picker/conversation-audio.file-type');\n return mod.createConversationAudioFileType();\n },\n [AX_CONVERSATION_FILE_CATALOG]: async () => {\n const mod = await import('../components/file-picker/conversation-file.file-type');\n return mod.createConversationFileFileType();\n },\n [AX_CONVERSATION_VOICE_CATALOG]: async () => {\n const mod = await import('../components/voice-recorder/conversation-voice.file-type');\n return mod.createConversationVoiceFileType();\n },\n};\n\nasync function loadConversationFileTypes(catalogNames: string[]): Promise<AXFileType[]> {\n const uniqueCatalogs = [...new Set(catalogNames.filter(Boolean))];\n if (!uniqueCatalogs.length) {\n return [];\n }\n\n const types: AXFileType[] = [];\n\n for (const catalogName of uniqueCatalogs) {\n const loader = AX_CONVERSATION_FILE_CATALOG_LOADERS[catalogName];\n if (loader) {\n types.push(await loader());\n }\n }\n\n return types;\n}\n\n/** Ensure a built-in conversation catalog is registered before pre-overlay file selection. */\nexport async function ensureConversationFileCatalogRegistered(\n registry: AXFileTypeRegistryService,\n catalogName: string,\n): Promise<void> {\n if (await registry.get(catalogName)) {\n return;\n }\n\n const loader = AX_CONVERSATION_FILE_CATALOG_LOADERS[catalogName];\n if (!loader) {\n return;\n }\n\n registry.registerTypes([await loader()]);\n}\n\n/** Built-in conversation catalogs (lazy-loaded on first registry resolve). */\nconst AX_CONVERSATION_BUILTIN_FILE_CATALOGS = [\n AX_CONVERSATION_IMAGE_CATALOG,\n AX_CONVERSATION_VIDEO_CATALOG,\n AX_CONVERSATION_AUDIO_CATALOG,\n AX_CONVERSATION_FILE_CATALOG,\n AX_CONVERSATION_VOICE_CATALOG,\n] as const;\n\n/**\n * Lazy-loads conversation file catalogs for the root file-type registry.\n * Must not inject {@link AXConversationComposerActionRegistry} — that registry\n * depends on {@link AXFileTypeRegistryService}, which would create a circular DI cycle.\n */\n@Injectable()\nexport class AXConversationComposerFileTypesProvider extends AXFileTypeInfoProvider {\n async items(): Promise<AXFileType[]> {\n return loadConversationFileTypes([...AX_CONVERSATION_BUILTIN_FILE_CATALOGS]);\n }\n}\n","import { provideFileTypeInfoProvider, provideFileValidationRules } from '@acorex/core/file';\nimport { InjectionToken, type Provider } from '@angular/core';\nimport { AXConversationComposerFileTypesProvider } from './conversation-composer-file-types.provider';\n\n/** Ensures built-in conversation catalogs exist on the root file-type registry. */\nexport const AX_CONVERSATION_FILE_TYPES_READY = new InjectionToken<boolean>('AX_CONVERSATION_FILE_TYPES_READY');\n\n/** Registers validation rules and lazy conversation file-type catalogs for composer actions. */\nexport function provideConversationComposerFileTypes(): Provider[] {\n return [\n provideFileValidationRules(),\n provideFileTypeInfoProvider(AXConversationComposerFileTypesProvider),\n {\n provide: AX_CONVERSATION_FILE_TYPES_READY,\n useValue: true,\n },\n ];\n}\n","import type { Type } from '@angular/core';\nimport type { AXConversationComposerTabFeature } from '../../../../tokens/conversation-features';\nimport type { AXConversationComposerTab } from '../../../../registries/composer-tab.registry';\n\nexport const AX_CONVERSATION_COMPOSER_EMOJI_TAB: AXConversationComposerTab = {\n id: 'emoji',\n title: '@acorex:chat.tabs.emoji',\n icon: 'fa-light fa-face-smile',\n priority: 100,\n componentLoader: () => import('../emoji-tab').then((m) => m.AXConversationEmojiTabComponent as Type<unknown>),\n enabled: true,\n};\n\nexport const AX_CONVERSATION_COMPOSER_STICKER_TAB: AXConversationComposerTab = {\n id: 'sticker',\n title: '@acorex:chat.tabs.stickers',\n icon: 'fa-light fa-note-sticky',\n priority: 90,\n componentLoader: () => import('../sticker-tab').then((m) => m.AXConversationStickerTabComponent as Type<unknown>),\n enabled: true,\n};\n\n/** Built-in composer popup tabs keyed by {@link AXConversationComposerTabFeature}. */\nexport const AX_CONVERSATION_BUILTIN_COMPOSER_TABS: Record<\n AXConversationComposerTabFeature,\n AXConversationComposerTab\n> = {\n emoji: AX_CONVERSATION_COMPOSER_EMOJI_TAB,\n sticker: AX_CONVERSATION_COMPOSER_STICKER_TAB,\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 { AXTranslationService } from '@acorex/core/translation';\nimport { Observable } from 'rxjs';\nimport { AX_CONVERSATION_BUILTIN_COMPOSER_TABS } from '../plugins/composer/components/composer-tabs/composer-tab.builtin';\nimport { AX_CONVERSATION_CONFIG, AX_CONVERSATION_DEFAULT_COMPOSER_TABS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport { resolveConversationComposerTabs } from '../tokens/conversation-features';\nimport type { AXConversationRegistryItem } from './base-registry.abstract';\n\n/**\n * Composer tab registration\n */\nexport interface AXConversationComposerTab extends AXConversationRegistryItem {\n /** Display title */\n title: string;\n\n /** Icon name/class */\n icon?: string;\n\n /** Angular component for tab content */\n component?: Type<unknown>;\n\n /** Lazy loader for tab content */\n componentLoader?: () => Promise<Type<unknown>>;\n\n /** Default data provider (optional) */\n dataProvider?: () => Observable<unknown>;\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 AXConversationComposerTabRegistry {\n private readonly _tabs = signal<AXConversationComposerTab[]>([]);\n private readonly translation = inject(AXTranslationService);\n\n constructor() {\n const conversationConfig = inject(AX_CONVERSATION_CONFIG, { optional: true });\n\n for (const tabId of resolveConversationComposerTabs(conversationConfig?.features)) {\n const builtIn = AX_CONVERSATION_BUILTIN_COMPOSER_TABS[tabId];\n if (builtIn) {\n this.register(builtIn);\n }\n }\n\n inject(AX_CONVERSATION_DEFAULT_COMPOSER_TABS, { optional: true })?.forEach((tab) => this.register(tab));\n\n const registryConfig = inject(AX_CONVERSATION_REGISTRY_CONFIG, { optional: true });\n registryConfig?.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 /** Whether the composer popup has any tabs to show. */\n readonly hasEnabledTabs = computed(() => this.enabledTabs().length > 0);\n\n /**\n * Register a composer tab\n */\n register(tab: AXConversationComposerTab): 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 && !tab.componentLoader) {\n throw new Error('Composer tab must have a component or componentLoader');\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): AXConversationComposerTab | undefined {\n return this._tabs().find((t) => t.id === id);\n }\n\n getTabTitle(tab: AXConversationComposerTab): string {\n return this.translation.translateSync(tab.title);\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 * Composer Action Registry\n * Register custom action buttons for the composer (attach, voice, location, etc.)\n */\n\nimport { AXFileTypeRegistryService, provideFileValidationRules } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n computed,\n inject,\n Injectable,\n Injector,\n Provider,\n runInInjectionContext,\n signal,\n Type,\n type InputSignal,\n} from '@angular/core';\nimport { AXConversationComposerService } from '../components/composer/composer.service';\nimport type { AXConversation } from '../models';\nimport {\n AX_CONVERSATION_FILE_TYPES_READY,\n provideConversationComposerFileTypes,\n} from '../plugins/composer/composer-actions/composer-file-types.plugin';\nimport { ensureConversationFileCatalogRegistered } from '../plugins/composer/composer-actions/conversation-composer-file-types.provider';\nimport { AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport type { AXConversationRegistryItem } from './base-registry.abstract';\nimport { AXConversationComposerTabRegistry } from './composer-tab.registry';\n\n/**\n * Composer context provided to actions\n */\nexport interface AXConversationComposerActionContext {\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 /** Whether a background generation (e.g. AI response) is in progress */\n isGenerating?: boolean;\n\n /** Whether cancel cleanup is in progress */\n isStopping?: boolean;\n\n /** Custom context data */\n custom?: Record<string, unknown>;\n}\n\n/**\n * Contract for components used as {@link AXConversationComposerAction.component}.\n * Composer shell passes at least `{ conversation, service }`.\n */\nexport interface AXConversationComposerActionComponent {\n readonly conversation: InputSignal<AXConversation>;\n readonly service?: InputSignal<AXConversationComposerService | undefined>;\n /** Max files per message; falls back to {@link AXConversationConfig.maxFilesPerMessage}. */\n readonly maxFiles?: InputSignal<number | undefined>;\n /** Pre-fill picker when opened from message-list drag-and-drop. */\n readonly initialFiles?: InputSignal<File[]>;\n /** Set by {@link AXPopupService} when the picker is shown in a popup. */\n readonly __popup__?: InputSignal<import('@acorex/components/popup').AXPopupRef | undefined>;\n /** Set by {@link AXActionSheetService} when the picker is shown in an action sheet. */\n readonly __actionSheet__?: InputSignal<import('@acorex/components/action-sheet').AXActionSheetRef | undefined>;\n /**\n * When true (from action {@link AXConversationComposerAction.autoRun}), runs {@link activate}\n * once after the component is mounted.\n */\n readonly autoRun?: InputSignal<boolean>;\n /** Primary action when opened from the composer (record, browse files, etc.). */\n activate?(): void | Promise<void>;\n /** Cancel in-flight uploads when the picker is closed or replaced. */\n abortInProgressUploads?(): void;\n}\n\n/**\n * Composer action registration\n */\nexport interface AXConversationComposerAction extends Omit<AXConversationRegistryItem, 'enabled'> {\n /** Display label (for accessibility) */\n label: string;\n\n /** Icon name/class */\n icon: string;\n\n /** Position: start or end of the composer */\n position: 'start' | 'end';\n\n /** Location: inline (show as button) or menu (show in attachment popup menu) */\n location?: 'inline' | 'menu';\n\n /**\n * Primary end action (e.g. voice record). Only one action may be default.\n * Renders as the circular send-style button and morphs into send when the draft has content.\n */\n default?: boolean;\n\n /** Visibility condition */\n visible: (context: AXConversationComposerActionContext) => boolean;\n\n /** Enabled condition */\n enabled?: (context: AXConversationComposerActionContext) => 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<AXConversationComposerActionComponent>;\n\n /** Lazy loader for the action component */\n componentLoader?: () => Promise<Type<AXConversationComposerActionComponent>>;\n\n /**\n * Whether this action is toggleable (shows/hides component)\n */\n toggleable?: boolean;\n\n /**\n * When true, runs {@link AXConversationComposerActionComponent.activate} in\n * {@link afterNextRender} after the upload panel is mounted.\n */\n autoRun?: boolean;\n\n /** Action handler (optional if component is provided) */\n handler?: (context: AXConversationComposerActionContext) => 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 /** File catalog for this action's picker; built-ins use {@link provideConversationComposerFileTypes}. */\n fileType?: string;\n\n /** Max files per message; falls back to {@link AXConversationConfig.maxFilesPerMessage}. */\n maxFiles?: number;\n}\n\n/** Validation rules and built-in conversation file types. */\nexport function provideConversationFileCatalog(_extraActions?: readonly AXConversationComposerAction[]): Provider[] {\n return [provideFileValidationRules(), ...provideConversationComposerFileTypes()];\n}\n\n/**\n * Composer Action Registry Service\n */\n@Injectable()\nexport class AXConversationComposerActionRegistry {\n private readonly _actions = signal<AXConversationComposerAction[]>([]);\n private readonly translation = inject(AXTranslationService);\n private readonly injector = inject(Injector);\n private readonly composerTabRegistry = inject(AXConversationComposerTabRegistry);\n\n constructor() {\n inject(AX_CONVERSATION_FILE_TYPES_READY);\n\n // Register default actions from individual token\n inject(AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS, { optional: true })?.forEach((action) => this.register(action));\n\n // Register actions from AX_CONVERSATION_REGISTRY_CONFIG\n const config = inject(AX_CONVERSATION_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 /** Start-side actions sorted by priority */\n readonly startActions = computed(() =>\n [...this._actions()]\n .filter((action) => action.position === 'start')\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n );\n\n /** End-side actions sorted by priority */\n readonly endActions = computed(() =>\n [...this._actions()]\n .filter((action) => action.position === 'end')\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n );\n\n /** Start-side inline actions (location = 'inline' or undefined) */\n readonly startInlineActions = computed(() => this.startActions().filter((action) => action.location !== 'menu'));\n\n /** Start-side menu actions (location = 'menu') — shown in the attachment popup */\n readonly startMenuActions = computed(() => this.startActions().filter((action) => action.location === 'menu'));\n\n /** End-side inline actions inside the input pill (excludes default action) */\n readonly endInlineActions = computed(() =>\n this.endActions().filter((action) => action.location !== 'menu' && !action.default),\n );\n\n /** End-side menu actions (location = 'menu') */\n readonly endMenuActions = computed(() => this.endActions().filter((action) => action.location === 'menu'));\n\n /** The single default end action (voice/send morph button) */\n readonly defaultAction = computed(() => this.endActions().find((action) => action.default));\n\n /**\n * Register a composer action\n */\n register(action: AXConversationComposerAction): 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 && !action.componentLoader) {\n throw new Error('Composer action must have either a handler, a component, or a componentLoader');\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 // Only one action may be default\n if (action.default) {\n this._actions.update((actions) =>\n actions.map((a) => (a.default && a.id !== action.id ? { ...a, default: undefined } : a)),\n );\n }\n\n // Add to registry\n this._actions.update((actions) => [...actions, action]);\n\n if (action.fileType) {\n this.fileTypeRegistry().invalidateCache();\n void this.ensureFileTypeExists(action.fileType);\n }\n }\n\n /** Resolved lazily to avoid a DI cycle with {@link AXConversationComposerFileTypesProvider}. */\n private fileTypeRegistry(): AXFileTypeRegistryService {\n return this.injector.get(AXFileTypeRegistryService);\n }\n\n private async ensureFileTypeExists(fileType: string): Promise<void> {\n const registry = this.fileTypeRegistry();\n await ensureConversationFileCatalogRegistered(registry, fileType);\n const match = await registry.get(fileType);\n if (!match) {\n console.warn(\n `[AXConversationComposerActionRegistry] Unknown fileType \"${fileType}\". ` +\n 'Register its AXFileTypeInfoProvider in app providers before using this action.',\n );\n }\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(\n position: 'start' | 'end',\n context: AXConversationComposerActionContext,\n ): AXConversationComposerAction[] {\n const actions = position === 'start' ? this.startActions() : this.endActions();\n const hasComposerTabs = this.composerTabRegistry.hasEnabledTabs();\n return actions.filter((action) => {\n if (action.id === 'emoji' && !hasComposerTabs) {\n return false;\n }\n return runInInjectionContext(this.injector, () => action.visible(context));\n });\n }\n\n /**\n * Get enabled actions for a position\n */\n getEnabledActions(\n position: 'start' | 'end',\n context: AXConversationComposerActionContext,\n ): AXConversationComposerAction[] {\n return this.getVisibleActions(position, context).filter(\n (action) => runInInjectionContext(this.injector, () => action.enabled?.(context)) !== false,\n );\n }\n\n isActionEnabled(action: AXConversationComposerAction, context: AXConversationComposerActionContext): boolean {\n return runInInjectionContext(this.injector, () => action.enabled?.(context)) !== false;\n }\n\n /**\n * Picker actions for a file catalog (by priority), when visible and enabled.\n */\n findPickerActionsForFileType(\n catalogName: string,\n context: AXConversationComposerActionContext,\n ): AXConversationComposerAction[] {\n return [...this._actions()]\n .filter((action) => action.component || action.componentLoader)\n .filter((action) => action.fileType === catalogName)\n .filter((action) => runInInjectionContext(this.injector, () => action.visible(context)))\n .filter((action) => this.isActionEnabled(action, context))\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n }\n\n /**\n * First picker action for a file catalog (by priority), when visible and enabled.\n */\n findPickerActionForFileType(\n catalogName: string,\n context: AXConversationComposerActionContext,\n ): AXConversationComposerAction | undefined {\n return this.findPickerActionsForFileType(catalogName, context)[0];\n }\n\n /**\n * Get action by ID\n */\n getActionById(id: string): AXConversationComposerAction | undefined {\n return this._actions().find((a) => a.id === id);\n }\n\n getActionLabel(action: AXConversationComposerAction): string {\n return this.translation.translateSync(action.label);\n }\n\n getActionTooltip(action: AXConversationComposerAction): string | undefined {\n if (!action.tooltip) return undefined;\n return this.translation.translateSync(action.tooltip);\n }\n\n /**\n * Execute an action\n */\n async executeAction(actionId: string, context: AXConversationComposerActionContext): Promise<void> {\n const action = this.getActionById(actionId);\n if (!action) {\n throw new Error(`Action \"${actionId}\" not found`);\n }\n\n if (!runInInjectionContext(this.injector, () => action.visible(context))) {\n throw new Error(`Action \"${actionId}\" is not visible`);\n }\n if (action.enabled && !runInInjectionContext(this.injector, () => action.enabled?.(context))) {\n throw new Error(`Action \"${actionId}\" is not enabled`);\n }\n\n if (action.handler) {\n await runInInjectionContext(this.injector, () => action.handler?.(context));\n }\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 * 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 AXConversationRegistryItem {\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 AXConversationBaseRegistry<T extends AXConversationRegistryItem> {\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, Injector, runInInjectionContext } from '@angular/core';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport type { AXConversation } from '../models';\nimport { AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport { AXConversationBaseRegistry, AXConversationRegistryItem } from './base-registry.abstract';\n\n/**\n * Context provided to action handlers\n */\nexport interface AXConversationItemActionContext {\n /** The conversation */\n conversation: AXConversation;\n\n /** Additional context data */\n data?: Record<string, unknown>;\n}\n\n/**\n * Conversation item action configuration\n */\nexport interface AXConversationItemAction extends AXConversationRegistryItem {\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 AXConversationRegistryItem 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 AXConversationBaseRegistry<AXConversationItemAction> {\n private readonly translation = inject(AXTranslationService);\n private readonly injector = inject(Injector);\n\n constructor() {\n super();\n\n // Register default actions from individual token\n inject(AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS, { optional: true })?.forEach((action) => this.register(action));\n\n // Register actions from AX_CONVERSATION_REGISTRY_CONFIG\n const config = inject(AX_CONVERSATION_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 && !runInInjectionContext(this.injector, () => action.visible?.(context))) {\n return false;\n }\n return true;\n })\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n }\n\n isActionEnabled(action: AXConversationItemAction, context: AXConversationItemActionContext): boolean {\n if (action.enabled === false) {\n return false;\n }\n if (action.enabledWhen) {\n return runInInjectionContext(this.injector, () => action.enabledWhen?.(context)) !== false;\n }\n return true;\n }\n\n /**\n * Get label for an action\n */\n getActionLabel(action: AXConversationItemAction, conversation: AXConversation): string {\n if (typeof action.label === 'function') {\n const labelFactory = action.label;\n return this.translation.translateSync(\n runInInjectionContext(this.injector, () => labelFactory({ conversation })),\n );\n }\n return this.translation.translateSync(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 const iconFactory = action.icon;\n return runInInjectionContext(this.injector, () => iconFactory({ 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 const tooltipFactory = action.tooltip;\n return this.translation.translateSync(\n runInInjectionContext(this.injector, () => tooltipFactory({ conversation })),\n );\n }\n return this.translation.translateSync(action.tooltip);\n }\n\n async executeAction(actionId: string, context: AXConversationItemActionContext): Promise<void> {\n const action = this.getById(actionId);\n if (!action) {\n throw new Error(`Action \"${actionId}\" not found`);\n }\n if (!this.isActionEnabled(action, context)) {\n throw new Error(`Action \"${actionId}\" is not enabled`);\n }\n if (action.handler) {\n await runInInjectionContext(this.injector, () => action.handler?.(context));\n }\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 { AXTranslationService } from '@acorex/core/translation';\nimport type { AXConversation } from '../models';\nimport { AX_CONVERSATION_DEFAULT_CONVERSATION_TABS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport type { AXConversationRegistryItem } from './base-registry.abstract';\n\n/**\n * Conversation tab registration\n */\nexport interface AXConversationTab extends AXConversationRegistryItem {\n /** Display label */\n label: string;\n\n /** Icon name/class */\n icon?: string;\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 /** 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 private readonly translation = inject(AXTranslationService);\n\n constructor() {\n // Register default tabs from individual token\n inject(AX_CONVERSATION_DEFAULT_CONVERSATION_TABS, { optional: true })?.forEach((tab) => this.register(tab));\n\n // Register tabs from AX_CONVERSATION_REGISTRY_CONFIG\n const config = inject(AX_CONVERSATION_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 getTabLabel(tab: AXConversationTab): string {\n return this.translation.translateSync(tab.label);\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, Injector, runInInjectionContext, type InputSignal } from '@angular/core';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXConversationInfoBarService } from '../components/info-bar/info-bar.service';\nimport type { AXConversation } from '../models';\nimport { AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport { AXConversationBaseRegistry, AXConversationRegistryItem } from './base-registry.abstract';\n\n/**\n * Context provided to action handlers\n */\nexport interface AXConversationInfoBarActionContext {\n /** The conversation */\n conversation: AXConversation;\n\n /** Additional context data */\n data?: Record<string, unknown>;\n}\n\n/**\n * Contract for components used as {@link AXConversationInfoBarAction.component}.\n * Info-bar shell passes at least `{ conversation, service }`.\n */\nexport interface AXConversationInfoBarActionComponent {\n readonly conversation: InputSignal<AXConversation>;\n readonly service?: InputSignal<AXConversationInfoBarService | undefined>;\n}\n\n/**\n * Info bar action configuration\n */\nexport interface AXConversationInfoBarAction extends AXConversationRegistryItem {\n /** Action label */\n label: string | ((context: AXConversationInfoBarActionContext) => string);\n\n /** Action icon (emoji or icon class) */\n icon?: string | ((context: AXConversationInfoBarActionContext) => string);\n\n /** Tooltip text */\n tooltip?: string | ((context: AXConversationInfoBarActionContext) => 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' | ((context: AXConversationInfoBarActionContext) => '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<AXConversationInfoBarActionComponent>;\n\n /** Lazy loader for the inline/full-width action component */\n componentLoader?: () => Promise<Type<AXConversationInfoBarActionComponent>>;\n\n /**\n * Whether this action is toggleable (shows/hides component)\n */\n toggleable?: boolean;\n\n /**\n * Whether action component should take full width of the info-bar.\n * Defaults to `true` when omitted.\n */\n fullWidthComponent?: boolean;\n\n /**\n * Visibility condition\n * @returns true if action should be visible\n */\n visible?: (context: AXConversationInfoBarActionContext) => boolean;\n\n /**\n * Dynamic enabled condition\n * @returns true if action should be enabled\n * Note: Use the `enabled` property from AXConversationRegistryItem for static enable/disable\n */\n enabledWhen?: (context: AXConversationInfoBarActionContext) => boolean;\n\n /**\n * Action handler\n * Called when the action is clicked\n */\n handler?: (context: AXConversationInfoBarActionContext) => 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 AXConversationInfoBarActionRegistry extends AXConversationBaseRegistry<AXConversationInfoBarAction> {\n private readonly translation = inject(AXTranslationService);\n private readonly injector = inject(Injector);\n\n constructor() {\n super();\n\n // Register default actions from individual token\n inject(AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS, { optional: true })?.forEach((action) => this.register(action));\n\n // Register actions from AX_CONVERSATION_REGISTRY_CONFIG\n const config = inject(AX_CONVERSATION_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'): AXConversationInfoBarAction[] {\n const context: AXConversationInfoBarActionContext = { conversation };\n\n return this.enabledItems()\n .filter((action) => {\n // Filter by location if specified\n if (location) {\n const actionLocation = this.getActionLocation(action, conversation);\n if (actionLocation && actionLocation !== location) {\n return false;\n }\n }\n // Filter by visibility\n if (action.visible && !runInInjectionContext(this.injector, () => 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 * Resolve the display location for an action (supports dynamic location factories).\n */\n getActionLocation(\n action: AXConversationInfoBarAction,\n conversation: AXConversation,\n ): 'inline' | 'menu' | undefined {\n if (!action.location) {\n return undefined;\n }\n\n if (typeof action.location === 'function') {\n const locationFactory = action.location;\n return runInInjectionContext(this.injector, () => locationFactory({ conversation }));\n }\n\n return action.location;\n }\n\n /**\n * Get inline actions (toolbar buttons)\n */\n getInlineActions(conversation: AXConversation): AXConversationInfoBarAction[] {\n return this.getActionsForConversation(conversation, 'inline');\n }\n\n /**\n * Get menu actions (dropdown items)\n */\n getMenuActions(conversation: AXConversation): AXConversationInfoBarAction[] {\n return this.getActionsForConversation(conversation, 'menu');\n }\n\n isActionEnabled(action: AXConversationInfoBarAction, context: AXConversationInfoBarActionContext): boolean {\n if (action.enabled === false) {\n return false;\n }\n if (action.enabledWhen) {\n return runInInjectionContext(this.injector, () => action.enabledWhen?.(context)) !== false;\n }\n return true;\n }\n\n /**\n * Get label for an action\n */\n getActionLabel(action: AXConversationInfoBarAction, conversation: AXConversation): string {\n if (typeof action.label === 'function') {\n const labelFactory = action.label;\n return this.translation.translateSync(\n runInInjectionContext(this.injector, () => labelFactory({ conversation })),\n );\n }\n return this.translation.translateSync(action.label);\n }\n\n /**\n * Get icon for an action\n */\n getActionIcon(action: AXConversationInfoBarAction, conversation: AXConversation): string | undefined {\n if (!action.icon) return undefined;\n\n if (typeof action.icon === 'function') {\n const iconFactory = action.icon;\n return runInInjectionContext(this.injector, () => iconFactory({ conversation }));\n }\n return action.icon;\n }\n\n /**\n * Get tooltip for an action\n */\n getActionTooltip(action: AXConversationInfoBarAction, conversation: AXConversation): string | undefined {\n if (!action.tooltip) return undefined;\n\n if (typeof action.tooltip === 'function') {\n const tooltipFactory = action.tooltip;\n return this.translation.translateSync(\n runInInjectionContext(this.injector, () => tooltipFactory({ conversation })),\n );\n }\n return this.translation.translateSync(action.tooltip);\n }\n}\n","/**\n * Message Action Registry\n * Register custom actions that can be performed on messages\n */\n\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { computed, inject, Injectable, Injector, runInInjectionContext, signal } from '@angular/core';\nimport { AXConversationMessage, AXConversationParticipant } from '../models';\nimport { AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens/registry-config.tokens';\nimport type { AXConversationRegistryItem } from './base-registry.abstract';\nimport { AXConversationMessageRendererComponent } from './message-renderer.registry';\n\n/**\n * Action context provided to handlers\n */\nexport interface AXConversationMessageActionContext {\n /** The message */\n message: AXConversationMessage;\n\n /** Current user */\n currentUser: AXConversationParticipant;\n\n /** All conversation participants */\n participants: AXConversationParticipant[];\n\n /** Mounted message renderer for this row (see {@link AXConversationMessageRendererComponent.copy}). */\n renderer?: AXConversationMessageRendererComponent;\n\n /** Custom context data */\n custom?: Record<string, unknown>;\n}\n\n/**\n * Message action registration\n */\nexport interface AXConversationMessageAction extends Omit<AXConversationRegistryItem, 'enabled'> {\n /** Display label */\n label: string;\n\n /** Icon name/class */\n icon?: string;\n\n /** Show as inline button */\n showInline?: boolean;\n\n /** Visibility condition */\n visible: (message: AXConversationMessage, currentUser: AXConversationParticipant) => boolean;\n\n /** Enabled condition */\n enabled: (message: AXConversationMessage, currentUser: AXConversationParticipant) => boolean;\n\n /** Action handler */\n handler: (context: AXConversationMessageActionContext) => 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 AXConversationMessageActionRegistry {\n private readonly _actions = signal<AXConversationMessageAction[]>([]);\n private readonly translation = inject(AXTranslationService);\n private readonly injector = inject(Injector);\n\n constructor() {\n // Register default actions from individual token\n const defaultActions = inject(AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS, { optional: true });\n if (defaultActions) {\n defaultActions.forEach((action) => this.register(action));\n }\n\n // Register actions from AX_CONVERSATION_REGISTRY_CONFIG\n const config = inject(AX_CONVERSATION_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: AXConversationMessageAction): 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: AXConversationMessage, currentUser: AXConversationParticipant): AXConversationMessageAction[] {\n return this.sortedActions().filter(\n (action) =>\n runInInjectionContext(this.injector, () => action.visible(message, currentUser)) &&\n runInInjectionContext(this.injector, () => action.enabled(message, currentUser)),\n );\n }\n\n /**\n * Get menu actions for a message\n */\n getMenuActions(message: AXConversationMessage, currentUser: AXConversationParticipant): AXConversationMessageAction[] {\n return this.getActions(message, currentUser);\n }\n\n /** Whether an action is enabled (safe to call outside an injection context). */\n isActionEnabled(action: AXConversationMessageAction, message: AXConversationMessage, currentUser: AXConversationParticipant): boolean {\n return runInInjectionContext(this.injector, () => action.enabled(message, currentUser));\n }\n\n getActionLabel(action: AXConversationMessageAction): string {\n return this.translation.translateSync(action.label);\n }\n\n /**\n * Get inline actions for a message\n */\n getInlineActions(message: AXConversationMessage, currentUser: AXConversationParticipant): AXConversationMessageAction[] {\n return this.getActions(message, currentUser).filter((action) => action.showInline === true);\n }\n\n /**\n * Get action by ID\n */\n getActionById(id: string): AXConversationMessageAction | undefined {\n return this._actions().find((a) => a.id === id);\n }\n\n /**\n * Execute an action\n */\n async executeAction(actionId: string, context: AXConversationMessageActionContext): 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 (!runInInjectionContext(this.injector, () => action.enabled(context.message, context.currentUser))) {\n throw new Error(`Action \"${actionId}\" is not enabled`);\n }\n\n // Execute handler\n await runInInjectionContext(this.injector, () => action.handler(context));\n }\n\n /**\n * Clear all actions\n */\n clear(): void {\n this._actions.set([]);\n }\n}\n","/**\n * Message Renderer Registry\n * Register custom message renderers for different message types\n */\n\nimport { computed, inject, Injectable, signal, type InputSignal, type Signal, Type } from '@angular/core';\nimport type { AXConversationMessage, AXConversationMessageStatus } from '../models';\nimport type { AXConversationMessageChrome } from '../utils/message-chrome';\nimport { AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport { AXConversationComposerActionRegistry, type AXConversationComposerAction } from './composer-action.registry';\n\nexport type { AXConversationMessageChrome };\n\n/**\n * Message renderer capabilities\n */\nexport interface AXConversationMessageRendererCapabilities {\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 * Remote or binary content lifecycle inside a message renderer (image load, audio decode, etc.).\n * Use `none` when the renderer has no separate load phase (text, file row, etc.).\n */\nexport type AXConversationMessageRendererContentState = 'none' | 'loading' | 'ready' | 'error';\n\n/**\n * Combined state for a chat message renderer: delivery pipeline plus optional content load.\n */\nexport interface AXConversationMessageRendererState {\n /** Mirrors `message.status` (sending, sent, delivered, read, failed). */\n deliveryStatus: AXConversationMessageStatus;\n /** Media / rich content load; set to `error` from `(error)` handlers on img, audio, video, etc. */\n contentState: AXConversationMessageRendererContentState;\n}\n\n/**\n * Contract for components used as {@link AXConversationMessageRenderer.component}.\n * The message list passes `{ message }`; each view exposes `rendererState` for templates and tooling.\n */\nexport interface AXConversationMessageRendererComponent {\n readonly message: InputSignal<AXConversationMessage>;\n readonly rendererState: Signal<AXConversationMessageRendererState>;\n /** Plain-text copy for this message (does not write to the clipboard). */\n copy?(): string | Promise<string>;\n}\n\n/**\n * Contract for components used as {@link AXConversationMessageRenderer.infoBarBanner}.\n * Conversation shell passes at least `{ message }`; renderers can pass additional inputs.\n */\nexport interface AXConversationMessageInfoBarBannerComponent {\n readonly message: InputSignal<AXConversationMessage>;\n}\n\n/**\n * Message renderer registration\n */\nexport interface AXConversationMessageRenderer {\n /** Unique type identifier */\n type: string;\n\n /** Angular component to render this message type */\n component?: Type<AXConversationMessageRendererComponent>;\n\n /** Lazy loader for the renderer component */\n componentLoader?: () => Promise<Type<AXConversationMessageRendererComponent>>;\n\n /**\n * Optional component rendered as a dismissible banner under info-bar.\n * Useful for active/interactive message states (e.g. voice playback progress).\n */\n infoBarBanner?: Type<AXConversationMessageInfoBarBannerComponent>;\n\n /** Lazy loader for the info-bar banner component */\n infoBarBannerLoader?: () => Promise<Type<AXConversationMessageInfoBarBannerComponent>>;\n\n /** Function to determine if this renderer can handle a message */\n canHandle: (message: AXConversationMessage) => boolean;\n\n /** Renderer capabilities */\n capabilities: AXConversationMessageRendererCapabilities;\n\n /**\n * List chrome for this message type.\n * `plain` removes bubble fill, padding, shadow, and tail. Default is `bubble`.\n * Pass a function when chrome depends on payload (e.g. jumbo emoji text).\n */\n chrome?: AXConversationMessageChrome | ((message: AXConversationMessage) => AXConversationMessageChrome);\n\n /** Display name */\n displayName?: string;\n\n /** Icon name/class */\n icon?: string;\n\n /** Linked file type catalog name (for utility APIs like preview/duration). */\n fileType?: string;\n\n /**\n * Optional composer actions co-located with this message type (e.g. pickers that produce this message).\n * Registered with {@link AXConversationComposerActionRegistry} when the renderer is registered.\n * Use `AXConversationRegistryConfiguration.composerActions` for actions not tied to a single message renderer.\n */\n composerActions?: AXConversationComposerAction[];\n}\n\n/**\n * Message Renderer Registry Service\n */\n@Injectable()\nexport class AXConversationMessageRendererRegistry {\n private readonly _renderers = signal<AXConversationMessageRenderer[]>([]);\n private readonly _composerActions = inject(AXConversationComposerActionRegistry);\n\n constructor() {\n void this.registerBuiltInRenderers();\n\n // Register additional renderers from token (optional)\n const defaultRenderers = inject(AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS, { optional: true });\n defaultRenderers?.forEach((renderer) => this.register(renderer));\n\n // Register renderers from AX_CONVERSATION_REGISTRY_CONFIG (optional)\n const config = inject(AX_CONVERSATION_REGISTRY_CONFIG, { optional: true });\n config?.messageRenderers?.forEach((renderer) => this.register(renderer));\n }\n\n private async registerBuiltInRenderers(): Promise<void> {\n const [text, system, fallback] = await Promise.all([\n import('../plugins/message-list/message-renderers/text-renderer.plugin'),\n import('../plugins/message-list/message-renderers/system-renderer.plugin'),\n import('../plugins/message-list/message-renderers/fallback-renderer.plugin'),\n ]);\n this.registerBuiltInRendererIfMissing(text.AX_CONVERSATION_TEXT_RENDERER);\n this.registerBuiltInRendererIfMissing(system.AX_CONVERSATION_SYSTEM_RENDERER);\n this.registerBuiltInRendererIfMissing(fallback.AX_CONVERSATION_FALLBACK_RENDERER);\n }\n\n private registerBuiltInRendererIfMissing(renderer: AXConversationMessageRenderer): void {\n if (this._renderers().some((existing) => existing.type === renderer.type)) {\n return;\n }\n 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 /** O(1) lookup by message type. Rebuilt when the registry changes. */\n private readonly rendererByType = computed(() => {\n const map = new Map<string, AXConversationMessageRenderer>();\n for (const renderer of this._renderers()) {\n map.set(renderer.type, renderer);\n }\n return map;\n });\n\n private readonly missingRendererTypesWarned = new Set<string>();\n\n /**\n * Register a message renderer\n */\n register(renderer: AXConversationMessageRenderer): void {\n // Validate renderer\n if (!renderer.type) {\n throw new Error('Message renderer must have a type');\n }\n if (!renderer.component && !renderer.componentLoader) {\n throw new Error('Message renderer must have a component or componentLoader');\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 renderer.composerActions?.forEach((action) => this._composerActions.register(action));\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 (exact type match).\n * Missing types are warned once; callers should fall back to the `fallback` renderer.\n */\n getRenderer(message: AXConversationMessage): AXConversationMessageRenderer | undefined {\n const renderer = this.rendererByType().get(message.type);\n if (!renderer) {\n this.warnMissingRenderer(message.type);\n }\n return renderer;\n }\n\n /**\n * Get renderer by type\n */\n getRendererByType(type: string): AXConversationMessageRenderer | undefined {\n return this.rendererByType().get(type);\n }\n\n private warnMissingRenderer(type: string): void {\n if (!type || type === 'fallback' || this.missingRendererTypesWarned.has(type)) {\n return;\n }\n this.missingRendererTypesWarned.add(type);\n console.warn(`No renderer found for message type: ${type}. Using fallback.`);\n }\n\n /**\n * Check if a message type is supported\n */\n isSupported(message: AXConversationMessage): 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","/** Unified access to conversation registries (renderers, actions, tabs). */\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXConversationComposerActionRegistry } from '../registries/composer-action.registry';\nimport { AXConversationComposerTabRegistry } from '../registries/composer-tab.registry';\nimport { AXConversationItemActionRegistry } from '../registries/conversation-item-action.registry';\nimport { AXConversationTabRegistry } from '../registries/conversation-tab.registry';\nimport { AXConversationInfoBarActionRegistry } from '../registries/info-bar-action.registry';\nimport { AXConversationMessageActionRegistry } from '../registries/message-action.registry';\nimport { AXConversationMessageRendererRegistry } 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 AXConversationRegistryService {\n /** Message renderer registry */\n readonly messageRenderers = inject(AXConversationMessageRendererRegistry);\n\n /** Message action registry */\n readonly messageActions = inject(AXConversationMessageActionRegistry);\n\n /** Composer tab registry */\n readonly composerTabs = inject(AXConversationComposerTabRegistry);\n\n /** Composer action registry */\n readonly composerActions = inject(AXConversationComposerActionRegistry);\n\n /** Conversation tab registry */\n readonly conversationTabs = inject(AXConversationTabRegistry);\n\n /** Info bar action registry */\n readonly infoBarActions = inject(AXConversationInfoBarActionRegistry);\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 { AXUploaderService } from '@acorex/cdk/uploader';\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXFileService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { computed, DestroyRef, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\nimport { catchError, EMPTY, Subject, takeUntil } from 'rxjs';\nimport type {\n AXConversation,\n AXConversationMessage,\n AXConversationMessagePayload,\n AXConversationMetadata,\n AXConversationPresenceUpdate,\n AXConversationRoomPreferences,\n AXConversationSendMessageCommand,\n AXConversationType,\n AXConversationTypingIndicator,\n AXConversationUser,\n AXConversationUserPresence,\n} from '../models';\nimport type {\n AXConversationSendMessageOptions,\n AXConversationUploaderReference,\n AXConversationUploaderResult,\n AXConversationUploadOptions,\n} from '../models/conversation-upload.types';\nimport { resolveConversationMessageFileType } from '../models/message-file-type-catalog';\nimport { AX_CONVERSATION_CONFIG } from '../tokens';\nimport { resolveConversationPeerUserId } from '../utils/avatar-context.utils';\nimport {\n AX_CONVERSATION_DEFAULT_GROUP_ICON,\n findExistingPrivateConversation,\n resolveConversationForViewer,\n resolvePrivatePeerParticipant,\n} from '../utils/conversation-display.utils';\nimport {\n isConversationRoomCreator,\n isGroupLikeConversation,\n isMessageVisibleAfterHistoryCutoff,\n} from '../utils/conversation-membership.utils';\nimport { normalizeMessagePayloadAsync } from '../utils/message-payload-normalize';\nimport {\n validateConversationId,\n validateMessagePayload,\n validateMessageText,\n validateMessageType,\n} from '../utils/validation.utils';\nimport {\n AXConversationApi,\n AXConversationApiLoggerService,\n AXConversationMessageApi,\n AXConversationRealtimeApi,\n AXConversationUpdateData,\n AXConversationUserApi,\n AXConversationUserSearchFilters,\n type AXConversationApiName,\n} from './api';\nimport type {\n AXConversationPaginatedResult,\n AXConversationPagination,\n AXConversationPaginationState,\n AXConversationPresenceStatus,\n} from './api/api-types';\nimport { AXConversationComposerGenerationStateService } from './composer-generation-state.service';\nimport {\n applyLocalPreview,\n createLocalPreviewUrl,\n mergeUploadResult,\n revokeObjectUrl,\n} from './conversation-media-send.loader';\nimport { AXConversationState } from './conversation-state';\nimport { AXConversationErrorHandlerService } from './error-handler.service';\nimport { AXConversationRegistryService } from './registry.service';\n\n/** Result of loading a message page (newest-first APIs, merged ascending in the store). */\nexport interface AXConversationLoadMessagesResult {\n items: AXConversationMessage[];\n hasMore: boolean;\n page: number;\n nextCursor?: string;\n}\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 static normalizeOptionalString(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n }\n\n private readonly config = inject(AX_CONVERSATION_CONFIG);\n private readonly state = new AXConversationState(this.config);\n\n // New separated APIs\n readonly userApi = inject(AXConversationUserApi);\n readonly conversationApi = inject(AXConversationApi);\n readonly messageApi = inject(AXConversationMessageApi);\n readonly realtimeApi = inject(AXConversationRealtimeApi, { optional: true });\n readonly uploader = inject(AXUploaderService);\n private readonly fileService = inject(AXFileService);\n private readonly platformId = inject(PLATFORM_ID);\n\n private readonly errorHandler = inject(AXConversationErrorHandlerService);\n private readonly apiLogger = inject(AXConversationApiLoggerService);\n readonly dialogService = inject(AXDialogService);\n readonly popupService = inject(AXPopupService);\n private readonly translation = inject(AXTranslationService);\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(AXConversationRegistryService);\n\n private readonly composerGenerationState = inject(AXConversationComposerGenerationStateService);\n\n /** Whether the composer primary button is in cancel (generation) mode. */\n readonly isGenerating = this.composerGenerationState.isGenerating;\n\n /** Whether cancel cleanup is in progress. */\n readonly isStopping = this.composerGenerationState.isStopping;\n\n /** Emits when the user cancels an in-progress generation from the composer. */\n readonly onGenerationCancelled = this.composerGenerationState.onCancelled;\n\n // State signals\n private readonly _activeConversationId = signal<string | null>(null);\n private readonly _loading = signal<boolean>(false);\n private readonly _loadingActiveMessages = signal<boolean>(false);\n private readonly _isForwardingMessage = signal<boolean>(false);\n private readonly _error = signal<Error | null>(null);\n\n private readonly _conversationsPagination = signal<AXConversationPaginationState>({ page: 0, hasMore: true });\n private readonly _messagesPaginationByConversation = signal<Map<string, AXConversationPaginationState>>(new Map());\n\n // Event subjects\n private readonly _messageReceived$ = new Subject<AXConversationMessage>();\n private readonly _messageUpdated$ = new Subject<AXConversationMessage>();\n private readonly _messageDeleted$ = new Subject<string>();\n private readonly _typingIndicator$ = new Subject<AXConversationTypingIndicator>();\n private readonly _presenceUpdate$ = new Subject<AXConversationPresenceUpdate>();\n\n /** All conversations (viewer-scoped display titles for private 1v1 chats) */\n readonly conversations = computed(() => {\n const currentUserId = this._currentUser()?.id;\n return this.state.conversations().map((conversation) => resolveConversationForViewer(conversation, currentUserId));\n });\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 if (!id) {\n return null;\n }\n const conversation = this.state.getConversation(id);\n return conversation ? resolveConversationForViewer(conversation, this._currentUser()?.id) : null;\n });\n\n /** Messages for active conversation */\n readonly activeMessages = computed(() => {\n const convId = this._activeConversationId();\n return convId ? this.state.getConversationMessages(convId) : [];\n });\n\n /** Loading state (conversation list initial load) */\n readonly loading = this._loading.asReadonly();\n\n /** Loading state for the active conversation's message history */\n readonly loadingActiveMessages = this._loadingActiveMessages.asReadonly();\n\n /** Whether a message forward operation is in progress. */\n readonly isForwardingMessage = this._isForwardingMessage.asReadonly();\n\n /** Sidebar conversation list pagination */\n readonly conversationsPagination = this._conversationsPagination.asReadonly();\n\n /** Active conversation message pagination */\n readonly activeMessagesPagination = computed((): AXConversationPaginationState => {\n const convId = this._activeConversationId();\n if (!convId) {\n return { page: 0, hasMore: true };\n }\n return this._messagesPaginationByConversation().get(convId) ?? { page: 0, hasMore: true };\n });\n\n /** Error state */\n readonly error = this._error.asReadonly();\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\n // Current user cache\n private _currentUser = signal<AXConversationUser | null>(null);\n readonly currentUser = this._currentUser.asReadonly();\n\n readonly userPresenceMap = computed(() => this.state.userPresenceMap());\n\n readonly presenceTimeTick = computed(() => {\n this.state.presenceTimeTick();\n return this.state.userPresenceMap();\n });\n\n readonly typingRevision = computed(() => this.state.typingRevision());\n\n /** One-time async initialization (connect, user, conversations, realtime). */\n private initPromise: Promise<void> | null = null;\n\n /** Generation counter — stale page-0 loads are ignored after conversation switches. */\n private messageLoadGeneration = 0;\n\n /** Bumps when a conversation is created while a list load is in flight. */\n private conversationListLoadGeneration = 0;\n\n /** Batched read-receipt queue keyed by conversation ID. */\n private readonly readQueue = new Map<string, Set<string>>();\n private readFlushHandle: ReturnType<typeof setTimeout> | undefined;\n\n private presenceTickHandle?: ReturnType<typeof setInterval>;\n private typingPruneHandle?: ReturnType<typeof setInterval>;\n\n /** Outgoing typing indicator throttle state (composer -> API). */\n private readonly outgoingTypingLastEmitAt = new Map<string, number>();\n private readonly outgoingTypingActive = new Map<string, boolean>();\n private readonly outgoingTypingStopHandles = new Map<string, ReturnType<typeof setTimeout>>();\n\n /** Session cache for available reaction emojis. */\n private availableReactionsCache: string[] | null = null;\n private availableReactionsPromise: Promise<string[]> | null = null;\n\n constructor() {\n this.presenceTickHandle = setInterval(() => this.state.bumpPresenceTimeTick(), 60_000);\n this.typingPruneHandle = setInterval(() => this.state.pruneExpiredTyping(), 1_000);\n\n this.destroyRef.onDestroy(() => {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.readFlushHandle) {\n clearTimeout(this.readFlushHandle);\n }\n if (this.presenceTickHandle) {\n clearInterval(this.presenceTickHandle);\n }\n if (this.typingPruneHandle) {\n clearInterval(this.typingPruneHandle);\n }\n for (const conversationId of [...this.outgoingTypingActive.keys()]) {\n this.notifyComposerStoppedTyping(conversationId);\n }\n for (const handle of this.outgoingTypingStopHandles.values()) {\n clearTimeout(handle);\n }\n this.outgoingTypingStopHandles.clear();\n void this.flushReadQueue();\n void this.userApi.updatePresence('offline').catch(() => undefined);\n });\n }\n\n /** Log and invoke an async API method from AXConversationService. */\n private callApi<T>(\n serviceMethod: string,\n api: AXConversationApiName,\n apiMethod: string,\n fn: () => Promise<T>,\n ...context: unknown[]\n ): Promise<T> {\n this.apiLogger.log({ serviceMethod, api, apiMethod, context });\n return fn();\n }\n\n /** Log a sync API invocation (e.g. realtime observable subscriptions). */\n private logApi(serviceMethod: string, api: AXConversationApiName, apiMethod: string, ...context: unknown[]): void {\n this.apiLogger.log({ serviceMethod, api, apiMethod, context });\n }\n\n /**\n * Ensures the service is initialized exactly once.\n * Safe to call from container components or before any public API usage.\n */\n ensureInitialized(): Promise<void> {\n if (!this.initPromise) {\n this.initPromise = this.initializeService();\n }\n return this.initPromise;\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 // Load current user\n const currentUser = await this.callApi('initializeService', 'userApi', 'getCurrentUser', () =>\n this.userApi.getCurrentUser(),\n );\n this._currentUser.set(currentUser);\n if (currentUser.conversationPreferences) {\n this.state.setRoomPreferencesBulk(currentUser.conversationPreferences);\n }\n\n // Subscribe to real-time events\n this.subscribeToEvents();\n\n void this.userApi.updatePresence('online').catch(() => undefined);\n\n // Load initial data\n await this.loadConversations();\n await this.hydrateUserPresence();\n await this.loadRoomPreferences();\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 from {@link AXConversationRealtimeApi}.\n * Binds every abstract subscription: messages (create/update/delete/status/read),\n * conversations (create/update/delete), typing indicators, and presence.\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\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 // Global message stream — backs message list even when the backend only pushes\n // conversation.lastMessage updates or when per-conversation subscribe races loadMessages.\n this.realtimeApi\n .subscribeToMessages('')\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToMessages');\n return EMPTY;\n }),\n )\n .subscribe((message) => {\n this.handleNewMessage(message);\n this._messageReceived$.next(message);\n });\n\n this.realtimeApi\n .subscribeToConversationCreated()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToConversationCreated');\n return EMPTY;\n }),\n )\n .subscribe((conversation) => {\n this.handleConversationCreated(conversation);\n });\n\n this.realtimeApi\n .subscribeToConversationDeleted()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToConversationDeleted');\n return EMPTY;\n }),\n )\n .subscribe((conversationId) => {\n this.handleConversationDeleted(conversationId);\n });\n\n this.realtimeApi\n .subscribeToReadReceipts()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToReadReceipts');\n return EMPTY;\n }),\n )\n .subscribe((receipt) => {\n this.handleReadReceipt(receipt);\n });\n\n this.realtimeApi\n .subscribeToMessageStatusChanges()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToMessageStatusChanges');\n return EMPTY;\n }),\n )\n .subscribe((change) => {\n this.handleMessageStatusChange(change);\n });\n }\n\n getUserPresence(userId: string): AXConversationUserPresence | undefined {\n return this.state.getUserPresence(userId);\n }\n\n getRoomPreferences(conversationId: string): AXConversationRoomPreferences {\n return this.state.getRoomPreferences(conversationId);\n }\n\n isAnyoneTyping(conversationId: string): boolean {\n return this.state.isAnyoneTyping(conversationId);\n }\n\n getActiveTypingUserIds(conversationId: string): string[] {\n return this.state.getActiveTypingUserIds(conversationId);\n }\n\n getPeerPresence(conversation: AXConversation): AXConversationUserPresence | undefined {\n const peerId = resolveConversationPeerUserId(conversation, this._currentUser()?.id);\n return peerId ? this.getUserPresence(peerId) : undefined;\n }\n\n private async hydrateUserPresence(): Promise<void> {\n const currentUserId = this._currentUser()?.id;\n const userIds = new Set<string>();\n for (const conversation of this.state.conversations()) {\n for (const participant of conversation.participants) {\n if (participant.id !== currentUserId) {\n userIds.add(participant.id);\n }\n }\n }\n if (userIds.size === 0) {\n return;\n }\n try {\n const updates = await this.callApi(\n 'hydrateUserPresence',\n 'userApi',\n 'getUsersPresence',\n () => this.userApi.getUsersPresence([...userIds]),\n [...userIds],\n );\n this.state.bulkSetUserPresence(updates);\n } catch (error) {\n this.errorHandler.handle(error, 'hydrateUserPresence');\n }\n }\n\n private async loadRoomPreferences(): Promise<void> {\n try {\n const preferences = await this.callApi('loadRoomPreferences', 'userApi', 'getConversationPreferences', () =>\n this.userApi.getConversationPreferences(),\n );\n this.state.setRoomPreferencesBulk(preferences);\n } catch (error) {\n this.errorHandler.handle(error, 'loadRoomPreferences');\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 const loadGeneration = this.conversationListLoadGeneration;\n\n try {\n const pagination = {\n page: 0,\n pageSize: this.config.conversationPageSize,\n };\n const result = await this.callApi(\n 'loadConversations',\n 'conversationApi',\n 'getConversations',\n () => this.conversationApi.getConversations(pagination, undefined),\n pagination,\n undefined,\n );\n\n if (loadGeneration !== this.conversationListLoadGeneration) {\n // A create (or newer reload) started while this request was in flight — merge, do not replace.\n this.state.addConversations(result.items);\n } else {\n this.state.setConversations(result.items);\n }\n this._conversationsPagination.set({\n page: 0,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n });\n await this.hydrateUserPresence();\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 await this.ensureInitialized();\n try {\n const pagination = {\n page,\n pageSize: this.config.conversationPageSize,\n };\n const result = await this.callApi(\n 'loadMoreConversations',\n 'conversationApi',\n 'getConversations',\n () => this.conversationApi.getConversations(pagination, undefined),\n pagination,\n undefined,\n );\n\n // Append new conversations to existing ones\n if (result.items.length > 0) {\n this.state.addConversations(result.items);\n }\n\n this._conversationsPagination.set({\n page,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\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 and load page 0 of its message history.\n */\n async selectConversation(conversationId: string): Promise<void> {\n await this.ensureInitialized();\n\n const isAlreadyActive = this._activeConversationId() === conversationId;\n const hasCachedMessages = this.state.getConversationMessages(conversationId).length > 0;\n\n try {\n if (!isAlreadyActive) {\n this.messageLoadGeneration++;\n this._activeConversationId.set(conversationId);\n }\n\n if (!isAlreadyActive || !hasCachedMessages) {\n this._loadingActiveMessages.set(true);\n try {\n await this.loadMessages(conversationId, 0);\n } finally {\n this._loadingActiveMessages.set(false);\n }\n }\n\n if (this.config.markConversationReadOnSelect) {\n const conversation = this.state.getConversation(conversationId);\n if (conversation && conversation.unreadCount > 0) {\n void this.markConversationAsRead(conversationId);\n }\n }\n } catch (error) {\n this.errorHandler.handle(error, 'selectConversation', { conversationId });\n throw error;\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<AXConversationLoadMessagesResult> {\n const empty: AXConversationLoadMessagesResult = { items: [], hasMore: false, page };\n const loadGeneration = page === 0 ? this.messageLoadGeneration : null;\n\n try {\n const paginationState = this._messagesPaginationByConversation().get(conversationId);\n const cursor = page > 0 ? paginationState?.nextCursor : undefined;\n\n const messagePagination = {\n page,\n pageSize: this.config.messagePageSize,\n cursor,\n };\n const result = await this.callApi(\n 'loadMessages',\n 'messageApi',\n 'getMessages',\n () => this.messageApi.getMessages(conversationId, messagePagination),\n conversationId,\n messagePagination,\n );\n\n if (page === 0 && loadGeneration !== null && loadGeneration !== this.messageLoadGeneration) {\n return empty;\n }\n\n if (page === 0) {\n const pendingLocal = this.state\n .getConversationMessages(conversationId)\n .filter((m) => m.isLocal || m.status === 'sending');\n const serverIds = new Set(result.items.map((m) => m.id));\n const localsToKeep = pendingLocal.filter((m) => !serverIds.has(m.id));\n this.state.setConversationMessages(conversationId, [...result.items, ...localsToKeep]);\n } else if (result.items.length > 0) {\n this.state.addMessages(result.items);\n }\n\n const pagination: AXConversationPaginationState = {\n page,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n };\n this._messagesPaginationByConversation.update((map) => {\n const next = new Map(map);\n next.set(conversationId, pagination);\n return next;\n });\n\n return { items: result.items, hasMore: result.hasMore, page, nextCursor: result.nextCursor };\n } catch (error) {\n this.errorHandler.handle(error, 'loadMessages', { conversationId, page });\n return empty;\n }\n }\n\n /** Reset sidebar conversation pagination (e.g. after filters change). */\n resetConversationsPagination(): void {\n this._conversationsPagination.set({ page: 0, hasMore: true });\n }\n\n /**\n * Upload media for a conversation (composers and custom plugins).\n */\n uploadMedia(\n source: File | Blob,\n conversationId: string,\n options?: Omit<AXConversationUploadOptions, 'metadata'> & {\n metadata?: Record<string, unknown>;\n },\n ): Promise<AXConversationUploaderResult> {\n const { fileName, mimeType, onProgress, signal, metadata } = options ?? {};\n return this.uploader.upload({\n source,\n fileName,\n mimeType,\n onProgress,\n signal,\n metadata: { conversationId, ...metadata },\n });\n }\n\n /**\n * Resolve a media reference to a playback/download URL.\n */\n resolveMediaUrl(reference: AXConversationUploaderReference, signal?: AbortSignal): Promise<string> {\n return this.uploader.resolvePlaybackUrl(reference, signal);\n }\n\n private resolveReplyTo(replyToId?: string): AXConversationMessage | undefined {\n if (!replyToId) {\n return undefined;\n }\n return this.state.getMessage(replyToId);\n }\n\n /**\n * Send a message\n * Uses optimistic UI updates - message appears immediately\n * Pass `options.media` to upload a File/Blob before send (with optional progress and AbortSignal).\n */\n async sendMessage(\n command: AXConversationSendMessageCommand,\n options?: AXConversationSendMessageOptions,\n ): Promise<void> {\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 const fileType = resolveConversationMessageFileType(command.type, command.fileType);\n let sendCommand: AXConversationSendMessageCommand = {\n ...command,\n tempId: tempMessageId,\n fileType,\n payload: await normalizeMessagePayloadAsync(command.payload),\n };\n let localPreviewUrl: string | undefined = options?.localPreviewUrl;\n\n if (options?.media) {\n const { source, fileName, mimeType, onProgress, signal } = options.media;\n localPreviewUrl ??= await createLocalPreviewUrl(this.fileService, this.platformId, source, command.type);\n\n if (localPreviewUrl) {\n sendCommand = {\n ...sendCommand,\n payload: await applyLocalPreview(command.type, sendCommand.payload, localPreviewUrl),\n };\n }\n\n await this.validateMessageContent(sendCommand);\n\n const tempMessage: AXConversationMessage = {\n id: tempMessageId,\n conversationId: command.conversationId,\n senderId: this._currentUser()?.id ?? 'current-user',\n type: command.type,\n fileType,\n timestamp: new Date(),\n payload: sendCommand.payload,\n status: 'sending',\n reactions: [],\n isLocal: true,\n forwarded: command.forwarded,\n forwardedFrom: command.forwardedFrom,\n metadata: command.metadata,\n replyTo: this.resolveReplyTo(sendCommand.replyToId),\n };\n\n this.state.addMessage(tempMessage);\n\n try {\n const uploadResult = await this.uploader.upload({\n source,\n fileName,\n mimeType,\n onProgress,\n signal,\n metadata: { conversationId: command.conversationId },\n });\n\n sendCommand = {\n ...sendCommand,\n payload: await mergeUploadResult(command.type, sendCommand.payload, uploadResult),\n };\n\n this.state.updateMessage(tempMessageId, { payload: sendCommand.payload });\n\n const sentMessage = await this.callApi(\n 'sendMessage',\n 'messageApi',\n 'sendMessage',\n () => this.messageApi.sendMessage(sendCommand),\n sendCommand,\n );\n this.finalizeSentMessage(tempMessageId, sentMessage);\n\n if (localPreviewUrl?.startsWith('blob:')) {\n await revokeObjectUrl(this.platformId, localPreviewUrl);\n }\n } catch (error) {\n this.state.updateMessage(tempMessageId, { status: 'failed' });\n this.errorHandler.handle(error, 'sendMessage', {\n conversationId: command.conversationId,\n type: command.type,\n });\n throw error;\n }\n\n return;\n }\n\n await this.validateMessageContent(sendCommand);\n\n try {\n const tempMessage: AXConversationMessage = {\n id: tempMessageId,\n conversationId: command.conversationId,\n senderId: this._currentUser()?.id ?? 'current-user',\n type: command.type,\n fileType,\n timestamp: new Date(),\n payload: sendCommand.payload,\n status: 'sending',\n reactions: [],\n isLocal: true,\n forwarded: command.forwarded,\n forwardedFrom: command.forwardedFrom,\n metadata: command.metadata,\n replyTo: this.resolveReplyTo(sendCommand.replyToId),\n };\n\n this.state.addMessage(tempMessage);\n\n const sentMessage = await this.callApi(\n 'sendMessage',\n 'messageApi',\n 'sendMessage',\n () => this.messageApi.sendMessage(sendCommand),\n sendCommand,\n );\n\n this.finalizeSentMessage(tempMessageId, sentMessage);\n } catch (error) {\n this.state.updateMessage(tempMessageId, { status: 'failed' });\n\n this.errorHandler.handle(error, 'sendMessage', {\n conversationId: command.conversationId,\n type: command.type,\n });\n throw error;\n }\n }\n\n /**\n * Retry a failed message\n */\n async retryFailedMessage(messageId: string): Promise<void> {\n const message = this.state.getMessage(messageId);\n if (!message || message.status !== 'failed') {\n return;\n }\n\n // Update status to sending\n this.state.updateMessage(messageId, { status: 'sending' });\n\n try {\n // Recreate command from message\n const command: AXConversationSendMessageCommand = {\n conversationId: message.conversationId,\n type: message.type,\n fileType: message.fileType ?? resolveConversationMessageFileType(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.callApi(\n 'retryFailedMessage',\n 'messageApi',\n 'sendMessage',\n () => this.messageApi.sendMessage(command),\n command,\n );\n\n // Replace with real message (keep same DOM row when server echoes tempId)\n this.finalizeSentMessage(messageId, sentMessage);\n } catch (error) {\n // Mark as failed again\n this.state.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: AXConversationMessagePayload): Promise<void> {\n const originalMessage = this.state.getMessage(messageId);\n if (!originalMessage) {\n throw new Error(`Message not found: ${messageId}`);\n }\n\n try {\n const optimisticMessage: AXConversationMessage = {\n ...originalMessage,\n payload,\n editedAt: new Date(),\n };\n this.state.updateMessage(messageId, {\n payload,\n editedAt: optimisticMessage.editedAt,\n });\n this.syncLastMessageIfRelevant(optimisticMessage);\n\n // Sync with server\n const updatedMessage = await this.callApi(\n 'editMessage',\n 'messageApi',\n 'editMessage',\n () => this.messageApi.editMessage(messageId, payload),\n messageId,\n payload,\n );\n this.state.updateMessage(messageId, updatedMessage);\n this.syncLastMessageIfRelevant(updatedMessage);\n } catch (error) {\n // Rollback on failure\n if (originalMessage) {\n this.state.updateMessage(messageId, {\n payload: originalMessage.payload,\n editedAt: originalMessage.editedAt,\n });\n this.syncLastMessageIfRelevant(originalMessage);\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 this.translation.translateSync('@acorex:chat.dialog.delete-message.title'),\n forEveryone\n ? this.translation.translateSync('@acorex:chat.dialog.delete-message.for-everyone')\n : this.translation.translateSync('@acorex:chat.dialog.delete-message.default'),\n 'danger',\n );\n\n // User cancelled\n if (!result.result) {\n return;\n }\n\n // Store message for rollback\n const message = this.state.getMessage(messageId);\n\n try {\n const conversationId = message?.conversationId;\n\n // Optimistic delete\n this.state.deleteMessage(messageId);\n if (conversationId) {\n this.refreshConversationLastMessage(conversationId);\n }\n\n // Sync with server\n await this.callApi(\n 'deleteMessage',\n 'messageApi',\n 'deleteMessage',\n () => this.messageApi.deleteMessage(messageId, forEveryone),\n messageId,\n forEveryone,\n );\n } catch (error) {\n // Rollback on failure\n if (message) {\n this.state.addMessage(message);\n this.syncLastMessageIfRelevant(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 const message = this.state.getMessage(messageId);\n const currentUserId = this._currentUser()?.id;\n if (!message || !currentUserId) {\n return;\n }\n\n const originalReactions = [...message.reactions];\n const hasReaction = message.reactions.some((r) => r.emoji === emoji && r.userId === currentUserId);\n const optimisticReactions = hasReaction\n ? message.reactions.filter((r) => !(r.emoji === emoji && r.userId === currentUserId))\n : [...message.reactions, { emoji, userId: currentUserId, timestamp: new Date() }];\n\n this.state.updateMessage(messageId, { reactions: optimisticReactions });\n\n try {\n await this.callApi(\n 'reactToMessage',\n 'messageApi',\n 'addReaction',\n () => this.messageApi.addReaction(messageId, emoji),\n messageId,\n emoji,\n );\n } catch (error) {\n this.state.updateMessage(messageId, { reactions: originalReactions });\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 if (this.availableReactionsCache) {\n return this.availableReactionsCache;\n }\n\n if (!this.availableReactionsPromise) {\n this.availableReactionsPromise = this.callApi(\n 'getAvailableReactions',\n 'messageApi',\n 'getAvailableReactions',\n () => this.messageApi.getAvailableReactions(),\n )\n .then((reactions) => {\n this.availableReactionsCache = reactions;\n return reactions;\n })\n .catch((error) => {\n this.errorHandler.handle(error, 'getAvailableReactions');\n const fallback = ['👍', '❤️', '😂', '😮', '😢', '🙏'];\n this.availableReactionsCache = fallback;\n return fallback;\n })\n .finally(() => {\n this.availableReactionsPromise = null;\n });\n }\n\n return this.availableReactionsPromise;\n }\n\n /**\n * Queue a message to be marked as read (batched/debounced API sync).\n */\n queueMessageAsRead(messageId: string): void {\n const message = this.state.getMessage(messageId);\n if (!message || message.status === 'read') {\n return;\n }\n\n const existingQueue = this.readQueue.get(message.conversationId);\n if (existingQueue?.has(messageId)) {\n return;\n }\n\n this.state.updateMessage(messageId, { status: 'read' });\n\n let queue = existingQueue;\n if (!queue) {\n queue = new Set();\n this.readQueue.set(message.conversationId, queue);\n }\n queue.add(messageId);\n\n const conversation = this.state.getConversation(message.conversationId);\n if (conversation && conversation.unreadCount > 0) {\n this.state.updateConversation(message.conversationId, {\n unreadCount: Math.max(0, conversation.unreadCount - 1),\n });\n }\n\n this.scheduleReadFlush();\n }\n\n /**\n * Mark a single message as read (queues for batched sync).\n */\n async markMessageAsRead(messageId: string): Promise<void> {\n this.queueMessageAsRead(messageId);\n }\n\n private scheduleReadFlush(): void {\n if (this.readFlushHandle) {\n clearTimeout(this.readFlushHandle);\n }\n this.readFlushHandle = setTimeout(() => {\n this.readFlushHandle = undefined;\n void this.flushReadQueue();\n }, this.config.messageReadDebounce);\n }\n\n /**\n * Drop queued per-message read receipts without syncing to the API.\n * Used before conversation-level mark-as-read to avoid duplicate API calls.\n */\n private discardReadQueue(conversationId?: string): void {\n if (conversationId) {\n this.readQueue.delete(conversationId);\n } else {\n this.readQueue.clear();\n }\n\n if (this.readFlushHandle) {\n clearTimeout(this.readFlushHandle);\n this.readFlushHandle = undefined;\n }\n\n if (this.readQueue.size > 0) {\n this.scheduleReadFlush();\n }\n }\n\n private async flushReadQueue(): Promise<void> {\n const snapshot = new Map(this.readQueue);\n this.readQueue.clear();\n\n for (const [conversationId, ids] of snapshot) {\n const messageIds = [...ids];\n if (messageIds.length === 0) {\n continue;\n }\n\n try {\n await this.callApi(\n 'flushReadQueue',\n 'messageApi',\n 'markAsRead',\n () => this.messageApi.markAsRead(conversationId, messageIds),\n conversationId,\n messageIds,\n );\n } catch (error) {\n for (const id of messageIds) {\n const msg = this.state.getMessage(id);\n if (msg?.status === 'read') {\n this.state.updateMessage(id, { status: 'delivered' });\n }\n }\n this.errorHandler.handle(error, 'flushReadQueue', { conversationId, count: messageIds.length });\n }\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 await this.flushReadQueue();\n\n const messages = this.state.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.state.resetUnreadCount(conversationId);\n\n // Sync with server\n await this.callApi(\n 'markAsRead',\n 'messageApi',\n 'markAsRead',\n () => this.messageApi.markAsRead(conversationId, unreadMessageIds),\n conversationId,\n unreadMessageIds,\n );\n } catch (error) {\n // Rollback on failure\n this.state.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 * Set composer generation mode (shows cancel button instead of send/voice).\n * Call from message APIs while an AI or async response is in progress.\n */\n setGenerating(value: boolean): void {\n this.composerGenerationState.setGenerating(value);\n }\n\n /**\n * Cancel an in-progress generation from the composer UI or programmatically.\n */\n cancelGeneration(): void {\n this.composerGenerationState.cancel();\n }\n\n /**\n * Notify that the composer has draft content.\n * Emits typing indicators at most once per {@link AXConversationConfig.typingIndicatorThrottle}.\n */\n notifyComposerTyping(conversationId: string): void {\n this.clearOutgoingTypingStop(conversationId);\n\n const throttleMs = this.config.typingIndicatorThrottle;\n const lastEmit = this.outgoingTypingLastEmitAt.get(conversationId) ?? 0;\n const now = Date.now();\n const isActive = this.outgoingTypingActive.get(conversationId) === true;\n\n if (!isActive || now - lastEmit >= throttleMs) {\n this.outgoingTypingLastEmitAt.set(conversationId, now);\n this.outgoingTypingActive.set(conversationId, true);\n void this.sendTypingIndicator(conversationId);\n }\n\n this.scheduleOutgoingTypingStop(conversationId);\n }\n\n /**\n * Notify that the composer no longer has draft content (or user left the chat).\n * Sends a single stop event when a typing indicator was previously emitted.\n */\n notifyComposerStoppedTyping(conversationId: string): void {\n this.clearOutgoingTypingStop(conversationId);\n if (!this.outgoingTypingActive.get(conversationId)) {\n return;\n }\n this.outgoingTypingActive.set(conversationId, false);\n void this.stopTypingIndicator(conversationId);\n }\n\n private scheduleOutgoingTypingStop(conversationId: string): void {\n this.clearOutgoingTypingStop(conversationId);\n const timeoutMs = this.config.typingIndicatorTimeout;\n const handle = setTimeout(() => {\n this.outgoingTypingStopHandles.delete(conversationId);\n this.notifyComposerStoppedTyping(conversationId);\n }, timeoutMs);\n this.outgoingTypingStopHandles.set(conversationId, handle);\n }\n\n private clearOutgoingTypingStop(conversationId: string): void {\n const handle = this.outgoingTypingStopHandles.get(conversationId);\n if (!handle) {\n return;\n }\n clearTimeout(handle);\n this.outgoingTypingStopHandles.delete(conversationId);\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.callApi(\n 'sendTypingIndicator',\n 'messageApi',\n 'sendTypingIndicator',\n () => this.messageApi.sendTypingIndicator(conversationId),\n conversationId,\n );\n } catch (error) {\n this.errorHandler.handle(error, 'sendTypingIndicator', { conversationId });\n }\n }\n\n async stopTypingIndicator(conversationId: string): Promise<void> {\n try {\n await this.callApi(\n 'stopTypingIndicator',\n 'messageApi',\n 'stopTypingIndicator',\n () => this.messageApi.stopTypingIndicator(conversationId),\n conversationId,\n );\n } catch (error) {\n this.errorHandler.handle(error, 'stopTypingIndicator', { 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.callApi(\n 'searchConversations',\n 'conversationApi',\n 'searchConversations',\n () => this.conversationApi.searchConversations(query),\n query,\n );\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: AXConversationMessage): void {\n if (this.state.getMessage(message.id)) {\n return;\n }\n\n const existingConversation = this.state.getConversation(message.conversationId);\n if (!existingConversation) {\n void this.conversationApi\n .getConversation(message.conversationId)\n .then((conversation) => {\n if (this.state.getMessage(message.id)) {\n return;\n }\n this.syncConversationToInbox(conversation, true);\n this.applyIncomingMessage(message);\n })\n .catch(() => undefined);\n return;\n }\n\n if (!isMessageVisibleAfterHistoryCutoff(message.timestamp, existingConversation.historyClearedAt)) {\n return;\n }\n\n this.applyIncomingMessage(message);\n }\n\n private applyIncomingMessage(message: AXConversationMessage): void {\n this.state.clearTypingUser(message.conversationId, message.senderId);\n this.state.addMessage(message);\n this.state.updateLastMessage(message);\n\n const currentId = this._currentUser()?.id ?? 'current-user';\n const isFromOtherUser = message.senderId !== currentId;\n const isActiveConversation = message.conversationId === this._activeConversationId();\n const isAlreadyRead = message.status === 'read';\n\n if (!isAlreadyRead && isFromOtherUser && isActiveConversation) {\n this.queueMessageAsRead(message.id);\n } else if (!isAlreadyRead && isFromOtherUser && !isActiveConversation) {\n this.state.incrementUnreadCount(message.conversationId);\n }\n\n this.syncMessageCountFromRealtime(message, isActiveConversation);\n }\n\n /**\n * Handle message update\n */\n private handleMessageUpdate(message: AXConversationMessage): void {\n const existing = this.state.getMessage(message.id);\n if (!existing) {\n this.state.addMessage(message);\n this.syncLastMessageIfRelevant(message);\n return;\n }\n\n this.state.updateMessage(message.id, message);\n this.syncLastMessageIfRelevant(message);\n }\n\n /**\n * Bump reply/forward counts locally when realtime events arrive outside the active message list.\n */\n private syncMessageCountFromRealtime(message: AXConversationMessage, isActiveConversation: boolean): void {\n if (message.replyTo?.id && !isActiveConversation) {\n this.bumpMessageCount(message.replyTo.id, 'replyCount');\n }\n if (message.forwardedFrom?.messageId && !isActiveConversation) {\n this.bumpMessageCount(message.forwardedFrom.messageId, 'forwardCount');\n }\n }\n\n private bumpMessageCount(messageId: string, field: 'replyCount' | 'forwardCount', delta = 1): void {\n const message = this.state.getMessage(messageId);\n if (!message) {\n return;\n }\n this.state.updateMessage(messageId, {\n [field]: (message[field] ?? 0) + delta,\n });\n }\n\n /**\n * Handle message deletion\n */\n private handleMessageDeletion(messageId: string): void {\n const message = this.state.getMessage(messageId);\n const conversationId = message?.conversationId;\n\n this.state.deleteMessage(messageId);\n\n if (conversationId) {\n this.refreshConversationLastMessage(conversationId);\n }\n }\n\n /**\n * Handle typing indicator\n */\n private handleTypingIndicator(indicator: AXConversationTypingIndicator): void {\n const currentUser = this._currentUser();\n if (currentUser && indicator.userId === currentUser.id) {\n return;\n }\n\n if (indicator.isTyping === false) {\n this.state.clearTypingUser(indicator.conversationId, indicator.userId);\n return;\n }\n\n this.state.setTypingActive(indicator.conversationId, indicator.userId, this.config.typingDisplayDuration);\n }\n\n /**\n * Handle presence update\n */\n private handlePresenceUpdate(update: AXConversationPresenceUpdate): void {\n this.state.updateUserPresence(update);\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.syncConversationToInbox(conversation);\n }\n\n private handleConversationCreated(conversation: AXConversation): void {\n this.syncConversationToInbox(conversation, true);\n }\n\n private handleConversationDeleted(conversationId: string): void {\n this.removeConversationFromInbox(conversationId);\n }\n\n private removeConversationFromInbox(conversationId: string): void {\n this.state.deleteConversation(conversationId);\n this.readQueue.delete(conversationId);\n\n if (this._activeConversationId() === conversationId) {\n this._activeConversationId.set(null);\n }\n }\n\n private handleReadReceipt(receipt: { messageId: string; userId: string; readAt: Date }): void {\n const currentUserId = this._currentUser()?.id;\n const message = this.state.getMessage(receipt.messageId);\n if (!message || !currentUserId) {\n return;\n }\n\n if (receipt.userId === currentUserId) {\n return;\n }\n\n if (message.senderId === currentUserId && message.status !== 'read') {\n this.state.updateMessage(receipt.messageId, { status: 'read' });\n }\n }\n\n private handleMessageStatusChange(change: {\n messageId: string;\n status: AXConversationMessage['status'];\n timestamp: Date;\n }): void {\n const message = this.state.getMessage(change.messageId);\n if (!message || message.status === change.status) {\n return;\n }\n this.state.updateMessage(change.messageId, { status: change.status });\n const updated = this.state.getMessage(change.messageId);\n if (updated) {\n this.syncLastMessageIfRelevant(updated);\n }\n }\n\n /**\n * Insert or refresh a conversation in the in-memory inbox.\n * @param promote When true, bumps activity so the chat sorts to the top (create / reopen).\n */\n private syncConversationToInbox(conversation: AXConversation, promote = false): void {\n const now = new Date();\n const existing = this.state.getConversation(conversation.id);\n const base = existing ?? conversation;\n this.state.setConversation({\n ...base,\n ...conversation,\n lastMessageAt: promote ? now : (conversation.lastMessageAt ?? base.lastMessageAt ?? now),\n updatedAt: conversation.updatedAt ?? now,\n });\n }\n\n private finalizeSentMessage(tempMessageId: string, sentMessage: AXConversationMessage): void {\n if (sentMessage.id === tempMessageId) {\n this.state.updateMessage(tempMessageId, { ...sentMessage, isLocal: false });\n } else {\n this.state.deleteMessage(tempMessageId);\n this.state.addMessage(sentMessage);\n }\n this.updateConversationLastMessage(sentMessage);\n }\n\n /**\n * Update conversation's last message\n */\n private updateConversationLastMessage(message: AXConversationMessage): void {\n this.state.updateLastMessage(message);\n }\n\n /** Keep sidebar preview in sync when the last cached message is edited or deleted. */\n private syncLastMessageIfRelevant(message: AXConversationMessage): void {\n const conversation = this.state.getConversation(message.conversationId);\n if (!conversation) {\n return;\n }\n\n const cachedLast = this.state.getConversationMessages(message.conversationId).at(-1);\n if (cachedLast?.id === message.id || conversation.lastMessage?.id === message.id) {\n this.state.updateLastMessage(message);\n }\n }\n\n /** Recompute conversation preview after a message is removed from the local cache. */\n private refreshConversationLastMessage(conversationId: string): void {\n const conversation = this.state.getConversation(conversationId);\n if (!conversation) {\n return;\n }\n\n const last = this.state.getConversationMessages(conversationId).at(-1);\n if (last) {\n this.state.updateLastMessage(last);\n return;\n }\n\n this.state.updateConversation(conversationId, {\n lastMessage: undefined,\n lastMessageAt: conversation.createdAt ?? conversation.updatedAt ?? new Date(),\n updatedAt: new Date(),\n });\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 const { title, description, avatar, icon, metadata, archived } = updates;\n\n const apiUpdates: AXConversationUpdateData = {};\n if (title !== undefined) apiUpdates.title = title;\n if (description !== undefined) apiUpdates.description = description;\n if (avatar !== undefined) apiUpdates.avatar = avatar;\n if (icon !== undefined) apiUpdates.icon = icon;\n if (metadata !== undefined) apiUpdates.metadata = metadata;\n\n if (Object.keys(apiUpdates).length > 0) {\n await this.callApi(\n 'updateConversation',\n 'conversationApi',\n 'updateConversation',\n () => this.conversationApi.updateConversation(conversationId, apiUpdates),\n conversationId,\n apiUpdates,\n );\n }\n\n if (archived !== undefined) {\n if (archived) {\n await this.callApi(\n 'updateConversation',\n 'conversationApi',\n 'archiveConversation',\n () => this.conversationApi.archiveConversation(conversationId),\n conversationId,\n );\n } else {\n await this.callApi(\n 'updateConversation',\n 'conversationApi',\n 'unarchiveConversation',\n () => this.conversationApi.unarchiveConversation(conversationId),\n conversationId,\n );\n }\n }\n\n this.state.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<AXConversationRoomPreferences>,\n ): Promise<void> {\n try {\n const updated = await this.callApi(\n 'updateConversationSettings',\n 'userApi',\n 'updateConversationPreferences',\n () => this.userApi.updateConversationPreferences(conversationId, settings),\n conversationId,\n settings,\n );\n this.state.updateRoomPreferences(conversationId, updated);\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 await this.callApi(\n 'updateConversationTitle',\n 'conversationApi',\n 'updateConversation',\n () => this.conversationApi.updateConversation(conversationId, { title }),\n conversationId,\n { title },\n );\n this.state.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: AXConversationMetadata): Promise<void> {\n try {\n const current = this.state.getConversation(conversationId);\n const mergedMetadata = { ...current?.metadata, ...metadata };\n const metadataUpdate = { metadata: mergedMetadata };\n await this.callApi(\n 'updateConversationMetadata',\n 'conversationApi',\n 'updateConversation',\n () => this.conversationApi.updateConversation(conversationId, metadataUpdate),\n conversationId,\n metadataUpdate,\n );\n this.state.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.state.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 * @param options - Optional flags (`forceCreate` recreates private chats even when one exists)\n * @returns Created or existing conversation\n */\n async createConversation(\n participantIds: string[],\n type: AXConversationType,\n metadata?: AXConversationMetadata,\n options?: { forceCreate?: boolean },\n ): Promise<AXConversation> {\n try {\n await this.ensureInitialized();\n\n const currentUser = this._currentUser();\n const creatorId = currentUser?.id;\n const isPrivate = type === 'private';\n const forceCreate = options?.forceCreate === true;\n const scopedParticipantIds = [...participantIds];\n if (creatorId && !scopedParticipantIds.includes(creatorId)) {\n scopedParticipantIds.unshift(creatorId);\n }\n\n if (isPrivate && !forceCreate && creatorId) {\n const peerUserId = scopedParticipantIds.find((id) => id !== creatorId);\n if (peerUserId) {\n const existing = findExistingPrivateConversation(this.state.conversations(), creatorId, peerUserId);\n if (existing) {\n this.syncConversationToInbox(existing, true);\n return resolveConversationForViewer(existing, creatorId);\n }\n }\n }\n\n this.conversationListLoadGeneration++;\n\n const createData = {\n type,\n participantIds: scopedParticipantIds,\n creatorId,\n title: isPrivate ? undefined : (metadata?.['title'] as string | undefined),\n description: metadata?.['description'] as string | undefined,\n avatar: isPrivate ? undefined : AXConversationService.normalizeOptionalString(metadata?.['avatar']),\n icon: isPrivate\n ? undefined\n : (AXConversationService.normalizeOptionalString(metadata?.['icon']) ??\n (type === 'group' ? AX_CONVERSATION_DEFAULT_GROUP_ICON : undefined)),\n metadata: isPrivate ? undefined : metadata,\n forceCreate,\n };\n const conversation = await this.callApi(\n 'createConversation',\n 'conversationApi',\n 'createConversation',\n () => this.conversationApi.createConversation(createData),\n createData,\n );\n this.syncConversationToInbox(conversation, true);\n return resolveConversationForViewer(conversation, creatorId);\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 filters - Optional search filters (e.g. `query`)\n * @param pagination - Pagination parameters\n * @returns Paginated list of users\n */\n async getUsers(\n filters?: AXConversationUserSearchFilters,\n pagination: AXConversationPagination = { page: 0, pageSize: 50 },\n ): Promise<AXConversationPaginatedResult<import('../models').AXConversationParticipant>> {\n try {\n return await this.callApi(\n 'getUsers',\n 'userApi',\n 'getUsers',\n () => this.userApi.getUsers(pagination, filters),\n pagination,\n filters,\n );\n } catch (error) {\n this.errorHandler.handle(error, 'getUsers', { filters, pagination });\n return { items: [], total: 0, hasMore: false, page: pagination.page };\n }\n }\n\n /**\n * Mark entire conversation as read\n * @param conversationId - Conversation ID\n */\n async markConversationAsRead(conversationId: string): Promise<void> {\n this.discardReadQueue(conversationId);\n\n const currentId = this._currentUser()?.id;\n for (const message of this.state.getConversationMessages(conversationId)) {\n if (message.status !== 'read' && message.senderId !== currentId) {\n this.state.updateMessage(message.id, { status: 'read' });\n }\n }\n\n try {\n await this.callApi(\n 'markConversationAsRead',\n 'conversationApi',\n 'markConversationAsRead',\n () => this.conversationApi.markConversationAsRead(conversationId),\n conversationId,\n );\n this.state.resetUnreadCount(conversationId);\n } catch (error) {\n this.errorHandler.handle(error, 'markConversationAsRead', { conversationId });\n throw error;\n }\n }\n\n /**\n * Delete, hide, or leave a conversation.\n * Opens a confirmation popup (checkbox for private/creator destroy), then updates the store.\n */\n async deleteConversation(conversationId: string): Promise<boolean> {\n const conversation = this.state.getConversation(conversationId);\n const conversationTitle =\n conversation?.title || this.translation.translateSync('@acorex:chat.fallbacks.this-conversation');\n\n if (!conversation) {\n return false;\n }\n\n const currentUserId = this._currentUser()?.id;\n const isGroup = isGroupLikeConversation(conversation);\n const isCreator = isConversationRoomCreator(conversation, currentUserId);\n const mode = !isGroup ? 'private' : isCreator ? 'destroy-room' : 'leave';\n const peerName = resolvePrivatePeerParticipant(conversation, currentUserId)?.name;\n\n const { AXConversationDeleteDialogComponent } = await import('../components/sidebar/delete-conversation-dialog.component');\n const popupResult = await this.popupService.open(AXConversationDeleteDialogComponent, {\n title:\n mode === 'leave'\n ? this.translation.translateSync('@acorex:chat.dialog.delete-conversation.leave-title')\n : this.translation.translateSync('@acorex:chat.dialog.delete-conversation.title'),\n size: 'sm',\n closeButton: true,\n data: {\n conversation: { ...conversation, title: conversationTitle },\n mode,\n peerName,\n },\n });\n\n const decision = popupResult?.data as { confirmed?: boolean; forEveryone?: boolean } | undefined;\n if (!decision?.confirmed) {\n return false;\n }\n\n try {\n if (isGroup && !(isCreator && decision.forEveryone)) {\n await this.callApi(\n 'leaveConversation',\n 'conversationApi',\n 'leaveConversation',\n () => this.conversationApi.leaveConversation(conversationId),\n conversationId,\n );\n } else {\n const deleted = await this.callApi(\n 'deleteConversation',\n 'conversationApi',\n 'deleteConversation',\n () => this.conversationApi.deleteConversation(conversationId, { forEveryone: !!decision.forEveryone }),\n conversationId,\n { forEveryone: !!decision.forEveryone },\n );\n if (!deleted) {\n return false;\n }\n }\n\n this.removeConversationFromInbox(conversationId);\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.callApi(\n 'getReplyCount',\n 'messageApi',\n 'getReplyCount',\n () => this.messageApi.getReplyCount(messageId),\n messageId,\n );\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.callApi(\n 'getForwardCount',\n 'messageApi',\n 'getForwardCount',\n () => this.messageApi.getForwardCount(messageId),\n messageId,\n );\n } catch (error) {\n this.errorHandler.handle(error, 'getForwardCount', { messageId });\n return 0;\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.callApi(\n 'archiveConversation',\n 'conversationApi',\n 'archiveConversation',\n () => this.conversationApi.archiveConversation(conversationId),\n conversationId,\n );\n this.state.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.callApi(\n 'unarchiveConversation',\n 'conversationApi',\n 'unarchiveConversation',\n () => this.conversationApi.unarchiveConversation(conversationId),\n conversationId,\n );\n this.state.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.callApi(\n 'pinConversation',\n 'conversationApi',\n 'pinConversation',\n () => this.conversationApi.pinConversation(conversationId),\n conversationId,\n );\n this.state.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.callApi(\n 'unpinConversation',\n 'conversationApi',\n 'unpinConversation',\n () => this.conversationApi.unpinConversation(conversationId),\n conversationId,\n );\n this.state.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 const mutedUntil = duration ? new Date(Date.now() + duration) : new Date('2099-12-31');\n await this.updateConversationSettings(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.updateConversationSettings(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.callApi(\n 'addParticipants',\n 'conversationApi',\n 'addParticipants',\n () => this.conversationApi.addParticipants(conversationId, userIds),\n conversationId,\n userIds,\n );\n this.state.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.callApi(\n 'removeParticipant',\n 'conversationApi',\n 'removeParticipant',\n () => this.conversationApi.removeParticipant(conversationId, userId),\n conversationId,\n userId,\n );\n this.state.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.callApi(\n 'leaveConversation',\n 'conversationApi',\n 'leaveConversation',\n () => this.conversationApi.leaveConversation(conversationId),\n conversationId,\n );\n this.removeConversationFromInbox(conversationId);\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.callApi(\n 'saveDraft',\n 'conversationApi',\n 'saveDraft',\n () => this.conversationApi.saveDraft(conversationId, draft),\n conversationId,\n draft,\n );\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.callApi(\n 'clearDraft',\n 'conversationApi',\n 'clearDraft',\n () => this.conversationApi.clearDraft(conversationId),\n conversationId,\n );\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.callApi(\n 'pinMessage',\n 'messageApi',\n 'pinMessage',\n () => this.messageApi.pinMessage(conversationId, messageId),\n conversationId,\n messageId,\n );\n this.state.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.callApi(\n 'unpinMessage',\n 'messageApi',\n 'unpinMessage',\n () => this.messageApi.unpinMessage(conversationId, messageId),\n conversationId,\n messageId,\n );\n this.state.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 await this.runWithForwardingLock(async () => {\n try {\n const forwardCommand = {\n messageId,\n conversationIds,\n caption,\n };\n await this.callApi(\n 'forwardMessage',\n 'messageApi',\n 'forwardMessage',\n () => this.messageApi.forwardMessage(forwardCommand),\n forwardCommand,\n );\n this.bumpMessageCount(messageId, 'forwardCount', conversationIds.length);\n } catch (error) {\n this.errorHandler.handle(error, 'forwardMessage', { messageId, conversationIds });\n throw error;\n }\n });\n }\n\n /**\n * Runs a forward operation while locking all forward actions until it completes.\n */\n async runWithForwardingLock<T>(task: () => Promise<T>): Promise<T> {\n if (this._isForwardingMessage()) {\n throw new Error('A message forward is already in progress.');\n }\n\n this._isForwardingMessage.set(true);\n try {\n return await task();\n } finally {\n this._isForwardingMessage.set(false);\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<AXConversationMessage[]> {\n try {\n const searchFilters = { query };\n const pagination = { page: 0, pageSize: 50 };\n const result = await this.callApi(\n 'searchMessages',\n 'messageApi',\n 'searchMessages',\n () => this.messageApi.searchMessages(conversationId, searchFilters, pagination),\n conversationId,\n searchFilters,\n pagination,\n );\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<AXConversationMessage[]> {\n try {\n const pagination = { page: 0, pageSize: 50 };\n const result = await this.callApi(\n 'getMessageReplies',\n 'messageApi',\n 'getMessageReplies',\n () => this.messageApi.getMessageReplies(messageId, pagination),\n messageId,\n pagination,\n );\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.callApi(\n 'exportMessages',\n 'messageApi',\n 'exportMessages',\n () => this.messageApi.exportMessages(conversationId, format),\n conversationId,\n format,\n );\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.callApi('getUserSettings', 'userApi', 'getUserSettings', () => 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.callApi(\n 'updateUserSettings',\n 'userApi',\n 'updateUserSettings',\n () => this.userApi.updateUserSettings(settings),\n settings,\n );\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.callApi(\n 'blockUser',\n 'userApi',\n 'blockUser',\n () => this.userApi.blockUser(userId, reason),\n userId,\n reason,\n );\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.callApi('unblockUser', 'userApi', 'unblockUser', () => this.userApi.unblockUser(userId), 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.callApi('getBlockedUsers', 'userApi', 'getBlockedUsers', () => 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(status: AXConversationPresenceStatus, statusText?: string): Promise<void> {\n try {\n await this.callApi(\n 'updatePresence',\n 'userApi',\n 'updatePresence',\n () => this.userApi.updatePresence(status, statusText),\n status,\n statusText,\n );\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 async validateMessageContent(command: AXConversationSendMessageCommand): Promise<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 = await 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 { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTabItemComponent, AXTabsComponent } from '@acorex/components/tabs';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ComponentRef,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { AXConversationService } from '../../services';\n\n@Component({\n selector: 'ax-conversation-composer-popup',\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, AXDecoratorModule, AXTabsComponent, AXTabItemComponent],\n templateUrl: './composer-popup.component.html',\n styleUrl: './composer-popup.component.css',\n})\nexport class AXConversationComposerPopupComponent 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 private tabItemSelectedSubscription: Subscription | 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 readonly activeTabId = signal<string | null>(null);\n\n /** Enabled tabs from registry */\n readonly enabledTabs = computed(() => this.registry.composerTabs.enabledTabs());\n\n /** Whether more than one tab is available */\n readonly hasMultipleTabs = computed(() => this.enabledTabs().length > 1);\n\n getTabTitle(tabId: string): string {\n const tab = this.registry.composerTabs.getTabById(tabId);\n if (!tab) return '';\n return this.registry.composerTabs.getTabTitle(tab);\n }\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 async loadTabContent(tabId: string): Promise<void> {\n if (!this.contentContainer) return;\n\n const tab = this.registry.composerTabs.getTabById(tabId);\n if (!tab) return;\n\n this.clearTabContent();\n\n this.contentContainer().clear();\n\n const componentType = tab.component ?? (tab.componentLoader ? await tab.componentLoader() : undefined);\n if (!componentType) return;\n\n // Create new component instance\n this.currentComponentRef = this.contentContainer().createComponent(componentType);\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 this.tabItemSelectedSubscription = instance.itemSelected.subscribe((item: unknown) => {\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 private clearTabContent(): void {\n this.tabItemSelectedSubscription?.unsubscribe();\n this.tabItemSelectedSubscription = null;\n\n if (this.currentComponentRef) {\n this.currentComponentRef.destroy();\n this.currentComponentRef = null;\n }\n }\n\n ngOnDestroy(): void {\n this.clearTabContent();\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","<div\n class=\"composer-popup\"\n [class.composer-popup--single-tab]=\"!hasMultipleTabs()\"\n>\n @if (hasMultipleTabs()) {\n <header class=\"composer-popup__header\">\n <ax-tabs look=\"default\" location=\"top\" [fitParent]=\"true\" (onActiveTabChanged)=\"onTabChange($event)\">\n @for (tab of enabledTabs(); track tab.id) {\n <ax-tab-item\n [text]=\"getTabTitle(tab.id)\"\n [key]=\"tab.id\"\n [active]=\"activeTabId() === tab.id\"\n [attr.aria-label]=\"getTabTitle(tab.id)\"\n [title]=\"getTabTitle(tab.id)\"\n >\n <ax-prefix>\n @if (tab.icon) {\n <i [class]=\"tab.icon\" aria-hidden=\"true\"></i>\n }\n </ax-prefix>\n </ax-tab-item>\n }\n </ax-tabs>\n </header>\n }\n\n <div class=\"composer-popup__content\">\n <ng-container #contentContainer></ng-container>\n </div>\n</div>\n","import type { AXConversationComposerAction } from '../../registries/composer-action.registry';\nimport type { AXConversationConfig } from '../../tokens/conversation-config.interface';\n\nexport function resolveComposerMaxFiles(\n action: Pick<AXConversationComposerAction, 'maxFiles'> | undefined,\n config: Pick<Required<AXConversationConfig>, 'maxFilesPerMessage'>,\n): number {\n return Math.max(1, action?.maxFiles ?? config.maxFilesPerMessage);\n}\n","/** Gradient wash for the default chat wallpaper (pattern tile is applied in component CSS). */\nexport const MESSAGE_LIST_LIGHT_WALLPAPER_GRADIENT = [\n 'radial-gradient(ellipse 85% 70% at 12% 0%, rgba(255, 252, 238, 0.42) 0%, transparent 48%)',\n 'radial-gradient(ellipse 88% 72% at 98% 100%, rgba(196, 218, 158, 0.72) 0%, transparent 52%)',\n 'radial-gradient(ellipse 58% 48% at 48% 38%, rgba(228, 244, 196, 0.48) 0%, transparent 58%)',\n 'linear-gradient(168deg, #d6e6b4 0%, #b4d098 30%, #94c088 54%, #a6cb94 78%, #cae4ae 100%)',\n].join(', ');\n\nexport const MESSAGE_LIST_DARK_WALLPAPER_GRADIENT = [\n 'radial-gradient(ellipse 86% 68% at 10% 6%, rgba(52, 84, 108, 0.52) 0%, transparent 58%)',\n 'radial-gradient(ellipse 78% 62% at 94% 96%, rgba(22, 36, 50, 0.62) 0%, transparent 54%)',\n 'radial-gradient(ellipse 52% 46% at 58% 32%, rgba(38, 68, 92, 0.34) 0%, transparent 56%)',\n 'linear-gradient(162deg, #16222c 0%, #0c141e 46%, #111b27 74%, #192633 100%)',\n].join(', ');\n","import type { AXConversationMessageListThemeBackground } from '../models';\nimport {\n MESSAGE_LIST_DARK_WALLPAPER_GRADIENT,\n MESSAGE_LIST_LIGHT_WALLPAPER_GRADIENT,\n} from './message-list-background.patterns';\n\nexport interface AXConversationMessageListBackgroundPreset {\n id: string;\n value: AXConversationMessageListThemeBackground;\n}\n\n/** Library default when no per-conversation or global background is set (pattern-5 tile + gradient wash). */\nexport const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND: AXConversationMessageListThemeBackground = {\n light: MESSAGE_LIST_LIGHT_WALLPAPER_GRADIENT,\n dark: MESSAGE_LIST_DARK_WALLPAPER_GRADIENT,\n};\n\n/** Predefined chat-area backgrounds for the info panel (light + dark variants). */\nexport const AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS: AXConversationMessageListBackgroundPreset[] = [\n {\n id: 'solid-default',\n value: AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND,\n },\n {\n id: 'solid-graphite',\n value: {\n light: 'rgb(var(--ax-sys-color-lighter-surface))',\n dark: 'rgb(var(--ax-sys-color-darker-surface))',\n },\n },\n {\n id: 'solid-olive',\n value: {\n light: 'rgba(132, 144, 88, 0.24)',\n dark: 'linear-gradient(165deg, rgba(163, 177, 110, 0.12) 0%, rgb(var(--ax-sys-color-darker-surface)) 70%)',\n },\n },\n {\n id: 'solid-sky',\n value: {\n light: 'rgba(56, 189, 248, 0.2)',\n dark: 'linear-gradient(165deg, rgba(14, 165, 233, 0.14) 0%, rgb(var(--ax-sys-color-darker-surface)) 72%)',\n },\n },\n {\n id: 'grad-aurora',\n value: {\n light: 'linear-gradient(140deg, #60a5fa 0%, #a78bfa 55%, #f472b6 100%)',\n dark: 'linear-gradient(140deg, rgba(30, 58, 138, 0.5) 0%, rgba(76, 29, 149, 0.38) 52%, rgb(var(--ax-sys-color-darker-surface)) 100%)',\n },\n },\n {\n id: 'grad-sunset',\n value: {\n light: 'linear-gradient(140deg, rgba(251, 113, 133, 0.34) 0%, rgba(251, 191, 36, 0.32) 100%)',\n dark: 'linear-gradient(140deg, rgba(159, 18, 57, 0.38) 0%, rgba(146, 64, 14, 0.32) 55%, rgb(var(--ax-sys-color-darker-surface)) 100%)',\n },\n },\n];\n\nexport const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID = 'solid-default';\n","import type { AXConversationMessageListBackground, AXConversationMessageListThemeBackground } from '../models';\nimport {\n MESSAGE_LIST_DARK_WALLPAPER_GRADIENT,\n MESSAGE_LIST_LIGHT_WALLPAPER_GRADIENT,\n} from './message-list-background.patterns';\nimport { AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND } from './message-list-background.presets';\n\n/** Subtle Telegram-style chat-area wash when `messageListBackground` is not set (theme-aware). */\nexport const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND =\n AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND.light;\n\nexport function isMessageListThemeBackground(\n value: unknown,\n): value is AXConversationMessageListThemeBackground {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'light' in value &&\n 'dark' in value &&\n typeof (value as AXConversationMessageListThemeBackground).light === 'string' &&\n typeof (value as AXConversationMessageListThemeBackground).dark === 'string'\n );\n}\n\n/** Pick the raw CSS string for the active theme; `undefined` when unset. */\nexport function resolveMessageListBackgroundRaw(\n value: AXConversationMessageListBackground | undefined,\n isDark: boolean,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === 'string') {\n if (value.trim() === '') {\n return undefined;\n }\n return value;\n }\n return isDark ? value.dark : value.light;\n}\n\n/** Turn bare `https://...` or `/path` into valid CSS `background` for images. */\nexport function normalizeMessageListBackgroundValue(raw: string): string {\n const v = raw.trim();\n if (v === '') {\n return AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND;\n }\n const lower = v.toLowerCase();\n if (lower === 'transparent' || lower === 'none') {\n return v;\n }\n if (/^url\\s*\\(/i.test(v)) {\n return v;\n }\n if (/^https?:\\/\\//i.test(v)) {\n const escaped = v.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return `url(\"${escaped}\") center / cover no-repeat`;\n }\n if (v.startsWith('/') && !/^(linear|radial|conic|rgb|hsl|var)\\b/i.test(v)) {\n const escaped = v.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return `url(\"${escaped}\") center / cover no-repeat`;\n }\n return v;\n}\n\n/** Whether the built-in pattern-5 wallpaper (gradient + tiled SVG) should be used. */\nexport function usesDefaultMessageListWallpaper(\n value: AXConversationMessageListBackground | undefined,\n): boolean {\n if (value === undefined) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n return (\n value.light === MESSAGE_LIST_LIGHT_WALLPAPER_GRADIENT && value.dark === MESSAGE_LIST_DARK_WALLPAPER_GRADIENT\n );\n}\n\n/** Resolve config/metadata background for the active theme, with library default fallback. */\nexport function resolveMessageListBackgroundStyle(\n value: AXConversationMessageListBackground | undefined,\n isDark: boolean,\n): string {\n const raw =\n resolveMessageListBackgroundRaw(value, isDark) ??\n resolveMessageListBackgroundRaw(AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND, isDark);\n if (raw === undefined) {\n return AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND;\n }\n return normalizeMessageListBackgroundValue(raw);\n}\n\n/** Whether two stored backgrounds represent the same preset (supports legacy string values). */\nexport function isSameMessageListBackground(\n a: AXConversationMessageListBackground | undefined,\n b: AXConversationMessageListThemeBackground,\n isDark: boolean,\n): boolean {\n if (a === undefined) {\n return false;\n }\n if (typeof a === 'string') {\n if (a === '') {\n return false;\n }\n const themeValue = isDark ? b.dark : b.light;\n return a === themeValue;\n }\n return a.light === b.light && a.dark === b.dark;\n}\n","import type { AXConversationParticipant, AXConversationUserProfile } from '../models';\n\nfunction isUserProfile(value: unknown): value is AXConversationUserProfile {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Resolves typed `profile`, falling back to legacy `metadata.profile`. */\nexport function resolveParticipantProfile(participant?: AXConversationParticipant): AXConversationUserProfile {\n if (!participant) {\n return {};\n }\n\n if (participant.profile) {\n return participant.profile;\n }\n\n const legacy = participant.metadata?.['profile'];\n return isUserProfile(legacy) ? legacy : {};\n}\n","export type AXConversationDateSeparatorKind = 'today' | 'yesterday' | 'other';\n\nexport 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 /** Resolve whether a message date should show Today, Yesterday, or a formatted date. */\n static getDateSeparatorKind(date: Date): AXConversationDateSeparatorKind {\n const today = new Date();\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n if (AXConversationDateUtilsService.isSameDay(date, today)) {\n return 'today';\n }\n if (AXConversationDateUtilsService.isSameDay(date, yesterday)) {\n return 'yesterday';\n }\n\n return 'other';\n }\n\n /**\n * Format date label for non-relative separators (localized calendar date).\n */\n static formatDateLabel(date: Date, locale?: string): string {\n return date.toLocaleDateString(locale, {\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 {\n getFileExtension,\n resolveFileCopyText,\n resolveFileTypeExtension,\n runFileTypeCopy,\n runFileTypeOpen,\n type AXFileTypeExtensionHint,\n type AXFileTypeOpenContext,\n} from '@acorex/core/file';\nimport type { AXFileTypeRegistryService } from '@acorex/core/file';\nimport type { AXConversationMessage } from '../models';\n\nasync function inferFileExtensionHintFromMessageAsync(\n message: AXConversationMessage,\n): Promise<AXFileTypeExtensionHint> {\n switch (message.payload.type) {\n case 'file': {\n const { normalizeFilePayload } = await import(\n '../plugins/message-list/components/file-renderer/file.payload'\n );\n const item = normalizeFilePayload(message.payload).files[0];\n if (!item) {\n return {};\n }\n return {\n extensionName: item.extension ?? getFileExtension(item.name),\n mimeType: item.mimeType,\n };\n }\n case 'image': {\n const { normalizeImagePayload } = await import(\n '../plugins/message-list/components/image-renderer/image.payload'\n );\n const item = normalizeImagePayload(message.payload).images[0];\n return { mimeType: item?.mimeType };\n }\n case 'video': {\n const { normalizeVideoPayload } = await import(\n '../plugins/message-list/components/video-renderer/video.payload'\n );\n const item = normalizeVideoPayload(message.payload).videos[0];\n return { mimeType: item?.mimeType };\n }\n case 'audio': {\n const { normalizeAudioPayload } = await import(\n '../plugins/message-list/components/audio-renderer/audio.payload'\n );\n const item = normalizeAudioPayload(message.payload).audios[0];\n return { mimeType: item?.mimeType };\n }\n case 'voice':\n return { mimeType: message.payload.mimeType };\n case 'sticker':\n return { mimeType: message.payload.mimeType };\n default:\n return {};\n }\n}\n\n/** Infer extension/MIME hints from a persisted message payload. */\nexport function inferFileExtensionHintFromMessage(message: AXConversationMessage): AXFileTypeExtensionHint {\n switch (message.payload.type) {\n case 'file': {\n const payload = message.payload;\n const files = Array.isArray(payload.files) ? payload.files : [];\n const item = files[0];\n if (!item) {\n return {};\n }\n return {\n extensionName: item.extension ?? getFileExtension(item.name),\n mimeType: item.mimeType,\n };\n }\n case 'image': {\n const images = Array.isArray(message.payload.images) ? message.payload.images : [];\n return { mimeType: images[0]?.mimeType };\n }\n case 'video': {\n const videos = Array.isArray(message.payload.videos) ? message.payload.videos : [];\n return { mimeType: videos[0]?.mimeType };\n }\n case 'audio': {\n const audios = Array.isArray(message.payload.audios) ? message.payload.audios : [];\n return { mimeType: audios[0]?.mimeType };\n }\n case 'voice':\n return { mimeType: message.payload.mimeType };\n case 'sticker':\n return { mimeType: message.payload.mimeType };\n default:\n return {};\n }\n}\n\n/** Use file-type `copy` on the message when `message.fileType` is set; otherwise fallback. */\nexport async function copyWithFileTypeFallback(\n message: AXConversationMessage,\n registry: AXFileTypeRegistryService,\n fallback: () => string,\n): Promise<string> {\n if (!message.fileType) {\n return fallback();\n }\n const fileType = await registry.get(message.fileType);\n if (!fileType) {\n return fallback();\n }\n const extension = resolveFileTypeExtension(fileType, await inferFileExtensionHintFromMessageAsync(message));\n const result = await runFileTypeCopy(fileType, message.payload, extension);\n return resolveFileCopyText(result)?.trim() || fallback();\n}\n\n/** Use file-type `open` on the message when `message.fileType` is set. */\nexport async function openWithFileType(\n message: AXConversationMessage,\n registry: AXFileTypeRegistryService,\n ctx: AXFileTypeOpenContext,\n): Promise<boolean> {\n if (!message.fileType) {\n return false;\n }\n const fileType = await registry.get(message.fileType);\n if (!fileType) {\n return false;\n }\n const extension = resolveFileTypeExtension(fileType, inferFileExtensionHintFromMessage(message));\n const result = await runFileTypeOpen(fileType, ctx, message.payload, extension);\n return result !== false;\n}\n","/** Inline or session-only URLs that must not be stored on message payloads or sent to APIs. */\nexport function isNonPersistableMediaUrl(url: string | undefined): boolean {\n if (!url) {\n return false;\n }\n const value = url.trim().toLowerCase();\n return value.startsWith('data:') || value.startsWith('blob:');\n}\n\n/** Thumbnail for persistence/API (never data: or blob:). */\nexport function resolvePersistedThumbnailUrl(\n thumbnailUrl: string | undefined,\n contentUrl?: string,\n): string | undefined {\n if (thumbnailUrl && !isNonPersistableMediaUrl(thumbnailUrl)) {\n return thumbnailUrl;\n }\n if (contentUrl && !isNonPersistableMediaUrl(contentUrl)) {\n return contentUrl;\n }\n return undefined;\n}\n\n/** Content URL safe to persist or bind on reload (blob:/data: are session-only). */\nexport function resolvePersistableMediaUrl(url: string | undefined): string | undefined {\n const trimmed = url?.trim();\n if (!trimmed || isNonPersistableMediaUrl(trimmed)) {\n return undefined;\n }\n return trimmed;\n}\n\n/** First non-empty URL for img/video/audio at runtime (includes resolved blob: URLs). */\nexport function pickDisplayMediaUrl(...candidates: (string | null | undefined)[]): string {\n for (const candidate of candidates) {\n const trimmed = candidate?.trim();\n if (trimmed) {\n return trimmed;\n }\n }\n return '';\n}\n","import type { AXConversationAudioMediaItem, AXConversationAudioPayload } from '../../../../models';\nimport { resolvePersistableMediaUrl } from '../../../composer/components/shared/persisted-media-url';\n\ntype AXConversationLooseRecord = Record<string, unknown>;\n\nfunction loose(payload: AXConversationAudioPayload): AXConversationLooseRecord {\n return payload as unknown as AXConversationLooseRecord;\n}\n\nfunction str(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction num(value: unknown, fallback = 0): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction sanitizeAudioItem(item: AXConversationAudioMediaItem): AXConversationAudioMediaItem {\n const url = resolvePersistableMediaUrl(item.url);\n if (url === item.url) {\n return item;\n }\n return { ...item, url };\n}\n\nexport function normalizeAudioPayload(payload: AXConversationAudioPayload): AXConversationAudioPayload {\n const raw = loose(payload);\n const existing = raw['audios'];\n if (Array.isArray(existing) && existing.length > 0) {\n return {\n type: 'audio',\n audios: (existing as AXConversationAudioMediaItem[]).map(sanitizeAudioItem),\n caption: payload.caption,\n };\n }\n\n const url = resolvePersistableMediaUrl(str(raw['url']));\n const mediaId = str(raw['mediaId']);\n if (url || mediaId) {\n return {\n type: 'audio',\n caption: payload.caption,\n audios: [\n {\n ...(url ? { url } : {}),\n title: str(raw['title']),\n duration: num(raw['duration']),\n mimeType: str(raw['mimeType']),\n size: typeof raw['size'] === 'number' ? raw['size'] : undefined,\n mediaId,\n artist: str(raw['artist']),\n coverUrl: str(raw['coverUrl']),\n waveform: Array.isArray(raw['waveform']) ? (raw['waveform'] as number[]) : undefined,\n },\n ],\n };\n }\n\n return { type: 'audio', audios: [], caption: payload.caption };\n}\n","import type { AXConversationAudioMediaItem, AXConversationFileMediaItem, AXConversationFilePayload } from '../../../../models';\nimport { resolvePersistableMediaUrl } from '../../../composer/components/shared/persisted-media-url';\n\ntype AXConversationLooseRecord = Record<string, unknown>;\n\nfunction loose(payload: AXConversationFilePayload): AXConversationLooseRecord {\n return payload as unknown as AXConversationLooseRecord;\n}\n\nfunction str(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction resolveFileThumbnailUrl(thumbnailUrl: string | undefined, contentUrl: string | undefined): string | undefined {\n const thumb = resolvePersistableMediaUrl(thumbnailUrl);\n return thumb && thumb !== contentUrl ? thumb : undefined;\n}\n\nfunction sanitizeFileItem(item: AXConversationFileMediaItem): AXConversationFileMediaItem {\n const persistableUrl = resolvePersistableMediaUrl(item.url);\n const url = persistableUrl ?? item.url;\n const thumbnailUrl = resolveFileThumbnailUrl(item.thumbnailUrl, persistableUrl);\n if (url === item.url && thumbnailUrl === item.thumbnailUrl) {\n return item;\n }\n return { ...item, url, thumbnailUrl };\n}\n\nconst audioMediaByFile = new WeakMap<AXConversationFileMediaItem, AXConversationAudioMediaItem>();\n\nfunction resolveFileAudioDuration(item: AXConversationFileMediaItem): number {\n const durationFromMeta = item.metadata?.['duration'];\n return (\n item.duration ??\n (typeof durationFromMeta === 'number' && Number.isFinite(durationFromMeta) ? durationFromMeta : 0)\n );\n}\n\nexport function fileItemAsAudioMedia(item: AXConversationFileMediaItem): AXConversationAudioMediaItem {\n const duration = resolveFileAudioDuration(item);\n const cached = audioMediaByFile.get(item);\n if (\n cached &&\n cached.url === item.url &&\n cached.mediaId === item.mediaId &&\n cached.mimeType === item.mimeType &&\n cached.size === item.size &&\n cached.metadata === item.metadata &&\n cached.duration === duration &&\n cached.title === item.name &&\n cached.coverUrl === item.thumbnailUrl\n ) {\n return cached;\n }\n\n const next: AXConversationAudioMediaItem = {\n url: item.url,\n mediaId: item.mediaId,\n mimeType: item.mimeType,\n size: item.size,\n metadata: item.metadata,\n duration,\n title: item.name,\n coverUrl: item.thumbnailUrl,\n };\n audioMediaByFile.set(item, next);\n return next;\n}\n\nexport function normalizeFilePayload(payload: AXConversationFilePayload): AXConversationFilePayload {\n const raw = loose(payload);\n const existing = raw['files'];\n if (Array.isArray(existing) && existing.length > 0) {\n return {\n type: 'file',\n files: (existing as AXConversationFileMediaItem[]).map(sanitizeFileItem),\n caption: payload.caption,\n };\n }\n\n const url = resolvePersistableMediaUrl(str(raw['url']));\n const mediaId = str(raw['mediaId']);\n if (url || mediaId) {\n return {\n type: 'file',\n caption: payload.caption,\n files: [\n {\n ...(url ? { url } : {}),\n name: str(raw['name']) ?? 'file',\n mimeType: str(raw['mimeType']) ?? 'application/octet-stream',\n size: typeof raw['size'] === 'number' ? raw['size'] : undefined,\n mediaId,\n thumbnailUrl: resolveFileThumbnailUrl(str(raw['thumbnailUrl']), url),\n extension: str(raw['extension']),\n },\n ],\n };\n }\n\n return { type: 'file', files: [], caption: payload.caption };\n}\n","import type { AXConversationImageMediaItem, AXConversationImagePayload } from '../../../../models';\nimport {\n resolvePersistableMediaUrl,\n resolvePersistedThumbnailUrl,\n} from '../../../composer/components/shared/persisted-media-url';\n\ntype AXConversationLooseRecord = Record<string, unknown>;\n\nfunction loose(payload: AXConversationImagePayload): AXConversationLooseRecord {\n return payload as unknown as AXConversationLooseRecord;\n}\n\nfunction str(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction num(value: unknown, fallback = 0): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction sanitizeImageItem(item: AXConversationImageMediaItem): AXConversationImageMediaItem {\n const url = resolvePersistableMediaUrl(item.url);\n const thumbnailUrl = resolvePersistedThumbnailUrl(item.thumbnailUrl, url);\n if (url === item.url && thumbnailUrl === item.thumbnailUrl) {\n return item;\n }\n return { ...item, url, thumbnailUrl };\n}\n\n/** Format image message payload for rendering (array shape, safe thumbnails). */\nexport function normalizeImagePayload(payload: AXConversationImagePayload): AXConversationImagePayload {\n const raw = loose(payload);\n const existing = raw['images'];\n if (Array.isArray(existing) && existing.length > 0) {\n return {\n type: 'image',\n images: (existing as AXConversationImageMediaItem[]).map(sanitizeImageItem),\n caption: payload.caption,\n };\n }\n\n const url = resolvePersistableMediaUrl(str(raw['url']));\n const mediaId = str(raw['mediaId']);\n if (url || mediaId) {\n return {\n type: 'image',\n caption: payload.caption,\n images: [\n {\n ...(url ? { url } : {}),\n thumbnailUrl: resolvePersistedThumbnailUrl(str(raw['thumbnailUrl']), url),\n width: num(raw['width']),\n height: num(raw['height']),\n mimeType: str(raw['mimeType']),\n size: typeof raw['size'] === 'number' ? raw['size'] : undefined,\n mediaId,\n blurhash: str(raw['blurhash']),\n },\n ],\n };\n }\n\n return { type: 'image', images: [], caption: payload.caption };\n}\n\n/** Preferred URL for grid / lightbox (never inline base64 thumbnails). */\nexport function resolveImageDisplayUrl(image: AXConversationImageMediaItem): string | undefined {\n return resolvePersistedThumbnailUrl(image.thumbnailUrl, image.url) ?? image.url;\n}\n","import type { AXConversationVideoMediaItem, AXConversationVideoPayload } from '../../../../models';\nimport {\n resolvePersistableMediaUrl,\n resolvePersistedThumbnailUrl,\n} from '../../../composer/components/shared/persisted-media-url';\n\ntype AXConversationLooseRecord = Record<string, unknown>;\n\nfunction loose(payload: AXConversationVideoPayload): AXConversationLooseRecord {\n return payload as unknown as AXConversationLooseRecord;\n}\n\nfunction str(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction num(value: unknown, fallback = 0): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction sanitizeVideoItem(item: AXConversationVideoMediaItem): AXConversationVideoMediaItem {\n const url = resolvePersistableMediaUrl(item.url);\n const thumbnailUrl = resolvePersistedThumbnailUrl(item.thumbnailUrl, url);\n if (url === item.url && thumbnailUrl === item.thumbnailUrl) {\n return item;\n }\n return { ...item, url, thumbnailUrl };\n}\n\nexport function normalizeVideoPayload(payload: AXConversationVideoPayload): AXConversationVideoPayload {\n const raw = loose(payload);\n const existing = raw['videos'];\n if (Array.isArray(existing) && existing.length > 0) {\n return {\n type: 'video',\n videos: (existing as AXConversationVideoMediaItem[]).map(sanitizeVideoItem),\n caption: payload.caption,\n };\n }\n\n const url = resolvePersistableMediaUrl(str(raw['url']));\n const mediaId = str(raw['mediaId']);\n if (url || mediaId) {\n return {\n type: 'video',\n caption: payload.caption,\n videos: [\n {\n ...(url ? { url } : {}),\n thumbnailUrl: resolvePersistedThumbnailUrl(str(raw['thumbnailUrl']), url),\n duration: num(raw['duration']),\n width: num(raw['width']),\n height: num(raw['height']),\n mimeType: str(raw['mimeType']),\n size: typeof raw['size'] === 'number' ? raw['size'] : undefined,\n mediaId,\n },\n ],\n };\n }\n\n return { type: 'video', videos: [], caption: payload.caption };\n}\n","import type {\n AXConversationAudioMediaItem,\n AXConversationAudioPayload,\n AXConversationFilePayload,\n AXConversationImageMediaItem,\n AXConversationImagePayload,\n AXConversationMessage,\n AXConversationStickerPayload,\n AXConversationTextPayload,\n AXConversationVideoMediaItem,\n AXConversationVideoPayload,\n} from '../models';\nimport type { AXConversation, AXConversationParticipant } from '../models';\nimport type { AXConversationApi } from '../services/api';\nimport { resolvePrivatePeerUserId } from './avatar-context.utils';\nimport { resolveParticipantProfile } from './participant-profile.utils';\nimport { resolvePersistedThumbnailUrl } from '../plugins/composer/components/shared/persisted-media-url';\nimport { normalizeAudioPayload } from '../plugins/message-list/components/audio-renderer/audio.payload';\nimport { normalizeFilePayload } from '../plugins/message-list/components/file-renderer/file.payload';\nimport { normalizeImagePayload, resolveImageDisplayUrl } from '../plugins/message-list/components/image-renderer/image.payload';\nimport { normalizeVideoPayload } from '../plugins/message-list/components/video-renderer/video.payload';\n\nexport interface AXConversationInfoProfileField {\n id: string;\n labelKey: string;\n value: string;\n icon: string;\n}\n\nexport type AXConversationMediaCategoryId =\n | 'image'\n | 'video'\n | 'file'\n | 'audio'\n | 'voice'\n | 'sticker'\n | 'location'\n | 'link';\n\nexport interface AXConversationMediaCategory {\n id: AXConversationMediaCategoryId;\n labelKey: string;\n countLabelKey: string;\n icon: string;\n count: number;\n}\n\nconst AX_CONVERSATION_URL_PATTERN = /https?:\\/\\/[^\\s<>\"']+/i;\n\nexport function messageContainsLink(message: AXConversationMessage): boolean {\n return countLinksInMessage(message) > 0;\n}\n\nfunction countLinksInMessage(message: AXConversationMessage): number {\n if (message.type !== 'text') {\n return 0;\n }\n const payload = message.payload as AXConversationTextPayload;\n if (payload.links?.length) {\n return payload.links.length;\n }\n const text = payload.text ?? '';\n const matches = text.match(new RegExp(AX_CONVERSATION_URL_PATTERN.source, 'gi'));\n return matches?.length ?? 0;\n}\n\nfunction countMediaItemsInMessage(message: AXConversationMessage): Partial<Record<AXConversationMediaCategoryId, number>> {\n const linkCount = countLinksInMessage(message);\n if (linkCount > 0) {\n return { link: linkCount };\n }\n\n switch (message.type) {\n case 'image': {\n const count = normalizeImagePayload(message.payload as AXConversationImagePayload).images.length;\n return count > 0 ? { image: count } : {};\n }\n case 'video': {\n const count = normalizeVideoPayload(message.payload as AXConversationVideoPayload).videos.length;\n return count > 0 ? { video: count } : {};\n }\n case 'audio': {\n const count = normalizeAudioPayload(message.payload as AXConversationAudioPayload).audios.length;\n return count > 0 ? { audio: count } : {};\n }\n case 'file': {\n const count = normalizeFilePayload(message.payload as AXConversationFilePayload).files.length;\n return count > 0 ? { file: count } : {};\n }\n case 'voice':\n return { voice: 1 };\n case 'sticker':\n return { sticker: 1 };\n case 'location':\n return { location: 1 };\n default:\n return {};\n }\n}\n\nexport function getPrivatePeerParticipant(\n conversation: AXConversation,\n currentUserId?: string,\n): AXConversationParticipant | undefined {\n const peerId = resolvePrivatePeerUserId(conversation, currentUserId);\n if (!peerId) return undefined;\n return conversation.participants.find((p) => p.id === peerId);\n}\n\nexport function getConversationProfileFields(\n conversation: AXConversation,\n currentUserId?: string,\n): AXConversationInfoProfileField[] {\n const fields: AXConversationInfoProfileField[] = [];\n\n if (conversation.type === 'private') {\n const peer = getPrivatePeerParticipant(conversation, currentUserId);\n const profile = resolveParticipantProfile(peer);\n\n const addField = (id: string, labelKey: string, icon: string, value: string | undefined): void => {\n if (value?.trim()) {\n fields.push({ id, labelKey, icon, value: value.trim() });\n }\n };\n\n addField('bio', '@acorex:chat.info-panel.profile.bio', 'fa-light fa-align-left', profile.bio);\n addField('phone', '@acorex:chat.info-panel.profile.phone', 'fa-light fa-phone', profile.phone);\n addField('email', '@acorex:chat.info-panel.profile.email', 'fa-light fa-envelope', profile.email);\n addField('username', '@acorex:chat.info-panel.profile.username', 'fa-light fa-at', profile.username);\n addField('location', '@acorex:chat.info-panel.profile.location', 'fa-light fa-location-dot', profile.location);\n addField('company', '@acorex:chat.info-panel.profile.company', 'fa-light fa-building', profile.company);\n addField('title', '@acorex:chat.info-panel.profile.title', 'fa-light fa-briefcase', profile.title);\n\n if (peer?.description?.trim()) {\n fields.unshift({\n id: 'description',\n labelKey: '@acorex:chat.info-panel.profile.about',\n icon: 'fa-light fa-user',\n value: peer.description.trim(),\n });\n }\n } else if (conversation.description?.trim()) {\n fields.push({\n id: 'description',\n labelKey: '@acorex:chat.info-panel.profile.about',\n icon: 'fa-light fa-align-left',\n value: conversation.description.trim(),\n });\n }\n\n const groupInfo = (conversation.metadata?.['profile'] as { groupInfo?: { purpose?: string } } | undefined)?.groupInfo;\n if (groupInfo?.purpose?.trim()) {\n fields.push({\n id: 'purpose',\n labelKey: '@acorex:chat.info-panel.profile.purpose',\n icon: 'fa-light fa-bullseye',\n value: groupInfo.purpose.trim(),\n });\n }\n\n return fields;\n}\n\nexport function getConversationMediaCategories(messages: AXConversationMessage[]): AXConversationMediaCategory[] {\n const counts: Record<AXConversationMediaCategoryId, number> = {\n image: 0,\n video: 0,\n file: 0,\n audio: 0,\n voice: 0,\n sticker: 0,\n location: 0,\n link: 0,\n };\n\n for (const message of messages) {\n const itemCounts = countMediaItemsInMessage(message);\n for (const [categoryId, count] of Object.entries(itemCounts) as Array<[AXConversationMediaCategoryId, number]>) {\n counts[categoryId] += count;\n }\n }\n\n const definitions: Array<Omit<AXConversationMediaCategory, 'count'>> = [\n {\n id: 'image',\n labelKey: '@acorex:chat.info-panel.media.photos',\n countLabelKey: '@acorex:chat.info-panel.media.count-photos',\n icon: 'fa-light fa-image',\n },\n {\n id: 'video',\n labelKey: '@acorex:chat.info-panel.media.videos',\n countLabelKey: '@acorex:chat.info-panel.media.count-videos',\n icon: 'fa-light fa-video',\n },\n {\n id: 'file',\n labelKey: '@acorex:chat.info-panel.media.files',\n countLabelKey: '@acorex:chat.info-panel.media.count-files',\n icon: 'fa-light fa-file',\n },\n {\n id: 'audio',\n labelKey: '@acorex:chat.info-panel.media.audio',\n countLabelKey: '@acorex:chat.info-panel.media.count-audio',\n icon: 'fa-light fa-headphones',\n },\n {\n id: 'link',\n labelKey: '@acorex:chat.info-panel.media.links',\n countLabelKey: '@acorex:chat.info-panel.media.count-links',\n icon: 'fa-light fa-link',\n },\n {\n id: 'voice',\n labelKey: '@acorex:chat.info-panel.media.voice',\n countLabelKey: '@acorex:chat.info-panel.media.count-voice',\n icon: 'fa-light fa-microphone',\n },\n {\n id: 'sticker',\n labelKey: '@acorex:chat.info-panel.media.stickers',\n countLabelKey: '@acorex:chat.info-panel.media.count-stickers',\n icon: 'fa-light fa-note-sticky',\n },\n {\n id: 'location',\n labelKey: '@acorex:chat.info-panel.media.locations',\n countLabelKey: '@acorex:chat.info-panel.media.count-locations',\n icon: 'fa-light fa-location-dot',\n },\n ];\n\n return definitions\n .map((definition) => ({ ...definition, count: counts[definition.id] }))\n .filter((category) => category.count > 0);\n}\n\nexport function filterMessagesByMediaCategory(\n messages: AXConversationMessage[],\n categoryId: AXConversationMediaCategoryId,\n): AXConversationMessage[] {\n return messages.filter((message) => {\n if (categoryId === 'link') {\n return messageContainsLink(message);\n }\n return message.type === categoryId;\n });\n}\n\nexport function isGridMediaCategory(categoryId: AXConversationMediaCategoryId): boolean {\n return categoryId === 'image' || categoryId === 'sticker';\n}\n\nexport function isAttachmentListCategory(categoryId: AXConversationMediaCategoryId): boolean {\n return categoryId === 'video' || categoryId === 'audio';\n}\n\nexport interface AXConversationMediaGalleryTile {\n key: string;\n message: AXConversationMessage;\n kind: 'image' | 'video' | 'sticker';\n image?: AXConversationImageMediaItem;\n video?: AXConversationVideoMediaItem;\n stickerUrl?: string;\n stickerAlt?: string;\n}\n\nexport function buildMediaGalleryTiles(\n messages: AXConversationMessage[],\n categoryId: AXConversationMediaCategoryId,\n): AXConversationMediaGalleryTile[] {\n const filtered = filterMessagesByMediaCategory(messages, categoryId);\n const tiles: AXConversationMediaGalleryTile[] = [];\n\n for (const message of filtered) {\n if (categoryId === 'image') {\n const payload = normalizeImagePayload(message.payload as AXConversationImagePayload);\n for (const image of payload.images) {\n tiles.push({\n key: `${message.id}:${image.mediaId ?? image.url ?? tiles.length}`,\n message,\n kind: 'image',\n image,\n });\n }\n continue;\n }\n\n if (categoryId === 'video') {\n const payload = normalizeVideoPayload(message.payload as AXConversationVideoPayload);\n for (const video of payload.videos) {\n tiles.push({\n key: `${message.id}:${video.mediaId ?? video.url ?? tiles.length}`,\n message,\n kind: 'video',\n video,\n });\n }\n continue;\n }\n\n if (categoryId === 'sticker') {\n const payload = message.payload as AXConversationStickerPayload;\n tiles.push({\n key: message.id,\n message,\n kind: 'sticker',\n stickerUrl: payload.url,\n stickerAlt: payload.emoji || 'Sticker',\n });\n }\n }\n\n return tiles;\n}\n\nexport function resolveVideoThumbnailUrl(video: AXConversationVideoMediaItem): string | undefined {\n return resolvePersistedThumbnailUrl(video.thumbnailUrl, video.url) ?? video.url;\n}\n\nexport function resolveGalleryImageUrl(image: AXConversationImageMediaItem): string | undefined {\n return resolveImageDisplayUrl(image);\n}\n\nexport function getMessageVideoItems(message: AXConversationMessage): AXConversationVideoMediaItem[] {\n if (message.type !== 'video') {\n return [];\n }\n return normalizeVideoPayload(message.payload as AXConversationVideoPayload).videos;\n}\n\nexport function getMessageAudioItems(message: AXConversationMessage): AXConversationAudioMediaItem[] {\n if (message.type !== 'audio') {\n return [];\n }\n return normalizeAudioPayload(message.payload as AXConversationAudioPayload).audios;\n}\n\nexport interface AXConversationMediaPageResult {\n items: AXConversationMessage[];\n hasMore: boolean;\n nextCursor?: string;\n page: number;\n}\n\nconst AX_INFO_PANEL_MEDIA_PAGE_SIZE = 50;\n\nexport async function fetchConversationMediaPage(\n conversationApi: AXConversationApi,\n conversationId: string,\n page: number,\n pageSize = AX_INFO_PANEL_MEDIA_PAGE_SIZE,\n cursor?: string,\n): Promise<AXConversationMediaPageResult> {\n const result = await conversationApi.getConversationMedia(conversationId, {\n page,\n pageSize,\n cursor,\n });\n\n const items: AXConversationMessage[] = [];\n const seenIds = new Set<string>();\n\n for (const item of result.items) {\n const message = item as AXConversationMessage;\n if (message?.id && !seenIds.has(message.id)) {\n seenIds.add(message.id);\n items.push(message);\n }\n }\n\n return {\n items,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n page,\n };\n}\n\n/** Merge media API results with in-memory messages needed for link/sticker/voice/location tabs. */\nexport function mergeInfoPanelMessages(\n mediaMessages: AXConversationMessage[],\n supplemental: AXConversationMessage[],\n): AXConversationMessage[] {\n const byId = new Map<string, AXConversationMessage>();\n for (const message of mediaMessages) {\n byId.set(message.id, message);\n }\n for (const message of supplemental) {\n if (!byId.has(message.id)) {\n byId.set(message.id, message);\n }\n }\n return Array.from(byId.values()).sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n}\n\nexport function filterSupplementalInfoPanelMessages(messages: AXConversationMessage[]): AXConversationMessage[] {\n return messages.filter(\n (message) =>\n message.type === 'voice' ||\n message.type === 'sticker' ||\n message.type === 'location' ||\n (message.type === 'text' && messageContainsLink(message)),\n );\n}\n","/**\n * AXConversationMessageListService\n * Facade/service for Message List to interact with conversation and registries.\n */\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { AXSystemEvents, AXEventService } from '@acorex/core/events';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { filter, map, merge, startWith } from 'rxjs';\nimport { AXConversationMessage } from '../../models';\nimport type { AXConversationMessageRendererComponent } from '../../registries/message-renderer.registry';\nimport { AXConversationService } from '../../services';\nimport { AXConversationDateSeparatorKind, AXConversationDateUtilsService } from '../../utils';\n\nexport interface AXConversationMessageDateGroup {\n date: string;\n dateKind: AXConversationDateSeparatorKind;\n dateLabel?: string;\n messages: AXConversationMessage[];\n}\n\n@Injectable()\nexport class AXConversationMessageListService {\n private readonly conversationService = inject(AXConversationService);\n private readonly translation = inject(AXTranslationService);\n private readonly eventService = inject(AXEventService);\n private readonly activeLocale = toSignal(this.translation.langChanges$, {\n initialValue: this.translation.getActiveLang(),\n });\n private readonly translationRevision = toSignal(\n merge(\n this.translation.langChanges$,\n this.eventService.onEvent.pipe(\n filter((event) => event.type === AXSystemEvents.AXLanguageLoaded),\n map(() => this.translation.getActiveLang()),\n ),\n ).pipe(startWith(this.translation.getActiveLang())),\n { initialValue: this.translation.getActiveLang() },\n );\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 /** Initial message history load (conversation switch) */\n readonly loading = this.conversationService.loadingActiveMessages;\n\n /** Loading older messages (scroll-up pagination) */\n readonly loadingMore = signal(false);\n\n /** Whether older messages can be loaded */\n readonly hasMoreMessages = computed(() => this.conversationService.activeMessagesPagination().hasMore);\n\n /** Show scroll to bottom button */\n readonly showScrollButton = signal(false);\n\n /** Scroll requests counter */\n readonly scrollRequests = signal(0);\n\n /** Live renderer instances keyed by message id (for message actions). */\n private readonly _rendererInstances = new Map<string, AXConversationMessageRendererComponent>();\n\n /**\n * Reply counts merged from API fields and loaded messages.\n */\n readonly replyCounts = computed(() => this.buildCountMap('reply'));\n\n /**\n * Forward counts merged from API fields and loaded messages.\n */\n readonly forwardCounts = computed(() => this.buildCountMap('forward'));\n\n registerRendererInstance(messageId: string, instance: AXConversationMessageRendererComponent): void {\n this._rendererInstances.set(messageId, instance);\n }\n\n unregisterRendererInstance(messageId: string): void {\n this._rendererInstances.delete(messageId);\n }\n\n getRendererInstance(messageId: string): AXConversationMessageRendererComponent | undefined {\n return this._rendererInstances.get(messageId);\n }\n\n getReplyCount(messageId: string): number {\n return this.replyCounts().get(messageId) ?? 0;\n }\n\n getForwardCount(messageId: string): number {\n return this.forwardCounts().get(messageId) ?? 0;\n }\n\n /** Message grouped by date */\n readonly messageGroups = computed((): AXConversationMessageDateGroup[] => {\n const locale = this.activeLocale();\n this.translationRevision();\n const messages = this.activeMessages();\n const groups = new Map<string, AXConversationMessage[]>();\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, groupMessages]) => {\n const date = new Date(dateKey);\n const dateKind = AXConversationDateUtilsService.getDateSeparatorKind(date);\n\n return {\n date: dateKey,\n dateKind,\n dateLabel:\n dateKind === 'other'\n ? AXConversationDateUtilsService.formatDateLabel(date, locale)\n : undefined,\n messages: groupMessages,\n };\n });\n });\n\n /**\n * Load older messages when the user scrolls near the top.\n */\n async loadMoreMessages(): Promise<boolean> {\n if (!this.hasMoreMessages() || this.loadingMore() || this.loading()) {\n return false;\n }\n\n const conversation = this.activeConversation();\n if (!conversation) {\n return false;\n }\n\n const { page } = this.conversationService.activeMessagesPagination();\n const nextPage = page + 1;\n\n this.loadingMore.set(true);\n try {\n const result = await this.conversationService.loadMessages(conversation.id, nextPage);\n return result.items.length > 0 || result.hasMore;\n } finally {\n this.loadingMore.set(false);\n }\n }\n\n /**\n * Reset pagination when switching conversations (page 0 is loaded by {@link AXConversationService.selectConversation}).\n */\n resetPagination(): void {\n // Pagination state lives on AXConversationService; this hook remains for conversation-switch effects.\n }\n\n getMenuActions(message: AXConversationMessage) {\n const user = this.currentUser();\n if (!user) return [];\n return this.registry.messageActions.getMenuActions(message, user);\n }\n\n async executeAction(message: AXConversationMessage, 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 renderer: this.getRendererInstance(message.id),\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 private buildCountMap(kind: 'reply' | 'forward'): Map<string, number> {\n const messages = this.activeMessages();\n const counts = new Map<string, number>();\n\n for (const message of messages) {\n const fromApi = kind === 'reply' ? message.replyCount : message.forwardCount;\n if (fromApi != null) {\n counts.set(message.id, fromApi);\n }\n }\n\n for (const message of messages) {\n if (kind === 'reply' && message.replyTo?.id) {\n const targetId = message.replyTo.id;\n counts.set(targetId, (counts.get(targetId) ?? 0) + 1);\n }\n if (kind === 'forward' && message.forwardedFrom?.messageId) {\n const targetId = message.forwardedFrom.messageId;\n counts.set(targetId, (counts.get(targetId) ?? 0) + 1);\n }\n }\n\n return counts;\n }\n}\n","const AX_PASTED_FILE_MIME_BY_EXTENSION: Record<string, string> = {\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n bmp: 'image/bmp',\n ico: 'image/x-icon',\n avif: 'image/avif',\n heic: 'image/heic',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n avi: 'video/x-msvideo',\n mkv: 'video/x-matroska',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n m4a: 'audio/mp4',\n aac: 'audio/aac',\n flac: 'audio/flac',\n pdf: 'application/pdf',\n zip: 'application/zip',\n rar: 'application/vnd.rar',\n '7z': 'application/x-7z-compressed',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n txt: 'text/plain',\n};\n\nfunction inferMimeFromFileName(name: string): string {\n const ext = name.split('.').pop()?.trim().toLowerCase() ?? '';\n return AX_PASTED_FILE_MIME_BY_EXTENSION[ext] ?? 'application/octet-stream';\n}\n\nfunction defaultPastedFileName(type: string): string {\n if (type.startsWith('image/')) {\n return 'image.png';\n }\n if (type.startsWith('video/')) {\n return 'video.mp4';\n }\n if (type.startsWith('audio/')) {\n return 'audio.mp3';\n }\n return 'file';\n}\n\n/** Explorer/OS paste often has an empty MIME type; catalogs reject that. */\nfunction snapshotPastedFile(file: File): File {\n const type = file.type.trim() || inferMimeFromFileName(file.name);\n const name = file.name.trim() || defaultPastedFileName(type);\n if (file.type === type && file.name === name) {\n return file;\n }\n return new File([file], name, { type, lastModified: file.lastModified });\n}\n\n/** Extract OS-copied files from a paste event (e.g. Ctrl+V after copying a file in Explorer). */\nexport function filesFromClipboardEvent(event: ClipboardEvent): File[] {\n const files: File[] = [];\n const seen = new Set<string>();\n\n const add = (file: File | null | undefined): void => {\n if (!file) {\n return;\n }\n const snapshotted = snapshotPastedFile(file);\n const key = `${snapshotted.name}:${snapshotted.size}:${snapshotted.type}:${snapshotted.lastModified}`;\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n files.push(snapshotted);\n };\n\n const list = event.clipboardData?.files;\n if (list?.length) {\n for (let i = 0; i < list.length; i++) {\n add(list.item(i));\n }\n }\n\n const items = event.clipboardData?.items;\n if (items?.length) {\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.kind === 'file') {\n add(item.getAsFile());\n }\n }\n }\n\n return files;\n}\n","/** Active composer picker paste handlers (top-most popup wins). */\nexport type AXConversationPickerPasteHandler = (files: File[]) => void;\n\nconst activePickerPasteHandlers: AXConversationPickerPasteHandler[] = [];\n\nexport function registerComposerPickerPasteHandler(handler: AXConversationPickerPasteHandler): () => void {\n activePickerPasteHandlers.push(handler);\n return () => {\n const index = activePickerPasteHandlers.lastIndexOf(handler);\n if (index >= 0) {\n activePickerPasteHandlers.splice(index, 1);\n }\n };\n}\n\nexport function getActiveComposerPickerPasteHandler(): AXConversationPickerPasteHandler | undefined {\n return activePickerPasteHandlers.at(-1);\n}\n","/**\n * Shared upload state and helpers for composer media pickers.\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport { AXToastService } from '@acorex/components/toast';\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { formatFileSizeBytes } from '@acorex/core/file';\nimport type { AXTranslationService } from '@acorex/core/translation';\nimport type { AXValidationRuleResult } from '@acorex/core/validation';\nimport type { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport type { AXConversationUploaderReference } from '../../../../models/conversation-upload.types';\n\nlet pickerUploadItemIdSeq = 0;\n\n/** Stable id for `@for` tracking while upload state is patched immutably. */\nexport function createPickerUploadItemId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n pickerUploadItemIdSeq += 1;\n return `picker-upload-${pickerUploadItemIdSeq}`;\n}\n\nexport interface AXConversationComposerPickerUploadItem {\n id: string;\n file: File;\n preview?: string;\n duration?: number;\n uploadProgress?: number;\n uploading?: boolean;\n uploaded?: boolean;\n uploadedUrl?: string;\n mediaId?: string;\n error?: string;\n abortController?: AbortController;\n}\n\nexport function getPickerCancelUploadLabel(translation: AXTranslationService): string {\n return translation.translateSync('@acorex:chat.pickers.common.cancel-upload');\n}\n\nexport function abortPickerUploads(items: Iterable<{ abortController?: AbortController } | null | undefined>): void {\n for (const item of items) {\n const controller = item?.abortController;\n if (controller && !controller.signal.aborted) {\n controller.abort();\n }\n }\n}\n\nexport interface AXConversationCleanupPickerUploadsOptions {\n retainUploaded?: boolean;\n}\n\n/** Upload finished; reference is {@link mediaId} and/or a non-empty session url. */\nexport function isPickerItemReadyToSend(\n item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId'>,\n): boolean {\n return !!item.uploaded && !!(item.mediaId || item.uploadedUrl?.trim());\n}\n\n/** Build uploader result shape for {@link *ItemFromUpload} after picker upload. */\nexport function pickerItemToUploadResult(\n item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId' | 'file'>,\n): { url: string; mediaId?: string; mimeType: string; size: number } | null {\n if (!isPickerItemReadyToSend(item)) {\n return null;\n }\n return {\n url: item.uploadedUrl?.trim() ?? '',\n mediaId: item.mediaId,\n mimeType: item.file.type,\n size: item.file.size,\n };\n}\n\nexport function pickerItemToMediaReference(\n item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId' | 'file'>,\n): AXConversationUploaderReference | null {\n if (!isPickerItemReadyToSend(item)) {\n return null;\n }\n return {\n url: item.uploadedUrl,\n mediaId: item.mediaId,\n mimeType: item.file.type,\n size: item.file.size,\n };\n}\n\nexport async function deleteUploadedPickerMedia(\n uploader: AXUploaderService,\n items: Iterable<AXConversationComposerPickerUploadItem | null | undefined>,\n): Promise<void> {\n const tasks: Promise<void>[] = [];\n for (const item of items) {\n const reference = item ? pickerItemToMediaReference(item) : null;\n if (reference) {\n tasks.push(\n uploader.deleteMedia(reference).catch(() => {\n /* ignore cleanup failures */\n }),\n );\n }\n }\n await Promise.all(tasks);\n}\n\nexport function cleanupPickerUploads(\n uploader: AXUploaderService,\n items: Iterable<AXConversationComposerPickerUploadItem | null | undefined>,\n options?: AXConversationCleanupPickerUploadsOptions,\n): void {\n abortPickerUploads(items);\n if (!options?.retainUploaded) {\n void deleteUploadedPickerMedia(uploader, items);\n }\n revokePickerBlobPreviews(items);\n}\n\nexport function revokePickerBlobPreviews(items: Iterable<{ preview?: string } | null | undefined>): void {\n if (typeof URL === 'undefined' || typeof URL.revokeObjectURL !== 'function') {\n return;\n }\n for (const item of items) {\n const preview = item?.preview;\n if (preview?.startsWith('blob:')) {\n URL.revokeObjectURL(preview);\n }\n }\n}\n\nexport function isUploadAborted(error: unknown, signal?: AbortSignal): boolean {\n if (signal?.aborted) {\n return true;\n }\n const code = (error as { code?: string } | null)?.code;\n return code === 'UPLOAD_ABORTED' || code === 'RESOLVE_ABORTED';\n}\n\nexport function limitFilesToCapacity(files: File[], currentCount: number, maxFiles: number): File[] {\n return files.slice(0, Math.max(0, maxFiles - currentCount));\n}\n\nexport async function uploadPickerFile(\n uploader: AXUploaderService,\n conversationId: string,\n file: File,\n onProgress: (percent: number) => void,\n signal?: AbortSignal,\n): Promise<{ url: string; mediaId?: string; mimeType: string; size: number }> {\n return uploader.upload({\n source: file,\n fileName: file.name,\n mimeType: file.type,\n onProgress,\n signal,\n metadata: { conversationId },\n });\n}\n\nexport function notifyMaxFilesCapacityExceeded(\n toast: AXToastService,\n translation: AXTranslationService,\n maxFiles: number,\n): void {\n toast.warning(\n translation.translateSync('@acorex:chat.errors.max-files-per-message', {\n params: { count: maxFiles },\n }),\n );\n}\n\n/** User-facing message for a file validation failure. */\nexport function formatPickerValidationMessage(\n translation: AXTranslationService,\n file: File,\n error: AXValidationRuleResult | undefined,\n): string {\n if (!error) {\n return translation.translateSync('@acorex:chat.errors.upload-failed');\n }\n\n const maxSize = typeof error['maxSize'] === 'number' ? error['maxSize'] : undefined;\n const minSize = typeof error['minSize'] === 'number' ? error['minSize'] : undefined;\n\n switch (error.rule) {\n case 'fileMaxSize':\n return translation.translateSync('@acorex:chat.errors.file-size-exceeds-limit', {\n params: {\n fileName: file.name,\n fileSize: formatFileSizeBytes(file.size),\n maxSize: formatFileSizeBytes(maxSize ?? 0),\n },\n });\n case 'fileMinSize':\n return translation.translateSync('@acorex:chat.errors.file-below-minimum-size', {\n params: {\n fileName: file.name,\n minSize: formatFileSizeBytes(minSize ?? 0),\n },\n });\n case 'fileMimeType':\n return translation.translateSync('@acorex:chat.errors.file-type-not-allowed', {\n params: {\n fileName: file.name,\n fileType: (file.type || 'unknown').trim() || 'unknown',\n },\n });\n default:\n return error.message?.trim()\n ? file.name\n ? `${file.name}: ${error.message}`\n : error.message\n : translation.translateSync('@acorex:chat.errors.upload-failed');\n }\n}\n\n/** Show a warning toast for each failed validation rule result. */\nexport function notifyPickerValidationErrors(\n toast: AXToastService,\n translation: AXTranslationService,\n rejected: { file: File; errors: AXValidationRuleResult[] }[],\n): void {\n for (const { file, errors } of rejected) {\n toast.warning(formatPickerValidationMessage(translation, file, errors[0]));\n }\n}\n\n/** Close popup/action-sheet host or inline composer shell after send/cancel. */\nexport function dismissComposerPickerHost(\n composerService: AXConversationComposerService,\n popupRef?: AXPopupRef | null,\n actionSheetRef?: AXActionSheetRef | null,\n): void {\n if (popupRef) {\n popupRef.close();\n return;\n }\n if (actionSheetRef) {\n actionSheetRef.close();\n return;\n }\n composerService.hideComponent();\n}\n","import type { AXConversationComposerService } from '../composer/composer.service';\nimport type { AXConversationComposerAction } from '../../registries/composer-action.registry';\n\nexport async function openComposerPickerPopup(\n composerService: AXConversationComposerService,\n action: AXConversationComposerAction,\n files: File[],\n): Promise<void> {\n if (files.length === 0) {\n return;\n }\n\n await composerService.openActionComponent(action, {}, { initialFiles: files });\n}\n","import type { AXActionSheetService } from '@acorex/components/action-sheet';\nimport type { AXPopupService } from '@acorex/components/popup';\nimport type { AXPlatform } from '@acorex/core/platform';\nimport type { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport type { AXFileService } from '@acorex/core/file';\nimport type { AXValidationRuleResult } from '@acorex/core/validation';\nimport type { AXConversationComposerService } from '../composer/composer.service';\nimport type { AXConversation } from '../../models';\nimport type { AXConversationComposerAction, AXConversationComposerActionRegistry } from '../../registries/composer-action.registry';\nimport {\n AX_CONVERSATION_AUDIO_CATALOG,\n AX_CONVERSATION_IMAGE_CATALOG,\n AX_CONVERSATION_VIDEO_CATALOG,\n AX_CONVERSATION_VOICE_CATALOG,\n} from '../../models/message-file-type-catalog';\nimport { filesFromClipboardEvent } from '../../plugins/composer/components/shared/clipboard-files';\nimport { getActiveComposerPickerPasteHandler } from '../../plugins/composer/components/shared/picker-paste';\nimport { notifyPickerValidationErrors } from '../../plugins/composer/components/shared/picker-upload';\nimport type { AXConversationConfig } from '../../tokens/conversation-config.interface';\nimport { openComposerPickerPopup } from './open-composer-picker-popup';\nimport type { DestroyRef } from '@angular/core';\n\nconst INBOUND_MEDIA_CATALOGS = new Set<string>([\n AX_CONVERSATION_IMAGE_CATALOG,\n AX_CONVERSATION_VIDEO_CATALOG,\n AX_CONVERSATION_AUDIO_CATALOG,\n]);\n\nexport { filesFromClipboardEvent };\n\nexport interface AXConversationOpenComposerPickerForFilesDeps {\n fileService: AXFileService;\n composerService: AXConversationComposerService;\n composerActionRegistry: AXConversationComposerActionRegistry;\n popupService: AXPopupService;\n actionSheetService: AXActionSheetService;\n platform: AXPlatform;\n toast: AXToastService;\n translation: AXTranslationService;\n conversation: AXConversation | null | undefined;\n config: Pick<Required<AXConversationConfig>, 'maxFilesPerMessage'>;\n}\n\n/** Catalogs registered on picker actions (conversation-image, conversation-file, …). Voice is record-only. */\nfunction pickerCatalogNames(registry: AXConversationComposerActionRegistry): string[] {\n const names = new Set<string>();\n for (const action of registry.actions()) {\n if (!(action.component || action.componentLoader) || !action.fileType) {\n continue;\n }\n if (action.fileType === AX_CONVERSATION_VOICE_CATALOG) {\n continue;\n }\n names.add(action.fileType);\n }\n return [...names];\n}\n\n/**\n * Image/video/audio pickers already expose \"send as document\". Prefer those over the generic file\n * picker so drop, paste, and attach-menu do not ask \"file or media?\".\n */\nfunction resolveInboundPickerActions(actions: AXConversationComposerAction[]): AXConversationComposerAction[] {\n const mediaActions = actions.filter((action) => !!action.fileType && INBOUND_MEDIA_CATALOGS.has(action.fileType));\n return mediaActions.length > 0 ? mediaActions : actions;\n}\n\ninterface AXConversationInboundFilesAnalysis {\n matchingCatalogs: string[];\n actions: AXConversationComposerAction[];\n supportedFiles: File[];\n unsupportedFiles: { file: File; errors: AXValidationRuleResult[] }[];\n}\n\n/** Files that are not accepted by any registered picker catalog. */\nasync function collectUnsupportedInboundFiles(\n deps: Pick<AXConversationOpenComposerPickerForFilesDeps, 'fileService' | 'composerActionRegistry'>,\n files: File[],\n catalogs: string[],\n): Promise<{ file: File; errors: AXValidationRuleResult[] }[]> {\n const unsupported: { file: File; errors: AXValidationRuleResult[] }[] = [];\n\n for (const file of files) {\n let acceptedByAny = false;\n let lastErrors: AXValidationRuleResult[] = [];\n\n for (const catalog of catalogs) {\n const errors = await deps.fileService.validate(file, catalog);\n if (errors.length === 0) {\n acceptedByAny = true;\n break;\n }\n lastErrors = errors;\n }\n\n if (!acceptedByAny) {\n unsupported.push({ file, errors: lastErrors });\n }\n }\n\n return unsupported;\n}\n\nasync function analyzeInboundFiles(\n deps: Pick<\n AXConversationOpenComposerPickerForFilesDeps,\n 'fileService' | 'composerService' | 'composerActionRegistry'\n >,\n files: File[],\n): Promise<AXConversationInboundFilesAnalysis> {\n if (!files.length) {\n return { matchingCatalogs: [], actions: [], supportedFiles: [], unsupportedFiles: [] };\n }\n\n const catalogs = pickerCatalogNames(deps.composerActionRegistry);\n const unsupportedFiles = await collectUnsupportedInboundFiles(deps, files, catalogs);\n const unsupportedSet = new Set(unsupportedFiles.map((entry) => entry.file));\n const supportedFiles = files.filter((file) => !unsupportedSet.has(file));\n\n if (supportedFiles.length === 0) {\n return { matchingCatalogs: [], actions: [], supportedFiles: [], unsupportedFiles };\n }\n\n const context = deps.composerService.actionContext();\n const matchingCatalogs: string[] = [];\n\n for (const catalog of catalogs) {\n const { rejected } = await deps.fileService.validateMany(supportedFiles, catalog);\n if (rejected.length === 0) {\n matchingCatalogs.push(catalog);\n }\n }\n\n const seen = new Set<string>();\n const actions: AXConversationComposerAction[] = [];\n\n for (const catalog of matchingCatalogs) {\n for (const action of deps.composerActionRegistry.findPickerActionsForFileType(catalog, context)) {\n if (!seen.has(action.id)) {\n seen.add(action.id);\n actions.push(action);\n }\n }\n }\n\n return {\n matchingCatalogs,\n actions: actions.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n supportedFiles,\n unsupportedFiles,\n };\n}\n\nfunction notifyInboundFilesValidationFailures(\n deps: Pick<AXConversationOpenComposerPickerForFilesDeps, 'toast' | 'translation'>,\n analysis: AXConversationInboundFilesAnalysis,\n): void {\n if (analysis.supportedFiles.length === 0) {\n if (analysis.unsupportedFiles.length === 0) {\n deps.toast.warning(deps.translation.translateSync('@acorex:chat.errors.inbound-files-none-supported'));\n }\n return;\n }\n\n if (analysis.actions.length === 0) {\n const key =\n analysis.matchingCatalogs.length === 0\n ? '@acorex:chat.errors.inbound-files-none-supported'\n : '@acorex:chat.errors.inbound-files-no-send-option';\n deps.toast.warning(deps.translation.translateSync(key));\n }\n}\n\n/**\n * File catalogs that accept every supported file in the batch, then matching visible picker actions.\n */\nexport async function resolvePickerActionsForAllFiles(\n deps: Pick<AXConversationOpenComposerPickerForFilesDeps, 'fileService' | 'composerService' | 'composerActionRegistry'>,\n files: File[],\n): Promise<AXConversationComposerAction[]> {\n const analysis = await analyzeInboundFiles(deps, files);\n return resolveInboundPickerActions(analysis.actions);\n}\n\nasync function promptComposerActionChoice(\n deps: AXConversationOpenComposerPickerForFilesDeps,\n actions: AXConversationComposerAction[],\n fileCount: number,\n): Promise<AXConversationComposerAction | undefined> {\n const { AXConversationComposerActionChoiceDialogComponent } = await import('./composer-action-choice-dialog.component');\n const result = await deps.popupService.open(AXConversationComposerActionChoiceDialogComponent, {\n title: deps.translation.translateSync('@acorex:chat.dialog.choose-send-option.title'),\n size: 'sm',\n closeButton: true,\n header: true,\n inputs: {\n actions,\n fileCount,\n composerActionRegistry: deps.composerActionRegistry,\n },\n });\n\n const action = result?.data as AXConversationComposerAction | undefined;\n if (!action?.component && !action?.componentLoader) {\n return undefined;\n }\n return action;\n}\n\n/**\n * Match dropped/pasted files to composer picker action(s) and open the popup.\n * Unsupported files are skipped after a warning toast; supported files continue.\n * @returns true when a picker popup was opened\n */\nexport async function openComposerPickerForFiles(\n deps: AXConversationOpenComposerPickerForFilesDeps,\n files: File[],\n): Promise<boolean> {\n if (!files.length) {\n return false;\n }\n\n const conversation = deps.conversation;\n if (!conversation) {\n return false;\n }\n\n const analysis = await analyzeInboundFiles(deps, files);\n\n if (analysis.unsupportedFiles.length > 0) {\n notifyPickerValidationErrors(deps.toast, deps.translation, analysis.unsupportedFiles);\n }\n\n const actions = resolveInboundPickerActions(analysis.actions);\n\n if (!analysis.supportedFiles.length || !actions.length) {\n notifyInboundFilesValidationFailures(deps, { ...analysis, actions });\n return false;\n }\n\n let action = actions[0];\n if (actions.length > 1) {\n const chosen = await promptComposerActionChoice(deps, actions, analysis.supportedFiles.length);\n if (!chosen) {\n return false;\n }\n action = chosen;\n }\n\n const catalog = action.fileType;\n if (!catalog) {\n deps.toast.warning(deps.translation.translateSync('@acorex:chat.errors.inbound-files-none-supported'));\n return false;\n }\n\n const { accepted, rejected } = await deps.fileService.validateMany(analysis.supportedFiles, catalog);\n if (rejected.length > 0) {\n notifyPickerValidationErrors(deps.toast, deps.translation, rejected);\n }\n if (accepted.length === 0) {\n return false;\n }\n\n await openComposerPickerPopup(deps.composerService, action, accepted);\n return true;\n}\n\n/** Whether a paste event should be handled by the open chat (not sidebar or foreign inputs). */\nexport function isPasteTargetInChatPanel(host: HTMLElement, target: EventTarget | null): boolean {\n const doc = host.ownerDocument;\n\n if (target instanceof Node && host.contains(target)) {\n const excluded = host.querySelector('.conversation-sidebar-container, .sidebar-container');\n if (excluded?.contains(target)) {\n return false;\n }\n return true;\n }\n\n return target === host || target === doc || target === doc.body || target === doc.documentElement;\n}\n\n/** Picker popups are portaled to body, so they are outside the conversation host. */\nfunction isPasteTargetInOpenPickerOverlay(target: EventTarget | null): boolean {\n if (!(target instanceof Node)) {\n return false;\n }\n const el = target instanceof Element ? target : target.parentElement;\n return !!el?.closest('ax-conversation-picker-shell, ax-popup, ax-action-sheet, .ax-popup, .ax-popup-wrapper');\n}\n\nfunction shouldRoutePasteToOpenPicker(chatHost: HTMLElement, target: EventTarget | null): boolean {\n return isPasteTargetInOpenPickerOverlay(target) || isPasteTargetInChatPanel(chatHost, target);\n}\n\n/**\n * Read clipboard files synchronously during the paste event.\n * `clipboardData` is empty after any `await` (including dynamic import).\n */\nexport function captureConversationFilePaste(event: ClipboardEvent, host: HTMLElement): File[] {\n if (event.defaultPrevented) {\n return [];\n }\n\n if (!isPasteTargetInChatPanel(host, event.target)) {\n return [];\n }\n\n const files = filesFromClipboardEvent(event);\n if (!files.length) {\n return [];\n }\n\n event.preventDefault();\n event.stopImmediatePropagation();\n return files;\n}\n\n/** Handle Ctrl+V / paste when the clipboard holds files copied from the OS. */\nexport async function handleConversationFilePaste(\n event: ClipboardEvent,\n host: HTMLElement,\n deps: AXConversationOpenComposerPickerForFilesDeps,\n): Promise<void> {\n const files = captureConversationFilePaste(event, host);\n if (!files.length) {\n return;\n }\n\n await openComposerPickerForFiles(deps, files);\n}\n\n/** Capture-phase paste listener so clipboard files are read before any `await`. */\nexport function bindConversationFilePasteListener(\n document: Document,\n destroyRef: DestroyRef,\n getHost: () => HTMLElement,\n isEnabled: () => boolean,\n onFiles: (files: File[]) => void,\n): void {\n const onPaste = (event: ClipboardEvent) => {\n if (event.defaultPrevented) {\n return;\n }\n\n const files = filesFromClipboardEvent(event);\n if (!files.length) {\n return;\n }\n\n const pickerHandler = getActiveComposerPickerPasteHandler();\n if (pickerHandler) {\n if (!shouldRoutePasteToOpenPicker(getHost(), event.target)) {\n return;\n }\n event.preventDefault();\n event.stopImmediatePropagation();\n pickerHandler(files);\n return;\n }\n\n if (!isEnabled() || !isPasteTargetInChatPanel(getHost(), event.target)) {\n return;\n }\n\n event.preventDefault();\n event.stopImmediatePropagation();\n onFiles(files);\n };\n\n document.addEventListener('paste', onPaste, true);\n destroyRef.onDestroy(() => document.removeEventListener('paste', onPaste, true));\n}\n","import { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { NgComponentOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n signal,\n Type,\n ViewEncapsulation,\n} from '@angular/core';\n\nexport interface AXConversationRegistryComponentRef {\n component?: Type<unknown>;\n componentLoader?: () => Promise<Type<unknown>>;\n}\n\n/** Placeholder shown while a lazy registry component is loading. */\nexport type AXConversationOutletSkeleton = 'auto' | 'text' | 'media' | 'none';\n\nconst TEXT_SKELETON_TYPES = new Set(['text', 'system']);\nconst MEDIA_SKELETON_TYPES = new Set(['image', 'video', 'sticker', 'location']);\n\n/** Cache resolved lazy loaders so later outlets of the same type skip a skeleton flash. */\nconst resolvedLoaderCache = new WeakMap<() => Promise<Type<unknown>>, Type<unknown>>();\n\n@Component({\n selector: 'ax-conversation-registry-component-outlet',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgComponentOutlet, AXSkeletonComponent],\n templateUrl: './registry-component-outlet.component.html',\n styleUrl: './registry-component-outlet.component.css',\n host: {\n '[attr.aria-busy]': 'isLoading() ? \"true\" : null',\n '[class.ax-conversation-outlet--loading]': 'isLoading()',\n '[class.ax-conversation-outlet--text]': 'isLoading() && skeletonVariant() === \"text\"',\n '[class.ax-conversation-outlet--media]':\n 'isLoading() && (skeletonVariant() === \"media\" || skeletonVariant() === \"lines\")',\n },\n})\nexport class AXConversationRegistryComponentOutletComponent {\n readonly component = input<Type<unknown> | undefined>();\n readonly componentLoader = input<(() => Promise<Type<unknown>>) | undefined>();\n readonly inputs = input<Record<string, unknown>>({});\n /**\n * Skeleton while a `componentLoader` is in flight.\n * `auto` uses `inputs.message.type`: text/system → single line, other types → multi-line.\n */\n readonly skeleton = input<AXConversationOutletSkeleton>('auto');\n\n readonly resolvedComponent = signal<Type<unknown> | null>(null);\n private readonly pending = signal(false);\n\n readonly isLoading = computed(() => this.pending() && !this.resolvedComponent());\n\n protected readonly skeletonVariant = computed<'text' | 'media' | 'lines' | 'none'>(() => {\n const mode = this.skeleton();\n if (mode === 'none' || mode === 'text' || mode === 'media') {\n return mode;\n }\n const message = this.inputs()['message'] as { type?: string } | undefined;\n const type = message?.type;\n if (!type || TEXT_SKELETON_TYPES.has(type)) {\n return 'text';\n }\n if (MEDIA_SKELETON_TYPES.has(type)) {\n return 'media';\n }\n return 'lines';\n });\n\n /** Avoid re-loading when the parent re-binds the same lazy loader reference. */\n private activeLoader: (() => Promise<Type<unknown>>) | null = null;\n\n constructor() {\n effect(() => {\n const direct = this.component();\n const loader = this.componentLoader();\n\n if (direct) {\n this.activeLoader = null;\n this.pending.set(false);\n this.resolvedComponent.set(direct);\n return;\n }\n\n if (!loader) {\n this.activeLoader = null;\n this.pending.set(false);\n this.resolvedComponent.set(null);\n return;\n }\n\n if (this.activeLoader === loader) {\n return;\n }\n\n const cached = resolvedLoaderCache.get(loader);\n if (cached) {\n this.activeLoader = loader;\n this.pending.set(false);\n this.resolvedComponent.set(cached);\n return;\n }\n\n this.activeLoader = loader;\n this.resolvedComponent.set(null);\n this.pending.set(true);\n\n void loader()\n .then((loaded) => {\n resolvedLoaderCache.set(loader, loaded);\n if (this.activeLoader !== loader) {\n return;\n }\n this.resolvedComponent.set(loaded);\n this.pending.set(false);\n })\n .catch(() => {\n if (this.activeLoader !== loader) {\n return;\n }\n this.pending.set(false);\n });\n });\n }\n}\n\n/** Resolve a registry component reference, preferring lazy loaders when provided. */\nexport function hasRegistryComponent(ref?: AXConversationRegistryComponentRef): boolean {\n return !!ref?.component || !!ref?.componentLoader;\n}\n","@if (resolvedComponent(); as component) {\n <ng-container *ngComponentOutlet=\"component; inputs: inputs()\" />\n} @else if (isLoading() && skeletonVariant() !== 'none') {\n <div\n class=\"ax-conversation-outlet-skeleton\"\n [class.ax-conversation-outlet-skeleton--text]=\"skeletonVariant() === 'text'\"\n [class.ax-conversation-outlet-skeleton--media]=\"skeletonVariant() === 'media'\"\n [class.ax-conversation-outlet-skeleton--lines]=\"skeletonVariant() === 'lines'\"\n aria-hidden=\"true\"\n >\n @switch (skeletonVariant()) {\n @case ('text') {\n <ax-skeleton class=\"ax-conversation-outlet-skeleton__line\" [animated]=\"true\"></ax-skeleton>\n }\n @case ('media') {\n <ax-skeleton class=\"ax-conversation-outlet-skeleton__media\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton\n class=\"ax-conversation-outlet-skeleton__line ax-conversation-outlet-skeleton__line--full\"\n [animated]=\"true\"\n ></ax-skeleton>\n <ax-skeleton\n class=\"ax-conversation-outlet-skeleton__line ax-conversation-outlet-skeleton__line--mid\"\n [animated]=\"true\"\n ></ax-skeleton>\n }\n @default {\n <ax-skeleton\n class=\"ax-conversation-outlet-skeleton__line ax-conversation-outlet-skeleton__line--full\"\n [animated]=\"true\"\n ></ax-skeleton>\n <ax-skeleton\n class=\"ax-conversation-outlet-skeleton__line ax-conversation-outlet-skeleton__line--full\"\n [animated]=\"true\"\n ></ax-skeleton>\n <ax-skeleton\n class=\"ax-conversation-outlet-skeleton__line ax-conversation-outlet-skeleton__line--mid\"\n [animated]=\"true\"\n ></ax-skeleton>\n }\n }\n </div>\n}\n","import type { AXPopupService } from '@acorex/components/popup';\nimport type { AXConversation } from '../../models';\nimport { resolveComposerMaxFiles } from '../../plugins/composer/composer-upload.config';\nimport type { AXConversationComposerAction } from '../../registries/composer-action.registry';\nimport type { AXConversationConfig } from '../../tokens/conversation-config.interface';\nimport type { AXConversationComposerService } from './composer.service';\n\nexport type ComposerActionOverlayCloser = () => void;\n\nexport interface OpenComposerActionOverlayOptions {\n popupService: AXPopupService;\n composerService: AXConversationComposerService;\n action: AXConversationComposerAction;\n conversation: AXConversation;\n config: Pick<Required<AXConversationConfig>, 'maxFilesPerMessage'>;\n inputs?: Record<string, unknown>;\n initialFiles?: File[];\n onClosed?: () => void;\n}\n\nexport async function openComposerActionOverlay(\n options: OpenComposerActionOverlayOptions,\n): Promise<ComposerActionOverlayCloser | undefined> {\n const { popupService, composerService, action, conversation, config, inputs = {}, initialFiles, onClosed } = options;\n\n const component = action.component ?? (action.componentLoader ? await action.componentLoader() : undefined);\n if (!component) {\n return undefined;\n }\n\n const hasInitialFiles = !!initialFiles?.length;\n const shouldAutoRun = action.autoRun === true && !hasInitialFiles;\n\n const contentInputs: Record<string, unknown> = {\n conversation,\n maxFiles: resolveComposerMaxFiles(action, config),\n service: composerService,\n autoRun: shouldAutoRun,\n ...inputs,\n };\n\n if (hasInitialFiles) {\n contentInputs['initialFiles'] = initialFiles;\n }\n\n const pickerPanelClass = ['ax-conversation-composer-picker-popup'];\n if (action.id === 'location') {\n pickerPanelClass.push('ax-conversation-composer-picker-popup--location');\n } else if (action.id === 'voice-recording') {\n pickerPanelClass.push('ax-conversation-composer-picker-popup--voice');\n }\n\n const popupRef = await popupService.openRef(component, {\n size: 'sm',\n closeButton: false,\n header: false,\n closeOnBackdropClick: false,\n panelClass: pickerPanelClass,\n inputs: contentInputs,\n });\n\n popupRef.onClose.subscribe(() => onClosed?.());\n\n return () => popupRef.close();\n}\n","/**\n * AXConversationComposerService\n * Facade/service for Composer to interact with conversation and manage reply/edit state.\n */\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { AXConversationMessage, AXConversationSendMessageCommand } from '../../models';\nimport type { AXConversationSendMessageOptions } from '../../models/conversation-upload.types';\nimport { AXConversationComposerAction, AXConversationComposerActionContext } from '../../registries';\nimport { AXConversationService } from '../../services';\nimport { AXConversationComposerGenerationStateService } from '../../services/composer-generation-state.service';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { openComposerActionOverlay } from './open-composer-action-overlay';\n\n/** Primary composer button mode (send / cancel / stopping / default action / locked). */\nexport type AXConversationComposerPrimaryButtonMode = 'send' | 'cancel' | 'stopping' | 'default-action' | 'locked';\n\n@Injectable()\nexport class AXConversationComposerService {\n private readonly conversationService = inject(AXConversationService);\n private readonly generationState = inject(AXConversationComposerGenerationStateService);\n private readonly translation = inject(AXTranslationService);\n private readonly popupService = inject(AXPopupService);\n private readonly config = inject(AX_CONVERSATION_CONFIG);\n\n private readonly _activeActionOverlay = signal<{ actionId: string; close: () => void } | null>(null);\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<AXConversationMessage | null>(null);\n private readonly _editMessage = signal<AXConversationMessage | 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 /** Draft text */\n readonly draftText = signal('');\n\n /** Attachments */\n readonly attachments = signal<File[]>([]);\n\n /** Incremented to request focus on the composer text area (handled by AXConversationComposerComponent). */\n private readonly _focusRequest = signal(0);\n readonly focusRequest = this._focusRequest.asReadonly();\n\n /** Input placeholder */\n readonly placeholder = computed(() => {\n const conversation = this.activeConversation();\n if (!conversation) return this.translation.translateSync('@acorex:chat.placeholders.select-conversation');\n return this.translation.translateSync('@acorex:chat.placeholders.type-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), 12);\n });\n\n /** Can send message (draft has content; does not include generation state). */\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 /** Whether a background generation (e.g. AI response) is in progress. */\n readonly isGenerating = this.generationState.isGenerating;\n\n /** Whether cancel cleanup is in progress (spinner on primary button). */\n readonly isStopping = this.generationState.isStopping;\n\n /** Primary end-button mode for send / cancel / stopping / voice / locked. */\n readonly primaryButtonMode = computed((): AXConversationComposerPrimaryButtonMode => {\n if (this.isStopping()) {\n return 'stopping';\n }\n if (this.isGenerating()) {\n return 'cancel';\n }\n if (this.canSend()) {\n return 'send';\n }\n if (this.defaultAction()) {\n return 'default-action';\n }\n return 'locked';\n });\n\n /** Composer action context */\n readonly actionContext = computed((): AXConversationComposerActionContext => {\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 isGenerating: this.isGenerating(),\n isStopping: this.isStopping(),\n };\n });\n\n /** Start actions from registry */\n readonly startActions = computed(() => {\n const context = this.actionContext();\n return this.registry.composerActions\n .getVisibleActions('start', context)\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** End actions from registry */\n readonly endActions = computed(() => {\n const context = this.actionContext();\n return this.registry.composerActions\n .getVisibleActions('end', context)\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Start inline actions (location = 'inline' or undefined) */\n readonly startInlineActions = computed(() => {\n return this.startActions()\n .filter((action) => action.location !== 'menu')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Start menu actions — shown in the attachment popup */\n readonly startMenuActions = computed(() => {\n return this.startActions()\n .filter((action) => action.location === 'menu')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** End inline actions inside the input pill (excludes default action) */\n readonly endInlineActions = computed(() => {\n return this.endActions()\n .filter((action) => action.location !== 'menu' && !action.default)\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** End menu actions (location = 'menu') */\n readonly endMenuActions = computed(() => {\n return this.endActions()\n .filter((action) => action.location === 'menu')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Default end action (voice/send morph button) */\n readonly defaultAction = computed(() => {\n const context = this.actionContext();\n return this.registry.composerActions.getVisibleActions('end', context).find((action) => action.default);\n });\n\n cancelGeneration(): void {\n this.generationState.cancel();\n }\n\n startReply(message: AXConversationMessage): void {\n this._editMessage.set(null);\n this._replyMessage.set(message);\n this.focusComposer();\n }\n\n startEdit(message: AXConversationMessage): void {\n this._replyMessage.set(null);\n this._editMessage.set(message);\n this.focusComposer();\n }\n\n /** Focus the composer text area when the composer component is mounted. */\n focusComposer(): void {\n this._focusRequest.update((n) => n + 1);\n }\n\n clear(): void {\n this.hideComponent();\n this._replyMessage.set(null);\n this._editMessage.set(null);\n }\n\n /**\n * Persist draft for the previous conversation and reset composer UI state when switching conversations.\n */\n onConversationChanged(previousConversationId: string | null, currentConversationId: string | null): void {\n if (previousConversationId && previousConversationId !== currentConversationId && !this.editMessage()) {\n this.saveDraft(previousConversationId, this.draftText());\n }\n\n this.clear();\n this.attachments.set([]);\n this.draftText.set(currentConversationId ? this.loadDraft(currentConversationId) : '');\n this.generationState.setGenerating(false);\n\n if (currentConversationId) {\n this.focusComposer();\n }\n }\n\n async sendTypingIndicator(conversationId: string): Promise<void> {\n await this.conversationService.sendTypingIndicator(conversationId);\n }\n\n async sendMessage(\n command: AXConversationSendMessageCommand,\n options?: AXConversationSendMessageOptions,\n ): Promise<void> {\n const replyToId = command.replyToId ?? this._replyMessage()?.id;\n const sendCommand = replyToId ? { ...command, replyToId } : command;\n this.clearComposerInput(command.conversationId);\n await this.conversationService.sendMessage(sendCommand, options);\n }\n\n /**\n * Resets composer input immediately when a send starts so upload/API work continues in the background.\n */\n clearComposerInput(conversationId?: string): void {\n this.draftText.set('');\n this.attachments.set([]);\n this.hideComponent();\n this._replyMessage.set(null);\n this._editMessage.set(null);\n if (conversationId) {\n this.clearDraft(conversationId);\n }\n this.focusComposer();\n }\n\n /**\n * Open a composer action component in a popup (desktop) or action sheet (mobile).\n */\n async openActionComponent(\n action: AXConversationComposerAction,\n inputs?: Record<string, unknown>,\n options?: { toggleable?: boolean; initialFiles?: File[] },\n ): Promise<void> {\n if (options?.toggleable) {\n const current = this._activeActionOverlay();\n if (current?.actionId === action.id) {\n this.hideComponent();\n return;\n }\n }\n\n this.hideComponent();\n\n const conversation = this.activeConversation();\n if (!conversation) {\n return;\n }\n\n const close = await openComposerActionOverlay({\n popupService: this.popupService,\n composerService: this,\n action,\n conversation,\n config: this.config,\n inputs,\n initialFiles: options?.initialFiles,\n onClosed: () => this._activeActionOverlay.set(null),\n });\n\n if (!close) {\n return;\n }\n\n this._activeActionOverlay.set({\n actionId: action.id,\n close: () => {\n close();\n this._activeActionOverlay.set(null);\n },\n });\n }\n\n /**\n * Hide the active action overlay.\n */\n hideComponent(): void {\n const overlay = this._activeActionOverlay();\n if (overlay) {\n overlay.close();\n }\n }\n\n /**\n * Get actions for the active conversation\n */\n getActionsForPosition(position: 'start' | 'end', context: AXConversationComposerActionContext) {\n return this.registry.composerActions.getVisibleActions(position, context);\n }\n\n /**\n * Execute an action\n */\n async executeAction(actionId: string, context: AXConversationComposerActionContext): 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 * Composer Component\n * Input area for composing and sending messages\n */\n\nimport { AXClickEvent, AXCommonModule, AXHtmlEvent } from '@acorex/cdk/common';\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport { AXActionSheetService } from '@acorex/components/action-sheet';\nimport { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTextAreaComponent } from '@acorex/components/text-area';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXFileService } from '@acorex/core/file';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n OnDestroy,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversationMessage, AXConversationSendMessageCommand, AXConversationStickerPayload } from '../../models';\nimport { resolveComposerMaxFiles } from '../../plugins/composer/composer-upload.config';\nimport type { AXConversationComposerAction } from '../../registries';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\nimport { AXConversationMessageListService } from '../message-list/message-list.service';\nimport {\n captureConversationFilePaste,\n filesFromClipboardEvent,\n openComposerPickerForFiles,\n} from '../message-list/open-composer-picker-for-files';\nimport { getActiveComposerPickerPasteHandler } from '../../plugins/composer/components/shared/picker-paste';\nimport { AXConversationRegistryComponentOutletComponent } from '../shared/registry-component-outlet.component';\nimport { AXConversationComposerService } from './composer.service';\n\nconst ATTACH_MENU_CLOSE_DELAY_MS = 500;\n\n@Component({\n selector: 'ax-conversation-composer',\n encapsulation: ViewEncapsulation.None,\n\n host: {\n '(paste)': 'onComposerPaste($event)',\n },\n imports: [\n CommonModule,\n AXConversationRegistryComponentOutletComponent,\n FormsModule,\n AXTextAreaComponent,\n AXCommonModule,\n AXButtonComponent,\n AXDecoratorModule,\n AXPopoverComponent,\n AXTranslationModule,\n AXButtonItemComponent,\n AXButtonItemListComponent,\n AXDecoratorModule,\n ],\n templateUrl: './composer.component.html',\n styleUrl: './composer.component.css',\n})\nexport class AXConversationComposerComponent implements OnDestroy {\n private readonly conversationService = inject(AXConversationService);\n private readonly composerService = inject(AXConversationComposerService);\n private readonly messageListService = inject(AXConversationMessageListService);\n private readonly config = inject(AX_CONVERSATION_CONFIG);\n protected readonly translation = inject(AXTranslationService);\n private readonly uploader = inject(AXUploaderService);\n private readonly platform = inject(AXPlatform);\n private readonly fileService = inject(AXFileService);\n private readonly toast = inject(AXToastService);\n private readonly actionSheetService = inject(AXActionSheetService);\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n\n /** Access registry through conversation service */\n protected get composerActionRegistry() {\n return this.conversationService.registry.composerActions;\n }\n\n /** Composer text area reference */\n private readonly textAreaRef = viewChild('inputElement', { read: AXTextAreaComponent });\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<AXConversationMessage>(null);\n\n /** Message sent event */\n readonly messageSent = output<AXConversationSendMessageCommand>();\n\n /** Emitted when the user cancels an in-progress generation from the composer. */\n readonly generationCancelled = output<void>();\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 /** Emoji popover state */\n private readonly emojiPopoverRef = viewChild<any>('emojiPopover');\n readonly emojiPopoverTarget = signal<HTMLElement | null>(null);\n\n /** Attachment menu popover state */\n private readonly attachPopoverRef = viewChild<AXPopoverComponent>('attachPopover');\n private readonly attachMenuButtonRef = viewChild<ElementRef<HTMLElement>>('attachMenuButton');\n readonly attachMenuTarget = computed(() => this.attachMenuButtonRef()?.nativeElement ?? null);\n private attachMenuCloseTimer?: ReturnType<typeof setTimeout>;\n readonly composerPopupLoader = () =>\n import('./composer-popup.component').then((m) => m.AXConversationComposerPopupComponent);\n\n /** Input placeholder - use service */\n readonly placeholder = this.composerService.placeholder;\n\n constructor() {\n // Focus text area when requested via AXConversationComposerService.focusComposer()\n effect(() => {\n if (this.composerService.focusRequest() === 0) return;\n this.focusTextArea();\n });\n\n // React to controller signals (reply/edit)\n 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 this.editingMessage.set(null);\n this.replyingToMessage.set(null);\n }\n });\n\n // Close composer popovers when conversation changes (draft/reply/edit reset is handled by message-list).\n let previousConversationId: string | undefined = undefined;\n effect(() => {\n const currentId = this.activeConversation()?.id;\n\n if (previousConversationId !== undefined && previousConversationId !== currentId) {\n if (previousConversationId) {\n this.conversationService.notifyComposerStoppedTyping(previousConversationId);\n }\n this.emojiPopoverTarget.set(null);\n this.attachPopoverRef()?.close();\n this.editingMessage.set(null);\n this.replyingToMessage.set(null);\n }\n\n previousConversationId = currentId;\n });\n\n // Auto-save draft on text change\n effect(() => {\n const text = this.draftText();\n const conversation = this.activeConversation();\n const isEditing = !!this.composerService.editMessage();\n\n if (conversation?.id && !isEditing) {\n const conversationId = conversation.id;\n if (this.draftSaveTimeout) {\n clearTimeout(this.draftSaveTimeout);\n }\n this.draftSaveTimeout = window.setTimeout(() => {\n if (this.activeConversation()?.id !== conversationId || this.composerService.editMessage()) {\n return;\n }\n this.composerService.saveDraft(conversationId, text);\n }, 500);\n }\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 /** Whether AI/generation is in progress */\n readonly isGenerating = this.composerService.isGenerating;\n\n /** Whether cancel cleanup is in progress */\n readonly isStopping = this.composerService.isStopping;\n\n /** Primary button mode */\n readonly primaryButtonMode = this.composerService.primaryButtonMode;\n\n /** Start actions from registry - use service */\n readonly startActions = this.composerService.startActions;\n\n /** End actions from registry - use service */\n readonly endActions = this.composerService.endActions;\n\n /** Start inline actions */\n readonly startInlineActions = this.composerService.startInlineActions;\n\n /** Start menu actions (attachment popup) */\n readonly startMenuActions = this.composerService.startMenuActions;\n\n /** End inline actions inside input pill */\n readonly endInlineActions = this.composerService.endInlineActions;\n\n /** End menu actions */\n readonly endMenuActions = this.composerService.endMenuActions;\n\n /** Default end action (voice/send morph) */\n readonly defaultAction = this.composerService.defaultAction;\n\n /** Handle key down (send on Enter; typing is driven by draft changes only). */\n onKeyDown(event: AXHtmlEvent<KeyboardEvent>): void {\n const key = event?.nativeEvent?.key;\n const shiftKey = event?.nativeEvent?.shiftKey;\n\n if (key === 'Enter' && !shiftKey) {\n event?.nativeEvent?.preventDefault();\n if (this.primaryButtonMode() === 'send') {\n void this.onSendClick();\n }\n }\n }\n\n /** Handle draft text changes — throttled typing indicator via conversation service. */\n onDraftChanged(): void {\n const conversation = this.activeConversation();\n if (!conversation) {\n return;\n }\n\n const conversationId = conversation.id;\n if (!this.draftText().trim()) {\n this.conversationService.notifyComposerStoppedTyping(conversationId);\n return;\n }\n\n this.conversationService.notifyComposerTyping(conversationId);\n }\n\n /** Cleanup on destroy */\n ngOnDestroy(): void {\n const conversation = this.activeConversation();\n if (conversation?.id) {\n this.conversationService.notifyComposerStoppedTyping(conversation.id);\n if (!this.composerService.editMessage()) {\n this.composerService.saveDraft(conversation.id, this.draftText());\n }\n }\n\n if (this.draftSaveTimeout) {\n clearTimeout(this.draftSaveTimeout);\n }\n this.clearAttachMenuCloseTimer();\n }\n\n /** Handle send click */\n async onSendClick(): Promise<void> {\n if (!this.canSend() || this.isGenerating() || this.isStopping()) 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 if (editingMsg) {\n try {\n await this.conversationService.editMessage(editingMsg.id, { type: 'text', text });\n this.draftText.set('');\n this.attachments.set([]);\n this.cancelEditReply();\n this.composerService.clearDraft(conversation.id);\n this.composerService.focusComposer();\n } catch (error) {\n console.error('Failed to edit message:', error);\n }\n return;\n }\n\n const command: AXConversationSendMessageCommand = {\n conversationId: conversation.id,\n type: 'text',\n payload: { type: 'text', text },\n replyToId: this.replyingToMessage()?.id,\n };\n\n this.editingMessage.set(null);\n this.replyingToMessage.set(null);\n this.conversationService.notifyComposerStoppedTyping(conversation.id);\n this.messageListService.requestScrollToBottom();\n\n void this.composerService\n .sendMessage(command)\n .then(() => {\n this.messageSent.emit(command);\n })\n .catch((error) => {\n console.error('Failed to send message:', error);\n });\n }\n\n /** Handle emoji click */\n async onEmojiClick(event?: AXClickEvent | MouseEvent): Promise<void> {\n this.emojiClick.emit();\n\n const target = this.getClickTarget(event);\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 | AXConversationStickerPayload): void {\n if (typeof item === 'string') {\n this.draftText.update((text) => text + item);\n this.onDraftChanged();\n return;\n }\n\n if (item && 'url' in item) {\n this.sendSticker(item);\n this.emojiPopoverRef()?.close();\n }\n }\n\n /** Send sticker message */\n private async sendSticker(sticker: AXConversationStickerPayload): Promise<void> {\n const conversation = this.activeConversation();\n if (!conversation) return;\n\n const command: AXConversationSendMessageCommand = {\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 this.messageListService.requestScrollToBottom();\n void this.composerService\n .sendMessage(command)\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, unknown> {\n return {\n onItemSelected: (item: any) => this.onEmojiItemSelected(item),\n };\n }\n\n /** Handle attach menu hover */\n onAttachMenuMouseEnter(): void {\n if (!this.platform.is('Desktop')) {\n return;\n }\n this.clearAttachMenuCloseTimer();\n this.attachPopoverRef()?.open();\n }\n\n onAttachMenuMouseLeave(): void {\n this.scheduleAttachMenuClose();\n }\n\n onAttachMenuPanelMouseEnter(): void {\n this.clearAttachMenuCloseTimer();\n }\n\n onAttachMenuPanelMouseLeave(): void {\n this.scheduleAttachMenuClose();\n }\n\n private scheduleAttachMenuClose(): void {\n this.clearAttachMenuCloseTimer();\n this.attachMenuCloseTimer = setTimeout(() => {\n this.attachPopoverRef()?.close();\n this.attachMenuCloseTimer = undefined;\n }, ATTACH_MENU_CLOSE_DELAY_MS);\n }\n\n private clearAttachMenuCloseTimer(): void {\n if (this.attachMenuCloseTimer) {\n clearTimeout(this.attachMenuCloseTimer);\n this.attachMenuCloseTimer = undefined;\n }\n }\n\n /** Desktop: open an all-files chooser. Mobile: toggle the attachment dropdown. */\n onAttachMenuClick(event: AXClickEvent): void {\n this.attachClick.emit();\n event?.nativeEvent?.preventDefault();\n event?.nativeEvent?.stopPropagation();\n\n if (this.platform.is('Desktop')) {\n this.clearAttachMenuCloseTimer();\n this.attachPopoverRef()?.close();\n void this.openSmartAttachChooser();\n return;\n }\n\n const popover = this.attachPopoverRef();\n if (popover?.isOpen) {\n this.clearAttachMenuCloseTimer();\n popover.close();\n } else {\n this.clearAttachMenuCloseTimer();\n popover?.open();\n }\n }\n\n /** Open the OS file picker for any file, then route to the matching composer picker. */\n private async openSmartAttachChooser(): Promise<void> {\n const { accepted } = await this.uploader.chooseFiles({ multiple: true });\n if (!accepted.length) {\n return;\n }\n\n await openComposerPickerForFiles(this.composerPickerDeps(), accepted);\n }\n\n /** OS file paste (Ctrl+V) while the composer is focused. */\n onComposerPaste(event: ClipboardEvent): void {\n if (event.defaultPrevented) {\n return;\n }\n\n const files = filesFromClipboardEvent(event);\n if (!files.length) {\n return;\n }\n\n const pickerHandler = getActiveComposerPickerPasteHandler();\n if (pickerHandler) {\n event.preventDefault();\n event.stopImmediatePropagation();\n pickerHandler(files);\n return;\n }\n\n const captured = captureConversationFilePaste(event, this.hostRef.nativeElement);\n if (!captured.length) {\n return;\n }\n void openComposerPickerForFiles(this.composerPickerDeps(), captured);\n }\n\n private composerPickerDeps() {\n return {\n fileService: this.fileService,\n composerService: this.composerService,\n composerActionRegistry: this.composerActionRegistry,\n popupService: this.conversationService.popupService,\n actionSheetService: this.actionSheetService,\n platform: this.platform,\n toast: this.toast,\n translation: this.translation,\n conversation: this.activeConversation(),\n config: this.config,\n };\n }\n\n /** Handle attachment menu action selection */\n async onAttachMenuAction(actionId: string): Promise<void> {\n this.clearAttachMenuCloseTimer();\n this.attachPopoverRef()?.close();\n await this.onActionClick(actionId);\n }\n\n /** Handle primary button click (send / cancel / stopping / voice / locked). */\n async onPrimaryButtonClick(): Promise<void> {\n switch (this.primaryButtonMode()) {\n case 'stopping':\n break;\n case 'cancel':\n this.composerService.cancelGeneration();\n this.generationCancelled.emit();\n break;\n case 'send':\n await this.onSendClick();\n break;\n case 'default-action': {\n const action = this.defaultAction();\n if (action) {\n await this.onActionClick(action.id);\n }\n break;\n }\n case 'locked':\n break;\n }\n }\n\n /** @deprecated Use onPrimaryButtonClick */\n async onDefaultActionClick(): Promise<void> {\n await this.onPrimaryButtonClick();\n }\n\n getPrimaryButtonIcon(): string {\n switch (this.primaryButtonMode()) {\n case 'stopping':\n return 'fa-light fa-spinner';\n case 'cancel':\n return 'fa-light fa-stop';\n case 'send':\n return this.editingMessage() ? 'fa-light fa-check' : 'fa-solid fa-paper-plane-top';\n case 'default-action':\n return this.defaultAction()?.icon ?? 'fa-solid fa-paper-plane-top';\n case 'locked':\n return 'fa-solid fa-paper-plane-top';\n }\n }\n\n getPrimaryButtonLabel(): string {\n switch (this.primaryButtonMode()) {\n case 'stopping':\n return this.translation.translateSync('@acorex:chat.actions.stopping');\n case 'cancel':\n return this.translation.translateSync('@acorex:chat.actions.stop');\n case 'send':\n return this.editingMessage()\n ? this.translation.translateSync('@acorex:chat.actions.save')\n : this.translation.translateSync('@acorex:chat.actions.send');\n case 'default-action':\n return this.defaultAction() ? this.getActionLabel(this.defaultAction()!) : '';\n case 'locked':\n return this.translation.translateSync('@acorex:chat.actions.send');\n }\n }\n\n isPrimaryButtonDisabled(): boolean {\n const mode = this.primaryButtonMode();\n if (mode === 'locked' || mode === 'stopping') {\n return true;\n }\n if (mode === 'default-action') {\n const action = this.defaultAction();\n return action ? !this.isActionEnabled(action) : true;\n }\n return false;\n }\n\n /** @deprecated Use getPrimaryButtonIcon */\n getDefaultActionIcon(): string {\n return this.getPrimaryButtonIcon();\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 /** Cancel edit/reply mode */\n cancelEditReply(): void {\n this.editingMessage.set(null);\n this.replyingToMessage.set(null);\n this.composerService.clear();\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.onDraftChanged();\n }\n\n /** Start replying to a message */\n startReply(message: AXConversationMessage): void {\n this.replyingToMessage.set(message);\n this.editingMessage.set(null);\n }\n\n /** Focus the native textarea inside ax-text-area */\n private focusTextArea(): void {\n setTimeout(() => {\n this.textAreaRef()?.input?.nativeElement?.focus();\n }, 0);\n }\n\n private getClickTarget(event?: AXClickEvent | MouseEvent): HTMLElement | undefined {\n if (!event) return undefined;\n if (event instanceof MouseEvent) {\n return event.currentTarget as HTMLElement;\n }\n return event.htmlElement as HTMLElement;\n }\n\n /** Handle action click */\n async onActionClick(actionId: string, event?: AXClickEvent | MouseEvent, initialFiles?: File[]): Promise<void> {\n const action = this.composerActionRegistry.getActionById(actionId);\n if (!action) return;\n\n const context = this.composerService.actionContext();\n\n if (actionId === 'emoji') {\n this.onEmojiClick(event);\n return;\n }\n\n const hasComponent = !!(action.component || action.componentLoader);\n\n if (hasComponent) {\n await this.composerService.openActionComponent(action, this.buildPickerInputs(action), {\n toggleable: !!action.toggleable,\n initialFiles,\n });\n return;\n }\n\n if (action.handler) {\n try {\n await this.composerActionRegistry.executeAction(actionId, 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 this.composerActionRegistry.isActionEnabled(action, context);\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 || this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');\n }\n\n getActionLabel(action: { label: string }): string {\n return this.composerActionRegistry.getActionLabel(action as any);\n }\n\n getActionButtonClass(action: { className?: string }): string {\n const base = 'rounded-full text-xl';\n return action.className ? `${base} ${action.className}` : base;\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 AXConversationMessage | null;\n if (!message) return null;\n return AXConversationMessageUtilsService.getPreviewText(message, 100);\n }\n\n getComposerPreviewLabel(preview: { value: string; type: string }): string {\n if (preview.type === 'text') {\n return preview.value;\n }\n const keyByType: Record<string, string> = {\n image: '@acorex:chat.image',\n video: '@acorex:chat.video',\n audio: '@acorex:chat.voice',\n voice: '@acorex:chat.voice',\n file: '@acorex:chat.file',\n location: '@acorex:chat.location',\n sticker: '@acorex:chat.sticker',\n };\n const key = keyByType[preview.type] ?? '@acorex:chat.message';\n return this.translation.translateSync(key);\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 messageElement.classList.add('message-highlight');\n setTimeout(() => {\n messageElement.classList.remove('message-highlight');\n }, this.config.messageHighlightDuration);\n }\n }\n\n /** Inputs for picker components opened in popup / action sheet */\n private buildPickerInputs(action: AXConversationComposerAction): Record<string, unknown> {\n return {\n conversation: this.activeConversation(),\n maxFiles: resolveComposerMaxFiles(action, this.config),\n service: this.composerService,\n };\n }\n}\n","@if (activeConversation()) {\n <div class=\"composer\">\n <!-- Edit/Reply Banner -->\n @if (editingMessage() || replyingToMessage()) {\n <div\n class=\"ax-conversation-composer-banner\"\n [class.ax-conversation-composer-banner--edit]=\"!!editingMessage()\"\n [class.ax-conversation-composer-banner--reply]=\"!!replyingToMessage()\"\n >\n <div class=\"ax-conversation-composer-banner__accent\" aria-hidden=\"true\"></div>\n @if (editingMessage()) {\n <div class=\"ax-conversation-composer-banner__content\">\n <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n ><i class=\"fa-light fa-pen-to-square\"></i\n ></span>\n <div class=\"ax-conversation-composer-banner__body\">\n <span class=\"ax-conversation-composer-banner__label\">{{\n '@acorex:chat.composer.editing-message' | translate | async\n }}</span>\n @if (getEditingPreview(); as preview) {\n <span class=\"ax-conversation-composer-banner__preview\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n {{ getComposerPreviewLabel(preview) }}\n </span>\n }\n </div>\n </div>\n } @else if (replyingToMessage()) {\n <div class=\"ax-conversation-composer-banner__content\">\n <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n ><i class=\"fa-light fa-reply\"></i\n ></span>\n <div\n class=\"ax-conversation-composer-banner__body ax-conversation-composer-banner__body--clickable\"\n (click)=\"onReplyPreviewClick()\"\n >\n <span class=\"ax-conversation-composer-banner__label\">\n {{ '@acorex:chat.composer.replying-to' | translate | async }} {{ getReplyingSenderName() }}\n </span>\n @if (getReplyingPreview(); as preview) {\n <span class=\"ax-conversation-composer-banner__preview\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n {{ getComposerPreviewLabel(preview) }}\n </span>\n }\n </div>\n </div>\n }\n <ax-button\n class=\"ax-conversation-composer-banner__close rounded-full\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"translation.translateSync('@acorex:chat.actions.cancel')\"\n (onClick)=\"cancelEditReply()\"\n >\n <ax-icon><i class=\"fa-solid fa-xmark\"></i></ax-icon>\n </ax-button>\n </div>\n }\n\n <!-- Input Area -->\n <div class=\"composer-input-container\">\n <!-- Start actions -->\n <div class=\"composer-actions-left\">\n @if (startMenuActions().length > 0) {\n <span\n #attachMenuButton\n class=\"composer-attach-menu-trigger\"\n (mouseenter)=\"onAttachMenuMouseEnter()\"\n (mouseleave)=\"onAttachMenuMouseLeave()\"\n >\n <ax-button\n class=\"rounded-full text-xl\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"('@acorex:chat.tooltips.attach-file' | translate | async) ?? ''\"\n (onClick)=\"onAttachMenuClick($event)\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-paperclip\"></i>\n </ax-prefix>\n </ax-button>\n </span>\n }\n\n @for (action of startInlineActions(); track action.id) {\n <ax-button\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"getActionButtonClass(action)\"\n (onClick)=\"onActionClick(action.id, $event)\"\n >\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\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)=\"onDraftChanged()\"\n [placeholder]=\"placeholder()\"\n [rows]=\"inputRows()\"\n [axAutoFocus]=\"true\"\n ></ax-text-area>\n </div>\n\n <!-- End actions -->\n <div class=\"composer-actions-right\">\n @for (action of endInlineActions(); track action.id) {\n <ax-button\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"getActionButtonClass(action)\"\n (onClick)=\"onActionClick(action.id, $event)\"\n >\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-button>\n }\n\n <div class=\"composer-primary-button-slot\">\n @switch (primaryButtonMode()) {\n @case ('cancel') {\n <ax-button\n class=\"rounded-full\"\n [iconOnly]=\"true\"\n look=\"blank\"\n [text]=\"getPrimaryButtonLabel()\"\n (onClick)=\"onPrimaryButtonClick()\"\n >\n <ax-icon [class]=\"getPrimaryButtonIcon()\"> </ax-icon>\n </ax-button>\n }\n @case ('stopping') {\n <ax-button\n class=\"rounded-full\"\n [iconOnly]=\"true\"\n look=\"blank\"\n [text]=\"getPrimaryButtonLabel()\"\n [disabled]=\"true\"\n >\n <ax-prefix>\n <i [class]=\"getPrimaryButtonIcon()\"></i>\n </ax-prefix>\n </ax-button>\n }\n @case ('send') {\n <ax-button\n class=\"rounded-full composer-primary-button--send\"\n [iconOnly]=\"true\"\n look=\"blank\"\n color=\"primary\"\n [text]=\"getPrimaryButtonLabel()\"\n [disabled]=\"isPrimaryButtonDisabled()\"\n (onClick)=\"onPrimaryButtonClick()\"\n >\n <ax-prefix>\n <i [class]=\"getPrimaryButtonIcon()\"></i>\n </ax-prefix>\n </ax-button>\n }\n @default {\n <ax-button\n class=\"rounded-full\"\n [iconOnly]=\"true\"\n look=\"blank\"\n [text]=\"getPrimaryButtonLabel()\"\n [disabled]=\"isPrimaryButtonDisabled()\"\n (onClick)=\"onPrimaryButtonClick()\"\n >\n <ax-prefix>\n <i [class]=\"getPrimaryButtonIcon()\"></i>\n </ax-prefix>\n </ax-button>\n }\n }\n </div>\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\"><i class=\"fa-light fa-paperclip\"></i></span>\n <span class=\"attachment-name\">{{ attachment.name }}</span>\n <ax-button\n class=\"attachment-remove rounded-full\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"translation.translateSync('@acorex:chat.actions.remove-attachment')\"\n (onClick)=\"removeAttachment($index)\"\n >\n <ax-icon><i class=\"fa-solid fa-xmark\"></i></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n }\n </div>\n}\n\n<!-- Popover for attachment menu -->\n@if (attachMenuTarget()) {\n <ax-popover\n #attachPopover\n [target]=\"attachMenuTarget()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'top-start'\"\n >\n <div\n class=\"composer-attach-menu-panel\"\n (mouseenter)=\"onAttachMenuPanelMouseEnter()\"\n (mouseleave)=\"onAttachMenuPanelMouseLeave()\"\n >\n <ax-button-item-list>\n @for (action of startMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"getActionLabel(action)\"\n (click)=\"onAttachMenuAction(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 </div>\n </ax-popover>\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 panelClass=\"composer-emoji-popover-panel\"\n (onClosed)=\"onEmojiPopoverClosed()\"\n >\n <div class=\"composer-emoji-popover\">\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"composerPopupLoader\"\n [inputs]=\"getEmojiPopupInputs()\"\n />\n </div>\n </ax-popover>\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 { AXActionSheetService } from '@acorex/components/action-sheet';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXFileService } from '@acorex/core/file';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n PLATFORM_ID,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationComposerService } from '../composer/composer.service';\nimport {\n bindConversationFilePasteListener,\n openComposerPickerForFiles,\n} from '../message-list/open-composer-picker-for-files';\n\n@Component({\n selector: 'ax-conversation-container',\n encapsulation: ViewEncapsulation.None,\n\n imports: [CommonModule, AXResizableDirective, AXTranslationModule],\n templateUrl: './conversation-container.component.html',\n styleUrl: './conversation-container.component.css',\n host: {\n '[class.conversation-container-host]': 'true',\n '[tabindex]': '\"-1\"',\n },\n})\nexport class AXConversationContainerComponent {\n private readonly conversationService = inject(AXConversationService);\n private readonly composerService = inject(AXConversationComposerService);\n private readonly fileService = inject(AXFileService);\n private readonly translation = inject(AXTranslationService);\n private readonly toast = inject(AXToastService);\n private readonly platform = inject(AXPlatform);\n private readonly actionSheetService = inject(AXActionSheetService);\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n protected readonly config = inject(AX_CONVERSATION_CONFIG);\n\n constructor() {\n void this.conversationService.ensureInitialized();\n if (isPlatformBrowser(this.platformId)) {\n bindConversationFilePasteListener(\n this.document,\n this.destroyRef,\n () => this.hostRef.nativeElement,\n () => !!this.activeConversation(),\n (files) => void this.openPastedFiles(files),\n );\n }\n }\n\n private get registry() {\n return this.conversationService.registry;\n }\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 private async openPastedFiles(files: File[]): Promise<void> {\n await openComposerPickerForFiles(\n {\n fileService: this.fileService,\n composerService: this.composerService,\n composerActionRegistry: this.registry.composerActions,\n popupService: this.conversationService.popupService,\n actionSheetService: this.actionSheetService,\n platform: this.platform,\n toast: this.toast,\n translation: this.translation,\n conversation: this.activeConversation(),\n config: this.config,\n },\n files,\n );\n }\n}\n"," <div\n [class]=\"containerClasses()\"\n role=\"main\"\n [attr.aria-label]=\"'@acorex:chat.aria.conversation-interface' | translate | async\"\n >\n <!-- Sidebar -->\n <div\n class=\"conversation-sidebar-container\"\n [axResizable]=\"true\"\n [minWidth]=\"config.minSidebarWidth\"\n [maxWidth]=\"config.maxSidebarWidth\"\n [width]=\"config.defaultSidebarWidth\"\n role=\"navigation\"\n [attr.aria-label]=\"'@acorex:chat.aria.conversation-list' | translate | async\"\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]=\"\n activeConversation()\n ? ('@acorex:chat.aria.active-conversation' | translate | async)\n : ('@acorex:chat.status.no-conversation-selected' | translate | async)\n \"\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 class=\"text-light\" cx=\"60\" cy=\"60\" r=\"50\" fill=\"currentColor\" />\n <path\n class=\"text-on-surface/55\"\n d=\"M40 50h40M40 70h30\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n />\n </svg>\n <h3 class=\"empty-state-title\">\n {{ '@acorex:chat.empty.no-conversation-selected-title' | translate | async }}\n </h3>\n <p class=\"empty-state-description\">\n {{ '@acorex:chat.empty.select-conversation-description' | translate | async }}\n </p>\n </ng-content>\n </div>\n </div>\n }\n </div>\n </div>\n","/**\n * Conversation Container Directive\n * Provides conversation context without imposing layout structure\n */\n\nimport { AXActionSheetService } from '@acorex/components/action-sheet';\nimport { AXFileService } from '@acorex/core/file';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { DestroyRef, Directive, ElementRef, PLATFORM_ID, inject } from '@angular/core';\nimport { AXConversationComposerService } from '../composer/composer.service';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport {\n bindConversationFilePasteListener,\n openComposerPickerForFiles,\n} from '../message-list/open-composer-picker-for-files';\n\n@Directive({\n selector: '[axConversationContainer]',\n host: {\n '[class.ax-conversation-container]': 'true',\n '[tabindex]': '\"-1\"',\n '[style.outline]': '\"none\"',\n },\n})\nexport class AXConversationContainerDirective {\n private readonly conversationService = inject(AXConversationService);\n private readonly composerService = inject(AXConversationComposerService);\n private readonly fileService = inject(AXFileService);\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly translation = inject(AXTranslationService);\n private readonly toast = inject(AXToastService);\n private readonly platform = inject(AXPlatform);\n private readonly actionSheetService = inject(AXActionSheetService);\n private readonly config = inject(AX_CONVERSATION_CONFIG);\n\n constructor() {\n void this.conversationService.ensureInitialized();\n if (isPlatformBrowser(this.platformId)) {\n bindConversationFilePasteListener(\n this.document,\n this.destroyRef,\n () => this.hostRef.nativeElement,\n () => !!this.activeConversation(),\n (files) => void this.openPastedFiles(files),\n );\n }\n }\n\n private get registry() {\n return this.conversationService.registry;\n }\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 private async openPastedFiles(files: File[]): Promise<void> {\n await openComposerPickerForFiles(\n {\n fileService: this.fileService,\n composerService: this.composerService,\n composerActionRegistry: this.registry.composerActions,\n popupService: this.conversationService.popupService,\n actionSheetService: this.actionSheetService,\n platform: this.platform,\n toast: this.toast,\n translation: this.translation,\n conversation: this.activeConversation(),\n config: this.config,\n },\n files,\n );\n }\n}\n","import { reflectComponentType, type Type } from '@angular/core';\n\n/** Optional conversation avatar display overrides — not present on every custom avatar. */\nconst OPTIONAL_DISPLAY_INPUTS = new Set(['displayName', 'displayAvatar', 'displayIcon']);\n\nconst componentInputNamesCache = new WeakMap<Type<unknown>, Set<string>>();\n\nfunction getComponentInputNames(component: Type<unknown>): Set<string> | null {\n const cached = componentInputNamesCache.get(component);\n if (cached) {\n return cached;\n }\n\n const mirror = reflectComponentType(component);\n if (!mirror) {\n return null;\n }\n\n const names = new Set(mirror.inputs.map((input) => input.propName));\n componentInputNamesCache.set(component, names);\n return names;\n}\n\n/**\n * Returns only inputs that exist on the target component.\n * Prevents NG0303 when optional display overrides are passed to avatars\n * that only declare `userId` and `size`.\n *\n * When runtime reflection is unavailable (common for externally compiled avatar\n * components), optional display overrides are omitted while core inputs such as\n * `userId`, `size`, and `conversationId` are still forwarded.\n */\nexport function pickComponentInputs(\n component: Type<unknown>,\n inputs: Record<string, unknown>,\n): Record<string, unknown> {\n const allowed = getComponentInputNames(component);\n if (!allowed) {\n return Object.fromEntries(\n Object.entries(inputs).filter(([key]) => !OPTIONAL_DISPLAY_INPUTS.has(key)),\n );\n }\n\n return Object.fromEntries(Object.entries(inputs).filter(([key]) => allowed.has(key)));\n}\n","/**\n * Conversation avatar host — renders a registered custom component or built-in fallback.\n */\n\nimport { AXAvatarComponent } from '@acorex/components/avatar';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { NgComponentOutlet } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, inject, input, type Type } from '@angular/core';\nimport type { AXConversation } from '../../models/conversation.model';\nimport type { AXConversationMessage } from '../../models/message.model';\nimport { AXConversationService } from '../../services';\nimport {\n AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT,\n AX_CONVERSATION_USER_AVATAR_COMPONENT,\n type AXConversationAvatarKind,\n} from '../../tokens/conversation-avatar.tokens';\nimport {\n resolveConversationAvatarDisplay,\n resolveConversationPeerUserId,\n resolveUserAvatarDisplay,\n shouldUseUserAvatarForConversation,\n} from '../../utils/avatar-context.utils';\nimport { pickComponentInputs } from '../../utils/component-inputs.utils';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\n\n@Component({\n selector: 'ax-conversation-avatar',\n encapsulation: ViewEncapsulation.None,\n imports: [NgComponentOutlet, AXAvatarComponent, AXDecoratorModule, AXImageComponent, AXLabelComponent],\n templateUrl: './conversation-avatar.component.html',\n styleUrl: './conversation-avatar.component.css',\n host: {\n '[style.--ax-conversation-avatar-size.px]': 'size()',\n },\n})\nexport class AXConversationAvatarComponent {\n private readonly conversationService = inject(AXConversationService, { optional: true });\n private readonly userAvatarComponent = inject(AX_CONVERSATION_USER_AVATAR_COMPONENT, { optional: true });\n private readonly conversationAvatarComponent = inject(AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT, {\n optional: true,\n });\n\n readonly kind = input<AXConversationAvatarKind>('auto');\n readonly userId = input<string | undefined>();\n readonly conversation = input<AXConversation | undefined>();\n readonly message = input<AXConversationMessage | undefined>();\n readonly size = input<number>(40);\n readonly showStatus = input<boolean>(false);\n\n readonly name = input<string | undefined>();\n readonly avatar = input<string | undefined>();\n readonly icon = input<string | undefined>();\n\n private readonly currentUserId = computed(() => this.conversationService?.currentUser()?.id);\n\n readonly resolvedKind = computed((): 'user' | 'conversation' => {\n const explicitKind = this.kind();\n if (explicitKind === 'user') {\n return 'user';\n }\n if (explicitKind === 'conversation') {\n return 'conversation';\n }\n\n const conversation = this.conversation();\n if (conversation && shouldUseUserAvatarForConversation(conversation, this.currentUserId())) {\n return 'user';\n }\n\n return 'conversation';\n });\n\n readonly resolvedUserId = computed((): string | undefined => {\n const explicitUserId = this.userId();\n if (explicitUserId) {\n return explicitUserId;\n }\n\n const conversation = this.conversation();\n if (!conversation || this.resolvedKind() !== 'user') {\n return undefined;\n }\n\n return resolveConversationPeerUserId(conversation, this.currentUserId());\n });\n\n readonly customComponent = computed((): Type<unknown> | null => {\n if (this.resolvedKind() === 'user') {\n return this.resolvedUserId() && this.userAvatarComponent ? this.userAvatarComponent : null;\n }\n\n const conversation = this.conversation();\n return conversation && this.conversationAvatarComponent ? this.conversationAvatarComponent : null;\n });\n\n readonly customInputs = computed((): Record<string, unknown> => {\n if (this.resolvedKind() === 'user') {\n const userId = this.resolvedUserId() ?? '';\n const resolved = resolveUserAvatarDisplay(userId, this.conversation(), this.message());\n const explicitName = this.name();\n const explicitAvatar = this.avatar();\n const explicitIcon = this.icon();\n\n return {\n userId,\n size: this.size(),\n displayName: explicitName ?? resolved.name,\n displayAvatar: explicitAvatar ?? resolved.avatar,\n displayIcon: explicitIcon ?? resolved.icon,\n };\n }\n\n const conversation = this.conversation();\n const explicitName = this.name();\n const explicitAvatar = this.avatar();\n const explicitIcon = this.icon();\n const resolved = conversation\n ? resolveConversationAvatarDisplay(conversation, this.currentUserId())\n : { name: explicitName ?? '?', avatar: explicitAvatar, icon: explicitIcon };\n\n return {\n conversationId: conversation?.id ?? '',\n size: this.size(),\n displayName: explicitName ?? resolved.name,\n displayAvatar: explicitAvatar ?? resolved.avatar,\n displayIcon: explicitIcon ?? resolved.icon,\n };\n });\n\n readonly filteredCustomInputs = computed((): Record<string, unknown> => {\n const component = this.customComponent();\n if (!component) {\n return {};\n }\n\n return pickComponentInputs(component, this.customInputs());\n });\n\n readonly fallbackDisplay = computed(() => {\n const explicitName = this.name();\n const explicitAvatar = this.avatar();\n const explicitIcon = this.icon();\n\n if (this.resolvedKind() === 'user') {\n const userId = this.resolvedUserId();\n if (!userId) {\n return { name: explicitName ?? '?', avatar: explicitAvatar, icon: explicitIcon };\n }\n\n const resolved = resolveUserAvatarDisplay(userId, this.conversation(), this.message());\n return {\n name: explicitName ?? resolved.name,\n avatar: explicitAvatar ?? resolved.avatar,\n icon: explicitIcon ?? resolved.icon,\n };\n }\n\n const conversation = this.conversation();\n if (!conversation) {\n return { name: explicitName ?? '?', avatar: explicitAvatar, icon: explicitIcon };\n }\n\n const resolved = resolveConversationAvatarDisplay(conversation, this.currentUserId());\n return {\n name: explicitName ?? resolved.name,\n avatar: explicitAvatar ?? resolved.avatar,\n icon: explicitIcon ?? resolved.icon,\n };\n });\n\n readonly fallbackInitials = computed(() =>\n AXConversationMessageUtilsService.getInitials(this.fallbackDisplay().name),\n );\n\n readonly resolvedStatus = computed(() => {\n const userId = this.resolvedUserId();\n if (!userId || !this.showStatus()) {\n return undefined;\n }\n const presence = this.conversationService?.getUserPresence(userId);\n return AXConversationMessageUtilsService.getUserPresenceStatus(presence);\n });\n\n readonly statusBadgePresence = computed((): 'online' | 'offline' | 'away' | 'busy' | undefined => {\n if (this.customComponent()) {\n return undefined;\n }\n\n return this.resolvedStatus();\n });\n}\n","<div class=\"ax-conversation-avatar\">\n @if (customComponent(); as component) {\n <ng-container *ngComponentOutlet=\"component; inputs: filteredCustomInputs()\" />\n } @else {\n <ax-avatar [size]=\"size()\">\n @if (fallbackDisplay().avatar; as avatarSrc) {\n <ax-image [src]=\"avatarSrc\" [alt]=\"fallbackDisplay().name\"></ax-image>\n } @else if (fallbackDisplay().icon; as iconClass) {\n <ax-icon><i [class]=\"iconClass\" aria-hidden=\"true\"></i></ax-icon>\n } @else {\n <ax-label>{{ fallbackInitials() }}</ax-label>\n }\n </ax-avatar>\n }\n\n @if (statusBadgePresence(); as presence) {\n <span\n class=\"ax-conversation-avatar-status\"\n [class.status-online]=\"presence === 'online'\"\n [class.status-offline]=\"presence === 'offline'\"\n [class.status-away]=\"presence === 'away'\"\n [class.status-busy]=\"presence === 'busy'\"\n ></span>\n }\n</div>\n","/**\n * AXConversationInfoBarService\n * Facade/service for Info Bar to interact with registries and conversation state.\n */\nimport { inject, Injectable, Injector, runInInjectionContext, signal, Type } from '@angular/core';\nimport { AXConversation, AXConversationMessage } from '../../models';\nimport { AXConversationInfoBarAction } from '../../registries';\nimport type { AXConversationMessageInfoBarBannerComponent } from '../../registries/message-renderer.registry';\nimport { AXConversationService } from '../../services';\n\n/**\n * Active component state in info-bar\n */\nexport interface AXConversationInfoBarActiveComponent {\n /** Action that triggered this component */\n action: AXConversationInfoBarAction;\n /** Eager component to render */\n component?: Type<unknown>;\n /** Lazy loader for the component */\n componentLoader?: () => Promise<Type<unknown>>;\n /** Component inputs */\n inputs?: Record<string, unknown>;\n}\n\nexport interface AXConversationInfoBarActiveBanner {\n /** Message that owns this banner */\n message: AXConversationMessage;\n /** Banner component */\n component?: Type<AXConversationMessageInfoBarBannerComponent>;\n /** Lazy loader for banner component */\n componentLoader?: () => Promise<Type<AXConversationMessageInfoBarBannerComponent>>;\n /** Additional component inputs (only keys that match declared `input()` on the banner) */\n inputs?: Record<string, unknown>;\n /** Callback invoked when the banner is dismissed (e.g. pause playback) */\n onClose?: () => void;\n}\n\n/**\n * Info Bar Service\n * Manages info bar state and actions\n */\n@Injectable()\nexport class AXConversationInfoBarService {\n private readonly conversationService = inject(AXConversationService);\n private readonly injector = inject(Injector);\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<AXConversationInfoBarActiveComponent | null>(null);\n readonly activeComponent = this._activeComponent.asReadonly();\n\n /** Active banner shown under info-bar */\n private readonly _activeBanner = signal<AXConversationInfoBarActiveBanner | null>(null);\n readonly activeBanner = this._activeBanner.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 * Reset info-bar overlays when the active conversation changes.\n */\n onConversationChanged(): void {\n this.hideMessageBanner();\n this.hideComponent();\n }\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 data,\n };\n\n // Check if action is enabled (dynamic)\n if (action.enabledWhen && !runInInjectionContext(this.injector, () => 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 runInInjectionContext(this.injector, () => action.handler?.(context));\n }\n }\n\n /**\n * Get action label\n */\n getActionLabel(action: AXConversationInfoBarAction, conversation: AXConversation): string {\n return this.registry.infoBarActions.getActionLabel(action, conversation);\n }\n\n /**\n * Get action icon\n */\n getActionIcon(action: AXConversationInfoBarAction, 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: AXConversationInfoBarAction, inputs?: Record<string, unknown>): void {\n if (!action.component && !action.componentLoader) return;\n\n this._activeComponent.set({\n action,\n component: action.component,\n componentLoader: action.componentLoader,\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 * Show message-owned banner under info-bar if renderer provides one\n */\n async showMessageBanner(message: AXConversationMessage, inputs?: Record<string, unknown>): Promise<void> {\n const renderer = this.registry.messageRenderers.getRenderer(message);\n const bannerComponent = renderer?.infoBarBanner;\n const bannerLoader = renderer?.infoBarBannerLoader;\n if (!bannerComponent && !bannerLoader) {\n return;\n }\n\n const current = this._activeBanner();\n if (current?.message.id === message.id) {\n this.updateMessageBannerInputs(message.id, inputs ?? {});\n return;\n }\n\n if (current && current.message.id !== message.id) {\n this.hideMessageBanner(current.message.id);\n }\n\n const { onClose, ...componentInputs } = this._extractOnClose(inputs);\n this._activeBanner.set({\n message,\n component: bannerComponent,\n componentLoader: bannerLoader,\n inputs: componentInputs,\n onClose,\n });\n }\n\n /**\n * Update active banner inputs for a specific message\n */\n updateMessageBannerInputs(messageId: string, inputs: Record<string, unknown>): void {\n const current = this._activeBanner();\n if (!current || current.message.id !== messageId) {\n return;\n }\n\n const prev = current.inputs ?? {};\n const prevTime = Number(prev['currentTime'] ?? 0);\n const nextTime = Number(inputs['currentTime'] ?? 0);\n const unchanged =\n Math.abs(prevTime - nextTime) < 0.25 &&\n prev['duration'] === inputs['duration'] &&\n prev['isPlaying'] === inputs['isPlaying'] &&\n prev['playbackSpeed'] === inputs['playbackSpeed'] &&\n prev['isMuted'] === inputs['isMuted'] &&\n prev['title'] === inputs['title'];\n\n if (unchanged) {\n return;\n }\n\n const { onClose, ...componentInputs } = this._extractOnClose(inputs);\n this._activeBanner.set({\n ...current,\n inputs: {\n ...(current.inputs ?? {}),\n ...componentInputs,\n },\n ...(onClose !== undefined ? { onClose } : {}),\n });\n }\n\n /**\n * Hide active banner. If messageId is provided, hide only when it matches.\n */\n hideMessageBanner(messageId?: string): void {\n const current = this._activeBanner();\n if (!current) {\n return;\n }\n if (messageId && current.message.id !== messageId) {\n return;\n }\n\n if (current.onClose) {\n try {\n current.onClose();\n } catch (error) {\n console.warn('Failed to execute info-bar banner close hook:', error);\n }\n }\n\n this._activeBanner.set(null);\n }\n\n isMessageBannerActive(messageId: string): boolean {\n return this._activeBanner()?.message.id === messageId;\n }\n\n /**\n * Toggle component visibility\n */\n toggleComponent(action: AXConversationInfoBarAction, 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 private _extractOnClose(inputs?: Record<string, unknown>): {\n onClose?: () => void;\n [key: string]: unknown;\n } {\n if (!inputs) return {};\n const { onClose, ...rest } = inputs;\n return {\n ...rest,\n ...(typeof onClose === 'function' ? { onClose: onClose as () => void } : {}),\n };\n }\n}\n","/**\n * InfoBar Component\n * Header bar showing conversation info and actions\n */\n\nimport { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownPanelComponent } from '@acorex/components/dropdown';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, ViewEncapsulation, computed, inject, output, signal } from '@angular/core';\nimport { AXConversationInfoBarAction } from '../../registries';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationMessageUtilsService } from '../../utils';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\nimport { AXConversationRegistryComponentOutletComponent } from '../shared/registry-component-outlet.component';\nimport { AX_CONVERSATION_USER_AVATAR_COMPONENT } from '../../tokens/conversation-avatar.tokens';\nimport { AXConversationInfoBarService } from './info-bar.service';\n\nexport interface AXConversationDropdownMenuItem {\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 encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n AXButtonComponent,\n AXButtonItemComponent,\n AXButtonItemListComponent,\n AXDropdownPanelComponent,\n AXDecoratorModule,\n AXLabelComponent,\n AXConversationAvatarComponent,\n AXConversationRegistryComponentOutletComponent,\n ],\n\n templateUrl: './info-bar.component.html',\n styleUrl: './info-bar.component.css',\n})\nexport class AXConversationInfoBarComponent {\n private readonly conversationService = inject(AXConversationService);\n private readonly infoBar = inject(AXConversationInfoBarService);\n private readonly platform = inject(AXPlatform);\n private readonly destroyRef = inject(DestroyRef);\n private readonly customUserAvatarComponent = inject(AX_CONVERSATION_USER_AVATAR_COMPONENT, { optional: true });\n\n private readonly layoutTick = signal(0);\n\n constructor() {\n const resizeSub = this.platform.resize.subscribe(() => {\n this.layoutTick.update((tick) => tick + 1);\n });\n this.destroyRef.onDestroy(() => resizeSub.unsubscribe());\n }\n\n protected get registry() {\n return this.conversationService.registry;\n }\n\n readonly hasCustomUserAvatar = computed(() => !!this.customUserAvatarComponent);\n\n readonly activeConversation = this.infoBar.activeConversation;\n readonly activeComponent = this.infoBar.activeComponent;\n readonly activeBanner = this.infoBar.activeBanner;\n readonly bannerInputs = computed(() => {\n const activeBanner = this.activeBanner();\n if (!activeBanner) {\n return {};\n }\n return {\n ...activeBanner.inputs,\n message: activeBanner.message,\n };\n });\n readonly membersPopoverTarget = signal<HTMLElement | null>(null);\n readonly actionLoading = signal<boolean>(false);\n\n readonly infoClick = output<void>();\n readonly searchClick = output<void>();\n readonly searchQuery = output<string>();\n readonly menuItemAction = output<string>();\n\n readonly inlineActions = computed(() => {\n this.layoutTick();\n const conversation = this.activeConversation();\n if (!conversation) return [];\n return this.registry.infoBarActions.getInlineActions(conversation);\n });\n\n readonly menuItems = computed((): AXConversationDropdownMenuItem[] => {\n this.layoutTick();\n const conversation = this.activeConversation();\n if (!conversation) return [];\n\n const actions = this.registry.infoBarActions.getMenuActions(conversation);\n\n return actions.map((action) => {\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 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: !this.registry.infoBarActions.isActionEnabled(action, { conversation }),\n };\n });\n });\n\n getStatus(conversation: AXConversation) {\n return AXConversationMessageUtilsService.getConversationStatus(\n conversation,\n this.conversationService.getPeerPresence(conversation),\n );\n }\n\n getSubtitle(conversation: AXConversation): string {\n this.conversationService.presenceTimeTick();\n this.conversationService.typingRevision();\n return AXConversationMessageUtilsService.getConversationSubtitle(conversation, {\n typingUserIds: this.conversationService.getActiveTypingUserIds(conversation.id),\n peerPresence: this.conversationService.getPeerPresence(conversation),\n currentUserId: this.conversationService.currentUser()?.id,\n });\n }\n\n isTyping(conversation: AXConversation): boolean {\n this.conversationService.typingRevision();\n return this.conversationService.getActiveTypingUserIds(conversation.id).length > 0;\n }\n\n onInfoLeftClick(): void {\n this.infoClick.emit();\n }\n\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 await this.activateAction(action, conversation);\n }\n\n private async activateAction(action: AXConversationInfoBarAction, conversation: AXConversation): Promise<void> {\n if ((action.component || action.componentLoader) && action.toggleable) {\n this.infoBar.toggleComponent(action, {\n conversation,\n service: this.infoBar,\n });\n return;\n }\n\n if (action.component || action.componentLoader) {\n this.infoBar.showComponent(action, {\n conversation,\n service: this.infoBar,\n });\n return;\n }\n\n this.actionLoading.set(true);\n try {\n await this.infoBar.executeAction(action.id, conversation);\n } catch (error) {\n console.error('Failed to execute info-bar action:', error);\n } finally {\n this.actionLoading.set(false);\n }\n }\n\n getComponentInputs(): Record<string, unknown> {\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 getInlineComponentInputs(): Record<string, unknown> {\n return {\n conversation: this.activeConversation(),\n service: this.infoBar,\n };\n }\n\n isActiveComponentFullWidth(): boolean {\n const activeComp = this.activeComponent();\n if (!activeComp) return false;\n return activeComp.action.fullWidthComponent !== false;\n }\n\n onCloseComponent(): void {\n this.infoBar.hideComponent();\n }\n\n onCloseBanner(): void {\n this.infoBar.hideMessageBanner();\n }\n\n async onMenuItemClick(item: AXConversationDropdownMenuItem): Promise<void> {\n const conversation = this.activeConversation();\n if (!conversation) return;\n\n const action = this.registry.infoBarActions.getById(item.id);\n if (!action) return;\n\n await this.activateAction(action, conversation);\n this.menuItemAction.emit(item.id);\n }\n}\n","@if (activeConversation(); as conversation) {\n <div class=\"info-bar\">\n <!-- Left: Avatar and Info -->\n <div class=\"info-prefix\" (click)=\"$event.stopPropagation()\">\n <ng-content select=\"ax-prefix\"></ng-content>\n </div>\n <div\n class=\"info-left\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onInfoLeftClick()\"\n (keydown.enter)=\"onInfoLeftClick()\"\n (keydown.space)=\"$event.preventDefault(); onInfoLeftClick()\"\n >\n <div class=\"avatar-wrapper\">\n <ax-conversation-avatar\n kind=\"auto\"\n [conversation]=\"conversation\"\n [size]=\"44\"\n [showStatus]=\"conversation.type === 'private' && !hasCustomUserAvatar()\"\n />\n </div>\n\n <div class=\"info-details\">\n <p class=\"info-title\">{{ conversation.title }}</p>\n @if (conversation.type !== 'private') {\n <p class=\"info-subtitle\" [class.info-subtitle--typing]=\"isTyping(conversation)\">\n {{ getSubtitle(conversation) }}\n </p>\n } @else {\n <div class=\"info-subtitle-with-status\">\n @if (getStatus(conversation) === 'online' && !hasCustomUserAvatar()) {\n <span class=\"online-badge\">●</span>\n }\n <p class=\"info-subtitle\" [class.info-subtitle--typing]=\"isTyping(conversation)\">\n {{ getSubtitle(conversation) }}\n </p>\n </div>\n }\n </div>\n </div>\n\n <!-- Right: Actions or Full-Width Component -->\n @if (!activeComponent() || !isActiveComponentFullWidth()) {\n <div class=\"info-actions\" (click)=\"$event.stopPropagation()\">\n <!-- Inline action buttons from registry -->\n @for (action of inlineActions(); track action.id) {\n @if ((action.component || action.componentLoader) && action.fullWidthComponent === false) {\n <ax-conversation-registry-component-outlet\n [component]=\"action.component\"\n [componentLoader]=\"action.componentLoader\"\n [inputs]=\"getInlineComponentInputs()\"\n />\n } @else {\n <ax-button class=\"action-button\" (onClick)=\"onInlineActionClick(action.id)\" look=\"ghost\">\n <ax-icon [icon]=\"registry.infoBarActions.getActionIcon(action, activeConversation()!)\"></ax-icon>\n </ax-button>\n }\n }\n\n <ax-button look=\"blank\">\n <ax-icon><i class=\"fa-light fa-ellipsis-vertical\"></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() && isActiveComponentFullWidth()) {\n <!-- Full-width component mode (e.g., search) - takes entire info-bar -->\n <div\n class=\"info-component-fullwidth\"\n animate.enter=\"slide-in\"\n animate.leave=\"slide-out\"\n (click)=\"$event.stopPropagation()\"\n >\n <ax-conversation-registry-component-outlet\n [component]=\"activeComponent()!.component\"\n [componentLoader]=\"activeComponent()!.componentLoader\"\n [inputs]=\"getComponentInputs()\"\n />\n <ax-button class=\"action-button close-button\" (onClick)=\"onCloseComponent()\" [look]=\"'ghost'\">\n <ax-icon><i class=\"fa-light fa-xmark\"></i></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n\n @if (activeBanner()) {\n <div class=\"ax-conversation-info-banner\" (click)=\"$event.stopPropagation()\">\n <div class=\"ax-conversation-info-banner__content\">\n <ax-conversation-registry-component-outlet\n [component]=\"activeBanner()!.component\"\n [componentLoader]=\"activeBanner()!.componentLoader\"\n [inputs]=\"bannerInputs()\"\n />\n </div>\n <ax-button\n class=\"ax-conversation-info-banner__close rounded-full\"\n look=\"blank\"\n [iconOnly]=\"true\"\n text=\"Close\"\n (onClick)=\"onCloseBanner()\"\n >\n <ax-icon><i class=\"fa-solid fa-xmark\"></i></ax-icon>\n </ax-button>\n </div>\n }\n}\n","import { AXClosableComponent, AXComponentCloseEvent, AXDataSource } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXListComponent } from '@acorex/components/list';\nimport { AXLoadingComponent } from '@acorex/components/loading';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ViewEncapsulation,\n computed,\n DestroyRef,\n effect,\n EventEmitter,\n inject,\n input,\n signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversationMessage, AXConversationParticipant } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport {\n findExistingPrivateConversation,\n resolvePrivatePeerParticipant,\n sortUsersForForward,\n} from '../../utils/conversation-display.utils';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\n\n@Component({\n selector: 'ax-conversation-forward-message-dialog',\n encapsulation: ViewEncapsulation.None,\n\n imports: [\n CommonModule,\n FormsModule,\n AXListComponent,\n AXSearchBoxComponent,\n AXButtonComponent,\n AXDecoratorGenericComponent,\n AXConversationAvatarComponent,\n AXLoadingComponent,\n AXSkeletonComponent,\n AXTranslationModule,\n ],\n templateUrl: './forward-message-dialog.component.html',\n styleUrl: './forward-message-dialog.component.css',\n providers: [{ provide: AXClosableComponent, useExisting: AXConversationForwardMessageDialogComponent }],\n})\nexport class AXConversationForwardMessageDialogComponent {\n private readonly toastService = inject(AXToastService);\n private readonly translation = inject(AXTranslationService);\n private readonly config = inject(AX_CONVERSATION_CONFIG);\n private readonly destroyRef = inject(DestroyRef);\n\n private searchDebounceTimer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n });\n }\n\n /**\n * Set by {@link AXPopupComponent} when opened via {@link AXPopupService} so the shell title can update.\n */\n readonly __popup__ = input<AXPopupRef | undefined>(undefined);\n\n /**\n * Assigned from `open(..., { data: { conversationService } })` — see {@link AXConversationNewDialogComponent}\n * for why this is not `inject(AXConversationService)`.\n */\n conversationService!: AXConversationService;\n /** Assigned from `open(..., { data: { message } })`. */\n message!: AXConversationMessage;\n\n readonly onClosed = new EventEmitter<AXComponentCloseEvent>();\n\n readonly availableUsers = signal<AXConversationParticipant[]>([]);\n readonly forwardSearchQuery = signal('');\n readonly selectedUserIds = signal<string[]>([]);\n\n readonly forwardListEmptyTpl = viewChild.required<TemplateRef<unknown>>('forwardListEmpty');\n readonly forwardListLoadingTpl = viewChild.required<TemplateRef<unknown>>('forwardListLoading');\n readonly forwardList = viewChild<AXListComponent>('forwardList');\n\n readonly forwardListDataSource = new AXDataSource<unknown>({\n pageSize: 50,\n key: 'id',\n load: async (e) => {\n const query = this.forwardSearchQuery().trim();\n if (e.skip === 0) {\n await this.loadUsersForForward(query);\n }\n\n const items = this.getSortedUsersForForward(query) as unknown[];\n return {\n items: items.slice(e.skip, e.skip + e.take),\n total: items.length,\n };\n },\n byKey: (key) => Promise.resolve(this.availableUsers().find((user) => user.id === key) ?? null),\n });\n\n readonly isForwarding = computed(() => this.conversationService?.isForwardingMessage() ?? false);\n\n readonly canForward = computed(() => this.selectedUserIds().length > 0 && !this.isForwarding());\n\n private readonly _syncPopupTitleEffect = effect(() => {\n const popupRef = this.__popup__();\n const count = this.selectedUserIds().length;\n const title =\n count > 0\n ? this.translation.translateSync('@acorex:chat.dialog.forward-message.selected-count', { params: { count } })\n : this.translation.translateSync('@acorex:chat.dialog.forward-message.title');\n popupRef?.setTitle(title);\n });\n\n onForwardSearchChange(value: string): void {\n this.forwardSearchQuery.set(value ?? '');\n\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n\n this.searchDebounceTimer = setTimeout(() => {\n this.searchDebounceTimer = undefined;\n this.availableUsers.set([]);\n this.forwardList()?.refresh(false);\n }, this.config.debounceSearch);\n }\n\n userFromItem(item: unknown): AXConversationParticipant | null {\n if (!item || typeof item !== 'object' || !('data' in item)) return null;\n return (item as { data?: AXConversationParticipant }).data ?? null;\n }\n\n isSelected(userId: string): boolean {\n return this.selectedUserIds().includes(userId);\n }\n\n private mergeUsersCache(users: AXConversationParticipant[]): void {\n if (users.length === 0) {\n return;\n }\n\n this.availableUsers.update((existing) => {\n const byId = new Map(existing.map((user) => [user.id, user]));\n for (const user of users) {\n if (!this.isExcludedUser(user.id)) {\n byId.set(user.id, user);\n }\n }\n return Array.from(byId.values());\n });\n }\n\n private seedUsersFromConversations(): void {\n const currentUserId = this.conversationService.currentUser()?.id;\n const peers = this.conversationService\n .conversations()\n .filter((conversation) => conversation.type === 'private' && !conversation.archived)\n .map((conversation) => resolvePrivatePeerParticipant(conversation, currentUserId))\n .filter((peer): peer is AXConversationParticipant => !!peer && !this.isExcludedUser(peer.id));\n\n this.mergeUsersCache(peers);\n }\n\n private async loadUsersForForward(query: string): Promise<void> {\n this.seedUsersFromConversations();\n\n const filters = query ? { query } : undefined;\n const pageSize = 100;\n let page = 0;\n let total = Number.POSITIVE_INFINITY;\n\n while (page * pageSize < total) {\n const result = await this.conversationService.getUsers(filters, { page, pageSize });\n this.mergeUsersCache(result.items);\n total = result.total ?? result.items.length;\n if (result.items.length < pageSize) {\n break;\n }\n page++;\n }\n }\n\n private getSortedUsersForForward(query = this.forwardSearchQuery().trim()): AXConversationParticipant[] {\n const currentUserId = this.conversationService.currentUser()?.id;\n const conversations = this.conversationService.conversations();\n let users = this.availableUsers().filter((user) => !this.isExcludedUser(user.id));\n\n if (query) {\n const normalizedQuery = query.toLowerCase();\n users = users.filter((user) => {\n const name = user.name.toLowerCase();\n const description = (user.description ?? '').toLowerCase();\n return name.includes(normalizedQuery) || description.includes(normalizedQuery);\n });\n }\n\n if (!currentUserId) {\n return users.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n return sortUsersForForward(users, conversations, currentUserId);\n }\n\n private isExcludedUser(userId: string): boolean {\n return this.getExcludedUserIds().has(userId);\n }\n\n private getExcludedUserIds(): Set<string> {\n const excluded = new Set<string>();\n const currentUserId = this.conversationService.currentUser()?.id;\n if (currentUserId) {\n excluded.add(currentUserId);\n }\n\n const sourceConversation = this.conversationService\n .conversations()\n .find((conversation) => conversation.id === this.message.conversationId);\n\n if (sourceConversation?.type === 'private') {\n const peer = resolvePrivatePeerParticipant(sourceConversation, currentUserId);\n if (peer) {\n excluded.add(peer.id);\n }\n }\n\n return excluded;\n }\n\n private async resolveConversationIdForUser(userId: string): Promise<string> {\n const currentUserId = this.conversationService.currentUser()?.id;\n if (currentUserId) {\n const existing = findExistingPrivateConversation(\n this.conversationService.conversations(),\n currentUserId,\n userId,\n );\n if (existing) {\n return existing.id;\n }\n }\n\n const conversation = await this.conversationService.createConversation([userId], 'private');\n return conversation.id;\n }\n\n onCancel(): void {\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = null;\n this.onClosed.emit(event);\n }\n\n async onForward(): Promise<void> {\n if (!this.conversationService || !this.message) return;\n\n const selectedIds = this.selectedUserIds();\n if (selectedIds.length === 0 || this.isForwarding()) return;\n\n try {\n await this.conversationService.runWithForwardingLock(async () => {\n const originalConversation = this.conversationService\n .conversations()\n .find((c) => c.id === this.message.conversationId);\n\n const sender = originalConversation?.participants.find((p) => p.id === this.message.senderId);\n\n const forwardPromises = selectedIds.map(async (userId) => {\n const conversationId = await this.resolveConversationIdForUser(userId);\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 || this.translation.translateSync('@acorex:chat.fallbacks.unknown-user'),\n conversationId: this.message.conversationId,\n conversationTitle: originalConversation?.title,\n },\n originalSenderId: this.message.senderId,\n metadata: this.message.metadata,\n };\n return this.conversationService.sendMessage(forwardCommand);\n });\n\n await Promise.all(forwardPromises);\n\n const count = selectedIds.length;\n this.toastService.success(\n this.translation.translateSync('@acorex:chat.notifications.message-forwarded', { params: { count } }),\n );\n\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = { success: true, count };\n this.onClosed.emit(event);\n });\n } catch (error: unknown) {\n console.error('Failed to forward message:', error);\n const errorMessage =\n error &&\n typeof error === 'object' &&\n 'message' in error &&\n typeof (error as { message: unknown }).message === 'string'\n ? (error as { message: string }).message\n : this.translation.translateSync('@acorex:chat.errors.failed-to-forward-message');\n this.toastService.danger(errorMessage);\n }\n }\n}\n","<div class=\"forward-message-dialog\">\n <ng-template #forwardListEmpty>\n <div class=\"forward-list-empty\">\n @if (forwardSearchQuery()) {\n {{ '@acorex:chat.dialog.forward-message.no-users-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.dialog.forward-message.no-users-available' | translate | async }}\n }\n </div>\n </ng-template>\n\n <ng-template #forwardListLoading>\n <div class=\"forward-item-skeleton\">\n <ax-skeleton class=\"skeleton-checkbox\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-avatar\" [animated]=\"true\"></ax-skeleton>\n <div class=\"skeleton-text\">\n <ax-skeleton class=\"skeleton-name\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-description\" [animated]=\"true\"></ax-skeleton>\n </div>\n </div>\n </ng-template>\n\n <div class=\"dialog-content\">\n <div class=\"forward-list-wrap\">\n <div class=\"forward-list-search\">\n <ax-search-box\n [value]=\"forwardSearchQuery()\"\n (valueChange)=\"onForwardSearchChange($event)\"\n [disabled]=\"isForwarding()\"\n [placeholder]=\"'@acorex:chat.placeholders.search-users' | translate | async\"\n ></ax-search-box>\n </div>\n <ax-list\n #forwardList\n class=\"forward-list\"\n [dataSource]=\"forwardListDataSource\"\n [multiple]=\"true\"\n [checkbox]=\"false\"\n [disabled]=\"isForwarding()\"\n [valueField]=\"'id'\"\n [textField]=\"'name'\"\n [itemHeight]=\"60\"\n [ngModel]=\"selectedUserIds()\"\n (ngModelChange)=\"selectedUserIds.set($event ?? [])\"\n [emptyTemplate]=\"forwardListEmptyTpl()\"\n [loadingTemplate]=\"forwardListLoadingTpl()\"\n [itemTemplate]=\"forwardItemTpl\"\n ></ax-list>\n </div>\n </div>\n\n <ng-template #forwardItemTpl let-item>\n @if (userFromItem(item); as user) {\n <div class=\"forward-item-content\">\n <input class=\"ax-checkbox\" type=\"checkbox\" [checked]=\"isSelected(user.id)\" tabindex=\"0\" />\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"user.id\"\n [size]=\"48\"\n [name]=\"user.name\"\n [avatar]=\"user.avatar\"\n [icon]=\"user.icon\"\n />\n <div class=\"forward-item-text\">\n <span class=\"forward-title-text ax-truncated\">{{ user.name }}</span>\n @if (user.description) {\n <span class=\"forward-description-text ax-truncated\">{{ user.description }}</span>\n }\n </div>\n </div>\n }\n </ng-template>\n\n <ax-footer class=\"dialog-footer\">\n <ax-suffix>\n <ax-button\n [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n [look]=\"'solid'\"\n [disabled]=\"isForwarding()\"\n (onClick)=\"onCancel()\"\n >\n </ax-button>\n <ax-button\n [text]=\"'@acorex:chat.actions.forward' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canForward()\"\n (onClick)=\"onForward()\"\n >\n @if (isForwarding()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </ax-suffix>\n </ax-footer>\n</div>\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 conversation-specific API\n */\n\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n DestroyRef,\n Directive,\n ElementRef,\n NgZone,\n PLATFORM_ID,\n afterNextRender,\n inject,\n input,\n output,\n} from '@angular/core';\n\n@Directive({\n selector: '[axInfiniteScroll]',\n})\nexport class AXConversationInfiniteScrollDirective {\n private readonly elementRef = inject(ElementRef);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly ngZone = inject(NgZone);\n private readonly destroyRef = inject(DestroyRef);\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 /** When true, scroll events are ignored (e.g. while a page is loading). */\n readonly scrollDisabled = input(false);\n\n /** Minimum time between emissions (ms) to avoid duplicate API calls. */\n readonly cooldownMs = input(400);\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 private lastEmitAt = 0;\n private pendingEmit: 'top' | 'bottom' | null = null;\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 this.ngZone.runOutsideAngular(() => {\n const onScroll = (): void => {\n if (!this.ticking) {\n window.requestAnimationFrame(() => {\n this.handleScroll();\n this.ticking = false;\n });\n this.ticking = true;\n }\n };\n element.addEventListener('scroll', onScroll, { passive: true });\n this.destroyRef.onDestroy(() => element.removeEventListener('scroll', onScroll));\n });\n }\n\n private handleScroll(): void {\n if (this.scrollDisabled()) {\n return;\n }\n\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 const now = Date.now();\n const cooldown = this.cooldownMs();\n\n let edgeHit: 'top' | 'bottom' | null = null;\n\n // Check top threshold (scrolling up toward older content)\n if ((edge === 'top' || edge === 'both') && scrollTop <= threshold && scrollTop < this.lastScrollTop) {\n edgeHit = 'top';\n }\n\n // Check bottom threshold (scrolling down toward newer content / list end)\n if (\n (edge === 'bottom' || edge === 'both') &&\n scrollTop + clientHeight >= scrollHeight - threshold &&\n scrollTop > this.lastScrollTop\n ) {\n edgeHit = 'bottom';\n }\n\n this.lastScrollTop = scrollTop;\n\n if (!edgeHit) {\n return;\n }\n\n if (now - this.lastEmitAt < cooldown) {\n this.pendingEmit = edgeHit;\n return;\n }\n\n this.emitThreshold(edgeHit);\n }\n\n private emitThreshold(edge: 'top' | 'bottom'): void {\n this.lastEmitAt = Date.now();\n this.pendingEmit = null;\n this.ngZone.run(() => this.scrollThreshold.emit(edge));\n\n const cooldown = this.cooldownMs();\n if (cooldown > 0) {\n window.setTimeout(() => {\n if (this.pendingEmit && !this.scrollDisabled()) {\n const pending = this.pendingEmit;\n this.pendingEmit = null;\n this.emitThreshold(pending);\n }\n }, cooldown);\n }\n }\n}\n","export type AXConversationMediaGalleryLayoutMode = 'single' | 'dual' | 'triple' | 'masonry';\n\nexport interface AXConversationMediaGalleryRow<T> {\n items: T[];\n startIndex: number;\n}\n\n/** Row sizes for masonry-style grouped media albums (Telegram-like packing). */\nexport function getMediaGalleryRowSizes(count: number): number[] {\n if (count <= 1) {\n return [1];\n }\n if (count === 2) {\n return [2];\n }\n if (count === 3) {\n return [3];\n }\n if (count === 4) {\n return [2, 2];\n }\n if (count === 5) {\n return [2, 3];\n }\n if (count === 6) {\n return [3, 3];\n }\n\n const rows: number[] = [];\n let remaining = count;\n\n while (remaining > 0) {\n if (remaining === 4) {\n rows.push(2, 2);\n break;\n }\n if (remaining % 3 === 0) {\n rows.push(3);\n remaining -= 3;\n continue;\n }\n if (remaining % 3 === 1) {\n rows.push(2);\n remaining -= 2;\n continue;\n }\n rows.push(2);\n remaining -= 2;\n }\n\n return rows;\n}\n\nexport function getMediaGalleryLayoutMode(count: number): AXConversationMediaGalleryLayoutMode {\n if (count <= 1) {\n return 'single';\n }\n if (count === 2) {\n return 'dual';\n }\n if (count === 3) {\n return 'triple';\n }\n return 'masonry';\n}\n\nexport function partitionMediaIntoGalleryRows<T>(items: T[]): AXConversationMediaGalleryRow<T>[] {\n const rowSizes = getMediaGalleryRowSizes(items.length);\n const rows: AXConversationMediaGalleryRow<T>[] = [];\n let offset = 0;\n\n for (const size of rowSizes) {\n rows.push({ items: items.slice(offset, offset + size), startIndex: offset });\n offset += size;\n }\n\n return rows;\n}\n","import type { AXConversationMediaItemFields } from '../../../../models';\nimport type { AXConversationUploaderReference } from '../../../../models/conversation-upload.types';\n\nexport function toUploaderReference(item: AXConversationMediaItemFields): AXConversationUploaderReference {\n return {\n url: item.url,\n mediaId: item.mediaId,\n mimeType: item.mimeType,\n size: item.size,\n };\n}\n","export interface AXConversationFileBadge {\n ext: string;\n}\n\nexport function resolveConversationFileExtension(fileName: string): string {\n const parts = fileName.split('.');\n return parts.length > 1 ? parts[parts.length - 1]!.toLowerCase() : 'file';\n}\n\nexport function resolveConversationFileBadge(fileName: string): AXConversationFileBadge {\n return {\n ext: resolveConversationFileExtension(fileName),\n };\n}\n","import { AXUploaderService } from '@acorex/cdk/uploader';\nimport {\n AXFileViewerGalleryService,\n createFileViewerFileTypes,\n resolveFileViewerFileType,\n type AXFileViewerItem,\n} from '@acorex/components/file-viewer';\nimport { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport type {\n AXConversationAudioPayload,\n AXConversationFilePayload,\n AXConversationImagePayload,\n AXConversationMediaItemFields,\n AXConversationMessage,\n AXConversationVideoPayload,\n} from '../../models';\nimport { isNonPersistableMediaUrl } from '../../plugins/composer/components/shared/persisted-media-url';\nimport { normalizeAudioPayload } from '../../plugins/message-list/components/audio-renderer/audio.payload';\nimport { normalizeFilePayload } from '../../plugins/message-list/components/file-renderer/file.payload';\nimport { normalizeImagePayload } from '../../plugins/message-list/components/image-renderer/image.payload';\nimport { toUploaderReference } from '../../plugins/message-list/components/shared/attachment-uploader-reference';\nimport { resolveConversationFileExtension } from '../../plugins/message-list/components/shared/file-badge.utils';\nimport { normalizeVideoPayload } from '../../plugins/message-list/components/video-renderer/video.payload';\n\ntype AXConversationAlbumKind = 'image' | 'video' | 'audio' | 'file';\n\ninterface AXConversationAlbumSource {\n kind: AXConversationAlbumKind;\n item: AXConversationMediaItemFields & {\n name?: string;\n title?: string;\n thumbnailUrl?: string;\n coverUrl?: string;\n extension?: string;\n };\n}\n\nlet fileViewerTypesRegistered = false;\n\nfunction ensureFileViewerTypes(registry: AXFileTypeRegistryService): void {\n if (fileViewerTypesRegistered) {\n return;\n }\n fileViewerTypesRegistered = true;\n registry.registerTypes(createFileViewerFileTypes());\n}\n\nfunction nameFromUrl(url: string | undefined): string | undefined {\n const value = url?.trim();\n if (!value || isNonPersistableMediaUrl(value)) {\n return undefined;\n }\n const path = value.split('?')[0]?.split('#')[0] ?? '';\n const last = path.split('/').pop();\n if (!last || !last.includes('.')) {\n return undefined;\n }\n try {\n return decodeURIComponent(last);\n } catch {\n return last;\n }\n}\n\nfunction resolveViewerUrl(\n uploader: AXUploaderService,\n item: AXConversationMediaItemFields,\n): string | (() => Promise<string>) {\n const direct = item.url?.trim();\n if (direct && !item.mediaId) {\n return direct;\n }\n return () => uploader.resolvePlaybackUrl(toUploaderReference(item));\n}\n\nfunction collectAlbumSources(message: AXConversationMessage): AXConversationAlbumSource[] {\n switch (message.type) {\n case 'image':\n return normalizeImagePayload(message.payload as AXConversationImagePayload).images.map((item) => ({\n kind: 'image',\n item,\n }));\n case 'video':\n return normalizeVideoPayload(message.payload as AXConversationVideoPayload).videos.map((item) => ({\n kind: 'video',\n item,\n }));\n case 'audio':\n return normalizeAudioPayload(message.payload as AXConversationAudioPayload).audios.map((item) => ({\n kind: 'audio',\n item,\n }));\n case 'file':\n return normalizeFilePayload(message.payload as AXConversationFilePayload).files.map((item) => ({\n kind: 'file',\n item,\n }));\n default:\n return [];\n }\n}\n\n/** Number of album attachments on a message (image / video / audio / file). */\nexport function countConversationAlbumItems(message: AXConversationMessage): number {\n return collectAlbumSources(message).length;\n}\n\nfunction toFileViewerItem(\n source: AXConversationAlbumSource,\n index: number,\n uploader: AXUploaderService,\n translation: AXTranslationService,\n): AXFileViewerItem {\n const { kind, item } = source;\n const fallbackName = translation.translateSync(`@acorex:chat.${kind}`);\n const name = item.name?.trim() || item.title?.trim() || nameFromUrl(item.url) || `${fallbackName} ${index + 1}`;\n const extension =\n item.extension?.replace(/^\\./, '').toLowerCase() ||\n (name.includes('.') ? resolveConversationFileExtension(name) : undefined);\n const fileType =\n kind === 'file'\n ? resolveFileViewerFileType({\n id: String(index),\n url: item.url ?? '',\n mimeType: item.mimeType,\n extension,\n })\n : kind;\n\n return {\n id: item.mediaId?.trim() || item.url?.trim() || `${kind}-${index}`,\n fileType,\n name,\n size: item.size,\n mimeType: item.mimeType,\n extension,\n url: resolveViewerUrl(uploader, item),\n thumbnailUrl: resolveViewerThumbnail(kind, item),\n };\n}\n\nfunction resolveViewerThumbnail(\n kind: AXConversationAlbumKind,\n item: AXConversationAlbumSource['item'],\n): string | undefined {\n const thumbnail = item.thumbnailUrl?.trim() || item.coverUrl?.trim();\n if (!thumbnail) {\n return undefined;\n }\n if (kind === 'image') {\n return thumbnail;\n }\n const contentUrl = item.url?.trim();\n if (contentUrl && thumbnail === contentUrl) {\n return undefined;\n }\n return thumbnail;\n}\n\nexport interface OpenConversationMediaGalleryOptions {\n message: AXConversationMessage;\n gallery: AXFileViewerGalleryService;\n uploader: AXUploaderService;\n fileTypes: AXFileTypeRegistryService;\n translation: AXTranslationService;\n startIndex?: number;\n}\n\n/** Opens album attachments with {@link AXFileViewerGalleryService}. */\nexport async function openConversationMediaGallery(options: OpenConversationMediaGalleryOptions): Promise<void> {\n const sources = collectAlbumSources(options.message);\n if (sources.length === 0) {\n return;\n }\n\n ensureFileViewerTypes(options.fileTypes);\n\n const items = sources.map((source, index) =>\n toFileViewerItem(source, index, options.uploader, options.translation),\n );\n\n await options.gallery.open({\n items,\n startIndex: options.startIndex ?? 0,\n thumbnail: true,\n download: true,\n });\n}\n","import type { AXConversationMessageStatus } from '../../models';\n\nconst SVG_VIEW_BOX = '0 -960 960 960';\n\nconst PENDING_PATH =\n 'm612-292 56-56-148-148v-184h-80v216l172 172ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z';\n\nconst CHECK_PATH = 'M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z';\n\nconst DOUBLE_CHECK_PATH =\n 'M268-240 42-466l57-56 170 170 56 56-57 56Zm226 0L268-466l56-57 170 170 368-368 56 57-424 424Zm0-226-57-56 198-198 57 56-198 198Z';\n\nconst FAIL_PATH =\n 'M508.5-291.5Q520-303 520-320t-11.5-28.5Q497-360 480-360t-28.5 11.5Q440-337 440-320t11.5 28.5Q463-280 480-280t28.5-11.5ZM440-440h80v-240h-80v240Zm40 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z';\n\n/** SVG path data for each message delivery status (from `utils/svgs/*.svg`). */\nexport const AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_PATHS: Record<\n AXConversationMessageStatus,\n string\n> = {\n sending: PENDING_PATH,\n sent: CHECK_PATH,\n delivered: DOUBLE_CHECK_PATH,\n read: DOUBLE_CHECK_PATH,\n failed: FAIL_PATH,\n};\n\nexport const AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_VIEW_BOX = SVG_VIEW_BOX;\n","import { Component, computed, input } from '@angular/core';\nimport type { AXConversationMessageStatus } from '../../models';\nimport {\n AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_PATHS,\n AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_VIEW_BOX,\n} from '../../utils/svgs/message-delivery-status-icons';\n\n@Component({\n selector: 'ax-conversation-message-delivery-status-icon',\n template: `\n @if (path(); as iconPath) {\n <svg\n class=\"ax-conversation-message-delivery-status-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n [attr.viewBox]=\"viewBox\"\n aria-hidden=\"true\"\n >\n <path [attr.d]=\"iconPath\" fill=\"currentColor\" />\n </svg>\n }\n `,\n styles: `\n :host {\n display: inline-flex;\n align-items: center;\n }\n\n .ax-conversation-message-delivery-status-icon__svg {\n width: 1.125rem;\n height: 1.125rem;\n }\n `,\n})\nexport class AXConversationMessageDeliveryStatusIconComponent {\n readonly status = input.required<AXConversationMessageStatus>();\n\n protected readonly viewBox = AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_VIEW_BOX;\n\n protected readonly path = computed(() => AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_PATHS[this.status()]);\n}\n","import { AXDateTimeModule } from '@acorex/core/date-time';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AsyncPipe } from '@angular/common';\nimport { Component, input } from '@angular/core';\n\n/**\n * Isolated relative timestamp. The `timeleft` formatter ticks every second;\n * keeping that async pipe here avoids dirty-checking the whole message list.\n */\n@Component({\n selector: 'ax-conversation-message-time',\n imports: [AsyncPipe, AXFormatModule, AXDateTimeModule],\n template: `{{ timestamp() | format: 'timeleft' | async }}`,\n})\nexport class AXConversationMessageTimeComponent {\n readonly timestamp = input.required<Date>();\n}\n","/**\n * Isolated OnPush row for a single chat message.\n * Keeps list scroll cheap: parent CD (scroll button, prepend, etc.) does not\n * re-evaluate this template unless this row's inputs actually change.\n */\nimport type { AXClickEvent } from '@acorex/cdk/common';\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXFileViewerGalleryService } from '@acorex/components/file-viewer';\nimport { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, inject, input, output } from '@angular/core';\nimport { AXConversationMessage } from '../../models';\nimport { getMediaGalleryRowSizes } from '../../plugins/message-list/components/shared/media-gallery-layout';\nimport { AXConversationService } from '../../services';\nimport { isConversationReactionsEnabled } from '../../utils/conversation-display.utils';\nimport { resolveMessageChrome, isPlainChromeMessage } from '../../utils/message-chrome';\nimport {\n AXConversationMessageUtilsService,\n type AXConversationMessageClusterRole,\n} from '../../utils/message-utils.service';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\nimport { AXConversationRegistryComponentOutletComponent } from '../shared/registry-component-outlet.component';\nimport {\n countConversationAlbumItems,\n openConversationMediaGallery,\n} from './conversation-media-gallery';\nimport { AXConversationMessageDeliveryStatusIconComponent } from './message-delivery-status-icon.component';\nimport { AXConversationMessageListService } from './message-list.service';\nimport { AXConversationMessageTimeComponent } from './message-time.component';\n\n@Component({\n selector: 'ax-conversation-message-item',\n encapsulation: ViewEncapsulation.None,\n imports: [\n AsyncPipe,\n AXButtonComponent,\n AXDecoratorIconComponent,\n AXTranslationModule,\n AXConversationMessageTimeComponent,\n AXConversationAvatarComponent,\n AXConversationRegistryComponentOutletComponent,\n AXConversationMessageDeliveryStatusIconComponent,\n ],\n templateUrl: './message-item.component.html',\n host: {\n class: 'message-item',\n role: 'article',\n '[id]': 'hostId()',\n '[attr.aria-label]': 'ariaLabel()',\n '[class.message-own]': 'isOwn()',\n '[class.message-item-context-active]': 'contextMenuActive()',\n '[class.message-item-system]': 'isSystem()',\n '[class.message-item-plain]': 'isPlainChrome()',\n '[class.message-item-media]': 'isMediaHeavy()',\n '[class.message-item-location]': 'message().type === \"location\"',\n '[class.message-item-album]': 'albumRowCount() === 2',\n '[class.message-item-album-tall]': 'albumRowCount() >= 3',\n '[class.message-item-has-reactions]': 'showReactionBubbles()',\n '[class.message-cluster-single]': 'cluster() === \"single\"',\n '[class.message-cluster-start]': 'cluster() === \"start\"',\n '[class.message-cluster-middle]': 'cluster() === \"middle\"',\n '[class.message-cluster-end]': 'cluster() === \"end\"',\n },\n})\nexport class AXConversationMessageItemComponent {\n private readonly conversationService = inject(AXConversationService);\n private readonly messageListService = inject(AXConversationMessageListService);\n private readonly translation = inject(AXTranslationService);\n private readonly uploader = inject(AXUploaderService);\n private readonly fileTypes = inject(AXFileTypeRegistryService);\n private readonly fileViewerGallery = inject(AXFileViewerGalleryService);\n\n private get registry() {\n return this.conversationService.registry;\n }\n\n readonly message = input.required<AXConversationMessage>();\n readonly previousMessage = input<AXConversationMessage | undefined>();\n readonly nextMessage = input<AXConversationMessage | undefined>();\n readonly isGroupConversation = input(false);\n readonly isAdaptiveWideLayout = input(false);\n readonly reactionPickerOpen = input(false);\n readonly contextMenuActive = input(false);\n\n readonly replyNavigate = output<string>();\n readonly toggleReactionPicker = output<{ message: AXConversationMessage; event: MouseEvent }>();\n readonly reactionClick = output<{ message: AXConversationMessage; emoji: string }>();\n\n readonly currentUser = this.conversationService.currentUser;\n readonly activeConversation = this.conversationService.activeConversation;\n\n readonly cluster = computed(\n (): AXConversationMessageClusterRole =>\n AXConversationMessageUtilsService.getMessageClusterRole(\n this.message(),\n this.previousMessage(),\n this.nextMessage(),\n ),\n );\n\n readonly isOwn = computed(() => {\n const user = this.currentUser();\n if (!user) {\n return false;\n }\n return AXConversationMessageUtilsService.isOwnMessage(this.message(), user.id);\n });\n\n readonly isSystem = computed(() => this.message().type === 'system');\n\n readonly hostId = computed(() => `message-${this.message().id}`);\n\n readonly reactionsEnabled = computed(() => isConversationReactionsEnabled(this.activeConversation()));\n\n readonly rendererView = computed(() => {\n this.registry.messageRenderers.renderers();\n const message = this.message();\n const renderer = this.registry.messageRenderers.getRenderer(message);\n return {\n component: renderer?.component,\n componentLoader:\n renderer?.componentLoader ??\n (!renderer || !renderer.component ? AXConversationMessageItemComponent.fallbackRendererLoader : undefined),\n supportsReactions: renderer?.capabilities.supportsReactions ?? false,\n chrome: resolveMessageChrome(renderer?.chrome, message),\n };\n });\n\n readonly isPlainChrome = computed(\n () => !this.isSystem() && (this.rendererView().chrome === 'plain' || isPlainChromeMessage(this.message())),\n );\n\n readonly albumItemCount = computed(() => countConversationAlbumItems(this.message()));\n\n readonly albumRowCount = computed(() => {\n const count = this.albumItemCount();\n return count > 1 ? getMediaGalleryRowSizes(count).length : 0;\n });\n\n readonly isMediaHeavy = computed(() => {\n const type = this.message().type;\n return (\n type === 'image' ||\n type === 'video' ||\n type === 'sticker' ||\n type === 'location' ||\n this.albumItemCount() > 0\n );\n });\n\n readonly rendererInputs = computed(() => ({ message: this.message() }));\n\n readonly messageSupportsReactions = computed(() => this.reactionsEnabled() && this.rendererView().supportsReactions);\n\n readonly showReactionBubbles = computed(() => this.messageSupportsReactions() && this.message().reactions.length > 0);\n\n readonly groupedReactions = computed(() => {\n const message = this.message();\n const user = this.currentUser();\n const grouped = new Map<string, { count: number; userIds: string[]; hasReacted: boolean }>();\n\n for (const reaction of message.reactions) {\n let group = grouped.get(reaction.emoji);\n if (!group) {\n group = { count: 0, userIds: [], hasReacted: false };\n grouped.set(reaction.emoji, group);\n }\n group.count++;\n group.userIds.push(reaction.userId);\n if (user && reaction.userId === user.id) {\n group.hasReacted = true;\n }\n }\n\n return Array.from(grouped.entries()).map(([emoji, data]) => ({\n emoji,\n ...data,\n }));\n });\n\n readonly showSenderName = computed(() => {\n if (!this.isGroupConversation() || this.isOwn() || this.isSystem()) {\n return false;\n }\n const cluster = this.cluster();\n return cluster === 'single' || cluster === 'start';\n });\n\n readonly showMediaGalleryButton = computed(() => this.albumItemCount() > 1);\n\n readonly mediaGalleryButtonLabel = computed(() =>\n this.translation.translateSync('@acorex:chat.actions.view-attachments'),\n );\n\n readonly senderName = computed(() => {\n const conversation = this.activeConversation();\n if (!conversation) {\n return this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');\n }\n return AXConversationMessageUtilsService.getSenderName(this.message(), conversation);\n });\n\n readonly senderNameColor = computed(() =>\n AXConversationMessageUtilsService.getSenderNameColor(this.message().senderId),\n );\n\n readonly replyAccent = computed(() => {\n const replyTo = this.message().replyTo;\n return replyTo ? AXConversationMessageUtilsService.getSenderNameColor(replyTo.senderId) : '';\n });\n\n readonly replySenderName = computed(() => {\n const replyTo = this.message().replyTo;\n const conversation = this.activeConversation();\n if (!replyTo || !conversation) {\n return this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');\n }\n return AXConversationMessageUtilsService.getSenderName(replyTo, conversation);\n });\n\n readonly replyPreview = computed(() => {\n const replyTo = this.message().replyTo;\n return replyTo ? AXConversationMessageUtilsService.getPreviewText(replyTo, 50) : null;\n });\n\n readonly replyAriaLabel = computed(() =>\n this.translation.translateSync('@acorex:chat.aria.reply-to', {\n params: { name: this.replySenderName() },\n }),\n );\n\n readonly forwardedText = computed(() => {\n const message = this.message();\n if (!message.forwardedFrom) {\n return this.translation.translateSync('@acorex:chat.forwarded.from', {\n params: { senderName: this.originalSenderName() },\n });\n }\n\n const senderName = message.forwardedFrom.senderName;\n const conversationTitle = message.forwardedFrom.conversationTitle;\n if (conversationTitle && conversationTitle !== senderName) {\n return this.translation.translateSync('@acorex:chat.forwarded.from-with-conversation', {\n params: { senderName, conversationTitle },\n });\n }\n return this.translation.translateSync('@acorex:chat.forwarded.from', { params: { senderName } });\n });\n\n readonly originalSenderName = computed(() => {\n const message = this.message();\n if (message.forwardedFrom?.senderName) {\n return message.forwardedFrom.senderName;\n }\n return this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');\n });\n\n readonly replyCount = computed(() => this.messageListService.getReplyCount(this.message().id));\n readonly forwardCount = computed(() => this.messageListService.getForwardCount(this.message().id));\n\n readonly statusIconClasses = computed(() => {\n const classes = ['status-icon'];\n const status = this.message().status;\n if (status === 'read') {\n classes.push('status-read');\n } else if (status === 'failed') {\n classes.push('status-failed');\n }\n return classes.join(' ');\n });\n\n readonly bubbleClasses = computed(() => {\n const classes = ['message-bubble'];\n if (this.isSystem()) {\n classes.push('message-system');\n }\n if (this.isPlainChrome()) {\n classes.push('message-plain');\n }\n return classes.join(' ');\n });\n\n /**\n * Avatar column is a layout spacer in group / adaptive layouts.\n * Only mount the avatar component for the last bubble in a cluster.\n */\n readonly showAvatarSlot = computed(() => {\n if (this.isSystem()) {\n return false;\n }\n if (this.isAdaptiveWideLayout()) {\n return true;\n }\n return this.isGroupConversation() && !this.isOwn();\n });\n\n readonly mountAvatar = computed(() => {\n if (!this.showAvatarSlot()) {\n return false;\n }\n const cluster = this.cluster();\n return cluster === 'single' || cluster === 'end';\n });\n\n readonly ariaLabel = computed(() => {\n const message = this.message();\n const sender = this.senderName();\n const time = message.timestamp instanceof Date ? message.timestamp.toLocaleTimeString() : String(message.timestamp);\n const isOwn = this.isOwn();\n const prefix = isOwn ? this.translation.translateSync('@acorex:chat.fallbacks.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 this.translation.translateSync('@acorex:chat.aria.message-label', {\n params: { prefix, time, text, status },\n });\n });\n\n private static readonly fallbackRendererLoader = () =>\n import('../../plugins/message-list/components/fallback-renderer/fallback-renderer.component').then(\n (m) => m.AXConversationFallbackRendererComponent,\n );\n\n onReplyPreviewActivate(event?: Event): void {\n if (event instanceof KeyboardEvent && event.key === ' ') {\n event.preventDefault();\n }\n const replyId = this.message().replyTo?.id;\n if (replyId) {\n this.replyNavigate.emit(replyId);\n }\n }\n\n onToggleReactionPicker(event: MouseEvent): void {\n this.toggleReactionPicker.emit({ message: this.message(), event });\n }\n\n onReactionClick(emoji: string): void {\n this.reactionClick.emit({ message: this.message(), emoji });\n }\n\n onOpenMediaGallery(event: AXClickEvent): void {\n event.nativeEvent?.stopPropagation();\n void openConversationMediaGallery({\n message: this.message(),\n gallery: this.fileViewerGallery,\n uploader: this.uploader,\n fileTypes: this.fileTypes,\n translation: this.translation,\n });\n }\n}\n","@if (showAvatarSlot()) {\n <div class=\"message-avatar\">\n @if (mountAvatar()) {\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"message().senderId\"\n [conversation]=\"activeConversation()\"\n [message]=\"message()\"\n [size]=\"36\"\n />\n }\n </div>\n}\n\n<div\n class=\"message-content-row\"\n [class.message-content-row-own]=\"isOwn()\"\n [class.message-content-row-has-reaction-btn]=\"messageSupportsReactions()\"\n>\n @if (messageSupportsReactions()) {\n <button\n type=\"button\"\n class=\"add-reaction-button add-reaction-outside\"\n [class.add-reaction-visible]=\"reactionPickerOpen()\"\n (click)=\"onToggleReactionPicker($event)\"\n [attr.aria-label]=\"'@acorex:chat.actions.add-reaction' | translate | async\"\n >\n <i class=\"fa-light fa-face-smile\"></i>\n </button>\n }\n\n <div class=\"message-bubble-container\" [id]=\"'message-bubble-' + message().id\" [attr.data-message-id]=\"message().id\">\n <div\n [class]=\"bubbleClasses()\"\n [class.message-bubble-sent]=\"isOwn()\"\n [class.message-bubble-received]=\"!isOwn()\"\n >\n @if (showSenderName() || showMediaGalleryButton()) {\n <div class=\"message-bubble-header\">\n @if (showSenderName()) {\n <div class=\"message-sender\" [style.--ax-comp-message-sender-color]=\"senderNameColor()\">\n {{ senderName() }}\n </div>\n }\n @if (showMediaGalleryButton()) {\n <ax-button\n class=\"message-media-gallery-btn ax-sm rounded-full\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"mediaGalleryButtonLabel()\"\n [attr.aria-label]=\"mediaGalleryButtonLabel()\"\n [attr.title]=\"mediaGalleryButtonLabel()\"\n (onClick)=\"onOpenMediaGallery($event)\"\n >\n <ax-icon>\n <i class=\"fa-light fa-images\" aria-hidden=\"true\"></i>\n </ax-icon>\n </ax-button>\n }\n </div>\n }\n\n @if (message().replyTo; as replyTo) {\n <div\n class=\"reply-preview\"\n [style.--ax-comp-reply-accent]=\"replyAccent()\"\n (click)=\"onReplyPreviewActivate()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"replyAriaLabel()\"\n (keydown.enter)=\"onReplyPreviewActivate($event)\"\n (keydown.space)=\"onReplyPreviewActivate($event)\"\n >\n <div class=\"reply-preview-content\">\n <div class=\"reply-preview-sender\">{{ replySenderName() }}</div>\n <div class=\"reply-preview-text\">\n @if (replyPreview(); as preview) {\n <span class=\"last-message\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>{{ '@acorex:chat.' + preview.type | translate | async }}\n } @else {\n {{ preview.value }}\n }\n </span>\n }\n </div>\n </div>\n </div>\n }\n\n @if (message().forwarded) {\n <div class=\"forwarded-preview\">\n <i class=\"fa-solid fa-share\"></i>\n <span class=\"forwarded-text\">{{ forwardedText() }}</span>\n </div>\n }\n\n <ax-conversation-registry-component-outlet\n [component]=\"rendererView().component\"\n [componentLoader]=\"rendererView().componentLoader\"\n [inputs]=\"rendererInputs()\"\n />\n\n @if (showReactionBubbles()) {\n <div class=\"message-reactions-container\">\n <div class=\"message-reactions-bubbles\">\n @for (reaction of groupedReactions(); track reaction.emoji) {\n <button\n type=\"button\"\n class=\"reaction-bubble\"\n [class.reaction-bubble-active]=\"reaction.hasReacted\"\n (click)=\"onReactionClick(reaction.emoji)\"\n [attr.aria-label]=\"reaction.emoji + ' ' + reaction.count\"\n >\n <span class=\"reaction-emoji\">{{ reaction.emoji }}</span>\n @if (reaction.count > 1) {\n <span class=\"reaction-count\">{{ reaction.count }}</span>\n }\n </button>\n }\n </div>\n </div>\n }\n\n @if (!isSystem()) {\n <div class=\"message-footer\">\n @if (replyCount(); as replies) {\n @if (replies > 0) {\n <span class=\"message-footer-count\" [attr.aria-label]=\"replies + ' replies'\">\n <i class=\"fa-solid fa-message\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ replies }}</span>\n </span>\n }\n }\n @if (forwardCount(); as forwards) {\n @if (forwards > 0) {\n <span class=\"message-footer-count\" [attr.aria-label]=\"forwards + ' forwards'\">\n <i class=\"fa-solid fa-share\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ forwards }}</span>\n </span>\n }\n }\n @if (replyCount() > 0 || forwardCount() > 0) {\n <span class=\"message-footer-split\" aria-hidden=\"true\"></span>\n }\n <span class=\"message-time\">\n <ax-conversation-message-time [timestamp]=\"message().timestamp\" />\n </span>\n @if (message().editedAt) {\n <span class=\"edited-indicator\">\n <span>{{ '@acorex:chat.status.edited' | translate | async }}</span>\n </span>\n }\n @if (isOwn()) {\n <span [class]=\"statusIconClasses()\">\n <ax-conversation-message-delivery-status-icon [status]=\"message().status\" />\n </span>\n }\n </div>\n }\n </div>\n </div>\n</div>\n","import { AXTranslationService } from '@acorex/core/translation';\nimport { Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { AXConversation } from '../../models';\n\n@Component({\n selector: 'ax-conversation-message-list-empty-default',\n encapsulation: ViewEncapsulation.None,\n\n imports: [],\n host: {\n class: 'ax-message-empty-host',\n },\n templateUrl: './message-list-empty-default.component.html',\n styleUrl: './message-list-empty-default.component.css',\n})\nexport class AXConversationMessageListEmptyDefaultComponent {\n private readonly translation = inject(AXTranslationService);\n readonly conversation = input.required<AXConversation>();\n\n readonly emptyAriaLabel = computed(() => this.translation.translateSync('@acorex:chat.status.no-messages'));\n readonly emptyTitle = computed(() => this.translation.translateSync('@acorex:chat.empty.no-messages-yet'));\n\n readonly iconClass = computed(() => {\n switch (this.conversation().type) {\n case 'private':\n return 'fa-light fa-comment-dots';\n case 'group':\n return 'fa-light fa-users';\n case 'channel':\n return 'fa-light fa-hashtag';\n case 'bot':\n return 'fa-light fa-robot';\n default:\n return 'fa-light fa-comments';\n }\n });\n\n readonly eyebrowLabel = computed(() => {\n switch (this.conversation().type) {\n case 'private':\n return this.translation.translateSync('@acorex:chat.empty.eyebrow.direct-message');\n case 'group':\n return this.translation.translateSync('@acorex:chat.empty.eyebrow.group-chat');\n case 'channel':\n return this.translation.translateSync('@acorex:chat.empty.eyebrow.channel');\n case 'bot':\n return this.translation.translateSync('@acorex:chat.empty.eyebrow.assistant');\n default:\n return this.translation.translateSync('@acorex:chat.empty.eyebrow.conversation');\n }\n });\n\n readonly emptyDescriptionPrefix = computed(() => {\n switch (this.conversation().type) {\n case 'private':\n return this.translation.translateSync('@acorex:chat.empty.description.private-prefix');\n case 'group':\n return this.translation.translateSync('@acorex:chat.empty.description.group-prefix');\n case 'channel':\n return this.translation.translateSync('@acorex:chat.empty.description.channel-prefix');\n case 'bot':\n return this.translation.translateSync('@acorex:chat.empty.description.bot-prefix');\n default:\n return this.translation.translateSync('@acorex:chat.empty.description.conversation-prefix');\n }\n });\n}\n"," <div class=\"ax-message-empty\" role=\"status\" [attr.aria-label]=\"emptyAriaLabel()\">\n <div class=\"ax-message-empty__ambient\" aria-hidden=\"true\">\n <span class=\"ax-message-empty__grid\"></span>\n </div>\n\n <div class=\"ax-message-empty__card\">\n <div class=\"ax-message-empty__icon-stack\">\n <span class=\"ax-message-empty__pulse\" aria-hidden=\"true\"></span>\n <div class=\"ax-message-empty__icon-bg\">\n <i [class]=\"iconClass()\" aria-hidden=\"true\"></i>\n </div>\n </div>\n\n <p class=\"ax-message-empty__eyebrow\">{{ eyebrowLabel() }}</p>\n <h3 class=\"ax-message-empty__title\">{{ emptyTitle() }}</h3>\n <p class=\"ax-message-empty__desc\">\n {{ emptyDescriptionPrefix() }}\n <span class=\"ax-message-empty__name\">{{ conversation().title }}</span\n >.\n </p>\n </div>\n </div>\n","import { AXTranslationService } from '@acorex/core/translation';\nimport { Component, ViewEncapsulation, inject } from '@angular/core';\n\n/** Default message list surface when no conversation is selected and no `ax-conversation-message-list-no-active` content is projected. */\n@Component({\n selector: 'ax-conversation-message-list-no-active-default',\n encapsulation: ViewEncapsulation.None,\n\n imports: [],\n host: {\n class: 'ax-message-no-active-host',\n },\n templateUrl: './message-list-no-active-default.component.html',\n styleUrl: './message-list-no-active-default.component.css',\n})\nexport class AXConversationMessageListNoActiveDefaultComponent {\n private readonly translation = inject(AXTranslationService);\n\n readonly noConversationAriaLabel = () =>\n this.translation.translateSync('@acorex:chat.status.no-conversation-selected');\n readonly inboxLabel = () => this.translation.translateSync('@acorex:chat.empty.inbox');\n readonly noConversationOpenLabel = () => this.translation.translateSync('@acorex:chat.empty.no-conversation-open');\n readonly noConversationDescription = () =>\n this.translation.translateSync('@acorex:chat.empty.no-conversation-description');\n}\n"," <div class=\"ax-message-no-active\" role=\"status\" [attr.aria-label]=\"noConversationAriaLabel()\">\n <div class=\"ax-message-no-active__ambient\" aria-hidden=\"true\">\n <span class=\"ax-message-no-active__grid\"></span>\n </div>\n\n <div class=\"ax-message-no-active__card\">\n <div class=\"ax-message-no-active__icon-stack\">\n <span class=\"ax-message-no-active__pulse\" aria-hidden=\"true\"></span>\n <div class=\"ax-message-no-active__icon-bg\">\n <i class=\"fa-light fa-comments\" aria-hidden=\"true\"></i>\n </div>\n </div>\n\n <p class=\"ax-message-no-active__eyebrow\">{{ inboxLabel() }}</p>\n <h3 class=\"ax-message-no-active__title\">{{ noConversationOpenLabel() }}</h3>\n <p class=\"ax-message-no-active__desc\">\n {{ noConversationDescription() }}\n </p>\n </div>\n </div>\n","import type { AXPlacement } from '@acorex/cdk/common';\n\n/** Document / layout direction for reaction picker anchoring. */\nexport function isRtlDocument(document: Document): boolean {\n const explicitDir =\n document.documentElement.getAttribute('dir') ?? document.body?.getAttribute('dir');\n if (explicitDir === 'rtl' || explicitDir === 'ltr') {\n return explicitDir === 'rtl';\n }\n return getComputedStyle(document.documentElement).direction === 'rtl';\n}\n\n/** Matches `--ax-comp-message-list-adaptive-breakpoint` in message-list styles (52rem). */\nexport const MESSAGE_LIST_ADAPTIVE_BREAKPOINT_PX = 52 * 16;\n\n/**\n * Reaction button sits outside the bubble on inline-end (received) or inline-start (own ping-pong).\n * In adaptive wide layout all buttons sit on inline-end — use received placement rules.\n */\nexport function resolveReactionPickerPlacement(\n isOwnMessage: boolean,\n isRtl: boolean,\n isAdaptiveWideLayout = false,\n): AXPlacement {\n const ownsInPingPong = isOwnMessage && !isAdaptiveWideLayout;\n const openTowardPhysicalStart = (!ownsInPingPong && !isRtl) || (ownsInPingPong && isRtl);\n return openTowardPhysicalStart ? 'end-top' : 'start-top';\n}\n","/**\n * MessageList Component\n * Displays messages with date separators and actions.\n * Rows are isolated OnPush items; a single shared context menu avoids per-row scroll listeners.\n */\nimport type { AXPlacement } from '@acorex/cdk/common';\nimport { AXUploaderFileChangeEvent, AXUploaderZoneDirective } from '@acorex/cdk/uploader';\nimport { AXActionSheetService } from '@acorex/components/action-sheet';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFabComponent } from '@acorex/components/fab';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport {\n AXContextMenuComponent,\n AXContextMenuItemsClickEvent,\n AXContextMenuOpeningEvent,\n AXMenuItem,\n} from '@acorex/components/menu';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXFileService } from '@acorex/core/file';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectorRef,\n Component,\n ElementRef,\n NgZone,\n OnDestroy,\n Type,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { AXConversationInfiniteScrollDirective } from '../../directives';\nimport { AXConversationMessage, AXConversationMessageListEmptyComponent } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { isConversationReactionsEnabled } from '../../utils/conversation-display.utils';\nimport {\n resolveMessageListBackgroundStyle,\n usesDefaultMessageListWallpaper,\n} from '../../utils/message-list-background.utils';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\nimport { AXConversationComposerService } from '../composer/composer.service';\nimport { AXConversationInfoBarService } from '../info-bar/info-bar.service';\nimport { AXConversationMessageItemComponent } from './message-item.component';\nimport { AXConversationMessageListEmptyDefaultComponent } from './message-list-empty-default.component';\nimport { AXConversationMessageListNoActiveDefaultComponent } from './message-list-no-active-default.component';\nimport { AXConversationMessageDateGroup, AXConversationMessageListService } from './message-list.service';\nimport {\n MESSAGE_LIST_ADAPTIVE_BREAKPOINT_PX,\n isRtlDocument,\n resolveReactionPickerPlacement,\n} from './reaction-picker-placement';\n\nconst DATE_SEPARATOR_FADE_MS = 3000;\n/** Distance from the end of the feed that still counts as \"at the bottom\" for stick-to-bottom. */\nconst STICK_TO_BOTTOM_PX = 8;\n\n@Component({\n selector: 'ax-conversation-message-list',\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n AXFabComponent,\n AXContextMenuComponent,\n AXDecoratorModule,\n AXLabelComponent,\n AXSkeletonComponent,\n AXPopoverComponent,\n AXTranslationModule,\n AXConversationInfiniteScrollDirective,\n AXUploaderZoneDirective,\n AXConversationMessageItemComponent,\n ],\n templateUrl: './message-list.component.html',\n styleUrl: './message-list.component.css',\n})\nexport class AXConversationMessageListComponent implements OnDestroy {\n private readonly conversationService = inject(AXConversationService);\n private readonly messageListService = inject(AXConversationMessageListService);\n private readonly composerService = inject(AXConversationComposerService);\n private readonly fileService = inject(AXFileService);\n private readonly toast = inject(AXToastService);\n private readonly infoBarService = inject(AXConversationInfoBarService);\n protected readonly translation = inject(AXTranslationService);\n private readonly document = inject(DOCUMENT);\n private readonly platform = inject(AXPlatform);\n private readonly actionSheetService = inject(AXActionSheetService);\n private readonly ngZone = inject(NgZone);\n private readonly cdr = inject(ChangeDetectorRef);\n protected readonly config = inject(AX_CONVERSATION_CONFIG);\n\n /**\n * Background for the message list scroll area from config, or the built-in soft wash when unset/empty.\n * Set `messageListBackground` to `transparent` or `none` for a flat look.\n * Supports `{ light, dark }` for theme-specific backgrounds.\n */\n readonly messageListUsesDefaultWallpaper = computed(() => {\n const conversationBackground = this.activeConversation()?.metadata?.['messageListBackground'];\n const source = conversationBackground ?? this.config.messageListBackground;\n return usesDefaultMessageListWallpaper(source);\n });\n\n readonly messageListWallpaperDark = computed(() => {\n this.platform.themeMode();\n return this.platform.isDark();\n });\n\n readonly messageListBackgroundStyle = computed(() => {\n this.platform.themeMode();\n const isDark = this.platform.isDark();\n const conversationBackground = this.activeConversation()?.metadata?.['messageListBackground'];\n const source = conversationBackground ?? this.config.messageListBackground;\n return resolveMessageListBackgroundStyle(source, isDark);\n });\n\n resolvedEmptyStateComponent(): Type<AXConversationMessageListEmptyComponent> {\n const fromMetadata = this.activeConversation()?.metadata?.['messageListEmptyComponent'];\n if (typeof fromMetadata === 'function') {\n return fromMetadata as Type<AXConversationMessageListEmptyComponent>;\n }\n return AXConversationMessageListEmptyDefaultComponent;\n }\n\n /** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */\n protected readonly noActiveFallbackComponent = AXConversationMessageListNoActiveDefaultComponent;\n\n // Timeout cleanup to prevent memory leaks\n private readonly timeouts = new Set<number>();\n private dateSeparatorFadeTimer = 0;\n\n // Reaction picker state\n readonly reactionPickerTarget = signal<string | null>(null);\n readonly reactionPickerElement = signal<HTMLElement | null>(null);\n readonly reactionPickerPlacement = signal<AXPlacement>('end-top');\n readonly reactionPopover = viewChild<any>('reactionPopover');\n\n /** Message id whose context menu is open (for active row styling). */\n readonly contextMenuMessageId = signal<string | null>(null);\n private readonly contextMenuMessage = signal<AXConversationMessage | null>(null);\n private readonly messageActionsMenu = viewChild<AXContextMenuComponent>('messageActionsMenu');\n\n /** True while files are dragged over the message list drop zone. */\n readonly messageListDragging = signal(false);\n\n /** True when the message list uses single-column adaptive layout (matches CSS container query). */\n readonly isAdaptiveWideLayout = signal(false);\n\n /** While true, older history is being prepended — do not auto-scroll to the latest message. */\n private restoringScrollAfterPrepend = false;\n\n /**\n * Stick to the latest message across layout shifts (media decode, lazy outlets).\n * Cleared as soon as the user scrolls up — even within `scrollThreshold` —\n * otherwise ResizeObserver keeps yanking the feed back to the bottom.\n */\n private pinnedToBottom = true;\n\n /**\n * True while we assign `scrollTop`. Kept until the following animation frame\n * because some browsers dispatch `scroll` asynchronously after `scrollTop` writes.\n */\n private programmaticScroll = false;\n private programmaticScrollGen = 0;\n\n private adaptiveLayoutResizeObserver?: ResizeObserver;\n private documentClickListener?: (event: MouseEvent) => void;\n\n // Available reaction emojis from API (loaded lazily when picker opens)\n readonly availableReactions = signal<string[]>([]);\n private reactionsLoading = false;\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 /** Whether older messages remain on the server */\n readonly hasMoreMessages = this.messageListService.hasMoreMessages;\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 readonly isGroupConversation = computed(() => this.activeConversation()?.type === 'group');\n\n /** Placeholder rows for the initial message list skeleton. */\n protected readonly loadingSkeletonItems = [0, 1, 2, 3, 4, 5, 6, 7] as const;\n\n /**\n * Conversation whose feed has already been pinned to the latest message.\n * Compared with the active id in `feedReady` so a chat switch hides the list\n * in the same render — before the effect that pins the new history.\n */\n private readonly pinnedConversationId = signal<string | null>(null);\n private feedRevealGeneration = 0;\n private feedRevealRaf = 0;\n\n /** False until this conversation is pinned to the bottom (never shows history from the top). */\n readonly feedReady = computed(() => {\n const id = this.activeConversation()?.id ?? null;\n return !!id && id === this.pinnedConversationId();\n });\n\n /**\n * Keep the skeleton up until the feed is pinned. The real list stays\n * `visibility: hidden` underneath so bubbles never show through the cover.\n */\n readonly showOpenCover = computed(\n () => !this.feedReady() && (this.loading() || this.messages().length > 0),\n );\n\n /** Whether the active conversation allows message reactions. */\n readonly reactionsEnabled = computed(() => isConversationReactionsEnabled(this.activeConversation()));\n\n /** Messages */\n readonly messages = this.conversationService.activeMessages;\n\n /** Messages keyed by id for O(1) lookups during intersection callbacks. */\n private readonly messagesById = computed(() => {\n const map = new Map<string, AXConversationMessage>();\n for (const message of this.messages()) {\n map.set(message.id, message);\n }\n return map;\n });\n\n /** Message action event */\n readonly messageAction = output<{ message: AXConversationMessage; 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 void this.conversationService.ensureInitialized();\n\n effect((onCleanup) => {\n const el = this.messageListRef()?.nativeElement;\n if (!el || typeof ResizeObserver === 'undefined') {\n this.isAdaptiveWideLayout.set(false);\n return;\n }\n\n const updateAdaptiveLayout = (fromResizeObserver: boolean): void => {\n const next = el.clientWidth >= MESSAGE_LIST_ADAPTIVE_BREAKPOINT_PX;\n if (this.isAdaptiveWideLayout() === next) {\n return;\n }\n if (fromResizeObserver) {\n this.ngZone.run(() => this.isAdaptiveWideLayout.set(next));\n } else {\n this.isAdaptiveWideLayout.set(next);\n }\n };\n\n updateAdaptiveLayout(false);\n this.ngZone.runOutsideAngular(() => {\n const observer = new ResizeObserver(() => updateAdaptiveLayout(true));\n observer.observe(el);\n this.adaptiveLayoutResizeObserver = observer;\n onCleanup(() => {\n observer.disconnect();\n this.adaptiveLayoutResizeObserver = undefined;\n });\n });\n });\n\n effect((onCleanup) => {\n const container = this.messagesContainerRef()?.nativeElement;\n if (!container) {\n return;\n }\n\n this.ngZone.runOutsideAngular(() => {\n let scrollRaf = 0;\n let lastScrollTop = container.scrollTop;\n let lastTouchY: number | null = null;\n\n const releasePinFromBottom = (): void => {\n this.pinnedToBottom = false;\n };\n\n const syncPinnedFromUserScroll = (): void => {\n const scrollTop = container.scrollTop;\n const scrollingUp = scrollTop + 1 < lastScrollTop;\n lastScrollTop = scrollTop;\n\n // Any real upward movement must unpin. Re-pin only at the true end of\n // the feed — `scrollThreshold` (100px) is far enough that a small\n // scroll-up plus a later layout/scroll event used to re-pin, and\n // ResizeObserver then yanked the viewport back to the latest message.\n if (scrollingUp) {\n releasePinFromBottom();\n return;\n }\n if (this.isStuckToBottom(container)) {\n this.pinnedToBottom = true;\n }\n };\n\n const onScroll = (): void => {\n if (this.restoringScrollAfterPrepend) {\n lastScrollTop = container.scrollTop;\n return;\n }\n\n const scrollTop = container.scrollTop;\n const scrollingUp = scrollTop + 1 < lastScrollTop;\n\n // Programmatic writes never scroll up. If scrollTop decreased, the\n // user won the race against a delayed `scroll` from `scrollTop = …`.\n if (this.programmaticScroll && !scrollingUp) {\n lastScrollTop = scrollTop;\n return;\n }\n\n syncPinnedFromUserScroll();\n if (scrollRaf) {\n return;\n }\n scrollRaf = requestAnimationFrame(() => {\n scrollRaf = 0;\n const pinned = this.pinnedToBottom;\n if (this.showScrollButton() === pinned) {\n this.ngZone.run(() => this.showScrollButton.set(!pinned));\n }\n this.revealStuckDateSeparators(container);\n });\n };\n\n const onWheel = (event: WheelEvent): void => {\n // Unpin in the input phase, before layout/ResizeObserver can stick.\n if (event.deltaY < 0) {\n releasePinFromBottom();\n }\n };\n\n const onTouchStart = (event: TouchEvent): void => {\n lastTouchY = event.touches[0]?.clientY ?? null;\n };\n\n const onTouchMove = (event: TouchEvent): void => {\n const y = event.touches[0]?.clientY;\n if (y == null) {\n return;\n }\n // Finger moving down → content moves up (older messages).\n if (lastTouchY != null && y > lastTouchY + 1) {\n releasePinFromBottom();\n }\n lastTouchY = y;\n };\n\n const onTouchEnd = (): void => {\n lastTouchY = null;\n };\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'PageUp' || event.key === 'ArrowUp' || event.key === 'Home') {\n releasePinFromBottom();\n }\n };\n\n container.addEventListener('scroll', onScroll, { passive: true });\n container.addEventListener('wheel', onWheel, { passive: true });\n container.addEventListener('touchstart', onTouchStart, { passive: true });\n container.addEventListener('touchmove', onTouchMove, { passive: true });\n container.addEventListener('touchend', onTouchEnd, { passive: true });\n container.addEventListener('touchcancel', onTouchEnd, { passive: true });\n container.addEventListener('keydown', onKeyDown);\n const initRaf = requestAnimationFrame(() => this.revealStuckDateSeparators(container));\n onCleanup(() => {\n if (scrollRaf) {\n cancelAnimationFrame(scrollRaf);\n }\n cancelAnimationFrame(initRaf);\n this.clearDateSeparatorFadeTimer();\n container.removeEventListener('scroll', onScroll);\n container.removeEventListener('wheel', onWheel);\n container.removeEventListener('touchstart', onTouchStart);\n container.removeEventListener('touchmove', onTouchMove);\n container.removeEventListener('touchend', onTouchEnd);\n container.removeEventListener('touchcancel', onTouchEnd);\n container.removeEventListener('keydown', onKeyDown);\n });\n });\n });\n\n // Close reaction picker when clicking outside\n if (typeof document !== 'undefined') {\n const onDocumentClick = (e: MouseEvent): void => {\n if (!this.reactionPickerTarget()) {\n return;\n }\n const target = e.target as HTMLElement;\n if (\n target.closest('.message-reactions-container') ||\n target.closest('.add-reaction-button') ||\n target.closest('.reaction-picker-popup')\n ) {\n return;\n }\n this.ngZone.run(() => this.closeReactionPicker());\n };\n this.ngZone.runOutsideAngular(() => {\n document.addEventListener('click', onDocumentClick);\n this.documentClickListener = onDocumentClick;\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 if (currentConversationId !== previousConversationId) {\n this.contextMenuMessageId.set(null);\n this.closeReactionPicker();\n this.observedReadMessageIds.clear();\n this.composerService.onConversationChanged(previousConversationId, currentConversationId);\n this.infoBarService.onConversationChanged();\n }\n // Only scroll if the conversation ID actually changed (not just updated)\n if (currentConversationId && currentConversationId !== previousConversationId) {\n this.messageListService.resetPagination();\n this.beginFeedReveal();\n } else if (!currentConversationId) {\n this.cancelFeedReveal();\n }\n\n previousConversationId = currentConversationId;\n });\n });\n\n effect(() => {\n const loading = this.loading();\n const count = this.messages().length;\n untracked(() => {\n if (!this.activeConversation()?.id) {\n return;\n }\n if (!loading && count === 0 && !this.feedReady()) {\n this.pinnedToBottom = true;\n this.pinnedConversationId.set(this.activeConversation()?.id ?? null);\n return;\n }\n if (count > 0 && !this.feedReady() && !this.feedRevealRaf) {\n this.scheduleFeedPin();\n }\n });\n });\n\n // Auto-scroll only when new messages are appended at the bottom (not when loading older history above).\n let previousMessageCount = 0;\n let previousLastMessageId: string | null = null;\n let previousConversationIdForScroll: string | null = null;\n\n effect(() => {\n const messages = this.messages();\n const conversation = this.activeConversation();\n const conversationId = conversation?.id ?? null;\n const currentCount = messages.length;\n const currentLastId = messages.at(-1)?.id ?? null;\n const container = untracked(() => this.messagesContainerRef()?.nativeElement);\n\n if (conversationId !== previousConversationIdForScroll) {\n previousConversationIdForScroll = conversationId;\n previousMessageCount = currentCount;\n previousLastMessageId = currentLastId;\n return;\n }\n\n if (!container || !conversation || this.restoringScrollAfterPrepend || !this.feedReady()) {\n previousMessageCount = currentCount;\n previousLastMessageId = currentLastId;\n return;\n }\n\n const appendedAtBottom =\n currentCount > previousMessageCount &&\n previousLastMessageId !== null &&\n currentLastId !== previousLastMessageId;\n\n if (appendedAtBottom && this.pinnedToBottom) {\n this.pinFeedToBottom(container);\n }\n\n previousMessageCount = currentCount;\n previousLastMessageId = currentLastId;\n });\n\n // Scroll to bottom when an external scroll request is issued (e.g., after sending a message).\n // pinFeedToBottom must be untracked: it reads viewChild / showScrollButton, and those\n // change when the user scrolls up (FAB appears) — which would re-run this effect and\n // yank the feed back to the latest message.\n let initialScrollRequest = true;\n effect(() => {\n void this.messageListService.scrollRequests();\n untracked(() => {\n if (initialScrollRequest) {\n initialScrollRequest = false;\n return;\n }\n this.pinFeedToBottom();\n });\n });\n\n this.setupIntersectionObserver();\n this.setupMediaScrollCompensation();\n }\n\n private intersectionObserver?: IntersectionObserver;\n private readonly readIntersectionObserver = signal<IntersectionObserver | null>(null);\n private readonly observedReadMessageIds = new Set<string>();\n\n /**\n * Setup intersection observer to mark messages as read when visible\n */\n private setupIntersectionObserver(): void {\n effect((onCleanup) => {\n const container = this.messagesContainerRef()?.nativeElement;\n if (!container) {\n this.readIntersectionObserver.set(null);\n return;\n }\n\n this.ngZone.runOutsideAngular(() => {\n const observer = new IntersectionObserver(\n (entries) => {\n const idsToMark: string[] = [];\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n continue;\n }\n const messageId = entry.target.getAttribute('data-message-id');\n if (!messageId) {\n continue;\n }\n const message = this.messagesById().get(messageId);\n if (message && message.status !== 'read') {\n idsToMark.push(messageId);\n }\n }\n if (idsToMark.length === 0) {\n return;\n }\n this.ngZone.run(() => {\n for (const messageId of idsToMark) {\n this.markMessageAsRead(messageId);\n }\n });\n },\n {\n root: container,\n threshold: this.config.messageReadThreshold,\n },\n );\n\n this.intersectionObserver = observer;\n this.ngZone.run(() => this.readIntersectionObserver.set(observer));\n\n onCleanup(() => {\n observer.disconnect();\n this.intersectionObserver = undefined;\n this.readIntersectionObserver.set(null);\n this.observedReadMessageIds.clear();\n });\n });\n });\n\n effect((onCleanup) => {\n const observer = this.readIntersectionObserver();\n const messages = this.messages();\n const currentUser = this.currentUser();\n const container = this.messagesContainerRef()?.nativeElement;\n\n if (!observer || !container || !currentUser) {\n return;\n }\n\n const unreadMessages = messages.filter((m) => m.status !== 'read' && m.senderId !== currentUser.id);\n const timeoutId = window.setTimeout(() => {\n for (const msg of unreadMessages) {\n if (this.observedReadMessageIds.has(msg.id)) {\n continue;\n }\n const element = container.querySelector(`[data-message-id=\"${msg.id}\"]`);\n if (element) {\n observer.observe(element);\n this.observedReadMessageIds.add(msg.id);\n }\n }\n }, 100);\n\n onCleanup(() => clearTimeout(timeoutId));\n });\n }\n\n /**\n * Keep the viewport stable when layout changes.\n * ResizeObserver runs after layout and before paint — apply scrollTop in the\n * callback (not rAF) so the browser never paints a jump.\n *\n * Near the bottom, pin to the latest message (media decode, lazy outlets).\n * Further up, only compensate rows that grew fully above the viewport.\n */\n private setupMediaScrollCompensation(): void {\n effect((onCleanup) => {\n const container = this.messagesContainerRef()?.nativeElement;\n if (!container || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.ngZone.runOutsideAngular(() => {\n const lastHeight = new WeakMap<Element, number>();\n const observed = new WeakSet<Element>();\n const feed = container.querySelector('.messages-feed');\n\n const readHeight = (entry: ResizeObserverEntry): number => {\n const box = entry.borderBoxSize?.[0];\n return box ? box.blockSize : entry.contentRect.height;\n };\n\n const remember = (entries: ResizeObserverEntry[]): void => {\n for (const entry of entries) {\n lastHeight.set(entry.target, readHeight(entry));\n }\n };\n\n const observer = new ResizeObserver((entries) => {\n if (this.restoringScrollAfterPrepend || !this.feedReady()) {\n remember(entries);\n return;\n }\n\n if (this.pinnedToBottom) {\n remember(entries);\n this.writeScrollTop(container, container.scrollHeight);\n return;\n }\n\n const viewTop = container.getBoundingClientRect().top;\n let adjust = 0;\n for (const entry of entries) {\n const next = readHeight(entry);\n const prev = lastHeight.get(entry.target);\n lastHeight.set(entry.target, next);\n if (prev === undefined) {\n continue;\n }\n const delta = next - prev;\n if (delta === 0) {\n continue;\n }\n // Only rows fully above the viewport. Straddling/unskip at the top\n // edge would cancel a user scrolling up.\n if (entry.target.getBoundingClientRect().bottom <= viewTop) {\n adjust += delta;\n }\n }\n if (adjust !== 0) {\n this.writeScrollTop(container, container.scrollTop + adjust);\n }\n });\n\n const syncObservedItems = (): void => {\n container.querySelectorAll('.message-item').forEach((item) => {\n if (observed.has(item)) {\n return;\n }\n observed.add(item);\n observer.observe(item);\n });\n };\n\n syncObservedItems();\n const mutations = feed ? new MutationObserver(syncObservedItems) : null;\n mutations?.observe(feed as Node, { childList: true, subtree: true });\n\n onCleanup(() => {\n observer.disconnect();\n mutations?.disconnect();\n });\n });\n });\n }\n\n /**\n * Mark message as read\n */\n private markMessageAsRead(messageId: string): void {\n const message = this.messagesById().get(messageId);\n if (!message || message.status === 'read') return;\n\n if (this.config.markConversationReadOnSelect) {\n const conversation = this.activeConversation();\n if (conversation && conversation.unreadCount > 0) {\n return;\n }\n }\n\n // Update message status (batched API sync via conversation service)\n this.conversationService.queueMessageAsRead(messageId);\n this.observedReadMessageIds.delete(messageId);\n\n const container = this.messagesContainerRef()?.nativeElement;\n const element = container?.querySelector(`[data-message-id=\"${messageId}\"]`);\n if (element && this.intersectionObserver) {\n this.intersectionObserver.unobserve(element);\n }\n }\n\n /** Check if message is from current user */\n isOwnMessage(message: AXConversationMessage): boolean {\n const user = this.currentUser();\n if (!user) return false;\n return AXConversationMessageUtilsService.isOwnMessage(message, user.id);\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 const firstUnread = messages.find((m) => m.status !== 'read' && m.senderId !== currentUser.id);\n\n return firstUnread?.id ?? null;\n });\n\n /** Whether reactions can be shown or added for a message in the active conversation. */\n messageSupportsReactions(message: AXConversationMessage): boolean {\n if (!this.reactionsEnabled()) {\n return false;\n }\n\n return this.registry.messageRenderers.getRenderer(message)?.capabilities.supportsReactions ?? false;\n }\n\n /** Toggle reaction picker */\n toggleReactionPicker(message: AXConversationMessage, event: MouseEvent): void {\n if (!this.messageSupportsReactions(message)) {\n return;\n }\n const button = (event.currentTarget as HTMLElement) ?? (event.target as HTMLElement).closest('button');\n if (!button) {\n return;\n }\n\n if (this.reactionPickerTarget() === message.id) {\n this.closeReactionPicker();\n return;\n }\n\n void this.ensureAvailableReactions();\n\n const isRtl = isRtlDocument(this.document);\n this.reactionPickerPlacement.set(\n resolveReactionPickerPlacement(this.isOwnMessage(message), isRtl, this.isAdaptiveWideLayout()),\n );\n this.reactionPickerElement.set(button);\n this.reactionPickerTarget.set(message.id);\n\n setTimeout(() => {\n this.reactionPopover()?.open();\n });\n }\n\n /** Close reaction picker */\n closeReactionPicker(): void {\n if (!this.reactionPickerTarget() && !this.reactionPickerElement()) {\n return;\n }\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: AXConversationMessage, 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): AXConversationMessage | undefined {\n return this.messagesById().get(messageId);\n }\n\n /** Load available reactions when the picker is opened (session-cached in service). */\n private async ensureAvailableReactions(): Promise<void> {\n if (this.availableReactions().length > 0 || this.reactionsLoading) {\n return;\n }\n\n this.reactionsLoading = true;\n try {\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 } finally {\n this.reactionsLoading = false;\n }\n }\n\n /** Get message actions from registry */\n getMessageActions(message: AXConversationMessage) {\n return this.messageListService.getMenuActions(message);\n }\n\n /** Handle reaction click */\n onReactionClick(message: AXConversationMessage, emoji: string): void {\n if (!this.messageSupportsReactions(message)) {\n return;\n }\n\n this.messageListService.reactToMessage(message.id, emoji);\n }\n\n /** Handle message action */\n async onMessageAction(message: AXConversationMessage, 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 infinite scroll threshold */\n async onScrollThreshold(edge: 'top' | 'bottom'): Promise<void> {\n if (edge === 'top' && this.hasMoreMessages()) {\n await this.loadOlderMessages();\n }\n }\n\n /** Load older messages - delegate to service and preserve scroll anchor */\n private async loadOlderMessages(): Promise<void> {\n const container = this.messagesContainerRef()?.nativeElement;\n if (!container || !this.hasMoreMessages()) {\n return;\n }\n\n const anchorMessageId = this.messages()[0]?.id;\n const anchorEl = anchorMessageId ? document.getElementById(`message-${anchorMessageId}`) : null;\n const containerTop = container.getBoundingClientRect().top;\n const anchorOffsetFromViewportTop = anchorEl ? anchorEl.getBoundingClientRect().top - containerTop : null;\n\n const fallbackScrollTop = container.scrollTop;\n const fallbackScrollHeight = container.scrollHeight;\n\n this.restoringScrollAfterPrepend = true;\n const loaded = await this.messageListService.loadMoreMessages();\n if (!loaded) {\n this.restoringScrollAfterPrepend = false;\n return;\n }\n\n this.cdr.detectChanges();\n this.applyPrependScrollRestore(container, {\n anchorMessageId,\n anchorOffsetFromViewportTop,\n fallbackScrollTop,\n fallbackScrollHeight,\n });\n this.ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => {\n this.applyPrependScrollRestore(container, {\n anchorMessageId,\n anchorOffsetFromViewportTop,\n fallbackScrollTop,\n fallbackScrollHeight,\n });\n this.restoringScrollAfterPrepend = false;\n });\n });\n }\n\n /**\n * Keep the user's viewport on the same messages after older rows are inserted above.\n */\n private applyPrependScrollRestore(\n container: HTMLElement,\n ctx: {\n anchorMessageId?: string;\n anchorOffsetFromViewportTop: number | null;\n fallbackScrollTop: number;\n fallbackScrollHeight: number;\n },\n ): void {\n if (ctx.anchorMessageId && ctx.anchorOffsetFromViewportTop != null) {\n const anchor = document.getElementById(`message-${ctx.anchorMessageId}`);\n if (anchor) {\n const containerTop = container.getBoundingClientRect().top;\n const currentOffset = anchor.getBoundingClientRect().top - containerTop;\n this.writeScrollTop(container, container.scrollTop + currentOffset - ctx.anchorOffsetFromViewportTop);\n return;\n }\n }\n\n const heightDifference = container.scrollHeight - ctx.fallbackScrollHeight;\n this.writeScrollTop(container, ctx.fallbackScrollTop + heightDifference);\n }\n\n private revealStuckDateSeparators(container: HTMLElement): void {\n this.syncDateSeparatorStuckState(container, true);\n this.scheduleDateSeparatorFade(container);\n }\n\n private syncDateSeparatorStuckState(container: HTMLElement, revealStuck: boolean): void {\n const containerTop = container.getBoundingClientRect().top;\n const separators = container.querySelectorAll<HTMLElement>('.date-separator');\n const stuck: HTMLElement[] = [];\n\n for (const separator of separators) {\n const sentinel = separator.previousElementSibling;\n const isStuck =\n !!sentinel?.classList.contains('date-separator-sentinel') &&\n sentinel.getBoundingClientRect().top + 1 < containerTop;\n separator.classList.toggle('is-stuck', isStuck);\n if (isStuck) {\n stuck.push(separator);\n } else {\n separator.classList.remove('is-active', 'is-faded');\n }\n }\n\n const active = stuck[stuck.length - 1];\n for (const separator of stuck) {\n separator.classList.toggle('is-active', separator === active);\n }\n\n if (revealStuck && active) {\n active.classList.remove('is-faded');\n }\n }\n\n private scheduleDateSeparatorFade(container: HTMLElement): void {\n this.clearDateSeparatorFadeTimer();\n this.dateSeparatorFadeTimer = window.setTimeout(() => {\n this.dateSeparatorFadeTimer = 0;\n this.syncDateSeparatorStuckState(container, false);\n container.querySelector('.date-separator.is-stuck.is-active')?.classList.add('is-faded');\n }, DATE_SEPARATOR_FADE_MS);\n }\n\n private clearDateSeparatorFadeTimer(): void {\n if (this.dateSeparatorFadeTimer) {\n window.clearTimeout(this.dateSeparatorFadeTimer);\n this.dateSeparatorFadeTimer = 0;\n }\n }\n\n /** Distance from the last pixel of the feed. */\n private distanceFromBottom(element: HTMLElement): number {\n return element.scrollHeight - element.scrollTop - element.clientHeight;\n }\n\n /** True when the viewport is at the latest message (not merely within `scrollThreshold`). */\n private isStuckToBottom(element?: HTMLElement): boolean {\n const container = element || this.messagesContainerRef()?.nativeElement;\n if (!container) {\n return false;\n }\n return this.distanceFromBottom(container) < STICK_TO_BOTTOM_PX;\n }\n\n /**\n * Assign scrollTop without the listener treating it as a user scroll.\n * The flag stays set until the next frame so async `scroll` events are ignored.\n */\n private writeScrollTop(element: HTMLElement, top: number): void {\n this.programmaticScroll = true;\n const gen = ++this.programmaticScrollGen;\n element.scrollTop = top;\n this.ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => {\n if (gen === this.programmaticScrollGen) {\n this.programmaticScroll = false;\n }\n });\n });\n }\n\n /** Pin the feed to the latest message before the next paint. */\n private pinFeedToBottom(container?: HTMLElement): void {\n this.pinnedToBottom = true;\n untracked(() => {\n const el = container ?? this.messagesContainerRef()?.nativeElement;\n if (el) {\n this.writeScrollTop(el, el.scrollHeight);\n }\n if (this.showScrollButton()) {\n this.showScrollButton.set(false);\n }\n });\n }\n\n /** Hide the feed and pin to the latest message before the first visible paint. */\n private beginFeedReveal(): void {\n this.feedRevealGeneration++;\n this.pinnedToBottom = true;\n this.scheduleFeedPin();\n }\n\n private cancelFeedReveal(): void {\n this.feedRevealGeneration++;\n if (this.feedRevealRaf) {\n cancelAnimationFrame(this.feedRevealRaf);\n this.feedRevealRaf = 0;\n }\n this.pinnedConversationId.set(null);\n }\n\n /**\n * Pin to the latest message, then reveal. Two frames is enough — stick-to-bottom\n * holds later media growth. Waiting for loaders here left a blank gap after the skeleton.\n */\n private scheduleFeedPin(): void {\n const generation = this.feedRevealGeneration;\n const maxMountAttempts = 120;\n let mountAttempts = 0;\n let pinnedFrames = 0;\n\n const pin = (el: HTMLElement): void => {\n this.writeScrollTop(el, el.scrollHeight);\n };\n\n const reveal = (el?: HTMLElement): void => {\n if (el) {\n pin(el);\n this.primeOpenViewportMedia(el);\n }\n this.pinnedToBottom = true;\n this.ngZone.run(() => this.pinnedConversationId.set(this.activeConversation()?.id ?? null));\n };\n\n this.ngZone.runOutsideAngular(() => {\n if (this.feedRevealRaf) {\n cancelAnimationFrame(this.feedRevealRaf);\n this.feedRevealRaf = 0;\n }\n\n const tick = (): void => {\n this.feedRevealRaf = 0;\n if (generation !== this.feedRevealGeneration) {\n return;\n }\n\n if (this.messages().length === 0) {\n if (!this.loading()) {\n reveal();\n return;\n }\n this.feedRevealRaf = requestAnimationFrame(tick);\n return;\n }\n\n const el = this.messagesContainerRef()?.nativeElement;\n if (!el) {\n if (++mountAttempts < maxMountAttempts) {\n this.feedRevealRaf = requestAnimationFrame(tick);\n }\n return;\n }\n\n pin(el);\n if (++pinnedFrames >= 2) {\n reveal(el);\n return;\n }\n\n this.feedRevealRaf = requestAnimationFrame(tick);\n };\n\n this.feedRevealRaf = requestAnimationFrame(tick);\n });\n }\n\n /** Start nearby lazy images so they decode while stick-to-bottom holds the viewport. */\n private primeOpenViewportMedia(container: HTMLElement): void {\n const bounds = container.getBoundingClientRect();\n const top = bounds.top - 24;\n const bottom = bounds.bottom + 24;\n const images = container.querySelectorAll('img');\n for (let i = 0; i < images.length; i++) {\n const img = images[i];\n if (img.complete) {\n continue;\n }\n const rect = img.getBoundingClientRect();\n if (rect.bottom >= top && rect.top <= bottom && img.loading === 'lazy') {\n img.loading = 'eager';\n }\n }\n }\n\n /** Scroll to bottom */\n scrollToBottom(smooth = false): void {\n const element = this.messagesContainerRef()?.nativeElement;\n this.pinnedToBottom = true;\n if (element) {\n if (smooth) {\n this.programmaticScroll = true;\n element.scrollTo({\n top: element.scrollHeight,\n behavior: 'smooth',\n });\n window.setTimeout(() => {\n this.programmaticScroll = false;\n }, 400);\n } else {\n this.writeScrollTop(element, element.scrollHeight);\n }\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 this.pinnedToBottom = false;\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 this.adaptiveLayoutResizeObserver?.disconnect();\n this.adaptiveLayoutResizeObserver = undefined;\n\n if (this.documentClickListener) {\n document.removeEventListener('click', this.documentClickListener);\n this.documentClickListener = undefined;\n }\n\n this.clearDateSeparatorFadeTimer();\n this.cancelFeedReveal();\n // Clear timeouts\n this.timeouts.forEach((t) => clearTimeout(t));\n this.timeouts.clear();\n }\n\n /** Get ARIA label for a date separator. */\n getDateSeparatorAriaLabel(group: AXConversationMessageDateGroup): string {\n const date = this.resolveDateSeparatorLabel(group);\n return this.translation.translateSync('@acorex:chat.aria.messages-from-date', {\n params: { date },\n waitForLoad: true,\n });\n }\n\n resolveDateSeparatorLabel(group: AXConversationMessageDateGroup): string {\n switch (group.dateKind) {\n case 'today':\n return this.translation.translateSync('@acorex:chat.time.today', { waitForLoad: true });\n case 'yesterday':\n return this.translation.translateSync('@acorex:chat.time.yesterday', { waitForLoad: true });\n default:\n return group.dateLabel ?? '';\n }\n }\n\n onMessageListDragEnter(): void {\n this.messageListDragging.set(true);\n }\n\n onMessageListDragLeave(): void {\n this.messageListDragging.set(false);\n }\n\n /** Open the matching composer picker popup when files are dropped on the message list. */\n async onMessageListFilesDropped(event: AXUploaderFileChangeEvent): Promise<void> {\n this.messageListDragging.set(false);\n const { openComposerPickerForFiles } = await import('./open-composer-picker-for-files');\n await openComposerPickerForFiles(this.composerPickerDeps(), event.files);\n }\n\n private composerPickerDeps() {\n return {\n fileService: this.fileService,\n composerService: this.composerService,\n composerActionRegistry: this.registry.composerActions,\n popupService: this.conversationService.popupService,\n actionSheetService: this.actionSheetService,\n platform: this.platform,\n toast: this.toast,\n translation: this.translation,\n conversation: this.activeConversation(),\n config: this.config,\n };\n }\n\n /**\n * Open the shared message-actions menu from a single delegated listener.\n * Per-row `ax-context-menu` instances each register capture-phase scroll listeners\n * and were the main source of scroll jank.\n */\n onMessagesFeedContextMenu(event: MouseEvent): void {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n if (target.closest('ax-popover, .reaction-bubble, .add-reaction-button, .reply-preview')) {\n return;\n }\n if (target.closest('a[href], input, textarea')) {\n return;\n }\n\n const bubble = target.closest<HTMLElement>('[data-message-id]');\n const container = event.currentTarget;\n if (!bubble || !(container instanceof HTMLElement) || !container.contains(bubble)) {\n return;\n }\n\n const messageId = bubble.getAttribute('data-message-id');\n if (!messageId) {\n return;\n }\n const message = this.messagesById().get(messageId);\n if (!message) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.contextMenuMessage.set(message);\n this.contextMenuMessageId.set(message.id);\n this.messageActionsMenu()?.showAt({ x: event.clientX, y: event.clientY }, bubble);\n }\n\n onMessageContextMenuClose(): void {\n this.contextMenuMessageId.set(null);\n this.contextMenuMessage.set(null);\n }\n\n /** Handle context menu opening for messages */\n handleMessageContextMenuOpening(event: AXContextMenuOpeningEvent): void {\n const message = this.contextMenuMessage();\n if (!message) {\n event.items.length = 0;\n return;\n }\n\n this.contextMenuMessageId.set(message.id);\n const actions = this.getMessageActions(message);\n const currentUser = this.currentUser();\n\n if (!currentUser) return;\n\n const menuItems: AXMenuItem[] = actions.map((action) => ({\n text: this.registry.messageActions.getActionLabel(action),\n suffix: action.shortcut ? { text: action.shortcut } : undefined,\n icon: action.icon,\n color: action.destructive ? 'danger' : undefined,\n disabled: !this.registry.messageActions.isActionEnabled(action, message, currentUser),\n data: action,\n }));\n\n event.items.push(...menuItems);\n }\n\n /** Handle context menu item click for messages */\n handleMessageContextMenuItemClick(event: AXContextMenuItemsClickEvent): void {\n const message = this.contextMenuMessage();\n this.onMessageContextMenuClose();\n const action = event.item.data;\n if (action && message) {\n this.messageListService.executeAction(message, action.id);\n this.messageAction.emit({ message, action: action.id });\n }\n }\n}","@if (activeConversation(); as conv) {\n @if (conv.id) {\n <div\n class=\"message-list message-list--conversation-surface\"\n [class.message-list--group]=\"isGroupConversation()\"\n [class.message-list--drag]=\"messageListDragging()\"\n [class.message-list--default-wallpaper]=\"messageListUsesDefaultWallpaper()\"\n [class.message-list--wallpaper-light]=\"messageListUsesDefaultWallpaper() && !messageListWallpaperDark()\"\n [class.message-list--wallpaper-dark]=\"messageListUsesDefaultWallpaper() && messageListWallpaperDark()\"\n [class.message-list--feed-pending]=\"showOpenCover()\"\n #messageList\n role=\"log\"\n [attr.aria-label]=\"'@acorex:chat.aria.message-list' | translate | async\"\n aria-live=\"off\"\n [style.background]=\"messageListBackgroundStyle()\"\n [style.--ax-comp-message-list-surface-bg]=\"messageListBackgroundStyle()\"\n axUploaderZone\n [disableBrowse]=\"true\"\n (dragEnter)=\"onMessageListDragEnter()\"\n (dragLeave)=\"onMessageListDragLeave()\"\n (fileChange)=\"onMessageListFilesDropped($event)\"\n >\n @if (!loading() && messages().length === 0) {\n <div class=\"list-empty\" role=\"status\" [attr.aria-label]=\"'@acorex:chat.status.no-messages' | translate | async\">\n <ng-content select=\"ax-conversation-message-list-empty, [ax-conversation-message-list-empty]\">\n <ng-container\n *ngComponentOutlet=\"resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }\"\n ></ng-container>\n </ng-content>\n </div>\n } @else if (messages().length > 0) {\n <div\n class=\"messages-container\"\n [class.messages-container--pending]=\"!feedReady()\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold\"\n [edge]=\"'top'\"\n [scrollDisabled]=\"loading() || loadingMore() || !hasMoreMessages() || !feedReady()\"\n (scrollThreshold)=\"onScrollThreshold($event)\"\n (contextmenu)=\"onMessagesFeedContextMenu($event)\"\n #messagesContainer\n role=\"feed\"\n [attr.aria-busy]=\"feedReady() ? null : 'true'\"\n [attr.aria-hidden]=\"feedReady() ? null : 'true'\"\n [attr.aria-label]=\"'@acorex:chat.aria.messages' | translate | async\"\n >\n @if (loadingMore()) {\n <div class=\"list-loading-more-slot\">\n <div\n class=\"list-loading-more list-loading-more--overlay\"\n role=\"status\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-older-messages' | translate | async\"\n >\n <div class=\"load-more-indicator\" aria-hidden=\"true\">\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n </div>\n <ax-label class=\"load-more-label\">{{\n '@acorex:chat.status.loading-older-messages' | translate | async\n }}</ax-label>\n </div>\n </div>\n }\n <div class=\"messages-feed\">\n @for (group of messageGroups(); track group.date) {\n <!-- Date Separator -->\n <div class=\"date-separator-sentinel\" aria-hidden=\"true\"></div>\n <div class=\"date-separator\" role=\"separator\" [attr.aria-label]=\"getDateSeparatorAriaLabel(group)\">\n <span class=\"date-separator__label\">\n @switch (group.dateKind) {\n @case ('today') {\n {{ '@acorex:chat.time.today' | translate | async }}\n }\n @case ('yesterday') {\n {{ '@acorex:chat.time.yesterday' | translate | async }}\n }\n @default {\n {{ group.dateLabel }}\n }\n }\n </span>\n </div>\n\n @for (message of group.messages; track message.id; let i = $index) {\n <ax-conversation-message-item\n [message]=\"message\"\n [previousMessage]=\"group.messages[i - 1]\"\n [nextMessage]=\"group.messages[i + 1]\"\n [isGroupConversation]=\"isGroupConversation()\"\n [isAdaptiveWideLayout]=\"isAdaptiveWideLayout()\"\n [reactionPickerOpen]=\"reactionPickerTarget() === message.id\"\n [contextMenuActive]=\"contextMenuMessageId() === message.id\"\n (replyNavigate)=\"scrollToMessage($event)\"\n (toggleReactionPicker)=\"toggleReactionPicker($event.message, $event.event)\"\n (reactionClick)=\"onReactionClick($event.message, $event.emoji)\"\n />\n }\n }\n </div>\n </div>\n\n <!-- Scroll to Bottom Button -->\n @if (showScrollButton() && feedReady()) {\n <div\n class=\"scroll-to-bottom-wrapper\"\n animate.enter=\"scroll-to-bottom-enter\"\n animate.leave=\"scroll-to-bottom-leave\"\n >\n <ax-fab\n class=\"scroll-to-bottom\"\n (onClick)=\"scrollToBottom()\"\n [attr.aria-label]=\"'@acorex:chat.actions.scroll-to-bottom' | translate | async\"\n >\n <ax-icon><i class=\"fa-light fa-arrow-down\" aria-hidden=\"true\"></i></ax-icon>\n </ax-fab>\n </div>\n }\n }\n\n @if (showOpenCover()) {\n <div\n class=\"list-loading list-loading--cover\"\n role=\"status\"\n aria-busy=\"true\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-messages' | translate | async\"\n >\n <div class=\"messages-skeleton\" aria-hidden=\"true\">\n @for (item of loadingSkeletonItems; track item) {\n <div class=\"message-skeleton\" [class.message-skeleton--own]=\"$odd\">\n <ax-skeleton class=\"message-skeleton-avatar\" [animated]=\"true\"></ax-skeleton>\n <div\n class=\"message-skeleton-bubble\"\n [class.message-skeleton-bubble--short]=\"$index % 3 === 1\"\n [class.message-skeleton-bubble--medium]=\"$index % 3 === 2\"\n >\n <ax-skeleton class=\"message-skeleton-line\" [animated]=\"true\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <ax-context-menu\n #messageActionsMenu\n [openOn]=\"'click'\"\n [closeOn]=\"'click'\"\n (onOpening)=\"handleMessageContextMenuOpening($event)\"\n (onClose)=\"onMessageContextMenuClose()\"\n (onItemClick)=\"handleMessageContextMenuItemClick($event)\"\n />\n\n <!-- Reaction Picker Popover -->\n @if (reactionsEnabled() && reactionPickerTarget()) {\n <ax-popover\n #reactionPopover\n [target]=\"reactionPickerElement()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"reactionPickerPlacement()\"\n (onClose)=\"closeReactionPicker()\"\n >\n <div class=\"reaction-picker-popup\">\n <div\n class=\"reaction-picker-emojis\"\n role=\"listbox\"\n [attr.aria-label]=\"'@acorex:chat.actions.choose-reaction' | translate | async\"\n >\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} @else {\n <div\n class=\"message-list message-list--no-active\"\n role=\"region\"\n [attr.aria-label]=\"'@acorex:chat.status.no-conversation-selected' | translate | async\"\n >\n <div class=\"list-no-active\">\n <ng-content select=\"ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]\">\n <ng-container *ngComponentOutlet=\"noActiveFallbackComponent\"></ng-container>\n </ng-content>\n </div>\n </div>\n}\n","/**\n * Avatar Picker Component\n * Allows selecting an avatar via file upload with preview\n */\n\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, ElementRef, ViewEncapsulation, input, model, output, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'ax-conversation-avatar-picker',\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, FormsModule, AXButtonComponent, AXDecoratorModule, AXImageComponent, AXTranslationModule],\n templateUrl: './avatar-picker.component.html',\n\n styleUrl: './avatar-picker.component.css',\n})\nexport class AXConversationAvatarPickerComponent {\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"," <div class=\"avatar-picker\">\n <!-- Preview -->\n <div class=\"avatar-preview\" (click)=\"triggerFileInput()\">\n @if (avatarUrl()) {\n <ax-image [src]=\"avatarUrl()\" [alt]=\"'@acorex:chat.avatar.preview' | translate | async\"></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\">{{ '@acorex:chat.actions.choose-image' | translate | async }}</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]=\"\n avatarUrl()\n ? ('@acorex:chat.actions.change-image' | translate | async)\n : ('@acorex:chat.actions.upload-image' | translate | async)\n \"\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\n [look]=\"'outline'\"\n [color]=\"'danger'\"\n [text]=\"'@acorex:chat.actions.remove-image' | translate | async\"\n (onClick)=\"clearAvatar()\"\n >\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\n #fileInput\n type=\"file\"\n accept=\"image/*\"\n class=\"avatar-picker__file-input\"\n (change)=\"onFileInputChange($event)\"\n />\n </div>\n","/**\n * Conversation Item Component\n * Displays a single conversation in the sidebar list\n */\n\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\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 { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, output, signal, ViewEncapsulation } from '@angular/core';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationMessageUtilsService } from '../../utils';\nimport { AXConversationInfoBarService } from '../info-bar';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\n\n@Component({\n selector: 'ax-conversation-item',\n encapsulation: ViewEncapsulation.None,\n\n imports: [\n CommonModule,\n AXDecoratorModule,\n AXBadgeComponent,\n AXContextMenuComponent,\n AXFormatModule,\n AXDateTimeModule,\n AXTranslationModule,\n AXConversationAvatarComponent,\n ],\n templateUrl: './conversation-item.component.html',\n styleUrl: './conversation-item.component.css',\n})\nexport class AXConversationItemComponent {\n private readonly conversationService = inject(AXConversationService);\n private readonly infoBarService = inject(AXConversationInfoBarService);\n protected readonly translation = inject(AXTranslationService);\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 /** True while this row's context menu is open */\n readonly contextMenuOpen = signal(false);\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 if (this.contextMenuOpen()) {\n classes.push('conversation-item-context-active');\n }\n return classes.join(' ');\n });\n\n /** Typing indicator text - delegate to utils */\n readonly typingText = computed((): string => {\n this.conversationService.typingRevision();\n const conv = this.liveConversation();\n return AXConversationMessageUtilsService.getTypingText(\n conv,\n this.conversationService.getActiveTypingUserIds(conv.id),\n );\n });\n\n readonly isTyping = computed(() => {\n this.conversationService.typingRevision();\n return this.conversationService.isAnyoneTyping(this.liveConversation().id);\n });\n\n readonly roomPreferences = computed(() => {\n const conv = this.liveConversation();\n return this.conversationService.getRoomPreferences(conv.id);\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 getPreviewTypeKey(type: string): string {\n switch (type) {\n case 'image':\n return '@acorex:chat.image';\n case 'video':\n return '@acorex:chat.video';\n case 'audio':\n case 'voice':\n return '@acorex:chat.voice';\n case 'file':\n return '@acorex:chat.file';\n case 'location':\n return '@acorex:chat.location';\n case 'sticker':\n return '@acorex:chat.sticker';\n default:\n return '@acorex:chat.message';\n }\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 this.contextMenuOpen.set(true);\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: !this.registry.conversationItemActions.isActionEnabled(action, { conversation }),\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 this.contextMenuOpen.set(false);\n const action = event.item.data;\n const conversation = this.liveConversation();\n\n if (action && conversation && action.handler) {\n try {\n await this.registry.conversationItemActions.executeAction(action.id, { conversation });\n } catch (error) {\n console.error('Failed to execute conversation action:', error);\n }\n }\n }\n}\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]=\"\n translation.translateSync('@acorex:chat.aria.conversation-with', {\n params: { title: conversation().title },\n })\n \"\n >\n <!-- Avatar -->\n <div class=\"item-avatar\">\n <ax-conversation-avatar\n kind=\"auto\"\n [conversation]=\"liveConversation()\"\n [size]=\"48\"\n [showStatus]=\"conversation().type === 'private'\"\n />\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 (roomPreferences().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 (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 {\n {{ getPreviewTypeKey(preview.type) | translate | async }}\n }\n </span>\n }\n } @else {\n <span class=\"last-message no-message\">{{ '@acorex:chat.status.no-messages' | translate | async }}</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 (onClose)=\"contextMenuOpen.set(false)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n","/**\n * AXConversationSidebarService\n * Facade/service for Sidebar-related state and actions.\n */\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\n\n@Injectable()\nexport class AXConversationSidebarService {\n private readonly conversationService = inject(AXConversationService);\n\n constructor() {\n void this.conversationService.ensureInitialized();\n }\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 readonly loadingMore = signal(false);\n\n // Derived state from ConversationService\n readonly conversations = this.conversationService.conversations;\n readonly loading = this.conversationService.loading;\n\n readonly hasMoreConversations = computed(\n () => this.conversationService.conversationsPagination().hasMore,\n );\n\n // Tabs\n readonly enabledTabs = this.registry.conversationTabs.enabledTabs;\n\n // Filtered conversations (recomputed on every inbox change — no memo cache)\n readonly filteredConversations = computed(() => {\n const conversations = this.conversations();\n const query = this.searchQuery();\n const tabId = this.activeTabId();\n return this.filterAndSort(conversations, query, tabId);\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 /**\n * Load more conversations when the user scrolls near the bottom of the sidebar list.\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 { page } = this.conversationService.conversationsPagination();\n const nextPage = page + 1;\n await this.conversationService.loadMoreConversations(nextPage);\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 * Reload conversation list from the first page (e.g. pull-to-refresh).\n */\n async reloadConversations(): Promise<void> {\n this.conversationService.resetConversationsPagination();\n await this.conversationService.loadConversations();\n }\n}\n","/**\n * Sidebar Component (moved under conversation-view)\n * Uses AXConversationSidebarService facade for state/actions\n */\n\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { AXTabItemComponent, AXTabLocation, AXTabsComponent } from '@acorex/components/tabs';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectorRef,\n Component,\n NgZone,\n OnDestroy,\n ViewEncapsulation,\n computed,\n inject,\n output,\n} from '@angular/core';\nimport { Subject, debounceTime, distinctUntilChanged } from 'rxjs';\nimport { AXConversationInfiniteScrollDirective } from '../../directives';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationItemComponent } from './conversation-item.component';\nimport { AXConversationSidebarService } from './sidebar.service';\n\n@Component({\n selector: 'ax-conversation-sidebar',\n encapsulation: ViewEncapsulation.None,\n\n imports: [\n CommonModule,\n AXDecoratorModule,\n AXTabsComponent,\n AXTabItemComponent,\n AXBadgeComponent,\n AXButtonComponent,\n AXSearchBoxComponent,\n AXLabelComponent,\n AXSkeletonComponent,\n AXTranslationModule,\n AXConversationItemComponent,\n AXConversationInfiniteScrollDirective,\n ],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.css',\n})\nexport class AXConversationSidebarComponent implements OnDestroy {\n readonly sidebar = inject(AXConversationSidebarService);\n protected readonly config = inject(AX_CONVERSATION_CONFIG);\n private readonly conversationService = inject(AXConversationService);\n private readonly popupService = inject(AXPopupService);\n private readonly translation = inject(AXTranslationService);\n private readonly ngZone = inject(NgZone);\n private readonly cdr = inject(ChangeDetectorRef);\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 readonly hasMoreConversations = this.sidebar.hasMoreConversations;\n\n readonly isSidebarTabsHorizontal = computed(() => this.config.sidebarTabsOrientation === 'horizontal');\n\n readonly sidebarTabLocation = computed<AXTabLocation>(() => (this.isSidebarTabsHorizontal() ? 'start' : 'bottom'));\n\n constructor() {\n // Setup debounced search\n this.searchSubject.pipe(debounceTime(this.config.debounceSearch), distinctUntilChanged()).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 getTabLabel(tabId: string): string {\n const tab = this.sidebar.enabledTabs().find((item) => item.id === tabId);\n if (!tab) return '';\n return this.conversationService.registry.conversationTabs.getTabLabel(tab);\n }\n\n async openNewConversationPopup(): Promise<void> {\n const { AXConversationNewDialogComponent } = await import('./new-conversation-dialog.component');\n const result = await this.popupService.open(AXConversationNewDialogComponent, {\n title: this.translation.translateSync('@acorex:chat.dialog.new-conversation.title'),\n size: 'sm',\n closeButton: true,\n data: {\n conversationService: this.conversationService,\n },\n });\n if (result?.data) {\n const conversation = result.data as AXConversation;\n // Popup closes outside the normal component tree — run inside the zone so signal\n // updates propagate to the sidebar list immediately.\n this.ngZone.run(() => {\n this.selectConversation(conversation);\n this.cdr.markForCheck();\n });\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","<div class=\"sidebar\" [class.sidebar--tabs-horizontal]=\"isSidebarTabsHorizontal()\">\n <!-- Header with Menu and Search -->\n <div class=\"sidebar-header\">\n <!-- <ax-button [look]=\"'outline'\" class=\"menu-button ax-md\">\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]=\"'@acorex:chat.placeholders.search-conversations' | translate | async\"\n class=\"rounded-full\"\n ></ax-search-box>\n </div>\n </div>\n\n <div class=\"sidebar-body\" [class.sidebar-body--tabs-horizontal]=\"isSidebarTabsHorizontal()\">\n <!-- Tabs -->\n <div class=\"sidebar-tabs\">\n <ax-tabs\n (onActiveTabChanged)=\"onTabChange($event)\"\n [look]=\"'with-line'\"\n [location]=\"sidebarTabLocation()\"\n [style.overflow]=\"'hidden'\"\n [reorderable]=\"true\"\n [class.surface]=\"sidebarTabLocation() === 'start'\"\n >\n @for (tab of enabledTabs(); track tab.id) {\n <ax-tab-item\n [text]=\"getTabLabel(tab.id)\"\n [key]=\"tab.id\"\n [class.limitedTab]=\"sidebarTabLocation() === 'start'\"\n >\n @if (tab.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"'tab-icon ' + tab.icon\" aria-hidden=\"true\"></i>\n </ax-icon>\n </ax-prefix>\n }\n @if (tab.badge && getBadgeValue(tab.id); as badgeText) {\n <ax-suffix>\n <ax-badge class=\"ax-sm\" [text]=\"badgeText\" [color]=\"'primary'\" />\n </ax-suffix>\n }\n </ax-tab-item>\n }\n </ax-tabs>\n </div>\n\n <div class=\"sidebar-main\">\n <!-- Conversation List -->\n <div\n class=\"sidebar-list\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold\"\n [edge]=\"'bottom'\"\n [scrollDisabled]=\"loading() || loadingMore() || !hasMoreConversations()\"\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\"><i class=\"fa-light fa-comments\"></i></div>\n <h3 class=\"empty-title\">{{ '@acorex:chat.sidebar.empty-title' | translate | async }}</h3>\n <p class=\"empty-description\">\n @if (sidebar.searchQuery()) {\n {{ '@acorex:chat.sidebar.empty-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.sidebar.empty-default' | translate | async }}\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\n class=\"list-loading-more list-loading-more--append\"\n role=\"status\"\n animate.enter=\"load-more-enter\"\n animate.leave=\"load-more-leave\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-more' | translate | async\"\n >\n <div class=\"load-more-indicator\" aria-hidden=\"true\">\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n </div>\n <ax-label class=\"load-more-label\">{{ '@acorex:chat.status.loading-more' | translate | async }}</ax-label>\n </div>\n }\n }\n </div>\n\n <div class=\"new-conversation-button-container\">\n <ng-content select=\"ax-suffix\">\n <div class=\"new-conversation-button-container-inner\">\n <ax-button\n class=\"new-conversation-btn\"\n [text]=\"'@acorex:chat.actions.new-conversation' | translate | async\"\n [look]=\"'solid'\"\n (onClick)=\"openNewConversationPopup()\"\n ></ax-button>\n </div>\n </ng-content>\n </div>\n </div>\n </div>\n</div>\n","import { AXClosableComponent, AXComponentCloseEvent, AXDataSource } from '@acorex/cdk/common';\nimport { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownPanelComponent } from '@acorex/components/dropdown';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXListComponent } from '@acorex/components/list';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXPopupService, type AXPopupRef } from '@acorex/components/popup';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ElementRef,\n TemplateRef,\n ViewEncapsulation,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversation, AXConversationParticipant } from '../../models';\nimport { AX_CONVERSATION_DEFAULT_GROUP_ICON } from '../../utils/conversation-display.utils';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\n\ntype AXConversationNewWizardStep = 'selectUsers' | 'groupDetails';\n\n@Component({\n selector: 'ax-conversation-new-dialog',\n encapsulation: ViewEncapsulation.None,\n\n imports: [\n CommonModule,\n FormsModule,\n AXButtonComponent,\n AXButtonItemComponent,\n AXButtonItemListComponent,\n AXDecoratorModule,\n AXDropdownPanelComponent,\n AXImageComponent,\n AXListComponent,\n AXSearchBoxComponent,\n AXSkeletonComponent,\n AXConversationAvatarComponent,\n AXTranslationModule,\n ],\n providers: [{ provide: AXClosableComponent, useExisting: AXConversationNewDialogComponent }],\n templateUrl: './new-conversation-dialog.component.html',\n styleUrl: './new-conversation-dialog.component.css',\n})\nexport class AXConversationNewDialogComponent extends AXBasePageComponent {\n /**\n * Assigned by {@link AXPopupComponent} from `open(..., { data: { conversationService } })`.\n * Not injected: popup content is created on the root view container, so route-scoped providers\n * would not see the same `AXConversationService` instance as the conversation feature.\n */\n conversationService!: AXConversationService;\n private readonly toastService = inject(AXToastService);\n private readonly translation = inject(AXTranslationService);\n private readonly config = inject(AX_CONVERSATION_CONFIG);\n private readonly destroyRef = inject(DestroyRef);\n private readonly popupService = inject(AXPopupService);\n\n private searchDebounceTimer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n super();\n this.destroyRef.onDestroy(() => {\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n });\n }\n\n /**\n * Injected by {@link AXPopupComponent} when this dialog is opened via {@link AXPopupService}.\n * Required for `setTitle` / dynamic header — {@link AXBasePageComponent#setTitle} is otherwise unset.\n */\n readonly __popup__ = input<AXPopupRef | undefined>(undefined);\n\n readonly availableUsers = signal<AXConversationParticipant[]>([]);\n readonly selectedUserIds = signal<string[]>([]);\n readonly groupTitle = signal('');\n readonly groupAvatar = signal('');\n readonly groupAvatarFileName = signal('profile.jpg');\n readonly searchQuery = signal('');\n readonly creating = signal(false);\n /** For 2+ users: step 1 = pick users, step 2 = title + avatar. */\n readonly wizardStep = signal<AXConversationNewWizardStep>('selectUsers');\n\n readonly showUserPickerStep = computed(() => {\n const n = this.selectedUserIds().length;\n if (n <= 1) return true;\n return this.wizardStep() === 'selectUsers';\n });\n\n readonly showGroupDetailsStep = computed(\n () => this.selectedUserIds().length > 1 && this.wizardStep() === 'groupDetails',\n );\n\n readonly showNextButton = computed(() => this.selectedUserIds().length > 1 && this.wizardStep() === 'selectUsers');\n\n readonly showGroupBackButton = computed(\n () => this.selectedUserIds().length > 1 && this.wizardStep() === 'groupDetails',\n );\n\n readonly showCreateButton = computed(() => {\n const n = this.selectedUserIds().length;\n if (n === 0) return false;\n if (n === 1) return true;\n return this.wizardStep() === 'groupDetails';\n });\n\n readonly canGoNextToGroupDetails = computed(() => this.selectedUserIds().length > 1);\n\n readonly canCreate = computed(() => {\n const selectedCount = this.selectedUserIds().length;\n if (selectedCount === 0) return false;\n if (selectedCount === 1) return true;\n return this.groupTitle().trim().length > 0;\n });\n\n private readonly _resetWizardWhenSingleEffect = effect(() => {\n if (this.selectedUserIds().length <= 1) {\n this.wizardStep.set('selectUsers');\n }\n });\n\n private readonly _syncPopupTitleEffect = effect(() => {\n const popupRef = this.__popup__();\n const count = this.selectedUserIds().length;\n const step = this.wizardStep();\n let title = this.translation.translateSync('@acorex:chat.dialog.new-conversation.title');\n if (count > 1) {\n title =\n step === 'groupDetails'\n ? this.translation.translateSync('@acorex:chat.dialog.new-conversation.new-group')\n : this.translation.translateSync('@acorex:chat.dialog.new-conversation.selected-count', {\n params: { count },\n });\n }\n if (popupRef) {\n this.setTitle = (t: string) => popupRef.setTitle(t);\n popupRef.setTitle(title);\n }\n });\n\n readonly usersListEmptyTpl = viewChild.required<TemplateRef<unknown>>('usersListEmpty');\n readonly usersListLoadingTpl = viewChild.required<TemplateRef<unknown>>('usersListLoading');\n readonly usersList = viewChild<AXListComponent>('usersList');\n private readonly groupNameInput = viewChild<ElementRef<HTMLInputElement>>('groupNameInput');\n private readonly groupPhotoInput = viewChild<ElementRef<HTMLInputElement>>('groupPhotoInput');\n\n readonly groupPhotoAriaLabel = computed(() =>\n this.translation.translateSync(\n this.groupAvatar() ? '@acorex:chat.actions.change-profile' : '@acorex:chat.actions.choose-profile',\n ),\n );\n\n readonly usersListDataSource = new AXDataSource<unknown>({\n pageSize: 10,\n key: 'id',\n load: async (e) => {\n const query = this.searchQuery().trim();\n const filters = query ? { query } : undefined;\n const page = e.take > 0 ? Math.floor(e.skip / e.take) : 0;\n const result = await this.conversationService.getUsers(filters, {\n page,\n pageSize: e.take,\n });\n this.mergeUsersCache(result.items);\n return {\n items: result.items as unknown[],\n total: result.total ?? result.items.length,\n };\n },\n byKey: (key) => Promise.resolve(this.availableUsers().find((u) => u.id === key) ?? null),\n });\n\n onCancel(): void {\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = null;\n this.onClosed.emit(event);\n }\n\n onSelectedUsersChange(ids: string[]): void {\n this.selectedUserIds.set(ids);\n }\n\n onNextToGroupDetails(): void {\n if (!this.canGoNextToGroupDetails()) return;\n this.wizardStep.set('groupDetails');\n setTimeout(() => this.groupNameInput()?.nativeElement.focus(), 0);\n }\n\n onBackFromGroupDetails(): void {\n this.wizardStep.set('selectUsers');\n }\n\n onPickGroupPhoto(): void {\n this.groupPhotoInput()?.nativeElement.click();\n }\n\n onClearGroupPhoto(): void {\n this.groupAvatar.set('');\n this.groupAvatarFileName.set('profile.jpg');\n }\n\n async onEditGroupPhoto(): Promise<void> {\n const src = this.groupAvatar();\n if (!src) {\n return;\n }\n await this.openGroupPhotoEditor(src, this.groupAvatarFileName());\n }\n\n async onGroupPhotoSelected(event: Event): Promise<void> {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n input.value = '';\n if (!file || !file.type.startsWith('image/')) {\n return;\n }\n\n const objectUrl = URL.createObjectURL(file);\n try {\n await this.openGroupPhotoEditor(objectUrl, file.name);\n } finally {\n URL.revokeObjectURL(objectUrl);\n }\n }\n\n private async openGroupPhotoEditor(src: string, fileName: string): Promise<void> {\n const { AXConversationImagePickerEditorDialogComponent } = await import(\n '../../plugins/composer/components/image-picker/image-picker-editor-dialog.component'\n );\n const result = await this.popupService.open(AXConversationImagePickerEditorDialogComponent, {\n title: this.translation.translateSync('@acorex:chat.pickers.images.edit-title'),\n size: 'xl',\n closeButton: true,\n header: true,\n footer: true,\n maximizable: true,\n panelClass: ['ax-conversation-image-editor-popup'],\n inputs: {\n src,\n fileName,\n aspectRatio: ['1:1:active'],\n },\n });\n\n const edited = result?.data as File | undefined;\n if (!edited) {\n return;\n }\n\n this.groupAvatarFileName.set(edited.name || fileName);\n this.groupAvatar.set(await fileToDataUrl(edited));\n }\n\n onSearchChange(value: string): void {\n this.searchQuery.set(value ?? '');\n\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n\n this.searchDebounceTimer = setTimeout(() => {\n this.searchDebounceTimer = undefined;\n this.usersList()?.refresh(false);\n }, this.config.debounceSearch);\n }\n\n isUserSelected(id: string): boolean {\n return this.selectedUserIds().includes(id);\n }\n\n userFromItem(item: unknown): AXConversationParticipant | null {\n if (!item || typeof item !== 'object' || !('data' in item)) return null;\n return (item as { data?: AXConversationParticipant }).data ?? null;\n }\n\n private mergeUsersCache(users: AXConversationParticipant[]): void {\n if (users.length === 0) {\n return;\n }\n this.availableUsers.update((existing) => {\n const byId = new Map(existing.map((user) => [user.id, user]));\n for (const user of users) {\n byId.set(user.id, user);\n }\n return Array.from(byId.values());\n });\n }\n\n async onCreateConversation(): Promise<void> {\n if (this.creating()) return;\n\n const selectedIds = this.selectedUserIds();\n if (selectedIds.length === 0) return;\n if (selectedIds.length > 1 && this.wizardStep() !== 'groupDetails') return;\n\n this.creating.set(true);\n try {\n let conversation: AXConversation;\n\n if (selectedIds.length === 1) {\n conversation = await this.conversationService.createConversation(selectedIds, 'private');\n } else {\n const metadata = {\n title: this.groupTitle().trim(),\n avatar: this.groupAvatar() || undefined,\n icon: AX_CONVERSATION_DEFAULT_GROUP_ICON,\n };\n conversation = await this.conversationService.createConversation(selectedIds, 'group', metadata);\n }\n\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = conversation;\n this.onClosed.emit(event);\n } catch (error: unknown) {\n console.error('Failed to create conversation:', error);\n const message =\n error &&\n typeof error === 'object' &&\n 'message' in error &&\n typeof (error as { message: unknown }).message === 'string'\n ? (error as { message: string }).message\n : this.translation.translateSync('@acorex:chat.errors.failed-to-create-conversation');\n this.toastService.danger(message);\n } finally {\n this.creating.set(false);\n }\n }\n}\n\nfunction fileToDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result ?? ''));\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n}\n","<div class=\"new-conversation-panel\">\n <div class=\"new-conversation-dialog-content\">\n @if (showUserPickerStep()) {\n <div class=\"form-field form-field--grow\">\n <div class=\"users-list-wrap\">\n <div class=\"users-list-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n (valueChange)=\"onSearchChange($event)\"\n [disabled]=\"creating()\"\n [placeholder]=\"'@acorex:chat.placeholders.search-users' | translate | async\"\n ></ax-search-box>\n </div>\n <ax-list\n #usersList\n class=\"users-list\"\n [dataSource]=\"usersListDataSource\"\n [multiple]=\"true\"\n [checkbox]=\"false\"\n [disabled]=\"creating()\"\n [valueField]=\"'id'\"\n [textField]=\"'name'\"\n [itemHeight]=\"60\"\n [ngModel]=\"selectedUserIds()\"\n (ngModelChange)=\"onSelectedUsersChange($event ?? [])\"\n [emptyTemplate]=\"usersListEmptyTpl()\"\n [loadingTemplate]=\"usersListLoadingTpl()\"\n [itemTemplate]=\"userItemTpl\"\n ></ax-list>\n </div>\n </div>\n }\n\n @if (showGroupDetailsStep()) {\n <div class=\"group-details-step\">\n <div class=\"group-details-row\">\n <button\n type=\"button\"\n class=\"group-photo-btn\"\n [disabled]=\"creating()\"\n [attr.aria-label]=\"groupPhotoAriaLabel()\"\n (click)=\"onPickGroupPhoto()\"\n >\n @if (groupAvatar()) {\n <ax-image\n class=\"group-photo-btn__image\"\n [src]=\"groupAvatar()\"\n [width]=\"80\"\n [height]=\"80\"\n [alt]=\"'@acorex:chat.avatar.preview' | translate | async\"\n ></ax-image>\n <span class=\"group-photo-btn__overlay\" aria-hidden=\"true\">\n <i class=\"fa-light fa-camera\"></i>\n </span>\n } @else {\n <i class=\"fa-light fa-camera\" aria-hidden=\"true\"></i>\n }\n </button>\n\n <label class=\"group-name-field\">\n <span class=\"group-name-label\">{{\n '@acorex:chat.dialog.new-conversation.group-name' | translate | async\n }}</span>\n <input\n #groupNameInput\n class=\"group-name-input\"\n type=\"text\"\n [ngModel]=\"groupTitle()\"\n (ngModelChange)=\"groupTitle.set($event ?? '')\"\n [disabled]=\"creating()\"\n />\n </label>\n\n <ax-button\n class=\"group-details-menu rounded-full\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"'@acorex:chat.actions.more' | translate | async\"\n [disabled]=\"creating()\"\n >\n <ax-icon><i class=\"fa-light fa-ellipsis-vertical\"></i></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"\n (groupAvatar() ? '@acorex:chat.actions.change-profile' : '@acorex:chat.actions.choose-profile')\n | translate\n | async\n \"\n (onClick)=\"onPickGroupPhoto()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-camera\"></i></ax-icon>\n </ax-prefix>\n </ax-button-item>\n @if (groupAvatar()) {\n <ax-button-item\n [text]=\"'@acorex:chat.actions.edit-profile' | translate | async\"\n (onClick)=\"onEditGroupPhoto()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-pen\"></i></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n color=\"danger\"\n [text]=\"'@acorex:chat.actions.remove-profile' | translate | async\"\n (onClick)=\"onClearGroupPhoto()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-trash-can\"></i></ax-icon>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n </div>\n\n <input\n #groupPhotoInput\n type=\"file\"\n accept=\"image/*\"\n class=\"group-photo-input\"\n (change)=\"onGroupPhotoSelected($event)\"\n />\n </div>\n }\n </div>\n <ax-footer class=\"dialog-footer\">\n <ax-suffix>\n @if (showGroupBackButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n look=\"blank\"\n color=\"primary\"\n [disabled]=\"creating()\"\n (onClick)=\"onBackFromGroupDetails()\"\n ></ax-button>\n } @else {\n <ax-button\n [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n look=\"solid\"\n [disabled]=\"creating()\"\n (onClick)=\"onCancel()\"\n ></ax-button>\n }\n @if (showNextButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.next' | translate | async\"\n look=\"solid\"\n color=\"primary\"\n [disabled]=\"!canGoNextToGroupDetails() || creating()\"\n (onClick)=\"onNextToGroupDetails()\"\n ></ax-button>\n }\n @if (showCreateButton()) {\n <ax-button\n [text]=\"\n (showGroupDetailsStep() ? '@acorex:chat.actions.next' : '@acorex:chat.actions.create') | translate | async\n \"\n [look]=\"showGroupDetailsStep() ? 'blank' : 'solid'\"\n color=\"primary\"\n [disabled]=\"!canCreate() || creating()\"\n (onClick)=\"onCreateConversation()\"\n ></ax-button>\n }\n </ax-suffix>\n </ax-footer>\n</div>\n\n<ng-template #usersListEmpty>\n <div class=\"users-list-empty\">\n @if (searchQuery()) {\n {{ '@acorex:chat.dialog.new-conversation.no-users-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.dialog.new-conversation.no-users-available' | translate | async }}\n }\n </div>\n</ng-template>\n\n<ng-template #usersListLoading>\n <div class=\"user-item-skeleton\">\n <ax-skeleton class=\"skeleton-checkbox\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-avatar\" [animated]=\"true\"></ax-skeleton>\n <div class=\"skeleton-text\">\n <ax-skeleton class=\"skeleton-name\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-description\" [animated]=\"true\"></ax-skeleton>\n </div>\n </div>\n</ng-template>\n\n<ng-template #userItemTpl let-item>\n @if (userFromItem(item); as user) {\n <div class=\"user-item-content\">\n <input class=\"ax-checkbox\" type=\"checkbox\" [checked]=\"isUserSelected(user.id)\" tabindex=\"0\" />\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"user.id\"\n [size]=\"48\"\n [name]=\"user.name\"\n [avatar]=\"user.avatar\"\n [icon]=\"user.icon\"\n />\n <div class=\"user-item-text\">\n <span class=\"truncated user-name-text\">{{ user.name }}</span>\n @if (user.description) {\n <span class=\"user-description-text truncated\">{{ user.description }}</span>\n }\n </div>\n </div>\n }\n</ng-template>\n","import { AXClosableComponent, AXComponentCloseEvent } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXCheckBoxComponent } from '@acorex/components/check-box';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { Component, EventEmitter, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport type { AXConversation } from '../../models';\n\nexport type AXConversationDeleteDialogMode = 'private' | 'leave' | 'destroy-room';\n\nexport interface AXConversationDeleteDialogResult {\n confirmed: boolean;\n forEveryone: boolean;\n}\n\n@Component({\n selector: 'ax-conversation-delete-dialog',\n encapsulation: ViewEncapsulation.None,\n imports: [\n FormsModule,\n AsyncPipe,\n AXButtonComponent,\n AXCheckBoxComponent,\n AXLabelComponent,\n AXDecoratorGenericComponent,\n AXTranslationModule,\n ],\n providers: [{ provide: AXClosableComponent, useExisting: AXConversationDeleteDialogComponent }],\n templateUrl: './delete-conversation-dialog.component.html',\n styleUrl: './delete-conversation-dialog.component.css',\n})\nexport class AXConversationDeleteDialogComponent {\n private readonly translation = inject(AXTranslationService);\n\n /**\n * Assigned by {@link AXPopupComponent} from `open(..., { data })`.\n */\n conversation!: AXConversation;\n mode: AXConversationDeleteDialogMode = 'private';\n peerName?: string;\n\n readonly __popup__ = input<AXPopupRef | undefined>(undefined);\n forEveryone = false;\n readonly onClosed = new EventEmitter<AXComponentCloseEvent>();\n\n readonly showCheckbox = computed(() => this.mode === 'private' || this.mode === 'destroy-room');\n\n readonly messageText = computed(() => {\n const title = this.conversation?.title ?? '';\n if (this.mode === 'leave') {\n return this.translation.translateSync('@acorex:chat.dialog.delete-conversation.leave-message', {\n params: { conversationTitle: title },\n });\n }\n if (this.mode === 'destroy-room') {\n return this.translation.translateSync('@acorex:chat.dialog.delete-conversation.destroy-room-message', {\n params: { conversationTitle: title },\n });\n }\n return this.translation.translateSync('@acorex:chat.dialog.delete-conversation.message', {\n params: { conversationTitle: title },\n });\n });\n\n readonly checkboxLabel = computed(() => {\n if (this.mode === 'destroy-room') {\n return this.translation.translateSync('@acorex:chat.dialog.delete-conversation.delete-room-for-everyone');\n }\n return this.translation.translateSync('@acorex:chat.dialog.delete-conversation.delete-for-both', {\n params: { peerName: this.peerName || this.conversation?.title || '' },\n });\n });\n\n readonly confirmLabel = computed(() =>\n this.mode === 'leave'\n ? this.translation.translateSync('@acorex:chat.actions.leave-and-delete')\n : this.translation.translateSync('@acorex:chat.actions.delete'),\n );\n\n confirm(): void {\n this.close({ confirmed: true, forEveryone: this.showCheckbox() && this.forEveryone });\n }\n\n cancel(): void {\n this.close({ confirmed: false, forEveryone: false });\n }\n\n private close(data: AXConversationDeleteDialogResult): void {\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = data;\n this.onClosed.emit(event);\n }\n}\n","<div class=\"delete-conversation-panel\">\n <div class=\"delete-conversation-content\">\n <p class=\"delete-conversation-message\">{{ messageText() }}</p>\n @if (showCheckbox()) {\n <ax-check-box [(ngModel)]=\"forEveryone\" [color]=\"'danger'\">\n <ax-label>{{ checkboxLabel() }}</ax-label>\n </ax-check-box>\n }\n </div>\n <ax-footer class=\"dialog-footer\">\n <ax-suffix>\n <ax-button\n [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n [look]=\"'solid'\"\n (onClick)=\"cancel()\"\n ></ax-button>\n <ax-button\n [text]=\"confirmLabel()\"\n [look]=\"'solid'\"\n [color]=\"'danger'\"\n (onClick)=\"confirm()\"\n ></ax-button>\n </ax-suffix>\n </ax-footer>\n</div>\n","/**\n * Conversation-specific upload/message types.\n * Storage contracts live in {@link @acorex/cdk/uploader}.\n */\n\nimport type { AXFileUploadOptions, AXUploadReference, AXUploadResult } from '@acorex/cdk/uploader';\n\nexport type AXConversationUploaderReference = AXUploadReference;\nexport type AXConversationUploaderResult = AXUploadResult;\n\n/** Upload options with conversation scope in metadata. */\nexport type AXConversationUploadOptions = Omit<AXFileUploadOptions, 'source'> & {\n metadata?: Record<string, unknown> & { conversationId?: string };\n};\n\nexport interface AXConversationSendMessageUploadSource {\n source: File | Blob;\n fileName?: string;\n mimeType?: string;\n onProgress?: (percent: number) => void;\n signal?: AbortSignal;\n}\n\nexport interface AXConversationSendMessageOptions {\n media?: AXConversationSendMessageUploadSource;\n localPreviewUrl?: string;\n}\n\nexport interface AXConversationUploaderFilePreview {\n file: File;\n preview?: string;\n type: 'image' | 'video' | 'audio' | 'file';\n}\n","/**\n * Conversation Model\n * Represents a chat conversation (private, group, or channel)\n */\n\nimport type { InputSignal, Type } from '@angular/core';\nimport type { AXConversationMessage } from './message.model';\nimport type { AXConversationParticipant } from './participant.model';\n\nexport type AXConversationType = 'private' | 'group' | 'channel' | 'bot';\n\n/** Theme-specific CSS `background` values for the message list area. */\nexport interface AXConversationMessageListThemeBackground {\n light: string;\n dark: string;\n}\n\n/** Single CSS value (both themes) or per-theme `{ light, dark }` backgrounds. */\nexport type AXConversationMessageListBackground = string | AXConversationMessageListThemeBackground;\n\n/**\n * Conversation metadata\n * Extensible map for app-specific conversation data.\n */\nexport interface AXConversationMetadata extends Record<string, unknown> {\n /** Optional custom background CSS for message list (per light/dark theme). */\n messageListBackground?: AXConversationMessageListBackground;\n\n /** Optional custom empty-state component for the message list. */\n messageListEmptyComponent?: Type<AXConversationMessageListEmptyComponent>;\n\n /**\n * When `false`, hides reaction UI (add button, bubbles, picker) for this conversation.\n * Defaults to `true` when omitted.\n */\n reactionsEnabled?: boolean;\n}\n\n/** Contract for custom empty-state components rendered by message list. */\nexport interface AXConversationMessageListEmptyComponent {\n readonly conversation: InputSignal<AXConversation>;\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 /** User who created this conversation */\n creatorId?: string;\n\n /** Conversation title/name */\n title: string;\n\n /** Conversation avatar/image URL */\n avatar?: string;\n\n /**\n * Font Awesome icon class(es) for this conversation when no image avatar is used\n * (e.g. default placeholder for senders without a participant avatar/icon).\n */\n icon?: string;\n\n /** Conversation description (for groups/channels) */\n description?: string;\n\n /** List of participants */\n participants: AXConversationParticipant[];\n\n /** Last message in the conversation */\n lastMessage?: AXConversationMessage;\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 /** 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 /**\n * Viewer-scoped history cursor (Telegram-style).\n * Messages at or before this timestamp are omitted for the current user only.\n * Filled by the conversation/message APIs; never leak another user's cutoff.\n */\n historyClearedAt?: Date;\n\n /** Custom metadata */\n metadata?: AXConversationMetadata;\n}\n\n/**\n * Typing indicator (realtime event — ephemeral, not stored on the room entity).\n */\nexport interface AXConversationTypingIndicator {\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 /** When false, user stopped typing */\n isTyping?: boolean;\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 */\n\n/** Fields for one uploaded or remote media item. */\nexport interface AXConversationMediaItemFields {\n /** HTTP(S) or other persistable URL; omit when only {@link mediaId} is stored. */\n url?: string;\n mediaId?: string;\n mimeType?: string;\n size?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AXConversationTextFormat {\n start: number;\n end: number;\n type: 'bold' | 'italic' | 'code' | 'strikethrough' | 'underline' | 'spoiler';\n}\n\nexport interface AXConversationMention {\n start: number;\n end: number;\n userId: string;\n userName: string;\n}\n\nexport interface AXConversationLink {\n start: number;\n end: number;\n url: string;\n preview?: AXConversationLinkPreview;\n}\n\nexport interface AXConversationLinkPreview {\n title?: string;\n description?: string;\n image?: string;\n siteName?: string;\n}\n\nexport interface AXConversationTextPayload {\n type: 'text';\n text: string;\n formatting?: AXConversationTextFormat[];\n mentions?: AXConversationMention[];\n links?: AXConversationLink[];\n}\n\nexport interface AXConversationImageMediaItem extends AXConversationMediaItemFields {\n thumbnailUrl?: string;\n width: number;\n height: number;\n blurhash?: string;\n}\n\nexport interface AXConversationImagePayload {\n type: 'image';\n images: AXConversationImageMediaItem[];\n caption?: string;\n}\n\nexport interface AXConversationVideoMediaItem extends AXConversationMediaItemFields {\n thumbnailUrl?: string;\n duration: number;\n width: number;\n height: number;\n}\n\nexport interface AXConversationVideoPayload {\n type: 'video';\n videos: AXConversationVideoMediaItem[];\n caption?: string;\n}\n\nexport interface AXConversationAudioMediaItem extends AXConversationMediaItemFields {\n duration: number;\n title?: string;\n artist?: string;\n coverUrl?: string;\n waveform?: number[];\n}\n\nexport interface AXConversationAudioPayload {\n type: 'audio';\n audios: AXConversationAudioMediaItem[];\n caption?: string;\n}\n\nexport interface AXConversationVoicePayload extends AXConversationMediaItemFields {\n type: 'voice';\n duration: number;\n waveform?: number[];\n played?: boolean;\n}\n\nexport interface AXConversationFileMediaItem extends AXConversationMediaItemFields {\n name: string;\n mimeType: string;\n thumbnailUrl?: string;\n extension?: string;\n duration?: number;\n}\n\nexport interface AXConversationFilePayload {\n type: 'file';\n files: AXConversationFileMediaItem[];\n caption?: string;\n}\n\nexport interface AXConversationLocationPayload {\n type: 'location';\n latitude: number;\n longitude: number;\n name?: string;\n address?: string;\n mapImageUrl?: string;\n accuracy?: number;\n}\n\nexport interface AXConversationStickerPayload extends AXConversationMediaItemFields {\n type: 'sticker';\n id: string;\n packId: string;\n animated: boolean;\n width?: number;\n height?: number;\n emoji?: string;\n}\n\nexport interface AXConversationPollOption {\n id: string;\n text: string;\n votes: number;\n voters?: string[];\n}\n\nexport interface AXConversationPollPayload {\n type: 'poll';\n question: string;\n options: AXConversationPollOption[];\n multipleChoice: boolean;\n anonymous: boolean;\n expiresAt?: Date;\n totalVotes?: number;\n}\n\nexport interface AXConversationSystemPayload {\n type: 'system';\n eventType: 'user_joined' | 'user_left' | 'title_changed' | 'avatar_changed' | 'custom';\n text: string;\n userIds?: string[];\n data?: Record<string, unknown>;\n}\n\nexport type AXConversationMessagePayload =\n | AXConversationTextPayload\n | AXConversationImagePayload\n | AXConversationVideoPayload\n | AXConversationAudioPayload\n | AXConversationVoicePayload\n | AXConversationFilePayload\n | AXConversationLocationPayload\n | AXConversationStickerPayload\n | AXConversationPollPayload\n | AXConversationSystemPayload;\n","/**\n * Message Model\n * Represents a single message in a conversation\n */\n\nimport type { AXConversationMessagePayload } from './message-payloads.model';\n\nexport type AXConversationMessageStatus = 'sending' | 'sent' | 'delivered' | 'read' | 'failed';\n\nexport type AXConversationMessageType =\n | 'text'\n | 'image'\n | 'video'\n | 'audio'\n | 'voice'\n | 'file'\n | 'location'\n | 'sticker'\n | 'poll'\n | 'system'\n | string; // Allow custom types\n\n/**\n * Reaction on a message\n */\nexport interface AXConversationReaction {\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 AXConversationMessage {\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: AXConversationMessageType;\n\n /**\n * File-type catalog name when this message uses a composer file type (image, video, …).\n * Omitted for text, location, system, etc.\n */\n fileType?: string;\n\n /** Message creation timestamp */\n timestamp: Date;\n\n /** Type-specific message payload */\n payload: AXConversationMessagePayload;\n\n /** Message delivery/read status */\n status: AXConversationMessageStatus;\n\n /** Replied message reference (for quote replies) */\n replyTo?: AXConversationMessage;\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: AXConversationReaction[];\n\n /**\n * Total reply count when provided by the message API (`getMessages` or realtime).\n * When omitted, the UI derives a minimum from loaded messages in the active conversation.\n */\n replyCount?: number;\n\n /**\n * Total forward count when provided by the message API (`getMessages` or realtime).\n * When omitted, the UI derives a minimum from loaded messages in the active conversation.\n */\n forwardCount?: number;\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 AXConversationGroupedReaction {\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 AXConversationSendMessageCommand {\n /** Conversation ID */\n conversationId: string;\n /** Message type */\n type: AXConversationMessageType;\n /** File-type catalog when applicable (see {@link AXConversationMessage.fileType}). */\n fileType?: string;\n /** Message payload */\n payload: AXConversationMessagePayload;\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 AXConversationEditMessageCommand {\n /** Message ID to edit */\n messageId: string;\n /** New payload */\n payload: AXConversationMessagePayload;\n}\n\n/**\n * Command to delete a message\n */\nexport interface AXConversationDeleteMessageCommand {\n /** Message ID to delete */\n messageId: string;\n /** Delete for everyone or just sender */\n forEveryone?: boolean;\n}\n","/**\n * Participant Model\n * Membership in a conversation (identity fields are snapshots; live presence is on the user store).\n */\n\nexport type AXConversationParticipantRole = 'owner' | 'admin' | 'moderator' | 'member' | 'guest';\n\n/** Extended profile fields shown in private-chat info panels. */\nexport interface AXConversationUserProfile {\n bio?: string;\n phone?: string;\n email?: string;\n username?: string;\n location?: string;\n company?: string;\n title?: string;\n}\n\n/** Authenticated user profile (includes per-room preferences). */\nexport interface AXConversationUser {\n id: string;\n name: string;\n description?: string;\n profile?: AXConversationUserProfile;\n avatar?: string;\n icon?: string;\n metadata?: Record<string, unknown>;\n /** User-specific settings per conversation (key = conversationId). */\n conversationPreferences?: import('./room-preferences.model').AXConversationRoomPreferencesMap;\n}\n\nexport interface AXConversationParticipant {\n /** Unique identifier for the participant */\n id: string;\n\n /** Display name of the participant */\n name: string;\n\n /**\n * Short line shown under the name in lists (e.g. job title, status line).\n * Distinct from long-form bio in optional `profile.bio`.\n */\n description?: string;\n\n /** Optional extended profile details for private chats. */\n profile?: AXConversationUserProfile;\n\n /** Avatar/profile image URL */\n avatar?: string;\n\n /**\n * Font Awesome icon class(es) used when `avatar` is not set (e.g. `'fa-light fa-user'`).\n */\n icon?: string;\n\n /** Role in the conversation (for groups/channels) */\n role?: AXConversationParticipantRole;\n\n /**\n * When this user joined the conversation.\n * Used for admin succession when the creator leaves a group or channel.\n */\n joinedAt?: Date;\n\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n","/**\n * User presence — global per-user live state (not room-scoped).\n */\n\nexport type AXConversationPresenceStatus = 'online' | 'offline' | 'away' | 'busy';\n\n/** Live presence for a single user. */\nexport interface AXConversationUserPresence {\n userId: string;\n status: AXConversationPresenceStatus;\n lastSeen?: Date;\n statusText?: string;\n updatedAt?: Date;\n}\n\n/** Realtime / API presence event payload. */\nexport interface AXConversationPresenceUpdate {\n userId: string;\n status: AXConversationPresenceStatus;\n lastSeen?: Date;\n statusText?: string;\n}\n","export function 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\nexport function 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","import type { AXFileCopyData, AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, createFileTypeMetadata } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport type { AXConversationAudioPayload } from '../../../../models';\nimport { AX_CONVERSATION_AUDIO_CATALOG } from '../../../../models/message-file-type-catalog';\nimport { normalizeAudioPayload } from '../../../message-list/components/audio-renderer/audio.payload';\nimport { formatDuration, formatFileSize } from '../shared/media-formatters';\n\nexport { AX_CONVERSATION_AUDIO_CATALOG };\n\nconst MB = 1024 * 1024;\n\nexport const AX_CONVERSATION_AUDIO_PRESENTATION = {\n icon: 'fa-light fa-music text-amber-500',\n title: 'Audio',\n} as const;\n\ntype AXConversationFileTypeUtilityContext = {\n readAsDataUrl: (file: File | Blob) => Promise<string>;\n platformId: object;\n};\n\nconst AX_CONVERSATION_AUDIO_UTILITY = {\n preview: 'preview',\n duration: 'duration',\n formatSize: 'formatSize',\n formatDuration: 'formatDuration',\n createLocalPreviewUrl: 'createLocalPreviewUrl',\n} as const;\n\nfunction blobUrl(ctx: AXConversationFileTypeUtilityContext, blob: Blob): string {\n if (!isPlatformBrowser(ctx.platformId)) {\n return '';\n }\n return URL.createObjectURL(blob);\n}\n\nfunction mediaDuration(ctx: AXConversationFileTypeUtilityContext, file: File | Blob): Promise<number> {\n if (!isPlatformBrowser(ctx.platformId)) {\n return Promise.resolve(0);\n }\n return new Promise((resolve, reject) => {\n const el = document.createElement('audio');\n el.preload = 'metadata';\n el.onloadedmetadata = () => {\n URL.revokeObjectURL(el.src);\n resolve(el.duration);\n };\n el.onerror = () => {\n URL.revokeObjectURL(el.src);\n reject(new Error('Failed to load audio metadata'));\n };\n el.src = URL.createObjectURL(file);\n });\n}\n\nexport function conversationAudioUtilities(): NonNullable<AXFileType['utilities']> {\n return {\n [AX_CONVERSATION_AUDIO_UTILITY.preview]: (ctx, file) =>\n (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(file as File),\n [AX_CONVERSATION_AUDIO_UTILITY.duration]: (ctx, file) =>\n mediaDuration(ctx as AXConversationFileTypeUtilityContext, file as File | Blob),\n [AX_CONVERSATION_AUDIO_UTILITY.formatSize]: (_ctx, bytes) => formatFileSize(bytes as number),\n [AX_CONVERSATION_AUDIO_UTILITY.formatDuration]: (_ctx, seconds) => formatDuration(seconds as number),\n [AX_CONVERSATION_AUDIO_UTILITY.createLocalPreviewUrl]: (ctx, source) =>\n blobUrl(ctx as AXConversationFileTypeUtilityContext, source as Blob),\n };\n}\n\nexport function createConversationAudioFileType(): AXFileType {\n const presentation = AX_CONVERSATION_AUDIO_PRESENTATION;\n return {\n name: AX_CONVERSATION_AUDIO_CATALOG,\n metadata: createFileTypeMetadata('conversation'),\n title: presentation.title,\n icon: presentation.icon,\n validations: {\n mimeTypes: ['audio/*'],\n minSize: 1,\n maxSize: 50 * MB,\n },\n extensions: [\n { name: 'mp3', title: 'MP3' },\n { name: 'wav', title: 'WAV', validations: { maxSize: 30 * MB } },\n { name: 'ogg', title: 'OGG' },\n { name: 'm4a', title: 'M4A' },\n ],\n utilities: conversationAudioUtilities(),\n copy: (payload): AXFileCopyData => {\n const audio = normalizeAudioPayload(payload as AXConversationAudioPayload);\n const caption = audio.caption?.trim();\n const items = audio.audios.map((item) => ({\n url: item.url?.trim(),\n title: item.title?.trim(),\n }));\n return {\n text: caption ?? '',\n meta: { kind: 'audio', caption, items, count: audio.audios.length },\n };\n },\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationAudioFileTypeProvider extends AXFileTypeInfoProvider {\n items() {\n return Promise.resolve([createConversationAudioFileType()]);\n }\n}\n","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXConversationAudioMediaItem, AXConversationAudioPayload, AXConversationMessagePayload } from '../../../../models';\nimport type { AXConversationUploaderResult } from '../../../../models/conversation-upload.types';\nimport { normalizeAudioPayload } from '../../../message-list/components/audio-renderer/audio.payload';\nimport { resolvePersistableMediaUrl } from '../shared/persisted-media-url';\n\nexport function audioItemFromUpload(file: File, result: AXConversationUploaderResult, duration: number): AXConversationAudioMediaItem {\n const url = resolvePersistableMediaUrl(result.url);\n const item: AXConversationAudioMediaItem = {\n mediaId: result.mediaId,\n mimeType: result.mimeType,\n size: result.size,\n duration,\n title: file.name,\n metadata: result.metadata,\n };\n if (url) {\n item.url = url;\n }\n return item;\n}\n\nexport function mergeAudioUploadResult(\n payload: AXConversationMessagePayload,\n result: AXUploadResult,\n): AXConversationMessagePayload {\n const base = normalizeAudioPayload(payload as AXConversationAudioPayload);\n const audios = [...base.audios];\n const i = audios.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n const slot = i >= 0 ? audios[i] : undefined;\n const url = resolvePersistableMediaUrl(result.url);\n const next: AXConversationAudioMediaItem = {\n ...(slot ?? { duration: 0 }),\n mediaId: result.mediaId,\n mimeType: result.mimeType,\n size: result.size,\n metadata: result.metadata,\n };\n if (url) {\n next.url = url;\n }\n if (i >= 0) audios[i] = next;\n else audios.push(next);\n return { ...base, type: 'audio', audios };\n}\n\nexport function applyAudioLocalPreview(\n payload: AXConversationMessagePayload,\n localUrl: string,\n mimeType = 'application/octet-stream',\n): AXConversationMessagePayload {\n const base = normalizeAudioPayload(payload as AXConversationAudioPayload);\n const audios = [...base.audios];\n const slot = audios.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n const preview = { url: localUrl, duration: 0, mimeType };\n if (slot >= 0) {\n audios[slot] = { ...audios[slot], ...preview };\n } else if (audios.length === 0) {\n audios.push(preview);\n } else {\n audios[0] = { ...audios[0], ...preview };\n }\n return { ...base, type: 'audio', audios };\n}\n","/**\n * Picker Header Component\n * Telegram-style header: close, title, overflow menu.\n */\n\nimport { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownPanelComponent } from '@acorex/components/dropdown';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { Component, ViewEncapsulation, input, output } from '@angular/core';\n\n@Component({\n selector: 'ax-conversation-picker-header',\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXTranslationModule,\n AXButtonComponent,\n AXButtonItemComponent,\n AXButtonItemListComponent,\n AXDecoratorModule,\n AXDropdownPanelComponent,\n ],\n templateUrl: './picker-header.component.html',\n styleUrl: './picker-header.component.css',\n})\nexport class AXConversationPickerHeaderComponent {\n readonly title = input.required<string>();\n readonly showMenu = input(false);\n readonly addMoreLabel = input('Add more files');\n readonly onClose = output<void>();\n readonly onAddMore = output<void>();\n}\n","<div class=\"ax-conversation-picker-header\">\n <span class=\"ax-conversation-picker-header__title\">{{ title() }}</span>\n\n @if (showMenu()) {\n <ax-button class=\"ax-conversation-picker-header__menu rounded-full\" look=\"blank\" [iconOnly]=\"true\">\n <ax-icon><i class=\"fa-light fa-ellipsis-vertical\"></i></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item [text]=\"addMoreLabel()\" (onClick)=\"onAddMore.emit()\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-plus\"></i></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n } @else {\n <span class=\"ax-conversation-picker-header__menu-spacer\" aria-hidden=\"true\"></span>\n }\n</div>\n","/**\n * Picker Footer Component\n * Telegram-style footer for composer pickers.\n */\n\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { Component, ViewEncapsulation, input, output } from '@angular/core';\n\n@Component({\n selector: 'ax-conversation-picker-footer',\n encapsulation: ViewEncapsulation.None,\n imports: [AXButtonComponent, AXTranslationModule],\n templateUrl: './picker-footer.component.html',\n styleUrl: './picker-footer.component.css',\n})\nexport class AXConversationPickerFooterComponent {\n readonly showAdd = input(true);\n readonly addLabel = input('');\n readonly cancelLabel = input.required<string>();\n readonly sendLabel = input.required<string>();\n readonly sendDisabled = input<boolean>(false);\n readonly onAdd = output<void>();\n readonly onCancel = output<void>();\n readonly onSend = output<void>();\n}\n","<div class=\"ax-conversation-picker-footer\">\n @if (showAdd()) {\n <ax-button look=\"blank\" color=\"primary\" [text]=\"addLabel()\" (onClick)=\"onAdd.emit()\" />\n } @else {\n <span class=\"ax-conversation-picker-footer__spacer\" aria-hidden=\"true\"></span>\n }\n\n <div class=\"ax-conversation-picker-footer__actions\">\n <ax-button look=\"blank\" color=\"primary\" [text]=\"cancelLabel()\" (onClick)=\"onCancel.emit()\" />\n <ax-button\n look=\"blank\"\n color=\"primary\"\n [text]=\"sendLabel()\"\n [disabled]=\"sendDisabled()\"\n (onClick)=\"onSend.emit()\"\n />\n </div>\n</div>\n","/**\n * Emoji Tab Component\n * Emoji picker for composer popup\n */\n\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\ninterface AXConversationEmoji {\n char: string;\n name: string;\n keywords: string[];\n}\n\ninterface AXConversationEmojiCategory {\n id: string;\n name: string;\n icon: string;\n emojis: AXConversationEmoji[];\n}\n\nlet emojiCategoriesCache: AXConversationEmojiCategory[] | null = null;\n\nasync function loadEmojiCategories(): Promise<AXConversationEmojiCategory[]> {\n if (emojiCategoriesCache) {\n return emojiCategoriesCache;\n }\n const module = await import('./emoji-categories.json');\n emojiCategoriesCache =\n (module as { default: AXConversationEmojiCategory[] }).default ??\n (module as unknown as AXConversationEmojiCategory[]);\n return emojiCategoriesCache;\n}\n\n@Component({\n selector: 'ax-conversation-emoji-tab',\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, FormsModule, AXSearchBoxModule, AXTranslationModule],\n templateUrl: './emoji-tab.component.html',\n styleUrl: './emoji-tab.component.css',\n})\nexport class AXConversationEmojiTabComponent {\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 = signal<AXConversationEmojiCategory[]>([]);\n\n constructor() {\n void loadEmojiCategories().then((categories) => this.categories.set(categories));\n }\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 this.categories()\n .flatMap((cat) => cat.emojis)\n .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 = this.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 onSearchChange(event: { value?: string }): 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","<div class=\"emoji-tab\">\n <!-- Search -->\n <div class=\"emoji-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'@acorex:chat.placeholders.search-emoji' | translate | async\"\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>{{ '@acorex:chat.empty.no-emojis-found' | translate | async }}</p>\n </div>\n }\n</div>\n","import { AXAutoFocusDirective, AXClickEvent, type AXHtmlEvent } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { Component, ViewEncapsulation, inject, input, model, output, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversationEmojiTabComponent } from '../emoji-tab/emoji-tab.component';\n\n/** Caption field with emoji picker for composer media pickers. */\n@Component({\n selector: 'ax-conversation-picker-caption',\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXAutoFocusDirective,\n AXButtonComponent,\n AXDecoratorModule,\n AXTextBoxModule,\n AXTranslationModule,\n FormsModule,\n AXPopoverComponent,\n AXConversationEmojiTabComponent,\n ],\n templateUrl: './picker-caption.component.html',\n styleUrls: ['./picker-caption.component.css'],\n})\nexport class AXConversationPickerCaptionComponent {\n readonly translation = inject(AXTranslationService);\n readonly caption = model('');\n readonly showInlineSend = input(false);\n readonly sendDisabled = input(true);\n readonly onSend = output<void>();\n\n private readonly emojiPopoverRef = viewChild<AXPopoverComponent>('emojiPopover');\n\n onEmojiClick(event: AXClickEvent): void {\n event.nativeEvent?.preventDefault();\n event.nativeEvent?.stopPropagation();\n\n const popover = this.emojiPopoverRef();\n if (!popover) {\n return;\n }\n\n if (popover.isOpen) {\n popover.close();\n return;\n }\n\n void popover.open();\n }\n\n onEmojiSelected(emoji: string): void {\n this.caption.update((value) => value + emoji);\n }\n\n onCaptionKeyDown(event: AXHtmlEvent<KeyboardEvent>): void {\n const key = event?.nativeEvent?.key;\n const shiftKey = event?.nativeEvent?.shiftKey;\n\n if (key === 'Enter' && !shiftKey) {\n event?.nativeEvent?.preventDefault();\n if (!this.sendDisabled()) {\n this.onSend.emit();\n }\n }\n }\n}\n","<div class=\"ax-conversation-picker-caption\">\n <div class=\"ax-conversation-picker-caption__field\">\n <label class=\"ax-conversation-picker-caption__label\">\n {{ translation.translateSync('@acorex:chat.pickers.common.caption') }}\n </label>\n\n <div class=\"ax-conversation-picker-caption__input-row\">\n <ax-text-box\n [(value)]=\"caption\"\n [look]=\"'flat'\"\n [placeholder]=\"''\"\n [axAutoFocus]=\"true\"\n (onKeyDown)=\"onCaptionKeyDown($event)\"\n />\n\n <ax-button\n #emojiButton\n class=\"ax-conversation-picker-caption__emoji rounded-full\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"translation.translateSync('@acorex:chat.tooltips.emoji')\"\n (onClick)=\"onEmojiClick($event)\"\n (mousedown)=\"$event.stopPropagation()\"\n >\n <ax-icon><i class=\"fa-light fa-face-smile\"></i></ax-icon>\n </ax-button>\n </div>\n </div>\n\n @if (showInlineSend()) {\n <ax-button\n class=\"ax-conversation-picker-caption__send rounded-full\"\n [iconOnly]=\"true\"\n look=\"blank\"\n [color]=\"'primary'\"\n [text]=\"translation.translateSync('@acorex:chat.actions.send')\"\n [disabled]=\"sendDisabled()\"\n (onClick)=\"onSend.emit()\"\n >\n <ax-prefix>\n <i class=\"fa-solid fa-paper-plane-top\"></i>\n </ax-prefix>\n </ax-button>\n }\n</div>\n\n<ax-popover\n #emojiPopover\n [target]=\"emojiButton\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'top-start'\"\n panelClass=\"composer-emoji-popover-panel\"\n>\n <div class=\"composer-emoji-popover\">\n <ax-conversation-emoji-tab (itemSelected)=\"onEmojiSelected($event)\" />\n </div>\n</ax-popover>\n","import { AXCheckBoxComponent } from '@acorex/components/check-box';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { Component, ViewEncapsulation, input, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\n/** Grouping and delivery options shown below composer picker previews. */\n@Component({\n selector: 'ax-conversation-picker-options',\n encapsulation: ViewEncapsulation.None,\n imports: [AsyncPipe, AXCheckBoxComponent, AXLabelComponent, AXTranslationModule, FormsModule],\n templateUrl: './picker-options.component.html',\n styleUrl: './picker-options.component.css',\n})\nexport class AXConversationPickerOptionsComponent {\n readonly showGroupItems = input(true);\n readonly showSendAsDocuments = input(false);\n readonly groupItems = model(true);\n readonly sendAsDocuments = model(false);\n}\n","<div class=\"ax-conversation-picker-options\">\n @if (showGroupItems()) {\n <ax-check-box [(ngModel)]=\"groupItems\" [color]=\"'primary'\">\n <ax-label>{{ '@acorex:chat.pickers.common.group-items' | translate | async }}</ax-label>\n </ax-check-box>\n }\n\n @if (showSendAsDocuments()) {\n <ax-check-box [(ngModel)]=\"sendAsDocuments\" [color]=\"'primary'\">\n <ax-label>{{ '@acorex:chat.pickers.common.send-as-documents' | translate | async }}</ax-label>\n </ax-check-box>\n }\n</div>\n","/** Middle-ellipsis truncation for long file names in picker rows. */\nexport function truncatePickerFileName(text: string, maxLength = 36): string {\n if (text.length <= maxLength) {\n return text;\n }\n\n const keep = maxLength - 3;\n const start = Math.ceil(keep / 2);\n const end = Math.floor(keep / 2);\n return `${text.slice(0, start)}...${text.slice(text.length - end)}`;\n}\n","/** Creates a new File instance with an updated display name. */\nexport function renamePickerFileObject(file: File, nextName: string): File {\n const trimmed = nextName.trim();\n return new File([file], trimmed, {\n type: file.type,\n lastModified: file.lastModified,\n });\n}\n\n/** Validates a picker file name before applying a rename. */\nexport function isValidPickerFileName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length > 0 && !/[\\\\/]/u.test(trimmed);\n}\n","import { AXUploaderBrowseDirective } from '@acorex/cdk/uploader';\nimport { Component, ElementRef, ViewEncapsulation, inject, input } from '@angular/core';\n\n@Component({\n selector: 'ax-conversation-picker-empty',\n encapsulation: ViewEncapsulation.None,\n imports: [AXUploaderBrowseDirective],\n templateUrl: './picker-empty.component.html',\n styleUrls: ['./picker-shared.css'],\n})\nexport class AXConversationPickerEmptyComponent {\n private readonly host = inject(ElementRef<HTMLElement>);\n\n readonly title = input.required<string>();\n readonly hint = input.required<string>();\n readonly iconClass = input.required<string>();\n readonly dragOver = input(false);\n\n onKeyboardActivate(event: Event): void {\n event.preventDefault();\n this.host.nativeElement.click();\n }\n}\n","<div\n class=\"ax-conversation-picker__empty\"\n [class.ax-conversation-picker__empty--drag]=\"dragOver()\"\n role=\"button\"\n tabindex=\"0\"\n axUploaderBrowseHandle\n (keydown.enter)=\"onKeyboardActivate($event)\"\n (keydown.space)=\"onKeyboardActivate($event)\"\n>\n <i class=\"ax-conversation-picker__empty-icon\" [class]=\"iconClass()\"></i>\n <p class=\"ax-conversation-picker__empty-title\">{{ title() }}</p>\n <p class=\"ax-conversation-picker__empty-hint\">{{ hint() }}</p>\n</div>\n","import { AXUploaderFileChangeEvent, AXUploaderService, AXUploaderZoneDirective } from '@acorex/cdk/uploader';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Component, DestroyRef, ViewEncapsulation, inject, input, output, viewChild } from '@angular/core';\nimport { filesFromClipboardEvent } from './clipboard-files';\nimport { registerComposerPickerPasteHandler } from './picker-paste';\nimport { notifyPickerValidationErrors } from './picker-upload';\n\n/**\n * Wraps composer pickers with {@link AXUploaderZoneDirective} for browse, drop, and validation.\n */\n@Component({\n selector: 'ax-conversation-picker-shell',\n encapsulation: ViewEncapsulation.None,\n imports: [AXUploaderZoneDirective],\n styleUrl: './picker-shell.component.css',\n templateUrl: './picker-shell.component.html',\n host: {\n '(paste)': 'onHostPaste($event)',\n },\n})\nexport class AXConversationPickerShellComponent {\n private readonly toast = inject(AXToastService);\n private readonly translation = inject(AXTranslationService);\n private readonly uploader = inject(AXUploaderService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly zone = viewChild(AXUploaderZoneDirective);\n\n readonly fileType = input.required<string>();\n readonly multiple = input(false);\n\n readonly filesSelected = output<File[]>();\n readonly dragEnter = output<DragEvent>();\n readonly dragLeave = output<DragEvent>();\n readonly dragOver = output<DragEvent>();\n\n constructor() {\n const unregister = registerComposerPickerPasteHandler((files) => {\n void this.ingestPastedFiles(files);\n });\n this.destroyRef.onDestroy(unregister);\n }\n\n /** Open the OS file picker for this shell's catalog. */\n browse(): Promise<void> {\n return this.zone()?.browser() ?? Promise.resolve();\n }\n\n protected onHostPaste(event: ClipboardEvent): void {\n if (event.defaultPrevented) {\n return;\n }\n const files = filesFromClipboardEvent(event);\n if (!files.length) {\n return;\n }\n event.preventDefault();\n event.stopImmediatePropagation();\n void this.ingestPastedFiles(files);\n }\n\n protected onZoneFileChange(event: AXUploaderFileChangeEvent): void {\n this.emitValidatedFiles(event.files, event.rejected);\n }\n\n private async ingestPastedFiles(files: File[]): Promise<void> {\n const catalog = this.fileType();\n const { accepted, rejected } = await this.uploader.validateFiles(files, catalog);\n this.emitValidatedFiles(accepted, rejected);\n }\n\n private emitValidatedFiles(\n accepted: File[],\n rejected: AXUploaderFileChangeEvent['rejected'],\n ): void {\n if (rejected?.length) {\n notifyPickerValidationErrors(this.toast, this.translation, rejected);\n }\n\n const files = this.multiple() ? accepted : accepted.slice(0, 1);\n if (files.length > 0) {\n this.filesSelected.emit(files);\n }\n }\n}\n","<div\n class=\"ax-conversation-picker\"\n axUploaderZone\n [fileType]=\"fileType()\"\n [multiple]=\"multiple()\"\n [disableBrowse]=\"true\"\n (fileChange)=\"onZoneFileChange($event)\"\n (dragEnter)=\"dragEnter.emit($event)\"\n (dragLeave)=\"dragLeave.emit($event)\"\n (dragOver)=\"dragOver.emit($event)\"\n>\n <div class=\"ax-conversation-picker__content\">\n <ng-content />\n </div>\n</div>\n","import { AXUploaderService } from '@acorex/cdk/uploader';\nimport type { AXFileTypeRegistryService } from '@acorex/core/file';\nimport type { AXToastService } from '@acorex/components/toast';\nimport type { AXTranslationService } from '@acorex/core/translation';\nimport { afterNextRender, type InputSignal } from '@angular/core';\nimport { ensureConversationFileCatalogRegistered } from '../../composer-actions/conversation-composer-file-types.provider';\nimport { notifyPickerValidationErrors } from './picker-upload';\n\nexport interface ComposerPickerAutoRunBrowseOptions {\n fileTypeRegistry: AXFileTypeRegistryService;\n uploader: AXUploaderService;\n toast: AXToastService;\n translation: AXTranslationService;\n catalogFileType: string;\n maxFiles: number;\n hasExistingFiles: () => boolean;\n handleFiles: (files: File[]) => void | Promise<void>;\n onCancelled: () => void;\n}\n\n/** Open the OS file dialog after the picker panel is mounted, then start uploads. */\nexport async function runComposerPickerAutoRunBrowse(options: ComposerPickerAutoRunBrowseOptions): Promise<void> {\n if (options.hasExistingFiles()) {\n return;\n }\n\n await ensureConversationFileCatalogRegistered(options.fileTypeRegistry, options.catalogFileType);\n\n const { accepted, rejected } = await options.uploader.chooseFiles({\n fileType: options.catalogFileType,\n multiple: options.maxFiles > 1,\n });\n\n notifyPickerValidationErrors(options.toast, options.translation, rejected);\n\n if (accepted.length === 0) {\n options.onCancelled();\n return;\n }\n\n await options.handleFiles(accepted);\n}\n\ntype ComposerPickerAutoRunHost = {\n autoRun: InputSignal<boolean>;\n initialFiles: InputSignal<File[]>;\n activate: () => void | Promise<void>;\n seedFiles: (files: File[]) => void | Promise<void>;\n};\n\n/**\n * After the upload panel is rendered, seed drag-and-drop files or run {@link activate}.\n */\nexport function installComposerPickerAutoRun(host: ComposerPickerAutoRunHost): void {\n afterNextRender(() => {\n const prefilled = host.initialFiles();\n if (prefilled.length > 0) {\n void host.seedFiles([...prefilled]);\n return;\n }\n\n if (!host.autoRun()) {\n return;\n }\n\n void host.activate();\n });\n}\n","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXConversationFileMediaItem, AXConversationFilePayload, AXConversationMessagePayload } from '../../../../models';\nimport type { AXConversationUploaderResult } from '../../../../models/conversation-upload.types';\nimport { normalizeFilePayload } from '../../../message-list/components/file-renderer/file.payload';\nimport { resolvePersistableMediaUrl, resolvePersistedThumbnailUrl } from '../shared/persisted-media-url';\n\nexport function fileItemFromUpload(\n file: File,\n result: AXConversationUploaderResult,\n extras?: { duration?: number },\n): AXConversationFileMediaItem {\n const extension = file.name.includes('.') ? file.name.split('.').pop() : undefined;\n const url = resolvePersistableMediaUrl(result.url);\n const duration = extras?.duration != null && Number.isFinite(extras.duration) ? extras.duration : undefined;\n const item: AXConversationFileMediaItem = {\n mediaId: result.mediaId,\n mimeType: result.mimeType,\n size: result.size,\n name: file.name,\n thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl, url),\n extension,\n duration,\n metadata: result.metadata,\n };\n if (url) {\n item.url = url;\n }\n return item;\n}\n\nexport function mergeFileUploadResult(\n payload: AXConversationMessagePayload,\n result: AXUploadResult,\n): AXConversationMessagePayload {\n const base = normalizeFilePayload(payload as AXConversationFilePayload);\n const files = [...base.files];\n const i = files.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n const slot = i >= 0 ? files[i] : undefined;\n const name = slot?.name ?? (result.metadata?.['fileName'] as string | undefined) ?? 'file';\n const url = resolvePersistableMediaUrl(result.url);\n const next: AXConversationFileMediaItem = {\n ...(slot ?? { name, mimeType: result.mimeType }),\n mediaId: result.mediaId,\n mimeType: result.mimeType,\n size: result.size,\n name,\n thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl ?? slot?.thumbnailUrl, url),\n metadata: result.metadata,\n };\n if (url) {\n next.url = url;\n }\n if (i >= 0) files[i] = next;\n else files.push(next);\n return { ...base, type: 'file', files };\n}\n\nexport function applyFileLocalPreview(\n payload: AXConversationMessagePayload,\n localUrl: string,\n mimeType = 'application/octet-stream',\n): AXConversationMessagePayload {\n const base = normalizeFilePayload(payload as AXConversationFilePayload);\n const files = [...base.files];\n const slot = files.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n const preview = { url: localUrl, name: 'upload', mimeType };\n if (slot >= 0) {\n files[slot] = { ...files[slot], ...preview };\n } else if (files.length === 0) {\n files.push(preview);\n } else {\n files[0] = { ...files[0], ...preview };\n }\n return { ...base, type: 'file', files };\n}\n","/**\n * Audio Picker Component\n * Full-width audio file selection interface for the composer\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownPanelComponent } from '@acorex/components/dropdown';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport {\n AXFileService,\n AXFileTypeRegistryService,\n runFileTypeUtility,\n runFileTypeUtilityForFile,\n type AXFileType,\n} from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, ViewEncapsulation, computed, inject, input, signal, viewChild } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport type { AXConversationComposerActionComponent } from '../../../../registries/composer-action.registry';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { AXConversationPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerOptionsComponent } from '../shared/picker-options.component';\nimport { truncatePickerFileName } from '../shared/picker-truncate.utils';\nimport { renamePickerFileObject } from '../shared/picker-file.utils';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport {\n cleanupPickerUploads,\n createPickerUploadItemId,\n dismissComposerPickerHost,\n getPickerCancelUploadLabel,\n isUploadAborted,\n limitFilesToCapacity,\n notifyMaxFilesCapacityExceeded,\n notifyPickerValidationErrors,\n pickerItemToUploadResult,\n uploadPickerFile,\n type AXConversationComposerPickerUploadItem,\n} from '../shared/picker-upload';\nimport { installComposerPickerAutoRun, runComposerPickerAutoRunBrowse } from '../shared/picker-auto-run';\nimport { fileItemFromUpload } from '../file-picker/file-composer.payload';\nimport { audioItemFromUpload } from './audio-composer.payload';\nimport {\n AX_CONVERSATION_AUDIO_CATALOG,\n AX_CONVERSATION_AUDIO_PRESENTATION,\n createConversationAudioFileType,\n} from './conversation-audio.file-type';\n\ninterface AXConversationAudioFile extends AXConversationComposerPickerUploadItem {\n duration?: number;\n dataUrl?: string;\n}\n\n@Component({\n selector: 'ax-conversation-audio-picker',\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n AXProgressBarModule,\n AXTranslationModule,\n AXButtonComponent,\n AXButtonItemComponent,\n AXButtonItemListComponent,\n AXDecoratorModule,\n AXDropdownPanelComponent,\n AXConversationPickerHeaderComponent,\n AXConversationPickerFooterComponent,\n AXConversationPickerEmptyComponent,\n AXConversationPickerCaptionComponent,\n AXConversationPickerOptionsComponent,\n AXConversationPickerShellComponent,\n ],\n templateUrl: './audio-picker.component.html',\n styleUrls: ['../shared/picker-shared.css'],\n})\nexport class AXConversationAudioPickerComponent implements OnDestroy, AXConversationComposerActionComponent {\n private uploadsDismissed = false;\n private retainUploadedOnDismiss = false;\n readonly service = input<AXConversationComposerService | undefined>();\n private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n private get composerService(): AXConversationComposerService {\n const svc = this.service() ?? this.composerServiceFromInjector;\n if (!svc) {\n throw new Error('AXConversationComposerService is required for the audio picker');\n }\n return svc;\n }\n private readonly uploader = inject(AXUploaderService);\n private readonly fileService = inject(AXFileService);\n private readonly fileTypeRegistry = inject(AXFileTypeRegistryService);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly toast = inject(AXToastService);\n private readonly popupService = inject(AXPopupService);\n readonly translation = inject(AXTranslationService);\n\n readonly conversation = input.required<AXConversation>();\n readonly maxFiles = input<number>(10);\n readonly initialFiles = input<File[]>([]);\n readonly autoRun = input(false);\n readonly __popup__ = input<AXPopupRef | undefined>();\n readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n\n readonly catalogFileType = AX_CONVERSATION_AUDIO_CATALOG;\n\n readonly audioFiles = signal<AXConversationAudioFile[]>([]);\n readonly isDragging = signal(false);\n private readonly pickerShell = viewChild<AXConversationPickerShellComponent>('pickerShell');\n readonly emptyIconClass = computed(() =>\n this.isDragging() ? 'fa-light fa-cloud-arrow-up' : AX_CONVERSATION_AUDIO_PRESENTATION.icon,\n );\n\n private catalogFileTypeDef?: AXFileType;\n caption = '';\n groupItems = true;\n sendAsDocuments = false;\n\n readonly allowMultiple = computed(() => this.maxFiles() > 1);\n\n constructor() {\n this.fileTypeRegistry.registerTypes([createConversationAudioFileType()]);\n installComposerPickerAutoRun({\n autoRun: this.autoRun,\n initialFiles: this.initialFiles,\n activate: () => this.activate(),\n seedFiles: (files) => this.handleFiles(files),\n });\n }\n\n activate(): Promise<void> {\n return runComposerPickerAutoRunBrowse({\n fileTypeRegistry: this.fileTypeRegistry,\n uploader: this.uploader,\n toast: this.toast,\n translation: this.translation,\n catalogFileType: this.catalogFileType,\n maxFiles: this.maxFiles(),\n hasExistingFiles: () => this.audioFiles().length > 0,\n handleFiles: (files) => this.handleFiles(files),\n onCancelled: () => this.cancel(),\n });\n }\n\n private createUtilityContext() {\n return {\n readAsDataUrl: (file: File | Blob) => this.fileService.blobToBase64(file),\n platformId: this.platformId,\n };\n }\n\n private async getCatalogFileTypeDef(): Promise<AXFileType | undefined> {\n this.catalogFileTypeDef ??= await this.fileService.getFileType(this.catalogFileType);\n return this.catalogFileTypeDef;\n }\n\n private async runUtility(name: string, file: File, ...args: unknown[]): Promise<unknown> {\n const fileType = await this.getCatalogFileTypeDef();\n if (!fileType) return undefined;\n return runFileTypeUtilityForFile(fileType, this.createUtilityContext(), file, name, ...args);\n }\n\n async handleFiles(files: File[]): Promise<void> {\n const max = this.maxFiles();\n const capacity = limitFilesToCapacity(files, this.audioFiles().length, max);\n if (capacity.length < files.length) {\n notifyMaxFilesCapacityExceeded(this.toast, this.translation, max);\n }\n if (capacity.length === 0) {\n return;\n }\n\n const { accepted, rejected } = await this.uploader.validateFiles(capacity, this.catalogFileType);\n\n notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n for (const file of accepted) {\n try {\n const durationResult = await this.runUtility('duration', file);\n const previewResult = await this.runUtility('preview', file);\n const duration = typeof durationResult === 'number' ? durationResult : 0;\n const dataUrl = typeof previewResult === 'string' ? previewResult : undefined;\n let index = -1;\n this.audioFiles.update((audios) => {\n index = audios.length;\n return [...audios, { id: createPickerUploadItemId(), file, duration, dataUrl, uploadProgress: 0, uploading: true }];\n });\n if (index >= 0) {\n void this.uploadAudioAt(index, file);\n }\n } catch (error) {\n console.error('Failed to process audio:', error);\n }\n }\n }\n\n private async uploadAudioAt(index: number, file: File): Promise<void> {\n const abortController = new AbortController();\n this.patchAudio(index, { abortController });\n\n try {\n const result = await uploadPickerFile(\n this.uploader,\n this.conversation().id,\n file,\n (progress) => this.patchAudio(index, { uploadProgress: progress, uploading: true }),\n abortController.signal,\n );\n this.patchAudio(index, {\n uploadProgress: 100,\n uploading: false,\n uploaded: true,\n uploadedUrl: result.url,\n mediaId: result.mediaId,\n });\n } catch (err) {\n if (this.uploadsDismissed || isUploadAborted(err, abortController.signal)) {\n return;\n }\n this.patchAudio(index, {\n uploading: false,\n error: this.translation.translateSync('@acorex:chat.errors.upload-failed'),\n });\n }\n }\n\n private patchAudio(index: number, patch: Partial<AXConversationAudioFile>): void {\n if (this.uploadsDismissed) {\n return;\n }\n this.audioFiles.update((items) => {\n const next = [...items];\n if (next[index]) {\n next[index] = { ...next[index], ...patch };\n }\n return next;\n });\n }\n\n removeAudio(index: number): void {\n const item = this.audioFiles()[index];\n if (item) {\n cleanupPickerUploads(this.uploader, [item]);\n }\n this.audioFiles.update((audios) => audios.filter((_, i) => i !== index));\n }\n\n async renameAudio(index: number): Promise<void> {\n const item = this.audioFiles()[index];\n if (!item) {\n return;\n }\n\n const { AXConversationPickerRenameFileDialogComponent } = await import(\n '../shared/picker-rename-file-dialog.component'\n );\n const result = await this.popupService.open(AXConversationPickerRenameFileDialogComponent, {\n title: this.translation.translateSync('@acorex:chat.pickers.files.rename-title'),\n size: 'sm',\n closeButton: true,\n header: true,\n inputs: {\n initialName: item.file.name,\n },\n });\n\n const nextName = result?.data as string | undefined;\n if (!nextName || nextName === item.file.name) {\n return;\n }\n\n this.audioFiles.update((audios) => {\n const next = [...audios];\n if (!next[index]) {\n return next;\n }\n next[index] = {\n ...next[index],\n file: renamePickerFileObject(next[index].file, nextName),\n };\n return next;\n });\n }\n\n async replaceAttachment(index: number): Promise<void> {\n const current = this.audioFiles()[index];\n if (!current) {\n return;\n }\n\n const { accepted, rejected } = await this.uploader.chooseFiles({\n fileType: this.catalogFileType,\n multiple: false,\n });\n notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n const replacement = accepted[0];\n if (!replacement) {\n return;\n }\n\n if (current.abortController) {\n current.abortController.abort();\n }\n cleanupPickerUploads(this.uploader, [current]);\n\n try {\n const durationResult = await this.runUtility('duration', replacement);\n const previewResult = await this.runUtility('preview', replacement);\n const duration = typeof durationResult === 'number' ? durationResult : 0;\n const dataUrl = typeof previewResult === 'string' ? previewResult : undefined;\n\n this.audioFiles.update((audios) => {\n const next = [...audios];\n next[index] = {\n id: createPickerUploadItemId(),\n file: replacement,\n duration,\n dataUrl,\n uploadProgress: 0,\n uploading: true,\n };\n return next;\n });\n void this.uploadAudioAt(index, replacement);\n } catch (error) {\n console.error('Failed to replace audio attachment:', error);\n this.removeAudio(index);\n }\n }\n\n async sendAudio(): Promise<void> {\n const audioList = this.audioFiles();\n if (!this.canSend()) return;\n\n const caption = this.caption.trim() || undefined;\n const sendSingle = !this.groupItems && audioList.length > 1;\n\n this.retainUploadedOnDismiss = true;\n const popup = this.__popup__();\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, popup, this.__actionSheet__());\n\n if (this.sendAsDocuments) {\n await this.sendAudioAsDocuments(audioList, caption, sendSingle);\n return;\n }\n\n if (sendSingle) {\n for (const audio of audioList) {\n const result = pickerItemToUploadResult(audio);\n if (!result) {\n continue;\n }\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'audio',\n payload: {\n type: 'audio',\n audios: [audioItemFromUpload(audio.file, result, audio.duration ?? 0)],\n },\n };\n await this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n return;\n }\n\n const audios = audioList.flatMap((audio) => {\n const result = pickerItemToUploadResult(audio);\n return result ? [audioItemFromUpload(audio.file, result, audio.duration ?? 0)] : [];\n });\n\n if (audios.length === 0) {\n return;\n }\n\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'audio',\n payload: {\n type: 'audio',\n audios,\n caption,\n },\n };\n\n void this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n\n private async sendAudioAsDocuments(\n audioList: AXConversationAudioFile[],\n caption: string | undefined,\n sendSingle: boolean,\n ): Promise<void> {\n if (sendSingle) {\n for (const audio of audioList) {\n const result = pickerItemToUploadResult(audio);\n if (!result) {\n continue;\n }\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'file',\n payload: {\n type: 'file',\n files: [fileItemFromUpload(audio.file, result, { duration: audio.duration })],\n },\n };\n await this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n return;\n }\n\n const files = audioList.flatMap((audio) => {\n const result = pickerItemToUploadResult(audio);\n return result ? [fileItemFromUpload(audio.file, result, { duration: audio.duration })] : [];\n });\n\n if (files.length === 0) {\n return;\n }\n\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'file',\n payload: {\n type: 'file',\n files,\n caption,\n },\n };\n\n void this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n\n canSend(): boolean {\n const list = this.audioFiles();\n return list.length > 0 && list.every((a) => a.uploaded && !a.error && !a.uploading);\n }\n\n getUploadingLabel(progress: number): string {\n return this.translation.translateSync('@acorex:chat.pickers.files.uploading-progress', {\n params: { progress },\n });\n }\n\n getCancelUploadLabel(): string {\n return getPickerCancelUploadLabel(this.translation);\n }\n\n getHeaderTitle(): string {\n const count = this.audioFiles().length;\n if (count === 0) {\n return this.translation.translateSync('@acorex:chat.pickers.audio.title');\n }\n return this.translation.translateSync('@acorex:chat.pickers.audio.selected-count', {\n params: { count },\n });\n }\n\n truncateFileName(fileName: string): string {\n return truncatePickerFileName(fileName);\n }\n\n onAddMoreFiles(): void {\n void this.pickerShell()?.browse();\n }\n\n cancel(): void {\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n }\n\n ngOnDestroy(): void {\n this.dismissPicker();\n }\n\n private dismissPicker(): void {\n if (this.uploadsDismissed) {\n return;\n }\n this.uploadsDismissed = true;\n const snapshot = [...this.audioFiles()];\n cleanupPickerUploads(this.uploader, snapshot, {\n retainUploaded: this.retainUploadedOnDismiss,\n });\n this.retainUploadedOnDismiss = false;\n this.audioFiles.set([]);\n this.caption = '';\n }\n\n formatFileSize(bytes: number): string {\n const fileType = this.catalogFileTypeDef;\n const result = fileType\n ? runFileTypeUtility(fileType, this.createUtilityContext(), undefined, 'formatSize', bytes)\n : undefined;\n return typeof result === 'string' ? result : `${bytes} B`;\n }\n\n formatDuration(seconds: number): string {\n const fileType = this.catalogFileTypeDef;\n const result = fileType\n ? runFileTypeUtility(fileType, this.createUtilityContext(), undefined, 'formatDuration', seconds)\n : undefined;\n return typeof result === 'string' ? result : '0:00';\n }\n\n getEmptyTitle(): string {\n return this.isDragging()\n ? this.translation.translateSync('@acorex:chat.pickers.audio.drop-to-attach')\n : this.translation.translateSync('@acorex:chat.pickers.audio.select');\n }\n\n getEmptySubtitle(): string {\n return this.isDragging()\n ? this.translation.translateSync('@acorex:chat.pickers.common.release-to-upload')\n : this.translation.translateSync('@acorex:chat.pickers.common.click-to-browse');\n }\n\n getSelectedCountText(): string {\n return this.translation.translateSync('@acorex:chat.pickers.audio.selected-count', {\n params: { count: this.audioFiles().length },\n });\n }\n\n getSendText(): string {\n return this.translation.translateSync('@acorex:chat.pickers.audio.send-count', {\n params: { count: this.audioFiles().length },\n });\n }\n}\n","<ax-conversation-picker-shell\n #pickerShell\n [fileType]=\"catalogFileType\"\n [multiple]=\"allowMultiple()\"\n (filesSelected)=\"handleFiles($event)\"\n (dragEnter)=\"isDragging.set(true)\"\n (dragLeave)=\"isDragging.set(false)\"\n>\n <ax-conversation-picker-header\n [title]=\"getHeaderTitle()\"\n [showMenu]=\"audioFiles().length > 0\"\n [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n (onAddMore)=\"onAddMoreFiles()\"\n />\n\n <div class=\"ax-conversation-picker__scroll\">\n @if (audioFiles().length === 0) {\n <ax-conversation-picker-empty\n [title]=\"getEmptyTitle()\"\n [hint]=\"getEmptySubtitle()\"\n [iconClass]=\"emptyIconClass()\"\n [dragOver]=\"isDragging()\"\n />\n } @else {\n <div class=\"ax-conversation-picker__body\">\n <div class=\"ax-conversation-picker__panel\">\n <div class=\"ax-conversation-picker__list\">\n @for (audio of audioFiles(); track audio.id) {\n <div class=\"ax-conversation-picker__row ax-conversation-picker__row--file\">\n <span class=\"ax-conversation-file__badge\" aria-hidden=\"true\">\n <span class=\"ax-conversation-file__badge-doc\">\n <i class=\"fa-solid fa-music\"></i>\n </span>\n </span>\n\n <div class=\"ax-conversation-picker__details\">\n <div class=\"ax-conversation-picker__name\" [title]=\"audio.file.name\">\n {{ truncateFileName(audio.file.name) }}\n </div>\n <div class=\"ax-conversation-picker__status\">\n @if (audio.uploading) {\n <span>{{ getUploadingLabel(audio.uploadProgress ?? 0) }}</span>\n } @else if (audio.error) {\n <span class=\"ax-conversation-picker__status--err\"\n ><i class=\"fa-light fa-xmark\"></i> {{ audio.error }}</span\n >\n } @else {\n <span>{{ formatFileSize(audio.file.size) }}</span>\n @if (audio.duration) {\n <span>{{ formatDuration(audio.duration) }}</span>\n }\n }\n </div>\n @if (audio.uploading) {\n <div class=\"ax-conversation-picker__progress\">\n <ax-progress-bar [progress]=\"audio.uploadProgress || 0\" [mode]=\"'determinate'\" [height]=\"3\" />\n </div>\n }\n </div>\n\n <div class=\"ax-conversation-picker__row-actions\">\n <ax-button class=\"ax-sm rounded-full\" look=\"blank\" [iconOnly]=\"true\">\n <ax-icon><i class=\"fa-light fa-ellipsis-vertical\"></i></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"translation.translateSync('@acorex:chat.pickers.files.rename-file')\"\n (onClick)=\"renameAudio($index)\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-i-cursor\"></i></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n [text]=\"translation.translateSync('@acorex:chat.pickers.files.replace-attachment')\"\n (onClick)=\"replaceAttachment($index)\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-arrows-rotate\"></i></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n\n <ax-button\n class=\"ax-conversation-picker__row-remove rounded-full\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"translation.translateSync('@acorex:chat.pickers.common.remove')\"\n (onClick)=\"removeAudio($index)\"\n >\n <ax-icon><i class=\"fa-solid fa-xmark\"></i></ax-icon>\n </ax-button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (audioFiles().length > 0) {\n <ax-conversation-picker-options\n [(groupItems)]=\"groupItems\"\n [(sendAsDocuments)]=\"sendAsDocuments\"\n [showGroupItems]=\"allowMultiple() && audioFiles().length > 1\"\n [showSendAsDocuments]=\"true\"\n />\n <ax-conversation-picker-caption [(caption)]=\"caption\" [sendDisabled]=\"!canSend()\" (onSend)=\"sendAudio()\" />\n <ax-conversation-picker-footer\n [addLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add')\"\n [cancelLabel]=\"translation.translateSync('@acorex:chat.actions.cancel')\"\n [sendLabel]=\"translation.translateSync('@acorex:chat.actions.send')\"\n [sendDisabled]=\"!canSend()\"\n (onAdd)=\"onAddMoreFiles()\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendAudio()\"\n />\n }\n</ax-conversation-picker-shell>\n","/**\n * Composer Tabs Plugins\n */\n\nexport * from './default-tabs.plugin';\n","import type { AXFileCopyData, AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, createFileTypeMetadata } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport type { AXConversationFilePayload } from '../../../../models';\nimport {\n AX_CONVERSATION_AUDIO_CATALOG,\n AX_CONVERSATION_FILE_CATALOG,\n AX_CONVERSATION_IMAGE_CATALOG,\n AX_CONVERSATION_VIDEO_CATALOG,\n} from '../../../../models/message-file-type-catalog';\nimport { normalizeFilePayload } from '../../../message-list/components/file-renderer/file.payload';\nimport { formatFileSize } from '../shared/media-formatters';\n\nexport { AX_CONVERSATION_FILE_CATALOG };\n\nconst MB = 1024 * 1024;\n\nexport const AX_CONVERSATION_FILE_PRESENTATION = {\n icon: 'fa-light fa-file text-neutral-500',\n title: 'File',\n} as const;\n\nconst AX_CONVERSATION_FILE_ALLOWED_MIME_TYPES = [\n 'image/*',\n 'video/*',\n 'audio/*',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/zip',\n 'application/x-zip-compressed',\n 'application/x-7z-compressed',\n 'application/vnd.rar',\n 'application/octet-stream',\n 'text/plain',\n] as const;\n\ntype AXConversationFileTypeUtilityContext = {\n readAsDataUrl: (file: File | Blob) => Promise<string>;\n platformId: object;\n};\n\nconst AX_CONVERSATION_FILE_UTILITY = {\n preview: 'preview',\n duration: 'duration',\n formatSize: 'formatSize',\n createLocalPreviewUrl: 'createLocalPreviewUrl',\n pickerCatalog: 'pickerCatalog',\n} as const;\n\nfunction blobUrl(ctx: AXConversationFileTypeUtilityContext, blob: Blob): string {\n if (!isPlatformBrowser(ctx.platformId)) {\n return '';\n }\n return URL.createObjectURL(blob);\n}\n\nfunction mediaDuration(ctx: AXConversationFileTypeUtilityContext, file: File | Blob, tag: 'audio' | 'video'): Promise<number> {\n if (!isPlatformBrowser(ctx.platformId)) {\n return Promise.resolve(0);\n }\n return new Promise((resolve) => {\n const el = document.createElement(tag);\n el.preload = 'metadata';\n el.onloadedmetadata = () => {\n URL.revokeObjectURL(el.src);\n resolve(Number.isFinite(el.duration) ? el.duration : 0);\n };\n el.onerror = () => {\n URL.revokeObjectURL(el.src);\n resolve(0);\n };\n el.src = URL.createObjectURL(file);\n });\n}\n\nexport function conversationFileUtilities(): NonNullable<AXFileType['utilities']> {\n return {\n [AX_CONVERSATION_FILE_UTILITY.preview]: async (ctx, file) => {\n const f = file as File;\n const typedCtx = ctx as AXConversationFileTypeUtilityContext;\n if (f.type.startsWith('image/')) {\n return typedCtx.readAsDataUrl(f);\n }\n if (f.type.startsWith('video/')) {\n return blobUrl(typedCtx, f);\n }\n return undefined;\n },\n [AX_CONVERSATION_FILE_UTILITY.duration]: (ctx, file) => {\n const f = file as File;\n const typedCtx = ctx as AXConversationFileTypeUtilityContext;\n if (f.type.startsWith('audio/')) {\n return mediaDuration(typedCtx, f, 'audio');\n }\n if (f.type.startsWith('video/')) {\n return mediaDuration(typedCtx, f, 'video');\n }\n return 0;\n },\n [AX_CONVERSATION_FILE_UTILITY.formatSize]: (_ctx, bytes) => formatFileSize(bytes as number),\n [AX_CONVERSATION_FILE_UTILITY.createLocalPreviewUrl]: (ctx, source) => blobUrl(ctx as AXConversationFileTypeUtilityContext, source as Blob),\n [AX_CONVERSATION_FILE_UTILITY.pickerCatalog]: (_ctx, file) => {\n const f = file as File;\n if (f.type.startsWith('image/')) return AX_CONVERSATION_IMAGE_CATALOG;\n if (f.type.startsWith('video/')) return AX_CONVERSATION_VIDEO_CATALOG;\n if (f.type.startsWith('audio/')) return AX_CONVERSATION_AUDIO_CATALOG;\n return AX_CONVERSATION_FILE_CATALOG;\n },\n };\n}\n\nexport function createConversationFileFileType(): import('@acorex/core/file').AXFileType {\n const presentation = AX_CONVERSATION_FILE_PRESENTATION;\n return {\n name: AX_CONVERSATION_FILE_CATALOG,\n metadata: createFileTypeMetadata('conversation'),\n title: presentation.title,\n icon: presentation.icon,\n validations: {\n mimeTypes: [...AX_CONVERSATION_FILE_ALLOWED_MIME_TYPES],\n minSize: 1,\n maxSize: 100 * MB,\n },\n extensions: [\n { name: 'pdf', title: 'PDF', validations: { mimeTypes: ['application/pdf'], maxSize: 25 * MB } },\n { name: 'doc', title: 'Word' },\n { name: 'docx', title: 'Word' },\n { name: 'txt', title: 'Text', validations: { mimeTypes: ['text/plain'], maxSize: 5 * MB } },\n {\n name: 'zip',\n title: 'ZIP',\n validations: {\n mimeTypes: ['application/zip', 'application/x-zip-compressed', 'application/octet-stream', 'application/*'],\n maxSize: 50 * MB,\n },\n },\n {\n name: 'rar',\n title: 'RAR',\n validations: {\n mimeTypes: [\n 'application/vnd.rar',\n 'application/x-rar-compressed',\n 'application/octet-stream',\n 'application/*',\n ],\n maxSize: 50 * MB,\n },\n },\n ],\n utilities: conversationFileUtilities(),\n copy: (payload): AXFileCopyData => {\n const file = normalizeFilePayload(payload as AXConversationFilePayload);\n const caption = file.caption?.trim();\n const items = file.files.map((item) => {\n const name = item.name?.trim();\n const url = item.url?.trim();\n const line = name && url ? `${name} — ${url}` : url || name;\n return { name, url, line };\n });\n return {\n text: caption ?? '',\n meta: { kind: 'file', caption, items, count: file.files.length },\n };\n },\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationFileFileTypeProvider extends AXFileTypeInfoProvider {\n items() {\n return Promise.resolve([createConversationFileFileType()]);\n }\n}\n","/**\n * File Picker Component\n * General-purpose file attachment interface for the composer\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownPanelComponent } from '@acorex/components/dropdown';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport {\n AXFileService,\n AXFileTypeRegistryService,\n runFileTypeUtility,\n runFileTypeUtilityForFile,\n type AXFileType,\n} from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, ViewEncapsulation, computed, inject, input, signal, viewChild } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport type { AXConversationComposerActionComponent } from '../../../../registries/composer-action.registry';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { AXConversationPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerOptionsComponent } from '../shared/picker-options.component';\nimport { truncatePickerFileName } from '../shared/picker-truncate.utils';\nimport { renamePickerFileObject } from '../shared/picker-file.utils';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport {\n cleanupPickerUploads,\n createPickerUploadItemId,\n dismissComposerPickerHost,\n getPickerCancelUploadLabel,\n isUploadAborted,\n limitFilesToCapacity,\n notifyMaxFilesCapacityExceeded,\n notifyPickerValidationErrors,\n pickerItemToUploadResult,\n uploadPickerFile,\n type AXConversationComposerPickerUploadItem,\n} from '../shared/picker-upload';\nimport { installComposerPickerAutoRun, runComposerPickerAutoRunBrowse } from '../shared/picker-auto-run';\nimport {\n AX_CONVERSATION_FILE_CATALOG,\n AX_CONVERSATION_FILE_PRESENTATION,\n createConversationFileFileType,\n} from './conversation-file.file-type';\nimport { fileItemFromUpload } from './file-composer.payload';\n\ninterface AXConversationAttachedFile extends AXConversationComposerPickerUploadItem {\n icon: string;\n type: 'image' | 'video' | 'audio' | 'file';\n}\n\n@Component({\n selector: 'ax-conversation-file-picker',\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n AXProgressBarModule,\n AXTranslationModule,\n AXButtonComponent,\n AXButtonItemComponent,\n AXButtonItemListComponent,\n AXDecoratorModule,\n AXDropdownPanelComponent,\n AXConversationPickerHeaderComponent,\n AXConversationPickerFooterComponent,\n AXConversationPickerEmptyComponent,\n AXConversationPickerCaptionComponent,\n AXConversationPickerOptionsComponent,\n AXConversationPickerShellComponent,\n ],\n templateUrl: './file-picker.component.html',\n styleUrls: ['../shared/picker-shared.css'],\n})\nexport class AXConversationFilePickerComponent implements OnDestroy, AXConversationComposerActionComponent {\n private uploadsDismissed = false;\n private retainUploadedOnDismiss = false;\n private readonly uploader = inject(AXUploaderService);\n private readonly fileService = inject(AXFileService);\n private readonly fileTypeRegistry = inject(AXFileTypeRegistryService);\n private readonly platformId = inject(PLATFORM_ID);\n readonly service = input<AXConversationComposerService | undefined>();\n private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n private get composerService(): AXConversationComposerService {\n const svc = this.service() ?? this.composerServiceFromInjector;\n if (!svc) {\n throw new Error('AXConversationComposerService is required for the file picker');\n }\n return svc;\n }\n private readonly toast = inject(AXToastService);\n private readonly popupService = inject(AXPopupService);\n readonly translation = inject(AXTranslationService);\n\n readonly conversation = input.required<AXConversation>();\n readonly maxFiles = input<number>(10);\n readonly initialFiles = input<File[]>([]);\n readonly autoRun = input(false);\n readonly __popup__ = input<AXPopupRef | undefined>();\n readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n\n readonly catalogFileType = AX_CONVERSATION_FILE_CATALOG;\n\n readonly allowMultiple = computed(() => this.maxFiles() > 1);\n\n readonly files = signal<AXConversationAttachedFile[]>([]);\n readonly isDragging = signal(false);\n readonly isUploading = signal(false);\n private readonly pickerShell = viewChild<AXConversationPickerShellComponent>('pickerShell');\n readonly emptyIconClass = computed(() =>\n this.isDragging() ? 'fa-light fa-cloud-arrow-up' : AX_CONVERSATION_FILE_PRESENTATION.icon,\n );\n\n private catalogFileTypeDef?: AXFileType;\n caption = '';\n groupItems = true;\n\n constructor() {\n this.fileTypeRegistry.registerTypes([createConversationFileFileType()]);\n installComposerPickerAutoRun({\n autoRun: this.autoRun,\n initialFiles: this.initialFiles,\n activate: () => this.activate(),\n seedFiles: (files) => this.handleFiles(files),\n });\n }\n\n activate(): Promise<void> {\n return runComposerPickerAutoRunBrowse({\n fileTypeRegistry: this.fileTypeRegistry,\n uploader: this.uploader,\n toast: this.toast,\n translation: this.translation,\n catalogFileType: this.catalogFileType,\n maxFiles: this.maxFiles(),\n hasExistingFiles: () => this.files().length > 0,\n handleFiles: (files) => this.handleFiles(files),\n onCancelled: () => this.cancel(),\n });\n }\n\n private createUtilityContext() {\n return {\n readAsDataUrl: (file: File | Blob) => this.fileService.blobToBase64(file),\n platformId: this.platformId,\n };\n }\n\n private async getCatalogFileTypeDef(): Promise<AXFileType | undefined> {\n this.catalogFileTypeDef ??= await this.fileService.getFileType(this.catalogFileType);\n return this.catalogFileTypeDef;\n }\n\n private pickerKind(catalogName: string): AXConversationAttachedFile['type'] {\n if (catalogName === 'conversation-image') return 'image';\n if (catalogName === 'conversation-video') return 'video';\n if (catalogName === 'conversation-audio') return 'audio';\n return 'file';\n }\n\n async handleFiles(fileList: File[]): Promise<void> {\n const max = this.maxFiles();\n const capacity = limitFilesToCapacity(fileList, this.files().length, max);\n if (capacity.length < fileList.length) {\n notifyMaxFilesCapacityExceeded(this.toast, this.translation, max);\n }\n if (capacity.length === 0) {\n return;\n }\n\n const { accepted, rejected } = await this.uploader.validateFiles(capacity, this.catalogFileType);\n\n notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n for (const file of accepted) {\n try {\n const entry = await this.buildAttachedFileEntry(file);\n let fileIndex = -1;\n this.files.update((files) => {\n fileIndex = files.length;\n return [\n ...files,\n { id: createPickerUploadItemId(), ...entry, uploadProgress: 0, uploading: true },\n ];\n });\n\n if (fileIndex >= 0) {\n void this.uploadFile(fileIndex, file);\n }\n } catch (error) {\n console.error('Failed to process file:', error);\n }\n }\n }\n\n private async buildAttachedFileEntry(\n file: File,\n ): Promise<Pick<AXConversationAttachedFile, 'file' | 'preview' | 'icon' | 'type' | 'duration'>> {\n const fileType = await this.getCatalogFileTypeDef();\n const ctx = this.createUtilityContext();\n const previewResult = fileType ? await runFileTypeUtilityForFile(fileType, ctx, file, 'preview') : undefined;\n const rowCatalogResult = fileType\n ? await runFileTypeUtilityForFile(fileType, ctx, file, 'pickerCatalog')\n : undefined;\n const durationResult = fileType ? await runFileTypeUtilityForFile(fileType, ctx, file, 'duration') : undefined;\n const preview = typeof previewResult === 'string' ? previewResult : undefined;\n const rowCatalog = typeof rowCatalogResult === 'string' ? rowCatalogResult : this.catalogFileType;\n const rowType = await this.fileService.getFileType(rowCatalog);\n const icon = rowType?.icon ?? fileType?.icon ?? 'fa-light fa-file';\n const pickerKind = this.pickerKind(rowCatalog);\n const duration = typeof durationResult === 'number' && Number.isFinite(durationResult) ? durationResult : undefined;\n\n return { file, preview, icon, type: pickerKind, duration };\n }\n\n private async uploadFile(index: number, file: File): Promise<void> {\n const abortController = new AbortController();\n this.files.update((files) => {\n const updated = [...files];\n updated[index] = { ...updated[index], abortController };\n return updated;\n });\n\n try {\n const result = await this.uploadFileWithProgress(\n file,\n (progress) => {\n this.updateFileProgress(index, progress, true);\n },\n abortController.signal,\n );\n\n this.updateFileProgress(index, 100, false, true, result.url, result.mediaId);\n } catch (error) {\n if (this.uploadsDismissed || isUploadAborted(error, abortController.signal)) {\n return;\n }\n console.error('Failed to upload file:', error);\n this.updateFileProgress(\n index,\n 0,\n false,\n false,\n undefined,\n undefined,\n this.translation.translateSync('@acorex:chat.errors.upload-failed'),\n );\n }\n }\n\n removeFile(index: number): void {\n const item = this.files()[index];\n if (item) {\n this.revokePreview(item);\n cleanupPickerUploads(this.uploader, [item]);\n }\n this.files.update((files) => files.filter((_, i) => i !== index));\n }\n\n async renameFile(index: number): Promise<void> {\n const item = this.files()[index];\n if (!item) {\n return;\n }\n\n const { AXConversationPickerRenameFileDialogComponent } = await import(\n '../shared/picker-rename-file-dialog.component'\n );\n const result = await this.popupService.open(AXConversationPickerRenameFileDialogComponent, {\n title: this.translation.translateSync('@acorex:chat.pickers.files.rename-title'),\n size: 'sm',\n closeButton: true,\n header: true,\n inputs: {\n initialName: item.file.name,\n },\n });\n\n const nextName = result?.data as string | undefined;\n if (!nextName || nextName === item.file.name) {\n return;\n }\n\n this.files.update((files) => {\n const next = [...files];\n if (!next[index]) {\n return next;\n }\n next[index] = {\n ...next[index],\n file: renamePickerFileObject(next[index].file, nextName),\n };\n return next;\n });\n }\n\n async replaceAttachment(index: number): Promise<void> {\n const current = this.files()[index];\n if (!current) {\n return;\n }\n\n const { accepted, rejected } = await this.uploader.chooseFiles({\n fileType: this.catalogFileType,\n multiple: false,\n });\n notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n const replacement = accepted[0];\n if (!replacement) {\n return;\n }\n\n if (current.abortController) {\n current.abortController.abort();\n }\n cleanupPickerUploads(this.uploader, [current]);\n this.revokePreview(current);\n\n try {\n const entry = await this.buildAttachedFileEntry(replacement);\n this.files.update((files) => {\n const next = [...files];\n next[index] = {\n id: createPickerUploadItemId(),\n ...entry,\n uploadProgress: 0,\n uploading: true,\n };\n return next;\n });\n void this.uploadFile(index, replacement);\n } catch (error) {\n console.error('Failed to replace attachment:', error);\n this.removeFile(index);\n }\n }\n\n async sendFiles(): Promise<void> {\n const fileList = this.files();\n if (fileList.length === 0) return;\n\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 const caption = this.caption.trim() || undefined;\n const sendSingle = !this.groupItems && fileList.length > 1;\n\n this.retainUploadedOnDismiss = true;\n const popup = this.__popup__();\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, popup, this.__actionSheet__());\n\n if (sendSingle) {\n for (const file of fileList) {\n const result = pickerItemToUploadResult(file);\n if (!result) {\n continue;\n }\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'file',\n payload: {\n type: 'file',\n files: [fileItemFromUpload(file.file, result, { duration: file.duration })],\n },\n };\n await this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n return;\n }\n\n const files = fileList.flatMap((f) => {\n const result = pickerItemToUploadResult(f);\n return result ? [fileItemFromUpload(f.file, result, { duration: f.duration })] : [];\n });\n\n if (files.length === 0) {\n return;\n }\n\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'file',\n payload: {\n type: 'file',\n files,\n caption,\n },\n };\n\n void this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n\n private updateFileProgress(\n index: number,\n progress: number,\n uploading: boolean,\n uploaded = false,\n uploadedUrl?: string,\n mediaId?: string,\n error?: string,\n ): void {\n if (this.uploadsDismissed) {\n return;\n }\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 mediaId,\n error,\n };\n return updated;\n });\n }\n\n private async uploadFileWithProgress(\n file: File,\n onProgress: (progress: number) => void,\n signal?: AbortSignal,\n ): Promise<{ url: string; mediaId?: string; thumbnailUrl?: string; size: number; mimeType: string }> {\n return uploadPickerFile(this.uploader, this.conversation().id, file, onProgress, signal);\n }\n\n cancel(): void {\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n }\n\n ngOnDestroy(): void {\n this.dismissPicker();\n }\n\n private dismissPicker(): void {\n if (this.uploadsDismissed) {\n return;\n }\n this.uploadsDismissed = true;\n const snapshot = [...this.files()];\n for (const item of snapshot) {\n this.revokePreview(item);\n }\n cleanupPickerUploads(this.uploader, snapshot, {\n retainUploaded: this.retainUploadedOnDismiss,\n });\n this.retainUploadedOnDismiss = false;\n this.files.set([]);\n this.caption = '';\n }\n\n private revokePreview(item: Pick<AXConversationAttachedFile, 'preview'>): void {\n const preview = item.preview;\n if (preview?.startsWith('blob:')) {\n URL.revokeObjectURL(preview);\n }\n }\n\n getHeaderTitle(): string {\n const count = this.files().length;\n if (count === 0) {\n return this.translation.translateSync('@acorex:chat.pickers.files.title');\n }\n return this.translation.translateSync('@acorex:chat.pickers.files.selected-count', {\n params: { count },\n });\n }\n\n truncateFileName(fileName: string): string {\n return truncatePickerFileName(fileName);\n }\n\n onAddMoreFiles(): void {\n void this.pickerShell()?.browse();\n }\n\n getCancelUploadLabel(): string {\n return getPickerCancelUploadLabel(this.translation);\n }\n\n formatFileSize(bytes: number): string {\n const fileType = this.catalogFileTypeDef;\n const result = fileType\n ? runFileTypeUtility(fileType, this.createUtilityContext(), undefined, 'formatSize', bytes)\n : undefined;\n return typeof result === 'string' ? result : `${bytes} B`;\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 this.translation.translateSync('@acorex:chat.pickers.files.uploading-count', {\n params: { count: uploadingCount },\n });\n }\n\n if (uploadedCount === fileList.length) {\n return this.translation.translateSync('@acorex:chat.pickers.files.send-count', {\n params: { count: fileList.length },\n });\n }\n\n return this.translation.translateSync('@acorex:chat.pickers.files.ready-count', {\n params: { ready: uploadedCount, total: fileList.length },\n });\n }\n\n getEmptyTitle(): string {\n return this.isDragging()\n ? this.translation.translateSync('@acorex:chat.pickers.files.drop-here')\n : this.translation.translateSync('@acorex:chat.pickers.files.select');\n }\n\n getEmptySubtitle(): string {\n return this.isDragging()\n ? this.translation.translateSync('@acorex:chat.pickers.common.release-to-upload')\n : this.translation.translateSync('@acorex:chat.pickers.common.click-to-browse');\n }\n\n getSelectedCountText(): string {\n return this.translation.translateSync('@acorex:chat.pickers.files.selected-count', {\n params: { count: this.files().length },\n });\n }\n\n getUploadingLabel(progress: number): string {\n return this.translation.translateSync('@acorex:chat.pickers.files.uploading-progress', {\n params: { progress },\n });\n }\n}\n","<ax-conversation-picker-shell\n #pickerShell\n [fileType]=\"catalogFileType\"\n [multiple]=\"allowMultiple()\"\n (filesSelected)=\"handleFiles($event)\"\n (dragEnter)=\"isDragging.set(true)\"\n (dragLeave)=\"isDragging.set(false)\"\n>\n <ax-conversation-picker-header\n [title]=\"getHeaderTitle()\"\n [showMenu]=\"files().length > 0\"\n [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n (onAddMore)=\"onAddMoreFiles()\"\n />\n\n <div class=\"ax-conversation-picker__scroll\">\n @if (files().length === 0) {\n <ax-conversation-picker-empty\n [title]=\"getEmptyTitle()\"\n [hint]=\"getEmptySubtitle()\"\n [iconClass]=\"emptyIconClass()\"\n [dragOver]=\"isDragging()\"\n />\n } @else {\n <div class=\"ax-conversation-picker__body\">\n <div class=\"ax-conversation-picker__panel\">\n <div class=\"ax-conversation-picker__list\">\n @for (file of files(); track file.id) {\n <div class=\"ax-conversation-picker__row ax-conversation-picker__row--file\">\n @switch (file.type) {\n @case ('image') {\n <span\n class=\"ax-conversation-picker__thumb ax-conversation-picker__thumb--square\"\n aria-hidden=\"true\"\n >\n @if (file.preview) {\n <img [src]=\"file.preview\" alt=\"\" />\n } @else {\n <i class=\"fa-light fa-image\"></i>\n }\n </span>\n }\n @case ('video') {\n <span\n class=\"ax-conversation-picker__thumb ax-conversation-picker__thumb--square\"\n aria-hidden=\"true\"\n >\n @if (file.preview) {\n <video [src]=\"file.preview\" muted playsinline preload=\"metadata\"></video>\n } @else {\n <i class=\"fa-light fa-video\"></i>\n }\n </span>\n }\n @case ('audio') {\n <span\n class=\"ax-conversation-picker__thumb ax-conversation-picker__thumb--circle\"\n aria-hidden=\"true\"\n >\n @if (file.preview) {\n <img [src]=\"file.preview\" alt=\"\" />\n } @else {\n <i class=\"fa-light fa-music\"></i>\n }\n <!-- <span class=\"ax-conversation-picker__thumb-play\">\n <i class=\"fa-solid fa-play\"></i>\n </span> -->\n </span>\n }\n @default {\n <span class=\"ax-conversation-file__badge\" aria-hidden=\"true\">\n <span class=\"ax-conversation-file__badge-doc\">\n <i class=\"fa-solid fa-file-lines\"></i>\n </span>\n </span>\n }\n }\n\n <div class=\"ax-conversation-picker__details\">\n <div class=\"ax-conversation-picker__name\" [title]=\"file.file.name\">\n {{ truncateFileName(file.file.name) }}\n </div>\n <div class=\"ax-conversation-picker__status\">\n @if (file.uploading) {\n <span>{{ getUploadingLabel(file.uploadProgress ?? 0) }}</span>\n } @else if (file.error) {\n <span class=\"ax-conversation-picker__status--err\"\n ><i class=\"fa-light fa-xmark\"></i> {{ file.error }}</span\n >\n } @else {\n <span>{{ formatFileSize(file.file.size) }}</span>\n }\n </div>\n @if (file.uploading) {\n <div class=\"ax-conversation-picker__progress\">\n <ax-progress-bar [progress]=\"file.uploadProgress || 0\" [mode]=\"'determinate'\" [height]=\"3\" />\n </div>\n }\n </div>\n\n <div class=\"ax-conversation-picker__row-actions\">\n <ax-button class=\"ax-sm rounded-full\" look=\"blank\" [iconOnly]=\"true\">\n <ax-icon><i class=\"fa-light fa-ellipsis-vertical\"></i></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"translation.translateSync('@acorex:chat.pickers.files.rename-file')\"\n (onClick)=\"renameFile($index)\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-i-cursor\"></i></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n [text]=\"translation.translateSync('@acorex:chat.pickers.files.replace-attachment')\"\n (onClick)=\"replaceAttachment($index)\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-arrows-rotate\"></i></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n\n <ax-button\n class=\"ax-conversation-picker__row-remove rounded-full\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"translation.translateSync('@acorex:chat.pickers.common.remove')\"\n (onClick)=\"removeFile($index)\"\n >\n <ax-icon><i class=\"fa-solid fa-xmark\"></i></ax-icon>\n </ax-button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (files().length > 0) {\n <ax-conversation-picker-options\n [(groupItems)]=\"groupItems\"\n [showGroupItems]=\"allowMultiple() && files().length > 1\"\n />\n <ax-conversation-picker-caption [(caption)]=\"caption\" [sendDisabled]=\"!canSend()\" (onSend)=\"sendFiles()\" />\n <ax-conversation-picker-footer\n [addLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add')\"\n [cancelLabel]=\"translation.translateSync('@acorex:chat.actions.cancel')\"\n [sendLabel]=\"translation.translateSync('@acorex:chat.actions.send')\"\n [sendDisabled]=\"!canSend()\"\n (onAdd)=\"onAddMoreFiles()\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendFiles()\"\n />\n }\n</ax-conversation-picker-shell>\n","import type { AXFileCopyData, AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, createFileTypeMetadata } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport type { AXConversationImagePayload } from '../../../../models';\nimport { AX_CONVERSATION_IMAGE_CATALOG } from '../../../../models/message-file-type-catalog';\nimport { normalizeImagePayload } from '../../../message-list/components/image-renderer/image.payload';\nimport { formatFileSize } from '../shared/media-formatters';\n\nexport { AX_CONVERSATION_IMAGE_CATALOG };\n\nconst MB = 1024 * 1024;\n\nexport const AX_CONVERSATION_IMAGE_PRESENTATION = {\n icon: 'fa-light fa-image text-purple-500',\n title: 'Image',\n} as const;\n\ntype AXConversationFileTypeUtilityContext = {\n readAsDataUrl: (file: File | Blob) => Promise<string>;\n platformId: object;\n};\n\nconst AX_CONVERSATION_IMAGE_UTILITY = {\n preview: 'preview',\n formatSize: 'formatSize',\n createLocalPreviewUrl: 'createLocalPreviewUrl',\n} as const;\n\nfunction blobUrl(ctx: AXConversationFileTypeUtilityContext, blob: Blob): string {\n if (!isPlatformBrowser(ctx.platformId)) {\n return '';\n }\n return URL.createObjectURL(blob);\n}\n\nexport function conversationImageUtilities(): NonNullable<AXFileType['utilities']> {\n return {\n [AX_CONVERSATION_IMAGE_UTILITY.preview]: (ctx, file) =>\n (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(file as File),\n [AX_CONVERSATION_IMAGE_UTILITY.formatSize]: (_ctx, bytes) => formatFileSize(bytes as number),\n [AX_CONVERSATION_IMAGE_UTILITY.createLocalPreviewUrl]: (ctx, source) => {\n const blob = source as File | Blob;\n if (blob.type.startsWith('image/')) {\n return (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(blob);\n }\n return blobUrl(ctx as AXConversationFileTypeUtilityContext, blob);\n },\n };\n}\n\nexport function createConversationImageFileType(): AXFileType {\n const presentation = AX_CONVERSATION_IMAGE_PRESENTATION;\n return {\n name: AX_CONVERSATION_IMAGE_CATALOG,\n metadata: createFileTypeMetadata('conversation'),\n title: presentation.title,\n icon: presentation.icon,\n validations: {\n mimeTypes: ['image/*'],\n minSize: 1,\n maxSize: 100 * MB,\n },\n extensions: [\n { name: 'jpg', title: 'JPEG' },\n { name: 'jpeg', title: 'JPEG', validations: { maxSize: 5 * MB } },\n { name: 'png', title: 'PNG' },\n { name: 'gif', title: 'GIF' },\n { name: 'webp', title: 'WebP' },\n { name: 'svg', title: 'SVG', validations: { maxSize: 2 * MB } },\n ],\n utilities: conversationImageUtilities(),\n copy: (payload): AXFileCopyData => {\n const image = normalizeImagePayload(payload as AXConversationImagePayload);\n const caption = image.caption?.trim();\n const urls = image.images\n .map((item) => item.url?.trim() || item.thumbnailUrl?.trim())\n .filter((url): url is string => !!url);\n return {\n text: caption ?? '',\n meta: { kind: 'image', caption, urls, count: image.images.length },\n };\n },\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationImageFileTypeProvider extends AXFileTypeInfoProvider {\n items() {\n return Promise.resolve([createConversationImageFileType()]);\n }\n}\n","export interface AXConversationMediaDimensions {\n width: number;\n height: number;\n duration: number;\n}\n\nconst EMPTY: AXConversationMediaDimensions = { width: 0, height: 0, duration: 0 };\n\nexport async function probeImageDimensions(source: Blob | string): Promise<Pick<AXConversationMediaDimensions, 'width' | 'height'>> {\n if (typeof createImageBitmap === 'function' && typeof source !== 'string') {\n try {\n const bitmap = await createImageBitmap(source);\n const size = { width: bitmap.width, height: bitmap.height };\n bitmap.close();\n if (size.width > 0 && size.height > 0) {\n return size;\n }\n } catch {\n // Fall through to HTMLImageElement.\n }\n }\n\n return new Promise((resolve) => {\n const img = new Image();\n let objectUrl = '';\n const finish = (width: number, height: number) => {\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n resolve({ width, height });\n };\n img.onload = () => finish(img.naturalWidth, img.naturalHeight);\n img.onerror = () => finish(0, 0);\n if (typeof source === 'string') {\n img.src = source;\n return;\n }\n objectUrl = URL.createObjectURL(source);\n img.src = objectUrl;\n });\n}\n\nexport async function probeVideoMedia(source: Blob): Promise<AXConversationMediaDimensions> {\n if (typeof document === 'undefined') {\n return EMPTY;\n }\n return new Promise((resolve) => {\n const el = document.createElement('video');\n el.preload = 'metadata';\n const objectUrl = URL.createObjectURL(source);\n const finish = (dims: AXConversationMediaDimensions) => {\n URL.revokeObjectURL(objectUrl);\n el.src = '';\n resolve(dims);\n };\n el.onloadedmetadata = () => {\n finish({\n width: el.videoWidth || 0,\n height: el.videoHeight || 0,\n duration: Number.isFinite(el.duration) ? el.duration : 0,\n });\n };\n el.onerror = () => finish(EMPTY);\n el.src = objectUrl;\n });\n}\n","/**\n * Image Picker Component\n * Full-width image selection and preview interface for the composer\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownPanelComponent } from '@acorex/components/dropdown';\nimport { AXPopupService, type AXPopupRef } from '@acorex/components/popup';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport {\n AXFileService,\n AXFileTypeRegistryService,\n runFileTypeUtilityForFile,\n type AXFileType,\n} from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, ViewEncapsulation, computed, inject, input, signal, viewChild } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationImageMediaItem, AXConversationSendMessageCommand } from '../../../../models';\nimport type { AXConversationUploaderResult } from '../../../../models/conversation-upload.types';\nimport type { AXConversationComposerActionComponent } from '../../../../registries/composer-action.registry';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { AXConversationPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { resolvePersistableMediaUrl, resolvePersistedThumbnailUrl } from '../shared/persisted-media-url';\nimport { probeImageDimensions } from '../shared/media-dimensions';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerOptionsComponent } from '../shared/picker-options.component';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport {\n cleanupPickerUploads,\n createPickerUploadItemId,\n dismissComposerPickerHost,\n getPickerCancelUploadLabel,\n isUploadAborted,\n limitFilesToCapacity,\n notifyMaxFilesCapacityExceeded,\n notifyPickerValidationErrors,\n pickerItemToUploadResult,\n uploadPickerFile,\n type AXConversationComposerPickerUploadItem,\n} from '../shared/picker-upload';\nimport { installComposerPickerAutoRun, runComposerPickerAutoRunBrowse } from '../shared/picker-auto-run';\nimport {\n AX_CONVERSATION_IMAGE_CATALOG,\n AX_CONVERSATION_IMAGE_PRESENTATION,\n createConversationImageFileType,\n} from './conversation-image.file-type';\nimport { fileItemFromUpload } from '../file-picker/file-composer.payload';\nimport {\n getMediaGalleryLayoutMode,\n partitionMediaIntoGalleryRows,\n} from '../../../message-list/components/shared/media-gallery-layout';\n\ninterface AXConversationImageFile extends AXConversationComposerPickerUploadItem {\n preview: string;\n}\n\nasync function imageItemFromUpload(file: File, result: AXConversationUploaderResult): Promise<AXConversationImageMediaItem> {\n const url = resolvePersistableMediaUrl(result.url);\n const size = await probeImageDimensions(file);\n const item: AXConversationImageMediaItem = {\n mediaId: result.mediaId,\n mimeType: result.mimeType,\n size: result.size,\n thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl, url),\n width: size.width,\n height: size.height,\n metadata: result.metadata,\n };\n if (url) {\n item.url = url;\n }\n return item;\n}\n\n@Component({\n selector: 'ax-conversation-image-picker',\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n AXProgressBarModule,\n AXTranslationModule,\n AXButtonComponent,\n AXButtonItemComponent,\n AXButtonItemListComponent,\n AXDecoratorModule,\n AXDropdownPanelComponent,\n AXConversationPickerHeaderComponent,\n AXConversationPickerFooterComponent,\n AXConversationPickerEmptyComponent,\n AXConversationPickerCaptionComponent,\n AXConversationPickerOptionsComponent,\n AXConversationPickerShellComponent,\n ],\n templateUrl: './image-picker.component.html',\n styleUrls: ['../shared/picker-shared.css'],\n})\nexport class AXConversationImagePickerComponent implements OnDestroy, AXConversationComposerActionComponent {\n private uploadsDismissed = false;\n /** Uploaded blobs are referenced by the sent message — do not delete on dismiss. */\n private retainUploadedOnDismiss = false;\n readonly service = input<AXConversationComposerService | undefined>();\n private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n private get composerService(): AXConversationComposerService {\n const svc = this.service() ?? this.composerServiceFromInjector;\n if (!svc) {\n throw new Error('AXConversationComposerService is required for the image picker');\n }\n return svc;\n }\n private readonly uploader = inject(AXUploaderService);\n private readonly popupService = inject(AXPopupService);\n private readonly fileService = inject(AXFileService);\n private readonly fileTypeRegistry = inject(AXFileTypeRegistryService);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly toast = inject(AXToastService);\n readonly translation = inject(AXTranslationService);\n\n readonly catalogFileType = AX_CONVERSATION_IMAGE_CATALOG;\n\n readonly conversation = input.required<AXConversation>();\n readonly maxFiles = input<number>(10);\n readonly initialFiles = input<File[]>([]);\n readonly autoRun = input(false);\n readonly __popup__ = input<AXPopupRef | undefined>();\n readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n\n readonly images = signal<AXConversationImageFile[]>([]);\n private readonly pickerShell = viewChild<AXConversationPickerShellComponent>('pickerShell');\n readonly isDragging = signal(false);\n readonly emptyIconClass = computed(() =>\n this.isDragging() ? 'fa-light fa-cloud-arrow-up' : AX_CONVERSATION_IMAGE_PRESENTATION.icon,\n );\n caption = '';\n groupItems = true;\n sendAsDocuments = false;\n\n readonly allowMultiple = computed(() => this.maxFiles() > 1);\n readonly layoutMode = computed(() => getMediaGalleryLayoutMode(this.images().length));\n readonly mediaRows = computed(() => partitionMediaIntoGalleryRows(this.images()));\n private imageFileType?: AXFileType;\n\n constructor() {\n this.fileTypeRegistry.registerTypes([createConversationImageFileType()]);\n installComposerPickerAutoRun({\n autoRun: this.autoRun,\n initialFiles: this.initialFiles,\n activate: () => this.activate(),\n seedFiles: (files) => this.handleFiles(files),\n });\n }\n\n activate(): Promise<void> {\n return runComposerPickerAutoRunBrowse({\n fileTypeRegistry: this.fileTypeRegistry,\n uploader: this.uploader,\n toast: this.toast,\n translation: this.translation,\n catalogFileType: this.catalogFileType,\n maxFiles: this.maxFiles(),\n hasExistingFiles: () => this.images().length > 0,\n handleFiles: (files) => this.handleFiles(files),\n onCancelled: () => this.cancel(),\n });\n }\n\n private createUtilityContext() {\n return {\n readAsDataUrl: (file: File | Blob) => this.fileService.blobToBase64(file),\n platformId: this.platformId,\n };\n }\n\n private async loadImageFileType(): Promise<AXFileType | undefined> {\n this.imageFileType ??= await this.fileService.getFileType(this.catalogFileType);\n return this.imageFileType;\n }\n\n async handleFiles(files: File[]): Promise<void> {\n const max = this.maxFiles();\n const capacity = limitFilesToCapacity(files, this.images().length, max);\n if (capacity.length < files.length) {\n notifyMaxFilesCapacityExceeded(this.toast, this.translation, max);\n }\n if (capacity.length === 0) {\n return;\n }\n\n const { accepted, rejected } = await this.uploader.validateFiles(capacity, this.catalogFileType);\n notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n const fileType = await this.loadImageFileType();\n const ctx = this.createUtilityContext();\n\n for (const file of accepted) {\n try {\n const previewValue = fileType ? await runFileTypeUtilityForFile(fileType, ctx, file, 'preview') : undefined;\n const preview = typeof previewValue === 'string' ? previewValue : '';\n let index = -1;\n this.images.update((images) => {\n index = images.length;\n return [...images, { id: createPickerUploadItemId(), file, preview, uploadProgress: 0, uploading: true }];\n });\n if (index >= 0) {\n void this.uploadImageAt(index, file);\n }\n } catch (error) {\n console.error('Failed to process image:', error);\n }\n }\n }\n\n private async uploadImageAt(index: number, file: File): Promise<void> {\n const abortController = new AbortController();\n this.patchImage(index, { abortController });\n\n try {\n const result = await uploadPickerFile(\n this.uploader,\n this.conversation().id,\n file,\n (progress) => this.patchImage(index, { uploadProgress: progress, uploading: true }),\n abortController.signal,\n );\n this.patchImage(index, {\n uploadProgress: 100,\n uploading: false,\n uploaded: true,\n uploadedUrl: result.url,\n mediaId: result.mediaId,\n });\n } catch (err) {\n if (this.uploadsDismissed || isUploadAborted(err, abortController.signal)) {\n return;\n }\n this.patchImage(index, {\n uploadProgress: 0,\n uploading: false,\n uploaded: false,\n error: this.translation.translateSync('@acorex:chat.errors.upload-failed'),\n });\n }\n }\n\n private patchImage(index: number, patch: Partial<AXConversationImageFile>): void {\n if (this.uploadsDismissed) {\n return;\n }\n this.images.update((items) => {\n const next = [...items];\n if (next[index]) {\n next[index] = { ...next[index], ...patch };\n }\n return next;\n });\n }\n\n removeImage(index: number): void {\n const item = this.images()[index];\n if (item) {\n cleanupPickerUploads(this.uploader, [item]);\n }\n this.images.update((images) => images.filter((_, i) => i !== index));\n }\n\n async replaceAttachment(index: number): Promise<void> {\n const current = this.images()[index];\n if (!current) {\n return;\n }\n\n const { accepted, rejected } = await this.uploader.chooseFiles({\n fileType: this.catalogFileType,\n multiple: false,\n });\n notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n const replacement = accepted[0];\n if (!replacement) {\n return;\n }\n\n await this.applyReplacementFile(index, replacement);\n }\n\n async editImage(index: number): Promise<void> {\n const current = this.images()[index];\n if (!current || current.uploading) {\n return;\n }\n\n const previewUrl = current.preview;\n const objectUrl = previewUrl ? '' : URL.createObjectURL(current.file);\n const src = previewUrl || objectUrl;\n\n try {\n const { AXConversationImagePickerEditorDialogComponent } = await import(\n './image-picker-editor-dialog.component'\n );\n const result = await this.popupService.open(AXConversationImagePickerEditorDialogComponent, {\n title: this.translation.translateSync('@acorex:chat.pickers.images.edit-title'),\n size: 'xl',\n closeButton: true,\n header: true,\n footer: true,\n maximizable: true,\n panelClass: ['ax-conversation-image-editor-popup'],\n inputs: {\n src,\n fileName: current.file.name,\n },\n });\n\n const file = result?.data as File | undefined;\n if (!file) {\n return;\n }\n\n await this.applyReplacementFile(index, file);\n } finally {\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n }\n }\n\n private async applyReplacementFile(index: number, replacement: File): Promise<void> {\n const current = this.images()[index];\n if (!current) {\n return;\n }\n\n if (current.abortController) {\n current.abortController.abort();\n }\n cleanupPickerUploads(this.uploader, [current]);\n\n try {\n const fileType = await this.loadImageFileType();\n const ctx = this.createUtilityContext();\n const previewValue = fileType ? await runFileTypeUtilityForFile(fileType, ctx, replacement, 'preview') : undefined;\n const preview = typeof previewValue === 'string' ? previewValue : '';\n\n this.images.update((images) => {\n const next = [...images];\n next[index] = {\n id: createPickerUploadItemId(),\n file: replacement,\n preview,\n uploadProgress: 0,\n uploading: true,\n };\n return next;\n });\n void this.uploadImageAt(index, replacement);\n } catch (error) {\n console.error('Failed to replace attachment:', error);\n this.removeImage(index);\n }\n }\n\n async sendImages(): Promise<void> {\n const imageList = this.images();\n if (!this.canSend()) return;\n\n const caption = this.caption.trim() || undefined;\n const sendSingle = !this.groupItems && imageList.length > 1;\n\n this.retainUploadedOnDismiss = true;\n const popup = this.__popup__();\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, popup, this.__actionSheet__());\n\n if (this.sendAsDocuments) {\n await this.sendImagesAsDocuments(imageList, caption, sendSingle);\n return;\n }\n\n if (sendSingle) {\n for (const image of imageList) {\n const result = pickerItemToUploadResult(image);\n if (!result) {\n continue;\n }\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'image',\n payload: {\n type: 'image',\n images: [await imageItemFromUpload(image.file, result)],\n },\n };\n await this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n return;\n }\n\n const images = (\n await Promise.all(\n imageList.map(async (image) => {\n const result = pickerItemToUploadResult(image);\n return result ? imageItemFromUpload(image.file, result) : null;\n }),\n )\n ).filter((item): item is AXConversationImageMediaItem => item !== null);\n\n if (images.length === 0) {\n return;\n }\n\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'image',\n payload: {\n type: 'image',\n images,\n caption,\n },\n };\n\n void this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n\n private async sendImagesAsDocuments(\n imageList: AXConversationImageFile[],\n caption: string | undefined,\n sendSingle: boolean,\n ): Promise<void> {\n if (sendSingle) {\n for (const image of imageList) {\n const result = pickerItemToUploadResult(image);\n if (!result) {\n continue;\n }\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'file',\n payload: {\n type: 'file',\n files: [fileItemFromUpload(image.file, result)],\n },\n };\n await this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n return;\n }\n\n const files = imageList.flatMap((image) => {\n const result = pickerItemToUploadResult(image);\n return result ? [fileItemFromUpload(image.file, result)] : [];\n });\n\n if (files.length === 0) {\n return;\n }\n\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'file',\n payload: {\n type: 'file',\n files,\n caption,\n },\n };\n\n void this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n\n canSend(): boolean {\n const list = this.images();\n return list.length > 0 && list.every((i) => i.uploaded && !i.error && !i.uploading);\n }\n\n getUploadingLabel(progress: number): string {\n return this.translation.translateSync('@acorex:chat.pickers.files.uploading-progress', {\n params: { progress },\n });\n }\n\n getCancelUploadLabel(): string {\n return getPickerCancelUploadLabel(this.translation);\n }\n\n getHeaderTitle(): string {\n const count = this.images().length;\n if (count === 0) {\n return this.translation.translateSync('@acorex:chat.pickers.images.title');\n }\n return this.translation.translateSync('@acorex:chat.pickers.images.selected-count', {\n params: { count },\n });\n }\n\n onAddMoreFiles(): void {\n void this.pickerShell()?.browse();\n }\n\n cancel(): void {\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n }\n\n ngOnDestroy(): void {\n this.dismissPicker();\n }\n\n private dismissPicker(): void {\n if (this.uploadsDismissed) {\n return;\n }\n this.uploadsDismissed = true;\n const snapshot = [...this.images()];\n cleanupPickerUploads(this.uploader, snapshot, {\n retainUploaded: this.retainUploadedOnDismiss,\n });\n this.retainUploadedOnDismiss = false;\n this.images.set([]);\n this.caption = '';\n }\n\n getEmptyTitle(): string {\n return this.isDragging()\n ? this.translation.translateSync('@acorex:chat.pickers.images.drop-to-attach')\n : this.translation.translateSync('@acorex:chat.pickers.images.select');\n }\n\n getEmptySubtitle(): string {\n return this.isDragging()\n ? this.translation.translateSync('@acorex:chat.pickers.common.release-to-upload')\n : this.translation.translateSync('@acorex:chat.pickers.common.click-to-browse');\n }\n\n getSelectedCountText(): string {\n return this.translation.translateSync('@acorex:chat.pickers.images.selected-count', {\n params: { count: this.images().length },\n });\n }\n\n getSendText(): string {\n return this.translation.translateSync('@acorex:chat.pickers.images.send-count', {\n params: { count: this.images().length },\n });\n }\n}\n","<ax-conversation-picker-shell\n #pickerShell\n [fileType]=\"catalogFileType\"\n [multiple]=\"allowMultiple()\"\n (filesSelected)=\"handleFiles($event)\"\n (dragEnter)=\"isDragging.set(true)\"\n (dragLeave)=\"isDragging.set(false)\"\n>\n <ax-conversation-picker-header\n [title]=\"getHeaderTitle()\"\n [showMenu]=\"images().length > 0\"\n [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n (onAddMore)=\"onAddMoreFiles()\"\n />\n\n <div class=\"ax-conversation-picker__scroll\">\n @if (images().length === 0) {\n <ax-conversation-picker-empty\n [title]=\"getEmptyTitle()\"\n [hint]=\"getEmptySubtitle()\"\n [iconClass]=\"emptyIconClass()\"\n [dragOver]=\"isDragging()\"\n />\n } @else {\n <div class=\"ax-conversation-picker__body\">\n @switch (layoutMode()) {\n @case ('masonry') {\n <div class=\"ax-conversation-picker__media-grid ax-conversation-picker__media-grid--masonry\">\n @for (row of mediaRows(); track $index) {\n <div class=\"ax-conversation-picker__media-row\">\n @for (image of row.items; track image.id; let index = $index) {\n <div class=\"ax-conversation-picker__media-tile\">\n <ng-container\n *ngTemplateOutlet=\"mediaTile; context: { $implicit: image, index: row.startIndex + index }\"\n ></ng-container>\n </div>\n }\n </div>\n }\n </div>\n }\n @case ('triple') {\n <div class=\"ax-conversation-picker__media-grid ax-conversation-picker__media-grid--triple\">\n @for (image of images(); track image.id; let index = $index) {\n <div class=\"ax-conversation-picker__media-tile\">\n <ng-container *ngTemplateOutlet=\"mediaTile; context: { $implicit: image, index }\"></ng-container>\n </div>\n }\n </div>\n }\n @default {\n <div [class]=\"'ax-conversation-picker__media-grid ax-conversation-picker__media-grid--' + layoutMode()\">\n @for (image of images(); track image.id; let index = $index) {\n <div class=\"ax-conversation-picker__media-tile\">\n <ng-container *ngTemplateOutlet=\"mediaTile; context: { $implicit: image, index }\"></ng-container>\n </div>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n\n @if (images().length > 0) {\n <ax-conversation-picker-options\n [(groupItems)]=\"groupItems\"\n [(sendAsDocuments)]=\"sendAsDocuments\"\n [showGroupItems]=\"allowMultiple() && images().length > 1\"\n [showSendAsDocuments]=\"true\"\n />\n <ax-conversation-picker-caption [(caption)]=\"caption\" [sendDisabled]=\"!canSend()\" (onSend)=\"sendImages()\" />\n <ax-conversation-picker-footer\n [addLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add')\"\n [cancelLabel]=\"translation.translateSync('@acorex:chat.actions.cancel')\"\n [sendLabel]=\"translation.translateSync('@acorex:chat.actions.send')\"\n [sendDisabled]=\"!canSend()\"\n (onAdd)=\"onAddMoreFiles()\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendImages()\"\n />\n }\n</ax-conversation-picker-shell>\n\n<ng-template #mediaTile let-image let-index=\"index\">\n <img [src]=\"image.preview\" [alt]=\"image.file.name\" />\n\n <div class=\"ax-conversation-picker__media-tile-overlay\">\n <ax-button class=\"rounded-full ax-sm\" [iconOnly]=\"true\">\n <ax-icon><i class=\"fa-light fa-ellipsis-vertical\"></i></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"translation.translateSync('@acorex:chat.actions.edit')\"\n [disabled]=\"image.uploading\"\n (onClick)=\"editImage(index)\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-pen\"></i></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n [text]=\"translation.translateSync('@acorex:chat.pickers.files.replace-attachment')\"\n (onClick)=\"replaceAttachment(index)\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-arrows-rotate\"></i></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n\n <ax-button\n class=\"rounded-full ax-sm\"\n [iconOnly]=\"true\"\n [text]=\"translation.translateSync('@acorex:chat.pickers.common.remove')\"\n (onClick)=\"removeImage(index)\"\n >\n <ax-icon><i class=\"fa-solid fa-xmark\"></i></ax-icon>\n </ax-button>\n </div>\n\n @if (image.uploading || image.error) {\n <div class=\"ax-conversation-picker__media-status-layer\">\n @if (image.uploading) {\n <span class=\"ax-conversation-picker__media-status\">{{ getUploadingLabel(image.uploadProgress ?? 0) }}</span>\n <ax-progress-bar [progress]=\"image.uploadProgress || 0\" [mode]=\"'determinate'\" [height]=\"3\" />\n } @else if (image.error) {\n <span class=\"ax-conversation-picker__media-status\">{{ image.error }}</span>\n }\n </div>\n }\n</ng-template>\n","/**\n * Location Picker Component\n * Full-width location selection interface for the composer\n */\n\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXMapMarker, AXMapModule } from '@acorex/components/map';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, inject, input, signal } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationLocationPayload, AXConversationSendMessageCommand } from '../../../../models';\nimport { AXConversationPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { dismissComposerPickerHost } from '../shared/picker-upload';\n\n@Component({\n selector: 'ax-conversation-location-picker',\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n AXMapModule,\n AXTranslationModule,\n AXConversationPickerHeaderComponent,\n AXConversationPickerFooterComponent,\n ],\n templateUrl: './location-picker.component.html',\n styleUrls: ['../shared/picker-shared.css', './location-picker.component.css'],\n})\nexport class AXConversationLocationPickerComponent {\n readonly service = input<AXConversationComposerService | undefined>();\n private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n private get composerService(): AXConversationComposerService {\n const svc = this.service() ?? this.composerServiceFromInjector;\n if (!svc) {\n throw new Error('AXConversationComposerService is required for the location picker');\n }\n return svc;\n }\n\n readonly translation = inject(AXTranslationService);\n\n readonly conversation = input.required<AXConversation>();\n readonly __popup__ = input<AXPopupRef | undefined>();\n readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n // Default location\n readonly currentLocation = signal<AXConversationLocationPayload>({\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: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'location',\n payload: location,\n };\n\n this.cancel();\n\n void this.composerService.sendMessage(command).catch((error) => {\n console.error('Failed to send location:', error);\n });\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 dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n }\n}\n","<div class=\"ax-conversation-picker ax-conversation-picker--location\">\n <ax-conversation-picker-header\n [title]=\"translation.translateSync('@acorex:chat.pickers.location.title')\"\n (onClose)=\"cancel()\"\n />\n\n <div class=\"ax-conversation-picker__scroll\">\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\">{{ '@acorex:chat.pickers.location.coordinates' | translate | async }}</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-conversation-picker-footer\n [showAdd]=\"false\"\n [cancelLabel]=\"translation.translateSync('@acorex:chat.actions.cancel')\"\n [sendLabel]=\"translation.translateSync('@acorex:chat.pickers.location.send')\"\n [sendDisabled]=\"false\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendLocation()\"\n />\n</div>\n","import type { WritableSignal } from '@angular/core';\n\n/** Shared drag-and-drop handlers for composer pickers. */\nexport function createPickerDragHandlers(isDragging: WritableSignal<boolean>) {\n return {\n onDragEnter(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n isDragging.set(true);\n },\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n },\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n isDragging.set(false);\n },\n onDrop(event: DragEvent, onFiles: (files: File[]) => void): void {\n event.preventDefault();\n event.stopPropagation();\n isDragging.set(false);\n const files = Array.from(event.dataTransfer?.files ?? []);\n if (files.length > 0) {\n onFiles(files);\n }\n },\n };\n}\n","import { AXUploaderBrowseDirective } from '@acorex/cdk/uploader';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { Component, ViewEncapsulation, input } from '@angular/core';\n\n@Component({\n selector: 'ax-conversation-picker-toolbar',\n encapsulation: ViewEncapsulation.None,\n imports: [AXButtonComponent, AXDecoratorModule, AXUploaderBrowseDirective],\n templateUrl: './picker-toolbar.component.html',\n styleUrl: './picker-toolbar.component.css',\n})\nexport class AXConversationPickerToolbarComponent {\n readonly countLabel = input.required<string>();\n readonly addMoreLabel = input.required<string>();\n}\n","<span class=\"ax-conversation-picker__count\">{{ countLabel() }}</span>\n<ax-button [text]=\"addMoreLabel()\" [look]=\"'ghost'\" axUploaderBrowseHandle>\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-plus\"></i></ax-icon>\n </ax-prefix>\n</ax-button>\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 { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport { Component, DestroyRef, InjectionToken, ViewEncapsulation, effect, inject, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { firstValueFrom } from 'rxjs';\nimport { AXConversationStickerPayload } from '../../../../models';\n\ninterface AXConversationGiphyImage {\n url: string;\n width: string;\n height: string;\n}\n\ninterface AXConversationGiphySticker {\n id: string;\n title: string;\n images: {\n fixed_height: AXConversationGiphyImage;\n };\n}\n\ninterface AXConversationGiphyResponse {\n data: AXConversationGiphySticker[];\n}\n\nexport const AX_CONVERSATION_STICKER_API_KEY = new InjectionToken<string>('AX_CONVERSATION_STICKER_API_KEY', {\n providedIn: 'root',\n factory: () => 'sXpGFDGZs0Dv1mmNFvYaGUvYwKX0PWIh',\n});\n\ninterface AXConversationStickerCategory {\n id: string;\n name: string;\n icon: string;\n searchTerm: string;\n}\n\n// Sticker categories using Giphy API\nconst AX_CONVERSATION_STICKER_CATEGORIES: AXConversationStickerCategory[] = [\n { id: 'trending', name: '@acorex:chat.stickers.trending', icon: '🔥', searchTerm: 'trending' },\n { id: 'happy', name: '@acorex:chat.stickers.happy', icon: '😊', searchTerm: 'happy' },\n { id: 'love', name: '@acorex:chat.stickers.love', icon: '❤️', searchTerm: 'love' },\n { id: 'funny', name: '@acorex:chat.stickers.funny', icon: '😂', searchTerm: 'funny' },\n { id: 'cool', name: '@acorex:chat.stickers.cool', icon: '😎', searchTerm: 'cool' },\n { id: 'party', name: '@acorex:chat.stickers.party', icon: '🎉', searchTerm: 'party' },\n];\n\n@Component({\n selector: 'ax-conversation-sticker-tab',\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, FormsModule, AXSkeletonModule, AXSearchBoxModule, AXTranslationModule],\n templateUrl: './sticker-tab.component.html',\n styleUrl: './sticker-tab.component.css',\n})\nexport class AXConversationStickerTabComponent {\n private readonly http = inject(HttpClient);\n private readonly destroyRef = inject(DestroyRef);\n private readonly apiKey = inject(AX_CONVERSATION_STICKER_API_KEY);\n protected readonly translation = inject(AXTranslationService);\n\n readonly itemSelected = output<AXConversationStickerPayload>();\n readonly searchQuery = signal('');\n readonly activeStickers = signal<AXConversationStickerPayload[]>([]);\n readonly loading = signal(false);\n readonly stickerCategories = AX_CONVERSATION_STICKER_CATEGORIES;\n readonly skeletonItems = Array.from({ length: 20 }, (_, i) => i);\n\n private readonly activeCategoryId = signal<string>('trending');\n private searchTimeout?: ReturnType<typeof setTimeout>;\n\n constructor() {\n effect(() => {\n const categoryId = this.activeCategoryId();\n const query = this.searchQuery();\n\n if (query.trim()) {\n this.searchStickers(query);\n } else {\n this.loadStickers(categoryId);\n }\n });\n\n this.destroyRef.onDestroy(() => {\n if (this.searchTimeout) clearTimeout(this.searchTimeout);\n });\n }\n\n private async loadStickers(categoryId: string): Promise<void> {\n this.loading.set(true);\n try {\n const category = AX_CONVERSATION_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.apiKey}&limit=20`\n : `https://api.giphy.com/v1/stickers/search?api_key=${this.apiKey}&q=${category.searchTerm}&limit=20`;\n\n const response = await firstValueFrom(this.http.get<AXConversationGiphyResponse>(endpoint));\n this.activeStickers.set(this.mapGiphyStickers(response, categoryId));\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 private async searchStickers(query: string): Promise<void> {\n if (!query.trim()) {\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.apiKey}&q=${encodeURIComponent(query)}&limit=20`;\n const response = await firstValueFrom(this.http.get<AXConversationGiphyResponse>(endpoint));\n this.activeStickers.set(this.mapGiphyStickers(response, 'search'));\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 onSearchChange(event: { value?: string }): void {\n const query = event?.value || '';\n\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.searchTimeout = 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 private mapGiphyStickers(response: AXConversationGiphyResponse, packId: string): AXConversationStickerPayload[] {\n if (!response?.data) return [];\n return response.data.map((item) => ({\n type: 'sticker' as const,\n id: item.id,\n packId,\n url: item.images.fixed_height.url,\n animated: item.images.fixed_height.url.endsWith('.gif'),\n width: Number(item.images.fixed_height.width),\n height: Number(item.images.fixed_height.height),\n emoji: item.title || 'Sticker',\n }));\n }\n\n selectSticker(sticker: AXConversationStickerPayload): void {\n this.itemSelected.emit(sticker);\n }\n}\n","<div class=\"sticker-tab\">\n <!-- Search -->\n <div class=\"sticker-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'@acorex:chat.placeholders.search-stickers' | translate | async\"\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]=\"translation.translateSync(category.name)\"\n [title]=\"translation.translateSync(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 || ('@acorex:chat.sticker' | translate | async)\" 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>{{ '@acorex:chat.empty.no-stickers-available' | translate | async }}</p>\n </div>\n }\n</div>\n","import type { AXFileCopyData, AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, createFileTypeMetadata } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport type { AXConversationVideoPayload } from '../../../../models';\nimport { AX_CONVERSATION_VIDEO_CATALOG } from '../../../../models/message-file-type-catalog';\nimport { normalizeVideoPayload } from '../../../message-list/components/video-renderer/video.payload';\nimport { formatDuration, formatFileSize } from '../shared/media-formatters';\n\nexport { AX_CONVERSATION_VIDEO_CATALOG };\n\nconst MB = 1024 * 1024;\n\nexport const AX_CONVERSATION_VIDEO_PRESENTATION = {\n icon: 'fa-light fa-video ax-text-blue-500',\n title: 'Video',\n} as const;\n\ntype AXConversationFileTypeUtilityContext = {\n readAsDataUrl: (file: File | Blob) => Promise<string>;\n platformId: object;\n};\n\nconst AX_CONVERSATION_VIDEO_UTILITY = {\n preview: 'preview',\n duration: 'duration',\n formatSize: 'formatSize',\n formatDuration: 'formatDuration',\n createLocalPreviewUrl: 'createLocalPreviewUrl',\n} as const;\n\nfunction blobUrl(ctx: AXConversationFileTypeUtilityContext, blob: Blob): string {\n if (!isPlatformBrowser(ctx.platformId)) {\n return '';\n }\n return URL.createObjectURL(blob);\n}\n\nfunction mediaDuration(ctx: AXConversationFileTypeUtilityContext, file: File | Blob, tag: 'video' | 'audio'): Promise<number> {\n if (!isPlatformBrowser(ctx.platformId)) {\n return Promise.resolve(0);\n }\n return new Promise((resolve, reject) => {\n const el = document.createElement(tag);\n el.preload = 'metadata';\n el.onloadedmetadata = () => {\n URL.revokeObjectURL(el.src);\n resolve(el.duration);\n };\n el.onerror = () => {\n URL.revokeObjectURL(el.src);\n reject(new Error(`Failed to load ${tag} metadata`));\n };\n el.src = URL.createObjectURL(file);\n });\n}\n\nexport function conversationVideoUtilities(): NonNullable<AXFileType['utilities']> {\n return {\n [AX_CONVERSATION_VIDEO_UTILITY.preview]: (ctx, file) => (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(file as File),\n [AX_CONVERSATION_VIDEO_UTILITY.duration]: (ctx, file) => mediaDuration(ctx as AXConversationFileTypeUtilityContext, file as File, 'video'),\n [AX_CONVERSATION_VIDEO_UTILITY.formatSize]: (_ctx, bytes) => formatFileSize(bytes as number),\n [AX_CONVERSATION_VIDEO_UTILITY.formatDuration]: (_ctx, seconds) => formatDuration(seconds as number),\n [AX_CONVERSATION_VIDEO_UTILITY.createLocalPreviewUrl]: async (ctx, source) => {\n const blob = source as File | Blob;\n if (blob.type.startsWith('image/')) {\n return (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(blob);\n }\n return blobUrl(ctx as AXConversationFileTypeUtilityContext, blob);\n },\n };\n}\n\nexport function createConversationVideoFileType(): AXFileType {\n const presentation = AX_CONVERSATION_VIDEO_PRESENTATION;\n return {\n name: AX_CONVERSATION_VIDEO_CATALOG,\n metadata: createFileTypeMetadata('conversation'),\n title: presentation.title,\n icon: presentation.icon,\n validations: {\n mimeTypes: ['video/*'],\n minSize: 1,\n maxSize: 500 * MB,\n },\n extensions: [\n { name: 'mp4', title: 'MP4' },\n { name: 'webm', title: 'WebM', validations: { maxSize: 200 * MB } },\n { name: 'ogg', title: 'OGG' },\n ],\n utilities: conversationVideoUtilities(),\n copy: (payload): AXFileCopyData => {\n const video = normalizeVideoPayload(payload as AXConversationVideoPayload);\n const caption = video.caption?.trim();\n const urls = video.videos.map((item) => item.url?.trim()).filter((url): url is string => !!url);\n return {\n text: caption ?? '',\n meta: { kind: 'video', caption, urls, count: video.videos.length },\n };\n },\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationVideoFileTypeProvider extends AXFileTypeInfoProvider {\n items() {\n return Promise.resolve([createConversationVideoFileType()]);\n }\n}\n","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXConversationMessagePayload, AXConversationVideoMediaItem, AXConversationVideoPayload } from '../../../../models';\nimport type { AXConversationUploaderResult } from '../../../../models/conversation-upload.types';\nimport { normalizeVideoPayload } from '../../../message-list/components/video-renderer/video.payload';\nimport { resolvePersistableMediaUrl, resolvePersistedThumbnailUrl } from '../shared/persisted-media-url';\nimport { probeVideoMedia } from '../shared/media-dimensions';\n\nexport async function videoItemFromUpload(\n file: File,\n result: AXConversationUploaderResult,\n duration: number,\n size?: { width?: number; height?: number },\n): Promise<AXConversationVideoMediaItem> {\n const url = resolvePersistableMediaUrl(result.url);\n const probed =\n size?.width && size.height\n ? { width: size.width, height: size.height, duration }\n : await probeVideoMedia(file);\n const item: AXConversationVideoMediaItem = {\n mediaId: result.mediaId,\n mimeType: result.mimeType,\n size: result.size,\n thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl, url),\n duration: duration || probed.duration,\n width: probed.width,\n height: probed.height,\n metadata: result.metadata,\n };\n if (url) {\n item.url = url;\n }\n return item;\n}\n\nexport function mergeVideoUploadResult(\n payload: AXConversationMessagePayload,\n result: AXUploadResult,\n): AXConversationMessagePayload {\n const base = normalizeVideoPayload(payload as AXConversationVideoPayload);\n const videos = [...base.videos];\n const i = videos.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n const slot = i >= 0 ? videos[i] : undefined;\n const url = resolvePersistableMediaUrl(result.url);\n const next: AXConversationVideoMediaItem = {\n ...(slot ?? { duration: 0, width: 0, height: 0 }),\n mediaId: result.mediaId,\n mimeType: result.mimeType,\n size: result.size,\n thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl ?? slot?.thumbnailUrl, url),\n metadata: result.metadata,\n };\n if (url) {\n next.url = url;\n }\n if (i >= 0) videos[i] = next;\n else videos.push(next);\n return { ...base, type: 'video', videos };\n}\n\nexport function applyVideoLocalPreview(\n payload: AXConversationMessagePayload,\n localUrl: string,\n mimeType = 'application/octet-stream',\n): AXConversationMessagePayload {\n const base = normalizeVideoPayload(payload as AXConversationVideoPayload);\n const videos = [...base.videos];\n const slot = videos.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n const preview = { url: localUrl, duration: 0, width: 0, height: 0, mimeType };\n if (slot >= 0) {\n videos[slot] = { ...videos[slot], ...preview };\n } else if (videos.length === 0) {\n videos.push(preview);\n } else {\n videos[0] = { ...videos[0], ...preview };\n }\n return { ...base, type: 'video', videos };\n}\n","/**\n * Video Picker Component\n * Full-width video selection and preview interface for the composer\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownPanelComponent } from '@acorex/components/dropdown';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport {\n AXFileService,\n AXFileTypeRegistryService,\n runFileTypeUtility,\n runFileTypeUtilityForFile,\n type AXFileType,\n} from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, ViewEncapsulation, computed, inject, input, signal, viewChild } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport type { AXConversationComposerActionComponent } from '../../../../registries/composer-action.registry';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { AXConversationPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerOptionsComponent } from '../shared/picker-options.component';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport { probeVideoMedia } from '../shared/media-dimensions';\nimport {\n cleanupPickerUploads,\n createPickerUploadItemId,\n dismissComposerPickerHost,\n getPickerCancelUploadLabel,\n isUploadAborted,\n limitFilesToCapacity,\n notifyMaxFilesCapacityExceeded,\n notifyPickerValidationErrors,\n pickerItemToUploadResult,\n uploadPickerFile,\n type AXConversationComposerPickerUploadItem,\n} from '../shared/picker-upload';\nimport { installComposerPickerAutoRun, runComposerPickerAutoRunBrowse } from '../shared/picker-auto-run';\nimport {\n AX_CONVERSATION_VIDEO_CATALOG,\n AX_CONVERSATION_VIDEO_PRESENTATION,\n createConversationVideoFileType,\n} from './conversation-video.file-type';\nimport { videoItemFromUpload } from './video-composer.payload';\nimport { fileItemFromUpload } from '../file-picker/file-composer.payload';\nimport {\n getMediaGalleryLayoutMode,\n partitionMediaIntoGalleryRows,\n} from '../../../message-list/components/shared/media-gallery-layout';\n\ninterface AXConversationVideoFile extends AXConversationComposerPickerUploadItem {\n preview?: string;\n duration?: number;\n width?: number;\n height?: number;\n}\n\n@Component({\n selector: 'ax-conversation-video-picker',\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n AXProgressBarModule,\n AXTranslationModule,\n AXButtonComponent,\n AXButtonItemComponent,\n AXButtonItemListComponent,\n AXDecoratorModule,\n AXDropdownPanelComponent,\n AXConversationPickerHeaderComponent,\n AXConversationPickerFooterComponent,\n AXConversationPickerEmptyComponent,\n AXConversationPickerCaptionComponent,\n AXConversationPickerOptionsComponent,\n AXConversationPickerShellComponent,\n ],\n templateUrl: './video-picker.component.html',\n styleUrls: ['../shared/picker-shared.css'],\n})\nexport class AXConversationVideoPickerComponent implements OnDestroy, AXConversationComposerActionComponent {\n private uploadsDismissed = false;\n private retainUploadedOnDismiss = false;\n readonly service = input<AXConversationComposerService | undefined>();\n private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n private get composerService(): AXConversationComposerService {\n const svc = this.service() ?? this.composerServiceFromInjector;\n if (!svc) {\n throw new Error('AXConversationComposerService is required for the video picker');\n }\n return svc;\n }\n private readonly uploader = inject(AXUploaderService);\n private readonly fileService = inject(AXFileService);\n private readonly fileTypeRegistry = inject(AXFileTypeRegistryService);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly toast = inject(AXToastService);\n readonly translation = inject(AXTranslationService);\n\n readonly conversation = input.required<AXConversation>();\n readonly maxFiles = input<number>(10);\n readonly initialFiles = input<File[]>([]);\n readonly autoRun = input(false);\n readonly __popup__ = input<AXPopupRef | undefined>();\n readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n\n readonly catalogFileType = AX_CONVERSATION_VIDEO_CATALOG;\n\n readonly videos = signal<AXConversationVideoFile[]>([]);\n readonly isDragging = signal(false);\n private readonly pickerShell = viewChild<AXConversationPickerShellComponent>('pickerShell');\n caption = '';\n groupItems = true;\n sendAsDocuments = false;\n\n readonly allowMultiple = computed(() => this.maxFiles() > 1);\n readonly layoutMode = computed(() => getMediaGalleryLayoutMode(this.videos().length));\n readonly mediaRows = computed(() => partitionMediaIntoGalleryRows(this.videos()));\n readonly typeIconClass = AX_CONVERSATION_VIDEO_PRESENTATION.icon;\n readonly emptyIconClass = computed(() =>\n this.isDragging() ? 'fa-light fa-cloud-arrow-up' : AX_CONVERSATION_VIDEO_PRESENTATION.icon,\n );\n\n private catalogFileTypeDef?: AXFileType;\n\n constructor() {\n this.fileTypeRegistry.registerTypes([createConversationVideoFileType()]);\n installComposerPickerAutoRun({\n autoRun: this.autoRun,\n initialFiles: this.initialFiles,\n activate: () => this.activate(),\n seedFiles: (files) => this.handleFiles(files),\n });\n }\n\n activate(): Promise<void> {\n return runComposerPickerAutoRunBrowse({\n fileTypeRegistry: this.fileTypeRegistry,\n uploader: this.uploader,\n toast: this.toast,\n translation: this.translation,\n catalogFileType: this.catalogFileType,\n maxFiles: this.maxFiles(),\n hasExistingFiles: () => this.videos().length > 0,\n handleFiles: (files) => this.handleFiles(files),\n onCancelled: () => this.cancel(),\n });\n }\n\n private createUtilityContext() {\n return {\n readAsDataUrl: (file: File | Blob) => this.fileService.blobToBase64(file),\n platformId: this.platformId,\n };\n }\n\n private async getCatalogFileTypeDef(): Promise<AXFileType | undefined> {\n this.catalogFileTypeDef ??= await this.fileService.getFileType(this.catalogFileType);\n return this.catalogFileTypeDef;\n }\n\n private async runUtility(name: string, file: File, ...args: unknown[]): Promise<unknown> {\n const fileType = await this.getCatalogFileTypeDef();\n if (!fileType) return undefined;\n return runFileTypeUtilityForFile(fileType, this.createUtilityContext(), file, name, ...args);\n }\n\n async handleFiles(files: File[]): Promise<void> {\n const max = this.maxFiles();\n const capacity = limitFilesToCapacity(files, this.videos().length, max);\n if (capacity.length < files.length) {\n notifyMaxFilesCapacityExceeded(this.toast, this.translation, max);\n }\n if (capacity.length === 0) {\n return;\n }\n\n const { accepted, rejected } = await this.uploader.validateFiles(capacity, this.catalogFileType);\n\n notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n for (const file of accepted) {\n try {\n const previewResult = await this.runUtility('preview', file);\n const meta = await probeVideoMedia(file);\n const preview = typeof previewResult === 'string' ? previewResult : undefined;\n let index = -1;\n this.videos.update((videos) => {\n index = videos.length;\n return [\n ...videos,\n {\n id: createPickerUploadItemId(),\n file,\n preview,\n duration: meta.duration,\n width: meta.width,\n height: meta.height,\n uploadProgress: 0,\n uploading: true,\n },\n ];\n });\n if (index >= 0) {\n void this.uploadVideoAt(index, file);\n }\n } catch (error) {\n console.error('Failed to process video:', error);\n }\n }\n }\n\n private async uploadVideoAt(index: number, file: File): Promise<void> {\n const abortController = new AbortController();\n this.patchVideo(index, { abortController });\n\n try {\n const result = await uploadPickerFile(\n this.uploader,\n this.conversation().id,\n file,\n (progress) => this.patchVideo(index, { uploadProgress: progress, uploading: true }),\n abortController.signal,\n );\n this.patchVideo(index, {\n uploadProgress: 100,\n uploading: false,\n uploaded: true,\n uploadedUrl: result.url,\n mediaId: result.mediaId,\n });\n } catch (err) {\n if (this.uploadsDismissed || isUploadAborted(err, abortController.signal)) {\n return;\n }\n this.patchVideo(index, {\n uploading: false,\n error: this.translation.translateSync('@acorex:chat.errors.upload-failed'),\n });\n }\n }\n\n private patchVideo(index: number, patch: Partial<AXConversationVideoFile>): void {\n if (this.uploadsDismissed) {\n return;\n }\n this.videos.update((items) => {\n const next = [...items];\n if (next[index]) {\n next[index] = { ...next[index], ...patch };\n }\n return next;\n });\n }\n\n removeVideo(index: number): void {\n const item = this.videos()[index];\n if (item) {\n cleanupPickerUploads(this.uploader, [item]);\n }\n this.videos.update((videos) => videos.filter((_, i) => i !== index));\n }\n\n async replaceAttachment(index: number): Promise<void> {\n const current = this.videos()[index];\n if (!current) {\n return;\n }\n\n const { accepted, rejected } = await this.uploader.chooseFiles({\n fileType: this.catalogFileType,\n multiple: false,\n });\n notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n const replacement = accepted[0];\n if (!replacement) {\n return;\n }\n\n if (current.abortController) {\n current.abortController.abort();\n }\n cleanupPickerUploads(this.uploader, [current]);\n\n try {\n const previewResult = await this.runUtility('preview', replacement);\n const meta = await probeVideoMedia(replacement);\n const preview = typeof previewResult === 'string' ? previewResult : undefined;\n\n this.videos.update((videos) => {\n const next = [...videos];\n next[index] = {\n id: createPickerUploadItemId(),\n file: replacement,\n preview,\n duration: meta.duration,\n width: meta.width,\n height: meta.height,\n uploadProgress: 0,\n uploading: true,\n };\n return next;\n });\n void this.uploadVideoAt(index, replacement);\n } catch (error) {\n console.error('Failed to replace attachment:', error);\n this.removeVideo(index);\n }\n }\n\n async sendVideos(): Promise<void> {\n const videoList = this.videos();\n if (!this.canSend()) return;\n\n const caption = this.caption.trim() || undefined;\n const sendSingle = !this.groupItems && videoList.length > 1;\n\n this.retainUploadedOnDismiss = true;\n const popup = this.__popup__();\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, popup, this.__actionSheet__());\n\n if (this.sendAsDocuments) {\n await this.sendVideosAsDocuments(videoList, caption, sendSingle);\n return;\n }\n\n if (sendSingle) {\n for (const video of videoList) {\n const result = pickerItemToUploadResult(video);\n if (!result) {\n continue;\n }\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'video',\n payload: {\n type: 'video',\n videos: [await videoItemFromUpload(video.file, result, video.duration ?? 0, video)],\n },\n };\n await this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n return;\n }\n\n const videos = (\n await Promise.all(\n videoList.map(async (video) => {\n const result = pickerItemToUploadResult(video);\n return result ? videoItemFromUpload(video.file, result, video.duration ?? 0, video) : null;\n }),\n )\n ).filter((item): item is NonNullable<typeof item> => item !== null);\n\n if (videos.length === 0) {\n return;\n }\n\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'video',\n payload: {\n type: 'video',\n videos,\n caption,\n },\n };\n\n void this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n\n private async sendVideosAsDocuments(\n videoList: AXConversationVideoFile[],\n caption: string | undefined,\n sendSingle: boolean,\n ): Promise<void> {\n if (sendSingle) {\n for (const video of videoList) {\n const result = pickerItemToUploadResult(video);\n if (!result) {\n continue;\n }\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'file',\n payload: {\n type: 'file',\n files: [fileItemFromUpload(video.file, result)],\n },\n };\n await this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n return;\n }\n\n const files = videoList.flatMap((video) => {\n const result = pickerItemToUploadResult(video);\n return result ? [fileItemFromUpload(video.file, result)] : [];\n });\n\n if (files.length === 0) {\n return;\n }\n\n const command: AXConversationSendMessageCommand = {\n conversationId: this.conversation().id,\n type: 'file',\n payload: {\n type: 'file',\n files,\n caption,\n },\n };\n\n void this.composerService.sendMessage(command).catch(() => {\n this.retainUploadedOnDismiss = false;\n });\n }\n\n canSend(): boolean {\n const list = this.videos();\n return list.length > 0 && list.every((v) => v.uploaded && !v.error && !v.uploading);\n }\n\n getUploadingLabel(progress: number): string {\n return this.translation.translateSync('@acorex:chat.pickers.files.uploading-progress', {\n params: { progress },\n });\n }\n\n getCancelUploadLabel(): string {\n return getPickerCancelUploadLabel(this.translation);\n }\n\n getHeaderTitle(): string {\n const count = this.videos().length;\n if (count === 0) {\n return this.translation.translateSync('@acorex:chat.pickers.videos.title');\n }\n return this.translation.translateSync('@acorex:chat.pickers.videos.selected-count', {\n params: { count },\n });\n }\n\n onAddMoreFiles(): void {\n void this.pickerShell()?.browse();\n }\n\n cancel(): void {\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n }\n\n ngOnDestroy(): void {\n this.dismissPicker();\n }\n\n private dismissPicker(): void {\n if (this.uploadsDismissed) {\n return;\n }\n this.uploadsDismissed = true;\n const snapshot = [...this.videos()];\n cleanupPickerUploads(this.uploader, snapshot, {\n retainUploaded: this.retainUploadedOnDismiss,\n });\n this.retainUploadedOnDismiss = false;\n this.videos.set([]);\n this.caption = '';\n }\n\n formatFileSize(bytes: number): string {\n const fileType = this.catalogFileTypeDef;\n const result = fileType\n ? runFileTypeUtility(fileType, this.createUtilityContext(), undefined, 'formatSize', bytes)\n : undefined;\n return typeof result === 'string' ? result : `${bytes} B`;\n }\n\n formatDuration(seconds: number): string {\n const fileType = this.catalogFileTypeDef;\n const result = fileType\n ? runFileTypeUtility(fileType, this.createUtilityContext(), undefined, 'formatDuration', seconds)\n : undefined;\n return typeof result === 'string' ? result : '0:00';\n }\n\n getEmptyTitle(): string {\n return this.isDragging()\n ? this.translation.translateSync('@acorex:chat.pickers.videos.drop-to-attach')\n : this.translation.translateSync('@acorex:chat.pickers.videos.select');\n }\n\n getEmptySubtitle(): string {\n return this.isDragging()\n ? this.translation.translateSync('@acorex:chat.pickers.common.release-to-upload')\n : this.translation.translateSync('@acorex:chat.pickers.common.click-to-browse');\n }\n\n getSelectedCountText(): string {\n return this.translation.translateSync('@acorex:chat.pickers.videos.selected-count', {\n params: { count: this.videos().length },\n });\n }\n\n getSendText(): string {\n return this.translation.translateSync('@acorex:chat.pickers.videos.send-count', {\n params: { count: this.videos().length },\n });\n }\n}\n","<ax-conversation-picker-shell\n #pickerShell\n [fileType]=\"catalogFileType\"\n [multiple]=\"allowMultiple()\"\n (filesSelected)=\"handleFiles($event)\"\n (dragEnter)=\"isDragging.set(true)\"\n (dragLeave)=\"isDragging.set(false)\"\n>\n <ax-conversation-picker-header\n [title]=\"getHeaderTitle()\"\n [showMenu]=\"videos().length > 0\"\n [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n (onAddMore)=\"onAddMoreFiles()\"\n />\n\n <div class=\"ax-conversation-picker__scroll\">\n @if (videos().length === 0) {\n <ax-conversation-picker-empty\n [title]=\"getEmptyTitle()\"\n [hint]=\"getEmptySubtitle()\"\n [iconClass]=\"emptyIconClass()\"\n [dragOver]=\"isDragging()\"\n />\n } @else {\n <div class=\"ax-conversation-picker__body\">\n @switch (layoutMode()) {\n @case ('masonry') {\n <div class=\"ax-conversation-picker__media-grid ax-conversation-picker__media-grid--masonry\">\n @for (row of mediaRows(); track $index) {\n <div class=\"ax-conversation-picker__media-row\">\n @for (video of row.items; track video.id; let index = $index) {\n <div class=\"ax-conversation-picker__media-tile\">\n <ng-container\n *ngTemplateOutlet=\"mediaTile; context: { $implicit: video, index: row.startIndex + index }\"\n ></ng-container>\n </div>\n }\n </div>\n }\n </div>\n }\n @case ('triple') {\n <div class=\"ax-conversation-picker__media-grid ax-conversation-picker__media-grid--triple\">\n @for (video of videos(); track video.id; let index = $index) {\n <div class=\"ax-conversation-picker__media-tile\">\n <ng-container *ngTemplateOutlet=\"mediaTile; context: { $implicit: video, index }\"></ng-container>\n </div>\n }\n </div>\n }\n @default {\n <div [class]=\"'ax-conversation-picker__media-grid ax-conversation-picker__media-grid--' + layoutMode()\">\n @for (video of videos(); track video.id; let index = $index) {\n <div class=\"ax-conversation-picker__media-tile\">\n <ng-container *ngTemplateOutlet=\"mediaTile; context: { $implicit: video, index }\"></ng-container>\n </div>\n }\n </div>\n }\n }\n\n <p class=\"ax-conversation-picker__media-hint\">\n {{ translation.translateSync('@acorex:chat.pickers.common.edit-photo-hint') }}\n </p>\n </div>\n }\n </div>\n\n @if (videos().length > 0) {\n <ax-conversation-picker-options\n [(groupItems)]=\"groupItems\"\n [(sendAsDocuments)]=\"sendAsDocuments\"\n [showGroupItems]=\"allowMultiple() && videos().length > 1\"\n [showSendAsDocuments]=\"true\"\n />\n <ax-conversation-picker-caption [(caption)]=\"caption\" [sendDisabled]=\"!canSend()\" (onSend)=\"sendVideos()\" />\n <ax-conversation-picker-footer\n [addLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add')\"\n [cancelLabel]=\"translation.translateSync('@acorex:chat.actions.cancel')\"\n [sendLabel]=\"translation.translateSync('@acorex:chat.actions.send')\"\n [sendDisabled]=\"!canSend()\"\n (onAdd)=\"onAddMoreFiles()\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendVideos()\"\n />\n }\n</ax-conversation-picker-shell>\n\n<ng-template #mediaTile let-video let-index=\"index\">\n @if (video.preview) {\n <video [src]=\"video.preview\" muted playsinline preload=\"metadata\"></video>\n }\n\n <div class=\"ax-conversation-picker__media-tile-overlay\">\n <ax-button class=\"rounded-full ax-xs\" look=\"blank\" [iconOnly]=\"true\">\n <ax-icon><i class=\"fa-solid fa-ellipsis-vertical\"></i></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"translation.translateSync('@acorex:chat.pickers.files.replace-attachment')\"\n (onClick)=\"replaceAttachment(index)\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-arrows-rotate\"></i></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n\n <ax-button\n class=\"rounded-full ax-xs\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"translation.translateSync('@acorex:chat.pickers.common.remove')\"\n (onClick)=\"removeVideo(index)\"\n >\n <ax-icon><i class=\"fa-solid fa-xmark\"></i></ax-icon>\n </ax-button>\n </div>\n\n @if (video.uploading || video.error) {\n <div class=\"ax-conversation-picker__media-status-layer\">\n @if (video.uploading) {\n <span class=\"ax-conversation-picker__media-status\">{{ getUploadingLabel(video.uploadProgress ?? 0) }}</span>\n <ax-progress-bar [progress]=\"video.uploadProgress || 0\" [mode]=\"'determinate'\" [height]=\"3\" />\n } @else if (video.error) {\n <span class=\"ax-conversation-picker__media-status\">{{ video.error }}</span>\n }\n </div>\n }\n</ng-template>\n","import type { AXFileCopyData, AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, createFileTypeMetadata } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport type { AXConversationVoicePayload } from '../../../../models';\nimport { AX_CONVERSATION_VOICE_CATALOG } from '../../../../models/message-file-type-catalog';\nimport { formatDuration } from '../shared/media-formatters';\n\nexport { AX_CONVERSATION_VOICE_CATALOG };\n\nconst MB = 1024 * 1024;\n\nexport const AX_CONVERSATION_VOICE_PRESENTATION = {\n icon: 'fa-light fa-microphone text-green-500',\n title: 'Voice message',\n} as const;\n\ntype AXConversationFileTypeUtilityContext = {\n readAsDataUrl: (file: File | Blob) => Promise<string>;\n platformId: object;\n};\n\nconst AX_CONVERSATION_VOICE_UTILITY = {\n duration: 'duration',\n formatDuration: 'formatDuration',\n createLocalPreviewUrl: 'createLocalPreviewUrl',\n} as const;\n\nfunction blobUrl(ctx: AXConversationFileTypeUtilityContext, blob: Blob): string {\n if (!isPlatformBrowser(ctx.platformId)) {\n return '';\n }\n return URL.createObjectURL(blob);\n}\n\nfunction mediaDuration(ctx: AXConversationFileTypeUtilityContext, file: File | Blob): Promise<number> {\n if (!isPlatformBrowser(ctx.platformId)) {\n return Promise.resolve(0);\n }\n return new Promise((resolve, reject) => {\n const el = document.createElement('audio');\n el.preload = 'metadata';\n el.onloadedmetadata = () => {\n URL.revokeObjectURL(el.src);\n resolve(el.duration);\n };\n el.onerror = () => {\n URL.revokeObjectURL(el.src);\n reject(new Error('Failed to load audio metadata'));\n };\n el.src = URL.createObjectURL(file);\n });\n}\n\nexport function conversationVoiceUtilities(): NonNullable<AXFileType['utilities']> {\n return {\n [AX_CONVERSATION_VOICE_UTILITY.duration]: (ctx, file) =>\n mediaDuration(ctx as AXConversationFileTypeUtilityContext, file as File | Blob),\n [AX_CONVERSATION_VOICE_UTILITY.formatDuration]: (_ctx, seconds) => formatDuration(seconds as number),\n [AX_CONVERSATION_VOICE_UTILITY.createLocalPreviewUrl]: (ctx, source) =>\n blobUrl(ctx as AXConversationFileTypeUtilityContext, source as Blob),\n };\n}\n\nexport function createConversationVoiceFileType(): AXFileType {\n const presentation = AX_CONVERSATION_VOICE_PRESENTATION;\n return {\n name: AX_CONVERSATION_VOICE_CATALOG,\n metadata: createFileTypeMetadata('conversation'),\n title: presentation.title,\n icon: presentation.icon,\n validations: {\n mimeTypes: ['audio/webm', 'audio/ogg', 'audio/mp4', 'audio/*'],\n minSize: 1,\n maxSize: 50 * MB,\n },\n utilities: conversationVoiceUtilities(),\n copy: (payload): AXFileCopyData => {\n const voice = payload as AXConversationVoicePayload;\n const url = voice.url?.trim() ?? '';\n return {\n text: '',\n meta: {\n kind: 'voice',\n url,\n duration: voice.duration,\n mimeType: voice.mimeType,\n },\n };\n },\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationVoiceFileTypeProvider extends AXFileTypeInfoProvider {\n items() {\n return Promise.resolve([createConversationVoiceFileType()]);\n }\n}\n","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXConversationMessagePayload } from '../../../../models';\n\nexport function mergeVoiceUploadResult(\n payload: AXConversationMessagePayload,\n result: AXUploadResult,\n): AXConversationMessagePayload {\n return {\n ...(payload as Extract<AXConversationMessagePayload, { type: 'voice' }>),\n type: 'voice',\n url: result.url,\n mediaId: result.mediaId,\n mimeType: result.mimeType,\n size: result.size,\n metadata: result.metadata,\n };\n}\n\nexport function applyVoiceLocalPreview(payload: AXConversationMessagePayload, localUrl: string): AXConversationMessagePayload {\n return { ...(payload as Extract<AXConversationMessagePayload, { type: 'voice' }>), type: 'voice', url: localUrl };\n}\n","/**\n * Voice Recorder Component\n * Full-width voice recording interface for the composer\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport { AXAudioWaveChangeEvent, AXAudioWaveComponent, AXWaveConfig } from '@acorex/components/audio-wave';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AsyncPipe, isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n PLATFORM_ID,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport type { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport type { AXConversationComposerActionComponent } from '../../../../registries/composer-action.registry';\nimport { ensureConversationFileCatalogRegistered } from '../../composer-actions/conversation-composer-file-types.provider';\nimport { installComposerPickerAutoRun } from '../shared/picker-auto-run';\nimport { dismissComposerPickerHost, isUploadAborted, notifyPickerValidationErrors } from '../shared/picker-upload';\nimport { AX_CONVERSATION_VOICE_CATALOG, createConversationVoiceFileType } from './conversation-voice.file-type';\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== 'undefined' && error instanceof DOMException && error.name === 'AbortError') ||\n (error instanceof Error && (error.name === 'AbortError' || /aborted/i.test(error.message)))\n );\n}\n\nconst WAVE_HEIGHT = 36;\nconst WAVE_BAR_WIDTH = 2;\nconst WAVE_BAR_GAP = 2;\nconst WAVE_BAR_RADIUS = 2;\nconst LIVE_BAR_INTERVAL_MS = 100;\n\n@Component({\n selector: 'ax-conversation-voice-recorder',\n\n encapsulation: ViewEncapsulation.None,\n imports: [\n AsyncPipe,\n AXAudioWaveComponent,\n AXButtonComponent,\n AXDecoratorModule,\n AXProgressBarModule,\n AXTranslationModule,\n ],\n templateUrl: './voice-recorder.component.html',\n styleUrl: './voice-recorder.component.css',\n})\nexport class AXConversationVoiceRecorderComponent implements AXConversationComposerActionComponent {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n readonly service = input<AXConversationComposerService | undefined>();\n private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n private get composerService(): AXConversationComposerService {\n const svc = this.service() ?? this.composerServiceFromInjector;\n if (!svc) {\n throw new Error('AXConversationComposerService is required for the voice recorder');\n }\n return svc;\n }\n\n private readonly uploader = inject(AXUploaderService);\n private readonly fileTypeRegistry = inject(AXFileTypeRegistryService);\n private readonly toast = inject(AXToastService);\n readonly translation = inject(AXTranslationService);\n\n readonly conversation = input.required<AXConversation>();\n readonly initialFiles = input<File[]>([]);\n readonly autoRun = input(false);\n readonly __popup__ = input<AXPopupRef | undefined>();\n readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n readonly recordingComplete = output<Blob>();\n readonly recordingCancelled = output<void>();\n\n readonly isRecording = signal(false);\n readonly isPreview = signal(false);\n readonly isPlayingPreview = signal(false);\n readonly isUploading = signal(false);\n readonly uploadProgress = signal(0);\n readonly recordingDuration = signal(0);\n readonly previewUrl = signal<string | null>(null);\n readonly livePeaks = signal<number[]>([]);\n readonly liveBarCount = signal(48);\n\n private recordingStartTime = 0;\n private timerInterval?: number;\n private mediaRecorder?: MediaRecorder;\n private audioChunks: Blob[] = [];\n private activeStream?: MediaStream;\n private cancelled = false;\n private sendAfterStop = false;\n private sendInFlight = false;\n private awaitingPreviewData = false;\n private previewBlob: Blob | null = null;\n private uploadAbortController?: AbortController;\n private audioContext?: AudioContext;\n private analyser?: AnalyserNode;\n private timeDomain = new Uint8Array(0);\n private rafId = 0;\n private lastLivePeakAt = 0;\n private waveResizeObserver?: ResizeObserver;\n private readonly waveWrapRef = viewChild<ElementRef<HTMLElement>>('waveWrap');\n private readonly waveRef = viewChild(AXAudioWaveComponent);\n\n readonly formattedTime = computed(() => {\n const duration = this.recordingDuration();\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n const seconds = duration % 60;\n return [hours, minutes, seconds].map((value) => value.toString().padStart(2, '0')).join(':');\n });\n\n readonly canSend = computed(() => this.recordingDuration() > 0 || this.isPreview());\n\n readonly liveDisplayBars = computed(() => {\n const peaks = this.livePeaks();\n const count = this.liveBarCount();\n return Array.from({ length: count }, (_, index) => ({\n index,\n recorded: index < peaks.length,\n height: peaks[index] ?? 8,\n }));\n });\n\n readonly waveConfig = computed((): AXWaveConfig | null => {\n const url = this.previewUrl()?.trim();\n if (!url) {\n return null;\n }\n return {\n url,\n height: WAVE_HEIGHT,\n barWidth: WAVE_BAR_WIDTH,\n barGap: WAVE_BAR_GAP,\n barRadius: WAVE_BAR_RADIUS,\n audioRate: 1,\n };\n });\n\n constructor() {\n this.fileTypeRegistry.registerTypes([createConversationVoiceFileType()]);\n this.destroyRef.onDestroy(() => this.stopAndCleanup());\n installComposerPickerAutoRun({\n autoRun: this.autoRun,\n initialFiles: this.initialFiles,\n activate: () => this.activate(),\n seedFiles: () => undefined,\n });\n }\n\n activate(): Promise<void> {\n return this.startRecording();\n }\n\n async startRecording(): Promise<void> {\n if (!isPlatformBrowser(this.platformId)) return;\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n this.activeStream = stream;\n this.mediaRecorder = new MediaRecorder(stream);\n this.audioChunks = [];\n this.cancelled = false;\n this.sendAfterStop = false;\n this.clearPreview();\n this.livePeaks.set([]);\n\n this.mediaRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n this.audioChunks.push(event.data);\n }\n this.flushPreviewIfWaiting();\n };\n\n this.mediaRecorder.onstop = () => {\n this.stopLiveWave();\n this.releaseStream();\n this.isRecording.set(false);\n this.clearTimer();\n\n if (this.cancelled) {\n this.cancelled = false;\n this.audioChunks = [];\n return;\n }\n\n const audioBlob = this.buildRecordingBlob();\n this.recordingComplete.emit(audioBlob);\n\n if (this.sendAfterStop) {\n this.sendAfterStop = false;\n const conv = this.conversation();\n if (conv && audioBlob.size > 0) {\n void this.sendVoiceMessage(audioBlob, conv);\n }\n return;\n }\n\n this.enterPreview(audioBlob);\n };\n\n this.mediaRecorder.start();\n this.isRecording.set(true);\n this.isPreview.set(false);\n this.recordingStartTime = Date.now();\n this.recordingDuration.set(0);\n this.timerInterval = window.setInterval(() => {\n const elapsed = Math.floor((Date.now() - this.recordingStartTime) / 1000);\n this.recordingDuration.set(elapsed);\n }, 1000);\n\n requestAnimationFrame(() => this.startLiveWave(stream));\n } catch (error) {\n console.error('Failed to start recording:', error);\n if (this.autoRun()) {\n this.dismissHost();\n }\n }\n }\n\n private dismissHost(): void {\n dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n }\n\n toggleStopOrContinue(): void {\n if (this.isRecording()) {\n this.pauseRecording();\n return;\n }\n if (this.isPreview()) {\n this.continueRecording();\n }\n }\n\n stopRecording(): void {\n this.pauseRecording();\n }\n\n sendRecording(): void {\n const recorder = this.mediaRecorder;\n if (recorder && (recorder.state === 'recording' || recorder.state === 'paused')) {\n this.sendAfterStop = true;\n this.pausePreview();\n recorder.stop();\n return;\n }\n\n const conv = this.conversation();\n const blob = this.previewBlob;\n if (conv && blob) {\n void this.sendVoiceMessage(blob, conv);\n }\n }\n\n deleteRecording(): void {\n this.pausePreview();\n this.discardActiveRecorder();\n this.clearPreview();\n this.recordingDuration.set(0);\n this.audioChunks = [];\n this.recordingCancelled.emit();\n this.dismissHost();\n }\n\n cancelRecording(): void {\n this.discardActiveRecorder();\n this.pausePreview();\n this.clearPreview();\n this.recordingCancelled.emit();\n this.dismissHost();\n }\n\n cancel(): void {\n if (this.isRecording() || this.isPreview()) {\n this.cancelRecording();\n return;\n }\n this.abortInProgressUploads();\n this.dismissHost();\n }\n\n togglePreview(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const wave = this.waveRef();\n if (!wave) {\n return;\n }\n if (this.isPlayingPreview()) {\n wave.pause();\n return;\n }\n void wave.play().catch((error: unknown) => {\n if (!isAbortError(error)) {\n throw error;\n }\n });\n }\n\n onWaveStatusChanged(event: AXAudioWaveChangeEvent): void {\n switch (event.status) {\n case 'play':\n this.isPlayingPreview.set(true);\n break;\n case 'pause':\n case 'finish':\n this.isPlayingPreview.set(false);\n break;\n default:\n break;\n }\n }\n\n abortInProgressUploads(): void {\n if (this.uploadAbortController && !this.uploadAbortController.signal.aborted) {\n this.uploadAbortController.abort();\n }\n this.uploadAbortController = undefined;\n if (this.isUploading()) {\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n }\n }\n\n private pauseRecording(): void {\n const recorder = this.mediaRecorder;\n if (recorder?.state !== 'recording') {\n return;\n }\n this.sendAfterStop = false;\n this.awaitingPreviewData = true;\n recorder.pause();\n recorder.requestData();\n this.stopLiveWave();\n this.clearTimer();\n this.isRecording.set(false);\n this.isPreview.set(true);\n this.flushPreviewIfWaiting();\n }\n\n private continueRecording(): void {\n const recorder = this.mediaRecorder;\n const stream = this.activeStream;\n if (!isPlatformBrowser(this.platformId) || recorder?.state !== 'paused' || !stream) {\n return;\n }\n this.awaitingPreviewData = false;\n this.pausePreview();\n this.clearPreviewUrl();\n this.isPreview.set(false);\n this.isPlayingPreview.set(false);\n recorder.resume();\n this.isRecording.set(true);\n this.recordingStartTime = Date.now() - this.recordingDuration() * 1000;\n this.timerInterval = window.setInterval(() => {\n const elapsed = Math.floor((Date.now() - this.recordingStartTime) / 1000);\n this.recordingDuration.set(elapsed);\n }, 1000);\n requestAnimationFrame(() => this.startLiveWave(stream));\n }\n\n private flushPreviewIfWaiting(): void {\n if (!this.awaitingPreviewData || this.mediaRecorder?.state !== 'paused') {\n return;\n }\n const audioBlob = this.buildRecordingBlob();\n if (audioBlob.size === 0) {\n return;\n }\n this.awaitingPreviewData = false;\n this.enterPreview(audioBlob);\n }\n\n private buildRecordingBlob(): Blob {\n return new Blob(this.audioChunks, { type: this.mediaRecorder?.mimeType || 'audio/webm' });\n }\n\n private discardActiveRecorder(): void {\n if (this.mediaRecorder && this.mediaRecorder.state !== 'inactive') {\n this.cancelled = true;\n this.mediaRecorder.stop();\n } else {\n this.releaseStream();\n }\n this.isRecording.set(false);\n this.clearTimer();\n this.audioChunks = [];\n }\n\n private releaseStream(): void {\n this.activeStream?.getTracks().forEach((track) => track.stop());\n this.activeStream = undefined;\n }\n\n private startLiveWave(stream: MediaStream): void {\n this.stopLiveWave();\n this.audioContext = new AudioContext();\n const source = this.audioContext.createMediaStreamSource(stream);\n this.analyser = this.audioContext.createAnalyser();\n this.analyser.fftSize = 256;\n source.connect(this.analyser);\n this.timeDomain = new Uint8Array(this.analyser.fftSize);\n this.lastLivePeakAt = 0;\n void this.audioContext.resume();\n this.observeWaveWidth();\n if (!this.waveWrapRef()?.nativeElement) {\n requestAnimationFrame(() => this.observeWaveWidth());\n }\n this.tickLiveWave();\n }\n\n private observeWaveWidth(): void {\n this.waveResizeObserver?.disconnect();\n const el = this.waveWrapRef()?.nativeElement;\n if (!el || typeof ResizeObserver === 'undefined') {\n this.updateBarCount(el?.clientWidth ?? 320);\n return;\n }\n this.waveResizeObserver = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width ?? el.clientWidth;\n this.updateBarCount(width);\n });\n this.waveResizeObserver.observe(el);\n this.updateBarCount(el.clientWidth);\n }\n\n private updateBarCount(width: number): void {\n const unit = WAVE_BAR_WIDTH + WAVE_BAR_GAP;\n const count = Math.max(24, Math.floor(Math.max(width, 1) / unit));\n if (count === this.liveBarCount()) {\n return;\n }\n this.liveBarCount.set(count);\n this.livePeaks.update((peaks) => (peaks.length > count ? peaks.slice(peaks.length - count) : peaks));\n }\n\n private tickLiveWave = (): void => {\n if (!this.analyser || !this.isRecording()) {\n return;\n }\n const now = performance.now();\n if (now - this.lastLivePeakAt >= LIVE_BAR_INTERVAL_MS) {\n this.lastLivePeakAt = now;\n this.analyser.getByteTimeDomainData(this.timeDomain);\n let max = 0;\n for (const value of this.timeDomain) {\n const amplitude = Math.abs(value - 128) / 128;\n if (amplitude > max) {\n max = amplitude;\n }\n }\n const height = Math.max(4, Math.round(max * WAVE_HEIGHT));\n this.livePeaks.update((peaks) => {\n const count = this.liveBarCount();\n const next = peaks.length >= count ? peaks.slice(1) : [...peaks];\n next.push(height);\n return next;\n });\n }\n this.rafId = requestAnimationFrame(this.tickLiveWave);\n };\n\n private stopLiveWave(): void {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n }\n this.waveResizeObserver?.disconnect();\n this.waveResizeObserver = undefined;\n this.analyser?.disconnect();\n this.analyser = undefined;\n void this.audioContext?.close();\n this.audioContext = undefined;\n }\n\n private enterPreview(audioBlob: Blob): void {\n this.previewBlob = audioBlob;\n if (this.previewUrl()) {\n this.isPreview.set(true);\n return;\n }\n this.clearPreviewUrl();\n if (isPlatformBrowser(this.platformId)) {\n this.previewUrl.set(URL.createObjectURL(audioBlob));\n }\n this.isPreview.set(true);\n }\n\n private pausePreview(): void {\n this.waveRef()?.pause();\n this.isPlayingPreview.set(false);\n }\n\n private clearPreview(): void {\n this.pausePreview();\n this.clearPreviewUrl();\n this.previewBlob = null;\n this.isPreview.set(false);\n this.isPlayingPreview.set(false);\n }\n\n private clearPreviewUrl(): void {\n const url = this.previewUrl();\n if (url && isPlatformBrowser(this.platformId)) {\n URL.revokeObjectURL(url);\n }\n this.previewUrl.set(null);\n }\n\n private clearTimer(): void {\n if (this.timerInterval) {\n clearInterval(this.timerInterval);\n this.timerInterval = undefined;\n }\n }\n\n getUploadingLabel(): string {\n return this.translation.translateSync('@acorex:chat.pickers.files.uploading-progress', {\n params: { progress: this.uploadProgress() },\n });\n }\n\n private async sendVoiceMessage(audioBlob: Blob, conversation: AXConversation): Promise<void> {\n const voiceFile = new File([audioBlob], `voice-${Date.now()}.webm`, { type: audioBlob.type || 'audio/webm' });\n await ensureConversationFileCatalogRegistered(this.fileTypeRegistry, AX_CONVERSATION_VOICE_CATALOG);\n const { rejected } = await this.uploader.validateFiles([voiceFile], AX_CONVERSATION_VOICE_CATALOG);\n\n if (rejected.length > 0) {\n notifyPickerValidationErrors(this.toast, this.translation, rejected);\n return;\n }\n\n this.sendInFlight = true;\n this.uploadAbortController = undefined;\n this.isUploading.set(true);\n this.uploadProgress.set(0);\n\n const command: AXConversationSendMessageCommand = {\n conversationId: conversation.id,\n type: 'voice',\n payload: {\n type: 'voice',\n url: '',\n duration: this.recordingDuration(),\n size: audioBlob.size,\n mimeType: audioBlob.type || 'audio/webm',\n },\n };\n\n const sendPromise = this.composerService.sendMessage(command, {\n media: {\n source: audioBlob,\n fileName: `voice-${Date.now()}.webm`,\n mimeType: audioBlob.type || 'audio/webm',\n onProgress: (percent) => this.uploadProgress.set(percent),\n },\n });\n\n this.dismissHost();\n\n void sendPromise\n .catch((error) => {\n if (!isUploadAborted(error)) {\n console.error('Failed to send voice message:', error);\n }\n })\n .finally(() => {\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n });\n }\n\n private stopAndCleanup(): void {\n if (!this.sendInFlight) {\n this.abortInProgressUploads();\n }\n this.clearTimer();\n this.stopLiveWave();\n this.clearPreview();\n this.discardActiveRecorder();\n }\n}\n","<div\n class=\"voice-recorder\"\n [class.voice-recorder--preview]=\"isPreview()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"translation.translateSync('@acorex:chat.voice-recorder.title')\"\n>\n @if (isUploading()) {\n <div class=\"voice-recorder__upload\">\n <span class=\"voice-recorder__upload-label\">{{ getUploadingLabel() }}</span>\n <ax-progress-bar [progress]=\"uploadProgress()\" [mode]=\"'determinate'\" [height]=\"6\" />\n </div>\n } @else if (!isRecording() && !isPreview()) {\n <div class=\"voice-recorder__idle\">\n <button\n type=\"button\"\n class=\"voice-recorder__mic\"\n [attr.aria-label]=\"translation.translateSync('@acorex:chat.voice-recorder.tap-to-start')\"\n (click)=\"startRecording()\"\n >\n <i class=\"fa-light fa-microphone\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"voice-recorder__hint\">{{ '@acorex:chat.voice-recorder.tap-to-start' | translate | async }}</span>\n </div>\n } @else {\n <div class=\"voice-recorder__body\">\n <div class=\"voice-recorder__visual\">\n <div class=\"voice-recorder__wave-wrap\" #waveWrap>\n @if (isRecording()) {\n <div class=\"voice-recorder__live-wave\" aria-hidden=\"true\">\n @for (bar of liveDisplayBars(); track bar.index) {\n <span\n class=\"voice-recorder__bar\"\n [class.voice-recorder__bar--recorded]=\"bar.recorded\"\n [style.height.px]=\"bar.height\"\n ></span>\n }\n </div>\n } @else if (waveConfig(); as config) {\n <ax-audio-wave\n class=\"voice-recorder__audio-wave\"\n [config]=\"config\"\n (onStatusChanged)=\"onWaveStatusChanged($event)\"\n />\n }\n </div>\n @if (isPreview()) {\n <ax-button\n class=\"voice-recorder__play rounded-full\"\n look=\"twotone\"\n [iconOnly]=\"true\"\n [text]=\"\n isPlayingPreview()\n ? translation.translateSync('@acorex:chat.media.pause')\n : translation.translateSync('@acorex:chat.media.play')\n \"\n (onClick)=\"togglePreview()\"\n >\n <ax-icon>\n <i class=\"fa-solid\" [class.fa-pause]=\"isPlayingPreview()\" [class.fa-play]=\"!isPlayingPreview()\"></i>\n </ax-icon>\n </ax-button>\n }\n </div>\n\n <div class=\"voice-recorder__time\" aria-live=\"polite\">\n {{ formattedTime() }}\n <span class=\"sr-only\">{{ '@acorex:chat.voice-recorder.recording' | translate | async }}</span>\n </div>\n </div>\n\n <footer class=\"voice-recorder__footer\">\n @if (isPreview()) {\n <ax-button\n class=\"voice-recorder__delete\"\n look=\"blank\"\n color=\"danger\"\n [iconOnly]=\"true\"\n [text]=\"translation.translateSync('@acorex:chat.actions.delete')\"\n (onClick)=\"deleteRecording()\"\n >\n <ax-icon><i class=\"fa-light fa-trash-can\"></i></ax-icon>\n </ax-button>\n }\n @if (isRecording() || isPreview()) {\n <ax-button\n class=\"voice-recorder__stop\"\n look=\"outline\"\n color=\"default\"\n [text]=\"\n isPreview()\n ? translation.translateSync('@acorex:chat.voice-recorder.continue-recording')\n : translation.translateSync('@acorex:chat.voice-recorder.stop-recording')\n \"\n (onClick)=\"toggleStopOrContinue()\"\n >\n <ax-prefix>\n <ax-icon>\n <i class=\"fa-solid\" [class.fa-pause]=\"isRecording()\" [class.fa-microphone]=\"isPreview()\"></i>\n </ax-icon>\n </ax-prefix>\n </ax-button>\n }\n <ax-button\n class=\"voice-recorder__send\"\n look=\"solid\"\n color=\"primary\"\n [text]=\"translation.translateSync('@acorex:chat.actions.send')\"\n [disabled]=\"!canSend()\"\n (onClick)=\"sendRecording()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-paper-plane-top\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n </footer>\n }\n</div>\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\n\nexport const AX_CONVERSATION_COMPOSER_EMOJI_ACTION: AXConversationComposerAction = {\n id: 'emoji',\n label: '@acorex:chat.actions.emoji-and-stickers',\n icon: 'fa-light fa-face-smile',\n position: 'end',\n priority: 10,\n visible: () => true,\n handler: async () => undefined,\n tooltip: '@acorex:chat.actions.emoji-and-stickers',\n};\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\nimport { AX_CONVERSATION_IMAGE_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_COMPOSER_IMAGE_ACTION: AXConversationComposerAction = {\n id: 'image',\n label: '@acorex:chat.image',\n icon: 'fa-light fa-image',\n position: 'start',\n location: 'menu',\n priority: 40,\n componentLoader: () =>\n import('../components/image-picker/image-picker.component').then((m) => m.AXConversationImagePickerComponent),\n fileType: AX_CONVERSATION_IMAGE_CATALOG,\n toggleable: true,\n autoRun: true,\n visible: (context) => !context.isEditing,\n tooltip: '@acorex:chat.tooltips.send-image',\n};\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\nimport { AX_CONVERSATION_VIDEO_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_COMPOSER_VIDEO_ACTION: AXConversationComposerAction = {\n id: 'video',\n label: '@acorex:chat.video',\n icon: 'fa-light fa-video',\n position: 'start',\n location: 'menu',\n priority: 50,\n componentLoader: () =>\n import('../components/video-picker/video-picker.component').then((m) => m.AXConversationVideoPickerComponent),\n fileType: AX_CONVERSATION_VIDEO_CATALOG,\n toggleable: true,\n autoRun: true,\n visible: (context) => !context.isEditing,\n tooltip: '@acorex:chat.tooltips.send-video',\n};\n","import { AX_CONVERSATION_FILE_CATALOG } from '../../../models/message-file-type-catalog';\nimport type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\n\nexport const AX_CONVERSATION_COMPOSER_FILE_ACTION: AXConversationComposerAction = {\n id: 'file',\n label: '@acorex:chat.file',\n icon: 'fa-light fa-file',\n position: 'start',\n location: 'menu',\n priority: 20,\n componentLoader: () =>\n import('../components/file-picker/file-picker.component').then((m) => m.AXConversationFilePickerComponent),\n fileType: AX_CONVERSATION_FILE_CATALOG,\n toggleable: true,\n autoRun: true,\n visible: (context) => !context.isEditing,\n tooltip: '@acorex:chat.tooltips.attach-file',\n};\n","import { AX_CONVERSATION_VOICE_CATALOG } from '../../../models/message-file-type-catalog';\nimport type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\n\nexport const AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION: AXConversationComposerAction = {\n id: 'voice-recording',\n label: '@acorex:chat.voice',\n icon: 'fa-light fa-microphone',\n position: 'end',\n priority: 30,\n default: true,\n componentLoader: () =>\n import('../components/voice-recorder/voice-recorder.component').then((m) => m.AXConversationVoiceRecorderComponent),\n fileType: AX_CONVERSATION_VOICE_CATALOG,\n toggleable: true,\n autoRun: true,\n visible: (context) => !context.isEditing,\n tooltip: '@acorex:chat.tooltips.record-voice-message',\n};\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\nimport { AX_CONVERSATION_AUDIO_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_COMPOSER_AUDIO_ACTION: AXConversationComposerAction = {\n id: 'audio',\n label: '@acorex:chat.audio',\n icon: 'fa-light fa-music',\n position: 'start',\n location: 'menu',\n priority: 60,\n componentLoader: () =>\n import('../components/audio-picker/audio-picker.component').then((m) => m.AXConversationAudioPickerComponent),\n fileType: AX_CONVERSATION_AUDIO_CATALOG,\n toggleable: true,\n autoRun: true,\n visible: (context) => !context.isEditing,\n tooltip: '@acorex:chat.tooltips.send-audio-file',\n};\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\n\nexport const AX_CONVERSATION_COMPOSER_LOCATION_ACTION: AXConversationComposerAction = {\n id: 'location',\n label: '@acorex:chat.location',\n icon: 'fa-light fa-location-dot',\n position: 'start',\n location: 'menu',\n priority: 70,\n componentLoader: () =>\n import('../components/location-picker/location-picker.component').then((m) => m.AXConversationLocationPickerComponent),\n toggleable: true,\n visible: (context) => !context.isEditing,\n tooltip: '@acorex:chat.tooltips.send-location',\n};\n","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXFileService } from '@acorex/core/file';\nimport { resolveFileTypeExtension, runFileTypeUtility } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport type { AXConversationImageMediaItem, AXConversationImagePayload, AXConversationMessagePayload, AXConversationMessageType } from '../../../models';\nimport type { AXConversationUploaderReference } from '../../../models/conversation-upload.types';\nimport { AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE, resolveConversationMessageFileType } from '../../../models/message-file-type-catalog';\n\nexport { resolveConversationMessageFileType, AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE };\n\nasync function mergeImageUploadResult(\n payload: AXConversationMessagePayload,\n result: AXUploadResult,\n): Promise<AXConversationMessagePayload> {\n const [{ normalizeImagePayload }, { resolvePersistableMediaUrl, resolvePersistedThumbnailUrl }] = await Promise.all([\n import('../../message-list/components/image-renderer/image.payload'),\n import('../components/shared/persisted-media-url'),\n ]);\n const base = normalizeImagePayload(payload as AXConversationImagePayload);\n const images = [...base.images];\n const i = images.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n const slot = i >= 0 ? images[i] : undefined;\n const url = resolvePersistableMediaUrl(result.url);\n const next: AXConversationImageMediaItem = {\n ...(slot ?? { width: 0, height: 0 }),\n mediaId: result.mediaId,\n mimeType: result.mimeType,\n size: result.size,\n thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl ?? slot?.thumbnailUrl, url),\n metadata: result.metadata,\n };\n if (url) {\n next.url = url;\n }\n if (i >= 0) images[i] = next;\n else images.push(next);\n return { ...base, type: 'image', images };\n}\n\nasync function applyImageLocalPreview(\n payload: AXConversationMessagePayload,\n localUrl: string,\n mimeType = 'application/octet-stream',\n): Promise<AXConversationMessagePayload> {\n const [{ normalizeImagePayload }, { resolvePersistableMediaUrl }] = await Promise.all([\n import('../../message-list/components/image-renderer/image.payload'),\n import('../components/shared/persisted-media-url'),\n ]);\n const { probeImageDimensions } = await import('../components/shared/media-dimensions');\n const base = normalizeImagePayload(payload as AXConversationImagePayload);\n const images = [...base.images];\n const slot = images.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n const size = await probeImageDimensions(localUrl);\n const preview = { url: localUrl, width: size.width, height: size.height, mimeType };\n if (slot >= 0) {\n images[slot] = { ...images[slot], ...preview };\n } else if (images.length === 0) {\n images.push(preview);\n } else {\n images[0] = { ...images[0], ...preview };\n }\n return { ...base, type: 'image', images };\n}\n\nexport async function mergeUploadResult(\n type: AXConversationMessageType,\n payload: AXConversationMessagePayload,\n result: AXUploadResult,\n): Promise<AXConversationMessagePayload> {\n switch (type) {\n case 'image':\n return mergeImageUploadResult(payload, result);\n case 'video': {\n const { mergeVideoUploadResult } = await import('../components/video-picker/video-composer.payload');\n return mergeVideoUploadResult(payload, result);\n }\n case 'audio': {\n const { mergeAudioUploadResult } = await import('../components/audio-picker/audio-composer.payload');\n return mergeAudioUploadResult(payload, result);\n }\n case 'file': {\n const { mergeFileUploadResult } = await import('../components/file-picker/file-composer.payload');\n return mergeFileUploadResult(payload, result);\n }\n case 'voice': {\n const { mergeVoiceUploadResult } = await import('../components/voice-recorder/voice-composer.payload');\n return mergeVoiceUploadResult(payload, result);\n }\n case 'sticker':\n return {\n ...(payload as Extract<AXConversationMessagePayload, { type: 'sticker' }>),\n type: 'sticker',\n url: result.url,\n mediaId: result.mediaId,\n };\n default:\n return payload;\n }\n}\n\nexport async function applyLocalPreview(\n type: AXConversationMessageType,\n payload: AXConversationMessagePayload,\n localUrl: string,\n mimeType = 'application/octet-stream',\n): Promise<AXConversationMessagePayload> {\n switch (type) {\n case 'image':\n return applyImageLocalPreview(payload, localUrl, mimeType);\n case 'video': {\n const { applyVideoLocalPreview } = await import('../components/video-picker/video-composer.payload');\n return applyVideoLocalPreview(payload, localUrl, mimeType);\n }\n case 'audio': {\n const { applyAudioLocalPreview } = await import('../components/audio-picker/audio-composer.payload');\n return applyAudioLocalPreview(payload, localUrl, mimeType);\n }\n case 'file': {\n const { applyFileLocalPreview } = await import('../components/file-picker/file-composer.payload');\n return applyFileLocalPreview(payload, localUrl, mimeType);\n }\n case 'voice': {\n const { applyVoiceLocalPreview } = await import('../components/voice-recorder/voice-composer.payload');\n return applyVoiceLocalPreview(payload, localUrl);\n }\n case 'sticker':\n return { ...(payload as Extract<AXConversationMessagePayload, { type: 'sticker' }>), type: 'sticker', url: localUrl };\n default:\n return payload;\n }\n}\n\nexport function toUploaderReference(payload: AXConversationMessagePayload): AXConversationUploaderReference {\n switch (payload.type) {\n case 'image': {\n const first = payload.images[0];\n return { url: first?.url, mediaId: first?.mediaId, mimeType: first?.mimeType, size: first?.size };\n }\n case 'video': {\n const first = payload.videos[0];\n return { url: first?.url, mediaId: first?.mediaId, mimeType: first?.mimeType, size: first?.size };\n }\n case 'audio': {\n const first = payload.audios[0];\n return { url: first?.url, mediaId: first?.mediaId, mimeType: first?.mimeType, size: first?.size };\n }\n case 'file': {\n const first = payload.files[0];\n return { url: first?.url, mediaId: first?.mediaId, mimeType: first?.mimeType, size: first?.size };\n }\n case 'voice':\n case 'sticker':\n return {\n url: payload.url,\n mediaId: payload.mediaId,\n mimeType: payload.mimeType,\n size: payload.size,\n };\n default:\n return {};\n }\n}\n\nexport function createObjectUrl(platformId: object, blob: Blob): string {\n if (!isPlatformBrowser(platformId)) {\n return '';\n }\n return URL.createObjectURL(blob);\n}\n\nexport function revokeObjectUrl(platformId: object, url: string): void {\n if (isPlatformBrowser(platformId) && url.startsWith('blob:')) {\n URL.revokeObjectURL(url);\n }\n}\n\nexport async function createLocalPreviewUrl(\n fileService: AXFileService,\n platformId: object,\n source: File | Blob,\n messageType: AXConversationMessageType,\n): Promise<string | undefined> {\n const catalog = AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE[messageType];\n if (!catalog) {\n return undefined;\n }\n const fileType = await fileService.getFileType(catalog);\n if (!fileType) {\n return undefined;\n }\n const ctx = { readAsDataUrl: (f: File | Blob) => fileService.blobToBase64(f), platformId };\n const extension = resolveFileTypeExtension(fileType, {\n file: source instanceof File ? source : undefined,\n mimeType: source.type,\n });\n const result = await runFileTypeUtility(fileType, ctx, extension, 'createLocalPreviewUrl', source);\n return typeof result === 'string' ? result : undefined;\n}\n","/**\n * Search Component for Info Bar\n * Provides search functionality within conversations\n */\n\nimport { AXAutoFocusDirective } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, DestroyRef, PLATFORM_ID, ViewEncapsulation, inject, input, signal } from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../components/info-bar/info-bar.service';\nimport type { AXConversation, AXConversationMessage } from '../../../models';\nimport { AXConversationService } from '../../../services/conversation.service';\nimport { AX_CONVERSATION_CONFIG } from '../../../tokens';\n\n@Component({\n selector: 'ax-conversation-info-bar-search',\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, AXAutoFocusDirective, AXSearchBoxComponent, AXButtonComponent, AXLabelComponent, AXTranslationModule],\n templateUrl: './search.component.html',\n styleUrl: './search.component.css',\n})\nexport class AXConversationInfoBarSearchComponent {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n private readonly infoBarService = inject(AXConversationInfoBarService);\n private readonly conversationService = inject(AXConversationService);\n private readonly config = inject(AX_CONVERSATION_CONFIG);\n\n /** Conversation input */\n readonly conversation = input.required<AXConversation>();\n\n /** Service input */\n readonly service = input<AXConversationInfoBarService>();\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 private readonly searchResults = signal<AXConversationMessage[]>([]);\n private searchDebounceTimer?: ReturnType<typeof setTimeout>;\n private scrollTimer?: ReturnType<typeof setTimeout>;\n private searchRequestId = 0;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n if (this.scrollTimer) clearTimeout(this.scrollTimer);\n if (this.searchDebounceTimer) clearTimeout(this.searchDebounceTimer);\n });\n }\n\n /** Handle search input change */\n onSearchChange(value: string): void {\n this.infoBarService.setSearchQuery(value);\n\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n this.searchResults.set([]);\n this.infoBarService.setSearchResults(0, 0);\n return;\n }\n\n this.searchDebounceTimer = setTimeout(() => {\n this.searchDebounceTimer = undefined;\n void this.performSearch(trimmed);\n }, this.config.debounceSearch);\n }\n\n /** Perform server-side search in messages */\n private async performSearch(query: string): Promise<void> {\n const requestId = ++this.searchRequestId;\n\n try {\n const results = await this.conversationService.searchMessages(this.conversation().id, query);\n if (requestId !== this.searchRequestId) {\n return;\n }\n\n this.searchResults.set(results);\n this.infoBarService.setSearchResults(results.length, 0);\n\n if (results.length > 0) {\n this.scrollToResult(results[0].id);\n }\n } catch (error) {\n console.error('Failed to search messages:', error);\n if (requestId === this.searchRequestId) {\n this.searchResults.set([]);\n this.infoBarService.setSearchResults(0, 0);\n }\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 results = this.searchResults();\n const currentIdx = this.currentIndex();\n const message = results[currentIdx];\n if (message) {\n this.scrollToResult(message.id);\n }\n }\n\n private scrollToResult(messageId: string): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n if (this.scrollTimer) clearTimeout(this.scrollTimer);\n this.scrollTimer = 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","<div class=\"search-wrapper\">\n <ax-search-box\n class=\"search-input\"\n [placeholder]=\"'@acorex:chat.placeholders.search-in-conversation' | translate | async\"\n [value]=\"searchQuery()\"\n [axAutoFocus]=\"true\"\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 ax-sm\"\n [text]=\"'↑'\"\n [look]=\"'ghost'\"\n (onClick)=\"onPrevious()\"\n [disabled]=\"resultsCount() === 0\"\n ></ax-button>\n <ax-button\n class=\"nav-button ax-sm\"\n [text]=\"'↓'\"\n [look]=\"'ghost'\"\n (onClick)=\"onNext()\"\n [disabled]=\"resultsCount() === 0\"\n ></ax-button>\n </div>\n }\n</div>\n","/**\n * Info Bar Actions Plugin\n * Individual info bar action constants\n */\n\nimport { inject } from '@angular/core';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { AXConversationInfoBarAction } from '../../../registries';\nimport { AXConversationService } from '../../../services';\nimport { isConversationRoomCreator, isGroupLikeConversation } from '../../../utils/conversation-membership.utils';\n\n/**\n * Search in conversation action (inline on desktop, menu on mobile)\n */\nexport const AX_CONVERSATION_INFO_BAR_SEARCH_ACTION: AXConversationInfoBarAction = {\n id: 'search',\n label: '@acorex:chat.actions.search',\n icon: 'fa-light fa-magnifying-glass',\n tooltip: '@acorex:chat.tooltips.search-in-conversation',\n location: () => (inject(AXPlatform).is('Mobile') ? 'menu' : 'inline'),\n toggleable: true,\n componentLoader: () =>\n import('../components/search.component').then((m) => m.AXConversationInfoBarSearchComponent),\n priority: 200,\n};\n\n/**\n * Mute/Unmute notifications action (menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_MUTE_ACTION: AXConversationInfoBarAction = {\n id: 'mute',\n label: (context) => {\n const notifications = inject(AXConversationService).getRoomPreferences(context.conversation.id).notifications;\n return notifications ? '@acorex:chat.actions.mute' : '@acorex:chat.actions.unmute';\n },\n icon: (context) => {\n const notifications = inject(AXConversationService).getRoomPreferences(context.conversation.id).notifications;\n return notifications ? 'fa-light fa-bell-slash' : 'fa-light fa-bell';\n },\n location: 'menu',\n priority: 90,\n handler: async (context) => {\n const service = inject(AXConversationService);\n const currentNotifications = service.getRoomPreferences(context.conversation.id).notifications;\n await service.updateConversationSettings(context.conversation.id, {\n notifications: !currentNotifications,\n });\n },\n};\n\n/**\n * Divider separator (menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_DIVIDER: AXConversationInfoBarAction = {\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: AXConversationInfoBarAction = {\n id: 'archive',\n label: (context) =>\n context.conversation.archived ? '@acorex:chat.actions.unarchive' : '@acorex:chat.actions.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 await inject(AXConversationService).updateConversation(context.conversation.id, {\n archived: !context.conversation.archived,\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: AXConversationInfoBarAction = {\n id: 'delete',\n label: (context) => {\n if (!isGroupLikeConversation(context.conversation)) {\n return '@acorex:chat.actions.delete';\n }\n const currentUserId = inject(AXConversationService).currentUser()?.id;\n return isConversationRoomCreator(context.conversation, currentUserId)\n ? '@acorex:chat.actions.delete'\n : '@acorex:chat.actions.leave-and-delete';\n },\n icon: (context) => {\n if (!isGroupLikeConversation(context.conversation)) {\n return 'fa-light fa-trash';\n }\n const currentUserId = inject(AXConversationService).currentUser()?.id;\n return isConversationRoomCreator(context.conversation, currentUserId)\n ? 'fa-light fa-trash'\n : 'fa-light fa-door-open';\n },\n location: 'menu',\n priority: 60,\n destructive: true,\n handler: async (context) => {\n const conversationService = inject(AXConversationService);\n // Service handles confirmation dialog\n const result = await conversationService.deleteConversation(context.conversation.id);\n\n // Close the active conversation if it's being deleted/left\n if (conversationService.activeConversation()?.id === context.conversation.id && result) {\n conversationService.closeActiveConversation();\n }\n },\n};\n\n/**\n * Block user action (private chats only, menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_BLOCK_ACTION: AXConversationInfoBarAction = {\n id: 'block',\n label: (context) => (context.conversation.blocked ? '@acorex:chat.actions.unblock' : '@acorex:chat.actions.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 const currentBlocked = context.conversation.blocked;\n await inject(AXConversationService).updateConversation(context.conversation.id, {\n blocked: !currentBlocked,\n });\n },\n};\n","/** Shared formatting for message renderer UIs. */\n\nexport function formatMediaDuration(seconds: number): string {\n if (!Number.isFinite(seconds)) {\n return '0:00';\n }\n const m = Math.floor(seconds / 60);\n const s = Math.floor(seconds % 60);\n return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\nexport function formatFileByteSize(bytes: number): string {\n if (bytes === 0) {\n return '0B';\n }\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'] as const;\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1);\n const value = bytes / k ** i;\n\n if (i === 0) {\n return `${Math.round(value)}B`;\n }\n\n if (i === 1) {\n return `${Math.round(value)}KB`;\n }\n\n return `${value.toFixed(1)}${sizes[i]}`;\n}\n","/**\n * Resolves multimedia payload URLs for renderers (direct url or mediaId via uploader).\n */\n\nimport { DestroyRef, effect, inject, signal, type Signal } from '@angular/core';\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport { isNonPersistableMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport type { AXConversationUploaderReference } from '../../../../models/conversation-upload.types';\n\n/**\n * Creates a signal of the resolved playback URL for a media reference.\n */\nexport function createResolvedMediaUrlSignal(\n reference: Signal<AXConversationUploaderReference | undefined>,\n): Signal<string | null> {\n const uploader = inject(AXUploaderService);\n const destroyRef = inject(DestroyRef);\n const resolvedUrl = signal<string | null>(null);\n\n let abortController: AbortController | null = null;\n let lastResolveKey = '';\n\n effect(() => {\n const ref = reference();\n const trimmedUrl = ref?.url?.trim();\n const resolveKey = `${ref?.mediaId ?? ''}|${trimmedUrl ?? ''}`;\n if (resolveKey === lastResolveKey) {\n return;\n }\n lastResolveKey = resolveKey;\n\n abortController?.abort();\n abortController = new AbortController();\n\n if (!trimmedUrl && !ref?.mediaId) {\n resolvedUrl.set(null);\n return;\n }\n\n const directUrl =\n trimmedUrl && !isNonPersistableMediaUrl(trimmedUrl) ? trimmedUrl : undefined;\n const sessionUrl = trimmedUrl && isNonPersistableMediaUrl(trimmedUrl) ? trimmedUrl : undefined;\n const fallbackUrl = directUrl ?? sessionUrl ?? null;\n\n if (!ref?.mediaId) {\n resolvedUrl.set(fallbackUrl);\n return;\n }\n\n resolvedUrl.set(fallbackUrl);\n\n void uploader\n .resolvePlaybackUrl(ref, abortController.signal)\n .then((url) => {\n if (!abortController?.signal.aborted) {\n resolvedUrl.set(url);\n }\n })\n .catch(() => {\n if (!abortController?.signal.aborted) {\n resolvedUrl.set(fallbackUrl);\n }\n });\n });\n\n destroyRef.onDestroy(() => abortController?.abort());\n\n return resolvedUrl.asReadonly();\n}\n","import type { AXClickEvent } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXRangeSliderModule, type AXRangeSliderValue } from '@acorex/components/range-slider';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n ElementRef,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { AXConversationAudioMediaItem } from '../../../../models';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { toUploaderReference } from './attachment-uploader-reference';\nimport { formatMediaDuration } from './format-media';\nimport { createResolvedMediaUrlSignal } from './media-url-resolve';\n\n@Component({\n selector: 'ax-conversation-audio-attachment',\n imports: [CommonModule, AXButtonComponent, AXRangeSliderModule, AXTranslationModule],\n\n templateUrl: './audio-attachment.component.html',\n styleUrls: ['./audio-attachment.component.css', './file-badge.shared.css'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationAudioAttachmentComponent {\n private readonly platformId = inject(PLATFORM_ID);\n protected readonly translation = inject(AXTranslationService);\n\n readonly item = input.required<AXConversationAudioMediaItem>();\n readonly look = input<'player' | 'file'>('player');\n\n readonly playingChange = output<boolean>();\n readonly timeUpdate = output<number>();\n readonly durationChange = output<number>();\n readonly playbackEnded = output<void>();\n readonly playbackError = output<void>();\n\n private readonly audioElementRef = viewChild<ElementRef<HTMLAudioElement>>('audioElement');\n\n private readonly mediaReference = computed(\n () => toUploaderReference(this.item()),\n {\n equal: (a, b) =>\n a.url === b.url && a.mediaId === b.mediaId && a.mimeType === b.mimeType && a.size === b.size,\n },\n );\n private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n\n readonly isPlaying = signal(false);\n readonly currentTime = signal(0);\n readonly liveDuration = signal(0);\n readonly coverVisible = signal(true);\n\n readonly audioUrl = computed(() => pickDisplayMediaUrl(this.resolvedUrl(), this.item().url));\n readonly title = computed(() => this.item().title?.trim() || this.translation.translateSync('@acorex:chat.audio'));\n readonly coverUrl = computed(() => this.item().coverUrl?.trim() || null);\n readonly duration = computed(() => this.item().duration ?? 0);\n\n readonly effectiveDuration = computed(() => {\n const live = this.liveDuration();\n return live > 0 ? live : this.duration();\n });\n\n readonly sliderMax = computed(() => Math.max(this.effectiveDuration(), 1));\n\n readonly currentTimeLabel = computed(() => formatMediaDuration(this.currentTime()));\n readonly durationLabel = computed(() => formatMediaDuration(this.effectiveDuration()));\n readonly downloadName = computed(() => {\n const title = this.title();\n return title.includes('.') ? title : `${title}.mp3`;\n });\n\n constructor() {\n effect(() => {\n this.coverUrl();\n this.coverVisible.set(true);\n });\n }\n\n togglePlay(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl || !this.audioUrl()) {\n return;\n }\n if (audioEl.paused) {\n void audioEl.play().catch(() => {\n if (this.audioUrl()) {\n this.onError();\n }\n });\n } else {\n audioEl.pause();\n }\n }\n\n onPlayClick(event: AXClickEvent): void {\n event.nativeEvent?.preventDefault();\n event.nativeEvent?.stopPropagation();\n this.togglePlay();\n }\n\n onNativePlayClick(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.togglePlay();\n }\n\n pause(): void {\n this.audioElementRef()?.nativeElement?.pause();\n }\n\n setPlaybackRate(rate: number): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl) {\n audioEl.playbackRate = rate;\n }\n }\n\n setMuted(muted: boolean): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl) {\n audioEl.muted = muted;\n }\n }\n\n onSeek(value: AXRangeSliderValue): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl) {\n return;\n }\n const next = typeof value === 'number' ? value : value?.[0];\n if (next == null || !Number.isFinite(next)) {\n return;\n }\n audioEl.currentTime = next;\n this.currentTime.set(next);\n this.timeUpdate.emit(next);\n }\n\n onPlay(): void {\n this.isPlaying.set(true);\n this.playingChange.emit(true);\n }\n\n onPause(): void {\n this.isPlaying.set(false);\n this.playingChange.emit(false);\n }\n\n onTimeUpdate(): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl) {\n this.currentTime.set(audioEl.currentTime);\n this.timeUpdate.emit(audioEl.currentTime);\n }\n }\n\n onLoadedMetadata(): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl && Number.isFinite(audioEl.duration)) {\n this.liveDuration.set(audioEl.duration);\n this.durationChange.emit(audioEl.duration);\n }\n }\n\n onEnded(): void {\n this.isPlaying.set(false);\n this.currentTime.set(0);\n this.playingChange.emit(false);\n this.playbackEnded.emit();\n }\n\n onError(): void {\n if (!this.audioUrl()) {\n return;\n }\n this.isPlaying.set(false);\n this.playbackError.emit();\n }\n\n onCoverError(): void {\n this.coverVisible.set(false);\n }\n}\n","<div class=\"ax-conversation-audio\" [class.ax-conversation-audio--file]=\"look() === 'file'\">\n <div class=\"ax-conversation-audio__art\">\n @if (look() === 'file') {\n <button\n type=\"button\"\n class=\"ax-conversation-audio__play-btn\"\n [class.ax-conversation-audio__play-btn--active]=\"isPlaying()\"\n [attr.aria-label]=\"\n isPlaying()\n ? translation.translateSync('@acorex:chat.media.pause-audio')\n : translation.translateSync('@acorex:chat.media.play-audio')\n \"\n (click)=\"onNativePlayClick($event)\"\n >\n @if (coverUrl() && coverVisible()) {\n <img\n class=\"ax-conversation-audio__cover\"\n [src]=\"coverUrl()\"\n [alt]=\"title()\"\n loading=\"lazy\"\n (error)=\"onCoverError()\"\n />\n }\n <span class=\"ax-conversation-audio__play-icon\" aria-hidden=\"true\">\n <i class=\"fa-solid\" [class.fa-pause]=\"isPlaying()\" [class.fa-play]=\"!isPlaying()\"></i>\n </span>\n <span class=\"ax-conversation-file__badge-download\" aria-hidden=\"true\">\n <i class=\"fa-light fa-arrow-down-to-line\"></i>\n </span>\n </button>\n } @else {\n <ax-button\n class=\"ax-conversation-audio__play rounded-full\"\n [class.ax-conversation-audio__play--active]=\"isPlaying()\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"\n isPlaying()\n ? translation.translateSync('@acorex:chat.media.pause-audio')\n : translation.translateSync('@acorex:chat.media.play-audio')\n \"\n (onClick)=\"onPlayClick($event)\"\n >\n @if (coverUrl() && coverVisible()) {\n <img\n class=\"ax-conversation-audio__cover\"\n [src]=\"coverUrl()\"\n [alt]=\"title()\"\n loading=\"lazy\"\n (error)=\"onCoverError()\"\n />\n }\n <span class=\"ax-conversation-audio__play-icon\" aria-hidden=\"true\">\n <i class=\"fa-solid\" [class.fa-pause]=\"isPlaying()\" [class.fa-play]=\"!isPlaying()\"></i>\n </span>\n </ax-button>\n @if (audioUrl(); as src) {\n <a\n class=\"ax-conversation-audio__download\"\n [href]=\"src\"\n [download]=\"downloadName()\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-label]=\"translation.translateSync('@acorex:chat.media.download-audio')\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fa-solid fa-arrow-down\" aria-hidden=\"true\"></i>\n </a>\n }\n }\n </div>\n\n @if (look() === 'file') {\n @if (audioUrl(); as src) {\n <a\n class=\"ax-conversation-audio__main\"\n [href]=\"src\"\n [download]=\"downloadName()\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span class=\"ax-conversation-audio__title\">{{ title() }}</span>\n <span class=\"ax-conversation-audio__duration\">{{ durationLabel() }}</span>\n </a>\n } @else {\n <div class=\"ax-conversation-audio__main\">\n <span class=\"ax-conversation-audio__title\">{{ title() }}</span>\n <span class=\"ax-conversation-audio__duration\">{{ durationLabel() }}</span>\n </div>\n }\n } @else {\n <div class=\"ax-conversation-audio__main\">\n <span class=\"ax-conversation-audio__title\">{{ title() }}</span>\n <div class=\"ax-conversation-audio__controls\">\n <span class=\"ax-conversation-audio__time\">{{ currentTimeLabel() }}</span>\n <ax-range-slider\n class=\"ax-conversation-audio__slider ax-sm\"\n [min]=\"0\"\n [max]=\"sliderMax()\"\n [step]=\"0.1\"\n [hasStep]=\"false\"\n [hasTooltip]=\"false\"\n [values]=\"currentTime()\"\n [attr.aria-label]=\"translation.translateSync('@acorex:chat.media.seek', { params: { title: title() } })\"\n [attr.aria-valuetext]=\"currentTimeLabel()\"\n (valuesChange)=\"onSeek($event)\"\n />\n </div>\n </div>\n }\n\n <audio\n #audioElement\n class=\"ax-conversation-audio__el\"\n [src]=\"audioUrl() || null\"\n preload=\"metadata\"\n (play)=\"onPlay()\"\n (pause)=\"onPause()\"\n (timeupdate)=\"onTimeUpdate()\"\n (ended)=\"onEnded()\"\n (loadedmetadata)=\"onLoadedMetadata()\"\n (error)=\"onError()\"\n ></audio>\n</div>\n","export type AXConversationFileVisualKind = 'image' | 'video' | 'audio' | 'file';\n\nconst IMAGE_EXT = new Set(['jpg', 'jpeg', 'png', 'gif', 'webp', 'heic', 'heif', 'bmp', 'svg']);\nconst VIDEO_EXT = new Set(['mp4', 'mov', 'webm', 'mkv', 'avi', 'm4v']);\nconst AUDIO_EXT = new Set(['mp3', 'wav', 'm4a', 'ogg', 'flac', 'aac', 'opus', 'oga']);\n\nfunction extensionOf(fileName?: string): string {\n const name = fileName?.trim() ?? '';\n const dot = name.lastIndexOf('.');\n return dot >= 0 ? name.slice(dot + 1).toLowerCase() : '';\n}\n\nexport function conversationFileVisualKind(\n mimeType?: string | null,\n fileName?: string | null,\n): AXConversationFileVisualKind {\n const mime = (mimeType ?? '').toLowerCase();\n if (mime.startsWith('image/')) return 'image';\n if (mime.startsWith('video/')) return 'video';\n if (mime.startsWith('audio/')) return 'audio';\n\n const ext = extensionOf(fileName ?? undefined);\n if (IMAGE_EXT.has(ext)) return 'image';\n if (VIDEO_EXT.has(ext)) return 'video';\n if (AUDIO_EXT.has(ext)) return 'audio';\n return 'file';\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { Component, computed, ElementRef, inject, input, PLATFORM_ID, viewChild, ViewEncapsulation } from '@angular/core';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport type { AXConversationFileMediaItem } from '../../../../models';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { toUploaderReference } from './attachment-uploader-reference';\nimport { resolveConversationFileExtension } from './file-badge.utils';\nimport { conversationFileVisualKind } from './file-kind';\nimport { formatFileByteSize } from './format-media';\nimport { createResolvedMediaUrlSignal } from './media-url-resolve';\n\n@Component({\n selector: 'ax-conversation-file-attachment',\n imports: [],\n\n templateUrl: './file-attachment.component.html',\n styleUrls: ['./file-attachment.component.css', './file-badge.shared.css'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationFileAttachmentComponent {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT);\n protected readonly translation = inject(AXTranslationService);\n private readonly thumbImage = viewChild<ElementRef<HTMLImageElement>>('thumbImage');\n\n readonly item = input.required<AXConversationFileMediaItem>();\n\n private readonly mediaReference = computed(() => toUploaderReference(this.item()));\n private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n\n readonly fileUrl = computed(() => pickDisplayMediaUrl(this.resolvedUrl(), this.item().url));\n readonly fileName = computed(() => this.item().name || 'file');\n readonly fileSize = computed(() => this.item().size ?? 0);\n readonly fileExtension = computed(() => resolveConversationFileExtension(this.fileName()));\n readonly formattedSize = computed(() => formatFileByteSize(this.fileSize()));\n readonly kind = computed(() => conversationFileVisualKind(this.item().mimeType, this.fileName()));\n readonly isMedia = computed(() => {\n const kind = this.kind();\n return kind === 'image' || kind === 'video';\n });\n readonly thumbUrl = computed(() => {\n const item = this.item();\n if (item.thumbnailUrl?.trim()) {\n return item.thumbnailUrl;\n }\n return this.kind() === 'image' ? this.fileUrl() : '';\n });\n readonly previewSrc = computed(() => this.fileUrl() || this.thumbUrl());\n\n openImage(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const img = this.thumbImage()?.nativeElement;\n if (!(img instanceof HTMLImageElement) || !img.requestFullscreen) {\n return;\n }\n\n if (this.document.fullscreenElement === img) {\n void this.document.exitFullscreen();\n return;\n }\n\n void img.requestFullscreen();\n }\n}\n","<div class=\"ax-conversation-file\" [class.ax-conversation-file--media]=\"isMedia()\">\n @if (kind() === 'image') {\n <button\n type=\"button\"\n class=\"ax-conversation-file__thumb\"\n [attr.aria-label]=\"fileName()\"\n (click)=\"openImage($event)\"\n >\n @if (previewSrc(); as src) {\n <img #thumbImage [src]=\"src\" [alt]=\"fileName()\" />\n } @else {\n <i class=\"fa-light fa-image\" aria-hidden=\"true\"></i>\n }\n <span class=\"ax-conversation-file__badge-download\" aria-hidden=\"true\">\n <i class=\"fa-light fa-arrow-down-to-line\"></i>\n </span>\n </button>\n } @else if (isMedia()) {\n <a\n class=\"ax-conversation-file__thumb\"\n [href]=\"fileUrl()\"\n [download]=\"fileName()\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-label]=\"translation.translateSync('@acorex:chat.media.download-file')\"\n >\n @if (thumbUrl(); as src) {\n <img [src]=\"src\" alt=\"\" />\n } @else if (kind() === 'video' && fileUrl()) {\n <video [src]=\"fileUrl()\" muted playsinline preload=\"metadata\"></video>\n } @else {\n <i class=\"fa-light fa-video\" aria-hidden=\"true\"></i>\n }\n <span class=\"ax-conversation-file__badge-download\" aria-hidden=\"true\">\n <i class=\"fa-light fa-arrow-down-to-line\"></i>\n </span>\n </a>\n } @else {\n <a\n class=\"ax-conversation-file__badge\"\n [href]=\"fileUrl()\"\n [download]=\"fileName()\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span class=\"ax-conversation-file__badge-doc\" aria-hidden=\"true\">\n <span class=\"ax-conversation-file__badge-fold\"></span>\n <span class=\"ax-conversation-file__badge-ext\">{{ fileExtension() }}</span>\n </span>\n <span class=\"ax-conversation-file__badge-download\" aria-hidden=\"true\">\n <i class=\"fa-light fa-arrow-down-to-line\"></i>\n </span>\n </a>\n }\n\n <a\n class=\"ax-conversation-file__body\"\n [href]=\"fileUrl()\"\n [download]=\"fileName()\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span class=\"ax-conversation-file__name\">{{ fileName() }}</span>\n <span class=\"ax-conversation-file__meta\">{{ formattedSize() }}</span>\n </a>\n</div>\n","/** CSS `aspect-ratio` from payload dimensions, or `null` when unknown. */\nexport function cssAspectRatio(width?: number | null, height?: number | null): string | null {\n if (!width || !height || width <= 0 || height <= 0) {\n return null;\n }\n return `${width} / ${height}`;\n}\n","import type { AXClickEvent } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n input,\n PLATFORM_ID,\n signal,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { AXConversationImageMediaItem } from '../../../../models';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { toUploaderReference } from './attachment-uploader-reference';\nimport { cssAspectRatio } from './media-aspect';\nimport { createResolvedMediaUrlSignal } from './media-url-resolve';\n\n@Component({\n selector: 'ax-conversation-image-attachment',\n imports: [AXButtonComponent],\n templateUrl: './image-attachment.component.html',\n styleUrl: './image-attachment.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationImageAttachmentComponent {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT);\n\n readonly item = input.required<AXConversationImageMediaItem>();\n readonly alt = input('Image');\n /** When false, skip aspect-ratio reservation (gallery cells already have a fixed size). */\n readonly reserveAspect = input(true);\n\n readonly ready = signal(false);\n\n readonly aspectRatio = computed(() => (this.reserveAspect() ? cssAspectRatio(this.item().width, this.item().height) : null));\n\n private readonly mediaReference = computed(() => toUploaderReference(this.item()));\n private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n\n readonly displayUrl = computed(() =>\n pickDisplayMediaUrl(this.resolvedUrl(), this.item().thumbnailUrl, this.item().url),\n );\n\n constructor() {\n effect(() => {\n const url = this.displayUrl();\n const mediaId = this.item().mediaId;\n untracked(() => {\n if (!url) {\n this.ready.set(false);\n }\n });\n });\n }\n\n onImageLoad(): void {\n this.ready.set(true);\n }\n\n onImageError(): void {\n this.ready.set(false);\n }\n\n toggleFullscreen(event: AXClickEvent): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const host = event.htmlElement ?? (event.nativeEvent?.currentTarget as HTMLElement | undefined);\n const img = host?.querySelector('img');\n if (!(img instanceof HTMLImageElement) || !img.requestFullscreen) {\n return;\n }\n if (this.document.fullscreenElement === img) {\n void this.document.exitFullscreen();\n return;\n }\n void img.requestFullscreen();\n }\n}\n","<ax-button\n class=\"ax-conversation-image-attachment\"\n [class.ax-conversation-image-attachment--ready]=\"ready()\"\n [class.ax-conversation-image-attachment--loading]=\"!displayUrl()\"\n [class.ax-conversation-image-attachment--sized]=\"!!aspectRatio()\"\n [style.aspect-ratio]=\"aspectRatio()\"\n [style.--ax-media-w]=\"aspectRatio() ? item().width : null\"\n [style.--ax-media-h]=\"aspectRatio() ? item().height : null\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"alt()\"\n (onClick)=\"toggleFullscreen($event)\"\n>\n @if (displayUrl(); as src) {\n <img\n [src]=\"src\"\n [alt]=\"alt()\"\n [attr.width]=\"item().width || null\"\n [attr.height]=\"item().height || null\"\n loading=\"lazy\"\n decoding=\"async\"\n (load)=\"onImageLoad()\"\n (error)=\"onImageError()\"\n />\n }\n</ax-button>\n","import { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageInfoBarBannerComponent } from '../../../../registries/message-renderer.registry';\nimport { formatMediaDuration } from './format-media';\n\nexport interface AXConversationPlaybackBannerInputs {\n title?: string;\n currentTime?: number;\n duration?: number;\n isPlaying?: boolean;\n onTogglePlay?: () => void;\n onClose?: () => void;\n playbackSpeed?: number;\n onCycleSpeed?: () => void;\n showSpeedControl?: boolean;\n isMuted?: boolean;\n onToggleMute?: () => void;\n showMuteControl?: boolean;\n}\n\nconst AX_CONVERSATION_ICON_BY_TYPE: Record<string, string> = {\n video: 'fa-light fa-video',\n audio: 'fa-light fa-music',\n voice: 'fa-light fa-microphone',\n file: 'fa-light fa-music',\n};\n\n@Component({\n selector: 'ax-conversation-media-playback-info-bar-banner',\n imports: [CommonModule, AXButtonComponent, AXDecoratorModule, AXTranslationModule],\n\n templateUrl: './media-playback-info-bar-banner.component.html',\n styleUrl: './media-playback-info-bar-banner.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationMediaPlaybackInfoBarBannerComponent implements AXConversationMessageInfoBarBannerComponent {\n protected readonly translation = inject(AXTranslationService);\n readonly message = input.required<AXConversationMessage>();\n readonly title = input<string>('');\n readonly currentTime = input<number>(0);\n readonly duration = input<number>(0);\n readonly isPlaying = input<boolean>(false);\n readonly onTogglePlay = input<(() => void) | undefined>(undefined);\n readonly playbackSpeed = input<number>(1);\n readonly onCycleSpeed = input<(() => void) | undefined>(undefined);\n readonly showSpeedControl = input<boolean>(false);\n readonly isMuted = input<boolean>(false);\n readonly onToggleMute = input<(() => void) | undefined>(undefined);\n readonly showMuteControl = input<boolean>(false);\n\n readonly iconClass = computed(() => AX_CONVERSATION_ICON_BY_TYPE[this.message().type] ?? 'fa-light fa-circle-play');\n\n readonly resolvedTitle = computed(() => this.title()?.trim() || 'Media');\n\n readonly progressPercent = computed(() => {\n const dur = this.duration();\n if (dur <= 0) {\n return 0;\n }\n return Math.min((Math.max(0, this.currentTime()) / dur) * 100, 100);\n });\n\n readonly timeLabel = computed(() => {\n const current = this.currentTime() || 0;\n const dur = this.duration() || 0;\n return `${formatMediaDuration(current)} / ${formatMediaDuration(dur)}`;\n });\n\n onTogglePlayClick(): void {\n this.onTogglePlay()?.();\n }\n\n onCycleSpeedClick(): void {\n this.onCycleSpeed()?.();\n }\n\n onToggleMuteClick(): void {\n this.onToggleMute()?.();\n }\n}\n","<div class=\"ax-conversation-playback-banner\">\n <div class=\"ax-conversation-playback-banner__row\">\n <ax-button\n class=\"ax-conversation-playback-banner__play ax-lg rounded-full\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"\n isPlaying()\n ? translation.translateSync('@acorex:chat.media.pause')\n : translation.translateSync('@acorex:chat.media.play')\n \"\n (onClick)=\"onTogglePlayClick()\"\n >\n <ax-icon>\n <i class=\"fa-solid\" [class.fa-pause]=\"isPlaying()\" [class.fa-play]=\"!isPlaying()\"></i>\n </ax-icon>\n </ax-button>\n\n <div class=\"ax-conversation-playback-banner__main\">\n <div class=\"ax-conversation-playback-banner__meta-row\">\n <span class=\"ax-conversation-playback-banner__type-icon\" aria-hidden=\"true\">\n <i [class]=\"iconClass()\"></i>\n </span>\n <span class=\"ax-conversation-playback-banner__title\">{{ resolvedTitle() }}</span>\n <span class=\"ax-conversation-playback-banner__time\">{{ timeLabel() }}</span>\n </div>\n <div\n class=\"ax-conversation-playback-banner__track\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"progressPercent()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"timeLabel()\"\n >\n <span class=\"ax-conversation-playback-banner__fill\" [style.width.%]=\"progressPercent()\"></span>\n </div>\n </div>\n\n @if (showMuteControl()) {\n <ax-button\n class=\"ax-conversation-playback-banner__mute ax-sm rounded-full\"\n look=\"outline\"\n [iconOnly]=\"true\"\n [text]=\"\n isMuted()\n ? translation.translateSync('@acorex:chat.media.unmute')\n : translation.translateSync('@acorex:chat.media.mute')\n \"\n (onClick)=\"onToggleMuteClick()\"\n >\n <ax-icon>\n <i class=\"fa-solid\" [class.fa-volume-xmark]=\"isMuted()\" [class.fa-volume-high]=\"!isMuted()\"></i>\n </ax-icon>\n </ax-button>\n }\n\n @if (showSpeedControl()) {\n <ax-button\n class=\"ax-conversation-playback-banner__speed ax-sm rounded-full\"\n look=\"outline\"\n [iconOnly]=\"true\"\n [text]=\"translation.translateSync('@acorex:chat.media.playback-speed', { params: { speed: playbackSpeed() } })\"\n (onClick)=\"onCycleSpeedClick()\"\n >\n {{ playbackSpeed() }}x\n </ax-button>\n }\n </div>\n</div>\n","import type { AXConversationMessageStatus } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\n\nexport function isMessageDeliveryPending(status: AXConversationMessageStatus): boolean {\n return status === 'sending';\n}\n\nexport function canShowRendererContentError(\n status: AXConversationMessageStatus,\n contentState: AXConversationMessageRendererContentState,\n): boolean {\n return contentState === 'error' && !isMessageDeliveryPending(status);\n}\n","import { DestroyRef, effect, inject, type WritableSignal } from '@angular/core';\nimport type { InputSignal } from '@angular/core';\nimport type { AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { isMessageDeliveryPending } from './message-renderer-state.helpers';\n\n/**\n * Keeps media renderers from showing load errors while a message is still uploading.\n */\nexport function bindMediaRendererContentState(\n message: InputSignal<AXConversationMessage>,\n contentState: WritableSignal<AXConversationMessageRendererContentState>,\n mediaVersion: () => unknown,\n): void {\n const destroyRef = inject(DestroyRef);\n\n const stopSendingGuard = effect(() => {\n if (isMessageDeliveryPending(message().status)) {\n contentState.set('ready');\n }\n });\n\n const stopMediaReset = effect(() => {\n message().id;\n mediaVersion();\n contentState.set('ready');\n });\n\n destroyRef.onDestroy(() => {\n stopSendingGuard.destroy();\n stopMediaReset.destroy();\n });\n}\n\nexport function reportMediaLoadError(\n message: AXConversationMessage,\n contentState: WritableSignal<AXConversationMessageRendererContentState>,\n): boolean {\n if (isMessageDeliveryPending(message.status)) {\n return false;\n }\n contentState.set('error');\n return true;\n}\n","import { effect, inject, type InputSignal, type Signal } from '@angular/core';\nimport { AXConversationMessageListService } from '../../../../components/message-list/message-list.service';\nimport type { AXConversationMessage } from '../../../../models';\nimport type {\n AXConversationMessageRendererComponent,\n AXConversationMessageRendererState,\n} from '../../../../registries/message-renderer.registry';\n\n/** Caption first, else a label with optional extra lines (URLs, names). */\nexport function mediaCopyText(\n caption: string | undefined,\n singleLabel: string,\n pluralLabel: string,\n count: number,\n lines: (string | undefined)[],\n): string {\n const trimmedCaption = caption?.trim();\n if (trimmedCaption) {\n return trimmedCaption;\n }\n const header = count > 1 ? `${count} ${pluralLabel}` : singleLabel;\n const extras = lines.map((line) => line?.trim()).filter((line): line is string => !!line);\n return extras.length ? `${header}\\n${extras.join('\\n')}` : header;\n}\n\n/**\n * Registers the live renderer on {@link AXConversationMessageListService} for message actions.\n */\nexport abstract class AXConversationMessageRendererCopyHostComponent implements AXConversationMessageRendererComponent {\n abstract readonly message: InputSignal<AXConversationMessage>;\n abstract readonly rendererState: Signal<AXConversationMessageRendererState>;\n abstract copy(): string | Promise<string>;\n\n private readonly messageList = inject(AXConversationMessageListService, { optional: true });\n\n constructor() {\n effect((onCleanup) => {\n const list = this.messageList;\n if (!list) {\n return;\n }\n const id = this.message().id;\n list.registerRendererInstance(id, this);\n onCleanup(() => list.unregisterRendererInstance(id));\n });\n }\n}\n","import { AXButtonComponent } from '@acorex/components/button';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, output, signal, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageRendererState } from '../../../../registries/message-renderer.registry';\nimport { AXConversationService } from '../../../../services';\nimport { AXConversationMessageUtilsService } from '../../../../utils/message-utils.service';\nimport { canShowRendererContentError } from './message-renderer-state.helpers';\n\n/**\n * Shared UI for message bubble bodies: failed delivery (with retry) and content load errors.\n * Sending state is shown in the message-list footer only — not here (avoids layout glitch in media bubbles).\n */\n@Component({\n selector: 'ax-conversation-message-renderer-state',\n imports: [CommonModule, AXButtonComponent, AXTranslationModule],\n\n templateUrl: './message-renderer-state.component.html',\n styleUrl: './message-renderer-state.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationMessageRendererStateComponent {\n private readonly conversation = inject(AXConversationService, { optional: true });\n readonly translation = inject(AXTranslationService);\n\n readonly rendererState = input.required<AXConversationMessageRendererState>();\n readonly message = input.required<AXConversationMessage>();\n\n readonly contentErrorLabel = input<string | undefined>(undefined);\n readonly deliveryFailedLabel = input<string | undefined>(undefined);\n readonly showContentErrorChrome = input(true);\n readonly contentErrorStyle = input<'banner' | 'inline'>('banner');\n readonly contentErrorIconClass = input<string | undefined>(undefined);\n readonly placement = input<'above' | 'below'>('above');\n\n readonly contentRetryEnabled = input(false);\n readonly contentRetry = output<void>();\n\n readonly retryBusy = signal(false);\n\n private readonly currentUser = computed(() => this.conversation?.currentUser());\n\n readonly isOwn = computed(() => {\n const msg = this.message();\n const user = this.currentUser();\n if (!user) {\n return false;\n }\n return AXConversationMessageUtilsService.isOwnMessage(msg, user.id);\n });\n\n readonly showFailed = computed(() => this.rendererState().deliveryStatus === 'failed' && this.isOwn());\n\n readonly showContentError = computed(() => {\n const { contentState } = this.rendererState();\n return this.showContentErrorChrome() && canShowRendererContentError(this.message().status, contentState);\n });\n\n readonly hasVisibleChrome = computed(() => this.showFailed() || this.showContentError());\n\n readonly resolvedContentErrorIconClass = computed(\n () => this.contentErrorIconClass() ?? 'fa-light fa-triangle-exclamation',\n );\n\n readonly contentErrorText = computed(\n () =>\n this.contentErrorLabel() ?? this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-content'),\n );\n\n readonly deliveryFailedText = computed(\n () =>\n this.deliveryFailedLabel() ??\n this.translation.translateSync('@acorex:chat.renderer-state.could-not-send-message'),\n );\n\n async onRetry(): Promise<void> {\n const msg = this.message();\n if (!this.conversation) {\n return;\n }\n this.retryBusy.set(true);\n try {\n await this.conversation.retryFailedMessage(msg.id);\n } finally {\n this.retryBusy.set(false);\n }\n }\n}\n","@if (hasVisibleChrome()) {\n <div\n class=\"ax-conversation-renderer-state\"\n [class.ax-conversation-renderer-state--below]=\"placement() === 'below'\"\n [class.ax-conversation-renderer-state--own]=\"isOwn()\"\n role=\"region\"\n [attr.aria-label]=\"'@acorex:chat.renderer-state.message-status' | translate | async\"\n >\n @if (showFailed()) {\n <div class=\"ax-conversation-renderer-state__row ax-conversation-renderer-state__row--danger\" role=\"alert\">\n <i class=\"fa-light fa-triangle-exclamation ax-conversation-renderer-state__ico\" aria-hidden=\"true\"></i>\n <span class=\"ax-conversation-renderer-state__msg\">{{ deliveryFailedText() }}</span>\n <ax-button\n class=\"ax-conversation-renderer-state__retry ax-sm\"\n [text]=\"translation.translateSync('@acorex:chat.renderer-state.retry')\"\n [look]=\"'outline'\"\n [disabled]=\"retryBusy()\"\n (onClick)=\"onRetry()\"\n />\n </div>\n }\n @if (showContentError()) {\n <div\n class=\"ax-conversation-renderer-state__content-err ax-conversation-renderer-state__row ax-conversation-renderer-state__row--warn\"\n [class.ax-conversation-renderer-state__content-err--inline]=\"contentErrorStyle() === 'inline'\"\n role=\"alert\"\n >\n <i\n [class]=\"resolvedContentErrorIconClass() + ' ax-conversation-renderer-state__ico'\"\n aria-hidden=\"true\"\n ></i>\n <span class=\"ax-conversation-renderer-state__msg\">{{ contentErrorText() }}</span>\n @if (contentRetryEnabled()) {\n <ax-button\n class=\"ax-conversation-renderer-state__retry ax-sm\"\n [text]=\"translation.translateSync('@acorex:chat.renderer-state.try-again')\"\n [look]=\"'outline'\"\n (onClick)=\"contentRetry.emit()\"\n />\n }\n </div>\n }\n </div>\n}\n","import type { AXConversationMessage } from '../../../../models';\nimport type { AXConversationInfoBarService } from '../../../../components/info-bar/info-bar.service';\nimport type { AXConversationPlaybackBannerInputs } from './media-playback-info-bar-banner.component';\n\nfunction buildPlaybackBannerPayload(inputs: AXConversationPlaybackBannerInputs): Record<string, unknown> {\n const payload: Record<string, unknown> = {\n title: inputs.title,\n currentTime: inputs.currentTime ?? 0,\n duration: inputs.duration ?? 0,\n isPlaying: inputs.isPlaying ?? false,\n onTogglePlay: inputs.onTogglePlay,\n onClose: inputs.onClose,\n };\n\n if (inputs.playbackSpeed !== undefined) {\n payload['playbackSpeed'] = inputs.playbackSpeed;\n }\n if (inputs.onCycleSpeed) {\n payload['onCycleSpeed'] = inputs.onCycleSpeed;\n }\n if (inputs.showSpeedControl !== undefined) {\n payload['showSpeedControl'] = inputs.showSpeedControl;\n }\n if (inputs.isMuted !== undefined) {\n payload['isMuted'] = inputs.isMuted;\n }\n if (inputs.onToggleMute) {\n payload['onToggleMute'] = inputs.onToggleMute;\n }\n if (inputs.showMuteControl !== undefined) {\n payload['showMuteControl'] = inputs.showMuteControl;\n }\n\n return payload;\n}\n\n/** Push playback state to the info-bar banner for a message. */\nexport function syncPlaybackInfoBarBanner(\n infoBar: AXConversationInfoBarService,\n message: AXConversationMessage,\n inputs: AXConversationPlaybackBannerInputs,\n options?: { forceOpen?: boolean },\n): void {\n const forceOpen = options?.forceOpen ?? false;\n const shouldOpen =\n forceOpen || inputs.isPlaying || infoBar.isMessageBannerActive(message.id);\n\n if (!shouldOpen) {\n return;\n }\n\n const payload = buildPlaybackBannerPayload(inputs);\n\n if (infoBar.isMessageBannerActive(message.id)) {\n infoBar.updateMessageBannerInputs(message.id, payload);\n return;\n }\n\n infoBar.showMessageBanner(message, payload);\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, ElementRef, input, output, viewChild, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationVideoMediaItem } from '../../../../models';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { toUploaderReference } from './attachment-uploader-reference';\nimport { formatMediaDuration } from './format-media';\nimport { cssAspectRatio } from './media-aspect';\nimport { createResolvedMediaUrlSignal } from './media-url-resolve';\n\n@Component({\n selector: 'ax-conversation-video-attachment',\n imports: [CommonModule],\n\n templateUrl: './video-attachment.component.html',\n styleUrl: './video-attachment.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationVideoAttachmentComponent {\n readonly item = input.required<AXConversationVideoMediaItem>();\n /** When false, skip aspect-ratio reservation (gallery cells already have a fixed size). */\n readonly reserveAspect = input(true);\n\n readonly playingChange = output<boolean>();\n readonly timeUpdate = output<number>();\n readonly durationChange = output<number>();\n readonly playbackEnded = output<void>();\n\n readonly playbackError = output<void>();\n\n private readonly videoElementRef = viewChild<ElementRef<HTMLVideoElement>>('videoEl');\n\n private readonly playbackReference = computed(() => toUploaderReference(this.item()));\n private readonly resolvedPlaybackUrl = createResolvedMediaUrlSignal(this.playbackReference);\n\n readonly playbackUrl = computed(() =>\n pickDisplayMediaUrl(this.resolvedPlaybackUrl(), this.item().url, this.item().thumbnailUrl),\n );\n readonly duration = computed(() => this.item().duration ?? 0);\n readonly durationLabel = computed(() => formatMediaDuration(this.duration()));\n readonly aspectRatio = computed(() => (this.reserveAspect() ? cssAspectRatio(this.item().width, this.item().height) : null));\n\n togglePlay(): void {\n const el = this.videoElementRef()?.nativeElement;\n if (!el) {\n return;\n }\n if (el.paused) {\n void el.play();\n } else {\n el.pause();\n }\n }\n\n pause(): void {\n this.videoElementRef()?.nativeElement?.pause();\n }\n\n onLoadedMetadata(): void {\n const el = this.videoElementRef()?.nativeElement;\n if (el && Number.isFinite(el.duration)) {\n this.durationChange.emit(el.duration);\n }\n }\n\n onTimeUpdate(): void {\n const el = this.videoElementRef()?.nativeElement;\n if (el) {\n this.timeUpdate.emit(el.currentTime);\n }\n }\n\n onPlay(): void {\n this.playingChange.emit(true);\n }\n\n onPause(): void {\n this.playingChange.emit(false);\n }\n\n onEnded(): void {\n this.playingChange.emit(false);\n this.playbackEnded.emit();\n }\n\n onError(): void {\n this.playbackError.emit();\n }\n}\n","<div\n class=\"ax-conversation-video\"\n [class.ax-conversation-video--sized]=\"!!aspectRatio()\"\n [style.aspect-ratio]=\"aspectRatio()\"\n [style.--ax-media-w]=\"aspectRatio() ? item().width : null\"\n [style.--ax-media-h]=\"aspectRatio() ? item().height : null\"\n>\n <video\n #videoEl\n class=\"ax-conversation-video__player\"\n [src]=\"playbackUrl() || null\"\n controls\n playsinline\n preload=\"metadata\"\n (loadedmetadata)=\"onLoadedMetadata()\"\n (timeupdate)=\"onTimeUpdate()\"\n (play)=\"onPlay()\"\n (pause)=\"onPause()\"\n (ended)=\"onEnded()\"\n (error)=\"onError()\"\n ></video>\n</div>\n","import { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, inject, input, output, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'ax-conversation-media-playback-inline-controls',\n imports: [CommonModule, AXTranslationModule],\n templateUrl: './media-playback-inline-controls.component.html',\n styleUrl: './media-playback-inline-controls.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationMediaPlaybackInlineControlsComponent {\n protected readonly translation = inject(AXTranslationService);\n readonly playbackSpeed = input<number>(1);\n readonly isMuted = input<boolean>(false);\n\n readonly cycleSpeed = output<void>();\n readonly toggleMute = output<void>();\n\n onCycleSpeedClick(): void {\n this.cycleSpeed.emit();\n }\n\n onToggleMuteClick(): void {\n this.toggleMute.emit();\n }\n}\n","<div class=\"ax-conversation-playback-inline-controls\">\n <button\n type=\"button\"\n class=\"ax-conversation-playback-inline-controls__mute\"\n (click)=\"onToggleMuteClick()\"\n [attr.aria-label]=\"\n isMuted()\n ? translation.translateSync('@acorex:chat.media.unmute')\n : translation.translateSync('@acorex:chat.media.mute')\n \"\n >\n <i class=\"fa-solid\" [class.fa-volume-xmark]=\"isMuted()\" [class.fa-volume-high]=\"!isMuted()\"></i>\n </button>\n <button\n type=\"button\"\n class=\"ax-conversation-playback-inline-controls__speed\"\n (click)=\"onCycleSpeedClick()\"\n [attr.aria-label]=\"\n translation.translateSync('@acorex:chat.media.playback-speed', { params: { speed: playbackSpeed() } })\n \"\n >\n {{ playbackSpeed() }}x\n </button>\n</div>\n","import { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, computed, inject, input, signal, viewChildren, ViewEncapsulation } from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationAudioPayload, AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { AXConversationAudioAttachmentComponent } from '../shared/audio-attachment.component';\nimport { bindMediaRendererContentState, reportMediaLoadError } from '../shared/media-renderer-content-state';\nimport {\n AXConversationMessageRendererCopyHostComponent,\n mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { AXConversationMediaPlaybackInlineControlsComponent } from '../shared/media-playback-inline-controls.component';\nimport { syncPlaybackInfoBarBanner } from '../shared/playback-banner-sync';\nimport { normalizeAudioPayload } from './audio.payload';\n\n@Component({\n selector: 'ax-conversation-audio-renderer',\n imports: [CommonModule, AXConversationAudioAttachmentComponent, AXConversationMessageRendererStateComponent, AXConversationMediaPlaybackInlineControlsComponent],\n\n templateUrl: './audio-renderer.component.html',\n styleUrls: ['../shared/renderer-shared.css'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationAudioRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n private readonly fileTypes = inject(AXFileTypeRegistryService);\n private readonly translation = inject(AXTranslationService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly infoBarService = inject(AXConversationInfoBarService, { optional: true });\n private readonly attachments = viewChildren(AXConversationAudioAttachmentComponent);\n\n private readonly _contentState = signal<AXConversationMessageRendererContentState>('ready');\n private readonly activeTrackIndex = signal(0);\n private readonly isPlaying = signal(false);\n private readonly currentTime = signal(0);\n private readonly duration = signal(0);\n readonly playbackSpeed = signal(1);\n readonly isMuted = signal(false);\n private lastBannerSyncAt = 0;\n\n private readonly speeds = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] as const;\n\n private readonly bannerTogglePlay = (): void => this.togglePlay();\n private readonly bannerClose = (): void => this.pausePlayback();\n private readonly bannerCycleSpeed = (): void => this.cyclePlaybackSpeed();\n private readonly bannerToggleMute = (): void => this.toggleMute();\n\n readonly message = input.required<AXConversationMessage>();\n readonly rendererState = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: this._contentState(),\n }));\n\n readonly payload = computed(() => normalizeAudioPayload(this.message().payload as AXConversationAudioPayload));\n readonly audios = computed(() => this.payload().audios);\n readonly caption = computed(() => this.payload().caption?.trim() || '');\n\n readonly audioLoadErrorLabel = computed(() =>\n this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-audio'),\n );\n\n copy(): Promise<string> {\n return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n const p = this.payload();\n return mediaCopyText(\n p.caption,\n this.translation.translateSync('@acorex:chat.audio'),\n this.translation.translateSync('@acorex:chat.media.audio-files'),\n p.audios.length,\n p.audios.map((item) => item.title?.trim() || item.url?.trim()),\n );\n });\n }\n\n constructor() {\n super();\n bindMediaRendererContentState(this.message, this._contentState, () => this.audios());\n\n this.destroyRef.onDestroy(() => {\n const messageId = this.message()?.id;\n if (messageId && this.infoBarService) {\n this.infoBarService.hideMessageBanner(messageId);\n }\n });\n }\n\n onPlayingChange(index: number, playing: boolean): void {\n if (playing) {\n this.activeTrackIndex.set(index);\n this.pauseOtherTracks(index);\n this.isPlaying.set(true);\n this.applyPlaybackSettings();\n this.syncInfoBarBanner(true, true);\n return;\n }\n\n if (this.activeTrackIndex() === index) {\n this.isPlaying.set(false);\n this.syncInfoBarBanner(false, true);\n }\n }\n\n onTimeUpdate(index: number, time: number): void {\n if (this.activeTrackIndex() !== index) {\n return;\n }\n this.currentTime.set(time);\n this.syncInfoBarBanner();\n }\n\n onDurationChange(index: number, duration: number): void {\n if (this.activeTrackIndex() !== index) {\n return;\n }\n this.duration.set(duration);\n this.syncInfoBarBanner(false, true);\n }\n\n onPlaybackEnded(index: number): void {\n if (this.activeTrackIndex() !== index) {\n return;\n }\n this.isPlaying.set(false);\n this.currentTime.set(0);\n this.syncInfoBarBanner(false, true);\n }\n\n onPlaybackError(): void {\n if (!reportMediaLoadError(this.message(), this._contentState)) {\n return;\n }\n this.isPlaying.set(false);\n this.infoBarService?.hideMessageBanner(this.message().id);\n }\n\n togglePlay(): void {\n this.attachments()[this.activeTrackIndex()]?.togglePlay();\n }\n\n cyclePlaybackSpeed(): void {\n const current = this.playbackSpeed();\n const i = this.speeds.findIndex((s) => s === current);\n const nextIndex = (i < 0 ? 2 : i + 1) % this.speeds.length;\n const next = this.speeds[nextIndex] ?? 1;\n this.playbackSpeed.set(next);\n this.applyPlaybackSettings();\n this.syncInfoBarBanner(false, true);\n }\n\n toggleMute(): void {\n this.isMuted.update((muted) => !muted);\n this.applyPlaybackSettings();\n this.syncInfoBarBanner(false, true);\n }\n\n private pauseOtherTracks(activeIndex: number): void {\n this.attachments().forEach((attachment, index) => {\n if (index !== activeIndex) {\n attachment.pause();\n }\n });\n }\n\n private pausePlayback(): void {\n this.attachments()[this.activeTrackIndex()]?.pause();\n this.isPlaying.set(false);\n }\n\n private applyPlaybackSettings(): void {\n const attachment = this.attachments()[this.activeTrackIndex()];\n if (!attachment) {\n return;\n }\n attachment.setPlaybackRate(this.playbackSpeed());\n attachment.setMuted(this.isMuted());\n }\n\n private syncInfoBarBanner(forceOpen = false, forceSync = false): void {\n if (!this.infoBarService) {\n return;\n }\n\n if (!forceOpen && !forceSync) {\n const now = performance.now();\n if (now - this.lastBannerSyncAt < 250) {\n return;\n }\n this.lastBannerSyncAt = now;\n } else {\n this.lastBannerSyncAt = performance.now();\n }\n\n const message = this.message();\n const track = this.audios()[this.activeTrackIndex()];\n const title = this.payload().caption?.trim() || track?.title?.trim() || 'Audio';\n\n syncPlaybackInfoBarBanner(\n this.infoBarService,\n message,\n {\n title,\n currentTime: this.currentTime(),\n duration: this.duration() || track?.duration || 0,\n isPlaying: this.isPlaying(),\n onTogglePlay: this.bannerTogglePlay,\n onClose: this.bannerClose,\n playbackSpeed: this.playbackSpeed(),\n onCycleSpeed: this.bannerCycleSpeed,\n showSpeedControl: true,\n isMuted: this.isMuted(),\n onToggleMute: this.bannerToggleMute,\n showMuteControl: true,\n },\n { forceOpen },\n );\n }\n}\n","<div class=\"ax-conversation-msg ax-conversation-msg--wide\">\n <div class=\"ax-conversation-msg__media\">\n <div class=\"ax-conversation-msg__stack\">\n @for (audio of audios(); track audio.mediaId ?? audio.url; let i = $index) {\n <ax-conversation-audio-attachment\n [item]=\"audio\"\n (playingChange)=\"onPlayingChange(i, $event)\"\n (timeUpdate)=\"onTimeUpdate(i, $event)\"\n (durationChange)=\"onDurationChange(i, $event)\"\n (playbackEnded)=\"onPlaybackEnded(i)\"\n (playbackError)=\"onPlaybackError()\"\n />\n }\n </div>\n <div class=\"ax-conversation-msg__playback-toolbar\">\n <ax-conversation-media-playback-inline-controls\n [playbackSpeed]=\"playbackSpeed()\"\n [isMuted]=\"isMuted()\"\n (cycleSpeed)=\"cyclePlaybackSpeed()\"\n (toggleMute)=\"toggleMute()\"\n />\n </div>\n </div>\n @if (caption()) {\n <p class=\"ax-conversation-msg__caption\">{{ caption() }}</p>\n }\n <ax-conversation-message-renderer-state\n [rendererState]=\"rendererState()\"\n [message]=\"message()\"\n [contentErrorLabel]=\"audioLoadErrorLabel()\"\n contentErrorIconClass=\"fa-light fa-music\"\n placement=\"below\"\n />\n</div>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, signal, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationMessage } from '../../../../models';\nimport type {\n AXConversationMessageRendererComponent,\n AXConversationMessageRendererContentState,\n} from '../../../../registries/message-renderer.registry';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\n\n@Component({\n selector: 'ax-conversation-fallback-renderer',\n imports: [CommonModule, AXConversationMessageRendererStateComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './fallback-renderer.component.html',\n styleUrl: './fallback-renderer.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationFallbackRendererComponent implements AXConversationMessageRendererComponent {\n private readonly _contentState = signal<AXConversationMessageRendererContentState>('none');\n\n readonly message = input.required<AXConversationMessage>();\n readonly rendererState = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: this._contentState(),\n }));\n\n readonly messageTypeLabel = computed(() => this.message().type.replace(/_/g, ' '));\n\n /** Same tone as content-error default in {@link AXConversationMessageRendererStateComponent}. */\n readonly fallbackDescription = computed(() => {\n const label = this.messageTypeLabel();\n return `Couldn't load this message (${label}).`;\n });\n}\n","<div class=\"ax-conversation-fallback\">\n <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n <div class=\"ax-conversation-renderer-state__row ax-conversation-renderer-state__row--warn\" role=\"alert\">\n <span class=\"ax-conversation-renderer-state__msg\">{{ fallbackDescription() }}</span>\n </div>\n</div>\n","import { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, computed, inject, input, signal, viewChildren, ViewEncapsulation } from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationFileMediaItem, AXConversationFilePayload, AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { AXConversationAudioAttachmentComponent } from '../shared/audio-attachment.component';\nimport { AXConversationFileAttachmentComponent } from '../shared/file-attachment.component';\nimport { conversationFileVisualKind } from '../shared/file-kind';\nimport {\n AXConversationMessageRendererCopyHostComponent,\n mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { syncPlaybackInfoBarBanner } from '../shared/playback-banner-sync';\nimport { fileItemAsAudioMedia, normalizeFilePayload } from './file.payload';\n\n@Component({\n selector: 'ax-conversation-file-renderer',\n imports: [\n CommonModule,\n AXConversationAudioAttachmentComponent,\n AXConversationFileAttachmentComponent,\n AXConversationMessageRendererStateComponent,\n ],\n\n templateUrl: './file-renderer.component.html',\n styleUrls: ['../shared/renderer-shared.css'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationFileRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n private readonly fileTypes = inject(AXFileTypeRegistryService);\n private readonly translation = inject(AXTranslationService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly infoBarService = inject(AXConversationInfoBarService, { optional: true });\n private readonly audioAttachments = viewChildren(AXConversationAudioAttachmentComponent);\n\n private readonly _contentState = signal<AXConversationMessageRendererContentState>('ready');\n private readonly activeTrackIndex = signal(0);\n private readonly isPlaying = signal(false);\n private readonly currentTime = signal(0);\n private readonly duration = signal(0);\n readonly playbackSpeed = signal(1);\n readonly isMuted = signal(false);\n private lastBannerSyncAt = 0;\n\n private readonly speeds = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] as const;\n private readonly bannerTogglePlay = (): void => this.togglePlay();\n private readonly bannerClose = (): void => this.pausePlayback();\n private readonly bannerCycleSpeed = (): void => this.cyclePlaybackSpeed();\n private readonly bannerToggleMute = (): void => this.toggleMute();\n\n readonly message = input.required<AXConversationMessage>();\n readonly rendererState = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: this._contentState(),\n }));\n\n readonly payload = computed(() => normalizeFilePayload(this.message().payload as AXConversationFilePayload));\n readonly files = computed(() => this.payload().files);\n readonly caption = computed(() => this.payload().caption?.trim() || '');\n readonly fileRows = computed(() => {\n let trackIndex = 0;\n return this.files().map((file) => {\n const isAudio = conversationFileVisualKind(file.mimeType, file.name) === 'audio';\n return {\n file,\n isAudio,\n audio: isAudio ? fileItemAsAudioMedia(file) : null,\n trackIndex: isAudio ? trackIndex++ : -1,\n };\n });\n });\n\n copy(): Promise<string> {\n return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n const p = this.payload();\n if (p.files.length === 1) {\n const file = p.files[0];\n const name = file.name?.trim() || this.translation.translateSync('@acorex:chat.file');\n const url = file.url?.trim();\n return url ? `${name}\\n${url}` : name;\n }\n return mediaCopyText(\n p.caption,\n this.translation.translateSync('@acorex:chat.file'),\n this.translation.translateSync('@acorex:chat.media.files'),\n p.files.length,\n p.files.map((file) => file.name?.trim() || file.url?.trim()),\n );\n });\n }\n\n constructor() {\n super();\n this.destroyRef.onDestroy(() => {\n const messageId = this.message()?.id;\n if (messageId && this.infoBarService) {\n this.infoBarService.hideMessageBanner(messageId);\n }\n });\n }\n\n isAudioFile(file: AXConversationFileMediaItem): boolean {\n return conversationFileVisualKind(file.mimeType, file.name) === 'audio';\n }\n\n onPlayingChange(trackIndex: number, playing: boolean): void {\n if (playing) {\n this.activeTrackIndex.set(trackIndex);\n this.pauseOtherTracks(trackIndex);\n this.isPlaying.set(true);\n this.applyPlaybackSettings();\n this.syncInfoBarBanner(true, true);\n return;\n }\n\n if (this.activeTrackIndex() === trackIndex) {\n this.isPlaying.set(false);\n this.syncInfoBarBanner(false, true);\n }\n }\n\n onTimeUpdate(trackIndex: number, time: number): void {\n if (this.activeTrackIndex() !== trackIndex) {\n return;\n }\n this.currentTime.set(time);\n this.syncInfoBarBanner();\n }\n\n onDurationChange(trackIndex: number, duration: number): void {\n if (this.activeTrackIndex() !== trackIndex) {\n return;\n }\n this.duration.set(duration);\n this.syncInfoBarBanner(false, true);\n }\n\n onPlaybackEnded(trackIndex: number): void {\n if (this.activeTrackIndex() !== trackIndex) {\n return;\n }\n this.isPlaying.set(false);\n this.currentTime.set(0);\n this.syncInfoBarBanner(false, true);\n }\n\n onPlaybackError(): void {\n this.isPlaying.set(false);\n this.infoBarService?.hideMessageBanner(this.message().id);\n }\n\n togglePlay(): void {\n this.audioAttachments()[this.activeTrackIndex()]?.togglePlay();\n }\n\n cyclePlaybackSpeed(): void {\n const current = this.playbackSpeed();\n const i = this.speeds.findIndex((s) => s === current);\n const nextIndex = (i < 0 ? 2 : i + 1) % this.speeds.length;\n const next = this.speeds[nextIndex] ?? 1;\n this.playbackSpeed.set(next);\n this.applyPlaybackSettings();\n this.syncInfoBarBanner(false, true);\n }\n\n toggleMute(): void {\n this.isMuted.update((muted) => !muted);\n this.applyPlaybackSettings();\n this.syncInfoBarBanner(false, true);\n }\n\n private pauseOtherTracks(activeIndex: number): void {\n this.audioAttachments().forEach((attachment, index) => {\n if (index !== activeIndex) {\n attachment.pause();\n }\n });\n }\n\n private pausePlayback(): void {\n this.audioAttachments()[this.activeTrackIndex()]?.pause();\n this.isPlaying.set(false);\n }\n\n private applyPlaybackSettings(): void {\n const attachment = this.audioAttachments()[this.activeTrackIndex()];\n if (!attachment) {\n return;\n }\n attachment.setPlaybackRate(this.playbackSpeed());\n attachment.setMuted(this.isMuted());\n }\n\n private syncInfoBarBanner(forceOpen = false, forceSync = false): void {\n if (!this.infoBarService) {\n return;\n }\n\n if (!forceOpen && !forceSync) {\n const now = performance.now();\n if (now - this.lastBannerSyncAt < 250) {\n return;\n }\n this.lastBannerSyncAt = now;\n } else {\n this.lastBannerSyncAt = performance.now();\n }\n\n const message = this.message();\n const track = this.files().filter((file) => this.isAudioFile(file))[this.activeTrackIndex()];\n const title = this.payload().caption?.trim() || track?.name?.trim() || this.translation.translateSync('@acorex:chat.audio');\n\n syncPlaybackInfoBarBanner(\n this.infoBarService,\n message,\n {\n title,\n currentTime: this.currentTime(),\n duration: this.duration() || track?.duration || 0,\n isPlaying: this.isPlaying(),\n onTogglePlay: this.bannerTogglePlay,\n onClose: this.bannerClose,\n playbackSpeed: this.playbackSpeed(),\n onCycleSpeed: this.bannerCycleSpeed,\n showSpeedControl: true,\n isMuted: this.isMuted(),\n onToggleMute: this.bannerToggleMute,\n showMuteControl: true,\n },\n { forceOpen },\n );\n }\n}\n","<div class=\"ax-conversation-msg ax-conversation-msg--wide\">\n <div class=\"ax-conversation-msg__stack\">\n @for (row of fileRows(); track row.file.mediaId ?? row.file.url ?? row.file.name) {\n @if (row.isAudio && row.audio) {\n <ax-conversation-audio-attachment\n look=\"file\"\n [item]=\"row.audio\"\n (playingChange)=\"onPlayingChange(row.trackIndex, $event)\"\n (timeUpdate)=\"onTimeUpdate(row.trackIndex, $event)\"\n (durationChange)=\"onDurationChange(row.trackIndex, $event)\"\n (playbackEnded)=\"onPlaybackEnded(row.trackIndex)\"\n (playbackError)=\"onPlaybackError()\"\n />\n } @else {\n <ax-conversation-file-attachment [item]=\"row.file\" />\n }\n }\n </div>\n @if (caption()) {\n <p class=\"ax-conversation-msg__caption\">{{ caption() }}</p>\n }\n <ax-conversation-message-renderer-state\n [rendererState]=\"rendererState()\"\n [message]=\"message()\"\n contentErrorIconClass=\"fa-light fa-file\"\n placement=\"below\"\n />\n</div>\n","import { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationImagePayload, AXConversationMessage } from '../../../../models';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { AXConversationImageAttachmentComponent } from '../shared/image-attachment.component';\nimport {\n AXConversationMessageRendererCopyHostComponent,\n mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { getMediaGalleryLayoutMode, partitionMediaIntoGalleryRows } from '../shared/media-gallery-layout';\nimport { normalizeImagePayload } from './image.payload';\n\n@Component({\n selector: 'ax-conversation-image-renderer',\n imports: [CommonModule, AXConversationImageAttachmentComponent, AXConversationMessageRendererStateComponent],\n\n templateUrl: './image-renderer.component.html',\n styleUrls: ['../shared/renderer-shared.css'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationImageRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n private readonly fileTypes = inject(AXFileTypeRegistryService);\n protected readonly translation = inject(AXTranslationService);\n\n readonly message = input.required<AXConversationMessage>();\n readonly rendererState = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: 'ready' as const,\n }));\n\n readonly payload = computed(() => normalizeImagePayload(this.message().payload as AXConversationImagePayload));\n readonly images = computed(() => this.payload().images);\n readonly caption = computed(() => this.payload().caption?.trim() || '');\n readonly imageAlt = computed(() => this.caption() || this.translation.translateSync('@acorex:chat.image'));\n readonly imageLoadErrorLabel = computed(() =>\n this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-image'),\n );\n\n copy(): Promise<string> {\n return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n const p = this.payload();\n return mediaCopyText(\n p.caption,\n this.translation.translateSync('@acorex:chat.image'),\n this.translation.translateSync('@acorex:chat.media.images'),\n p.images.length,\n p.images.map((item) => item.url?.trim() || item.thumbnailUrl?.trim()),\n );\n });\n }\n\n readonly layoutMode = computed(() => getMediaGalleryLayoutMode(this.images().length));\n\n readonly imageRows = computed(() => partitionMediaIntoGalleryRows(this.images()));\n}\n","<div class=\"ax-conversation-msg ax-conversation-msg--flush\">\n @switch (layoutMode()) {\n @case ('masonry') {\n <div class=\"ax-conversation-msg__masonry\">\n @for (row of imageRows(); track $index) {\n <div class=\"ax-conversation-msg__masonry-row\">\n @for (image of row.items; track image.mediaId ?? image.url) {\n <ax-conversation-image-attachment [item]=\"image\" [alt]=\"imageAlt()\" [reserveAspect]=\"false\" />\n }\n </div>\n }\n </div>\n }\n @default {\n <div class=\"ax-conversation-msg__grid\" [class]=\"'ax-conversation-msg__grid--' + layoutMode()\">\n @for (image of images(); track image.mediaId ?? image.url) {\n <ax-conversation-image-attachment\n [item]=\"image\"\n [alt]=\"imageAlt()\"\n [reserveAspect]=\"layoutMode() === 'single'\"\n />\n }\n </div>\n }\n }\n @if (caption()) {\n <p class=\"ax-conversation-msg__caption\">{{ caption() }}</p>\n }\n <ax-conversation-message-renderer-state\n [rendererState]=\"rendererState()\"\n [message]=\"message()\"\n [contentErrorLabel]=\"imageLoadErrorLabel()\"\n contentErrorIconClass=\"fa-light fa-image\"\n placement=\"below\"\n />\n</div>\n","import type { AXClickEvent } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXMapComponent, AXMapModule } from '@acorex/components/map';\nimport { AXFullScreenService } from '@acorex/core/full-screen';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n afterNextRender,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n PLATFORM_ID,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { AXConversationLocationPayload, AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { AXConversationMessageRendererCopyHostComponent } from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\n\n@Component({\n selector: 'ax-conversation-location-renderer',\n imports: [\n CommonModule,\n AXMapModule,\n AXButtonComponent,\n AXDecoratorGenericComponent,\n AXDecoratorIconComponent,\n AXConversationMessageRendererStateComponent,\n AXTranslationModule,\n ],\n\n templateUrl: './location-renderer.component.html',\n styleUrl: './location-renderer.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationLocationRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n private readonly _contentState = signal<AXConversationMessageRendererContentState>('none');\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT);\n private readonly fullScreen = inject(AXFullScreenService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly mapHost = viewChild<ElementRef<HTMLElement>>('mapHost');\n private readonly map = viewChild(AXMapComponent);\n protected readonly translation = inject(AXTranslationService);\n\n readonly message = input.required<AXConversationMessage>();\n readonly rendererState = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: this._contentState(),\n }));\n readonly payload = computed(() => this.message().payload as AXConversationLocationPayload);\n\n readonly latitude = computed(() => this.payload().latitude);\n readonly longitude = computed(() => this.payload().longitude);\n readonly locationName = computed(\n () => this.payload().name || this.translation.translateSync('@acorex:chat.location'),\n );\n readonly address = computed(() => this.payload().address);\n\n readonly coordinatesText = computed(() => {\n const lat = this.latitude().toFixed(5);\n const lng = this.longitude().toFixed(5);\n return `${lat}, ${lng}`;\n });\n\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 copy(): string {\n const name = this.locationName();\n const addr = this.address()?.trim();\n const coords = this.coordinatesText();\n const maps = this.mapsUrl();\n const lines = [addr, coords, maps].filter(Boolean);\n return lines.length ? `${name}\\n${lines.join('\\n')}` : name;\n }\n\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 readonly mapIsFullscreen = computed(() => {\n const host = this.mapHost()?.nativeElement;\n return !!host && this.fullScreen.activeElement() === host;\n });\n\n readonly mapFullscreenLabel = computed(() =>\n this.mapIsFullscreen()\n ? this.translation.translateSync('@acorex:common.general.close')\n : this.translation.translateSync('@acorex:common.general.full-screen'),\n );\n\n readonly mapFullscreenIconClass = computed(() =>\n this.mapIsFullscreen() ? 'fa-light fa-compress' : 'fa-light fa-expand',\n );\n\n constructor() {\n super();\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const onKeydown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') {\n return;\n }\n this.exitMapFullscreen();\n };\n\n this.document.addEventListener('keydown', onKeydown);\n this.destroyRef.onDestroy(() => {\n this.document.removeEventListener('keydown', onKeydown);\n this.exitMapFullscreen();\n });\n\n afterNextRender(() => {\n const host = this.mapHost()?.nativeElement;\n if (!host || typeof ResizeObserver === 'undefined') {\n return;\n }\n const observer = new ResizeObserver(() => this.scheduleMapResize());\n observer.observe(host);\n this.destroyRef.onDestroy(() => observer.disconnect());\n this.scheduleMapResize();\n });\n }\n\n openInMaps(event: AXClickEvent): void {\n event.nativeEvent?.preventDefault();\n event.nativeEvent?.stopPropagation();\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n this.document.defaultView?.open(this.mapsUrl(), '_blank', 'noopener,noreferrer');\n }\n\n toggleMapFullscreen(event: AXClickEvent): void {\n event.nativeEvent?.preventDefault();\n event.nativeEvent?.stopPropagation();\n const host = this.mapHost()?.nativeElement;\n if (!host) {\n return;\n }\n this.fullScreen.toggle(host, 'overlay');\n this.scheduleMapResize();\n }\n\n private exitMapFullscreen(): void {\n const host = this.mapHost()?.nativeElement;\n if (!host || !this.fullScreen.isActive(host)) {\n return;\n }\n this.fullScreen.exit(host);\n this.scheduleMapResize();\n }\n\n protected scheduleMapResize(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const run = () => this.map()?.invalidateSize();\n requestAnimationFrame(() => {\n run();\n setTimeout(run, 80);\n });\n }\n}\n","<div class=\"ax-conversation-loc\">\n <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n <div #mapHost class=\"ax-conversation-loc__map\" [class.ax-conversation-loc__map--fullscreen]=\"mapIsFullscreen()\">\n <ax-map\n [latitude]=\"latitude()\"\n [longitude]=\"longitude()\"\n [zoomLevel]=\"15\"\n [markers]=\"markers()\"\n [hasLocator]=\"false\"\n [hasDraw]=\"false\"\n (onMapReady)=\"scheduleMapResize()\"\n ></ax-map>\n <ax-button\n class=\"ax-conversation-loc__map-fs ax-sm rounded-full\"\n look=\"solid\"\n [iconOnly]=\"true\"\n [text]=\"mapFullscreenLabel()\"\n [attr.aria-label]=\"mapFullscreenLabel()\"\n [attr.title]=\"mapFullscreenLabel()\"\n (onClick)=\"toggleMapFullscreen($event)\"\n >\n <ax-icon>\n <i [class]=\"mapFullscreenIconClass()\" aria-hidden=\"true\"></i>\n </ax-icon>\n </ax-button>\n </div>\n <ax-button\n class=\"ax-conversation-loc__action\"\n look=\"blank\"\n [text]=\"'@acorex:chat.actions.open-in-maps'\"\n (onClick)=\"openInMaps($event)\"\n >\n <ax-suffix>\n <i class=\"fa-light fa-arrow-up-right-from-square\" aria-hidden=\"true\"></i>\n </ax-suffix>\n </ax-button>\n <div class=\"ax-conversation-loc__body\">\n <div class=\"ax-conversation-loc__title\">\n <span class=\"ax-conversation-loc__title-text\">{{ locationName() }}</span>\n </div>\n @if (address()) {\n <div class=\"ax-conversation-loc__addr\">{{ address() }}</div>\n }\n </div>\n</div>\n","import { AXLabelComponent } from '@acorex/components/label';\nimport { AXLoadingComponent } from '@acorex/components/loading';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, input, signal, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationMessage, AXConversationStickerPayload } from '../../../../models';\nimport type {\n AXConversationMessageRendererComponent,\n AXConversationMessageRendererContentState,\n} from '../../../../registries/message-renderer.registry';\nimport { cssAspectRatio } from '../shared/media-aspect';\nimport { createResolvedMediaUrlSignal } from '../shared/media-url-resolve';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\n\n@Component({\n selector: 'ax-conversation-sticker-renderer',\n imports: [CommonModule, AXLabelComponent, AXLoadingComponent, AXConversationMessageRendererStateComponent],\n\n templateUrl: './sticker-renderer.component.html',\n styleUrl: './sticker-renderer.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationStickerRendererComponent implements AXConversationMessageRendererComponent {\n private readonly _contentState = signal<AXConversationMessageRendererContentState>('loading');\n protected readonly translation = inject(AXTranslationService);\n\n readonly message = input.required<AXConversationMessage>();\n readonly rendererState = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: this._contentState(),\n }));\n\n readonly payload = computed(() => this.message().payload as AXConversationStickerPayload);\n private readonly mediaReference = computed(() => ({\n url: this.payload().url,\n mediaId: this.payload().mediaId,\n mimeType: this.payload().mimeType,\n }));\n private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n readonly stickerUrl = computed(() => this.resolvedUrl() ?? this.payload().url ?? '');\n readonly alt = computed(() => this.payload().emoji || this.translation.translateSync('@acorex:chat.sticker'));\n readonly aspectRatio = computed(() => cssAspectRatio(this.payload().width, this.payload().height) ?? '1 / 1');\n\n constructor() {\n effect(() => {\n this.message().id;\n this.stickerUrl();\n this._contentState.set('loading');\n });\n }\n\n onLoad(): void {\n this._contentState.set('ready');\n }\n\n onError(): void {\n this._contentState.set('error');\n }\n}\n","<div class=\"ax-conversation-sticker-wrap\">\n <div class=\"ax-conversation-sticker\" [style.aspect-ratio]=\"aspectRatio()\">\n @if (rendererState().contentState === 'loading') {\n <div class=\"ax-conversation-sticker__state\" aria-busy=\"true\">\n <ax-loading></ax-loading>\n <ax-label class=\"ax-conversation-sticker__loading-label\">{{\n translation.translateSync('@acorex:chat.renderer-state.loading-sticker')\n }}</ax-label>\n </div>\n }\n <img\n class=\"ax-conversation-sticker__img\"\n [src]=\"stickerUrl()\"\n [alt]=\"alt()\"\n [attr.width]=\"payload().width || null\"\n [attr.height]=\"payload().height || null\"\n [class.ax-conversation-sticker__img--ready]=\"rendererState().contentState === 'ready'\"\n [class.ax-conversation-sticker__img--hidden]=\"rendererState().contentState === 'error'\"\n loading=\"lazy\"\n decoding=\"async\"\n (load)=\"onLoad()\"\n (error)=\"onError()\"\n />\n </div>\n <ax-conversation-message-renderer-state\n [rendererState]=\"rendererState()\"\n [message]=\"message()\"\n [contentErrorLabel]=\"translation.translateSync('@acorex:chat.renderer-state.sticker-unavailable')\"\n contentErrorStyle=\"inline\"\n contentErrorIconClass=\"fa-light fa-face-smile\"\n placement=\"below\"\n />\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationMessage, AXConversationSystemPayload } from '../../../../models';\nimport type {\n AXConversationMessageRendererComponent,\n AXConversationMessageRendererContentState,\n} from '../../../../registries/message-renderer.registry';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\n\nconst AX_CONVERSATION_EVENT_ICONS: Record<string, string> = {\n user_joined: 'fa-light fa-user-plus',\n user_left: 'fa-light fa-user-minus',\n title_changed: 'fa-light fa-pen',\n avatar_changed: 'fa-light fa-image',\n};\n\n@Component({\n selector: 'ax-conversation-system-renderer',\n imports: [CommonModule, AXConversationMessageRendererStateComponent],\n\n templateUrl: './system-renderer.component.html',\n styleUrl: './system-renderer.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationSystemRendererComponent implements AXConversationMessageRendererComponent {\n private readonly _contentState = signal<AXConversationMessageRendererContentState>('none');\n\n readonly message = input.required<AXConversationMessage>();\n readonly rendererState = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: this._contentState(),\n }));\n readonly payload = computed(() => this.message().payload as AXConversationSystemPayload);\n\n readonly iconClass = computed(() => {\n const type = this.payload().eventType;\n return AX_CONVERSATION_EVENT_ICONS[type] ?? null;\n });\n}\n","<div class=\"ax-conversation-system-stack\">\n <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n <div class=\"ax-conversation-system\" role=\"status\">\n @if (iconClass(); as icon) {\n <span class=\"ax-conversation-system__icon\" aria-hidden=\"true\">\n <i [class]=\"icon\"></i>\n </span>\n }\n <span class=\"ax-conversation-system__label\">{{ payload().text }}</span>\n </div>\n</div>\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 AXConversationSanitizerService {\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","import { Component, computed, inject, input, signal, ViewEncapsulation } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationMessage, AXConversationTextPayload } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { AXConversationSanitizerService } from '../../../../utils/sanitizer.service';\nimport { countLoneEmojis, listTextGraphemes } from '../../../../utils/message-chrome';\nimport { AXConversationMessageRendererCopyHostComponent } from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\n\n@Component({\n selector: 'ax-conversation-text-renderer',\n imports: [AXConversationMessageRendererStateComponent],\n\n templateUrl: './text-renderer.component.html',\n styleUrl: './text-renderer.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationTextRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n private readonly infoBarService = inject(AXConversationInfoBarService);\n private readonly sanitizer = inject(AXConversationSanitizerService);\n\n private readonly _contentState = signal<AXConversationMessageRendererContentState>('none');\n\n readonly message = input.required<AXConversationMessage>();\n readonly rendererState = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: this._contentState(),\n }));\n readonly searchQuery = this.infoBarService.searchQuery;\n\n copy(): string {\n return (this.message().payload as AXConversationTextPayload).text?.trim() ?? '';\n }\n\n readonly jumboCount = computed(() =>\n countLoneEmojis((this.message().payload as AXConversationTextPayload).text),\n );\n\n readonly isJumbo = computed(() => this.jumboCount() > 0);\n\n readonly jumboText = computed(() => (this.message().payload as AXConversationTextPayload).text?.trim() ?? '');\n\n readonly jumboGraphemes = computed(() => listTextGraphemes(this.jumboText()));\n\n readonly formattedText = computed((): SafeHtml => {\n const msg = this.message();\n const payload = msg.payload as AXConversationTextPayload;\n const text = payload.text ?? '';\n const query = this.searchQuery();\n let escaped = this.sanitizer.escapeHtml(text);\n if (query?.trim()) {\n escaped = this.highlightSearch(escaped, query);\n }\n return this.sanitizer.safeHtml(this.linkify(escaped));\n });\n\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 private highlightSearch(text: string, query: string): string {\n const trimmed = query.trim();\n if (!trimmed) {\n return text;\n }\n const escapedQuery = trimmed.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`(${escapedQuery})`, 'gi');\n return text.replace(regex, '<mark>$1</mark>');\n }\n}\n","<div class=\"ax-conversation-text\" [class.ax-conversation-text--jumbo]=\"isJumbo()\">\n <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n @if (isJumbo()) {\n <span class=\"ax-conversation-text__jumbo\" [attr.data-count]=\"jumboCount()\">\n @for (glyph of jumboGraphemes(); track $index) {\n <span class=\"ax-conversation-text__jumbo-glyph\">{{ glyph }}</span>\n }\n </span>\n } @else {\n <div class=\"ax-conversation-text__body\" [innerHTML]=\"formattedText()\"></div>\n }\n</div>\n","import { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, DestroyRef, PLATFORM_ID, computed, inject, input, signal, viewChildren, ViewEncapsulation } from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationMessage, AXConversationVideoPayload } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { bindMediaRendererContentState, reportMediaLoadError } from '../shared/media-renderer-content-state';\nimport {\n AXConversationMessageRendererCopyHostComponent,\n mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { syncPlaybackInfoBarBanner } from '../shared/playback-banner-sync';\nimport { getMediaGalleryLayoutMode, partitionMediaIntoGalleryRows } from '../shared/media-gallery-layout';\nimport { AXConversationVideoAttachmentComponent } from '../shared/video-attachment.component';\nimport { normalizeVideoPayload } from './video.payload';\n\n@Component({\n selector: 'ax-conversation-video-renderer',\n imports: [CommonModule, AXConversationVideoAttachmentComponent, AXConversationMessageRendererStateComponent],\n\n templateUrl: './video-renderer.component.html',\n styleUrls: ['../shared/renderer-shared.css'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationVideoRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n private readonly fileTypes = inject(AXFileTypeRegistryService);\n private readonly translation = inject(AXTranslationService);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n private readonly infoBarService = inject(AXConversationInfoBarService, { optional: true });\n private readonly attachments = viewChildren(AXConversationVideoAttachmentComponent);\n\n private readonly _contentState = signal<AXConversationMessageRendererContentState>('ready');\n private readonly activeVideoIndex = signal(0);\n\n readonly message = input.required<AXConversationMessage>();\n readonly rendererState = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: this._contentState(),\n }));\n\n readonly isPlaying = signal(false);\n readonly currentTime = signal(0);\n readonly duration = signal(0);\n\n readonly payload = computed(() => normalizeVideoPayload(this.message().payload as AXConversationVideoPayload));\n readonly videos = computed(() => this.payload().videos);\n readonly caption = computed(() => this.payload().caption?.trim() || '');\n\n readonly videoLoadErrorLabel = computed(() =>\n this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-video'),\n );\n\n readonly layoutMode = computed(() => getMediaGalleryLayoutMode(this.videos().length));\n\n readonly videoRows = computed(() => partitionMediaIntoGalleryRows(this.videos()));\n\n copy(): Promise<string> {\n return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n const p = this.payload();\n return mediaCopyText(\n p.caption,\n this.translation.translateSync('@acorex:chat.video'),\n this.translation.translateSync('@acorex:chat.media.videos'),\n p.videos.length,\n p.videos.map((item) => item.url?.trim()),\n );\n });\n }\n\n constructor() {\n super();\n bindMediaRendererContentState(this.message, this._contentState, () => this.videos());\n\n this.destroyRef.onDestroy(() => {\n const messageId = this.message()?.id;\n if (messageId && this.infoBarService) {\n this.infoBarService.hideMessageBanner(messageId);\n }\n });\n }\n\n onPlayingChange(index: number, playing: boolean): void {\n if (playing) {\n this.activeVideoIndex.set(index);\n this.pauseOtherVideos(index);\n this.isPlaying.set(true);\n this.syncInfoBarBanner(true);\n return;\n }\n\n if (this.activeVideoIndex() === index) {\n this.isPlaying.set(false);\n this.syncInfoBarBanner();\n }\n }\n\n onTimeUpdate(index: number, time: number): void {\n if (this.activeVideoIndex() !== index) {\n return;\n }\n this.currentTime.set(time);\n this.syncInfoBarBanner();\n }\n\n onDurationChange(index: number, duration: number): void {\n if (this.activeVideoIndex() !== index) {\n return;\n }\n this.duration.set(duration);\n this.syncInfoBarBanner();\n }\n\n onPlaybackEnded(index: number): void {\n if (this.activeVideoIndex() !== index) {\n return;\n }\n this.isPlaying.set(false);\n this.currentTime.set(0);\n this.syncInfoBarBanner();\n }\n\n onPlaybackError(): void {\n if (!reportMediaLoadError(this.message(), this._contentState)) {\n return;\n }\n this.isPlaying.set(false);\n this.infoBarService?.hideMessageBanner(this.message().id);\n }\n\n togglePlay(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n this.attachments()[this.activeVideoIndex()]?.togglePlay();\n }\n\n private pauseOtherVideos(activeIndex: number): void {\n this.attachments().forEach((attachment, index) => {\n if (index !== activeIndex) {\n attachment.pause();\n }\n });\n }\n\n private pausePlayback(): void {\n this.attachments()[this.activeVideoIndex()]?.pause();\n this.isPlaying.set(false);\n }\n\n private syncInfoBarBanner(forceOpen = false): void {\n if (!this.infoBarService) {\n return;\n }\n const message = this.message();\n const index = this.activeVideoIndex();\n const title = this.payload().caption?.trim() || (this.videos().length > 1 ? `Video ${index + 1}` : 'Video');\n\n syncPlaybackInfoBarBanner(\n this.infoBarService,\n message,\n {\n title,\n currentTime: this.currentTime(),\n duration: this.duration() || this.videos()[index]?.duration || 0,\n isPlaying: this.isPlaying(),\n onTogglePlay: () => this.togglePlay(),\n onClose: () => this.pausePlayback(),\n },\n { forceOpen },\n );\n }\n}\n","<div class=\"ax-conversation-msg ax-conversation-msg--flush\">\n @switch (layoutMode()) {\n @case ('masonry') {\n <div class=\"ax-conversation-msg__masonry\">\n @for (row of videoRows(); track $index) {\n <div class=\"ax-conversation-msg__masonry-row\">\n @for (video of row.items; track video.mediaId ?? video.url; let i = $index) {\n <ax-conversation-video-attachment\n [item]=\"video\"\n [reserveAspect]=\"false\"\n (playingChange)=\"onPlayingChange(row.startIndex + i, $event)\"\n (timeUpdate)=\"onTimeUpdate(row.startIndex + i, $event)\"\n (durationChange)=\"onDurationChange(row.startIndex + i, $event)\"\n (playbackEnded)=\"onPlaybackEnded(row.startIndex + i)\"\n (playbackError)=\"onPlaybackError()\"\n />\n }\n </div>\n }\n </div>\n }\n @default {\n <div class=\"ax-conversation-msg__grid\" [class]=\"'ax-conversation-msg__grid--' + layoutMode()\">\n @for (video of videos(); track video.mediaId ?? video.url; let i = $index) {\n <ax-conversation-video-attachment\n [item]=\"video\"\n [reserveAspect]=\"layoutMode() === 'single'\"\n (playingChange)=\"onPlayingChange(i, $event)\"\n (timeUpdate)=\"onTimeUpdate(i, $event)\"\n (durationChange)=\"onDurationChange(i, $event)\"\n (playbackEnded)=\"onPlaybackEnded(i)\"\n (playbackError)=\"onPlaybackError()\"\n />\n }\n </div>\n }\n }\n @if (caption()) {\n <p class=\"ax-conversation-msg__caption\">{{ caption() }}</p>\n }\n <ax-conversation-message-renderer-state\n [rendererState]=\"rendererState()\"\n [message]=\"message()\"\n [contentErrorLabel]=\"videoLoadErrorLabel()\"\n contentErrorIconClass=\"fa-light fa-video\"\n placement=\"below\"\n />\n</div>\n","import { AXAudioWaveComponent } from '@acorex/components/audio-wave';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport type { AXAudioWaveChangeEvent, AXWaveConfig } from '@acorex/components/audio-wave';\nimport { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n PLATFORM_ID,\n computed,\n inject,\n input,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationMessage, AXConversationVoicePayload } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { AXConversationService } from '../../../../services/conversation.service';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { formatMediaDuration } from '../shared/format-media';\nimport { bindMediaRendererContentState, reportMediaLoadError } from '../shared/media-renderer-content-state';\nimport { createResolvedMediaUrlSignal } from '../shared/media-url-resolve';\nimport {\n AXConversationMessageRendererCopyHostComponent,\n mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { AXConversationMediaPlaybackInlineControlsComponent } from '../shared/media-playback-inline-controls.component';\nimport { syncPlaybackInfoBarBanner } from '../shared/playback-banner-sync';\n\nfunction readCssRgbVar(platformId: object, name: string): string {\n if (!isPlatformBrowser(platformId)) {\n return '128, 128, 128';\n }\n return getComputedStyle(document.documentElement).getPropertyValue(name).trim() || '128, 128, 128';\n}\n\n@Component({\n selector: 'ax-conversation-voice-renderer',\n imports: [\n CommonModule,\n AXAudioWaveComponent,\n AXButtonComponent,\n AXDecoratorModule,\n AXConversationMessageRendererStateComponent,\n AXConversationMediaPlaybackInlineControlsComponent,\n ],\n\n templateUrl: './voice-renderer.component.html',\n styleUrl: './voice-renderer.component.css',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationVoiceRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n private readonly fileTypes = inject(AXFileTypeRegistryService);\n protected readonly translation = inject(AXTranslationService);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n private readonly infoBarService = inject(AXConversationInfoBarService, { optional: true });\n private readonly conversationService = inject(AXConversationService, { optional: true });\n private readonly waveRef = viewChild(AXAudioWaveComponent);\n\n private readonly _contentState = signal<AXConversationMessageRendererContentState>('ready');\n\n readonly message = input.required<AXConversationMessage>();\n readonly rendererState = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: this._contentState(),\n }));\n\n readonly isPlaying = signal(false);\n readonly currentTime = signal(0);\n readonly duration = signal(0);\n readonly playbackSpeed = signal(1.0);\n readonly isMuted = signal(false);\n\n private readonly speeds = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] as const;\n private lastBannerSyncAt = 0;\n\n private readonly bannerTogglePlay = (): void => this.togglePlay();\n private readonly bannerClose = (): void => this.pausePlayback();\n private readonly bannerCycleSpeed = (): void => this.cyclePlaybackSpeed();\n private readonly bannerToggleMute = (): void => this.toggleMute();\n\n readonly payload = computed(() => this.message().payload as AXConversationVoicePayload);\n private readonly mediaReference = computed(() => ({\n url: this.payload().url,\n mediaId: this.payload().mediaId,\n mimeType: this.payload().mimeType,\n size: this.payload().size,\n }));\n private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n readonly voiceUrl = computed(() => pickDisplayMediaUrl(this.resolvedUrl(), this.payload().url));\n\n readonly isOwnMessage = computed(() => {\n const currentUserId = this.conversationService?.currentUser()?.id;\n return !!currentUserId && currentUserId === this.message().senderId;\n });\n\n readonly waveConfig = computed((): AXWaveConfig | null => {\n const url = this.voiceUrl()?.trim();\n if (!url) {\n return null;\n }\n\n const own = this.isOwnMessage();\n const onPrimary = readCssRgbVar(this.platformId, '--ax-sys-color-on-primary-surface');\n const onSurface = readCssRgbVar(this.platformId, '--ax-sys-color-on-surface');\n const primary = readCssRgbVar(this.platformId, '--ax-sys-color-primary-500');\n\n return {\n url,\n height: 28,\n barWidth: 2,\n barGap: 2,\n barRadius: 2,\n waveColor: own ? `rgba(${onPrimary}, 0.35)` : `rgba(${onSurface}, 0.22)`,\n progressColor: own ? `rgb(${onPrimary})` : `rgb(${primary})`,\n };\n });\n\n readonly displayDuration = computed(() => {\n const live = this.duration();\n if (live > 0) {\n return live;\n }\n return this.payload().duration ?? 0;\n });\n\n readonly timeLabel = computed(() => {\n const current = this.currentTime();\n const total = this.displayDuration();\n if (this.isPlaying() || (current > 0 && current < total)) {\n return formatMediaDuration(current);\n }\n return formatMediaDuration(total);\n });\n\n readonly voiceLoadErrorLabel = computed(() =>\n this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-voice'),\n );\n\n copy(): Promise<string> {\n return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n const url = this.voiceUrl()?.trim();\n return mediaCopyText(\n undefined,\n this.translation.translateSync('@acorex:chat.voice'),\n this.translation.translateSync('@acorex:chat.media.voice-messages'),\n 1,\n [url],\n );\n });\n }\n\n constructor() {\n super();\n bindMediaRendererContentState(this.message, this._contentState, () => this.voiceUrl());\n\n this.destroyRef.onDestroy(() => {\n const messageId = this.message()?.id;\n if (!messageId || !this.infoBarService) {\n return;\n }\n this.infoBarService.hideMessageBanner(messageId);\n });\n }\n\n togglePlay(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const wave = this.waveRef();\n if (!wave) {\n return;\n }\n if (this.isPlaying()) {\n wave.pause();\n } else {\n void wave.play();\n }\n }\n\n cyclePlaybackSpeed(): void {\n const current = this.playbackSpeed();\n const i = this.speeds.findIndex((s) => s === current);\n const nextIndex = (i < 0 ? 2 : i + 1) % this.speeds.length;\n const next = this.speeds[nextIndex] ?? 1;\n this.playbackSpeed.set(next);\n this.applyPlaybackSettings();\n this.syncInfoBarBanner(false, true);\n }\n\n toggleMute(): void {\n this.isMuted.update((muted) => !muted);\n this.applyPlaybackSettings();\n this.syncInfoBarBanner(false, true);\n }\n\n onWaveStatusChanged(event: AXAudioWaveChangeEvent): void {\n switch (event.status) {\n case 'play':\n this._contentState.set('ready');\n this.isPlaying.set(true);\n this.applyPlaybackSettings();\n this.syncPlaybackTimeFromWave(true);\n this.syncInfoBarBanner(true, true);\n break;\n case 'pause':\n this.isPlaying.set(false);\n this.syncPlaybackTimeFromWave(true);\n this.syncInfoBarBanner(false, true);\n break;\n case 'timeupdate':\n this.syncPlaybackTimeFromWave();\n this.syncInfoBarBanner();\n break;\n case 'seeking':\n case 'interaction':\n this.syncPlaybackTimeFromWave(true);\n this.syncInfoBarBanner(true);\n break;\n case 'ready':\n case 'decode': {\n this._contentState.set('ready');\n const decoded = typeof event.data?.duration === 'number' ? event.data.duration : 0;\n const live = this.waveRef()?.getDuration() ?? 0;\n const next = decoded > 0 ? decoded : live;\n if (next > 0) {\n this.duration.set(next);\n }\n break;\n }\n case 'finish':\n this.onEnded();\n break;\n case 'error':\n if (this.isWavePlayable()) {\n this._contentState.set('ready');\n break;\n }\n this.onError();\n break;\n }\n }\n\n onEnded(): void {\n this.isPlaying.set(false);\n this.currentTime.set(0);\n this.syncInfoBarBanner(false, true);\n }\n\n onError(): void {\n if (!reportMediaLoadError(this.message(), this._contentState)) {\n return;\n }\n this.isPlaying.set(false);\n this.infoBarService?.hideMessageBanner(this.message().id);\n }\n\n private pausePlayback(): void {\n this.waveRef()?.pause();\n this.isPlaying.set(false);\n }\n\n private isWavePlayable(): boolean {\n const wave = this.waveRef();\n if (!wave) {\n return false;\n }\n\n if (wave.getDuration() > 0) {\n return true;\n }\n\n const media = wave.getMediaElement();\n return !!media && media.readyState >= HTMLMediaElement.HAVE_METADATA;\n }\n\n private applyPlaybackSettings(): void {\n const wave = this.waveRef();\n if (!wave) {\n return;\n }\n wave.setRate(this.playbackSpeed());\n wave.setMuted(this.isMuted());\n }\n\n private syncPlaybackTimeFromWave(force = false): void {\n const wave = this.waveRef();\n if (!wave) {\n return;\n }\n\n const nextTime = wave.getCurrentTime();\n if (Number.isFinite(nextTime) && (force || Math.abs(nextTime - this.currentTime()) >= 0.1)) {\n this.currentTime.set(nextTime);\n }\n\n const nextDuration = wave.getDuration();\n if (nextDuration > 0 && nextDuration !== this.duration()) {\n this.duration.set(nextDuration);\n }\n }\n\n private syncInfoBarBanner(forceOpen = false, forceSync = false): void {\n if (!this.infoBarService) {\n return;\n }\n\n if (!forceOpen && !forceSync) {\n const now = performance.now();\n if (now - this.lastBannerSyncAt < 250) {\n return;\n }\n this.lastBannerSyncAt = now;\n } else {\n this.lastBannerSyncAt = performance.now();\n }\n\n const message = this.message();\n\n syncPlaybackInfoBarBanner(\n this.infoBarService,\n message,\n {\n title: this.translation.translateSync('@acorex:chat.voice'),\n currentTime: this.currentTime(),\n duration: this.displayDuration(),\n isPlaying: this.isPlaying(),\n onTogglePlay: this.bannerTogglePlay,\n onClose: this.bannerClose,\n playbackSpeed: this.playbackSpeed(),\n onCycleSpeed: this.bannerCycleSpeed,\n showSpeedControl: true,\n isMuted: this.isMuted(),\n onToggleMute: this.bannerToggleMute,\n showMuteControl: true,\n },\n { forceOpen },\n );\n }\n}\n","<div class=\"ax-conversation-voice\">\n <ax-button\n class=\"rounded-full ax-lg\"\n color=\"primary\"\n look=\"solid\"\n [iconOnly]=\"true\"\n [text]=\"\n isPlaying()\n ? translation.translateSync('@acorex:chat.media.pause-voice')\n : translation.translateSync('@acorex:chat.media.play-voice')\n \"\n (onClick)=\"togglePlay()\"\n >\n <ax-icon>\n <i class=\"fa-solid\" [class.fa-pause]=\"isPlaying()\" [class.fa-play]=\"!isPlaying()\"></i>\n </ax-icon>\n </ax-button>\n\n <div class=\"ax-conversation-voice__body\">\n @if (waveConfig(); as config) {\n <ax-audio-wave\n class=\"ax-conversation-voice__wave\"\n [config]=\"config\"\n (onStatusChanged)=\"onWaveStatusChanged($event)\"\n />\n }\n <div class=\"ax-conversation-voice__footer\">\n <span class=\"ax-conversation-voice__time\">{{ timeLabel() }}</span>\n <ax-conversation-media-playback-inline-controls\n [playbackSpeed]=\"playbackSpeed()\"\n [isMuted]=\"isMuted()\"\n (cycleSpeed)=\"cyclePlaybackSpeed()\"\n (toggleMute)=\"toggleMute()\"\n />\n </div>\n </div>\n</div>\n\n<ax-conversation-message-renderer-state\n [rendererState]=\"rendererState()\"\n [message]=\"message()\"\n [contentErrorLabel]=\"voiceLoadErrorLabel()\"\n contentErrorStyle=\"inline\"\n contentErrorIconClass=\"fa-light fa-microphone\"\n placement=\"below\"\n/>\n","/**\n * Default Message Actions Plugin\n * Individual message action constants\n */\n\nimport { translateSync } from '@acorex/core/translation';\nimport { inject } from '@angular/core';\nimport { AXConversationComposerService } from '../../../components/composer/composer.service';\nimport { AXConversationMessageAction } from '../../../registries';\nimport { AXConversationService } from '../../../services';\n\n/**\n * Reply to message\n */\nexport const AX_CONVERSATION_MESSAGE_REPLY_ACTION: AXConversationMessageAction = {\n id: 'reply',\n label: '@acorex:chat.actions.reply',\n icon: 'fa-light fa-reply',\n priority: 90,\n visible: () => true,\n enabled: () => true,\n handler: async (context) => {\n inject(AXConversationComposerService).startReply(context.message);\n },\n};\n\n/**\n * Edit own message (text only)\n */\nexport const AX_CONVERSATION_MESSAGE_EDIT_ACTION: AXConversationMessageAction = {\n id: 'edit',\n label: '@acorex:chat.actions.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 inject(AXConversationComposerService).startEdit(context.message);\n },\n};\n\n/**\n * Delete own message\n */\nexport const AX_CONVERSATION_MESSAGE_DELETE_ACTION: AXConversationMessageAction = {\n id: 'delete',\n label: '@acorex:chat.actions.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 inject(AXConversationService).deleteMessage(context.message.id, false);\n },\n};\n\n/**\n * Forward message to another conversation\n */\nexport const AX_CONVERSATION_MESSAGE_FORWARD_ACTION: AXConversationMessageAction = {\n id: 'forward',\n label: '@acorex:chat.actions.forward',\n icon: 'fa-light fa-share',\n priority: 75,\n visible: () => true,\n enabled: () => !inject(AXConversationService).isForwardingMessage(),\n handler: async (context) => {\n const conversationService = inject(AXConversationService);\n if (conversationService.isForwardingMessage()) {\n return;\n }\n const { AXConversationForwardMessageDialogComponent } = await import(\n '../../../components/message-list/forward-message-dialog.component'\n );\n await conversationService.popupService.open(AXConversationForwardMessageDialogComponent, {\n title: translateSync('@acorex:chat.dialog.forward-message.title'),\n size: 'sm',\n closeButton: true,\n data: {\n conversationService,\n message: context.message,\n },\n });\n },\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_EMOJI_ACTION } from '../../composer/composer-actions/emoji-action.plugin';\nimport { isJumboEmojiTextMessage } from '../../../utils/message-chrome';\n\nexport const AX_CONVERSATION_TEXT_RENDERER: AXConversationMessageRenderer = {\n type: 'text',\n componentLoader: () =>\n import('../components/text-renderer/text-renderer.component').then((m) => m.AXConversationTextRendererComponent),\n canHandle: (message) => message.type === 'text',\n chrome: (message) => (isJumboEmojiTextMessage(message) ? 'plain' : 'bubble'),\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 composerActions: [AX_CONVERSATION_COMPOSER_EMOJI_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_IMAGE_ACTION } from '../../composer/composer-actions/image-action.plugin';\nimport { AX_CONVERSATION_IMAGE_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_IMAGE_RENDERER: AXConversationMessageRenderer = {\n type: 'image',\n componentLoader: () =>\n import('../components/image-renderer/image-renderer.component').then((m) => m.AXConversationImageRendererComponent),\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 fileType: AX_CONVERSATION_IMAGE_CATALOG,\n composerActions: [AX_CONVERSATION_COMPOSER_IMAGE_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_VIDEO_ACTION } from '../../composer/composer-actions/video-action.plugin';\nimport { AX_CONVERSATION_VIDEO_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_VIDEO_RENDERER: AXConversationMessageRenderer = {\n type: 'video',\n componentLoader: () =>\n import('../components/video-renderer/video-renderer.component').then((m) => m.AXConversationVideoRendererComponent),\n infoBarBannerLoader: () =>\n import('../components/shared/media-playback-info-bar-banner.component').then(\n (m) => m.AXConversationMediaPlaybackInfoBarBannerComponent,\n ),\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 fileType: AX_CONVERSATION_VIDEO_CATALOG,\n composerActions: [AX_CONVERSATION_COMPOSER_VIDEO_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_AUDIO_ACTION } from '../../composer/composer-actions/audio-action.plugin';\nimport { AX_CONVERSATION_AUDIO_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_AUDIO_RENDERER: AXConversationMessageRenderer = {\n type: 'audio',\n componentLoader: () =>\n import('../components/audio-renderer/audio-renderer.component').then((m) => m.AXConversationAudioRendererComponent),\n infoBarBannerLoader: () =>\n import('../components/shared/media-playback-info-bar-banner.component').then(\n (m) => m.AXConversationMediaPlaybackInfoBarBannerComponent,\n ),\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 fileType: AX_CONVERSATION_AUDIO_CATALOG,\n composerActions: [AX_CONVERSATION_COMPOSER_AUDIO_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION } from '../../composer/composer-actions/voice-action.plugin';\nimport { AX_CONVERSATION_VOICE_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_VOICE_RENDERER: AXConversationMessageRenderer = {\n type: 'voice',\n componentLoader: () =>\n import('../components/voice-renderer/voice-renderer.component').then((m) => m.AXConversationVoiceRendererComponent),\n infoBarBannerLoader: () =>\n import('../components/shared/media-playback-info-bar-banner.component').then(\n (m) => m.AXConversationMediaPlaybackInfoBarBannerComponent,\n ),\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 fileType: AX_CONVERSATION_VOICE_CATALOG,\n composerActions: [AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_FILE_ACTION } from '../../composer/composer-actions/file-action.plugin';\nimport { AX_CONVERSATION_FILE_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_FILE_RENDERER: AXConversationMessageRenderer = {\n type: 'file',\n componentLoader: () =>\n import('../components/file-renderer/file-renderer.component').then((m) => m.AXConversationFileRendererComponent),\n infoBarBannerLoader: () =>\n import('../components/shared/media-playback-info-bar-banner.component').then(\n (m) => m.AXConversationMediaPlaybackInfoBarBannerComponent,\n ),\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 fileType: AX_CONVERSATION_FILE_CATALOG,\n composerActions: [AX_CONVERSATION_COMPOSER_FILE_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_LOCATION_ACTION } from '../../composer/composer-actions/location-action.plugin';\n\nexport const AX_CONVERSATION_LOCATION_RENDERER: AXConversationMessageRenderer = {\n type: 'location',\n componentLoader: () =>\n import('../components/location-renderer/location-renderer.component').then((m) => m.AXConversationLocationRendererComponent),\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 composerActions: [AX_CONVERSATION_COMPOSER_LOCATION_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\n\nexport const AX_CONVERSATION_STICKER_RENDERER: AXConversationMessageRenderer = {\n type: 'sticker',\n componentLoader: () =>\n import('../components/sticker-renderer/sticker-renderer.component').then((m) => m.AXConversationStickerRendererComponent),\n canHandle: (message) => message.type === 'sticker',\n chrome: 'plain',\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","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\n\nexport const AX_CONVERSATION_SYSTEM_RENDERER: AXConversationMessageRenderer = {\n type: 'system',\n componentLoader: () =>\n import('../components/system-renderer/system-renderer.component').then((m) => m.AXConversationSystemRendererComponent),\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","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\n\nexport const AX_CONVERSATION_FALLBACK_RENDERER: AXConversationMessageRenderer = {\n type: 'fallback',\n componentLoader: () =>\n import('../components/fallback-renderer/fallback-renderer.component').then((m) => m.AXConversationFallbackRendererComponent),\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 { inject } from '@angular/core';\nimport { AXConversationItemAction } from '../../../registries';\nimport { AXConversationService } from '../../../services';\nimport { isConversationRoomCreator, isGroupLikeConversation } from '../../../utils/conversation-membership.utils';\n\n/**\n * Mute/Unmute conversation notifications\n */\nexport const AX_CONVERSATION_ITEM_MUTE_ACTION: AXConversationItemAction = {\n id: 'mute',\n label: (context) => {\n const notifications = inject(AXConversationService).getRoomPreferences(context.conversation.id).notifications;\n return notifications === false ? '@acorex:chat.actions.unmute' : '@acorex:chat.actions.mute';\n },\n icon: (context) => {\n const notifications = inject(AXConversationService).getRoomPreferences(context.conversation.id).notifications;\n return notifications === false ? 'fa-light fa-bell-slash' : 'fa-light fa-bell';\n },\n tooltip: '@acorex:chat.tooltips.toggle-notifications',\n priority: 100,\n handler: async (context) => {\n const service = inject(AXConversationService);\n const currentNotifications = service.getRoomPreferences(context.conversation.id).notifications;\n await service.updateConversationSettings(context.conversation.id, {\n notifications: !currentNotifications,\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 ? '@acorex:chat.actions.unpin' : '@acorex:chat.actions.pin'),\n icon: (context) => (context.conversation.pinned ? 'fa-light fa-thumbtack' : 'fa-regular fa-thumbtack'),\n tooltip: '@acorex:chat.tooltips.pin-conversation',\n priority: 90,\n handler: async (context) => {\n const currentPinned = context.conversation.pinned;\n await inject(AXConversationService).updateConversation(context.conversation.id, {\n pinned: !currentPinned,\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: '@acorex:chat.actions.mark-as-read',\n icon: 'fa-light fa-envelope-open',\n tooltip: '@acorex:chat.tooltips.mark-conversation-as-read',\n priority: 80,\n visible: (context) => (context.conversation.unreadCount ?? 0) > 0,\n handler: async (context) => {\n await inject(AXConversationService).markConversationAsRead(context.conversation.id);\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 if (!isGroupLikeConversation(context.conversation)) {\n return '@acorex:chat.actions.delete';\n }\n const currentUserId = inject(AXConversationService).currentUser()?.id;\n return isConversationRoomCreator(context.conversation, currentUserId)\n ? '@acorex:chat.actions.delete'\n : '@acorex:chat.actions.leave-and-delete';\n },\n icon: (context) => {\n if (!isGroupLikeConversation(context.conversation)) {\n return 'fa-light fa-trash';\n }\n const currentUserId = inject(AXConversationService).currentUser()?.id;\n return isConversationRoomCreator(context.conversation, currentUserId)\n ? 'fa-light fa-trash'\n : 'fa-light fa-door-open';\n },\n tooltip: (context) => {\n if (!isGroupLikeConversation(context.conversation)) {\n return '@acorex:chat.tooltips.delete-conversation';\n }\n const currentUserId = inject(AXConversationService).currentUser()?.id;\n return isConversationRoomCreator(context.conversation, currentUserId)\n ? '@acorex:chat.tooltips.delete-conversation'\n : '@acorex:chat.tooltips.leave-and-delete-group';\n },\n destructive: true,\n priority: 50,\n handler: async (context) => {\n // Service handles confirmation dialog\n await inject(AXConversationService).deleteConversation(context.conversation.id);\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 ? '@acorex:chat.actions.unblock' : '@acorex:chat.actions.block'),\n icon: 'fa-light fa-ban',\n tooltip: '@acorex:chat.tooltips.block-conversation',\n destructive: true,\n priority: 40,\n visible: (context) => context.conversation.type === 'private',\n handler: async (context) => {\n const currentBlocked = context.conversation.blocked;\n await inject(AXConversationService).updateConversation(context.conversation.id, {\n blocked: !currentBlocked,\n });\n },\n};\n","/**\n * Default Conversation Tabs Plugin\n * Provides sidebar conversation filter tabs (all, private, groups, etc.)\n */\n\nimport type { AXConversation } from '../../../models';\nimport { AXConversationTab } from '../../../registries';\n\nfunction conversationHasUnread(c: AXConversation): boolean {\n return (c.unreadCount ?? 0) > 0;\n}\n\nfunction isConversationArchived(c: AXConversation): boolean {\n return !!c.archived;\n}\n\n/** Active (non-archived) conversations — archived chats only appear on the Archived tab. */\nfunction activeConversations(conversations: AXConversation[]): AXConversation[] {\n return conversations.filter((c) => !isConversationArchived(c));\n}\n\n/** Number of conversations (in the same scope as each tab's `filter`) that have any unread messages — not sum of unread counts. */\nfunction countConversationsWithUnreadInScope(\n conversations: AXConversation[],\n scope: (items: AXConversation[]) => AXConversation[],\n): number | undefined {\n const n = scope(conversations).filter(conversationHasUnread).length;\n return n || undefined;\n}\n\n// Individual conversation tab constants (no aggregate arrays)\nexport const AX_CONVERSATION_TAB_ALL: AXConversationTab = {\n id: 'all',\n label: '@acorex:chat.tabs.all',\n icon: 'fa-light fa-comments',\n priority: 100,\n filter: (conversations) => activeConversations(conversations),\n badge: (conversations) => countConversationsWithUnreadInScope(conversations, activeConversations),\n default: true,\n};\n\nexport const AX_CONVERSATION_TAB_PRIVATE: AXConversationTab = {\n id: 'private',\n label: '@acorex:chat.tabs.private',\n icon: 'fa-light fa-user',\n priority: 90,\n filter: (conversations) => activeConversations(conversations).filter((c) => c.type === 'private'),\n badge: (conversations) =>\n countConversationsWithUnreadInScope(conversations, (c) =>\n activeConversations(c).filter((x) => x.type === 'private'),\n ),\n};\n\nexport const AX_CONVERSATION_TAB_GROUPS: AXConversationTab = {\n id: 'groups',\n label: '@acorex:chat.tabs.groups',\n icon: 'fa-light fa-users',\n priority: 80,\n filter: (conversations) => activeConversations(conversations).filter((c) => c.type === 'group'),\n badge: (conversations) =>\n countConversationsWithUnreadInScope(conversations, (c) =>\n activeConversations(c).filter((x) => x.type === 'group'),\n ),\n};\n\nexport const AX_CONVERSATION_TAB_CHANNELS: AXConversationTab = {\n id: 'channels',\n label: '@acorex:chat.tabs.channels',\n icon: 'fa-light fa-hashtag',\n priority: 70,\n filter: (conversations) => activeConversations(conversations).filter((c) => c.type === 'channel'),\n badge: (conversations) =>\n countConversationsWithUnreadInScope(conversations, (c) =>\n activeConversations(c).filter((x) => x.type === 'channel'),\n ),\n};\n\nexport const AX_CONVERSATION_TAB_BOT: AXConversationTab = {\n id: 'bot',\n label: '@acorex:chat.tabs.bots',\n icon: 'fa-light fa-robot',\n priority: 65,\n filter: (conversations) => activeConversations(conversations).filter((c) => c.type === 'bot'),\n badge: (conversations) =>\n countConversationsWithUnreadInScope(conversations, (c) =>\n activeConversations(c).filter((x) => x.type === 'bot'),\n ),\n};\n\nexport const AX_CONVERSATION_TAB_UNREAD: AXConversationTab = {\n id: 'unread',\n label: '@acorex:chat.tabs.unread',\n icon: 'fa-light fa-envelope',\n priority: 60,\n filter: (conversations) => activeConversations(conversations).filter((c) => c.unreadCount > 0),\n badge: (conversations) =>\n countConversationsWithUnreadInScope(conversations, (c) =>\n activeConversations(c).filter((x) => x.unreadCount > 0),\n ),\n};\n\nexport const AX_CONVERSATION_TAB_ARCHIVED: AXConversationTab = {\n id: 'archived',\n label: '@acorex:chat.tabs.archived',\n icon: 'fa-light fa-archive',\n priority: 50,\n filter: (conversations) => conversations.filter(isConversationArchived),\n badge: (conversations) =>\n countConversationsWithUnreadInScope(conversations, (c) => c.filter(isConversationArchived)),\n};\n","/**\n * Conversation Tabs Plugins\n */\n\nexport * from './default-tabs.plugin';\n","/**\n * Default conversation avatar host when apps register only a user avatar component.\n * Routes private 1:1 chats through the user avatar; other types use built-in fallback display.\n */\n\nimport { AXAvatarComponent } from '@acorex/components/avatar';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { NgComponentOutlet } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_USER_AVATAR_COMPONENT } from '../../tokens/conversation-avatar.tokens';\nimport {\n resolveConversationAvatarDisplay,\n resolveConversationPeerUserId,\n resolveUserAvatarDisplay,\n} from '../../utils/avatar-context.utils';\nimport { pickComponentInputs } from '../../utils/component-inputs.utils';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\n\n@Component({\n selector: 'ax-conversation-default-conversation-avatar',\n encapsulation: ViewEncapsulation.None,\n imports: [NgComponentOutlet, AXAvatarComponent, AXDecoratorModule, AXImageComponent, AXLabelComponent],\n templateUrl: './conversation-default-conversation-avatar.component.html',\n host: {\n '[style.--ax-conversation-avatar-size.px]': 'size()',\n },\n})\nexport class AXConversationDefaultConversationAvatarComponent {\n private readonly conversationService = inject(AXConversationService, { optional: true });\n private readonly userAvatarComponent = inject(AX_CONVERSATION_USER_AVATAR_COMPONENT, { optional: true });\n\n readonly conversationId = input.required<string>();\n readonly size = input<number>(40);\n\n private readonly currentUserId = computed(() => this.conversationService?.currentUser()?.id);\n\n private readonly conversation = computed(() => {\n const conversationId = this.conversationId();\n if (!conversationId) {\n return undefined;\n }\n\n return this.conversationService?.getConversation(conversationId) ?? undefined;\n });\n\n readonly peerUserId = computed(() => {\n const conversation = this.conversation();\n if (!conversation || conversation.type !== 'private') {\n return undefined;\n }\n\n return resolveConversationPeerUserId(conversation, this.currentUserId());\n });\n\n readonly useUserAvatar = computed(() => this.userAvatarComponent ?? null);\n\n readonly userAvatarInputs = computed(() => {\n const conversation = this.conversation();\n const peerId = this.peerUserId();\n const userId = peerId ?? conversation?.id ?? '';\n const resolved =\n peerId && conversation\n ? resolveUserAvatarDisplay(peerId, conversation)\n : conversation\n ? resolveConversationAvatarDisplay(conversation, this.currentUserId())\n : { name: '?', avatar: undefined, icon: undefined };\n\n return {\n userId,\n size: this.size(),\n displayName: resolved.name,\n displayAvatar: resolved.avatar,\n displayIcon: resolved.icon,\n };\n });\n\n readonly filteredUserAvatarInputs = computed(() => {\n const component = this.useUserAvatar();\n if (!component) {\n return {};\n }\n\n return pickComponentInputs(component, this.userAvatarInputs());\n });\n\n readonly fallbackDisplay = computed(() => {\n const conversation = this.conversation();\n if (!conversation) {\n return { name: '?', avatar: undefined, icon: undefined };\n }\n\n return resolveConversationAvatarDisplay(conversation, this.currentUserId());\n });\n\n readonly fallbackInitials = computed(() =>\n AXConversationMessageUtilsService.getInitials(this.fallbackDisplay().name),\n );\n}\n","@if (useUserAvatar(); as userAvatar) {\n <ng-container *ngComponentOutlet=\"userAvatar; inputs: filteredUserAvatarInputs()\" />\n} @else {\n <ax-avatar [size]=\"size()\">\n @if (fallbackDisplay().avatar; as avatarSrc) {\n <ax-image [src]=\"avatarSrc\" [alt]=\"fallbackDisplay().name\"></ax-image>\n } @else if (fallbackDisplay().icon; as iconClass) {\n <ax-icon><i [class]=\"iconClass\" aria-hidden=\"true\"></i></ax-icon>\n } @else {\n <ax-label>{{ fallbackInitials() }}</ax-label>\n }\n </ax-avatar>\n}\n","/**\n * AXConversationModule\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 AXConversationComposerComponent,\n AXConversationComposerService,\n AXConversationContainerComponent,\n AXConversationInfoBarComponent,\n AXConversationInfoBarService,\n AXConversationMessageListComponent,\n AXConversationMessageListService,\n AXConversationSidebarComponent,\n AXConversationSidebarService,\n} from './components';\nimport { AXConversationDefaultConversationAvatarComponent } from './components/shared/conversation-default-conversation-avatar.component';\nimport { AXConversationInfiniteScrollDirective } from './directives';\nimport { provideConversationComposerFileTypes } from './plugins/composer/composer-actions/composer-file-types.plugin';\nimport {\n AXConversationComposerActionRegistry,\n AXConversationComposerTabRegistry,\n AXConversationInfoBarActionRegistry,\n AXConversationItemActionRegistry,\n AXConversationMessageActionRegistry,\n AXConversationMessageRendererRegistry,\n AXConversationTabRegistry,\n} from './registries';\nimport { AXConversationComposerGenerationStateService, AXConversationRegistryService, AXConversationService } from './services';\nimport {\n AXConversationApi,\n AXConversationApiLoggerService,\n AXConversationMessageApi,\n AXConversationRealtimeApi,\n AXConversationUserApi,\n} from './services/api';\nimport {\n AXConversationAvatarComponents,\n AXConversationConfig,\n AXConversationRegistryConfiguration,\n AX_CONVERSATION_CONFIG,\n AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT,\n AX_CONVERSATION_REGISTRY_CONFIG,\n AX_CONVERSATION_USER_AVATAR_COMPONENT,\n mergeWithDefaults,\n} from './tokens';\n\n/**\n * Configuration options for conversation module\n */\nexport interface AXConversationOptions {\n /** User API implementation (required) */\n userApi: Type<AXConversationUserApi>;\n /** Conversation Management API implementation (required) */\n conversationApi: Type<AXConversationApi>;\n /** Message API implementation (required) */\n messageApi: Type<AXConversationMessageApi>;\n /** Realtime API implementation (optional) */\n realtimeApi?: Type<AXConversationRealtimeApi>;\n /** Configuration overrides */\n config?: Partial<AXConversationConfig>;\n /** Registry configuration */\n registry?: Partial<AXConversationRegistryConfiguration>;\n /** Optional custom avatar components for the entire conversation UI */\n avatarComponents?: AXConversationAvatarComponents;\n}\n\nconst DECLARATIONS = [\n AXConversationContainerComponent,\n AXConversationSidebarComponent,\n AXConversationInfoBarComponent,\n AXConversationMessageListComponent,\n AXConversationComposerComponent,\n AXConversationInfiniteScrollDirective,\n];\n\n/** Internal default conversation avatar host; not part of the public module API. */\nconst INTERNAL_IMPORTS = [AXConversationDefaultConversationAvatarComponent];\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, avatarComponents } = 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: AXConversationIndexedDbUserApi,\n conversationApi: AXConversationIndexedDbConversationApi,\n messageApi: AXConversationIndexedDbMessageApi,\n })\n Import from @acorex/components/conversation`,\n );\n }\n providers.push(\n { provide: AXConversationUserApi, useClass: userApi },\n { provide: AXConversationApi, useClass: conversationApi },\n { provide: AXConversationMessageApi, useClass: messageApi },\n );\n\n const mergedConfig = mergeWithDefaults(config);\n providers.push({ provide: AX_CONVERSATION_CONFIG, useValue: mergedConfig });\n\n // Built-in conversation file-type plugins (image, video, audio, file, voice) + validation rules\n providers.push(...provideConversationComposerFileTypes());\n\n if (realtimeApi) {\n providers.push({ provide: AXConversationRealtimeApi, useClass: realtimeApi });\n }\n\n providers.push(\n AXConversationService,\n AXConversationComposerGenerationStateService,\n AXConversationApiLoggerService,\n AXConversationComposerService,\n AXConversationInfoBarService,\n AXConversationMessageListService,\n AXConversationSidebarService,\n );\n }\n\n if (registry) {\n providers.push({ provide: AX_CONVERSATION_REGISTRY_CONFIG, useValue: registry });\n }\n\n if (avatarComponents?.user) {\n providers.push({\n provide: AX_CONVERSATION_USER_AVATAR_COMPONENT,\n useValue: avatarComponents.user,\n });\n }\n\n if (avatarComponents?.conversation) {\n providers.push({\n provide: AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT,\n useValue: avatarComponents.conversation,\n });\n } else if (avatarComponents?.user) {\n providers.push({\n provide: AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT,\n useValue: AXConversationDefaultConversationAvatarComponent,\n });\n }\n\n if (includeServices) {\n providers.push(\n AXConversationMessageRendererRegistry,\n AXConversationMessageActionRegistry,\n AXConversationComposerActionRegistry,\n AXConversationComposerTabRegistry,\n AXConversationTabRegistry,\n AXConversationInfoBarActionRegistry,\n AXConversationItemActionRegistry,\n AXConversationRegistryService,\n );\n }\n\n return providers;\n}\n\n@NgModule({\n imports: [CommonModule, FormsModule, ...DECLARATIONS, ...INTERNAL_IMPORTS],\n exports: [...DECLARATIONS],\n providers: [],\n})\nexport class AXConversationModule {\n /**\n * Configure module for root module with singleton services.\n * @deprecated Use standalone components with provideConversation()\n */\n static forRoot(options: AXConversationOptions): ModuleWithProviders<AXConversationModule> {\n return {\n ngModule: AXConversationModule,\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<AXConversationModule> {\n return {\n ngModule: AXConversationModule,\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 * AXConversationIndexedDbUserApi,\n * AXConversationIndexedDbConversationApi,\n * AXConversationIndexedDbMessageApi,\n * AXConversationIndexedDbRealtimeApi\n * } from '@acorex/components/conversation';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideConversation({\n * userApi: AXConversationIndexedDbUserApi,\n * conversationApi: AXConversationIndexedDbConversationApi,\n * messageApi: AXConversationIndexedDbMessageApi,\n * realtimeApi: AXConversationIndexedDbRealtimeApi,\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 AXConversationErrorMessage {\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 AX_CONVERSATION_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 AX_CONVERSATION_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 AX_CONVERSATION_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 AX_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 AX_CONVERSATION_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 AX_CONVERSATION_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 AX_CONVERSATION_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 * All error messages combined\n */\nexport const AX_CONVERSATION_ERROR_MESSAGES = {\n MESSAGE: AX_CONVERSATION_MESSAGE_ERRORS,\n FILE: AX_CONVERSATION_FILE_ERRORS,\n USER: AX_CONVERSATION_USER_ERRORS,\n CONVERSATION: AX_CONVERSATION_ERRORS,\n CONNECTION: AX_CONVERSATION_CONNECTION_ERRORS,\n LOCATION: AX_CONVERSATION_LOCATION_ERRORS,\n URL: AX_CONVERSATION_URL_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, AXConversationErrorMessage> | null = null;\n\n/**\n * Build error lookup cache\n * @returns Map of error codes to error messages\n */\nfunction buildErrorLookupCache(): Map<string, AXConversationErrorMessage> {\n if (errorLookupCache) {\n return errorLookupCache;\n }\n\n errorLookupCache = new Map();\n \n for (const category of Object.values(AX_CONVERSATION_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 AXConversationErrorCode = \n | typeof AX_CONVERSATION_MESSAGE_ERRORS[keyof typeof AX_CONVERSATION_MESSAGE_ERRORS]['code']\n | typeof AX_CONVERSATION_FILE_ERRORS[keyof typeof AX_CONVERSATION_FILE_ERRORS]['code']\n | typeof AX_CONVERSATION_USER_ERRORS[keyof typeof AX_CONVERSATION_USER_ERRORS]['code']\n | typeof AX_CONVERSATION_ERRORS[keyof typeof AX_CONVERSATION_ERRORS]['code']\n | typeof AX_CONVERSATION_CONNECTION_ERRORS[keyof typeof AX_CONVERSATION_CONNECTION_ERRORS]['code']\n | typeof AX_CONVERSATION_LOCATION_ERRORS[keyof typeof AX_CONVERSATION_LOCATION_ERRORS]['code']\n | typeof AX_CONVERSATION_URL_ERRORS[keyof typeof AX_CONVERSATION_URL_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// Plugins\nexport * from './plugins';\n\n// Module & Providers\nexport * from './conversation.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":["applyLocalPreview","createLocalPreviewUrl","mergeUploadResult","revokeObjectUrl","toUploaderReference","EMPTY","loose","str","num","i1","i3","i4","i5","i2","MB","blobUrl","mediaDuration"],"mappings":"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"}