@acorex/components 21.0.3-next.39 → 21.0.3-next.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/{conversation2 → conversation}/README.md +23 -23
  2. package/fesm2022/acorex-components-button.mjs +4 -4
  3. package/fesm2022/acorex-components-button.mjs.map +1 -1
  4. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-C28hl7iD.mjs +101 -0
  5. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-C28hl7iD.mjs.map +1 -0
  6. package/fesm2022/acorex-components-conversation-emoji-categories-C7Gm95V0.mjs +1840 -0
  7. package/fesm2022/acorex-components-conversation-emoji-categories-C7Gm95V0.mjs.map +1 -0
  8. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-Duvap4M4.mjs +223 -0
  9. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-Duvap4M4.mjs.map +1 -0
  10. package/fesm2022/{acorex-components-conversation2.mjs → acorex-components-conversation.mjs} +20368 -20258
  11. package/fesm2022/acorex-components-conversation.mjs.map +1 -0
  12. package/fesm2022/acorex-components-kbd.mjs +2 -2
  13. package/fesm2022/acorex-components-kbd.mjs.map +1 -1
  14. package/fesm2022/acorex-components-scheduler-picker.mjs +22 -14
  15. package/fesm2022/acorex-components-scheduler-picker.mjs.map +1 -1
  16. package/fesm2022/acorex-components-side-menu.mjs +4 -13
  17. package/fesm2022/acorex-components-side-menu.mjs.map +1 -1
  18. package/fesm2022/acorex-components-tree-view.mjs +2 -2
  19. package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
  20. package/package.json +6 -10
  21. package/types/{acorex-components-conversation2.d.ts → acorex-components-conversation.d.ts} +2008 -1629
  22. package/types/acorex-components-scheduler-picker.d.ts +2 -0
  23. package/types/acorex-components-side-menu.d.ts +1 -3
  24. package/fesm2022/acorex-components-conversation2.mjs.map +0 -1
  25. package/fesm2022/acorex-components-sidebar.mjs +0 -275
  26. package/fesm2022/acorex-components-sidebar.mjs.map +0 -1
  27. package/sidebar/README.md +0 -5
  28. package/types/acorex-components-sidebar.d.ts +0 -132
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-components-conversation.mjs","sources":["../../../../packages/components/conversation/src/lib/services/api/api-types.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/models/message-file-type-catalog.ts","../../../../packages/components/conversation/src/lib/services/conversation-media-send.loader.ts","../../../../packages/components/conversation/src/lib/utils/message-payload-normalize.ts","../../../../packages/components/conversation/src/lib/tokens/conversation-config.interface.ts","../../../../packages/components/conversation/src/lib/tokens/conversation-features.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/utils/message-utils.service.ts","../../../../packages/components/conversation/src/lib/utils/avatar-context.utils.ts","../../../../packages/components/conversation/src/lib/utils/conversation-display.utils.ts","../../../../packages/components/conversation/src/lib/utils/validation.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/registries/composer-action.registry.ts","../../../../packages/components/conversation/src/lib/registries/composer-tab.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/plugins/composer/composer-upload.config.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/components/message-list/message-list.service.ts","../../../../packages/components/conversation/src/lib/components/composer/composer.service.ts","../../../../packages/components/conversation/src/lib/components/shared/registry-component-outlet.component.ts","../../../../packages/components/conversation/src/lib/components/composer/composer.component.ts","../../../../packages/components/conversation/src/lib/components/container/conversation-container.component.ts","../../../../packages/components/conversation/src/lib/components/container/conversation-container.directive.ts","../../../../packages/components/conversation/src/lib/components/info-bar/info-bar.service.ts","../../../../packages/components/conversation/src/lib/components/shared/conversation-avatar.component.ts","../../../../packages/components/conversation/src/lib/components/info-bar/info-bar.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/forward-message-dialog.component.ts","../../../../packages/components/conversation/src/lib/directives/infinite-scroll.directive.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list-empty-default.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list-no-active-default.component.ts","../../../../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/sidebar/conversation-item.component.ts","../../../../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/shared/avatar-picker.component.ts","../../../../packages/components/conversation/src/lib/components/sidebar/new-conversation-dialog.component.ts","../../../../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/plugins/apis/indexeddb-storage.ts","../../../../packages/components/conversation/src/lib/plugins/apis/chat-storage.helpers.ts","../../../../packages/components/conversation/src/lib/plugins/apis/shared-storage.ts","../../../../packages/components/conversation/src/lib/plugins/apis/pagination-demo-data.ts","../../../../packages/components/conversation/src/lib/plugins/apis/shared-storage.seed.ts","../../../../packages/components/conversation/src/lib/plugins/apis/pagination.utils.ts","../../../../packages/components/conversation/src/lib/plugins/apis/indexeddb-user-api.service.ts","../../../../packages/components/conversation/src/lib/plugins/apis/indexeddb-conversation-api.service.ts","../../../../packages/components/conversation/src/lib/plugins/apis/indexeddb-message-api.service.ts","../../../../packages/components/conversation/src/lib/plugins/apis/indexeddb-realtime-api.service.ts","../../../../packages/components/conversation/src/lib/plugins/apis/ai-responder.service.ts","../../../../packages/components/conversation/src/lib/plugins/apis/indexeddb-message-ai-api.service.ts","../../../../packages/components/conversation/src/lib/plugins/apis/index.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/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-footer/picker-footer.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/picker-header/picker-header.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-caption.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-shared.styles.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-empty.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-upload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-shell.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-toolbar.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/audio-picker/audio-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/composer-tabs/default-tabs.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/composer-tabs/index.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/emoji-tab/emoji-tab.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/file-renderer/file.payload.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-composer.payload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/file-picker/file-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/image-renderer/image.payload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/image-picker/conversation-image.file-type.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/image-picker/image-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/location-picker/location-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-drag-handlers.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/sticker-tab/sticker-tab.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/video-renderer/video.payload.ts","../../../../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/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/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/conversation-info-panel.utils.ts","../../../../packages/components/conversation/src/lib/plugins/info-bar/components/conversation-info-panel.component.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/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/image-attachment.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/video-attachment.component.ts","../../../../packages/components/conversation/src/lib/plugins/info-bar/components/conversation-info-media-view.component.ts","../../../../packages/components/conversation/src/lib/plugins/info-bar/components/search.component.ts","../../../../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/file-attachment.component.ts","../../../../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/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/playback-banner-sync.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/renderer-shared.styles.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/audio-renderer/audio-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/fallback-renderer/fallback-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/file-renderer/file-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/image-renderer/image-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/location-renderer/location-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/sticker-renderer/sticker-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/system-renderer/system-renderer.component.ts","../../../../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/video-renderer/video-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/voice-renderer/voice-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-actions/default-actions.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-payload.dispatch.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/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":["/**\n * Shared API Types\n * Common types used across all API services\n */\n\n/**\n * Pagination parameters\n */\nexport interface AXConversationPagination {\n /** Page number (0-based) */\n page: number;\n\n /** Items per page */\n pageSize: number;\n\n /** Cursor for cursor-based pagination (optional) */\n cursor?: string;\n\n /** Sort field */\n sortBy?: string;\n\n /** Sort direction */\n sortDirection?: 'asc' | 'desc';\n}\n\n/**\n * Paginated response\n */\nexport interface AXConversationPaginatedResult<T> {\n /** Result items */\n items: T[];\n\n /** Total count (if available) */\n total?: number;\n\n /** Next page cursor (for cursor-based pagination) */\n nextCursor?: string;\n\n /** Previous page cursor */\n prevCursor?: string;\n\n /** Whether there are more pages */\n hasMore: boolean;\n\n /** Current page number */\n page?: number;\n\n /** Total pages */\n totalPages?: number;\n}\n\n/**\n * Pagination cursor state for a single list (conversations or messages).\n */\nexport interface AXConversationPaginationState {\n page: number;\n hasMore: boolean;\n nextCursor?: string;\n}\n\n/**\n * Connection status\n */\nexport type AXConversationConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';\n\n/**\n * API Error with details\n */\nexport interface AXConversationApiError {\n /** Error code */\n code: string;\n\n /** Error message */\n message: string;\n\n /** HTTP status code */\n statusCode?: number;\n\n /** Additional details */\n details?: unknown;\n\n /** Timestamp */\n timestamp?: Date;\n}\n\n/**\n * User presence status\n */\nexport type AXConversationPresenceStatus = 'online' | 'offline' | 'away' | 'busy' | 'invisible';\n\n/**\n * User role in conversation\n */\nexport type AXConversationUserRole = 'owner' | 'admin' | 'member' | 'guest';\n","/**\n * Abstract Conversation Management API\n * Handle conversation CRUD operations, participants, and settings\n */\n\nimport type { AXConversation, AXConversationType, AXConversationParticipant } from '../../models';\nimport type { AXConversationApiError, AXConversationPaginatedResult, AXConversationPagination, AXConversationUserRole } 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\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 * 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 * Conversation settings update\n */\nexport interface AXConversationSettingsUpdate {\n /** Muted until timestamp */\n mutedUntil?: Date;\n /** Show notifications */\n notifications?: boolean;\n /** Custom notification sound */\n notificationSound?: string;\n /** Show message preview in notifications */\n showPreview?: boolean;\n /** Custom settings */\n custom?: Record<string, unknown>;\n}\n\n/**\n * Participant update data\n */\nexport interface AXConversationParticipantUpdate {\n /** User ID */\n userId: string;\n /** New role */\n role?: AXConversationUserRole;\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 conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXConversationApiError} If deletion fails\n */\n abstract deleteConversation(conversationId: string): Promise<boolean>;\n\n // =====================\n // Conversation Actions\n // =====================\n\n /**\n * Archive conversation\n *\n * @param conversationId - Conversation ID\n * @throws {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 * Mark conversation as unread\n *\n * @param conversationId - Conversation ID\n * @throws {AXConversationApiError} If marking fails\n */\n abstract markConversationAsUnread(conversationId: string): Promise<void>;\n\n // =====================\n // Search & Filter\n // =====================\n\n /**\n * Search conversations\n *\n * @param query - Search query\n * @returns Matching conversations\n * @throws {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 // Settings Management\n // =====================\n\n /**\n * Get conversation settings\n *\n * @param conversationId - Conversation ID\n * @returns Conversation settings\n * @throws {AXConversationApiError} If request fails\n */\n abstract getConversationSettings(conversationId: string): Promise<AXConversationSettingsUpdate>;\n\n /**\n * Update conversation settings\n *\n * @param conversationId - Conversation ID\n * @param settings - Settings to update\n * @throws {AXConversationApiError} If update fails\n */\n abstract updateConversationSettings(conversationId: string, settings: AXConversationSettingsUpdate): Promise<void>;\n\n /**\n * Mute conversation\n *\n * @param conversationId - Conversation ID\n * @param duration - Mute duration in milliseconds (undefined = forever)\n * @throws {AXConversationApiError} If muting fails\n */\n abstract muteConversation(conversationId: string, duration?: number): Promise<void>;\n\n /**\n * Unmute conversation\n *\n * @param conversationId - Conversation ID\n * @throws {AXConversationApiError} If unmuting fails\n */\n abstract unmuteConversation(conversationId: string): Promise<void>;\n\n // =====================\n // Media & Files\n // =====================\n\n /**\n * Upload conversation avatar\n *\n * @param conversationId - Conversation ID\n * @param file - Avatar image file\n * @returns Avatar URL\n * @throws {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 connections and real-time event subscriptions\n */\n\nimport { Observable } from 'rxjs';\nimport type { AXConversation, AXConversationMessage, AXConversationPresenceUpdate, AXConversationTypingIndicator } from '../../models';\nimport type { AXConversationConnectionStatus } from './api-types';\n\n/**\n * Connection options\n */\nexport interface AXConversationConnectionOptions {\n /** WebSocket/SSE endpoint URL */\n url?: string;\n /** Authentication token */\n token?: string;\n /** Reconnect automatically on disconnect */\n autoReconnect?: boolean;\n /** Reconnect delay in milliseconds */\n reconnectDelay?: number;\n /** Maximum reconnect attempts */\n maxReconnectAttempts?: number;\n /** Heartbeat interval in milliseconds */\n heartbeatInterval?: number;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Connection event\n */\nexport interface AXConversationConnectionEvent {\n /** Event type */\n type: 'connected' | 'disconnected' | 'reconnecting' | 'error';\n /** Timestamp */\n timestamp: Date;\n /** Error message if applicable */\n error?: string;\n /** Attempt number for reconnecting */\n attempt?: number;\n}\n\n/**\n * Notification event\n */\nexport interface AXConversationNotificationEvent {\n /** Notification ID */\n id: string;\n /** Notification type */\n type: 'message' | 'mention' | 'reaction' | 'call' | 'system';\n /** Title */\n title: string;\n /** Body text */\n body: string;\n /** Related conversation ID */\n conversationId?: string;\n /** Related message ID */\n messageId?: string;\n /** Icon URL */\n icon?: string;\n /** Timestamp */\n timestamp: Date;\n /** Custom data */\n data?: Record<string, unknown>;\n}\n\n/**\n * Call event\n */\nexport interface AXConversationCallEvent {\n /** Call ID */\n callId: string;\n /** Call type */\n type: 'voice' | 'video';\n /** Call status */\n status: 'incoming' | 'outgoing' | 'accepted' | 'rejected' | 'ended' | 'missed';\n /** Caller user ID */\n callerId: string;\n /** Conversation ID */\n conversationId: string;\n /** Timestamp */\n timestamp: Date;\n /** Call duration in seconds (for ended calls) */\n duration?: number;\n}\n\n/**\n * Abstract Real-time Events API\n *\n * Implement this abstract class to handle real-time event subscriptions.\n * Supports WebSocket, SSE, or any other real-time protocol.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyRealtimeApi extends AXConversationRealtimeApi {\n * private socket: WebSocket;\n * private connectionStatus$ = new BehaviorSubject<AXConversationConnectionStatus>('disconnected');\n *\n * async connect(options?: AXConversationConnectionOptions): Promise<void> {\n * this.socket = new WebSocket(options?.url || 'ws://localhost:3000');\n * this.socket.onopen = () => this.connectionStatus$.next('connected');\n * // ... handle other events\n * }\n *\n * subscribeToMessages(conversationId: string): Observable<AXConversationMessage> {\n * return new Observable(subscriber => {\n * this.socket.addEventListener('message', (event) => {\n * const data = JSON.parse(event.data);\n * if (data.type === 'message' && data.conversationId === conversationId) {\n * subscriber.next(data.message);\n * }\n * });\n * });\n * }\n *\n * // ... implement other methods\n * }\n * ```\n */\nexport abstract class AXConversationRealtimeApi {\n /**\n * Current connection status\n * Emit connection status changes through this observable\n */\n abstract readonly connectionStatus$: Observable<AXConversationConnectionStatus>;\n\n // =====================\n // Connection Management\n // =====================\n\n /**\n * Connect to real-time server\n * Establish WebSocket/SSE connection\n *\n * @param options - Connection options\n * @throws {Error} If connection fails\n */\n abstract connect(options?: AXConversationConnectionOptions): Promise<void>;\n\n /**\n * Disconnect from real-time server\n * Close connection and clean up resources\n */\n abstract disconnect(): Promise<void>;\n\n /**\n * Check if currently connected\n *\n * @returns True if connected\n */\n abstract isConnected(): boolean;\n\n /**\n * Reconnect to server\n * Manually trigger reconnection\n */\n abstract reconnect(): Promise<void>;\n\n /**\n * Subscribe to connection events\n *\n * @returns Observable of connection events\n */\n abstract subscribeToConnectionEvents(): Observable<AXConversationConnectionEvent>;\n\n // =====================\n // Message Events\n // =====================\n\n /**\n * Subscribe to new messages in a conversation\n *\n * @param conversationId - Conversation ID (empty string for all conversations)\n * @returns Observable stream of new messages\n */\n abstract subscribeToMessages(conversationId: string): Observable<AXConversationMessage>;\n\n /**\n * Subscribe to message updates (edits, status changes)\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of updated messages\n */\n abstract subscribeToMessageUpdates(conversationId?: string): Observable<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 reactions\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of updated messages with reactions\n */\n abstract subscribeToMessageReactions(conversationId?: string): Observable<AXConversationMessage>;\n\n // =====================\n // Conversation Events\n // =====================\n\n /**\n * Subscribe to conversation updates\n * Fires when conversation details change (title, avatar, participants, etc.)\n *\n * @returns Observable stream of updated conversations\n */\n abstract subscribeToConversationUpdates(): Observable<AXConversation>;\n\n /**\n * Subscribe to conversation creation\n * Fires when user is added to a new conversation\n *\n * @returns Observable stream of new conversations\n */\n abstract subscribeToConversationCreated(): Observable<AXConversation>;\n\n /**\n * Subscribe to conversation deletion\n * Fires when a conversation is deleted\n *\n * @returns Observable stream of deleted conversation IDs\n */\n abstract subscribeToConversationDeleted(): Observable<string>;\n\n // =====================\n // Typing Indicators\n // =====================\n\n /**\n * Subscribe to typing indicators\n *\n * @param conversationId - Conversation ID (empty string for all conversations)\n * @returns Observable stream of typing indicators\n */\n abstract subscribeToTypingIndicators(conversationId: string): Observable<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 // Read Receipts\n // =====================\n\n /**\n * Subscribe to read receipt updates\n * Fires when someone reads messages\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of message IDs that were read\n */\n abstract subscribeToReadReceipts(conversationId?: string): Observable<{ messageId: string; userId: string; readAt: Date }>;\n\n // =====================\n // Notifications\n // =====================\n\n /**\n * Subscribe to push notifications\n * Fires for mentions, calls, and other important events\n *\n * @returns Observable stream of notification events\n */\n abstract subscribeToNotifications(): Observable<AXConversationNotificationEvent>;\n\n // =====================\n // Call Events (Optional)\n // =====================\n\n /**\n * Subscribe to call events\n * Fires for incoming/outgoing calls\n *\n * @returns Observable stream of call events\n */\n abstract subscribeToCallEvents?(): Observable<AXConversationCallEvent>;\n\n // =====================\n // User Events\n // =====================\n\n /**\n * Subscribe to user blocked/unblocked events\n *\n * @returns Observable stream of user IDs and block status\n */\n abstract subscribeToUserBlockEvents(): Observable<{ userId: string; blocked: boolean }>;\n\n /**\n * Subscribe to participant added/removed events\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of participant changes\n */\n abstract subscribeToParticipantEvents(\n conversationId?: string,\n ): Observable<{ conversationId: string; userId: string; action: 'added' | 'removed' }>;\n\n // =====================\n // System Events\n // =====================\n\n /**\n * Subscribe to system events\n * Fires for maintenance, updates, or other system-wide events\n *\n * @returns Observable stream of system events\n */\n abstract subscribeToSystemEvents(): Observable<{ type: string; message: string; data?: unknown }>;\n\n // =====================\n // Message Status Events\n // =====================\n\n /**\n * Subscribe to message status changes\n * Fires when message status changes (sending -> sent -> delivered -> read)\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of message status updates\n */\n abstract subscribeToMessageStatusChanges(conversationId?: string): Observable<{\n messageId: string;\n status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed';\n timestamp: Date;\n }>;\n\n // =====================\n // Conversation Settings Events\n // =====================\n\n /**\n * Subscribe to conversation settings changes\n * Fires when conversation settings are updated\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of settings updates\n */\n abstract subscribeToConversationSettingsChanges(conversationId?: string): Observable<{\n conversationId: string;\n settings: Record<string, unknown>;\n }>;\n\n // =====================\n // Draft Events\n // =====================\n\n /**\n * Subscribe to draft changes\n * Fires when draft is saved/updated in a conversation\n *\n * @param conversationId - Optional conversation ID to filter\n * @returns Observable stream of draft updates\n */\n abstract subscribeToDraftChanges(conversationId?: string): Observable<{\n conversationId: string;\n draft: string | null;\n }>;\n}\n","/**\n * Abstract User Management API\n * Handle user profile management and user operations for conversations\n */\n\nimport type { AXConversationParticipant, AXConversationPresenceUpdate, AXConversationUserProfile } from '../../models';\nimport type { AXConversationApiError, AXConversationPresenceStatus } 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<AXConversationParticipant>;\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<AXConversationParticipant>;\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 filters - Search filters\n * @returns List of users\n * @throws {AXConversationApiError} If request fails\n */\n abstract getUsers(filters?: AXConversationUserSearchFilters): Promise<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 * 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 // 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 abstracts\nexport * from './conversation-api.abstract';\nexport * from './message-api.abstract';\nexport * from './realtime-api.abstract';\nexport * from './user-api.abstract';\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 { 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","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 * Conversation Configuration Interface\n * Centralized configuration values to avoid magic numbers\n */\n\n/**\n * Main configuration interface for the conversation component\n */\nexport interface AXConversationConfig {\n // Pagination\n /** Number of messages to load per page */\n messagePageSize?: number;\n\n /** Number of conversations to load per page */\n conversationPageSize?: number;\n\n // Scroll Configuration\n /** Scroll threshold for detecting scroll events */\n scrollThreshold?: number;\n\n /** Infinite scroll threshold */\n infiniteScrollThreshold?: number;\n\n // Timeout Durations (milliseconds)\n /** Typing indicator timeout in milliseconds */\n typingIndicatorTimeout?: number;\n\n /** Typing indicator throttle in milliseconds (for rate limiting) */\n typingIndicatorThrottle?: number;\n\n /** Message highlight duration in milliseconds */\n messageHighlightDuration?: number;\n\n /** Search debounce delay in milliseconds */\n debounceSearch?: number;\n\n /** Date separator inactivity fade delay in milliseconds */\n // dateSeparatorFadeDelay?: number;\n\n // Message Storage Limits\n /** Maximum messages per conversation */\n maxMessagesPerConversation?: number;\n\n /** Maximum total messages in store */\n maxTotalMessages?: number;\n\n /** Maximum cached conversations */\n maxCachedConversations?: number;\n\n // UI Dimensions\n /** Minimum sidebar width in pixels */\n minSidebarWidth?: number;\n\n /** Maximum sidebar width in pixels */\n maxSidebarWidth?: number;\n\n /** Default sidebar width in pixels */\n defaultSidebarWidth?: number;\n\n // Cache\n /** Filter cache size */\n filterCacheSize?: number;\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 // 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 * Empty string = library default soft gradient. `transparent` or `none` = flat background.\n */\n messageListBackground?: string;\n\n /** Optional feature flags to reduce bundle size per app. */\n features?: import('./conversation-features').AXConversationFeatures;\n}\n","/**\n * Conversation feature flags for configurable bundle size.\n */\nexport type AXConversationMediaPickerFeature =\n | 'image'\n | 'video'\n | 'audio'\n | 'file'\n | 'voice'\n | 'location';\n\nexport type AXConversationComposerTabFeature = 'emoji' | 'sticker';\n\nexport interface AXConversationFeatures {\n /** Enabled composer media pickers; defaults to all when omitted. */\n mediaPickers?: AXConversationMediaPickerFeature[];\n /** Enabled composer popup tabs; defaults to all when omitted. */\n composerTabs?: AXConversationComposerTabFeature[];\n}\n\nexport const AX_ALL_CONVERSATION_MEDIA_PICKERS: readonly AXConversationMediaPickerFeature[] = [\n 'image',\n 'video',\n 'audio',\n 'file',\n 'voice',\n 'location',\n];\n\nexport const AX_ALL_CONVERSATION_COMPOSER_TABS: readonly AXConversationComposerTabFeature[] = ['emoji', 'sticker'];\n\nexport function resolveConversationMediaPickers(\n features?: AXConversationFeatures,\n): readonly AXConversationMediaPickerFeature[] {\n return features?.mediaPickers ?? AX_ALL_CONVERSATION_MEDIA_PICKERS;\n}\n\nexport function resolveConversationComposerTabs(\n features?: AXConversationFeatures,\n): readonly AXConversationComposerTabFeature[] {\n return features?.composerTabs ?? AX_ALL_CONVERSATION_COMPOSER_TABS;\n}\n\nexport function isMediaPickerEnabled(\n picker: AXConversationMediaPickerFeature,\n features?: AXConversationFeatures,\n): boolean {\n return resolveConversationMediaPickers(features).includes(picker);\n}\n\nexport function isComposerTabEnabled(\n tab: AXConversationComposerTabFeature,\n features?: AXConversationFeatures,\n): boolean {\n return resolveConversationComposerTabs(features).includes(tab);\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';\nimport { AX_ALL_CONVERSATION_COMPOSER_TABS, AX_ALL_CONVERSATION_MEDIA_PICKERS } from './conversation-features';\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: 1000,\n messageHighlightDuration: 2000,\n debounceSearch: 300,\n\n // Message Storage Limits\n maxMessagesPerConversation: 1000,\n maxTotalMessages: 10000,\n maxCachedConversations: 50,\n\n // UI Dimensions (pixels)\n minSidebarWidth: 250,\n maxSidebarWidth: 500,\n defaultSidebarWidth: 320,\n\n // Cache\n filterCacheSize: 100,\n\n // Message Validation\n maxMessageLength: 10000,\n minMessageLength: 1,\n\n maxFilesPerMessage: 3,\n\n // Intersection Observer\n messageReadThreshold: 0.3,\n\n // Message list\n messageListBackground: '',\n\n features: {\n mediaPickers: [...AX_ALL_CONVERSATION_MEDIA_PICKERS],\n composerTabs: [...AX_ALL_CONVERSATION_COMPOSER_TABS],\n },\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 mediaPickers: userConfig.features?.mediaPickers ?? AX_DEFAULT_CONVERSATION_CONFIG.features.mediaPickers,\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 */\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}\n\n/** Optional custom group/channel conversation avatar. */\nexport interface AXConversationConversationAvatarComponent {\n readonly conversationId: InputSignal<string>;\n readonly size: InputSignal<number>;\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","import { translateSync } from '@acorex/core/translation';\nimport type { AXConversation } from '../models/conversation.model';\nimport type {\n AXConversationAudioPayload,\n AXConversationFilePayload,\n AXConversationImagePayload,\n AXConversationMessagePayload,\n AXConversationTextPayload,\n AXConversationVideoPayload,\n} from '../models/message-payloads.model';\nimport type { AXConversationMessage } from '../models/message.model';\n\nexport class AXConversationMessageUtilsService {\n /**\n * Normalize optional avatar/icon values so empty or whitespace-only strings\n * are treated as missing data.\n */\n private static 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 * Get conversation avatar image URL.\n */\n static getConversationAvatar(conversation: AXConversation): string | undefined {\n return AXConversationMessageUtilsService.normalizeOptionalMediaValue(conversation.avatar);\n }\n\n /**\n * Font Awesome icon class(es) for a conversation when there is no avatar image.\n */\n static getConversationAvatarIcon(conversation: AXConversation): string | undefined {\n if (AXConversationMessageUtilsService.getConversationAvatar(conversation)) {\n return undefined;\n }\n return AXConversationMessageUtilsService.normalizeOptionalMediaValue(conversation.icon);\n }\n\n /**\n * Get sender name from message\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 /**\n * Get sender avatar image URL (takes precedence over {@link getSenderAvatarIcon}).\n */\n static getSenderAvatar(message: AXConversationMessage, conversation: AXConversation): string | undefined {\n const participant = conversation.participants.find((p) => p.id === message.senderId);\n return AXConversationMessageUtilsService.normalizeOptionalMediaValue(participant?.avatar);\n }\n\n /**\n * Font Awesome icon class(es) for the sender when there is no avatar image:\n * participant `icon` first, then conversation-level `icon`.\n */\n static getSenderAvatarIcon(message: AXConversationMessage, conversation: AXConversation): string | undefined {\n const participant = conversation.participants.find((p) => p.id === message.senderId);\n if (AXConversationMessageUtilsService.normalizeOptionalMediaValue(participant?.avatar)) {\n return undefined;\n }\n return (\n AXConversationMessageUtilsService.normalizeOptionalMediaValue(participant?.icon) ??\n AXConversationMessageUtilsService.getConversationAvatarIcon(conversation)\n );\n }\n\n /**\n * Get initials from name\n */\n static getInitials(name: string): string {\n if (!name) return '?';\n\n return name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .substring(0, 2);\n }\n\n /**\n * Type guard for text payload\n */\n static isTextPayload(payload: AXConversationMessagePayload): payload is AXConversationTextPayload {\n return 'text' in payload && typeof (payload as AXConversationTextPayload).text === 'string';\n }\n\n /**\n * Get message text content\n */\n static getMessageText(message: AXConversationMessage): string {\n if (message.type === 'text' && AXConversationMessageUtilsService.isTextPayload(message.payload)) {\n return message.payload.text;\n }\n return `[${message.type}]`;\n }\n\n /**\n * Format message preview text\n */\n static getPreviewText(message: AXConversationMessage, maxLength = 50): { value: string; type: string; icon: string } {\n // Handle different message types\n switch (message.type) {\n case 'text': {\n const textPayload = message.payload as { text?: string };\n const text = textPayload.text || '';\n const truncatedText = text.length > maxLength ? text.substring(0, maxLength) + '...' : text;\n return {\n value: truncatedText,\n type: 'text',\n icon: 'fa-light fa-message',\n };\n }\n case 'image': {\n const imagePayload = message.payload as AXConversationImagePayload;\n const images = Array.isArray(imagePayload.images) ? imagePayload.images : [];\n const first = images[0];\n const label =\n imagePayload.caption?.trim() ||\n (images.length > 1 ? `${images.length} images` : '');\n return {\n value: label || first?.thumbnailUrl || first?.url || '',\n type: 'image',\n icon: 'fa-light fa-image',\n };\n }\n case 'video': {\n const videoPayload = message.payload as AXConversationVideoPayload;\n const videos = Array.isArray(videoPayload.videos) ? videoPayload.videos : [];\n const first = videos[0];\n const label =\n videoPayload.caption?.trim() ||\n (videos.length > 1 ? `${videos.length} videos` : '');\n return {\n value: label || first?.url || '',\n type: 'video',\n icon: 'fa-light fa-video',\n };\n }\n case 'audio': {\n const audioPayload = message.payload as AXConversationAudioPayload;\n const audios = Array.isArray(audioPayload.audios) ? audioPayload.audios : [];\n const names = audios.map((a) => a.title).filter(Boolean).join(', ');\n const first = audios[0];\n const label =\n audioPayload.caption?.trim() ||\n (audios.length > 1 ? `${audios.length} audio files` : names);\n return {\n value: label || first?.url || '',\n type: 'audio',\n icon: 'fa-light fa-music',\n };\n }\n case 'voice': {\n const voicePayload = message.payload as { url?: string };\n return {\n value: voicePayload.url || '',\n type: 'voice',\n icon: 'fa-light fa-microphone',\n };\n }\n case 'file': {\n const filePayload = message.payload as AXConversationFilePayload;\n const files = Array.isArray(filePayload.files) ? filePayload.files : [];\n const names = files.map((f) => f.name).join(', ');\n const label =\n filePayload.caption?.trim() ||\n (files.length > 1 ? `${files.length} files` : names);\n return {\n value: label || names,\n type: 'file',\n icon: 'fa-light fa-file',\n };\n }\n case 'location': {\n const locationPayload = message.payload as { latitude?: number; longitude?: number };\n return {\n value:\n locationPayload.latitude && locationPayload.longitude\n ? `${locationPayload.latitude},${locationPayload.longitude}`\n : '',\n type: 'location',\n icon: 'fa-light fa-location-dot',\n };\n }\n case 'sticker': {\n const stickerPayload = message.payload as { url?: string };\n return {\n value: stickerPayload.url || '',\n type: 'sticker',\n icon: 'fa-light fa-face-smile',\n };\n }\n default:\n return {\n value: '',\n type: message.type,\n icon: 'fa-light fa-message',\n };\n }\n }\n\n /**\n * Check if message is from current user\n */\n static isOwnMessage(message: AXConversationMessage, currentUserId: string): boolean {\n return message.senderId === currentUserId;\n }\n\n /**\n * Get message status icon class (Font Awesome)\n */\n static getStatusIcon(message: AXConversationMessage): string {\n switch (message.status) {\n case 'sending':\n return 'fa-light fa-clock';\n case 'sent':\n return 'fa-light fa-check';\n case 'delivered':\n return 'fa-light fa-check-double';\n case 'read':\n return 'fa-light fa-check-double';\n case 'failed':\n return 'fa-light fa-circle-exclamation';\n default:\n return 'fa-light fa-check';\n }\n }\n\n /**\n * Check if message should show avatar\n */\n static shouldShowAvatar(\n message: AXConversationMessage,\n previousMessage: AXConversationMessage | undefined,\n conversation: AXConversation,\n ): boolean {\n // Always show avatar for group conversations\n if (conversation.type === 'group' || conversation.type === 'channel') {\n // Don't show if same sender as previous message within 5 minutes\n if (previousMessage && previousMessage.senderId === message.senderId) {\n const timeDiff = message.timestamp.getTime() - previousMessage.timestamp.getTime();\n return timeDiff > 5 * 60 * 1000; // 5 minutes\n }\n return true;\n }\n\n return false;\n }\n\n /**\n * Group messages by sender for consecutive messages\n */\n static shouldGroupWithPrevious(message: AXConversationMessage, previousMessage: AXConversationMessage | undefined): boolean {\n if (!previousMessage) return false;\n\n // Same sender\n if (message.senderId !== previousMessage.senderId) return false;\n\n // Within 5 minutes\n const timeDiff = message.timestamp.getTime() - previousMessage.timestamp.getTime();\n return timeDiff < 5 * 60 * 1000;\n }\n\n /**\n * Get conversation status for avatar (private conversations only)\n */\n static getConversationStatus(conversation: AXConversation): 'online' | 'offline' | 'away' | undefined {\n if (conversation.type === 'private') {\n return conversation.status.presence;\n }\n return undefined;\n }\n\n /**\n * Get typing indicator text for conversation\n */\n static getTypingText(conversation: AXConversation): string {\n const typingUsers = conversation.status.typingUsers;\n if (typingUsers.length === 0) return '';\n\n if (conversation.type === 'private') {\n return translateSync('@acorex:chat.status.typing');\n }\n\n const firstUser = conversation.participants.find((p) => p.id === typingUsers[0]);\n if (typingUsers.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: typingUsers.length } });\n }\n\n /**\n * Format last seen time\n */\n static formatLastSeen(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n\n if (seconds < 60) return 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 /**\n * Get conversation subtitle (status or member count)\n */\n static getConversationSubtitle(conversation: AXConversation): string {\n if (conversation.status.isTyping) {\n return AXConversationMessageUtilsService.getTypingText(conversation);\n }\n\n switch (conversation.type) {\n case 'private':\n if (conversation.status.presence === 'online') {\n return translateSync('@acorex:chat.status.online');\n }\n if (conversation.status.lastSeen) {\n return translateSync('@acorex:chat.status.last-seen', {\n params: { value: AXConversationMessageUtilsService.formatLastSeen(conversation.status.lastSeen) },\n });\n }\n return translateSync('@acorex:chat.status.offline');\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 } from '../models/conversation.model';\nimport type { AXConversationMessage } from '../models/message.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/** 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 const currentId = currentUserId ?? 'current-user';\n return conversation.participants.find((participant) => participant.id !== currentId)?.id;\n}\n\n/** Whether `auto` kind should render a user avatar for this conversation. */\nexport function shouldUseUserAvatarForConversation(\n conversation: AXConversation,\n currentUserId?: string,\n): boolean {\n return conversation.type === 'private' && !!resolvePrivatePeerUserId(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 return {\n name: title,\n avatar: AXConversationMessageUtilsService.getConversationAvatar(conversation),\n icon: AXConversationMessageUtilsService.getConversationAvatarIcon(conversation),\n };\n}\n","import type { AXConversation } from '../models/conversation.model';\nimport type { AXConversationParticipant } from '../models/participant.model';\nimport { resolvePrivatePeerUserId } from './avatar-context.utils';\n\nconst AX_CONVERSATION_GENERIC_PRIVATE_TITLES = new Set(['', 'new chat', 'new conversation']);\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/** 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 const peerId = resolvePrivatePeerUserId(conversation, currentUserId);\n if (!peerId) {\n return undefined;\n }\n\n return conversation.participants.find((participant) => participant.id === peerId);\n}\n\n/**\n * Resolves the display title for the current viewer.\n * Private 1v1 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 (conversation.type !== 'private') {\n return conversation.title;\n }\n\n const peer = resolvePrivatePeerParticipant(conversation, currentUserId);\n if (peer?.name) {\n return peer.name;\n }\n\n if (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 private title/avatar/icon.\n * Does not mutate the source object.\n */\nexport function resolveConversationForViewer(\n conversation: AXConversation,\n currentUserId?: string,\n): AXConversation {\n if (conversation.type !== 'private' || !currentUserId) {\n return conversation;\n }\n\n const peer = resolvePrivatePeerParticipant(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 * 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","/**\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 { AXConversation, AXConversationMessage, AXConversationParticipantStatus } from '../models';\nimport { normalizeMessagePayload } from '../utils/message-payload-normalize';\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\n readonly conversations = computed(\n () => {\n const convMap = this._conversations();\n return Array.from(convMap.values());\n },\n {\n equal: (a, b) => a.length === b.length && a.every((v, i) => v === b[i]),\n },\n );\n\n constructor(private readonly config: Required<AXConversationConfig>) {}\n\n setConversations(conversations: AXConversation[]): void {\n const convMap = new Map<string, AXConversation>();\n conversations.forEach((conv) => convMap.set(conv.id, conv));\n this._conversations.set(convMap);\n }\n\n 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 }\n\n setConversation(conversation: AXConversation): void {\n this._conversations.update((conversations) => {\n const newConversations = new Map(conversations);\n newConversations.set(conversation.id, conversation);\n return newConversations;\n });\n }\n\n 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\n const messageIds = this._conversationMessages().get(conversationId) || [];\n this._messages.update((messages) => {\n const newMessages = new Map(messages);\n messageIds.forEach((id) => newMessages.delete(id));\n return newMessages;\n });\n\n this._conversationMessages.update((map) => {\n const newMap = new Map(map);\n newMap.delete(conversationId);\n return newMap;\n });\n }\n\n 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 updateSettings(conversationId: string, settings: Partial<AXConversation['settings']>): void {\n const conversation = this._conversations().get(conversationId);\n if (!conversation) return;\n\n this.updateConversation(conversationId, {\n settings: { ...conversation.settings, ...settings },\n updatedAt: new Date(),\n });\n }\n\n 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 updateTypingIndicator(conversationId: string, userId: string, isTyping: boolean): void {\n const conversation = this._conversations().get(conversationId);\n if (!conversation) return;\n\n let typingUsers = [...conversation.status.typingUsers];\n\n if (isTyping) {\n if (!typingUsers.includes(userId)) {\n typingUsers.push(userId);\n }\n } else {\n typingUsers = typingUsers.filter((id) => id !== userId);\n }\n\n this.updateConversation(conversationId, {\n status: {\n ...conversation.status,\n isTyping: typingUsers.length > 0,\n typingUsers,\n },\n });\n }\n\n updateParticipantPresence(userId: string, status: AXConversationParticipantStatus, lastSeen?: Date): void {\n this._conversations.update((conversations) => {\n const newConversations = new Map(conversations);\n\n for (const [id, conv] of conversations) {\n const participant = conv.participants.find((p) => p.id === userId);\n if (participant) {\n const updatedConversation: AXConversation = {\n ...conv,\n participants: conv.participants.map((p) => (p.id === userId ? { ...p, status, lastSeen } : p)),\n status: conv.type === 'private' ? { ...conv.status, presence: status, lastSeen } : conv.status,\n };\n newConversations.set(id, updatedConversation);\n }\n }\n\n return newConversations;\n });\n }\n\n 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 /**\n * Replace all messages for a conversation (initial page load).\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 } from '@acorex/core/file';\nimport { inject, Injectable } from '@angular/core';\nimport type { AXConversationFeatures } from '../../../tokens/conversation-features';\nimport { isMediaPickerEnabled } from '../../../tokens/conversation-features';\nimport { AX_CONVERSATION_CONFIG } from '../../../tokens';\n\ntype AXConversationFilePickerKind = 'image' | 'video' | 'audio' | 'file' | 'voice';\n\nconst AX_CONVERSATION_FILE_PICKERS: readonly AXConversationFilePickerKind[] = ['image', 'video', 'audio', 'file', 'voice'];\n\nasync function loadConversationFileTypes(features?: AXConversationFeatures): Promise<AXFileType[]> {\n const enabled = AX_CONVERSATION_FILE_PICKERS.filter((picker) => isMediaPickerEnabled(picker, features));\n if (!enabled.length) {\n return [];\n }\n\n const types: AXFileType[] = [];\n\n for (const picker of enabled) {\n switch (picker) {\n case 'image': {\n const mod = await import('../components/image-picker/conversation-image.file-type');\n types.push(mod.createConversationImageFileType());\n break;\n }\n case 'video': {\n const mod = await import('../components/video-picker/conversation-video.file-type');\n types.push(mod.createConversationVideoFileType());\n break;\n }\n case 'audio': {\n const mod = await import('../components/audio-picker/conversation-audio.file-type');\n types.push(mod.createConversationAudioFileType());\n break;\n }\n case 'file': {\n const mod = await import('../components/file-picker/conversation-file.file-type');\n types.push(mod.createConversationFileFileType());\n break;\n }\n case 'voice': {\n const mod = await import('../components/voice-recorder/conversation-voice.file-type');\n types.push(mod.createConversationVoiceFileType());\n break;\n }\n }\n }\n\n return types;\n}\n\n/** Lazy-loads conversation file catalogs only for enabled media pickers. */\n@Injectable()\nexport class AXConversationComposerFileTypesProvider extends AXFileTypeInfoProvider {\n private readonly config = inject(AX_CONVERSATION_CONFIG, { optional: true });\n private cache: AXFileType[] | null = null;\n\n async items(): Promise<AXFileType[]> {\n if (!this.cache) {\n this.cache = await loadConversationFileTypes(this.config?.features);\n }\n return this.cache;\n }\n}\n","import { provideFileTypeInfoProvider, provideFileValidationRules } from '@acorex/core/file';\nimport { InjectionToken, type Provider } from '@angular/core';\nimport type { AXConversationFeatures } from '../../../tokens/conversation-features';\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 enabled pickers. */\nexport function provideConversationComposerFileTypes(_features?: AXConversationFeatures): Provider[] {\n return [\n provideFileValidationRules(),\n provideFileTypeInfoProvider(AXConversationComposerFileTypesProvider),\n {\n provide: AX_CONVERSATION_FILE_TYPES_READY,\n useValue: true,\n },\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 { AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport type { AXConversationRegistryItem } from './base-registry.abstract';\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 /** 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 /** 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: left or right */\n position: 'left' | 'right';\n\n /** Location: inline (show as button) or menu (show in dropdown menu) */\n location?: 'inline' | 'menu';\n\n /** 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 /** 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 fileTypeRegistry = inject(AXFileTypeRegistryService);\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 /** Left-side actions sorted by priority */\n readonly leftActions = computed(() =>\n [...this._actions()]\n .filter((action) => action.position === 'left')\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n );\n\n /** Right-side actions sorted by priority */\n readonly rightActions = computed(() =>\n [...this._actions()]\n .filter((action) => action.position === 'right')\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n );\n\n /** Left-side inline actions (location = 'inline' or undefined) */\n readonly leftInlineActions = computed(() => this.leftActions().filter((action) => action.location !== 'menu'));\n\n /** Left-side menu actions (location = 'menu') */\n readonly leftMenuActions = computed(() => this.leftActions().filter((action) => action.location === 'menu'));\n\n /** Right-side inline actions (location = 'inline' or undefined) */\n readonly rightInlineActions = computed(() => this.rightActions().filter((action) => action.location !== 'menu'));\n\n /** Right-side menu actions (location = 'menu') */\n readonly rightMenuActions = computed(() => this.rightActions().filter((action) => action.location === 'menu'));\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 // Add to registry\n this._actions.update((actions) => [...actions, action]);\n\n if (action.fileType) {\n void this.ensureFileTypeExists(action.fileType);\n }\n }\n\n private async ensureFileTypeExists(fileType: string): Promise<void> {\n const match = await this.fileTypeRegistry.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(position: 'left' | 'right', context: AXConversationComposerActionContext): AXConversationComposerAction[] {\n const actions = position === 'left' ? this.leftActions() : this.rightActions();\n return actions.filter((action) => runInInjectionContext(this.injector, () => action.visible(context)));\n }\n\n /**\n * Get enabled actions for a position\n */\n getEnabledActions(position: 'left' | 'right', context: AXConversationComposerActionContext): 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(catalogName: string, context: AXConversationComposerActionContext): 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(catalogName: string, context: AXConversationComposerActionContext): 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 * 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_DEFAULT_COMPOSER_TABS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\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 // Register default tabs from individual token\n inject(AX_CONVERSATION_DEFAULT_COMPOSER_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?.composerTabs?.forEach((tab) => this.register(tab));\n }\n\n /** All registered tabs */\n readonly tabs = this._tabs.asReadonly();\n\n /** Enabled tabs sorted by priority */\n readonly enabledTabs = computed(() =>\n [...this._tabs()].filter((tab) => tab.enabled !== false).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n );\n\n /**\n * Register a composer tab\n */\n register(tab: 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 * 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';\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 && action.location && action.location !== location) {\n return false;\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 * 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 { AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport { AXConversationComposerActionRegistry, type AXConversationComposerAction } from './composer-action.registry';\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 /** 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.register(text.AX_CONVERSATION_TEXT_RENDERER);\n this.register(system.AX_CONVERSATION_SYSTEM_RENDERER);\n this.register(fallback.AX_CONVERSATION_FALLBACK_RENDERER);\n }\n\n /** All registered renderers */\n readonly renderers = this._renderers.asReadonly();\n\n /** Renderers sorted by priority (highest first) */\n readonly sortedRenderers = computed(() => [...this._renderers()]);\n\n /**\n * Register a message renderer\n */\n register(renderer: 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\n */\n getRenderer(message: AXConversationMessage): AXConversationMessageRenderer | undefined {\n const sorted = this.sortedRenderers();\n return sorted.find((renderer) => renderer.type === message.type);\n }\n\n /**\n * Get renderer by type\n */\n getRendererByType(type: string): AXConversationMessageRenderer | undefined {\n return this._renderers().find((r) => r.type === type);\n }\n\n /**\n * Check if a message type is supported\n */\n isSupported(message: 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 { BehaviorSubject, catchError, EMPTY, Subject, takeUntil } from 'rxjs';\nimport type {\n AXConversation,\n AXConversationMetadata,\n AXConversationType,\n AXConversationMessage,\n AXConversationMessagePayload,\n AXConversationPresenceUpdate,\n AXConversationSendMessageCommand,\n AXConversationTypingIndicator,\n} from '../models';\nimport type {\n AXConversationUploadOptions,\n AXConversationSendMessageOptions,\n AXConversationUploaderReference,\n AXConversationUploaderResult,\n} from '../models/conversation-upload.types';\nimport { resolveConversationMessageFileType } from '../models/message-file-type-catalog';\nimport {\n applyLocalPreview,\n createLocalPreviewUrl,\n mergeUploadResult,\n revokeObjectUrl,\n} from './conversation-media-send.loader';\nimport { normalizeMessagePayloadAsync } from '../utils/message-payload-normalize';\nimport { AX_CONVERSATION_CONFIG } from '../tokens';\nimport { resolveConversationForViewer } from '../utils/conversation-display.utils';\nimport {\n validateConversationId,\n validateMessagePayload,\n validateMessageText,\n validateMessageType,\n} from '../utils/validation.utils';\nimport {\n AXConversationApi,\n AXConversationSettingsUpdate,\n AXConversationUpdateData,\n AXConversationMessageApi,\n AXConversationRealtimeApi,\n AXConversationUserApi,\n} from './api';\nimport type { AXConversationPaginationState } from './api/api-types';\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 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 // 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 _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 /** Emits when the active conversation changes, cancelling per-conversation subscriptions. */\n private readonly _conversationSwitch$ = new Subject<void>();\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 /** 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 /** Connection status */\n readonly connectionStatus$ =\n this.realtimeApi?.connectionStatus$ ?? new BehaviorSubject<'disconnected'>('disconnected').asObservable();\n\n /** Error stream */\n readonly errors$ = this.errorHandler.errors$;\n\n // Event observables\n readonly onMessageReceived = this._messageReceived$.asObservable();\n readonly onMessageUpdated = this._messageUpdated$.asObservable();\n readonly onMessageDeleted = this._messageDeleted$.asObservable();\n readonly onTypingIndicator = this._typingIndicator$.asObservable();\n readonly onPresenceChange = this._presenceUpdate$.asObservable();\n\n // Message count refresh event (emits messageId when counts need refresh)\n private readonly _messageCountRefresh$ = new Subject<{ messageId: string; type: 'reply' | 'forward' }>();\n readonly onMessageCountRefresh = this._messageCountRefresh$.asObservable();\n\n // Current user cache\n private _currentUser = signal<Awaited<ReturnType<typeof this.userApi.getCurrentUser>> | null>(null);\n readonly currentUser = this._currentUser.asReadonly();\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this._conversationSwitch$.next();\n this._conversationSwitch$.complete();\n this.destroy$.next();\n this.destroy$.complete();\n });\n\n this.initializeService();\n }\n\n /**\n * Initialize the service\n * Connects to API and loads initial data\n */\n private async initializeService(): Promise<void> {\n try {\n // Connect to real-time API (optional)\n if (this.realtimeApi) {\n await this.realtimeApi.connect();\n }\n\n // Load current user\n const currentUser = await this.userApi.getCurrentUser();\n this._currentUser.set(currentUser);\n\n // Subscribe to real-time events\n this.subscribeToEvents();\n\n // Load initial data\n await this.loadConversations();\n } catch (error) {\n const handledError = this.errorHandler.handle(error, 'initializeService');\n this._error.set(new Error(handledError.message));\n }\n }\n\n /**\n * Subscribe to real-time events\n * All subscriptions include error handling to prevent stream termination\n */\n private subscribeToEvents(): void {\n // Skip if realtime API is not provided\n if (!this.realtimeApi) {\n return;\n }\n // Subscribe to message updates\n this.realtimeApi\n .subscribeToMessageUpdates()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToMessageUpdates');\n return EMPTY; // Keep subscription alive\n }),\n )\n .subscribe((message) => {\n this.handleMessageUpdate(message);\n this._messageUpdated$.next(message);\n\n // Check if this is a reply or forward and refresh counts\n this.handleMessageCountUpdate(message);\n });\n\n // Subscribe to message deletions\n this.realtimeApi\n .subscribeToMessageDeletions()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToMessageDeletions');\n return EMPTY;\n }),\n )\n .subscribe((messageId) => {\n this.handleMessageDeletion(messageId);\n this._messageDeleted$.next(messageId);\n });\n\n // Subscribe to typing indicators\n this.realtimeApi\n .subscribeToTypingIndicators('')\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToTypingIndicators');\n return EMPTY;\n }),\n )\n .subscribe((indicator) => {\n this.handleTypingIndicator(indicator);\n this._typingIndicator$.next(indicator);\n });\n\n // Subscribe to presence updates\n this.realtimeApi\n .subscribeToPresenceUpdates()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToPresenceUpdates');\n return EMPTY;\n }),\n )\n .subscribe((update) => {\n this.handlePresenceUpdate(update);\n this._presenceUpdate$.next(update);\n });\n\n // Subscribe to conversation updates (for badge updates, last message, etc.)\n this.realtimeApi\n .subscribeToConversationUpdates()\n .pipe(\n takeUntil(this.destroy$),\n catchError((error) => {\n this.errorHandler.handle(error, 'subscribeToConversationUpdates');\n return EMPTY;\n }),\n )\n .subscribe((conversation) => {\n this.handleConversationUpdate(conversation);\n });\n\n // 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\n /**\n * Load conversations from server\n * Includes comprehensive error handling\n */\n async loadConversations(): Promise<void> {\n this._loading.set(true);\n this._error.set(null);\n\n try {\n const result = await this.conversationApi.getConversations(\n {\n page: 0,\n pageSize: this.config.conversationPageSize,\n },\n undefined,\n );\n\n // Store conversations\n this.state.setConversations(result.items);\n this._conversationsPagination.set({\n page: 0,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n });\n } catch (error) {\n const handledError = this.errorHandler.handle(error, 'loadConversations');\n this._error.set(new Error(handledError.message));\n } finally {\n this._loading.set(false);\n }\n }\n\n /**\n * Load more conversations (pagination)\n * Returns true if there are more pages available\n */\n async loadMoreConversations(page: number): Promise<boolean> {\n try {\n const result = await this.conversationApi.getConversations(\n {\n page,\n pageSize: this.config.conversationPageSize,\n },\n undefined,\n );\n\n // Append new conversations to existing ones\n if (result.items.length > 0) {\n this.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\n * Loads messages and subscribes to real-time updates\n * Note: Messages are now marked as read individually via intersection observer when viewed\n */\n async selectConversation(conversationId: string): Promise<void> {\n try {\n // Cancel previous per-conversation subscriptions before switching\n this._conversationSwitch$.next();\n\n this._activeConversationId.set(conversationId);\n\n // Load messages for this conversation (page 0 replaces cached messages for this chat)\n this._loadingActiveMessages.set(true);\n try {\n await this.loadMessages(conversationId, 0);\n } finally {\n this._loadingActiveMessages.set(false);\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\n try {\n const paginationState = this._messagesPaginationByConversation().get(conversationId);\n const cursor = page > 0 ? paginationState?.nextCursor : undefined;\n\n const result = await this.messageApi.getMessages(conversationId, {\n page,\n pageSize: this.config.messagePageSize,\n cursor,\n });\n\n if (page === 0) {\n this.state.setConversationMessages(conversationId, result.items);\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 /**\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(command: AXConversationSendMessageCommand, options?: AXConversationSendMessageOptions): 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 };\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.messageApi.sendMessage(sendCommand);\n this.state.deleteMessage(tempMessageId);\n this.state.addMessage(sentMessage);\n this.updateConversationLastMessage(sentMessage);\n\n if (sentMessage.forwarded && sentMessage.forwardedFrom?.messageId) {\n this._messageCountRefresh$.next({\n messageId: sentMessage.forwardedFrom.messageId,\n type: 'forward',\n });\n }\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 };\n\n this.state.addMessage(tempMessage);\n\n const sentMessage = await this.messageApi.sendMessage(sendCommand);\n\n this.state.deleteMessage(tempMessageId);\n this.state.addMessage(sentMessage);\n this.updateConversationLastMessage(sentMessage);\n\n if (sentMessage.forwarded && sentMessage.forwardedFrom?.messageId) {\n this._messageCountRefresh$.next({\n messageId: sentMessage.forwardedFrom.messageId,\n type: 'forward',\n });\n }\n } catch (error) {\n 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.messageApi.sendMessage(command);\n\n // Replace with real message\n this.state.deleteMessage(messageId);\n this.state.addMessage(sentMessage);\n\n // Update conversation's last message\n this.updateConversationLastMessage(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 // Store original message for rollback\n const originalMessage = this.state.getMessage(messageId);\n\n try {\n // Optimistic update\n this.state.updateMessage(messageId, {\n payload,\n editedAt: new Date(),\n });\n\n // Sync with server\n await this.messageApi.editMessage(messageId, payload);\n } catch (error) {\n // Rollback on failure\n if (originalMessage) {\n this.state.updateMessage(messageId, {\n payload: originalMessage.payload,\n editedAt: originalMessage.editedAt,\n });\n }\n\n this.errorHandler.handle(error, 'editMessage', { messageId });\n throw error;\n }\n }\n\n /**\n * Delete a message\n * Shows confirmation dialog, then deletes locally first (optimistic), then syncs with server\n */\n async deleteMessage(messageId: string, forEveryone = false): Promise<void> {\n // Show confirmation dialog\n const result = await this.dialogService.confirm(\n 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 'vertical',\n false,\n );\n\n // User cancelled\n if (!result.result) {\n return;\n }\n\n // Store message for rollback\n const message = this.state.getMessage(messageId);\n\n try {\n // Optimistic delete\n this.state.deleteMessage(messageId);\n\n // Sync with server\n await this.messageApi.deleteMessage(messageId, forEveryone);\n } catch (error) {\n // Rollback on failure\n if (message) {\n this.state.addMessage(message);\n }\n\n this.errorHandler.handle(error, 'deleteMessage', { messageId, forEveryone });\n throw error;\n }\n }\n\n /**\n * React to a message\n * Adds reaction optimistically, server update comes via subscription\n */\n async reactToMessage(messageId: string, emoji: string): Promise<void> {\n try {\n await this.messageApi.addReaction(messageId, emoji);\n // Update will come through subscribeToMessageUpdates\n } catch (error) {\n this.errorHandler.handle(error, 'reactToMessage', { messageId, emoji });\n throw error;\n }\n }\n\n /**\n * Get available reaction emojis from API\n * Returns default reactions on error\n */\n async getAvailableReactions(): Promise<string[]> {\n try {\n return await this.messageApi.getAvailableReactions();\n } catch (error) {\n this.errorHandler.handle(error, 'getAvailableReactions');\n // Return default reactions on error (consistent with other methods)\n return ['👍', '❤️', '😂', '😮', '😢', '🙏'];\n }\n }\n\n /**\n * Mark a single message as read\n * Updates message status locally and syncs with server\n */\n async markMessageAsRead(messageId: string): Promise<void> {\n const message = this.state.getMessage(messageId);\n if (!message || message.status === 'read') return;\n\n try {\n // Optimistic update\n this.state.updateMessage(messageId, { status: 'read' });\n\n // Sync with server\n await this.messageApi.markAsRead(message.conversationId, [messageId]);\n\n // Update conversation unread count\n const conversation = this.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 } catch (error) {\n // Rollback on failure\n this.state.updateMessage(messageId, { status: message.status });\n this.errorHandler.handle(error, 'markMessageAsRead', { messageId });\n // Don't throw - marking as read failure shouldn't break the app\n }\n }\n\n /**\n * Mark conversation as read\n * Marks messages locally and syncs with server\n */\n async markAsRead(conversationId: string): Promise<void> {\n const messages = this.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.messageApi.markAsRead(conversationId, unreadMessageIds);\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 * Send typing indicator\n * Non-critical operation, doesn't throw on failure\n */\n async sendTypingIndicator(conversationId: string): Promise<void> {\n try {\n await this.messageApi.sendTypingIndicator(conversationId);\n } catch (error) {\n // Log but don't throw - typing indicators are not critical\n this.errorHandler.handle(error, 'sendTypingIndicator', { conversationId });\n }\n }\n\n /**\n * Search conversations\n * Returns empty array on failure\n */\n async searchConversations(query: string): Promise<AXConversation[]> {\n try {\n return await this.conversationApi.searchConversations(query);\n } catch (error) {\n this.errorHandler.handle(error, 'searchConversations', { query });\n return []; // Return empty array on failure\n }\n }\n\n /**\n * Handle new message received\n */\n private handleNewMessage(message: AXConversationMessage): void {\n if (this.state.getMessage(message.id)) {\n return;\n }\n\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\n if (isFromOtherUser && !isActiveConversation) {\n this.state.incrementUnreadCount(message.conversationId);\n }\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 if (message.conversationId === this._activeConversationId()) {\n this.handleNewMessage(message);\n }\n return;\n }\n\n this.state.updateMessage(message.id, message);\n }\n\n /**\n * Handle message count update\n * Emits events when a message is a reply or forward so components can refresh counts\n */\n private handleMessageCountUpdate(message: AXConversationMessage): void {\n // If this message is a reply, emit event to refresh the original message's reply count\n if (message.replyTo?.id) {\n this._messageCountRefresh$.next({ messageId: message.replyTo.id, type: 'reply' });\n }\n\n // If this message is a forward, emit event to refresh the original message's forward count\n if (message.forwardedFrom?.messageId) {\n this._messageCountRefresh$.next({ messageId: message.forwardedFrom.messageId, type: 'forward' });\n }\n }\n\n /**\n * Handle message deletion\n */\n private handleMessageDeletion(messageId: string): void {\n this.state.deleteMessage(messageId);\n }\n\n /**\n * Handle typing indicator\n */\n private handleTypingIndicator(indicator: AXConversationTypingIndicator): void {\n // Ignore typing indicators from the current user\n const currentUser = this._currentUser();\n if (currentUser && indicator.userId === currentUser.id) {\n return;\n }\n\n this.state.updateTypingIndicator(indicator.conversationId, indicator.userId, true);\n\n // Clear typing indicator after timeout\n setTimeout(() => {\n this.state.updateTypingIndicator(indicator.conversationId, indicator.userId, false);\n }, this.config.typingIndicatorTimeout ?? 3000);\n }\n\n /**\n * Handle presence update\n */\n private handlePresenceUpdate(update: AXConversationPresenceUpdate): void {\n this.state.updateParticipantPresence(update.userId, update.status, update.lastSeen);\n }\n\n /**\n * Handle conversation update\n * Updates conversation metadata including unread count, last message, etc.\n */\n private handleConversationUpdate(conversation: AXConversation): void {\n const lastMessage = conversation.lastMessage;\n if (\n lastMessage &&\n conversation.id === this._activeConversationId() &&\n !this.state.getMessage(lastMessage.id)\n ) {\n this.state.addMessage(lastMessage);\n }\n\n this.state.setConversation(conversation);\n }\n\n /**\n * Update conversation's last message\n */\n private updateConversationLastMessage(message: AXConversationMessage): void {\n this.state.updateLastMessage(message);\n }\n\n // =====================\n // Conversation Update APIs\n // =====================\n\n /**\n * Update conversation properties\n * @param conversationId - Conversation ID\n * @param updates - Partial conversation updates\n */\n async updateConversation(conversationId: string, updates: Partial<AXConversation>): Promise<void> {\n try {\n 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.conversationApi.updateConversation(conversationId, apiUpdates);\n }\n\n if (archived !== undefined) {\n if (archived) {\n await this.conversationApi.archiveConversation(conversationId);\n } else {\n await this.conversationApi.unarchiveConversation(conversationId);\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<AXConversation['settings']>,\n ): Promise<void> {\n try {\n await this.conversationApi.updateConversationSettings(conversationId, settings as AXConversationSettingsUpdate);\n this.state.updateSettings(conversationId, settings);\n } catch (error) {\n this.errorHandler.handle(error, 'updateConversationSettings', { conversationId });\n throw error;\n }\n }\n\n /**\n * Update conversation title\n * @param conversationId - Conversation ID\n * @param title - New title\n */\n async updateConversationTitle(conversationId: string, title: string): Promise<void> {\n try {\n await this.conversationApi.updateConversation(conversationId, { title });\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 await this.conversationApi.updateConversation(conversationId, { metadata: mergedMetadata });\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 * @returns Created conversation\n */\n async createConversation(\n participantIds: string[],\n type: AXConversationType,\n metadata?: AXConversationMetadata,\n ): Promise<AXConversation> {\n try {\n const currentUser = this._currentUser();\n const creatorId = currentUser?.id;\n const isPrivate = type === 'private';\n const scopedParticipantIds = [...participantIds];\n if (creatorId && !scopedParticipantIds.includes(creatorId)) {\n scopedParticipantIds.unshift(creatorId);\n }\n\n const conversation = await this.conversationApi.createConversation({\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 ? undefined : AXConversationService.normalizeOptionalString(metadata?.['icon']),\n metadata: isPrivate ? undefined : metadata,\n });\n this.state.setConversation(conversation);\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 query - Optional search query\n * @returns List of users\n */\n async getUsers(query?: string): Promise<import('../models').AXConversationParticipant[]> {\n try {\n return await this.userApi.getUsers({ query });\n } catch (error) {\n this.errorHandler.handle(error, 'getUsers', { query });\n return [];\n }\n }\n\n /**\n * Mark entire conversation as read\n * @param conversationId - Conversation ID\n */\n async markConversationAsRead(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.markConversationAsRead(conversationId);\n this.state.resetUnreadCount(conversationId);\n } catch (error) {\n this.errorHandler.handle(error, 'markConversationAsRead', { conversationId });\n throw error;\n }\n }\n\n /**\n * Delete a conversation\n * Shows confirmation dialog, then deletes from server and store\n * @param conversationId - Conversation ID\n */\n async deleteConversation(conversationId: string): Promise<boolean> {\n // Get conversation title for confirmation message\n const conversation = this.state.getConversation(conversationId);\n const conversationTitle =\n conversation?.title || this.translation.translateSync('@acorex:chat.fallbacks.this-conversation');\n\n // Show confirmation dialog\n const result = await this.dialogService.confirm(\n this.translation.translateSync('@acorex:chat.dialog.delete-conversation.title'),\n this.translation.translateSync('@acorex:chat.dialog.delete-conversation.message', {\n params: { conversationTitle },\n }),\n 'danger',\n 'vertical',\n false,\n );\n\n // User cancelled\n if (!result.result) {\n return false;\n }\n\n try {\n // Delete from server\n const result = await this.conversationApi.deleteConversation(conversationId);\n\n if (!result) return false;\n\n // Delete from store\n this.state.deleteConversation(conversationId);\n\n // If this was the active conversation, clear selection\n if (this._activeConversationId() === conversationId) {\n this._activeConversationId.set(null);\n }\n return true;\n } catch (error) {\n this.errorHandler.handle(error, 'deleteConversation', { conversationId });\n throw error;\n }\n }\n\n /**\n * Get reply count for a message\n * @param messageId - Message ID\n * @returns Number of replies\n */\n async getReplyCount(messageId: string): Promise<number> {\n try {\n return await this.messageApi.getReplyCount(messageId);\n } catch (error) {\n this.errorHandler.handle(error, 'getReplyCount', { messageId });\n return 0;\n }\n }\n\n /**\n * Get forward count for a message\n * @param messageId - Message ID\n * @returns Number of times forwarded\n */\n async getForwardCount(messageId: string): Promise<number> {\n try {\n return await this.messageApi.getForwardCount(messageId);\n } catch (error) {\n this.errorHandler.handle(error, 'getForwardCount', { messageId });\n return 0;\n }\n }\n\n /**\n * Disconnect and cleanup\n * Cleanly closes all connections and resources\n */\n async disconnect(): Promise<void> {\n try {\n if (this.realtimeApi) {\n await this.realtimeApi.disconnect();\n }\n } catch (error) {\n this.errorHandler.handle(error, 'disconnect');\n // Don't throw - we're disconnecting anyway\n }\n }\n\n // =====================\n // Extended Conversation APIs\n // =====================\n\n /**\n * Archive conversation\n * @param conversationId - Conversation ID\n */\n async archiveConversation(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.archiveConversation(conversationId);\n this.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.conversationApi.unarchiveConversation(conversationId);\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.conversationApi.pinConversation(conversationId);\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.conversationApi.unpinConversation(conversationId);\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 await this.conversationApi.muteConversation(conversationId, duration);\n const mutedUntil = duration ? new Date(Date.now() + duration) : undefined;\n this.state.updateSettings(conversationId, { mutedUntil, notifications: false });\n } catch (error) {\n this.errorHandler.handle(error, 'muteConversation', { conversationId, duration });\n throw error;\n }\n }\n\n /**\n * Unmute conversation\n * @param conversationId - Conversation ID\n */\n async unmuteConversation(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.unmuteConversation(conversationId);\n this.state.updateSettings(conversationId, { mutedUntil: undefined, notifications: true });\n } catch (error) {\n this.errorHandler.handle(error, 'unmuteConversation', { conversationId });\n throw error;\n }\n }\n\n /**\n * Add participants to conversation\n * @param conversationId - Conversation ID\n * @param userIds - User IDs to add\n */\n async addParticipants(conversationId: string, userIds: string[]): Promise<void> {\n try {\n const updatedConversation = await this.conversationApi.addParticipants(conversationId, userIds);\n this.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.conversationApi.removeParticipant(conversationId, userId);\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.conversationApi.leaveConversation(conversationId);\n this.state.deleteConversation(conversationId);\n if (this._activeConversationId() === conversationId) {\n this._activeConversationId.set(null);\n }\n } catch (error) {\n this.errorHandler.handle(error, 'leaveConversation', { conversationId });\n throw error;\n }\n }\n\n /**\n * Save draft message\n * @param conversationId - Conversation ID\n * @param draft - Draft text\n */\n async saveDraft(conversationId: string, draft: string): Promise<void> {\n try {\n await this.conversationApi.saveDraft(conversationId, draft);\n this.state.updateConversation(conversationId, { draft });\n } catch (error) {\n this.errorHandler.handle(error, 'saveDraft', { conversationId });\n // Don't throw - draft saving is not critical\n }\n }\n\n /**\n * Clear draft message\n * @param conversationId - Conversation ID\n */\n async clearDraft(conversationId: string): Promise<void> {\n try {\n await this.conversationApi.clearDraft(conversationId);\n this.state.updateConversation(conversationId, { draft: undefined });\n } catch (error) {\n this.errorHandler.handle(error, 'clearDraft', { conversationId });\n // Don't throw - draft clearing is not critical\n }\n }\n\n // =====================\n // Extended Message APIs\n // =====================\n\n /**\n * Pin message in conversation\n * @param conversationId - Conversation ID\n * @param messageId - Message ID\n */\n async pinMessage(conversationId: string, messageId: string): Promise<void> {\n try {\n await this.messageApi.pinMessage(conversationId, messageId);\n this.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.messageApi.unpinMessage(conversationId, messageId);\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 try {\n await this.messageApi.forwardMessage({\n messageId,\n conversationIds,\n caption,\n });\n // Emit forward count update\n this._messageCountRefresh$.next({ messageId, type: 'forward' });\n } catch (error) {\n this.errorHandler.handle(error, 'forwardMessage', { messageId, conversationIds });\n throw error;\n }\n }\n\n /**\n * Search messages in conversation\n * @param conversationId - Conversation ID\n * @param query - Search query\n * @returns Matching messages\n */\n async searchMessages(conversationId: string, query: string): Promise<AXConversationMessage[]> {\n try {\n const result = await this.messageApi.searchMessages(conversationId, { query }, { page: 0, pageSize: 50 });\n return result.items;\n } catch (error) {\n this.errorHandler.handle(error, 'searchMessages', { conversationId, query });\n return [];\n }\n }\n\n /**\n * Get message replies\n * @param messageId - Message ID\n * @returns Array of reply messages\n */\n async getMessageReplies(messageId: string): Promise<AXConversationMessage[]> {\n try {\n const result = await this.messageApi.getMessageReplies(messageId, { page: 0, pageSize: 50 });\n return result.items;\n } catch (error) {\n this.errorHandler.handle(error, 'getMessageReplies', { messageId });\n return [];\n }\n }\n\n /**\n * Export conversation messages\n * @param conversationId - Conversation ID\n * @param format - Export format\n * @returns Export data\n */\n async exportMessages(conversationId: string, format: 'json' | 'csv' | 'txt'): Promise<string | Blob> {\n try {\n return await this.messageApi.exportMessages(conversationId, format);\n } catch (error) {\n this.errorHandler.handle(error, 'exportMessages', { conversationId, format });\n throw error;\n }\n }\n\n // =====================\n // User Management APIs\n // =====================\n\n /**\n * Get user settings\n * @returns User settings\n */\n async getUserSettings(): Promise<Record<string, unknown>> {\n try {\n return await this.userApi.getUserSettings();\n } catch (error) {\n this.errorHandler.handle(error, 'getUserSettings');\n return {};\n }\n }\n\n /**\n * Update user settings\n * @param settings - Settings to update\n */\n async updateUserSettings(settings: Record<string, unknown>): Promise<void> {\n try {\n await this.userApi.updateUserSettings(settings);\n } catch (error) {\n this.errorHandler.handle(error, 'updateUserSettings', { settings });\n throw error;\n }\n }\n\n /**\n * Block user\n * @param userId - User ID to block\n * @param reason - Optional reason\n */\n async blockUser(userId: string, reason?: { code: string; description?: string }): Promise<void> {\n try {\n await this.userApi.blockUser(userId, reason);\n } catch (error) {\n this.errorHandler.handle(error, 'blockUser', { userId });\n throw error;\n }\n }\n\n /**\n * Unblock user\n * @param userId - User ID to unblock\n */\n async unblockUser(userId: string): Promise<void> {\n try {\n await this.userApi.unblockUser(userId);\n } catch (error) {\n this.errorHandler.handle(error, 'unblockUser', { userId });\n throw error;\n }\n }\n\n /**\n * Get blocked users\n * @returns Array of blocked user IDs\n */\n async getBlockedUsers(): Promise<string[]> {\n try {\n return await this.userApi.getBlockedUsers();\n } catch (error) {\n this.errorHandler.handle(error, 'getBlockedUsers');\n return [];\n }\n }\n\n /**\n * Update user presence\n * @param status - Presence status\n * @param statusText - Optional status text\n */\n async updatePresence(\n status: 'online' | 'offline' | 'away' | 'busy' | 'invisible',\n statusText?: string,\n ): Promise<void> {\n try {\n await this.userApi.updatePresence(status, statusText);\n } catch (error) {\n this.errorHandler.handle(error, 'updatePresence', { status });\n // Don't throw - presence update is not critical\n }\n }\n\n /**\n * Validate message content before sending\n * Uses centralized validation utilities for consistency\n * @param command - Message command to validate\n * @throws {Error} If message content is invalid\n */\n private 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 { AXTabItemComponent, AXTabsComponent } from '@acorex/components/tabs';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ComponentRef,\n computed,\n effect,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { AXConversationService } from '../../services';\n\n@Component({\n selector: 'ax-conversation-composer-popup',\n imports: [CommonModule, AXTabsComponent, AXTabItemComponent],\n template: `\n <div class=\"composer-popup\">\n <!-- Tabs -->\n <ax-tabs (onActiveTabChanged)=\"onTabChange($event)\">\n @for (tab of enabledTabs(); track tab.id) {\n <ax-tab-item [text]=\"getTabTitle(tab.id)\" [key]=\"tab.id\">\n <ng-template #prefix>\n @if (tab.icon) {\n <span class=\"tab-icon fa-light\" [class]=\"tab.icon\"></span>\n }\n </ng-template>\n </ax-tab-item>\n }\n </ax-tabs>\n\n <!-- Tab Content -->\n <div class=\"popup-content\">\n <ng-container #contentContainer></ng-container>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .composer-popup {\n display: flex;\n padding: 1rem;\n flex-direction: column;\n width: 100%;\n height: 100%;\n height: max(400px, 50vh);\n }\n\n .popup-content {\n flex: 1;\n overflow-y: auto;\n }\n\n .tab-icon {\n font-size: 1.25rem;\n }\n `,\n ],\n})\nexport class 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\n /** Popup open state (for backward compatibility) */\n readonly isOpen = input<boolean>(false);\n\n /** Close event (for backward compatibility) */\n readonly closed = output<void>();\n\n /** Item selected event (for backward compatibility) */\n readonly itemSelected = output<any>();\n\n /** Item selected callback (for popover mode) */\n readonly onItemSelected = input<((item: any) => void) | undefined>(undefined);\n\n /** Close event for popup service */\n readonly onClosed = output<AXComponentCloseEvent>();\n\n /** Active tab ID */\n private readonly activeTabId = signal<string | null>(null);\n\n /** Enabled tabs from registry */\n readonly enabledTabs = computed(() => this.registry.composerTabs.enabledTabs());\n\n 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 // Clear previous component\n if (this.currentComponentRef) {\n this.currentComponentRef.destroy();\n this.currentComponentRef = null;\n }\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 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 ngOnDestroy(): void {\n if (this.currentComponentRef) {\n this.currentComponentRef.destroy();\n this.currentComponentRef = null;\n }\n }\n\n /** Close popup (for backward compatibility) */\n close(): void {\n this.closed.emit();\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = null;\n this.onClosed.emit(event);\n }\n\n /** Close popup with data (for popup service) */\n closeWithData(data: unknown): void {\n this.closed.emit();\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = data;\n this.onClosed.emit(event);\n }\n}\n","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","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 class AXConversationDateUtilsService {\n /**\n * Format relative time (e.g., \"2m ago\", \"1h ago\")\n */\n static formatRelativeTime(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n\n if (seconds < 60) return 'just now';\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;\n if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago`;\n\n return date.toLocaleDateString();\n }\n\n /**\n * Format date label (Today, Yesterday, or date)\n */\n static formatDateLabel(date: Date): string {\n const today = new Date();\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n if (AXConversationDateUtilsService.isSameDay(date, today)) return 'Today';\n if (AXConversationDateUtilsService.isSameDay(date, yesterday)) return 'Yesterday';\n\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n }\n\n /**\n * Check if two dates are the same day\n */\n static isSameDay(date1: Date, date2: Date): boolean {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n }\n\n /**\n * Get date key for grouping (YYYY-MM-DD)\n */\n static getDateKey(date: Date): string {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n }\n\n /**\n * Format time (HH:MM)\n */\n static formatTime(date: Date): string {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n }\n}\n","import {\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","/**\n * AXConversationMessageListService\n * Facade/service for Message List to interact with conversation and registries.\n */\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { AXConversationMessage } from '../../models';\nimport type { AXConversationMessageRendererComponent } from '../../registries/message-renderer.registry';\nimport { AXConversationService } from '../../services';\nimport { AXConversationDateUtilsService } from '../../utils';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\n\n@Injectable()\nexport class AXConversationMessageListService {\n private readonly conversationService = inject(AXConversationService);\n private readonly config = inject(AX_CONVERSATION_CONFIG);\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 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 /** Message grouped by date */\n readonly messageGroups = computed(() => {\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, messages]) => ({\n date: dateKey,\n dateLabel: AXConversationDateUtilsService.formatDateLabel(new Date(dateKey)),\n messages,\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","/**\n * AXConversationComposerService\n * Facade/service for Composer to interact with conversation and manage reply/edit state.\n */\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { computed, inject, Injectable, signal, Type } 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';\n\n/**\n * Active component state in composer\n */\nexport interface AXConversationComposerActiveComponent {\n /** Action that triggered this component */\n action: AXConversationComposerAction;\n /** 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\n@Injectable()\nexport class AXConversationComposerService {\n private readonly conversationService = inject(AXConversationService);\n private readonly translation = inject(AXTranslationService);\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 /** Active component being shown in composer (full-width mode) */\n private readonly _activeComponent = signal<AXConversationComposerActiveComponent | null>(null);\n readonly activeComponent = this._activeComponent.asReadonly();\n\n /** Draft text */\n readonly draftText = signal('');\n\n /** Attachments */\n readonly attachments = signal<File[]>([]);\n\n /** Show typing indicator */\n readonly showTypingIndicator = signal(false);\n\n /** 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), 4);\n });\n\n /** Can send message */\n readonly canSend = computed(() => {\n const text = this.draftText().trim();\n const attachments = this.attachments();\n return text.length > 0 || attachments.length > 0;\n });\n\n /** Composer action context */\n readonly actionContext = computed((): 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 };\n });\n\n /** Left actions from registry */\n readonly leftActions = computed(() => {\n const context = this.actionContext();\n return this.registry.composerActions\n .getVisibleActions('left', context)\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Right actions from registry */\n readonly rightActions = computed(() => {\n const context = this.actionContext();\n return this.registry.composerActions\n .getVisibleActions('right', context)\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Left inline actions (location = 'inline' or undefined) */\n readonly leftInlineActions = computed(() => {\n return this.leftActions()\n .filter((action) => action.location !== 'menu')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Left menu actions (location = 'menu') */\n readonly leftMenuActions = computed(() => {\n return this.leftActions()\n .filter((action) => action.location === 'menu')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Right inline actions (location = 'inline' or undefined) */\n readonly rightInlineActions = computed(() => {\n return this.rightActions()\n .filter((action) => action.location !== 'menu')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n /** Right menu actions (location = 'menu') */\n readonly rightMenuActions = computed(() => {\n return this.rightActions()\n .filter((action) => action.location === 'menu')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n });\n\n startReply(message: 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 }\n\n async sendTypingIndicator(conversationId: string): Promise<void> {\n await this.conversationService.sendTypingIndicator(conversationId);\n }\n\n async sendMessage(command: AXConversationSendMessageCommand, options?: AXConversationSendMessageOptions): Promise<void> {\n this.clearComposerInput(command.conversationId);\n await this.conversationService.sendMessage(command, 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 * Show a component in the composer (full-width mode)\n */\n showComponent(action: AXConversationComposerAction, 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 this._activeComponent.set(null);\n }\n\n /**\n * Toggle component visibility\n */\n toggleComponent(action: AXConversationComposerAction, inputs?: Record<string, unknown>): void {\n const current = this._activeComponent();\n if (current?.action.id === action.id) {\n this.hideComponent();\n } else {\n // Replacing the active picker destroys the previous component (aborts its uploads).\n this.showComponent(action, inputs);\n }\n }\n\n /**\n * Get actions for the active conversation\n */\n getActionsForPosition(position: 'left' | 'right', 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","import { ChangeDetectionStrategy, Component, effect, input, signal, Type } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { AXLoadingComponent } from '@acorex/components/loading';\n\nexport interface AXConversationRegistryComponentRef {\n component?: Type<unknown>;\n componentLoader?: () => Promise<Type<unknown>>;\n}\n\n@Component({\n selector: 'ax-conversation-registry-component-outlet',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgComponentOutlet, AXLoadingComponent],\n template: `\n @if (resolvedComponent(); as component) {\n <ng-container *ngComponentOutlet=\"component; inputs: inputs()\" />\n } @else if (loading()) {\n <ax-loading />\n }\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 readonly resolvedComponent = signal<Type<unknown> | null>(null);\n readonly loading = signal(false);\n\n constructor() {\n effect(() => {\n const direct = this.component();\n const loader = this.componentLoader();\n\n if (direct) {\n this.resolvedComponent.set(direct);\n this.loading.set(false);\n return;\n }\n\n if (!loader) {\n this.resolvedComponent.set(null);\n this.loading.set(false);\n return;\n }\n\n this.loading.set(true);\n this.resolvedComponent.set(null);\n void loader().then((loaded) => {\n this.resolvedComponent.set(loaded);\n this.loading.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","/**\n * Composer Component\n * Input area for composing and sending messages\n */\n\nimport { AXCommonModule, AXHtmlEvent } 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 { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTextAreaComponent } from '@acorex/components/text-area';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n OnDestroy,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { Subject, throttleTime } from 'rxjs';\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 { AXConversationComposerService } from './composer.service';\nimport { AXConversationRegistryComponentOutletComponent } from '../shared/registry-component-outlet.component';\n\n@Component({\n selector: 'ax-conversation-composer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n AXConversationRegistryComponentOutletComponent,\n FormsModule,\n AXTextAreaComponent,\n AXCommonModule,\n AXButtonComponent,\n AXButtonItemComponent,\n AXButtonItemListComponent,\n AXDecoratorModule,\n AXPopoverComponent,\n AXDropdownPanelComponent,\n AXTranslationModule,\n ],\n template: `\n @if (activeConversation()) {\n <div class=\"composer\">\n <!-- Full-Width Component Mode -->\n @if (activeComponent()) {\n <div class=\"composer-component-fullwidth\">\n <ax-conversation-registry-component-outlet\n [component]=\"activeComponent()!.component\"\n [componentLoader]=\"activeComponent()!.componentLoader\"\n [inputs]=\"getComponentInputs()\"\n />\n </div>\n } @else {\n <!-- Normal Composer Mode -->\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\"><i class=\"fa-light fa-reply\"></i></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 <button\n type=\"button\"\n class=\"ax-conversation-composer-banner__close\"\n (click)=\"cancelEditReply()\"\n [attr.aria-label]=\"'@acorex:chat.actions.cancel' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n\n <!-- Input Area -->\n <div class=\"composer-input-container\">\n <!-- Left Actions -->\n <div class=\"composer-actions-left\">\n @for (action of leftInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n #leftActionButton\n (click)=\"onActionClick(action.id, $event)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (leftMenuActions().length > 0) {\n <ax-button color=\"primary\" look=\"outline\">\n <i class=\"fa-light fa-ellipsis\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of leftMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"getActionLabel(action)\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n\n <!-- Text Input -->\n <div class=\"composer-input-wrapper\">\n <ax-text-area\n #inputElement\n [(ngModel)]=\"draftText\"\n (onKeyDown)=\"onKeyDown($event)\"\n (onValueChanged)=\"onInput()\"\n [placeholder]=\"placeholder()\"\n (onKeyDown)=\"onEnter($event)\"\n [rows]=\"inputRows()\"\n ></ax-text-area>\n </div>\n\n <!-- Right Actions -->\n <div class=\"composer-actions-right\">\n @if (draftText().trim().length === 0 && !attachments().length) {\n <!-- Show action buttons when empty -->\n @for (action of rightInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n [class.action-voice]=\"action.id === 'voice-recording'\"\n (click)=\"onActionClick(action.id)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n [attr.axUploaderBrowseHandle]=\"action.id === 'attach' ? '' : null\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (rightMenuActions().length > 0) {\n <ax-button look=\"blank\">\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of rightMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"getActionLabel(action)\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n } @else {\n <!-- Show send/save button when has content -->\n <button\n type=\"button\"\n class=\"action-button action-send\"\n (click)=\"onSendClick()\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"\n editingMessage()\n ? ('@acorex:chat.actions.save' | translate | async)\n : ('@acorex:chat.actions.send' | translate | async)\n \"\n >\n <i\n [class]=\"editingMessage() ? 'send-icon fa-light fa-check' : 'send-icon fa-light fa-paper-plane'\"\n ></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Attachments Preview -->\n @if (attachments().length > 0) {\n <div class=\"composer-attachments\">\n @for (attachment of attachments(); track $index) {\n <div class=\"attachment-item\">\n <span class=\"attachment-icon\"><i class=\"fa-light fa-paperclip\"></i></span>\n <span class=\"attachment-name\">{{ attachment.name }}</span>\n <button\n type=\"button\"\n class=\"attachment-remove\"\n (click)=\"removeAttachment($index)\"\n [attr.aria-label]=\"'@acorex:chat.actions.remove-attachment' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Typing Indicator -->\n @if (showTypingIndicator()) {\n <div class=\"typing-indicator-container\">\n <span class=\"typing-indicator\">{{ '@acorex:chat.status.someone-typing' | translate | async }}</span>\n </div>\n }\n }\n </div>\n }\n\n <!-- Popover for emoji/sticker picker -->\n @if (emojiPopoverTarget()) {\n <ax-popover\n #emojiPopover\n [target]=\"emojiPopoverTarget()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'top-start'\"\n (onClosed)=\"onEmojiPopoverClosed()\"\n >\n <div style=\"width: 400px; max-height: 500px;\">\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"composerPopupLoader\"\n [inputs]=\"getEmojiPopupInputs()\"\n />\n </div>\n </ax-popover>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .ax-conversation-composer-banner {\n display: flex;\n align-items: stretch;\n gap: 0;\n min-height: 2.75rem;\n background: rgb(var(--ax-sys-color-light-surface));\n border-block: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .ax-conversation-composer-banner__accent {\n flex-shrink: 0;\n width: 3px;\n border-radius: 0 2px 2px 0;\n background: rgb(var(--ax-sys-color-primary-500));\n }\n\n .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__accent {\n background: rgb(var(--ax-sys-color-secondary-500));\n }\n\n .ax-conversation-composer-banner__content {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n flex: 1;\n min-width: 0;\n padding: 0.5rem 0.625rem;\n }\n\n .ax-conversation-composer-banner__icon {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 50%;\n background: rgba(var(--ax-sys-color-primary-500), 0.1);\n color: rgb(var(--ax-sys-color-primary-600));\n font-size: 0.8125rem;\n }\n\n .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__icon {\n background: rgba(var(--ax-sys-color-secondary-500), 0.1);\n color: rgb(var(--ax-sys-color-secondary-600));\n }\n\n .ax-conversation-composer-banner__body {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n }\n\n .ax-conversation-composer-banner__body--clickable {\n cursor: pointer;\n border-radius: var(--ax-sys-border-radius, 0.25rem);\n transition: opacity 0.15s ease;\n }\n\n @media (hover: hover) {\n .ax-conversation-composer-banner__body--clickable:hover {\n opacity: 0.85;\n }\n }\n\n .ax-conversation-composer-banner__label {\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n color: rgb(var(--ax-sys-color-primary-600));\n }\n\n .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__label {\n color: rgb(var(--ax-sys-color-secondary-600));\n }\n\n .ax-conversation-composer-banner__preview {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.8125rem;\n line-height: 1.35;\n color: rgb(var(--ax-sys-color-on-surface));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n opacity: 0.88;\n }\n\n .ax-conversation-composer-banner__preview i {\n flex-shrink: 0;\n font-size: 0.75rem;\n opacity: 0.7;\n }\n\n .ax-conversation-composer-banner__close {\n flex-shrink: 0;\n align-self: center;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.25rem;\n height: 2.25rem;\n margin-inline-end: 0.375rem;\n padding: 0;\n border: none;\n border-radius: var(--ax-sys-border-radius, 0.375rem);\n background: transparent;\n color: rgba(var(--ax-sys-color-on-surface), 0.55);\n font-size: 1rem;\n cursor: pointer;\n touch-action: manipulation;\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n @media (hover: hover) {\n .ax-conversation-composer-banner__close:hover {\n background: rgba(var(--ax-sys-color-on-surface), 0.06);\n color: rgb(var(--ax-sys-color-on-surface));\n }\n }\n\n .ax-conversation-composer-banner__close:focus-visible {\n outline: 2px solid rgb(var(--ax-sys-color-primary-500));\n outline-offset: 2px;\n }\n\n .emoji-icon {\n font-size: 1.25rem;\n flex-shrink: 0;\n }\n\n .composer-input-container {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem;\n }\n\n .composer-actions-left,\n .composer-actions-right {\n display: flex;\n align-items: center;\n }\n\n .composer-input-wrapper {\n display: flex;\n flex: 1;\n min-width: 0;\n }\n\n .composer-input {\n width: 100%;\n min-height: 40px;\n max-height: 120px;\n padding: 0.5rem 0.75rem;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n border-radius: 1.25rem;\n font-size: 0.9375rem;\n font-family: inherit;\n line-height: 1.5;\n resize: none;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .composer-input:focus {\n border-color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .action-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border: none;\n background: transparent;\n border-radius: 50%;\n font-size: 1.5rem;\n cursor: pointer;\n transition: all 0.2s;\n flex-shrink: 0;\n }\n\n .action-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .action-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .action-send {\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n }\n\n .action-send:hover:not(:disabled) {\n background: rgb(var(--ax-sys-color-primary-600));\n }\n\n .send-icon {\n font-size: 1rem;\n position: relative;\n inset-inline-start: -1px;\n }\n\n .action-voice {\n font-size: 1.25rem;\n }\n\n .composer-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n padding: 0 1rem 1rem;\n }\n\n .attachment-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n background: rgb(var(--ax-sys-color-light-surface));\n border-radius: 0.5rem;\n font-size: 0.875rem;\n }\n\n .attachment-icon {\n font-size: 1rem;\n }\n\n .attachment-name {\n max-width: 150px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .attachment-remove {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n background: transparent;\n border-radius: 50%;\n font-size: 0.875rem;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .attachment-remove:hover {\n background: rgb(var(--ax-sys-color-danger-lightest-surface));\n color: rgb(var(--ax-sys-color-danger-500));\n }\n\n .typing-indicator-container {\n padding: 0 1rem 0.5rem;\n font-size: 0.75rem;\n opacity: 0.7;\n }\n\n .composer-component-fullwidth {\n width: 100%;\n min-height: 72px;\n background: rgb(var(--ax-sys-color-lightest-surface));\n }\n\n .action-badge {\n position: absolute;\n top: 4px;\n inset-inline-end: 4px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n border-radius: 8px;\n font-size: 0.625rem;\n font-weight: 600;\n }\n\n .action-button {\n position: relative;\n }\n `,\n ],\n})\nexport class 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 private readonly translation = inject(AXTranslationService);\n\n /** Access registry through conversation service */\n private get registry() {\n return this.conversationService.registry;\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 /** Show typing indicator - use service */\n readonly showTypingIndicator = this.composerService.showTypingIndicator;\n\n /** Message sent event */\n readonly messageSent = output<AXConversationSendMessageCommand>();\n\n /** Emoji clicked event */\n readonly emojiClick = output<void>();\n\n /** Attach clicked event */\n readonly attachClick = output<void>();\n\n /** Voice clicked event */\n readonly voiceClick = output<void>();\n\n /** Active conversation */\n readonly activeConversation = this.conversationService.activeConversation;\n readonly activeMessages = this.conversationService.activeMessages;\n\n /** Active component from service */\n readonly activeComponent = this.composerService.activeComponent;\n\n /** Emoji popover state */\n private readonly emojiPopoverRef = viewChild<any>('emojiPopover');\n readonly emojiPopoverTarget = signal<HTMLElement | null>(null);\n readonly composerPopupLoader = () =>\n import('./composer-popup.component').then((m) => m.AXConversationComposerPopupComponent);\n\n /** Input placeholder - use service */\n readonly placeholder = this.composerService.placeholder;\n\n /** Typing indicator subject for rate limiting */\n private readonly typingSubject = new Subject<string>();\n\n // Setup typing indicator throttling\n constructor() {\n this.typingSubject\n .pipe(throttleTime(this.config.typingIndicatorThrottle ?? 2000), takeUntilDestroyed())\n .subscribe((conversationId) => {\n this.conversationService.sendTypingIndicator(conversationId);\n });\n }\n\n // Focus text area when requested via AXConversationComposerService.focusComposer()\n #focusComposerEffect = effect(() => {\n if (this.composerService.focusRequest() === 0) return;\n this.focusTextArea();\n });\n\n // React to controller signals (reply/edit)\n #controllerEffect = effect(() => {\n const reply = this.composerService.replyMessage();\n const edit = this.composerService.editMessage();\n\n if (reply) {\n this.startReply(reply);\n } else if (edit) {\n this.startEdit(edit);\n } else {\n // Clear local state when service signals are cleared\n this.editingMessage.set(null);\n this.replyingToMessage.set(null);\n }\n });\n\n // Close composer popovers when conversation changes (draft/reply/edit reset is handled by message-list).\n #previousConversationId: string | undefined = undefined;\n #conversationUiResetEffect = effect(() => {\n const currentId = this.activeConversation()?.id;\n\n if (this.#previousConversationId !== undefined && this.#previousConversationId !== currentId) {\n this.emojiPopoverTarget.set(null);\n this.editingMessage.set(null);\n this.replyingToMessage.set(null);\n }\n\n this.#previousConversationId = currentId;\n });\n\n // Auto-save draft on text change\n #draftAutoSaveEffect = effect(() => {\n const text = this.draftText();\n const conversation = this.activeConversation();\n const isEditing = !!this.composerService.editMessage();\n\n if (conversation?.id && !isEditing) {\n const conversationId = conversation.id;\n // Debounce auto-save\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 private draftSaveTimeout?: number;\n\n /** Number of input rows - use service */\n readonly inputRows = this.composerService.inputRows;\n\n /** Can send message - use service */\n readonly canSend = this.composerService.canSend;\n\n /** Left actions from registry - use service */\n readonly leftActions = this.composerService.leftActions;\n\n /** Right actions from registry - use service */\n readonly rightActions = this.composerService.rightActions;\n\n /** Left inline actions (location = 'inline' or undefined) */\n readonly leftInlineActions = this.composerService.leftInlineActions;\n\n /** Left menu actions (location = 'menu') */\n readonly leftMenuActions = this.composerService.leftMenuActions;\n\n /** Right inline actions (location = 'inline' or undefined) */\n readonly rightInlineActions = this.composerService.rightInlineActions;\n\n /** Right menu actions (location = 'menu') */\n readonly rightMenuActions = this.composerService.rightMenuActions;\n\n /** Handle key down */\n onKeyDown(event: AXHtmlEvent<KeyboardEvent>): void {\n const key = event?.nativeEvent?.key;\n const shiftKey = event?.nativeEvent?.shiftKey;\n\n // Send on Enter (without Shift)\n if (key === 'Enter' && !shiftKey) {\n event?.nativeEvent?.preventDefault();\n if (this.canSend()) {\n this.onSendClick();\n }\n }\n\n // Send typing indicator\n this.sendTypingIndicator();\n }\n\n /** Handle input */\n onInput(): void {\n this.sendTypingIndicator();\n }\n\n /** Send typing indicator (throttled via RxJS) */\n private sendTypingIndicator(): void {\n const conversation = this.activeConversation();\n if (!conversation) return;\n\n // Emit to throttled subject\n this.typingSubject.next(conversation.id);\n }\n\n /** Cleanup on destroy */\n ngOnDestroy(): void {\n this.typingSubject.complete();\n\n // Save draft before destroying\n const conversation = this.activeConversation();\n if (conversation?.id && !this.composerService.editMessage()) {\n this.composerService.saveDraft(conversation.id, this.draftText());\n }\n\n // Clear timeout\n if (this.draftSaveTimeout) {\n clearTimeout(this.draftSaveTimeout);\n }\n }\n\n /** Handle send click */\n async onSendClick(): Promise<void> {\n if (!this.canSend()) 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\n void this.composerService\n .sendMessage(command)\n .then(() => {\n this.messageSent.emit(command);\n this.messageListService.requestScrollToBottom();\n })\n .catch((error) => {\n console.error('Failed to send message:', error);\n });\n }\n\n /** Handle emoji click */\n async onEmojiClick(event?: MouseEvent): Promise<void> {\n this.emojiClick.emit();\n\n const target = event?.currentTarget as HTMLElement;\n if (!target) return;\n\n const popover = this.emojiPopoverRef();\n if (popover?.isOpen) {\n popover.close();\n } else {\n this.emojiPopoverTarget.set(target);\n setTimeout(() => {\n this.emojiPopoverRef()?.open();\n }, 0);\n }\n }\n\n /** Handle emoji popover closed */\n onEmojiPopoverClosed(): void {\n this.emojiPopoverTarget.set(null);\n }\n\n /** Handle emoji/sticker selection from popup */\n onEmojiItemSelected(item: string | AXConversationStickerPayload): void {\n if (typeof item === 'string') {\n // Emoji selected\n this.draftText.update((text) => text + item);\n } else if (item && 'url' in item) {\n // Sticker selected - send immediately\n this.sendSticker(item);\n }\n this.emojiPopoverRef()?.close();\n }\n\n /** Send sticker message */\n private async sendSticker(sticker: 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 void this.composerService\n .sendMessage(command)\n .then(() => {\n this.messageListService.requestScrollToBottom();\n })\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 click */\n onAttachClick(): void {\n this.attachClick.emit();\n }\n\n /** Handle voice click */\n onVoiceClick(): void {\n this.voiceClick.emit();\n }\n\n /** Remove attachment */\n removeAttachment(index: number): void {\n this.attachments.update((files) => files.filter((_, i) => i !== index));\n }\n\n /** 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 }\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 /** Handle action click */\n async onActionClick(actionId: string, event?: MouseEvent): Promise<void> {\n const action = this.registry.composerActions.getActionById(actionId);\n if (!action) return;\n\n const context = this.composerService.actionContext();\n\n // Special handling for emoji action\n if (actionId === 'emoji') {\n this.onEmojiClick(event);\n return;\n }\n\n const hasComponent = !!(action.component || action.componentLoader);\n\n // If action has a component and is toggleable, toggle it\n if (hasComponent && action.toggleable) {\n this.composerService.toggleComponent(action, this.buildPickerInputs(action));\n return;\n }\n\n // If action has a component, show it\n if (hasComponent) {\n this.composerService.showComponent(action, this.buildPickerInputs(action));\n return;\n }\n\n // Otherwise execute the handler\n if (action.handler) {\n try {\n await this.registry.composerActions.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.registry.composerActions.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.registry.composerActions.getActionLabel(action as any);\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 // Highlight the message briefly\n messageElement.classList.add('message-highlight');\n setTimeout(() => {\n messageElement.classList.remove('message-highlight');\n }, this.config.messageHighlightDuration ?? 2000);\n }\n }\n\n /** Inputs for picker / full-width composer components */\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 /** Get inputs for dynamic component */\n getComponentInputs(): Record<string, unknown> {\n const activeComp = this.activeComponent();\n if (!activeComp) return {};\n\n return {\n ...activeComp.inputs,\n ...this.buildPickerInputs(activeComp.action),\n };\n }\n\n async onEnter(event: AXHtmlEvent<KeyboardEvent>) {\n if (event.nativeEvent.key === 'Enter' && !event.nativeEvent.shiftKey) {\n event.nativeEvent.preventDefault();\n await this.onSendClick();\n }\n }\n}\n","/**\n * ConversationContainer Component\n * Top-level container that provides context and layout for the conversation system\n */\n\nimport { AXResizableDirective } from '@acorex/cdk/resizable';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXFileService } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n PLATFORM_ID,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { AXConversationComposerService } from '../composer/composer.service';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\n\n@Component({\n selector: 'ax-conversation-container',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AXResizableDirective, AXTranslationModule],\n template: `\n <div [class]=\"containerClasses()\" role=\"main\" [attr.aria-label]=\"'@acorex:chat.aria.conversation-interface' | translate | async\">\n <!-- Sidebar -->\n <div\n class=\"conversation-sidebar-container\"\n [axResizable]=\"true\"\n [minWidth]=\"config.minSidebarWidth ?? 250\"\n [maxWidth]=\"config.maxSidebarWidth ?? 500\"\n [width]=\"config.defaultSidebarWidth ?? 300\"\n role=\"navigation\"\n [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 cx=\"60\" cy=\"60\" r=\"50\" fill=\"#f3f4f6\" />\n <path d=\"M40 50h40M40 70h30\" stroke=\"#9ca3af\" stroke-width=\"3\" stroke-linecap=\"round\" />\n </svg>\n <h3 class=\"empty-state-title\">{{ '@acorex:chat.empty.no-conversation-selected-title' | translate | async }}</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 styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n outline: none; /* Remove focus outline since tabindex is only for keyboard events */\n }\n\n .conversation-container {\n display: flex;\n width: 100%;\n height: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n overflow: hidden;\n }\n\n .conversation-container-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .conversation-sidebar-container {\n flex-shrink: 0;\n height: 100%;\n display: none;\n width: 0;\n border-inline-end: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n /* Show sidebar container only when there is projected content */\n .conversation-sidebar-container:has(*) {\n display: block;\n width: var(--ax-conversation-sidebar-width, 320px);\n }\n\n .conversation-main-container {\n flex: 1;\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n container-type: inline-size;\n container-name: conversation;\n }\n\n .conversation-view {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .conversation-messages {\n flex: 1;\n overflow: hidden;\n }\n\n .conversation-empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n }\n\n .empty-state-content {\n text-align: center;\n padding: 2rem;\n max-width: 400px;\n }\n\n .empty-state-icon {\n margin: 0 auto 1.5rem;\n opacity: 0.8;\n }\n\n .empty-state-title {\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0 0 0.5rem;\n }\n\n .empty-state-description {\n font-size: 1rem;\n margin: 0;\n opacity: 0.7;\n }\n `,\n ],\n host: {\n '[class.conversation-container-host]': 'true',\n '[tabindex]': '\"-1\"',\n },\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 hostRef = inject(ElementRef<HTMLElement>);\n private readonly platformId = inject(PLATFORM_ID);\n protected readonly config = inject(AX_CONVERSATION_CONFIG);\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 /**\n * When the user pastes files copied from the OS (e.g. Ctrl+V after copying in Explorer),\n * open the same composer picker popup used for message-list drag-and-drop.\n */\n @HostListener('document:paste', ['$event'])\n async onDocumentPaste(event: ClipboardEvent): Promise<void> {\n if (!isPlatformBrowser(this.platformId) || !this.activeConversation()) {\n return;\n } \n\n const { handleConversationFilePaste } = await import('../message-list/open-composer-picker-for-files');\n await handleConversationFilePaste(event, this.hostRef.nativeElement, {\n fileService: this.fileService,\n composerService: this.composerService,\n composerActionRegistry: this.registry.composerActions,\n popupService: this.conversationService.popupService,\n toast: this.toast,\n translation: this.translation,\n conversation: this.activeConversation(),\n config: this.config,\n });\n }\n}\n","/**\n * Conversation Container Directive\n * Provides conversation context without imposing layout structure\n */\n\nimport { AXFileService } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Directive, ElementRef, HostListener, PLATFORM_ID, inject } from '@angular/core';\nimport { AXConversationComposerService } from '../composer/composer.service';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\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 translation = inject(AXTranslationService);\n private readonly toast = inject(AXToastService);\n private readonly config = inject(AX_CONVERSATION_CONFIG);\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 @HostListener('document:paste', ['$event'])\n async onDocumentPaste(event: ClipboardEvent): Promise<void> {\n if (!isPlatformBrowser(this.platformId) || !this.activeConversation()) {\n return;\n }\n\n const { handleConversationFilePaste } = await import('../message-list/open-composer-picker-for-files');\n await handleConversationFilePaste(event, this.hostRef.nativeElement, {\n fileService: this.fileService,\n composerService: this.composerService,\n composerActionRegistry: this.registry.composerActions,\n popupService: this.conversationService.popupService,\n toast: this.toast,\n translation: this.translation,\n conversation: this.activeConversation(),\n config: this.config,\n });\n }\n}\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 * Open the Telegram-style conversation info panel for the active (or given) conversation.\n */\n async openConversationInfoPanel(conversation?: AXConversation): Promise<void> {\n const target = conversation ?? this.activeConversation();\n if (!target) return;\n\n const { AXConversationInfoPanelComponent } = await import(\n '../../plugins/info-bar/components/conversation-info-panel.component'\n );\n\n await this.conversationService.popupService.open(AXConversationInfoPanelComponent, {\n title: target.title,\n closeButton: true,\n size: 'sm',\n data: {\n conversation: target,\n conversationService: this.conversationService,\n },\n });\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 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 * 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 { ChangeDetectionStrategy, Component, 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 resolvePrivatePeerUserId,\n resolveUserAvatarDisplay,\n shouldUseUserAvatarForConversation,\n} from '../../utils/avatar-context.utils';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\n\n@Component({\n selector: 'ax-conversation-avatar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgComponentOutlet, AXAvatarComponent, AXDecoratorModule, AXImageComponent, AXLabelComponent],\n template: `\n <div class=\"ax-conversation-avatar\">\n @if (customComponent(); as component) {\n <ng-container *ngComponentOutlet=\"component; inputs: customInputs()\" />\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]=\"'ax-conversation-avatar-icon ' + iconClass\" aria-hidden=\"true\"></i></ax-icon>\n } @else {\n <ax-label>{{ fallbackInitials() }}</ax-label>\n }\n </ax-avatar>\n }\n\n @if (showStatus() && resolvedStatus(); 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 ></span>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: inline-flex;\n }\n\n .ax-conversation-avatar {\n position: relative;\n display: inline-flex;\n }\n\n .ax-conversation-avatar-icon {\n font-size: calc(var(--ax-conversation-avatar-size, 2.5rem) * 0.5);\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n }\n\n .ax-conversation-avatar-status {\n position: absolute;\n bottom: 2px;\n inset-inline-end: 2px;\n width: 12px;\n height: 12px;\n border-radius: 50%;\n }\n\n .ax-conversation-avatar-status.status-online {\n border: 2px solid rgb(var(--ax-sys-color-surface));\n background-color: rgb(var(--ax-sys-color-success-500));\n }\n\n .ax-conversation-avatar-status.status-away {\n border: 2px solid rgb(var(--ax-sys-color-surface));\n background-color: rgb(var(--ax-sys-color-warning-500));\n }\n `,\n ],\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 resolvePrivatePeerUserId(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 return {\n userId: this.resolvedUserId() ?? '',\n size: this.size(),\n };\n }\n\n return {\n conversationId: this.conversation()?.id ?? '',\n size: this.size(),\n };\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((): 'online' | 'offline' | 'away' | undefined => {\n const conversation = this.conversation();\n if (!conversation || !this.showStatus()) {\n return undefined;\n }\n\n return AXConversationMessageUtilsService.getConversationStatus(conversation);\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 { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, output, signal } from '@angular/core';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationMessageUtilsService } from '../../utils';\nimport { AXConversationInfoBarService } from './info-bar.service';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\nimport { AXConversationRegistryComponentOutletComponent } from '../shared/registry-component-outlet.component';\n\n// Keep dropdown menu types for backward compatibility\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 imports: [\n CommonModule,\n AXButtonComponent,\n AXButtonItemComponent,\n AXButtonItemListComponent,\n AXDropdownPanelComponent,\n AXDecoratorModule,\n AXLabelComponent,\n AXConversationAvatarComponent,\n AXConversationRegistryComponentOutletComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (activeConversation(); as conversation) {\n <div class=\"info-bar\">\n <!-- Left: Avatar and Info -->\n <ng-content select=\"ax-prefix\"></ng-content>\n <div\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]=\"48\"\n [showStatus]=\"conversation.type === 'private'\"\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\">{{ getSubtitle(conversation) }}</p>\n } @else {\n <div class=\"info-subtitle-with-status\">\n @if (getStatus(conversation) === 'online') {\n <span class=\"online-badge\">●</span>\n }\n <p class=\"info-subtitle\">{{ getSubtitle(conversation) }}</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Right: Actions or Full-Width Component -->\n @if (!activeComponent() || !isActiveComponentFullWidth()) {\n <div class=\"info-actions\">\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)\">\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\"></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 class=\"info-component-fullwidth\" animate.enter=\"slide-in\" animate.leave=\"slide-out\">\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\">\n <div class=\"ax-conversation-info-banner__content\">\n <ax-conversation-registry-component-outlet\n [component]=\"activeBanner()!.component\"\n [componentLoader]=\"activeBanner()!.componentLoader\"\n [inputs]=\"getBannerInputs()\"\n />\n </div>\n <button type=\"button\" class=\"ax-conversation-info-banner__close\" (click)=\"onCloseBanner()\" [attr.aria-label]=\"'Close'\">\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n }\n `,\n styles: [\n `\n :host {\n max-width: 100%;\n display: block;\n }\n\n .info-bar {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n overflow: hidden;\n padding: 0.5rem;\n line-height: 1.1rem;\n min-height: 64px;\n gap: 0.75rem;\n }\n\n .ax-conversation-info-banner {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.5rem 0.5rem 0.75rem;\n border-block-start: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .ax-conversation-info-banner__content {\n flex: 1;\n min-width: 0;\n }\n\n .ax-conversation-info-banner__close {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.25rem;\n height: 2.25rem;\n padding: 0;\n border: none;\n border-radius: var(--ax-sys-border-radius, 0.375rem);\n background: transparent;\n color: rgba(var(--ax-sys-color-on-primary-lightest-surface), 0.65);\n font-size: 1rem;\n cursor: pointer;\n touch-action: manipulation;\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n @media (hover: hover) {\n .ax-conversation-info-banner__close:hover {\n background: rgba(var(--ax-sys-color-primary-500), 0.12);\n color: rgb(var(--ax-sys-color-on-primary-lightest-surface));\n }\n }\n\n .ax-conversation-info-banner__close:focus-visible {\n outline: 2px solid rgb(var(--ax-sys-color-primary-600));\n outline-offset: 2px;\n }\n\n .info-bar-empty {\n justify-content: center;\n opacity: 0.6;\n }\n\n .info-left {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n flex: 1;\n min-width: 0;\n cursor: pointer;\n border-radius: 0.5rem;\n padding: 0.25rem 0.35rem;\n margin: -0.25rem -0.35rem;\n transition: background-color 0.15s ease;\n }\n\n .info-left:hover {\n background: rgb(var(--ax-sys-color-lighter-surface));\n }\n\n .info-left:focus-visible {\n outline: 2px solid rgb(var(--ax-sys-color-primary-500));\n outline-offset: 2px;\n }\n\n .avatar-wrapper {\n flex-shrink: 0;\n }\n\n .info-details {\n flex: 1;\n min-width: 0;\n }\n\n .info-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .info-subtitle-with-status {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n margin: 0.125rem 0 0;\n }\n\n .online-badge {\n color: #22c55e;\n font-size: 0.625rem;\n line-height: 1;\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n }\n\n .info-subtitle {\n margin: 0;\n font-size: 0.85rem;\n letter-spacing: 0.02rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n opacity: 0.7;\n }\n\n .info-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n }\n\n .info-component-fullwidth {\n position: absolute;\n top: 0;\n inset-inline-start: 0;\n inset-inline-end: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n padding: 1rem;\n background: rgb(var(--ax-sys-color-lightest-surface));\n z-index: 10;\n }\n\n /* Enter animation */\n .slide-in {\n animation: slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n }\n\n @keyframes slideInFromRight {\n from {\n opacity: 0;\n transform: translateX(var(--ax-info-bar-slide-distance, 100%));\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n /* Leave animation */\n .slide-out {\n opacity: 0;\n transform: translateX(var(--ax-info-bar-slide-distance, 100%));\n transition:\n opacity 250ms cubic-bezier(0.4, 0, 1, 1),\n transform 250ms cubic-bezier(0.4, 0, 1, 1);\n }\n\n :host-context([dir='rtl']) {\n --ax-info-bar-slide-distance: -100%;\n }\n\n .info-component-fullwidth > *:first-child {\n flex: 1;\n min-width: 0;\n }\n\n .action-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 0.5rem;\n font-size: 1.25rem;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .action-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .search-container {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n min-width: 200px;\n }\n\n .search-input {\n flex: 1;\n min-width: 0;\n }\n `,\n ],\n})\nexport class AXConversationInfoBarComponent {\n private readonly conversationService = inject(AXConversationService);\n private readonly infoBar = inject(AXConversationInfoBarService);\n\n // Access registry through conversation service\n protected get registry() {\n return this.conversationService.registry;\n }\n\n /** Active conversation */\n readonly activeConversation = this.infoBar.activeConversation;\n\n /** Active component from service */\n readonly activeComponent = this.infoBar.activeComponent;\n\n /** Active banner from service */\n readonly activeBanner = this.infoBar.activeBanner;\n\n /** Members popover target element — retained for API compatibility */\n readonly membersPopoverTarget = signal<HTMLElement | null>(null);\n\n /** Loading state for async actions */\n readonly actionLoading = signal<boolean>(false);\n\n /** Info area clicked — opens conversation profile panel */\n readonly infoClick = output<void>();\n\n /** @deprecated Use infoClick — kept for backward compatibility */\n readonly avatarClick = output<void>();\n\n /** Search clicked event */\n readonly searchClick = output<void>();\n\n /** Search query changed event */\n readonly searchQuery = output<string>();\n\n /** Menu item clicked event */\n readonly menuItemAction = output<string>();\n\n /** Inline action buttons from registry */\n readonly inlineActions = computed(() => {\n const conversation = this.activeConversation();\n if (!conversation) return [];\n return this.registry.infoBarActions.getInlineActions(conversation);\n });\n\n /** Dropdown menu items from registry */\n readonly menuItems = computed((): AXConversationDropdownMenuItem[] => {\n const conversation = this.activeConversation();\n if (!conversation) return [];\n\n // Get menu actions from registry\n const actions = this.registry.infoBarActions.getMenuActions(conversation);\n\n // Convert actions to dropdown menu items\n const result = actions.map((action) => ({\n id: action.id,\n label: this.registry.infoBarActions.getActionLabel(action, conversation),\n icon: this.registry.infoBarActions.getActionIcon(action, conversation),\n divider: action.divider,\n destructive: action.destructive,\n disabled: !this.registry.infoBarActions.isActionEnabled(action, { conversation }),\n }));\n return result;\n });\n\n /** Get conversation status - delegate to utils */\n getStatus(conversation: AXConversation): 'online' | 'offline' | 'away' | undefined {\n return AXConversationMessageUtilsService.getConversationStatus(conversation);\n }\n\n /** Get subtitle text - delegate to utils */\n getSubtitle(conversation: AXConversation): string {\n return AXConversationMessageUtilsService.getConversationSubtitle(conversation);\n }\n\n /** Open conversation info panel when the left info area is clicked */\n onInfoLeftClick(): void {\n this.infoClick.emit();\n this.avatarClick.emit();\n void this.infoBar.openConversationInfoPanel(this.activeConversation() ?? undefined);\n }\n\n /** Handle inline action click */\n async onInlineActionClick(actionId: string): Promise<void> {\n const conversation = this.activeConversation();\n if (!conversation) return;\n\n const action = this.registry.infoBarActions.getById(actionId);\n if (!action) return;\n\n // If action has a component and is toggleable, toggle it\n if ((action.component || action.componentLoader) && action.toggleable) {\n this.infoBar.toggleComponent(action, {\n conversation,\n service: this.infoBar,\n });\n return;\n }\n\n // If action has a component, show it\n if (action.component || action.componentLoader) {\n this.infoBar.showComponent(action, {\n conversation,\n service: this.infoBar,\n });\n return;\n }\n\n // Otherwise execute the handler\n this.actionLoading.set(true);\n try {\n await this.infoBar.executeAction(actionId, conversation);\n } catch (error) {\n console.error('Failed to execute inline action:', error);\n } finally {\n this.actionLoading.set(false);\n }\n }\n\n /** Get inputs for dynamic component */\n getComponentInputs(): Record<string, 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 /** Handle close component */\n onCloseComponent(): void {\n this.infoBar.hideComponent();\n }\n\n getBannerInputs(): Record<string, unknown> {\n const activeBanner = this.activeBanner();\n if (!activeBanner) return {};\n return {\n ...activeBanner.inputs,\n message: activeBanner.message,\n };\n }\n\n onCloseBanner(): void {\n this.infoBar.hideMessageBanner();\n }\n\n /** Handle menu item click */\n async onMenuItemClick(item: AXConversationDropdownMenuItem): Promise<void> {\n const conversation = this.activeConversation();\n if (!conversation) return;\n\n // Execute action through service\n this.actionLoading.set(true);\n try {\n await this.infoBar.executeAction(item.id, conversation);\n this.menuItemAction.emit(item.id);\n } catch (error) {\n console.error('Failed to execute action:', error);\n } finally {\n this.actionLoading.set(false);\n }\n }\n}\n","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 type { AXPopupRef } from '@acorex/components/popup';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n EventEmitter,\n inject,\n input,\n OnInit,\n signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversation, AXConversationMessage } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\n\n@Component({\n selector: 'ax-conversation-forward-message-dialog',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FormsModule,\n AXListComponent,\n AXSearchBoxComponent,\n AXButtonComponent,\n AXDecoratorGenericComponent,\n AXConversationAvatarComponent,\n AXTranslationModule,\n ],\n template: `\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-conversations-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.dialog.forward-message.no-conversations-available' | translate | async }}\n }\n </div>\n </ng-template>\n\n <div class=\"dialog-content\">\n <div class=\"forward-list-wrap\">\n <ax-list\n #forwardList\n class=\"forward-list\"\n [dataSource]=\"forwardListDataSource\"\n [multiple]=\"true\"\n [valueField]=\"'id'\"\n [textField]=\"'title'\"\n [checkbox]=\"false\"\n [itemHeight]=\"52\"\n [ngModel]=\"selectedConversationIds()\"\n (ngModelChange)=\"selectedConversationIds.set($event ?? [])\"\n [emptyTemplate]=\"forwardListEmptyTpl()\"\n [itemTemplate]=\"forwardItemTpl\"\n >\n <ax-header class=\"forward-list-header\">\n <div class=\"forward-list-header-inner\">\n <ax-search-box\n [value]=\"forwardSearchQuery()\"\n (valueChange)=\"onForwardSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.placeholders.search-conversations' | translate | async\"\n ></ax-search-box>\n </div>\n </ax-header>\n </ax-list>\n </div>\n </div>\n\n <ng-template #forwardItemTpl let-item>\n @if (conversationFromItem(item); as conversation) {\n <div class=\"forward-item-content\">\n <input class=\"ax-checkbox\" type=\"checkbox\" [checked]=\"isSelected(conversation.id)\" tabindex=\"0\" />\n <ax-conversation-avatar kind=\"auto\" [conversation]=\"conversation\" [size]=\"36\" />\n <span class=\"forward-title-text ax-truncated\">{{ conversation.title }}</span>\n </div>\n }\n </ng-template>\n\n <ax-footer class=\"dialog-footer\">\n <ax-suffix>\n <ax-button [text]=\"'@acorex:chat.actions.cancel' | translate | async\" [look]=\"'solid'\" (onClick)=\"onCancel()\"></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 ></ax-button>\n </ax-suffix>\n </ax-footer>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .forward-message-dialog {\n display: flex;\n flex-direction: column;\n width: 100%;\n overflow: hidden;\n }\n\n .dialog-content {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n }\n\n .forward-list-wrap {\n height: min(50vh, 24rem);\n overflow: hidden;\n }\n\n .forward-list {\n display: block;\n height: 100%;\n }\n\n .forward-list-header {\n display: block;\n position: sticky;\n top: 0;\n z-index: 1;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .forward-list-header-inner {\n padding: 0.5rem 0.75rem;\n }\n\n .forward-item-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n height: 100%;\n padding: 0.5rem;\n min-width: 0;\n border-radius: 0.5rem;\n transition: background-color 0.2s ease;\n }\n\n \n\n .forward-title-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1.25rem;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .forward-list-empty {\n padding: 1.25rem 1rem;\n text-align: center;\n font-size: 0.875rem;\n opacity: 0.72;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .dialog-footer {\n flex-shrink: 0;\n }\n `,\n ],\n providers: [\n { provide: AXClosableComponent, useExisting: AXConversationForwardMessageDialogComponent },\n ],\n})\nexport class AXConversationForwardMessageDialogComponent implements OnInit {\n private readonly toastService = inject(AXToastService);\n private readonly translation = inject(AXTranslationService);\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 allConversations = signal<AXConversation[]>([]);\n readonly forwardSearchQuery = signal('');\n readonly selectedConversationIds = signal<string[]>([]);\n\n readonly forwardListEmptyTpl = viewChild.required<TemplateRef<unknown>>('forwardListEmpty');\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 items = this.getFilteredConversationsForForward() 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.allConversations().find((c) => c.id === key) ?? null),\n });\n\n readonly canForward = computed(() => this.selectedConversationIds().length > 0);\n\n private readonly _syncPopupTitleEffect = effect(() => {\n const popupRef = this.__popup__();\n const count = this.selectedConversationIds().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 ngOnInit(): void {\n const conversations = this.conversationService.conversations();\n const filtered = conversations.filter(\n (c) => c.id !== this.message.conversationId && !c.archived,\n );\n this.allConversations.set(filtered);\n }\n\n onForwardSearchChange(value: string): void {\n this.forwardSearchQuery.set(value ?? '');\n this.forwardList()?.refresh(false);\n }\n\n conversationFromItem(item: unknown): AXConversation | null {\n if (!item || typeof item !== 'object' || !('data' in item)) return null;\n return (item as { data?: AXConversation }).data ?? null;\n }\n\n isSelected(conversationId: string): boolean {\n return this.selectedConversationIds().includes(conversationId);\n }\n\n private getFilteredConversationsForForward(): AXConversation[] {\n const q = this.forwardSearchQuery().toLowerCase().trim();\n let items = this.allConversations();\n if (q) {\n items = items.filter((c) => c.title.toLowerCase().includes(q));\n }\n return items;\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.selectedConversationIds();\n if (selectedIds.length === 0) return;\n\n try {\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 (conversationId) => {\n const forwardCommand = {\n conversationId,\n type: this.message.type,\n payload: this.message.payload,\n forwarded: true,\n forwardedFrom: {\n messageId: this.message.id,\n senderId: this.message.senderId,\n senderName: sender?.name || 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 } 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","/**\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 { Directive, ElementRef, PLATFORM_ID, afterNextRender, inject, input, output } 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\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 element.addEventListener('scroll', () => {\n if (!this.ticking) {\n window.requestAnimationFrame(() => {\n this.handleScroll();\n this.ticking = false;\n });\n this.ticking = true;\n }\n });\n }\n\n private handleScroll(): void {\n 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.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","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXConversation } from '../../models';\n\n@Component({\n selector: 'ax-conversation-message-list-empty-default',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [],\n host: {\n class: 'ax-message-empty-host',\n },\n template: `\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 </p>\n </div>\n </div>\n `,\n styles: [\n `\n :host.ax-message-empty-host {\n display: block;\n width: 100%;\n max-width: min(24rem, 100%);\n margin-inline: auto;\n }\n\n .ax-message-empty {\n position: relative;\n isolation: isolate;\n padding: 0.25rem;\n }\n\n .ax-message-empty__ambient {\n position: absolute;\n inset: -2rem -1rem -1rem;\n z-index: 0;\n pointer-events: none;\n overflow: hidden;\n border-radius: 2rem;\n }\n\n .ax-message-empty__grid {\n position: absolute;\n inset: 0;\n background-image:\n linear-gradient(rgba(var(--ax-sys-color-on-surface), 0.04) 1px, transparent 1px),\n linear-gradient(90deg, rgba(var(--ax-sys-color-on-surface), 0.04) 1px, transparent 1px);\n background-size: 24px 24px;\n mask-image: radial-gradient(ellipse 80% 70% at 50% 45%, black 20%, transparent 75%);\n opacity: 0.5;\n }\n\n .ax-message-empty__card {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: 2rem 1.75rem 2.125rem;\n border-radius: 1.25rem;\n border: 1px solid rgba(var(--ax-sys-color-border-light-surface), 0.85);\n background: linear-gradient(\n 165deg,\n rgba(var(--ax-sys-color-lightest-surface), 0.72) 0%,\n rgba(var(--ax-sys-color-surface), 0.55) 100%\n );\n }\n\n .ax-message-empty__icon-stack {\n position: relative;\n display: grid;\n place-items: center;\n margin-bottom: 1.25rem;\n }\n\n .ax-message-empty__pulse {\n position: absolute;\n width: 5.5rem;\n height: 5.5rem;\n border-radius: 50%;\n background: radial-gradient(\n circle,\n rgba(var(--ax-sys-color-primary-500), 0.22) 0%,\n rgba(var(--ax-sys-color-primary-500), 0) 70%\n );\n animation: ax-empty-pulse 3.2s ease-in-out infinite;\n }\n\n .ax-message-empty__icon-bg {\n position: relative;\n display: grid;\n place-items: center;\n width: 4.25rem;\n height: 4.25rem;\n border-radius: 1.125rem;\n background: linear-gradient(\n 145deg,\n rgba(var(--ax-sys-color-primary-500), 0.16) 0%,\n rgba(var(--ax-sys-color-primary-600), 0.06) 100%\n );\n border: 1px solid rgba(var(--ax-sys-color-primary-500), 0.22);\n box-shadow:\n 0 1px 0 rgba(var(--ax-sys-color-on-primary-surface), 0.06) inset,\n 0 12px 28px -16px rgba(var(--ax-sys-color-primary-600), 0.45);\n }\n\n .ax-message-empty__icon-bg i {\n font-size: 1.875rem;\n line-height: 1;\n color: rgb(var(--ax-sys-color-primary-600));\n opacity: 0.92;\n }\n\n .ax-message-empty__eyebrow {\n margin: 0 0 0.35rem;\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n color: rgb(var(--ax-sys-color-primary-600));\n opacity: 0.85;\n }\n\n .ax-message-empty__title {\n margin: 0 0 0.65rem;\n font-size: 1.375rem;\n font-weight: 600;\n letter-spacing: -0.03em;\n line-height: 1.25;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .ax-message-empty__desc {\n margin: 0;\n font-size: 0.9375rem;\n line-height: 1.65;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.62;\n max-width: 20rem;\n }\n\n .ax-message-empty__name {\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.88;\n }\n\n @keyframes ax-empty-float {\n 0%,\n 100% {\n transform: translate(0, 0) scale(1);\n }\n 50% {\n transform: translate(4%, 6%) scale(1.05);\n }\n }\n\n @keyframes ax-empty-pulse {\n 0%,\n 100% {\n transform: scale(0.92);\n opacity: 0.55;\n }\n 50% {\n transform: scale(1.06);\n opacity: 0.85;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .ax-message-empty__pulse {\n animation: none;\n }\n\n .ax-message-empty__card {\n animation: none;\n }\n }\n `,\n ],\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","import { AXTranslationService } from '@acorex/core/translation';\nimport { ChangeDetectionStrategy, Component, 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 changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [],\n host: {\n class: 'ax-message-no-active-host',\n },\n template: `\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 `,\n styles: [\n `\n :host.ax-message-no-active-host {\n display: block;\n width: 100%;\n max-width: min(24rem, 100%);\n margin-inline: auto;\n }\n\n .ax-message-no-active {\n position: relative;\n isolation: isolate;\n padding: 0.25rem;\n }\n\n .ax-message-no-active__ambient {\n position: absolute;\n inset: -2rem -1rem -1rem;\n z-index: 0;\n pointer-events: none;\n overflow: hidden;\n border-radius: 2rem;\n }\n\n .ax-message-no-active__grid {\n position: absolute;\n inset: 0;\n background-image:\n linear-gradient(rgba(var(--ax-sys-color-on-surface), 0.04) 1px, transparent 1px),\n linear-gradient(90deg, rgba(var(--ax-sys-color-on-surface), 0.04) 1px, transparent 1px);\n background-size: 24px 24px;\n mask-image: radial-gradient(ellipse 80% 70% at 50% 45%, black 20%, transparent 75%);\n opacity: 0.5;\n }\n\n .ax-message-no-active__card {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: 2rem 1.75rem 2.125rem;\n border-radius: 1.25rem;\n border: 1px solid rgba(var(--ax-sys-color-border-light-surface), 0.85);\n background: linear-gradient(\n 165deg,\n rgba(var(--ax-sys-color-lightest-surface), 0.72) 0%,\n rgba(var(--ax-sys-color-surface), 0.55) 100%\n );\n backdrop-filter: blur(14px);\n -webkit-backdrop-filter: blur(14px);\n animation: ax-no-active-card-in 0.65s cubic-bezier(0.22, 1, 0.36, 1) both;\n }\n\n .ax-message-no-active__icon-stack {\n position: relative;\n display: grid;\n place-items: center;\n margin-bottom: 1.25rem;\n }\n\n .ax-message-no-active__pulse {\n position: absolute;\n width: 5.5rem;\n height: 5.5rem;\n border-radius: 50%;\n background: radial-gradient(\n circle,\n rgba(var(--ax-sys-color-primary-500), 0.22) 0%,\n rgba(var(--ax-sys-color-primary-500), 0) 70%\n );\n animation: ax-no-active-pulse 3.2s ease-in-out infinite;\n }\n\n .ax-message-no-active__icon-bg {\n position: relative;\n display: grid;\n place-items: center;\n width: 4.25rem;\n height: 4.25rem;\n border-radius: 1.125rem;\n background: linear-gradient(\n 145deg,\n rgba(var(--ax-sys-color-primary-500), 0.16) 0%,\n rgba(var(--ax-sys-color-primary-600), 0.06) 100%\n );\n border: 1px solid rgba(var(--ax-sys-color-primary-500), 0.22);\n }\n\n .ax-message-no-active__icon-bg i {\n font-size: 1.875rem;\n line-height: 1;\n color: rgb(var(--ax-sys-color-primary-600));\n opacity: 0.92;\n }\n\n .ax-message-no-active__eyebrow {\n margin: 0 0 0.35rem;\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n color: rgb(var(--ax-sys-color-primary-600));\n opacity: 0.85;\n }\n\n .ax-message-no-active__title {\n margin: 0 0 0.65rem;\n font-size: 1.375rem;\n font-weight: 600;\n letter-spacing: -0.03em;\n line-height: 1.25;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .ax-message-no-active__desc {\n margin: 0;\n font-size: 0.9375rem;\n line-height: 1.65;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.62;\n max-width: 20rem;\n }\n\n @keyframes ax-no-active-card-in {\n from {\n opacity: 0;\n transform: translateY(12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n @keyframes ax-no-active-float {\n 0%,\n 100% {\n transform: translate(0, 0) scale(1);\n }\n 50% {\n transform: translate(4%, 6%) scale(1.05);\n }\n }\n\n @keyframes ax-no-active-pulse {\n 0%,\n 100% {\n transform: scale(0.92);\n opacity: 0.55;\n }\n 50% {\n transform: scale(1.06);\n opacity: 0.85;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .ax-message-no-active__pulse {\n animation: none;\n }\n\n .ax-message-no-active__card {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class AXConversationMessageListNoActiveDefaultComponent {\n private readonly translation = inject(AXTranslationService);\n\n readonly noConversationAriaLabel = () => 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 = () => this.translation.translateSync('@acorex:chat.empty.no-conversation-description');\n}\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/**\n * Reaction button sits outside the bubble on inline-end (received) or inline-start (own).\n * Open the picker toward the bubble: left of a right-side button (LTR received), etc.\n */\nexport function resolveReactionPickerPlacement(isOwnMessage: boolean, isRtl: boolean): AXPlacement {\n const openTowardPhysicalStart = (!isOwnMessage && !isRtl) || (isOwnMessage && isRtl);\n return openTowardPhysicalStart ? 'end-top' : 'start-top';\n}\n","/**\n * MessageList Component\n * Displays messages with virtual scrolling, date separators, and actions\n */\nimport { AXUploaderFileChangeEvent, AXUploaderZoneDirective } from '@acorex/cdk/uploader';\nimport type { AXPlacement } from '@acorex/cdk/common';\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 { AXLoadingComponent } from '@acorex/components/loading';\nimport {\n AXContextMenuComponent,\n AXContextMenuItemsClickEvent,\n AXContextMenuOpeningEvent,\n AXMenuItem,\n} from '@acorex/components/menu';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXDateTimeModule } from '@acorex/core/date-time';\nimport { AXFileService } from '@acorex/core/file';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n Type,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AXConversationInfiniteScrollDirective } from '../../directives';\nimport { AXConversationMessage, AXConversationMessageListEmptyComponent } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\nimport { AXConversationComposerService } from '../composer/composer.service';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\nimport { AXConversationRegistryComponentOutletComponent } from '../shared/registry-component-outlet.component';\nimport { AXConversationInfoBarService } from '../info-bar/info-bar.service';\nimport { AXConversationMessageListEmptyDefaultComponent } from './message-list-empty-default.component';\nimport { AXConversationMessageListNoActiveDefaultComponent } from './message-list-no-active-default.component';\nimport { AXConversationMessageListService } from './message-list.service';\nimport { isRtlDocument, resolveReactionPickerPlacement } from './reaction-picker-placement';\n\n/** Subtle chat-area wash when `messageListBackground` is not set in config (indigo → violet → rose → amber). */\nconst AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND =\n // 'linear-gradient(165deg, rgba(99, 102, 241, 0.14) 0%, rgba(139, 92, 246, 0.10) 34%, rgba(244, 114, 182, 0.11) 66%, rgba(251, 191, 36, 0.15) 100%)';\n 'rgb(var(--ax-sys-color-primary-lightest-surface))';\n\n/** Turn bare `https://...` or `/path` into valid CSS `background` for images. */\nfunction 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@Component({\n selector: 'ax-conversation-message-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n AXBadgeComponent,\n AXButtonComponent,\n AXContextMenuComponent,\n AXDecoratorModule,\n AXLabelComponent,\n AXLoadingComponent,\n AXFormatModule,\n AXDateTimeModule,\n AXPopoverComponent,\n AXTranslationModule,\n AXConversationInfiniteScrollDirective,\n AXUploaderZoneDirective,\n AXConversationAvatarComponent,\n AXConversationRegistryComponentOutletComponent,\n ],\n template: `\n @if (activeConversation(); as conv) {\n @for (cid of [conv.id]; track cid) {\n <div\n class=\"message-list message-list--conversation-surface\"\n [class.message-list--drag]=\"messageListDragging()\"\n #messageList\n role=\"log\"\n [attr.aria-label]=\"'@acorex:chat.aria.message-list' | translate | async\"\n aria-live=\"polite\"\n [style.background]=\"messageListBackgroundStyle()\"\n axUploaderZone\n [disableBrowse]=\"true\"\n (dragEnter)=\"onMessageListDragEnter()\"\n (dragLeave)=\"onMessageListDragLeave()\"\n (fileChange)=\"onMessageListFilesDropped($event)\"\n >\n @if (loading()) {\n <div\n class=\"list-loading\"\n role=\"status\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-messages' | translate | async\"\n >\n <ax-loading></ax-loading>\n <ax-label>{{ '@acorex:chat.status.loading-messages' | translate | async }}</ax-label>\n </div>\n } @else if (messages().length === 0) {\n <div\n class=\"list-empty\"\n role=\"status\"\n [attr.aria-label]=\"'@acorex:chat.status.no-messages' | translate | async\"\n >\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 {\n <div\n class=\"messages-container\"\n (scroll)=\"onScroll($event)\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold\"\n [edge]=\"'top'\"\n [scrollDisabled]=\"loading() || loadingMore() || !hasMoreMessages()\"\n (scrollThreshold)=\"onScrollThreshold($event)\"\n #messagesContainer\n role=\"feed\"\n [attr.aria-label]=\"'@acorex:chat.aria.messages' | translate | async\"\n >\n @if (loadingMore()) {\n <div\n class=\"list-loading-more list-loading-more--prepend\"\n role=\"status\"\n animate.enter=\"load-more-enter\"\n animate.leave=\"load-more-leave\"\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 }\n @for (group of messageGroups(); track trackMessageGroup($index, group)) {\n <!-- Date Separator -->\n <div\n class=\"date-separator\"\n role=\"separator\"\n [attr.aria-label]=\"getDateSeparatorAriaLabel(group.dateLabel)\"\n >\n <ax-badge [text]=\"group.dateLabel\" class=\"date-text\"></ax-badge>\n </div>\n\n <!-- Messages in this date group -->\n @for (message of group.messages; track trackMessage($index, message)) {\n <div\n [class]=\"getMessageClasses(message)\"\n role=\"article\"\n [attr.aria-label]=\"getMessageAriaLabel(message)\"\n [id]=\"'message-' + message.id\"\n >\n <!-- Avatar (only for group conversations and received messages) -->\n @if (shouldShowAvatar(message)) {\n <div class=\"message-avatar\">\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"message.senderId\"\n [conversation]=\"activeConversation()\"\n [message]=\"message\"\n [size]=\"32\"\n />\n </div>\n }\n\n <div class=\"message-content-row\" [class.message-content-row-own]=\"isOwnMessage(message)\">\n <button\n type=\"button\"\n class=\"add-reaction-button add-reaction-outside\"\n [class.add-reaction-visible]=\"reactionPickerTarget() === message.id\"\n (click)=\"toggleReactionPicker(message, $event)\"\n [attr.aria-label]=\"'@acorex:chat.actions.add-reaction' | translate | async\"\n #reactionButton\n >\n <i class=\"fa-light fa-face-smile\"></i>\n </button>\n\n <div\n class=\"message-bubble-container\"\n [id]=\"'message-bubble-' + message.id\"\n [attr.data-message-id]=\"message.id\"\n >\n <div\n [class]=\"getBubbleClasses(message)\"\n [class.message-bubble-sent]=\"message.senderId === currentUser()?.id\"\n [class.message-bubble-received]=\"message.senderId !== currentUser()?.id\"\n >\n <!-- Sender name (only for group conversations and received messages) -->\n @if (shouldShowSenderName(message)) {\n <div class=\"message-sender\">{{ getSenderName(message) }}:</div>\n }\n\n <!-- Reply Preview -->\n @if (message.replyTo) {\n <div\n class=\"reply-preview\"\n (click)=\"scrollToMessage(message.replyTo.id)\"\n role=\"button\"\n [attr.aria-label]=\"'Reply to ' + getSenderName(message.replyTo)\"\n (keydown.enter)=\"scrollToMessage(message.replyTo.id)\"\n (keydown.space)=\"scrollToMessage(message.replyTo.id)\"\n >\n <div class=\"reply-preview-content\">\n <div class=\"reply-preview-sender\">{{ getSenderName(message.replyTo) }}</div>\n <div class=\"reply-preview-text\">\n @if (getMessagePreviewText(message.replyTo); as preview) {\n <span class=\"last-message\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i\n >{{ '@acorex:chat.' + preview.type | translate | async }}\n } @else {\n {{ preview.value }}\n }\n </span>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Forwarded Indicator -->\n @if (message.forwarded) {\n <div class=\"forwarded-preview\">\n <i class=\"fa-solid fa-share\"></i>\n <span class=\"forwarded-text\">{{ getForwardedText(message) }}</span>\n </div>\n }\n\n <ax-conversation-registry-component-outlet\n [component]=\"getRendererComponent(message)\"\n [componentLoader]=\"getRendererComponentLoader(message)\"\n [inputs]=\"getRendererInputs(message)\"\n />\n\n @if (message.reactions.length > 0) {\n <div class=\"message-reactions-container\">\n <div class=\"message-reactions-bubbles\">\n @for (reaction of getGroupedReactions(message); track reaction.emoji) {\n <button\n type=\"button\"\n class=\"reaction-bubble\"\n [class.reaction-bubble-active]=\"reaction.hasReacted\"\n (click)=\"onReactionClick(message, reaction.emoji)\"\n [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 <!-- Message Footer -->\n <div class=\"message-footer\">\n @if (getReplyCount(message) > 0) {\n <span\n class=\"message-footer-count\"\n [attr.aria-label]=\"getReplyCount(message) + ' replies'\"\n >\n <i class=\"fa-solid fa-message\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ getReplyCount(message) }}</span>\n </span>\n }\n @if (getForwardCount(message) > 0) {\n <span\n class=\"message-footer-count\"\n [attr.aria-label]=\"getForwardCount(message) + ' forwards'\"\n >\n <i class=\"fa-solid fa-share\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ getForwardCount(message) }}</span>\n </span>\n }\n @if (getReplyCount(message) > 0 || getForwardCount(message) > 0) {\n <span class=\"message-footer-split\" aria-hidden=\"true\"></span>\n }\n <span class=\"message-time\">{{ message.timestamp | format: 'timeleft' | async }}</span>\n @if (message.editedAt) {\n <span class=\"edited-indicator\">\n <span>{{ '@acorex:chat.status.edited' | translate | async }}</span>\n </span>\n }\n @if (isOwnMessage(message)) {\n <span [class]=\"getStatusIconClasses(message)\">\n <ax-icon><i [class]=\"getStatusIcon(message)\"></i></ax-icon>\n </span>\n }\n </div>\n </div>\n </div>\n </div>\n\n <!-- Context Menu for Message Actions -->\n <ax-context-menu\n [target]=\"'#message-bubble-' + message.id\"\n [openOn]=\"'click'\"\n [closeOn]=\"'click'\"\n (onOpening)=\"handleMessageContextMenuOpening($event, message)\"\n (onClose)=\"contextMenuMessageId.set(null)\"\n (onItemClick)=\"handleMessageContextMenuItemClick($event, message)\"\n >\n </ax-context-menu>\n </div>\n }\n }\n </div>\n\n <!-- Scroll to Bottom Button -->\n @if (showScrollButton()) {\n <ax-button\n class=\"scroll-to-bottom\"\n (onClick)=\"scrollToBottom()\"\n animate.enter=\"slide-in\"\n animate.leave=\"slide-out\"\n [text]=\"'↓'\"\n [look]=\"'solid'\"\n [attr.aria-label]=\"'@acorex:chat.actions.scroll-to-bottom' | translate | async\"\n ></ax-button>\n }\n }\n </div>\n }\n\n <!-- Reaction Picker Popover -->\n @if (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 class=\"reaction-picker-header\">\n <span class=\"picker-title\">{{ '@acorex:chat.actions.react' | translate | async }}</span>\n <button\n type=\"button\"\n class=\"picker-close\"\n (click)=\"closeReactionPicker()\"\n [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\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 styles: [\n `\n :host {\n display: block;\n height: 100%;\n position: relative;\n container-type: inline-size;\n }\n\n .message-list {\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n }\n\n .message-list.ax-drop-zone > .ax-uploader-overlay-state {\n display: none !important;\n }\n\n .message-list--drag {\n outline: 2px dashed rgb(var(--ax-sys-color-primary-500));\n outline-offset: -2px;\n }\n\n .message-list--conversation-surface {\n animation: axConversationSurfaceIn 0.36s cubic-bezier(0.22, 1, 0.36, 1) both;\n }\n\n @keyframes axConversationSurfaceIn {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .message-list--conversation-surface {\n animation: axConversationSurfaceInReduced 0.18s ease both;\n }\n }\n\n @keyframes axConversationSurfaceInReduced {\n from {\n opacity: 0.92;\n }\n\n to {\n opacity: 1;\n }\n }\n\n .list-loading {\n display: flex;\n flex: 1;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 0;\n text-align: center;\n }\n\n .list-empty {\n display: flex;\n flex: 1;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 0;\n text-align: center;\n padding: 3rem 2rem;\n gap: 1.25rem;\n animation: fadeInUp 0.5s ease-out;\n }\n\n .message-list--no-active {\n height: 100%;\n }\n\n .list-no-active {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 12rem;\n }\n\n @keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .empty-icon {\n font-size: 5.5rem;\n line-height: 1;\n opacity: 0.35;\n margin-bottom: 0.5rem;\n filter: grayscale(0.2);\n }\n\n .empty-title {\n font-size: 1.625rem;\n font-weight: 600;\n margin: 0;\n color: rgb(var(--ax-sys-color-on-surface));\n letter-spacing: -0.02em;\n }\n\n .empty-description {\n font-size: 1.0625rem;\n margin: 0;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.65;\n max-width: 420px;\n line-height: 1.7;\n }\n\n .spinner {\n width: 32px;\n height: 32px;\n border: 3px solid rgb(var(--ax-sys-color-border-light-surface));\n border-top-color: rgb(var(--ax-sys-color-primary-500));\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n margin-bottom: 1rem;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .list-loading-more {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem 0.5rem;\n text-align: center;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.85;\n }\n\n .load-more-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.3rem;\n min-height: 1.25rem;\n }\n\n .load-more-dot {\n width: 0.4rem;\n height: 0.4rem;\n border-radius: 50%;\n background: rgb(var(--ax-sys-color-primary-500));\n animation: axChatLoadMoreDot 1s ease-in-out infinite;\n }\n\n .load-more-dot:nth-child(2) {\n animation-delay: 0.14s;\n }\n\n .load-more-dot:nth-child(3) {\n animation-delay: 0.28s;\n }\n\n .load-more-label {\n font-size: 0.75rem;\n opacity: 0.72;\n letter-spacing: 0.01em;\n }\n\n .load-more-enter {\n animation: axChatLoadMoreEnterPrepend 0.32s cubic-bezier(0.22, 1, 0.36, 1) both;\n }\n\n .load-more-leave {\n animation: axChatLoadMoreLeavePrepend 0.22s ease both;\n }\n\n @keyframes axChatLoadMoreDot {\n 0%,\n 70%,\n 100% {\n transform: translateY(0) scale(1);\n opacity: 0.4;\n }\n\n 35% {\n transform: translateY(-0.28rem) scale(1.08);\n opacity: 1;\n }\n }\n\n @keyframes axChatLoadMoreEnterPrepend {\n from {\n opacity: 0;\n transform: translateY(-0.5rem);\n }\n\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n @keyframes axChatLoadMoreLeavePrepend {\n from {\n opacity: 1;\n transform: translateY(0);\n }\n\n to {\n opacity: 0;\n transform: translateY(-0.35rem);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .load-more-dot {\n animation: none;\n opacity: 0.65;\n }\n\n .load-more-enter,\n .load-more-leave {\n animation: none;\n }\n }\n\n .messages-container {\n position: relative;\n flex: 1;\n width: 100%;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .date-separator {\n position: sticky;\n z-index: 150;\n top: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 0;\n }\n\n .date-text {\n padding: 0.25rem 0.75rem;\n background: rgb(var(--ax-sys-color-lighter-surface));\n font-size: 0.75rem;\n font-weight: 500;\n border-radius: 1rem;\n width: 7rem;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .unread-separator {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 1.5rem 0;\n padding: 0 1rem;\n }\n\n .unread-separator-line {\n flex: 1;\n height: 1px;\n background: rgb(var(--ax-sys-color-primary-500));\n opacity: 0.3;\n }\n\n .unread-separator-text {\n font-size: 0.75rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-primary-500));\n text-transform: uppercase;\n letter-spacing: 0.05em;\n white-space: nowrap;\n }\n\n .message-item {\n position: relative;\n display: flex;\n padding: 0.5rem 1rem;\n gap: 0.5rem;\n line-height: 1rem;\n align-items: end;\n transition: background-color 0.3s ease;\n }\n\n .message-item-context-active {\n background-color: rgba(var(--ax-sys-color-primary-500), 0.09);\n border-radius: 0.5rem;\n box-shadow: inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500), 0.22);\n }\n\n .message-own.message-item-context-active {\n background-color: rgba(var(--ax-sys-color-primary-500), 0.12);\n }\n\n .message-highlight {\n background-color: rgba(var(--ax-sys-color-primary-500), 0.1);\n border-radius: 0.5rem;\n }\n\n .message-own {\n flex-direction: row-reverse;\n }\n\n .message-avatar {\n flex-shrink: 0;\n }\n\n .message-avatar-icon {\n font-size: 1rem;\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n }\n\n .message-content-row {\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n max-width: min(95%, 50rem);\n min-width: 0;\n flex: 0 1 auto;\n position: relative;\n column-gap: 0.25rem;\n }\n\n @container (min-width: 768px) {\n .message-content-row {\n max-width: min(70%, 50rem);\n }\n }\n\n .message-content-row-own {\n justify-content: flex-end;\n }\n\n .message-item:not(.message-own) .message-content-row {\n justify-content: flex-start;\n }\n\n .message-bubble-container {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-width: 0;\n max-width: 100%;\n position: relative;\n }\n\n .message-own .message-bubble-container {\n align-items: flex-end;\n }\n\n .message-sender {\n font-size: 0.75rem;\n font-weight: 600;\n margin-bottom: 0.1rem;\n }\n\n .message-bubble {\n position: relative;\n max-width: 100%;\n display: flex;\n flex-direction: column;\n padding: 0.5rem 0.5rem 0.1rem 0.5rem;\n border-radius: 1rem;\n background: rgb(var(--ax-sys-color-lightest-surface));\n word-wrap: break-word;\n transition: background-color 0.3s ease;\n }\n\n /* Reply Preview — received: primary-tinted quote; own: on-primary-surface glass */\n .reply-preview {\n padding: 0.375rem 0.5rem;\n margin-bottom: 0.1rem;\n background: rgba(var(--ax-sys-color-primary-500), 0.08);\n border-radius: var(--ax-sys-border-radius);\n border-inline-start: 3px solid rgb(var(--ax-sys-color-primary-500));\n cursor: pointer;\n transition:\n background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),\n border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n }\n\n .reply-preview:hover {\n background: rgba(var(--ax-sys-color-primary-500), 0.14);\n border-inline-start-color: rgb(var(--ax-sys-color-primary-600));\n }\n\n .message-own .reply-preview {\n background: rgba(var(--ax-sys-color-on-primary-surface), 0.14);\n border-inline-start: 3px solid rgba(var(--ax-sys-color-on-primary-surface), 0.55);\n }\n\n .message-own .reply-preview:hover {\n background: rgba(var(--ax-sys-color-on-primary-surface), 0.22);\n border-inline-start-color: rgba(var(--ax-sys-color-on-primary-surface), 0.75);\n }\n\n .reply-preview-line {\n width: 3px;\n background: currentColor;\n opacity: 0.5;\n border-radius: 1.5px;\n flex-shrink: 0;\n }\n\n .reply-preview-content {\n flex: 1;\n min-width: 0;\n }\n\n .reply-preview-sender {\n font-size: 0.75rem;\n font-weight: 600;\n margin-bottom: 0.125rem;\n color: rgb(var(--ax-sys-color-primary-600));\n }\n\n .reply-preview-text {\n font-size: 0.8125rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.72;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .message-own .reply-preview-sender {\n color: rgb(var(--ax-sys-color-on-primary-surface));\n opacity: 0.95;\n }\n\n .message-own .reply-preview-text {\n color: rgb(var(--ax-sys-color-on-primary-surface));\n opacity: 0.78;\n }\n\n .last-message {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n\n /* Forwarded Indicator — same surface as reply-preview (not interactive: no pointer) */\n .forwarded-preview {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.5rem;\n margin-bottom: 0.1rem;\n background: rgba(var(--ax-sys-color-primary-500), 0.08);\n border-radius: var(--ax-sys-border-radius);\n border-inline-start: 3px solid rgb(var(--ax-sys-color-primary-500));\n transition:\n background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),\n border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n }\n\n .forwarded-preview:hover {\n background: rgba(var(--ax-sys-color-primary-500), 0.14);\n border-inline-start-color: rgb(var(--ax-sys-color-primary-600));\n }\n\n .message-own .forwarded-preview {\n background: rgba(var(--ax-sys-color-on-primary-surface), 0.14);\n border-inline-start: 3px solid rgba(var(--ax-sys-color-on-primary-surface), 0.55);\n }\n\n .message-own .forwarded-preview:hover {\n background: rgba(var(--ax-sys-color-on-primary-surface), 0.22);\n border-inline-start-color: rgba(var(--ax-sys-color-on-primary-surface), 0.75);\n }\n\n .forwarded-preview i {\n font-size: 0.8125rem;\n flex-shrink: 0;\n color: rgb(var(--ax-sys-color-primary-600));\n }\n\n .forwarded-text {\n font-size: 0.8125rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.72;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n }\n\n .message-own .forwarded-preview i {\n color: rgb(var(--ax-sys-color-on-primary-surface));\n opacity: 0.95;\n }\n\n .message-own .forwarded-text {\n color: rgb(var(--ax-sys-color-on-primary-surface));\n opacity: 0.78;\n }\n\n /* Received messages - sharp bottom inline-start corner */\n .message-bubble-received {\n border-end-start-radius: 0.125rem;\n }\n\n .message-bubble-received::before {\n content: '';\n display: block;\n background: rgb(var(--ax-sys-color-lightest-surface));\n width: 0.8rem;\n height: 0.8rem;\n position: absolute;\n bottom: 0;\n inset-inline-start: -0.7rem;\n border-start-start-radius: 86%;\n corner-shape: scoop;\n }\n\n /* Sent messages - sharp bottom inline-end corner */\n .message-bubble-sent {\n border-end-end-radius: 0.125rem;\n }\n\n .message-bubble-sent::after {\n content: '';\n display: block;\n background: rgb(var(--ax-sys-color-primary-surface));\n width: 0.8rem;\n height: 0.8rem;\n position: absolute;\n bottom: 0;\n inset-inline-end: -0.7rem;\n border-start-end-radius: 86%;\n corner-shape: scoop;\n }\n\n .message-own .message-bubble {\n background: rgb(var(--ax-sys-color-primary-surface));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n }\n\n .message-content {\n font-size: 0.9375rem;\n line-height: 1.5;\n white-space: pre-wrap;\n }\n\n .message-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-wrap: wrap;\n padding-inline-start: 0.25rem;\n margin-top: 0.1rem;\n gap: 0.25rem;\n font-size: 0.6875rem;\n opacity: 0.7;\n letter-spacing: 0.05rem;\n user-select: none;\n }\n\n .message-footer-count {\n display: inline-flex;\n align-items: center;\n gap: 0.2rem;\n font-variant-numeric: tabular-nums;\n font-size: 0.675rem;\n }\n\n .message-footer-count i {\n font-size: 0.625rem;\n opacity: 0.9;\n }\n\n .message-footer-count-value {\n font-weight: 600;\n }\n\n .message-footer-split {\n flex-shrink: 0;\n align-self: center;\n width: 1px;\n height: 0.65rem;\n background: rgb(var(--ax-sys-color-border-light-surface));\n opacity: 0.9;\n margin-inline: 0.2rem;\n }\n\n .message-time {\n font-variant-numeric: tabular-nums;\n font-size: 0.675rem;\n }\n\n .edited-indicator {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: 0.675rem;\n opacity: 0.75;\n padding-inline-start: 0.35rem;\n border-inline-start: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .status-icon {\n display: inline-flex;\n align-items: center;\n }\n\n .status-icon i {\n font-size: 0.75rem;\n }\n\n .status-read {\n color: rgb(var(--ax-sys-color-primary-200));\n }\n\n .status-failed {\n color: rgb(var(--ax-sys-color-danger-200));\n }\n\n .message-reactions-bubbles {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.2rem;\n }\n\n /* Telegram-like compact reaction pills inside the bubble */\n .reaction-bubble {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.15rem;\n min-height: 1.375rem;\n padding: 0.1rem 0.35rem;\n margin: 0;\n background: rgba(var(--ax-sys-color-on-surface), 0.06);\n color: rgb(var(--ax-sys-color-on-surface));\n border: 1px solid rgba(var(--ax-sys-color-on-surface), 0.1);\n border-radius: 0.75rem;\n box-shadow: none;\n cursor: pointer;\n transition:\n background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),\n border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n font-family:\n 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Apple Color Emoji', 'Twemoji Mozilla', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .reaction-bubble:hover {\n background: rgba(var(--ax-sys-color-on-surface), 0.1);\n border-color: rgba(var(--ax-sys-color-on-surface), 0.18);\n }\n\n .reaction-bubble-active {\n background: rgba(var(--ax-sys-color-primary-500), 0.12);\n border-color: rgba(var(--ax-sys-color-primary-500), 0.45);\n }\n\n .reaction-bubble-active:hover {\n background: rgba(var(--ax-sys-color-primary-500), 0.18);\n border-color: rgba(var(--ax-sys-color-primary-500), 0.55);\n }\n\n .reaction-emoji {\n font-size: 0.8125rem;\n line-height: 1;\n display: inline-block;\n }\n\n .reaction-count {\n font-size: 0.6875rem;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.65;\n line-height: 1;\n }\n\n .reaction-bubble-active .reaction-count {\n color: rgb(var(--ax-sys-color-primary-600));\n opacity: 0.95;\n font-weight: 600;\n }\n\n .message-own .reaction-bubble {\n background: rgba(var(--ax-sys-color-on-primary-surface), 0.12);\n border-color: rgba(var(--ax-sys-color-on-primary-surface), 0.2);\n color: rgb(var(--ax-sys-color-on-primary-surface));\n }\n\n .message-own .reaction-bubble:hover {\n background: rgba(var(--ax-sys-color-on-primary-surface), 0.2);\n border-color: rgba(var(--ax-sys-color-on-primary-surface), 0.35);\n }\n\n .message-own .reaction-bubble-active {\n background: rgba(var(--ax-sys-color-on-primary-surface), 0.28);\n border-color: rgba(var(--ax-sys-color-on-primary-surface), 0.5);\n }\n\n .message-own .reaction-bubble-active:hover {\n background: rgba(var(--ax-sys-color-on-primary-surface), 0.34);\n border-color: rgba(var(--ax-sys-color-on-primary-surface), 0.6);\n }\n\n .message-own .reaction-count {\n color: rgb(var(--ax-sys-color-on-primary-surface));\n opacity: 0.8;\n }\n\n .message-own .reaction-bubble-active .reaction-count {\n color: rgb(var(--ax-sys-color-on-primary-surface));\n opacity: 1;\n }\n\n .message-reactions-container {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.2rem;\n margin-top: 0.25rem;\n justify-content: flex-start;\n }\n\n .add-reaction-button.add-reaction-outside {\n display: none;\n position: absolute;\n top: 50%;\n inset-inline-end: -2.25rem;\n transform: translateY(-50%);\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: 1.8rem;\n height: 1.8rem;\n padding: 0;\n margin: 0;\n border-radius: 50%;\n cursor: pointer;\n background: rgb(var(--ax-sys-color-surface));\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);\n }\n\n .add-reaction-button {\n padding-inline-start: 0.05rem;\n }\n\n .message-content-row-own .add-reaction-button.add-reaction-outside {\n inset-inline-start: -2.25rem;\n inset-inline-end: auto;\n }\n\n .message-item:hover .add-reaction-button.add-reaction-outside,\n .add-reaction-button.add-reaction-outside.add-reaction-visible {\n display: inline-flex;\n }\n\n .add-reaction-button.add-reaction-outside:hover {\n border-color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .add-reaction-button.add-reaction-outside.add-reaction-visible {\n border-color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .add-reaction-button.add-reaction-outside i {\n font-size: 0.9rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.8;\n }\n\n .reaction-picker-popup {\n background: rgb(var(--ax-sys-color-lightest-surface));\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n border-radius: 0.65rem;\n min-width: auto;\n width: max-content;\n max-width: min(260px, 92vw);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n }\n\n .reaction-picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n padding: 0.45rem 0.5rem 0.45rem 0.7rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n min-height: 0;\n }\n\n .picker-title {\n font-size: 0.8125rem;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.85;\n }\n\n .picker-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.6rem;\n height: 1.6rem;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 0.25rem;\n cursor: pointer;\n font-size: 0.95rem;\n color: rgba(var(--ax-sys-color-on-surface), 0.55);\n transition: all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n }\n\n .picker-close:hover {\n background: rgba(var(--ax-sys-color-danger-500), 0.1);\n color: rgb(var(--ax-sys-color-danger-500));\n }\n\n .reaction-bubble:focus-visible,\n .add-reaction-button:focus-visible,\n .picker-close:focus-visible,\n .reaction-picker-emoji:focus-visible,\n .action-trigger:focus-visible,\n .scroll-to-bottom:focus-visible {\n outline: 2px solid rgb(var(--ax-sys-color-primary-500));\n outline-offset: 2px;\n }\n\n .reaction-picker-emojis {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 0.2rem;\n padding: 0.45rem 0.5rem 0.5rem;\n }\n\n .reaction-picker-emoji {\n width: 2rem;\n height: 2rem;\n padding: 0;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 0.45rem;\n font-size: 1.15rem;\n line-height: 1;\n cursor: pointer;\n transition: all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n font-family:\n 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Apple Color Emoji', 'Twemoji Mozilla', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .reaction-picker-emoji:hover {\n background: rgb(var(--ax-sys-color-lighter-surface));\n }\n\n .reaction-picker-emoji-active {\n background: rgb(var(--ax-sys-color-surface));\n }\n\n .reaction-picker-emoji-active:hover {\n background: rgba(var(--ax-sys-color-primary-500), 0.25);\n }\n\n .message-actions {\n padding-bottom: 1.5rem;\n opacity: 0;\n transition: opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n z-index: 10;\n }\n\n .message-own .message-actions {\n }\n\n .message-item:hover .message-actions {\n opacity: 1;\n }\n\n .action-trigger {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-surface));\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n border-radius: var(--ax-sys-border-radius);\n font-size: 0.875rem;\n cursor: pointer;\n transition: all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n }\n\n .action-trigger:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .shortcut {\n font-size: 0.6875rem;\n opacity: 0.7;\n }\n\n .scroll-to-bottom {\n position: absolute;\n bottom: 1rem;\n inset-inline-end: 1rem;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n border: none;\n border-radius: 50%;\n font-size: 1.5rem;\n cursor: pointer;\n transition: transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n z-index: 999;\n }\n\n /* Enter animation */\n .slide-in {\n animation: slideInFromBottom var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n }\n\n @keyframes slideInFromBottom {\n from {\n opacity: 0;\n transform: translateY(100%);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Leave animation */\n .slide-out {\n opacity: 0;\n transform: translateY(100%);\n transition:\n opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),\n transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);\n }\n `,\n ],\n})\nexport class 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 private readonly translation = inject(AXTranslationService);\n private readonly document = inject(DOCUMENT);\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 gradient when unset/empty.\n * Set `messageListBackground` to `transparent` or `none` for a flat look.\n */\n messageListBackgroundStyle(): string {\n const conversationBackground = this.activeConversation()?.metadata?.['messageListBackground'];\n const raw = typeof conversationBackground === 'string' ? conversationBackground : this.config.messageListBackground;\n if (typeof raw !== 'string') {\n return AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND;\n }\n return normalizeMessageListBackgroundValue(raw);\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\n // Store reply and forward counts from API\n private readonly replyCounts = signal<Map<string, number>>(new Map());\n private readonly forwardCounts = signal<Map<string, number>>(new Map());\n\n // Reaction picker state\n readonly reactionPickerTarget = signal<string | null>(null);\n readonly reactionPickerElement = signal<HTMLElement | null>(null);\n readonly 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\n /** True while files are dragged over the message list drop zone. */\n readonly messageListDragging = 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 // Available reaction emojis from API\n readonly availableReactions = signal<string[]>([]);\n\n // Access registry through conversation service\n private get registry() {\n return this.conversationService.registry;\n }\n\n /** Message list element reference */\n private readonly messageListRef = viewChild<ElementRef>('messageList');\n\n /** Messages container element reference */\n private readonly messagesContainerRef = viewChild<ElementRef<HTMLDivElement>>('messagesContainer');\n\n /** Loading state - use service */\n readonly loading = this.messageListService.loading;\n\n /** Loading more messages state - use service */\n readonly loadingMore = this.messageListService.loadingMore;\n\n /** 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 /** Messages */\n readonly messages = this.conversationService.activeMessages;\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 // Load available reactions from API\n this.loadAvailableReactions();\n\n // Close reaction picker when clicking outside\n if (typeof document !== 'undefined') {\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n if (\n target.closest('.message-reactions-container') ||\n target.closest('.add-reaction-button') ||\n target.closest('.reaction-picker-popup')\n ) {\n return;\n }\n this.closeReactionPicker();\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.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 // Reset pagination state for new conversation\n this.messageListService.resetPagination();\n\n // Wait until the messages branch mounts (#messagesContainer) after loading, then scroll\n // after layout — avoids no-op scroll during loading and jitter vs the surface enter animation.\n queueMicrotask(() => this.scrollToBottomWhenContainerReady());\n }\n\n // Update previous ID\n previousConversationId = currentConversationId;\n });\n });\n\n // Subscribe to global message count refresh events (works across all conversations)\n this.conversationService.onMessageCountRefresh.pipe(takeUntilDestroyed()).subscribe(({ messageId, type }) => {\n this.refreshCount(messageId, type);\n });\n\n // 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 container = this.messagesContainerRef()?.nativeElement;\n const currentUser = this.currentUser();\n const currentCount = messages.length;\n const currentLastId = messages.at(-1)?.id ?? null;\n\n if (conversationId !== previousConversationIdForScroll) {\n previousConversationIdForScroll = conversationId;\n previousMessageCount = currentCount;\n previousLastMessageId = currentLastId;\n return;\n }\n\n if (!container || !conversation || this.restoringScrollAfterPrepend) {\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) {\n const newestMessage = messages[messages.length - 1];\n const isOwnMessage = !!currentUser && newestMessage?.senderId === currentUser.id;\n\n if (isOwnMessage) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n container.scrollTo({ top: container.scrollHeight, behavior: 'smooth' });\n });\n });\n } else {\n const { scrollTop, scrollHeight, clientHeight } = container;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n const isAtBottom = distanceFromBottom < this.config.scrollThreshold;\n\n if (isAtBottom) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n container.scrollTo({ top: container.scrollHeight, behavior: 'smooth' });\n });\n });\n }\n }\n }\n\n previousMessageCount = currentCount;\n previousLastMessageId = currentLastId;\n });\n\n // Setup intersection observer for marking messages as read\n this.setupIntersectionObserver();\n\n // Scroll to bottom when an external scroll request is issued (e.g., after sending a message)\n let initialScrollRequest = true;\n effect(() => {\n void this.messageListService.scrollRequests();\n if (initialScrollRequest) {\n initialScrollRequest = false;\n return;\n }\n // Wait for DOM to render the new message before scrolling\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.scrollToBottom(false);\n });\n });\n });\n }\n\n private intersectionObserver?: IntersectionObserver;\n\n /**\n * Setup intersection observer to mark messages as read when visible\n */\n private setupIntersectionObserver(): void {\n // Create observer with configurable threshold (default 30%)\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const messageId = entry.target.getAttribute('data-message-id');\n if (messageId) {\n this.markMessageAsRead(messageId);\n }\n }\n });\n },\n {\n root: this.messagesContainerRef()?.nativeElement,\n threshold: this.config.messageReadThreshold,\n },\n );\n\n // Observe unread messages\n effect(() => {\n const messages = this.messages();\n const currentUser = this.currentUser();\n\n if (!this.intersectionObserver || !currentUser) return;\n\n // Find unread messages not sent by current user\n const unreadMessages = messages.filter((m) => m.status !== 'read' && m.senderId !== currentUser.id);\n\n // Observe each unread message\n setTimeout(() => {\n unreadMessages.forEach((msg) => {\n const element = document.querySelector(`[data-message-id=\"${msg.id}\"]`);\n if (element && this.intersectionObserver) {\n this.intersectionObserver.observe(element);\n }\n });\n }, 100);\n });\n }\n\n /**\n * Mark message as read\n */\n private markMessageAsRead(messageId: string): void {\n const message = this.messages().find((m) => m.id === messageId);\n if (!message || message.status === 'read') return;\n\n // Update message status\n this.conversationService.markMessageAsRead(messageId);\n\n // Unobserve the message\n const element = document.querySelector(`[data-message-id=\"${messageId}\"]`);\n if (element && this.intersectionObserver) {\n this.intersectionObserver.unobserve(element);\n }\n }\n\n // Date grouping methods moved to service\n\n /** Get message CSS classes */\n getMessageClasses(message: AXConversationMessage): string {\n const classes = ['message-item'];\n if (this.isOwnMessage(message)) {\n classes.push('message-own');\n }\n if (this.contextMenuMessageId() === message.id) {\n classes.push('message-item-context-active');\n }\n return classes.join(' ');\n }\n\n /** Get bubble CSS classes */\n getBubbleClasses(message: AXConversationMessage): string {\n const classes = ['message-bubble'];\n if (message.type === 'system') {\n classes.push('message-system');\n }\n return classes.join(' ');\n }\n\n /** Check if message is from current user */\n isOwnMessage(message: AXConversationMessage): boolean {\n const user = this.currentUser();\n if (!user) return false;\n return AXConversationMessageUtilsService.isOwnMessage(message, user.id);\n }\n\n /** Should show avatar */\n shouldShowAvatar(message: AXConversationMessage): boolean {\n const conversation = this.activeConversation();\n return conversation?.type === 'group' && !this.isOwnMessage(message);\n }\n\n /** Should show sender name */\n shouldShowSenderName(message: AXConversationMessage): boolean {\n const conversation = this.activeConversation();\n return conversation?.type === 'group' && !this.isOwnMessage(message);\n }\n\n /** Get sender name */\n getSenderName(message: AXConversationMessage): string {\n const conversation = this.activeConversation();\n if (!conversation) return this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');\n return AXConversationMessageUtilsService.getSenderName(message, conversation);\n }\n\n /** Get original sender name for forwarded messages */\n getOriginalSenderName(message: AXConversationMessage): string {\n // Use new forwardedFrom object if available\n if (message.forwardedFrom) {\n return message.forwardedFrom.senderName;\n }\n\n // Fallback to old method for backward compatibility\n const conversation = this.activeConversation();\n if (!conversation || !message.forwardedFrom) {\n return this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');\n }\n\n const participant = conversation.participants.find((p) => p.id === message.forwardedFrom.senderId);\n return participant?.name || this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');\n }\n\n /** Get forwarded text with sender and conversation info */\n getForwardedText(message: AXConversationMessage): string {\n if (!message.forwardedFrom) {\n return this.translation.translateSync('@acorex:chat.forwarded.from', {\n params: { senderName: this.getOriginalSenderName(message) },\n });\n }\n\n const senderName = message.forwardedFrom.senderName;\n const conversationTitle = message.forwardedFrom.conversationTitle;\n\n // If conversation title exists and is different from sender name, show both\n if (conversationTitle && conversationTitle !== senderName) {\n return this.translation.translateSync('@acorex:chat.forwarded.from-with-conversation', {\n params: { senderName, conversationTitle },\n });\n }\n // Otherwise just show sender name\n return this.translation.translateSync('@acorex:chat.forwarded.from', { params: { senderName } });\n }\n\n /** Resolve renderer component for message */\n getRendererComponent(message: AXConversationMessage) {\n const renderer = this.registry.messageRenderers.getRenderer(message);\n if (!renderer) {\n console.warn('No renderer found for message type:', message.type, 'Using fallback');\n }\n return renderer?.component;\n }\n\n /** Resolve lazy renderer loader for message */\n getRendererComponentLoader(message: AXConversationMessage) {\n const renderer = this.registry.messageRenderers.getRenderer(message);\n if (renderer?.componentLoader) {\n return renderer.componentLoader;\n }\n if (!renderer || !renderer.component) {\n return () =>\n import('../../plugins/message-list/components/fallback-renderer/fallback-renderer.component').then(\n (m) => m.AXConversationFallbackRendererComponent,\n );\n }\n return undefined;\n }\n\n /** Provide inputs for the dynamic renderer */\n getRendererInputs(message: AXConversationMessage) {\n return { message };\n }\n\n /** Get status icon */\n getStatusIcon(message: AXConversationMessage): string {\n return AXConversationMessageUtilsService.getStatusIcon(message);\n }\n\n /** Get status icon CSS classes */\n getStatusIconClasses(message: AXConversationMessage): string {\n const classes = ['status-icon'];\n if (message.status === 'read') {\n classes.push('status-read');\n } else if (message.status === 'failed') {\n classes.push('status-failed');\n }\n return classes.join(' ');\n }\n\n /** Get status tooltip text */\n getStatusTooltip(message: AXConversationMessage): string {\n switch (message.status) {\n case 'sending':\n return this.translation.translateSync('@acorex:chat.status.sending');\n case 'sent':\n return this.translation.translateSync('@acorex:chat.status.sent');\n case 'delivered':\n return this.translation.translateSync('@acorex:chat.status.delivered');\n case 'read':\n return this.translation.translateSync('@acorex:chat.status.read');\n case 'failed':\n return this.translation.translateSync('@acorex:chat.status.failed-to-send');\n default:\n return '';\n }\n }\n\n /** Get first unread message ID */\n readonly firstUnreadMessageId = computed(() => {\n const messages = this.messages();\n const currentUser = this.currentUser();\n if (!currentUser) return null;\n\n // Find first message that is not read and not sent by current user\n const firstUnread = messages.find((m) => m.status !== 'read' && m.senderId !== currentUser.id);\n\n return firstUnread?.id ?? null;\n });\n\n /** Get grouped reactions */\n getGroupedReactions(\n message: AXConversationMessage,\n ): Array<{ emoji: string; count: number; userIds: string[]; hasReacted: boolean }> {\n const user = this.currentUser();\n const grouped = new Map<string, { count: number; userIds: string[]; hasReacted: boolean }>();\n\n message.reactions.forEach((reaction) => {\n if (!grouped.has(reaction.emoji)) {\n grouped.set(reaction.emoji, { count: 0, userIds: [], hasReacted: false });\n }\n const group = grouped.get(reaction.emoji);\n if (group) {\n group.count++;\n group.userIds.push(reaction.userId);\n if (user && reaction.userId === user.id) {\n group.hasReacted = true;\n }\n }\n });\n\n return Array.from(grouped.entries()).map(([emoji, data]) => ({\n emoji,\n ...data,\n }));\n }\n\n /** Get reaction tooltip text */\n getReactionTooltip(reaction: { emoji: string; count: number; userIds: string[]; hasReacted: boolean }): string {\n if (reaction.count === 1) {\n return reaction.userIds[0];\n }\n if (reaction.count <= 3) {\n return reaction.userIds.join(', ');\n }\n return `${reaction.userIds.slice(0, 3).join(', ')} and ${reaction.count - 3} more`;\n }\n\n /** Toggle reaction picker */\n toggleReactionPicker(message: AXConversationMessage, event: MouseEvent): void {\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 const isRtl = isRtlDocument(this.document);\n this.reactionPickerPlacement.set(resolveReactionPickerPlacement(this.isOwnMessage(message), isRtl));\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 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 const messages = this.messages();\n return messages.find((m) => m.id === messageId);\n }\n\n /** Load available reactions from API */\n private async loadAvailableReactions(): Promise<void> {\n try {\n // Fetch reactions from conversation service\n const reactions = await this.conversationService.getAvailableReactions();\n this.availableReactions.set(reactions);\n } catch (error) {\n console.error('Failed to load available reactions:', error);\n }\n }\n\n /** Get message actions from registry */\n getMessageActions(message: AXConversationMessage) {\n return this.messageListService.getMenuActions(message);\n }\n\n /** Handle reaction click */\n onReactionClick(message: AXConversationMessage, emoji: string): void {\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 scroll events */\n onScroll(event: Event): void {\n const element = event.target as HTMLElement;\n const isNearBottom = this.isUserNearBottom(element);\n this.showScrollButton.set(!isNearBottom);\n }\n\n /** Handle infinite scroll threshold */\n async onScrollThreshold(edge: 'top' | 'bottom'): Promise<void> {\n if (edge === 'top' && 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.restoreScrollPositionAfterPrepend(container, {\n anchorMessageId,\n anchorOffsetFromViewportTop,\n fallbackScrollTop,\n fallbackScrollHeight,\n });\n }\n\n /**\n * Keep the user's viewport on the same messages after older rows are inserted above.\n */\n private restoreScrollPositionAfterPrepend(\n container: HTMLElement,\n ctx: {\n anchorMessageId?: string;\n anchorOffsetFromViewportTop: number | null;\n fallbackScrollTop: number;\n fallbackScrollHeight: number;\n },\n ): void {\n const apply = (): 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 container.scrollTop += currentOffset - ctx.anchorOffsetFromViewportTop;\n return;\n }\n }\n\n const heightDifference = container.scrollHeight - ctx.fallbackScrollHeight;\n container.scrollTop = ctx.fallbackScrollTop + heightDifference;\n };\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n apply();\n requestAnimationFrame(() => {\n apply();\n this.restoringScrollAfterPrepend = false;\n });\n });\n });\n }\n\n /** Check if user is near bottom of scroll */\n private isUserNearBottom(element?: HTMLElement): boolean {\n const container = element || this.messagesContainerRef()?.nativeElement;\n if (!container) return false;\n\n const scrollTop = container.scrollTop;\n const scrollHeight = container.scrollHeight;\n const clientHeight = container.clientHeight;\n\n const isNearBottom = scrollHeight - scrollTop - clientHeight < this.config.scrollThreshold;\n return isNearBottom;\n }\n\n /**\n * After switching chats, the template may still show loading (no #messagesContainer).\n * Poll with rAF until the feed exists, then scroll after double rAF so scrollHeight is stable.\n */\n private scrollToBottomWhenContainerReady(): void {\n const maxAttempts = 120;\n let attempts = 0;\n const tick = (): void => {\n const el = this.messagesContainerRef()?.nativeElement;\n if (el) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.scrollToBottom(false);\n });\n });\n return;\n }\n if (++attempts < maxAttempts) {\n requestAnimationFrame(tick);\n }\n };\n requestAnimationFrame(tick);\n }\n\n /** Scroll to bottom */\n scrollToBottom(smooth = true): void {\n const element = this.messagesContainerRef()?.nativeElement;\n if (element) {\n element.scrollTo({\n top: element.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto',\n });\n // Hide button when manually scrolling to bottom\n this.showScrollButton.set(false);\n }\n }\n\n /** Scroll to specific message */\n scrollToMessage(messageId: string): void {\n const messageElement = document.getElementById(`message-${messageId}`);\n if (messageElement) {\n messageElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n // Highlight the message briefly\n messageElement.classList.add('message-highlight');\n const timeout = window.setTimeout(() => {\n messageElement.classList.remove('message-highlight');\n this.timeouts.delete(timeout);\n }, this.config.messageHighlightDuration);\n this.timeouts.add(timeout);\n }\n }\n\n /** Cleanup timeouts and observers on destroy */\n ngOnDestroy(): void {\n // Disconnect intersection observer\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = undefined;\n }\n\n // Clear timeouts\n this.timeouts.forEach((t) => clearTimeout(t));\n this.timeouts.clear();\n }\n\n /** Get message preview text for reply */\n getMessagePreviewText(message: AXConversationMessage): { value: string; type: string; icon: string } {\n return AXConversationMessageUtilsService.getPreviewText(message, 50);\n }\n\n /** Get ARIA label for message */\n getMessageAriaLabel(message: AXConversationMessage): string {\n const sender = this.getSenderName(message);\n const time = message.timestamp.toLocaleTimeString();\n const isOwn = this.isOwnMessage(message);\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 getDateSeparatorAriaLabel(dateLabel: string): string {\n return this.translation.translateSync('@acorex:chat.aria.messages-from-date', {\n params: { date: dateLabel },\n });\n }\n\n /** Get reply count for a message (fetches from API across all conversations) */\n getReplyCount(message: AXConversationMessage): number {\n const counts = this.replyCounts();\n if (!counts.has(message.id)) {\n // Fetch from API asynchronously\n this.conversationService.getReplyCount(message.id).then((count) => {\n const newCounts = new Map(this.replyCounts());\n newCounts.set(message.id, count);\n this.replyCounts.set(newCounts);\n });\n return 0; // Return 0 while loading\n }\n return counts.get(message.id) || 0;\n }\n\n /** Get forward count for a message (fetches from API across all conversations) */\n getForwardCount(message: AXConversationMessage): number {\n const counts = this.forwardCounts();\n if (!counts.has(message.id)) {\n // Fetch from API asynchronously\n this.conversationService.getForwardCount(message.id).then((count) => {\n const newCounts = new Map(this.forwardCounts());\n newCounts.set(message.id, count);\n this.forwardCounts.set(newCounts);\n });\n return 0; // Return 0 while loading\n }\n return counts.get(message.id) || 0;\n }\n\n /**\n * Refresh count for a specific message from API\n * This is called when a new reply or forward is detected globally\n */\n private refreshCount(messageId: string, type: 'reply' | 'forward'): void {\n if (type === 'reply') {\n // Fetch updated reply count from API\n this.conversationService.getReplyCount(messageId).then((count) => {\n const newCounts = new Map(this.replyCounts());\n newCounts.set(messageId, count);\n this.replyCounts.set(newCounts);\n });\n } else {\n // Fetch updated forward count from API\n this.conversationService.getForwardCount(messageId).then((count) => {\n const newCounts = new Map(this.forwardCounts());\n newCounts.set(messageId, count);\n this.forwardCounts.set(newCounts);\n });\n }\n }\n\n 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 toast: this.toast,\n translation: this.translation,\n conversation: this.activeConversation(),\n config: this.config,\n };\n }\n\n /** Handle context menu opening for messages */\n handleMessageContextMenuOpening(event: AXContextMenuOpeningEvent, message: AXConversationMessage): void {\n this.contextMenuMessageId.set(message.id);\n const actions = this.getMessageActions(message);\n const currentUser = this.currentUser();\n\n if (!currentUser) return;\n\n // Convert message actions to context menu items\n const menuItems: AXMenuItem[] = actions.map((action) => ({\n text: 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, // Store original action for later use\n }));\n\n event.items.push(...menuItems);\n }\n\n /** Handle context menu item click for messages */\n handleMessageContextMenuItemClick(event: AXContextMenuItemsClickEvent, message: AXConversationMessage): void {\n this.contextMenuMessageId.set(null);\n const action = event.item.data;\n if (action) {\n // Execute the action using message list service\n this.messageListService.executeAction(message, action.id);\n\n // Emit event for parent component\n this.messageAction.emit({ message, action: action.id });\n }\n }\n\n /**\n * TrackBy function for message groups.\n * Include the latest message id so new messages in the same date group re-render.\n */\n trackMessageGroup(index: number, group: { date: string; messages: AXConversationMessage[] }): string {\n const lastId = group.messages.at(-1)?.id ?? `empty-${index}`;\n return `${group.date}:${lastId}`;\n }\n\n /**\n * TrackBy function for messages\n * Tracks by ID only to prevent unnecessary re-renders\n */\n trackMessage(index: number, message: AXConversationMessage): string {\n return message.id;\n }\n}\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 } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, signal } 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 changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n AXDecoratorModule,\n AXBadgeComponent,\n AXContextMenuComponent,\n AXFormatModule,\n AXDateTimeModule,\n AXTranslationModule,\n AXConversationAvatarComponent,\n ],\n template: `\n <div\n [class]=\"itemClasses()\"\n [id]=\"'conversation-item-' + conversation().id\"\n (click)=\"handleClick()\"\n (keydown.enter)=\"handleClick()\"\n (keydown.space)=\"handleClick()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Conversation with ' + conversation().title\"\n >\n <!-- Avatar -->\n <div class=\"item-avatar\">\n <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 (liveConversation().settings?.notifications === false) {\n <i class=\"fa-light fa-bell-slash mute-icon\"></i>\n }\n @if (liveConversation()?.blocked) {\n <i class=\"fa-ban fa-light block-icon\"></i>\n }\n </span>\n @if (liveConversation().lastMessageAt) {\n <span class=\"item-time\">{{ liveConversation().lastMessageAt | format: 'timeleft' | async }}</span>\n }\n </div>\n\n <div class=\"item-description\">\n @if (liveConversation().status.isTyping) {\n <span class=\"typing-indicator\">{{ typingText() }}</span>\n } @else if (liveConversation().lastMessage) {\n @if (lastMessagePreview(); as preview) {\n <span class=\"last-message\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n @if (preview.type === 'text') {\n {{ preview.value }}\n } @else {\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 styles: [\n `\n :host {\n display: block;\n }\n\n .conversation-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.375rem 0.75rem;\n margin: 0.375rem;\n border-radius: 0.5rem;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .conversation-item:focus-visible,\n .conversation-item:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n outline: none;\n }\n\n .conversation-item-active {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n color: rgb(var(--ax-sys-color-on-primary-lightest-surface));\n }\n\n .conversation-item-active:hover {\n background: rgb(var(--ax-sys-color-primary-lighter-surface));\n }\n\n .conversation-item-context-active {\n background: rgb(var(--ax-sys-color-light-surface));\n box-shadow: inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500), 0.35);\n }\n\n .conversation-item-active.conversation-item-context-active {\n background: rgb(var(--ax-sys-color-primary-lighter-surface));\n box-shadow: inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500), 0.45);\n }\n\n .item-avatar {\n flex-shrink: 0;\n }\n\n .item-content {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n min-width: 0;\n line-height: 1.1rem;\n }\n\n .item-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.25rem;\n }\n\n .item-title {\n display: flex;\n align-items: center;\n font-weight: 600;\n font-size: 0.875rem;\n flex: 1;\n min-width: 0;\n }\n\n .item-title-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n min-width: 0;\n }\n\n .item-time {\n font-variant-numeric: tabular-nums;\n flex-shrink: 0;\n font-size: 0.75rem;\n opacity: 0.7;\n }\n\n .item-description {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.8125rem;\n opacity: 0.7;\n min-width: 0;\n }\n\n .typing-indicator {\n color: rgb(var(--ax-sys-color-primary-500));\n font-style: italic;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .last-message {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .item-badge {\n flex-shrink: 0;\n }\n\n .mute-icon {\n font-size: 0.75rem;\n margin-inline-start: 0.375rem;\n opacity: 0.6;\n color: rgb(var(--ax-sys-color-warning-500));\n }\n .block-icon {\n font-size: 0.75rem;\n margin-inline-start: 0.375rem;\n opacity: 0.6;\n color: rgb(var(--ax-sys-color-danger-500));\n }\n\n .pin-icon {\n font-size: 0.75rem;\n margin-inline-start: 0.375rem;\n opacity: 0.6;\n color: rgb(var(--ax-sys-color-primary-500));\n flex-shrink: 0;\n }\n `,\n ],\n})\nexport class AXConversationItemComponent {\n private readonly conversationService = inject(AXConversationService);\n private readonly infoBarService = inject(AXConversationInfoBarService);\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 return AXConversationMessageUtilsService.getTypingText(this.liveConversation());\n });\n\n /** Last message preview - delegate to utils */\n readonly lastMessagePreview = computed((): { value: string; type: string; icon: string } | null => {\n const lastMessage = this.liveConversation().lastMessage;\n if (!lastMessage) return null;\n return AXConversationMessageUtilsService.getPreviewText(lastMessage);\n });\n\n 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","/**\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 { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\n\n@Injectable()\nexport class AXConversationSidebarService {\n private readonly conversationService = inject(AXConversationService);\n private readonly config = inject(AX_CONVERSATION_CONFIG);\n\n // Access registry through conversation service\n private get registry() {\n return this.conversationService.registry;\n }\n\n // Local UI state\n readonly searchQuery = signal('');\n readonly activeTabId = signal('all');\n 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 // Memoization cache for filtered conversations\n private filterCache = new Map<string, AXConversation[]>();\n\n // Filtered conversations with memoization\n readonly filteredConversations = computed(() => {\n const conversations = this.conversations();\n const query = this.searchQuery();\n const tabId = this.activeTabId();\n\n // Create cache key that includes pinned state, conversation order, and last message timestamps\n const pinnedIds = conversations\n .filter((c) => c.pinned)\n .map((c) => c.id)\n .join(',');\n\n // Include last message timestamps in cache key to detect order changes\n const timestampsHash = conversations\n .map((c) => {\n const time =\n c.lastMessageAt instanceof Date\n ? c.lastMessageAt.getTime()\n : c.lastMessage?.timestamp instanceof Date\n ? c.lastMessage.timestamp.getTime()\n : 0;\n return `${c.id}:${time}`;\n })\n .join('|');\n\n // Unread counts and archive state affect tab badges and list membership\n const unreadHash = conversations.map((c) => `${c.id}:${c.unreadCount ?? 0}`).join('|');\n const archivedHash = conversations.map((c) => `${c.id}:${c.archived ? 1 : 0}`).join('|');\n\n const cacheKey = `${conversations.length}-${query}-${tabId}-${pinnedIds}-${timestampsHash}-${unreadHash}-${archivedHash}`;\n\n // Return cached result if available\n if (this.filterCache.has(cacheKey)) {\n const cached = this.filterCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n }\n\n // Perform filtering and sorting\n const result = this.filterAndSort(conversations, query, tabId);\n\n // Cache the result\n this.filterCache.set(cacheKey, result);\n\n // Cleanup old cache entries if cache is too large (proper LRU cleanup)\n const maxCacheSize = this.config.filterCacheSize;\n if (this.filterCache.size > maxCacheSize) {\n // Delete oldest entries to maintain cache size\n const entriesToDelete = this.filterCache.size - maxCacheSize;\n const keys = Array.from(this.filterCache.keys());\n for (let i = 0; i < entriesToDelete; i++) {\n this.filterCache.delete(keys[i]);\n }\n }\n\n return result;\n });\n\n /**\n * Filter and sort conversations\n */\n private filterAndSort(conversations: AXConversation[], query: string, tabId: string): AXConversation[] {\n let filtered = conversations;\n\n // Apply tab filter\n const activeTab = this.registry.conversationTabs.getTabById(tabId);\n if (activeTab) {\n filtered = activeTab.filter(filtered);\n }\n\n // Apply search filter\n const lowerQuery = query.toLowerCase().trim();\n if (lowerQuery) {\n filtered = filtered.filter((conv) => {\n // Search in title\n if (conv.title.toLowerCase().includes(lowerQuery)) {\n return true;\n }\n // Search in last message text (type-safe)\n if (conv.lastMessage) {\n const messageText = AXConversationMessageUtilsService.getMessageText(conv.lastMessage);\n return messageText.toLowerCase().includes(lowerQuery);\n }\n return false;\n });\n }\n\n // Sort: pinned conversations first, then by last message time (newest first)\n return filtered.slice().sort((a, b) => {\n // Pinned conversations always come first\n if (a.pinned !== b.pinned) return a.pinned ? -1 : 1;\n\n // If both pinned or both not pinned, sort by last message time\n const aTime =\n (a.lastMessageAt instanceof Date ? a.lastMessageAt.getTime() : undefined) ??\n (a.lastMessage?.timestamp instanceof Date ? a.lastMessage.timestamp.getTime() : undefined) ??\n 0;\n const bTime =\n (b.lastMessageAt instanceof Date ? b.lastMessageAt.getTime() : undefined) ??\n (b.lastMessage?.timestamp instanceof Date ? b.lastMessage.timestamp.getTime() : undefined) ??\n 0;\n return bTime - aTime;\n });\n }\n\n setSearchQuery(q: string): void {\n this.searchQuery.set(q);\n }\n\n setActiveTab(tabId: string): void {\n this.activeTabId.set(tabId);\n }\n\n selectConversation(conversation: AXConversation): void {\n this.conversationService.selectConversation(conversation.id);\n }\n\n getBadgeValue(tabId: string): string | undefined {\n const v = this.registry.conversationTabs.getBadge(tabId, this.conversations());\n return v === undefined ? undefined : String(v);\n }\n\n /**\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, AXTabsComponent } from '@acorex/components/tabs';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, OnDestroy, inject, output } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { 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 changeDetection: ChangeDetectionStrategy.OnPush,\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 template: `\n <div class=\"sidebar\">\n <!-- Header with Menu and Search -->\n <div class=\"sidebar-header\">\n <!-- <ax-button [look]=\"'outline'\" [size]=\"'md'\" class=\"menu-button\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button> -->\n <div class=\"sidebar-search\">\n <ax-search-box\n [value]=\"sidebar.searchQuery()\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.placeholders.search-conversations' | translate | async\"\n ></ax-search-box>\n </div>\n </div>\n\n <!-- Tabs -->\n <ax-tabs (onActiveTabChanged)=\"onTabChange($event)\" [look]=\"'with-line'\" [style.overflow]=\"'hidden'\">\n @for (tab of enabledTabs(); track tab.id) {\n <ax-tab-item [text]=\"getTabLabel(tab.id)\" [key]=\"tab.id\">\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 [text]=\"badgeText\" [color]=\"'primary'\" />\n </ax-suffix>\n }\n </ax-tab-item>\n }\n </ax-tabs>\n\n <!-- Conversation List -->\n <div\n class=\"sidebar-list\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold ?? 200\"\n [edge]=\"'bottom'\"\n [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 `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .sidebar {\n display: flex;\n flex-direction: column;\n height: 100%;\n position: relative;\n }\n\n .sidebar-header {\n min-height: 64px;\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.75rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .menu-button {\n flex-shrink: 0;\n }\n\n .sidebar-search {\n flex: 1;\n }\n\n .sidebar-list {\n flex: 1;\n overflow-y: auto;\n position: relative;\n padding-bottom: 4rem;\n }\n\n .new-conversation-button-container {\n position: absolute;\n bottom: 0;\n inset-inline-start: 0;\n inset-inline-end: 0.25rem;\n padding: 1rem 0.5rem;\n }\n\n .new-conversation-button-container-inner {\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .list-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n text-align: center;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .list-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n color: rgb(var(--ax-sys-color-on-surface));\n gap: 1rem;\n }\n\n .empty-icon {\n font-size: 4rem;\n line-height: 1;\n opacity: 0.5;\n margin-bottom: 0.5rem;\n }\n\n .empty-title {\n font-size: 1.25rem;\n font-weight: 600;\n margin: 0;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .empty-description {\n font-size: 0.875rem;\n margin: 0;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.7;\n max-width: 300px;\n line-height: 1.5;\n }\n\n .empty-action {\n margin-top: 0.5rem;\n }\n\n .list-loading-more {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem 1rem;\n text-align: center;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.85;\n }\n\n .load-more-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.3rem;\n min-height: 1.25rem;\n }\n\n .load-more-dot {\n width: 0.4rem;\n height: 0.4rem;\n border-radius: 50%;\n background: rgb(var(--ax-sys-color-primary-500));\n animation: axChatLoadMoreDot 1s ease-in-out infinite;\n }\n\n .load-more-dot:nth-child(2) {\n animation-delay: 0.14s;\n }\n\n .load-more-dot:nth-child(3) {\n animation-delay: 0.28s;\n }\n\n .load-more-label {\n font-size: 0.75rem;\n opacity: 0.72;\n letter-spacing: 0.01em;\n }\n\n .load-more-enter {\n animation: axChatLoadMoreEnterAppend 0.32s cubic-bezier(0.22, 1, 0.36, 1) both;\n }\n\n .load-more-leave {\n animation: axChatLoadMoreLeaveAppend 0.22s ease both;\n }\n\n @keyframes axChatLoadMoreDot {\n 0%,\n 70%,\n 100% {\n transform: translateY(0) scale(1);\n opacity: 0.4;\n }\n\n 35% {\n transform: translateY(-0.28rem) scale(1.08);\n opacity: 1;\n }\n }\n\n @keyframes axChatLoadMoreEnterAppend {\n from {\n opacity: 0;\n transform: translateY(0.5rem);\n }\n\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n @keyframes axChatLoadMoreLeaveAppend {\n from {\n opacity: 1;\n transform: translateY(0);\n }\n\n to {\n opacity: 0;\n transform: translateY(0.35rem);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .load-more-dot {\n animation: none;\n opacity: 0.65;\n }\n\n .load-more-enter,\n .load-more-leave {\n animation: none;\n }\n }\n\n .tab-icon {\n font-size: 1rem;\n }\n\n /* Skeleton Loading Styles */\n .conversation-skeleton {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .skeleton-avatar {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n border-radius: 50%;\n }\n\n .skeleton-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .skeleton-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 0.5rem;\n }\n\n .skeleton-title {\n flex: 1;\n height: 1rem;\n border-radius: 0.25rem;\n }\n\n .skeleton-time {\n font-variant-numeric: tabular-nums;\n width: 3rem;\n height: 0.75rem;\n border-radius: 0.25rem;\n }\n\n .skeleton-message {\n height: 0.75rem;\n width: 80%;\n border-radius: 0.25rem;\n }\n `,\n ],\n})\nexport class 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\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 constructor() {\n // Setup debounced search\n this.searchSubject\n .pipe(debounceTime(this.config.debounceSearch ?? 300), distinctUntilChanged())\n .subscribe((query) => {\n this.sidebar.setSearchQuery(query);\n });\n }\n\n /** Handle search input change with debouncing */\n onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n /** Handle tab change from ax-tabs */\n onTabChange(event: { tab?: { key?: string } }): void {\n if (event.tab?.key) {\n this.sidebar.setActiveTab(event.tab.key);\n }\n }\n\n /** Select a conversation */\n selectConversation(conversation: AXConversation): void {\n this.sidebar.selectConversation(conversation);\n this.conversationSelected.emit(conversation);\n }\n\n /** Get badge value for tab */\n getBadgeValue(tabId: string): string | undefined {\n return this.sidebar.getBadgeValue(tabId);\n }\n\n 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 this.selectConversation(result.data as AXConversation);\n }\n }\n\n /** Handle infinite scroll threshold - delegate to service */\n async onScrollThreshold(edge: 'top' | 'bottom'): Promise<void> {\n await this.sidebar.onScrollThreshold(edge);\n }\n\n /** Cleanup on destroy */\n ngOnDestroy(): void {\n this.searchSubject.complete();\n }\n}\n","/**\n * 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, input, model, output, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'ax-conversation-avatar-picker',\n imports: [CommonModule, FormsModule, AXButtonComponent, AXDecoratorModule, AXImageComponent, AXTranslationModule],\n template: `\n <div class=\"avatar-picker\">\n <!-- Preview -->\n <div class=\"avatar-preview\" (click)=\"triggerFileInput()\">\n @if (avatarUrl()) {\n <ax-image [src]=\"avatarUrl()\" [alt]=\"'@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]=\"avatarUrl() ? ('@acorex:chat.actions.change-image' | translate | async) : ('@acorex:chat.actions.upload-image' | translate | async)\"\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 #fileInput type=\"file\" accept=\"image/*\" style=\"display: none;\" (change)=\"onFileInputChange($event)\" />\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .avatar-picker {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n gap: 1.5rem;\n padding: 1rem;\n border-radius: 0.75rem;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .avatar-preview {\n position: relative;\n width: 100px;\n height: 100px;\n border-radius: 50%;\n overflow: hidden;\n background: rgb(var(--ax-sys-color-lighter-surface));\n border: 3px solid rgb(var(--ax-sys-color-border-light-surface));\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.25s ease;\n flex-shrink: 0;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n .avatar-preview:hover {\n border-color: rgb(var(--ax-sys-color-primary-500));\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n }\n\n .avatar-preview:hover .preview-overlay {\n opacity: 1;\n }\n\n .avatar-preview ax-image {\n width: 100%;\n height: 100%;\n }\n\n .preview-overlay {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.65);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.25s ease;\n color: white;\n font-size: 1.75rem;\n }\n\n .avatar-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.375rem;\n font-size: 2rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n text-align: center;\n padding: 0.5rem;\n }\n\n .placeholder-text {\n font-size: 0.625rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n opacity: 0.8;\n }\n\n .avatar-actions {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n flex: 1;\n }\n\n .avatar-actions ax-button {\n width: 100%;\n }\n `,\n ],\n})\nexport class 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","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 { AXBasePageComponent } from '@acorex/components/page';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n computed,\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 { AXConversationService } from '../../services';\nimport { AXConversationAvatarPickerComponent } from '../shared/avatar-picker.component';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\n\ntype AXConversationNewWizardStep = 'selectUsers' | 'groupDetails';\n\n@Component({\n selector: 'ax-conversation-new-dialog',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FormsModule,\n AXButtonComponent,\n AXListComponent,\n AXSearchBoxComponent,\n AXDecoratorGenericComponent,\n AXConversationAvatarPickerComponent,\n AXConversationAvatarComponent,\n AXTranslationModule,\n ],\n providers: [\n { provide: AXClosableComponent, useExisting: AXConversationNewDialogComponent },\n ],\n template: `\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 <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]=\"52\"\n [ngModel]=\"selectedUserIds()\"\n (ngModelChange)=\"onSelectedUsersChange($event ?? [])\"\n [emptyTemplate]=\"usersListEmptyTpl()\"\n [itemTemplate]=\"userItemTpl\"\n >\n <ax-header class=\"users-list-header\">\n <div class=\"users-list-header-inner\">\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-header>\n </ax-list>\n </div>\n </div>\n }\n\n @if (showGroupDetailsStep()) {\n <div class=\"group-details-step\">\n <div class=\"form-field\">\n <input\n class=\"title-input\"\n [ngModel]=\"groupTitle()\"\n (ngModelChange)=\"groupTitle.set($event ?? '')\"\n [disabled]=\"creating()\"\n [placeholder]=\"'@acorex:chat.placeholders.group-title-required' | translate | async\"\n />\n </div>\n <div class=\"form-field\">\n <ax-conversation-avatar-picker [(avatarUrl)]=\"groupAvatar\"></ax-conversation-avatar-picker>\n </div>\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.back' | translate | async\"\n [look]=\"'solid'\"\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]=\"'@acorex:chat.actions.create' | translate | async\"\n [look]=\"'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 #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 `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .new-conversation-panel {\n display: flex;\n flex-direction: column;\n width: 100%;\n overflow: hidden;\n }\n\n .new-conversation-dialog-content {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .form-field--grow {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .group-details-step {\n flex: 1;\n min-height: 0;\n padding: 0.5rem 0.75rem;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n\n .field-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--ax-text-secondary, #6b7280);\n }\n\n .title-input {\n height: 2.25rem;\n border-radius: 0.5rem;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-lighter-surface));\n padding: 0 0.7rem;\n color: rgb(var(--ax-sys-color-on-surface));\n font: inherit;\n }\n\n .title-input:focus {\n outline: 2px solid rgba(var(--ax-sys-color-primary-500), 0.25);\n outline-offset: 0;\n }\n\n .users-list-wrap {\n height: min(50vh, 36rem);\n overflow: hidden;\n }\n\n .users-list {\n display: block;\n height: 100%;\n }\n\n .users-list-header {\n display: block;\n position: sticky;\n top: 0;\n z-index: 1;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .users-list-header-inner {\n padding: 0.5rem 0.75rem;\n }\n\n .user-item-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n height: 100%;\n padding: 0.5rem 0.75rem;\n min-width: 0;\n }\n\n .user-item-text {\n display: flex;\n flex-direction: column;\n justify-content: center;\n min-width: 0;\n flex: 1;\n gap: 0.125rem;\n }\n\n .user-name-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.875rem;\n line-height: 1.25rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .user-description-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.875rem;\n line-height: 1.25rem;\n font-weight: 400;\n opacity: 0.72;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .users-list-empty {\n padding: 1rem;\n text-align: center;\n font-size: 0.85rem;\n opacity: 0.7;\n }\n `,\n ],\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\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 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.group-details')\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 usersList = viewChild<AXListComponent>('usersList');\n\n readonly usersListDataSource = new AXDataSource<unknown>({\n pageSize: 100,\n key: 'id',\n load: async (e) => {\n if (this.availableUsers().length === 0) {\n const users = await this.conversationService.getUsers();\n this.availableUsers.set(users);\n }\n const filtered = this.filteredUsers() as unknown[];\n return {\n items: filtered.slice(e.skip, e.skip + e.take),\n total: filtered.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 }\n\n onBackFromGroupDetails(): void {\n this.wizardStep.set('selectUsers');\n }\n\n onSearchChange(value: string): void {\n this.searchQuery.set(value ?? '');\n this.usersList()?.refresh(false);\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 filteredUsers(): AXConversationParticipant[] {\n const q = this.searchQuery().toLowerCase().trim();\n if (!q) return this.availableUsers();\n return this.availableUsers().filter((u) => {\n const name = u.name.toLowerCase();\n const desc = (u.description ?? '').toLowerCase();\n return name.includes(q) || desc.includes(q);\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 };\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","/**\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/**\n * Conversation status information\n */\nexport interface AXConversationStatus {\n /** Whether someone is typing */\n isTyping: boolean;\n\n /** User IDs currently typing */\n typingUsers: string[];\n\n /** Online presence (for private chats) */\n presence?: 'online' | 'offline' | 'away';\n\n /** Last seen timestamp (for private chats when offline) */\n lastSeen?: Date;\n}\n\n/**\n * Conversation settings\n */\nexport interface AXConversationSettings {\n /** Muted until timestamp */\n mutedUntil?: Date;\n\n /** Show notifications */\n notifications: boolean;\n\n /** Custom notification sound */\n notificationSound?: string;\n\n /** Show message preview in notifications */\n showPreview: boolean;\n\n /** Custom settings */\n custom?: Record<string, unknown>;\n}\n\n/**\n * 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 */\n messageListBackground?: string;\n\n /** Optional custom empty-state component for the message list. */\n messageListEmptyComponent?: Type<AXConversationMessageListEmptyComponent>;\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 /** Current status (typing, presence, etc.) */\n status: AXConversationStatus;\n\n /** User-specific settings */\n settings: AXConversationSettings;\n\n /** Pinned messages IDs */\n pinnedMessageIds?: string[];\n\n /** Conversation creation timestamp */\n createdAt: Date;\n\n /** Last update timestamp */\n updatedAt: Date;\n\n /** Whether conversation is blocked */\n blocked?: boolean;\n\n /** Whether conversation is pinned */\n pinned?: boolean;\n\n /** Whether conversation is archived */\n archived?: boolean;\n\n /** Draft message text */\n draft?: string;\n\n /** Custom metadata */\n metadata?: AXConversationMetadata;\n}\n\n/**\n * Typing indicator\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\n/**\n * Presence update\n */\nexport interface AXConversationPresenceUpdate {\n /** User ID */\n userId: string;\n\n /** Presence status */\n status: 'online' | 'offline' | 'away';\n\n /** Last seen timestamp */\n lastSeen?: Date;\n\n /** Custom status text */\n statusText?: string;\n}\n\n/**\n * Conversation filter options\n */\nexport interface AXConversationFilter {\n /** Filter by type */\n type?: AXConversationType;\n\n /** Filter by unread */\n unread?: boolean;\n\n /** Filter by archived */\n archived?: boolean;\n\n /** Search query */\n searchQuery?: string;\n\n /** Filter by tags */\n tags?: string[];\n\n /** Custom filters */\n custom?: Record<string, unknown>;\n}\n\n/**\n * Conversation sort options\n */\nexport interface AXConversationSort {\n /** Sort field */\n field: 'lastMessageAt' | 'title' | 'unreadCount' | 'createdAt';\n\n /** Sort direction */\n direction: 'asc' | 'desc';\n}\n","/**\n * Message Payload Types\n */\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}\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 /** 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 * Represents a user/member in a conversation\n */\n\nexport type AXConversationParticipantRole = 'admin' | 'moderator' | 'member';\nexport type AXConversationParticipantStatus = 'online' | 'offline' | 'away';\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\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 /** Current online status */\n status?: AXConversationParticipantStatus;\n\n /** Last seen timestamp (when offline/away) */\n lastSeen?: Date;\n\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n","/**\n * IndexedDB Storage Wrapper\n * Provides persistent storage for conversation data\n */\n\nimport type { AXConversation, AXConversationMessage, AXConversationParticipant } from '../../models';\n\nconst DB_NAME = 'acorex-conversation-db';\nconst DB_VERSION = 2;\n\n// Store names\nexport const AXConversationIndexedDbStores = {\n PARTICIPANTS: 'participants',\n CONVERSATIONS: 'conversations',\n MESSAGES: 'messages',\n MEDIA: 'media',\n SETTINGS: 'settings',\n} as const;\n\n/** Blob stored for demo multimedia uploads */\nexport interface AXConversationIndexedDbMediaRecord {\n id: string;\n conversationId: string;\n mimeType: string;\n size: number;\n fileName?: string;\n blob: Blob;\n createdAt: string;\n}\n\nexport class AXConversationIndexedDbStorage {\n private db: IDBDatabase | null = null;\n private initPromise: Promise<void> | null = null;\n\n /**\n * Initialize IndexedDB\n */\n async init(): Promise<void> {\n if (this.db) return;\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => {\n this.db = request.result;\n resolve();\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n\n // Create object stores if they don't exist\n if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.PARTICIPANTS)) {\n db.createObjectStore(AXConversationIndexedDbStores.PARTICIPANTS, { keyPath: 'id' });\n }\n if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.CONVERSATIONS)) {\n const convStore = db.createObjectStore(AXConversationIndexedDbStores.CONVERSATIONS, { keyPath: 'id' });\n convStore.createIndex('lastMessageAt', 'lastMessageAt', { unique: false });\n }\n if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.MESSAGES)) {\n const msgStore = db.createObjectStore(AXConversationIndexedDbStores.MESSAGES, { keyPath: 'id' });\n msgStore.createIndex('conversationId', 'conversationId', { unique: false });\n msgStore.createIndex('timestamp', 'timestamp', { unique: false });\n }\n if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.SETTINGS)) {\n db.createObjectStore(AXConversationIndexedDbStores.SETTINGS, { keyPath: 'key' });\n }\n if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.MEDIA)) {\n db.createObjectStore(AXConversationIndexedDbStores.MEDIA, { keyPath: 'id' });\n }\n };\n });\n\n return this.initPromise;\n }\n\n /**\n * Get a value from a store\n */\n async get<T>(storeName: string, key: string): Promise<T | undefined> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.get(key);\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Get all values from a store\n */\n async getAll<T>(storeName: string): Promise<T[]> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.getAll();\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Get values by index\n */\n async getAllByIndex<T>(storeName: string, indexName: string, query: IDBValidKey): Promise<T[]> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const index = store.index(indexName);\n const request = index.getAll(query);\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Put a value into a store\n */\n async put<T>(storeName: string, value: T): Promise<void> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.put(value);\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Delete a value from a store\n */\n async delete(storeName: string, key: string): Promise<void> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.delete(key);\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Clear all data from a store\n */\n async clear(storeName: string): Promise<void> {\n await this.init();\n if (!this.db) throw new Error('Database not initialized');\n const db = this.db;\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.clear();\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n // =====================\n // Convenience Methods\n // =====================\n\n async getParticipant(id: string): Promise<AXConversationParticipant | undefined> {\n return this.get<AXConversationParticipant>(AXConversationIndexedDbStores.PARTICIPANTS, id);\n }\n\n async getAllParticipants(): Promise<AXConversationParticipant[]> {\n return this.getAll<AXConversationParticipant>(AXConversationIndexedDbStores.PARTICIPANTS);\n }\n\n async putParticipant(participant: AXConversationParticipant): Promise<void> {\n return this.put(AXConversationIndexedDbStores.PARTICIPANTS, participant);\n }\n\n async getConversation(id: string): Promise<AXConversation | undefined> {\n return this.get<AXConversation>(AXConversationIndexedDbStores.CONVERSATIONS, id);\n }\n\n async getAllConversations(): Promise<AXConversation[]> {\n return this.getAll<AXConversation>(AXConversationIndexedDbStores.CONVERSATIONS);\n }\n\n async putConversation(conversation: AXConversation): Promise<void> {\n return this.put(AXConversationIndexedDbStores.CONVERSATIONS, conversation);\n }\n\n async deleteConversation(id: string): Promise<void> {\n return this.delete(AXConversationIndexedDbStores.CONVERSATIONS, id);\n }\n\n async getMessage(id: string): Promise<AXConversationMessage | undefined> {\n return this.get<AXConversationMessage>(AXConversationIndexedDbStores.MESSAGES, id);\n }\n\n async getAllMessages(): Promise<AXConversationMessage[]> {\n return this.getAll<AXConversationMessage>(AXConversationIndexedDbStores.MESSAGES);\n }\n\n async getMessagesByConversation(conversationId: string): Promise<AXConversationMessage[]> {\n return this.getAllByIndex<AXConversationMessage>(AXConversationIndexedDbStores.MESSAGES, 'conversationId', conversationId);\n }\n\n async putMessage(message: AXConversationMessage): Promise<void> {\n return this.put(AXConversationIndexedDbStores.MESSAGES, message);\n }\n\n async deleteMessage(id: string): Promise<void> {\n return this.delete(AXConversationIndexedDbStores.MESSAGES, id);\n }\n\n async getSetting(key: string): Promise<unknown> {\n const result = await this.get<{ key: string; value: unknown }>(AXConversationIndexedDbStores.SETTINGS, key);\n return result?.value;\n }\n\n async putSetting(key: string, value: unknown): Promise<void> {\n return this.put(AXConversationIndexedDbStores.SETTINGS, { key, value });\n }\n\n async getMedia(id: string): Promise<AXConversationIndexedDbMediaRecord | undefined> {\n return this.get<AXConversationIndexedDbMediaRecord>(AXConversationIndexedDbStores.MEDIA, id);\n }\n\n async putMedia(record: AXConversationIndexedDbMediaRecord): Promise<void> {\n return this.put(AXConversationIndexedDbStores.MEDIA, record);\n }\n\n async deleteMedia(id: string): Promise<void> {\n return this.delete(AXConversationIndexedDbStores.MEDIA, id);\n }\n}\n\n// Export singleton instance\nexport const axConversationIndexedDbStorage = new AXConversationIndexedDbStorage();\n","/**\n * Shared read/write helpers for IndexedDB chat storage (in-memory + persistence).\n */\n\nimport type { AXConversation, AXConversationMessage } from '../../models';\nimport type { AXConversationFilters } from '../../services/api';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\nimport { axConversationSharedStorage } from './shared-storage';\n\nexport function getConversationLastActivity(conv: AXConversation): number {\n return (\n (conv.lastMessageAt instanceof Date ? conv.lastMessageAt.getTime() : 0) ||\n (conv.lastMessage?.timestamp instanceof Date ? conv.lastMessage.timestamp.getTime() : 0) ||\n (conv.updatedAt instanceof Date ? conv.updatedAt.getTime() : 0) ||\n 0\n );\n}\n\n/** Messages for a conversation, newest first (API / pagination order). */\nexport function getConversationMessagesNewestFirst(conversationId: string): AXConversationMessage[] {\n const messageIds = axConversationSharedStorage.messagesByConversation.get(conversationId) || [];\n return messageIds\n .map((id) => axConversationSharedStorage.messages.get(id))\n .filter((m): m is AXConversationMessage => m !== undefined)\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n}\n\n/** Keep per-conversation id list sorted ascending by timestamp (store order). */\nexport function sortConversationMessageIds(conversationId: string): void {\n const messageIds = axConversationSharedStorage.messagesByConversation.get(conversationId) || [];\n const sorted = [...messageIds].sort((a, b) => {\n const msgA = axConversationSharedStorage.messages.get(a);\n const msgB = axConversationSharedStorage.messages.get(b);\n if (!msgA || !msgB) {\n return 0;\n }\n return msgA.timestamp.getTime() - msgB.timestamp.getTime();\n });\n axConversationSharedStorage.messagesByConversation.set(conversationId, sorted);\n}\n\n/** Register a message in maps and keep the conversation index sorted. */\nexport function registerChatMessage(message: AXConversationMessage): void {\n axConversationSharedStorage.messages.set(message.id, message);\n const ids = axConversationSharedStorage.messagesByConversation.get(message.conversationId) || [];\n if (!ids.includes(message.id)) {\n ids.push(message.id);\n axConversationSharedStorage.messagesByConversation.set(message.conversationId, ids);\n sortConversationMessageIds(message.conversationId);\n }\n}\n\n/** Remove a message from conversation index and global map. */\nexport function unregisterChatMessage(messageId: string, conversationId: string): void {\n axConversationSharedStorage.messages.delete(messageId);\n const ids = axConversationSharedStorage.messagesByConversation.get(conversationId) || [];\n axConversationSharedStorage.messagesByConversation.set(\n conversationId,\n ids.filter((id) => id !== messageId),\n );\n}\n\nexport function applyConversationFilters(\n conversations: AXConversation[],\n filters?: AXConversationFilters,\n): AXConversation[] {\n if (!filters) {\n return conversations;\n }\n\n let result = conversations;\n\n if (filters.type) {\n result = result.filter((c) => c.type === filters.type);\n }\n if (filters.archived !== undefined) {\n result = result.filter((c) => !!c.archived === filters.archived);\n }\n if (filters.unread) {\n result = result.filter((c) => (c.unreadCount ?? 0) > 0);\n }\n if (filters.pinned !== undefined) {\n result = result.filter((c) => !!c.pinned === filters.pinned);\n }\n if (filters.searchQuery?.trim()) {\n const q = filters.searchQuery.toLowerCase().trim();\n result = result.filter((c) => {\n if (c.title.toLowerCase().includes(q)) {\n return true;\n }\n if (c.lastMessage) {\n return AXConversationMessageUtilsService.getMessageText(c.lastMessage).toLowerCase().includes(q);\n }\n return c.participants.some((p) => p.name.toLowerCase().includes(q));\n });\n }\n if (filters.tags?.length) {\n result = result.filter((c) => {\n const tags = (c.metadata?.['profile'] as { tags?: string[] } | undefined)?.tags ?? [];\n return filters.tags!.some((tag) => tags.includes(tag));\n });\n }\n\n return result;\n}\n\n/** Sidebar list order: pinned first, then by last activity (newest first). */\nexport function getSortedConversationsForInbox(filters?: AXConversationFilters): AXConversation[] {\n const filtered = applyConversationFilters(\n Array.from(axConversationSharedStorage.conversations.values()),\n filters,\n );\n\n return filtered.sort((a, b) => {\n if (a.pinned !== b.pinned) {\n return a.pinned ? -1 : 1;\n }\n return getConversationLastActivity(b) - getConversationLastActivity(a);\n });\n}\n\n/** Sort all loaded conversation message indexes (after IndexedDB hydration). */\nexport function normalizeAllConversationMessageIndexes(): void {\n for (const conversationId of axConversationSharedStorage.messagesByConversation.keys()) {\n sortConversationMessageIds(conversationId);\n }\n}\n","/**\n * Shared In-Memory Storage\n * Internal storage shared between all IndexedDB API implementations\n * This is NOT a service - just a shared data structure\n */\n\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport type {\n AXConversation,\n AXConversationType,\n AXConversationMessage,\n AXConversationParticipant,\n AXConversationPresenceUpdate,\n AXConversationTypingIndicator,\n} from '../../models';\nimport type { AXConversationConnectionStatus } from '../../services/api';\nimport { normalizeAllConversationMessageIndexes, registerChatMessage } from './chat-storage.helpers';\nimport { axConversationIndexedDbStorage } from './indexeddb-storage';\n\n// Shared storage instance\nexport class AXConversationSharedStorage {\n // Connection status\n readonly connectionStatus$ = new BehaviorSubject<AXConversationConnectionStatus>('disconnected');\n\n // Data storage\n readonly participants = new Map<string, AXConversationParticipant>();\n readonly conversations = new Map<string, AXConversation>();\n readonly messages = new Map<string, AXConversationMessage>();\n readonly messagesByConversation = new Map<string, string[]>();\n\n // Event streams\n readonly messageStream$ = new Subject<AXConversationMessage>();\n readonly messageUpdates$ = new Subject<AXConversationMessage>();\n readonly messageDeletions$ = new Subject<string>();\n readonly typingIndicators$ = new Subject<AXConversationTypingIndicator>();\n readonly presenceUpdates$ = new Subject<AXConversationPresenceUpdate>();\n readonly conversationUpdates$ = new Subject<AXConversation>();\n\n readonly currentUserId = 'current-user';\n private isSeeded = false;\n private presenceInterval?: any;\n private messageSimulationInterval?: any;\n private isLoadedFromDB = false;\n\n /**\n * Load data from IndexedDB\n */\n async loadFromIndexedDB(): Promise<void> {\n if (this.isLoadedFromDB) return;\n\n try {\n console.log('📂 Loading data from IndexedDB...');\n\n // Load participants\n const participants = await axConversationIndexedDbStorage.getAllParticipants();\n participants.forEach((p) => this.participants.set(p.id, p));\n\n // Load conversations\n const conversations = await axConversationIndexedDbStorage.getAllConversations();\n conversations.forEach((c) => this.conversations.set(c.id, c));\n\n // Load messages\n const messages = await axConversationIndexedDbStorage.getAllMessages();\n messages.forEach((m) => {\n this.messages.set(m.id, m);\n const convMessages = this.messagesByConversation.get(m.conversationId) || [];\n if (!convMessages.includes(m.id)) {\n convMessages.push(m.id);\n this.messagesByConversation.set(m.conversationId, convMessages);\n }\n });\n\n normalizeAllConversationMessageIndexes();\n\n // Check if we loaded the seeded flag\n const seededFlag = await axConversationIndexedDbStorage.getSetting('isSeeded');\n this.isSeeded = seededFlag === true;\n\n this.isLoadedFromDB = true;\n console.log('✅ Loaded from IndexedDB:', {\n participants: participants.length,\n conversations: conversations.length,\n messages: messages.length,\n isSeeded: this.isSeeded,\n });\n } catch (error) {\n console.error('❌ Error loading from IndexedDB:', error);\n }\n }\n\n /**\n * Seed initial data if not already seeded\n */\n async seedIfEmpty(): Promise<void> {\n // First, try to load from IndexedDB\n await this.loadFromIndexedDB();\n\n if (this.isSeeded || this.participants.size > 0) {\n console.log('✅ Data already exists, skipping seed');\n const { ensurePaginationDemoData } = await import('./pagination-demo-data');\n await ensurePaginationDemoData();\n if (this.participants.size > 0) {\n this.startPresenceSimulation();\n }\n return;\n }\n const { seedSharedStorageInitialData } = await import('./shared-storage.seed');\n await seedSharedStorageInitialData(this);\n }\n\n /** @internal Used by demo seed module */\n markSeeded(): void {\n this.isSeeded = true;\n }\n\n /** @internal Starts demo presence and message simulations */\n startDemoSimulations(): void {\n this.startPresenceSimulation();\n this.startMessageSimulation();\n }\n\n /**\n * Simulate user presence changes (online/offline/away)\n */\n private startPresenceSimulation(): void {\n // Change user status every 20-40 seconds\n const scheduleNextPresenceChange = () => {\n const delay = 20000 + Math.random() * 20000; // 20-40 seconds\n setTimeout(() => {\n const users = Array.from(this.participants.values()).filter((u) => u.id !== this.currentUserId);\n const randomUser = users[Math.floor(Math.random() * users.length)];\n\n if (randomUser) {\n const statuses: ('online' | 'offline' | 'away')[] = ['online', 'offline', 'away'];\n const newStatus = statuses[Math.floor(Math.random() * statuses.length)];\n\n randomUser.status = newStatus;\n randomUser.lastSeen = newStatus === 'online' ? new Date() : randomUser.lastSeen;\n this.participants.set(randomUser.id, randomUser);\n\n // Emit presence update\n this.presenceUpdates$.next({\n userId: randomUser.id,\n status: newStatus,\n lastSeen: randomUser.lastSeen,\n });\n\n console.log(`👤 ${randomUser.name} is now ${newStatus}`);\n }\n\n scheduleNextPresenceChange();\n }, delay);\n };\n\n scheduleNextPresenceChange();\n }\n\n /**\n * Simulate random messages from users\n */\n private startMessageSimulation(): void {\n // Contextual message templates based on conversation type\n const getMessageTemplate = (convType: AXConversationType): string => {\n const privateMessages = [\n 'Hey! How are you doing today?',\n 'Did you see my last message?',\n 'Can we schedule a quick call?',\n 'Thanks for getting back to me!',\n 'I have a question about the project',\n \"Let me know when you're available\",\n 'That makes sense, thanks!',\n 'Looking forward to catching up',\n 'Could you review this when you get a chance?',\n \"Perfect! Let's do it\",\n \"I'll send you the details shortly\",\n 'Sounds good to me',\n 'What do you think about this?',\n 'I completely agree',\n 'Need your help with something',\n 'Just wanted to check in',\n 'Awesome work! 🎉',\n 'Let me get back to you on that',\n \"I'm looking into it now\",\n 'Should have an update soon',\n 'Coffee later? ☕',\n 'Have a great day!',\n 'See you tomorrow!',\n 'Thanks again for your help',\n ];\n\n const groupMessages = [\n 'Morning everyone! ☀️',\n 'Quick update on the project status',\n 'Can we schedule a team meeting?',\n 'Great work team! 🎉',\n 'I have some questions about the requirements',\n \"Who's available for a sync?\",\n 'Thanks for the update!',\n 'Looking forward to the demo',\n 'Could someone review the PR?',\n \"Let's discuss this in the meeting\",\n \"I'll share the docs in a moment\",\n \"That's a solid approach\",\n 'What does everyone think?',\n 'Agreed with the direction',\n 'Need input from the team',\n 'Status update: on track ✅',\n 'Fantastic progress everyone!',\n \"I'll follow up on this\",\n 'Working on it as we speak',\n 'ETA: end of day',\n 'Anyone free for a quick huddle?',\n 'Pushing the changes now',\n 'Tests are passing! ✨',\n 'Ready for review',\n 'Deployed to staging 🚀',\n ];\n\n const channelMessages = [\n '📢 Important announcement for everyone',\n '🎯 New feature released!',\n '📊 Weekly metrics are looking great',\n '🔔 Reminder: Team standup in 10 minutes',\n '✨ Check out the latest updates',\n '🚀 Deployment completed successfully',\n '📝 New documentation available',\n '🎉 Milestone achieved!',\n '⚠️ Scheduled maintenance tonight',\n '💡 Pro tip: Use the new shortcuts',\n '📢 All hands meeting tomorrow',\n '🔥 Hot fix deployed',\n '📈 Performance improvements live',\n '🎊 Celebrating our success!',\n \"📣 Don't miss the upcoming event\",\n '🌟 Featured project of the week',\n '🔧 System update in progress',\n '📌 Pinned: Important resources',\n '🎁 New benefits announced',\n '🏆 Team recognition time!',\n '📅 Mark your calendars',\n '💪 Keep up the great work!',\n '🔐 Security update required',\n '🎨 New design system released',\n '📱 Mobile app update available',\n ];\n\n if (convType === 'channel') {\n return channelMessages[Math.floor(Math.random() * channelMessages.length)];\n } else if (convType === 'group') {\n return groupMessages[Math.floor(Math.random() * groupMessages.length)];\n } else {\n return privateMessages[Math.floor(Math.random() * privateMessages.length)];\n }\n };\n\n // Send random message every 30-90 seconds\n const scheduleNextMessage = () => {\n const delay = 30000 + Math.random() * 60000; // 30-90 seconds\n setTimeout(async () => {\n const conversations = Array.from(this.conversations.values());\n const randomConv = conversations[Math.floor(Math.random() * conversations.length)];\n\n if (randomConv) {\n // Get online users from this conversation (excluding current user)\n const onlineUsers = randomConv.participants\n .filter((p) => p.id !== this.currentUserId && this.participants.get(p.id)?.status === 'online')\n .map((p) => p.id);\n\n if (onlineUsers.length > 0) {\n const randomSender = onlineUsers[Math.floor(Math.random() * onlineUsers.length)];\n const messageText = getMessageTemplate(randomConv.type);\n\n // Show typing indicator first\n this.typingIndicators$.next({\n conversationId: randomConv.id,\n userId: randomSender,\n userName: this.participants.get(randomSender)?.name,\n timestamp: new Date(),\n });\n\n // Wait 2-4 seconds (typing simulation)\n setTimeout(\n async () => {\n // Stop typing (emit with old timestamp to clear)\n this.typingIndicators$.next({\n conversationId: randomConv.id,\n userId: randomSender,\n userName: this.participants.get(randomSender)?.name,\n timestamp: new Date(Date.now() - 10000), // Old timestamp to clear\n });\n\n // Create message\n const newMessage: AXConversationMessage = {\n id: `msg-sim-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n conversationId: randomConv.id,\n senderId: randomSender,\n type: 'text',\n timestamp: new Date(),\n payload: { type: 'text', text: messageText },\n status: 'sent',\n reactions: [],\n metadata: {},\n };\n\n registerChatMessage(newMessage);\n await axConversationIndexedDbStorage.putMessage(newMessage);\n\n // Update conversation\n randomConv.lastMessage = newMessage;\n randomConv.lastMessageAt = newMessage.timestamp;\n randomConv.unreadCount = (randomConv.unreadCount || 0) + 1;\n this.conversations.set(randomConv.id, randomConv);\n await axConversationIndexedDbStorage.putConversation(randomConv);\n\n // Emit message\n this.messageStream$.next(newMessage);\n this.conversationUpdates$.next(randomConv);\n\n const senderName = this.participants.get(randomSender)?.name || 'User';\n console.log(`💬 ${senderName} sent: \"${messageText}\" in ${randomConv.title}`);\n },\n 2000 + Math.random() * 2000,\n );\n }\n }\n\n scheduleNextMessage();\n }, delay);\n };\n\n // Start after 10 seconds\n setTimeout(() => scheduleNextMessage(), 10000);\n }\n\n /**\n * Stop presence simulation\n */\n stopPresenceSimulation(): void {\n if (this.presenceInterval) {\n clearInterval(this.presenceInterval);\n this.presenceInterval = undefined;\n }\n }\n\n /**\n * Stop message simulation\n */\n stopMessageSimulation(): void {\n if (this.messageSimulationInterval) {\n clearInterval(this.messageSimulationInterval);\n this.messageSimulationInterval = undefined;\n }\n }\n}\n\n// Export singleton instance\nexport const axConversationSharedStorage = new AXConversationSharedStorage();\n","/**\n * Extra seed data so sidebar and message-list pagination can be exercised in the demo.\n */\n\nimport type { AXConversation, AXConversationMessage } from '../../models';\nimport { registerChatMessage } from './chat-storage.helpers';\nimport { axConversationIndexedDbStorage } from './indexeddb-storage';\nimport { axConversationSharedStorage } from './shared-storage';\n\nconst AX_CONVERSATION_MIN_CONVERSATIONS_FOR_PAGINATION = 200;\nconst AX_CONVERSATION_MIN_MESSAGES_CONV_1 = 500;\n\n/**\n * Append demo chats/messages when the DB is too small for default page sizes (30 / 50).\n */\nexport async function ensurePaginationDemoData(): Promise<void> {\n const conversationCount = axConversationSharedStorage.conversations.size;\n const conv1Messages = axConversationSharedStorage.messagesByConversation.get('conv-1')?.length ?? 0;\n\n if (conversationCount >= AX_CONVERSATION_MIN_CONVERSATIONS_FOR_PAGINATION && conv1Messages >= AX_CONVERSATION_MIN_MESSAGES_CONV_1) {\n return;\n }\n\n const participants = Array.from(axConversationSharedStorage.participants.values());\n const currentUser = axConversationSharedStorage.participants.get(axConversationSharedStorage.currentUserId);\n if (!currentUser || participants.length < 2) {\n return;\n }\n\n const now = Date.now();\n\n if (conversationCount < AX_CONVERSATION_MIN_CONVERSATIONS_FOR_PAGINATION) {\n const toCreate = AX_CONVERSATION_MIN_CONVERSATIONS_FOR_PAGINATION - conversationCount;\n for (let i = 0; i < toCreate; i++) {\n const peer = participants[(i % (participants.length - 1)) + 1];\n const conversation: AXConversation = {\n id: `conv-pag-${i}`,\n type: 'private',\n title: `Demo Chat ${i + 1} — ${peer.name}`,\n participants: [currentUser, { ...peer, role: 'member' }],\n lastMessageAt: new Date(now - i * 60_000),\n unreadCount: 0,\n pinned: i === 0,\n status: { isTyping: false, typingUsers: [] },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: { profile: { tags: ['demo', 'pagination'] } },\n createdAt: new Date(now - i * 86_400_000),\n updatedAt: new Date(now - i * 60_000),\n };\n axConversationSharedStorage.conversations.set(conversation.id, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n }\n }\n\n if (conv1Messages < AX_CONVERSATION_MIN_MESSAGES_CONV_1) {\n const existing = conv1Messages;\n const toCreate = AX_CONVERSATION_MIN_MESSAGES_CONV_1 - existing;\n let lastMessage: AXConversationMessage | undefined;\n\n for (let i = 0; i < toCreate; i++) {\n const isOwn = i % 2 === 0;\n const message: AXConversationMessage = {\n id: `msg-1-pag-${existing + i}`,\n conversationId: 'conv-1',\n senderId: isOwn ? 'current-user' : 'user-2',\n type: 'text',\n timestamp: new Date(now - (existing + i + 1) * 45_000),\n payload: {\n type: 'text',\n text: `Pagination demo message #${existing + i + 1} — scroll up to load older history.`,\n },\n status: 'read',\n reactions: [],\n metadata: {},\n };\n registerChatMessage(message);\n await axConversationIndexedDbStorage.putMessage(message);\n lastMessage = message;\n }\n\n const conv = axConversationSharedStorage.conversations.get('conv-1');\n if (conv && lastMessage) {\n conv.lastMessage = lastMessage;\n conv.lastMessageAt = lastMessage.timestamp;\n axConversationSharedStorage.conversations.set(conv.id, conv);\n await axConversationIndexedDbStorage.putConversation(conv);\n }\n }\n}\n","/**\n * Demo seed data for IndexedDB conversation APIs.\n * Dynamically imported to keep custom API consumers lean.\n */\nimport type { AXConversation, AXConversationType, AXConversationMessage, AXConversationParticipant } from '../../models';\nimport { registerChatMessage } from './chat-storage.helpers';\nimport { axConversationIndexedDbStorage } from './indexeddb-storage';\nimport { ensurePaginationDemoData } from './pagination-demo-data';\nimport type { AXConversationSharedStorage } from './shared-storage';\n\nexport async function seedSharedStorageInitialData(storage: AXConversationSharedStorage): Promise<void> {\n console.log('🌱 Seeding initial data...');\n\n // Create participants (15 users for realistic data) with profile information\n const participants: AXConversationParticipant[] = [\n {\n id: 'current-user',\n name: 'You',\n description: 'Senior Developer',\n avatar: 'https://i.pravatar.cc/150?img=1',\n status: 'online',\n lastSeen: new Date(),\n profile: {\n bio: 'Software developer passionate about creating amazing user experiences',\n email: 'you@example.com',\n phone: '+1 (555) 123-4567',\n location: 'San Francisco, CA',\n company: 'Tech Corp',\n title: 'Senior Developer',\n },\n },\n {\n id: 'user-2',\n name: 'Alice Johnson',\n description: 'Lead Designer',\n avatar: 'https://i.pravatar.cc/150?img=5',\n status: 'online',\n lastSeen: new Date(),\n profile: {\n bio: 'Product designer with a love for minimalist aesthetics',\n email: 'alice.johnson@example.com',\n phone: '+1 (555) 234-5678',\n location: 'New York, NY',\n company: 'Design Studio',\n title: 'Lead Designer',\n },\n },\n {\n id: 'user-3',\n name: 'Bob Smith',\n description: 'Tech Lead',\n avatar: 'https://i.pravatar.cc/150?img=12',\n status: 'away',\n lastSeen: new Date(Date.now() - 300000),\n profile: {\n bio: 'Full-stack developer and open source enthusiast',\n email: 'bob.smith@example.com',\n phone: '+1 (555) 345-6789',\n location: 'Austin, TX',\n company: 'Startup Inc',\n title: 'Tech Lead',\n },\n },\n {\n id: 'user-4',\n name: 'Carol Williams',\n description: 'Marketing Manager',\n avatar: 'https://i.pravatar.cc/150?img=20',\n status: 'offline',\n lastSeen: new Date(Date.now() - 3600000),\n profile: {\n bio: 'Marketing specialist focused on digital strategies',\n email: 'carol.williams@example.com',\n phone: '+1 (555) 456-7890',\n location: 'Los Angeles, CA',\n company: 'Marketing Pro',\n title: 'Marketing Manager',\n },\n },\n {\n id: 'user-5',\n name: 'David Brown',\n description: 'DevOps Lead',\n avatar: 'https://i.pravatar.cc/150?img=13',\n status: 'online',\n lastSeen: new Date(),\n profile: {\n bio: 'DevOps engineer passionate about automation',\n email: 'david.brown@example.com',\n phone: '+1 (555) 567-8901',\n location: 'Seattle, WA',\n company: 'Cloud Systems',\n title: 'DevOps Lead',\n },\n },\n {\n id: 'user-6',\n name: 'Emma Davis',\n description: 'UX Researcher',\n avatar: 'https://i.pravatar.cc/150?img=24',\n status: 'offline',\n lastSeen: new Date(Date.now() - 7200000),\n profile: {\n bio: 'UX researcher exploring human behavior',\n email: 'emma.davis@example.com',\n phone: '+1 (555) 678-9012',\n location: 'Boston, MA',\n company: 'Research Lab',\n title: 'UX Researcher',\n },\n },\n {\n id: 'user-7',\n name: 'Frank Miller',\n description: 'Data Scientist',\n avatar: 'https://i.pravatar.cc/150?img=33',\n status: 'online',\n lastSeen: new Date(),\n profile: {\n bio: 'Data scientist turning data into insights',\n email: 'frank.miller@example.com',\n phone: '+1 (555) 789-0123',\n location: 'Chicago, IL',\n company: 'Data Corp',\n title: 'Data Scientist',\n },\n },\n {\n id: 'user-8',\n name: 'Grace Wilson',\n description: 'Mobile Developer',\n avatar: 'https://i.pravatar.cc/150?img=44',\n status: 'away',\n lastSeen: new Date(Date.now() - 600000),\n profile: {\n bio: 'Mobile app developer for iOS and Android',\n email: 'grace.wilson@example.com',\n phone: '+1 (555) 890-1234',\n location: 'Miami, FL',\n company: 'Mobile Solutions',\n title: 'Mobile Developer',\n },\n },\n {\n id: 'user-9',\n name: 'Henry Moore',\n description: 'Security Engineer',\n avatar: 'https://i.pravatar.cc/150?img=52',\n status: 'online',\n lastSeen: new Date(),\n profile: {\n bio: 'Security engineer protecting digital assets',\n email: 'henry.moore@example.com',\n phone: '+1 (555) 901-2345',\n location: 'Denver, CO',\n company: 'SecureNet',\n title: 'Security Engineer',\n },\n },\n {\n id: 'user-10',\n name: 'Ivy Taylor',\n description: 'Content Strategist',\n avatar: 'https://i.pravatar.cc/150?img=47',\n status: 'offline',\n lastSeen: new Date(Date.now() - 10800000),\n profile: {\n bio: 'Content strategist crafting compelling narratives',\n email: 'ivy.taylor@example.com',\n phone: '+1 (555) 012-3456',\n location: 'Portland, OR',\n company: 'Content Agency',\n title: 'Content Strategist',\n },\n },\n {\n id: 'user-11',\n name: 'Jack Anderson',\n description: 'Backend Engineer',\n avatar: 'https://i.pravatar.cc/150?img=68',\n status: 'online',\n lastSeen: new Date(),\n profile: {\n bio: 'Backend engineer building scalable systems',\n email: 'jack.anderson@example.com',\n phone: '+1 (555) 123-4560',\n location: 'Phoenix, AZ',\n company: 'Backend Systems',\n title: 'Backend Engineer',\n },\n },\n {\n id: 'user-12',\n name: 'Kate Thomas',\n description: 'Project Manager',\n avatar: 'https://i.pravatar.cc/150?img=32',\n status: 'away',\n lastSeen: new Date(Date.now() - 900000),\n profile: {\n bio: 'Project manager keeping teams on track',\n email: 'kate.thomas@example.com',\n phone: '+1 (555) 234-5601',\n location: 'Atlanta, GA',\n company: 'Project Solutions',\n title: 'Project Manager',\n },\n },\n {\n id: 'user-13',\n name: 'Leo Jackson',\n description: 'ML Engineer',\n avatar: 'https://i.pravatar.cc/150?img=59',\n status: 'online',\n lastSeen: new Date(),\n profile: {\n bio: 'AI/ML engineer exploring artificial intelligence',\n email: 'leo.jackson@example.com',\n phone: '+1 (555) 345-6012',\n location: 'San Jose, CA',\n company: 'AI Labs',\n title: 'ML Engineer',\n },\n },\n {\n id: 'user-14',\n name: 'Mia White',\n description: 'Business Analyst',\n avatar: 'https://i.pravatar.cc/150?img=45',\n status: 'offline',\n lastSeen: new Date(Date.now() - 14400000),\n profile: {\n bio: 'Business analyst bridging tech and business',\n email: 'mia.white@example.com',\n phone: '+1 (555) 456-0123',\n location: 'Dallas, TX',\n company: 'Business Analytics',\n title: 'Business Analyst',\n },\n },\n {\n id: 'user-15',\n name: 'Noah Harris',\n description: 'QA Engineer',\n avatar: 'https://i.pravatar.cc/150?img=70',\n status: 'online',\n lastSeen: new Date(),\n profile: {\n bio: 'QA engineer ensuring quality in every release',\n email: 'noah.harris@example.com',\n phone: '+1 (555) 567-0124',\n location: 'Nashville, TN',\n company: 'Quality Assurance',\n title: 'QA Engineer',\n },\n },\n /** Demo: no avatar image — only participant `icon` (Font Awesome) in the message list */\n {\n id: 'demo-icon-only-user',\n name: 'Icon Demo User',\n description: 'No profile photo — FA icon only',\n icon: 'fa-light fa-user',\n status: 'online',\n lastSeen: new Date(),\n profile: {\n bio: 'Seed user to demo participant icon without profile image',\n email: 'icon.demo@example.com',\n phone: '+1 (555) 999-0000',\n location: 'Demo',\n company: 'Acorex',\n title: 'Demo',\n },\n },\n ];\n\n // Store participants in memory and IndexedDB\n for (const p of participants) {\n storage.participants.set(p.id, p);\n await axConversationIndexedDbStorage.putParticipant(p);\n }\n\n // Create conversations: 2 private + 3 groups (includes icon-only avatar demo)\n const now = new Date();\n const conversations: AXConversation[] = [\n // Private Chat 1: Alice Johnson\n {\n id: 'conv-1',\n type: 'private',\n title: 'Alice Johnson',\n participants: [participants[0], { ...participants[1], role: 'member' }],\n lastMessageAt: new Date(now.getTime() - 60000),\n unreadCount: 2,\n status: { isTyping: false, typingUsers: [] },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: {\n profile: {\n description: 'Private conversation with Alice Johnson',\n tags: ['work', 'design'],\n favorite: true,\n },\n },\n createdAt: new Date(now.getTime() - 86400000),\n updatedAt: new Date(now.getTime() - 60000),\n },\n // Private Chat 2: Bob Smith\n {\n id: 'conv-2',\n type: 'private',\n title: 'Bob Smith',\n participants: [participants[0], { ...participants[2], role: 'member' }],\n lastMessageAt: new Date(now.getTime() - 7200000),\n unreadCount: 0,\n status: { isTyping: false, typingUsers: [] },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: {\n profile: {\n description: 'Private conversation with Bob Smith',\n tags: ['development', 'tech'],\n favorite: false,\n },\n },\n createdAt: new Date(now.getTime() - 259200000),\n updatedAt: new Date(now.getTime() - 7200000),\n },\n // Group Chat 1: Project Team (3-5 members)\n {\n id: 'conv-3',\n type: 'group',\n title: 'Project Team',\n avatar: 'https://i.pravatar.cc/150?img=50',\n participants: [\n { ...participants[0], role: 'admin' },\n { ...participants[1], role: 'member' },\n { ...participants[2], role: 'member' },\n { ...participants[4], role: 'member' },\n ],\n lastMessageAt: new Date(now.getTime() - 3600000),\n unreadCount: 1,\n status: { isTyping: false, typingUsers: [] },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: {\n profile: {\n description: 'Team collaboration for current project',\n tags: ['work', 'project', 'team'],\n favorite: true,\n groupInfo: {\n createdBy: 'current-user',\n purpose: 'Project coordination and updates',\n },\n },\n },\n createdAt: new Date(now.getTime() - 604800000),\n updatedAt: new Date(now.getTime() - 3600000),\n },\n // Group Chat 2: Design Team (5-10 members)\n {\n id: 'conv-4',\n type: 'group',\n title: 'Design Team',\n avatar: 'https://i.pravatar.cc/150?img=65',\n participants: [\n { ...participants[0], role: 'admin' },\n { ...participants[1], role: 'member' },\n { ...participants[3], role: 'member' },\n { ...participants[5], role: 'member' },\n { ...participants[6], role: 'member' },\n { ...participants[7], role: 'member' },\n { ...participants[8], role: 'member' },\n { ...participants[10], role: 'member' },\n ],\n lastMessageAt: new Date(now.getTime() - 10800000),\n unreadCount: 0,\n status: { isTyping: false, typingUsers: [] },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: {\n profile: {\n description: 'Design team collaboration and brainstorming',\n tags: ['design', 'creative', 'team'],\n favorite: false,\n groupInfo: {\n createdBy: 'user-2',\n purpose: 'Design reviews and creative discussions',\n },\n },\n },\n createdAt: new Date(now.getTime() - 1209600000),\n updatedAt: new Date(now.getTime() - 10800000),\n },\n // Group: icon-only demo (no conversation avatar image; optional `icon` for chrome that reads it)\n {\n id: 'conv-icon-demo',\n type: 'group',\n title: 'Icon-only avatars (demo)',\n icon: 'fa-light fa-users',\n participants: [\n { ...participants[0], role: 'admin' },\n { ...participants[15], role: 'member' },\n ],\n lastMessageAt: new Date(now.getTime() - 120000),\n unreadCount: 1,\n status: { isTyping: false, typingUsers: [] },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: {\n profile: {\n description: 'Demo: sender has no avatar URL — Font Awesome icon from participant/conversation',\n tags: ['demo', 'icon'],\n },\n },\n createdAt: new Date(now.getTime() - 86400000),\n updatedAt: new Date(now.getTime() - 120000),\n },\n ];\n\n // Store conversations in memory and IndexedDB\n for (const c of conversations) {\n storage.conversations.set(c.id, c);\n await axConversationIndexedDbStorage.putConversation(c);\n }\n\n // Create messages with ALL types for each conversation\n const messages: AXConversationMessage[] = [];\n\n // Conv-1 (Private: Alice) - All message types\n messages.push(\n {\n id: 'msg-1-1',\n conversationId: 'conv-1',\n senderId: 'user-2',\n type: 'text',\n timestamp: new Date(now.getTime() - 300000),\n payload: { type: 'text', text: 'Hey! How are you doing?' },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-1-2',\n conversationId: 'conv-1',\n senderId: 'current-user',\n type: 'text',\n timestamp: new Date(now.getTime() - 270000),\n payload: { type: 'text', text: \"I'm good! Working on the new project.\" },\n status: 'read',\n reactions: [{ emoji: '👍', userId: 'user-2', timestamp: new Date(now.getTime() - 265000) }],\n metadata: {},\n },\n {\n id: 'msg-1-3',\n conversationId: 'conv-1',\n senderId: 'user-2',\n type: 'image',\n timestamp: new Date(now.getTime() - 240000),\n payload: {\n type: 'image',\n images: [\n {\n url: 'https://picsum.photos/400/300',\n thumbnailUrl: 'https://picsum.photos/200/150',\n width: 400,\n height: 300,\n mimeType: 'image/jpeg',\n },\n ],\n caption: 'Check out this design!',\n },\n status: 'read',\n reactions: [{ emoji: '🔥', userId: 'current-user', timestamp: new Date(now.getTime() - 235000) }],\n metadata: {},\n },\n {\n id: 'msg-1-4',\n conversationId: 'conv-1',\n senderId: 'current-user',\n type: 'voice',\n timestamp: new Date(now.getTime() - 180000),\n payload: {\n type: 'voice',\n url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',\n duration: 15,\n size: 245760,\n waveform: [0.2, 0.4, 0.6, 0.8, 0.5, 0.3, 0.7, 0.9, 0.4, 0.2],\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-1-5',\n conversationId: 'conv-1',\n senderId: 'user-2',\n type: 'audio',\n timestamp: new Date(now.getTime() - 120000),\n payload: {\n type: 'audio',\n audios: [\n {\n url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3',\n title: 'Background Music',\n duration: 180,\n size: 3145728,\n mimeType: 'audio/mpeg',\n },\n ],\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-1-6',\n conversationId: 'conv-1',\n senderId: 'current-user',\n type: 'location',\n timestamp: new Date(now.getTime() - 90000),\n payload: {\n type: 'location',\n latitude: 37.7749,\n longitude: -122.4194,\n address: 'San Francisco, CA',\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-1-7',\n conversationId: 'conv-1',\n senderId: 'user-2',\n type: 'sticker',\n timestamp: new Date(now.getTime() - 60000),\n payload: {\n type: 'sticker',\n url: 'https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f44d.png',\n packId: 'pack-1',\n id: 'sticker-thumbs-up',\n animated: false,\n },\n status: 'delivered',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-1-8',\n conversationId: 'conv-1',\n senderId: 'user-2',\n type: 'file',\n timestamp: new Date(now.getTime() - 30000),\n payload: {\n type: 'file',\n files: [\n {\n url: 'https://example.com/document.pdf',\n name: 'Project_Proposal.pdf',\n size: 2048576,\n mimeType: 'application/pdf',\n },\n ],\n },\n status: 'delivered',\n reactions: [],\n metadata: {},\n },\n );\n\n // Conv-2 (Private: Bob) - Mixed messages\n messages.push(\n {\n id: 'msg-2-1',\n conversationId: 'conv-2',\n senderId: 'user-3',\n type: 'text',\n timestamp: new Date(now.getTime() - 7200000),\n payload: { type: 'text', text: 'Did you see the latest updates?' },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-2-2',\n conversationId: 'conv-2',\n senderId: 'current-user',\n type: 'video',\n timestamp: new Date(now.getTime() - 7180000),\n payload: {\n type: 'video',\n videos: [\n {\n url: 'https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4',\n thumbnailUrl: 'https://picsum.photos/640/360',\n duration: 60,\n size: 1048576,\n width: 1280,\n height: 720,\n mimeType: 'video/mp4',\n },\n ],\n },\n status: 'read',\n reactions: [{ emoji: '😂', userId: 'user-3', timestamp: new Date(now.getTime() - 7175000) }],\n metadata: {},\n },\n );\n\n // Conv-3 (Group: Project Team) - Group messages\n messages.push(\n {\n id: 'msg-3-1',\n conversationId: 'conv-3',\n senderId: 'user-2',\n type: 'text',\n timestamp: new Date(now.getTime() - 3700000),\n payload: { type: 'text', text: 'Team meeting at 3 PM today!' },\n status: 'read',\n reactions: [\n { emoji: '👍', userId: 'current-user', timestamp: new Date(now.getTime() - 3695000) },\n { emoji: '👍', userId: 'user-3', timestamp: new Date(now.getTime() - 3690000) },\n ],\n metadata: {},\n },\n {\n id: 'msg-3-2',\n conversationId: 'conv-3',\n senderId: 'user-5',\n type: 'image',\n timestamp: new Date(now.getTime() - 3650000),\n payload: {\n type: 'image',\n images: [\n {\n url: 'https://picsum.photos/800/600',\n thumbnailUrl: 'https://picsum.photos/200/150',\n width: 800,\n height: 600,\n mimeType: 'image/jpeg',\n },\n ],\n caption: 'Sprint planning board',\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-3-3',\n conversationId: 'conv-3',\n senderId: 'current-user',\n type: 'text',\n timestamp: new Date(now.getTime() - 3600000),\n payload: { type: 'text', text: 'Great work everyone! 🎉' },\n status: 'read',\n reactions: [{ emoji: '🎉', userId: 'user-2', timestamp: new Date(now.getTime() - 3595000) }],\n metadata: {},\n },\n {\n id: 'msg-3-4',\n conversationId: 'conv-3',\n senderId: 'user-2',\n type: 'text',\n timestamp: new Date(now.getTime() - 3550000),\n payload: { type: 'text', text: 'Thanks! Looking forward to it.' },\n status: 'delivered',\n reactions: [],\n metadata: {},\n },\n );\n\n // Conv-4 (Group: Design Team) - Design-related messages\n messages.push(\n {\n id: 'msg-4-1',\n conversationId: 'conv-4',\n senderId: 'user-7',\n type: 'text',\n timestamp: new Date(now.getTime() - 10900000),\n payload: { type: 'text', text: 'New design mockups are ready for review' },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-4-2',\n conversationId: 'conv-4',\n senderId: 'user-8',\n type: 'file',\n timestamp: new Date(now.getTime() - 10850000),\n payload: {\n type: 'file',\n files: [\n {\n url: 'https://example.com/designs.zip',\n name: 'UI_Designs_v2.zip',\n size: 15728640,\n mimeType: 'application/zip',\n },\n ],\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-4-3',\n conversationId: 'conv-4',\n senderId: 'current-user',\n type: 'sticker',\n timestamp: new Date(now.getTime() - 10800000),\n payload: {\n type: 'sticker',\n url: 'https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f389.png',\n packId: 'pack-1',\n id: 'sticker-party',\n animated: false,\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n );\n\n // Conv-icon-demo: messages from icon-only participant (no avatar image, FA icon in list)\n messages.push(\n {\n id: 'msg-icon-1',\n conversationId: 'conv-icon-demo',\n senderId: 'demo-icon-only-user',\n type: 'text',\n timestamp: new Date(now.getTime() - 300000),\n payload: {\n type: 'text',\n text: 'Hi — I have no profile photo, only a Font Awesome icon.',\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-icon-2',\n conversationId: 'conv-icon-demo',\n senderId: 'current-user',\n type: 'text',\n timestamp: new Date(now.getTime() - 240000),\n payload: {\n type: 'text',\n text: 'Looks good — the message list shows the icon where an avatar would be.',\n },\n status: 'read',\n reactions: [],\n metadata: {},\n },\n {\n id: 'msg-icon-3',\n conversationId: 'conv-icon-demo',\n senderId: 'demo-icon-only-user',\n type: 'text',\n timestamp: new Date(now.getTime() - 120000),\n payload: {\n type: 'text',\n text: 'Useful for bots or users without uploaded photos.',\n },\n status: 'delivered',\n reactions: [],\n metadata: {},\n },\n );\n\n // Store all messages in memory and IndexedDB (sorted per conversation)\n for (const m of messages) {\n registerChatMessage(m);\n await axConversationIndexedDbStorage.putMessage(m);\n }\n\n // Update conversations with last messages\n conversations[0].lastMessage = messages.find((m) => m.id === 'msg-1-8');\n conversations[1].lastMessage = messages.find((m) => m.id === 'msg-2-2');\n conversations[2].lastMessage = messages.find((m) => m.id === 'msg-3-3');\n conversations[3].lastMessage = messages.find((m) => m.id === 'msg-4-3');\n conversations[4].lastMessage = messages.find((m) => m.id === 'msg-icon-3');\n\n // Update in memory and IndexedDB\n for (const c of conversations) {\n storage.conversations.set(c.id, c);\n await axConversationIndexedDbStorage.putConversation(c);\n }\n\n await axConversationIndexedDbStorage.putSetting('isSeeded', true);\n storage.markSeeded();\n await ensurePaginationDemoData();\n storage.startDemoSimulations();\n}\n","/**\n * Chat-oriented pagination helpers for IndexedDB demo APIs.\n *\n * Convention (matches {@link AXConversationService}):\n * - Page 0: newest items (sidebar: recent chats; messages: latest history window).\n * - Page 1+ or `cursor`: older items before the previous window.\n * - `hasMore`: true when older items remain.\n * - `nextCursor`: id of the oldest item in the current page (use as `pagination.cursor` for the next request).\n */\n\nimport type { AXConversationPaginatedResult, AXConversationPagination } from '../../services/api';\n\nexport const AX_CONVERSATION_MESSAGE_CURSOR_PREFIX = 'msg:';\nexport const AX_CONVERSATION_CURSOR_PREFIX = 'conv:';\n\nexport type AXConversationChatCursorKind = 'message' | 'conversation';\n\nexport interface AXConversationParsedChatCursor {\n kind: AXConversationChatCursorKind;\n id: string;\n}\n\nexport function encodeMessageCursor(messageId: string): string {\n return `${AX_CONVERSATION_MESSAGE_CURSOR_PREFIX}${messageId}`;\n}\n\nexport function encodeConversationCursor(conversationId: string): string {\n return `${AX_CONVERSATION_CURSOR_PREFIX}${conversationId}`;\n}\n\n/** Decode cursor from API pagination (supports prefixed or legacy raw message id). */\nexport function parseChatCursor(cursor?: string): AXConversationParsedChatCursor | null {\n if (!cursor?.trim()) {\n return null;\n }\n if (cursor.startsWith(AX_CONVERSATION_MESSAGE_CURSOR_PREFIX)) {\n return { kind: 'message', id: cursor.slice(AX_CONVERSATION_MESSAGE_CURSOR_PREFIX.length) };\n }\n if (cursor.startsWith(AX_CONVERSATION_CURSOR_PREFIX)) {\n return { kind: 'conversation', id: cursor.slice(AX_CONVERSATION_CURSOR_PREFIX.length) };\n }\n return { kind: 'message', id: cursor };\n}\n\nfunction resolveStartIndex<T extends { id: string }>(\n sortedNewestFirst: T[],\n pagination: AXConversationPagination,\n expectedKind: AXConversationChatCursorKind,\n): number {\n const pageStart = pagination.page * pagination.pageSize;\n const parsed = parseChatCursor(pagination.cursor);\n\n if (parsed && parsed.kind === expectedKind) {\n const index = sortedNewestFirst.findIndex((item) => item.id === parsed.id);\n if (index >= 0) {\n return index + 1;\n }\n }\n\n return pageStart;\n}\n\nfunction buildPageResult<T extends { id: string }>(\n sortedNewestFirst: T[],\n startIndex: number,\n pagination: AXConversationPagination,\n encodeCursor: (id: string) => string,\n): AXConversationPaginatedResult<T> {\n const { pageSize } = pagination;\n const items = sortedNewestFirst.slice(startIndex, startIndex + pageSize);\n const hasMore = startIndex + pageSize < sortedNewestFirst.length;\n const oldestInPage = items.at(-1);\n\n return {\n items,\n total: sortedNewestFirst.length,\n hasMore,\n page: pagination.page,\n totalPages: Math.max(1, Math.ceil(sortedNewestFirst.length / pageSize)),\n nextCursor: hasMore && oldestInPage ? encodeCursor(oldestInPage.id) : undefined,\n };\n}\n\n/**\n * Paginate a list sorted newest-first (chats, message history windows).\n */\nexport function paginateChatNewestFirst<T extends { id: string }>(\n sortedNewestFirst: T[],\n pagination: AXConversationPagination,\n cursorKind: AXConversationChatCursorKind,\n): AXConversationPaginatedResult<T> {\n const startIndex = resolveStartIndex(sortedNewestFirst, pagination, cursorKind);\n const encode =\n cursorKind === 'conversation' ? encodeConversationCursor : encodeMessageCursor;\n return buildPageResult(sortedNewestFirst, startIndex, pagination, encode);\n}\n\n/**\n * Paginate a list sorted oldest-first (replies, forward history).\n */\nexport function paginateChatOldestFirst<T extends { id: string }>(\n sortedOldestFirst: T[],\n pagination: AXConversationPagination,\n): AXConversationPaginatedResult<T> {\n const startIndex = pagination.page * pagination.pageSize;\n const items = sortedOldestFirst.slice(startIndex, startIndex + pagination.pageSize);\n const hasMore = startIndex + pagination.pageSize < sortedOldestFirst.length;\n const newestInPage = items.at(-1);\n\n return {\n items,\n total: sortedOldestFirst.length,\n hasMore,\n page: pagination.page,\n totalPages: Math.max(1, Math.ceil(sortedOldestFirst.length / pagination.pageSize)),\n nextCursor:\n hasMore && newestInPage ? encodeMessageCursor(newestInPage.id) : undefined,\n };\n}\n","/**\n * IndexedDB User API Implementation\n * Implements AXConversationUserApi using IndexedDB backend\n */\n\nimport { Injectable } from '@angular/core';\nimport type { AXConversationParticipant, AXConversationPresenceUpdate, AXConversationUserProfile } from '../../models';\nimport {\n AXConversationUserApi,\n AXConversationBlockReportReason,\n AXConversationPresenceStatus,\n AXConversationUserProfileUpdate,\n AXConversationUserSearchFilters,\n} from '../../services/api';\nimport { axConversationSharedStorage } from './shared-storage';\n\n@Injectable()\nexport class AXConversationIndexedDbUserApi extends AXConversationUserApi {\n\n // =====================\n // User Profile\n // =====================\n\n async getCurrentUser(): Promise<AXConversationParticipant> {\n const user = axConversationSharedStorage.participants.get(axConversationSharedStorage.currentUserId);\n if (!user) {\n throw this.createError('USER_NOT_FOUND', 'Current user not found', 404);\n }\n return user;\n }\n\n async updateProfile(updates: AXConversationUserProfileUpdate): Promise<AXConversationParticipant> {\n const user = await this.getCurrentUser();\n const { profile: profileUpdates, custom, bio, phone, email, ...participantUpdates } = updates;\n\n const legacyProfile: Partial<AXConversationUserProfile> = {};\n if (bio !== undefined) legacyProfile.bio = bio;\n if (phone !== undefined) legacyProfile.phone = phone;\n if (email !== undefined) legacyProfile.email = email;\n\n const mergedProfile: AXConversationUserProfile | undefined = {\n ...user.profile,\n ...legacyProfile,\n ...profileUpdates,\n };\n const hasProfile = Object.values(mergedProfile).some((value) => value !== undefined);\n\n return {\n ...user,\n ...participantUpdates,\n profile: hasProfile ? mergedProfile : user.profile,\n metadata: custom ? { ...user.metadata, custom } : user.metadata,\n };\n }\n\n async uploadAvatar(file: File): Promise<string> {\n // Mock upload - return a data URL\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.readAsDataURL(file);\n });\n }\n\n // =====================\n // User Discovery\n // =====================\n\n async getUsers(filters?: AXConversationUserSearchFilters): Promise<AXConversationParticipant[]> {\n const users = Array.from(axConversationSharedStorage.participants.values());\n const filtered = users.filter((u) => u.id !== axConversationSharedStorage.currentUserId);\n if (!filters?.query) return filtered;\n const q = filters.query.toLowerCase();\n return filtered.filter((u) => {\n const name = u.name.toLowerCase();\n const desc = (u.description ?? '').toLowerCase();\n return name.includes(q) || desc.includes(q);\n });\n }\n\n async searchUsers(query: string): Promise<AXConversationParticipant[]> {\n return this.getUsers({ query });\n }\n\n async getUserById(userId: string): Promise<AXConversationParticipant> {\n const user = axConversationSharedStorage.participants.get(userId);\n if (!user) {\n throw this.createError('USER_NOT_FOUND', `User ${userId} not found`, 404);\n }\n return user;\n }\n\n async getUsersByIds(userIds: string[]): Promise<AXConversationParticipant[]> {\n return userIds\n .map((id) => axConversationSharedStorage.participants.get(id))\n .filter((u): u is AXConversationParticipant => u !== undefined);\n }\n\n // =====================\n // Presence Management\n // =====================\n\n async getUserPresence(userId: string): Promise<AXConversationPresenceUpdate> {\n return {\n userId,\n status: 'online',\n lastSeen: new Date(),\n };\n }\n\n async updatePresence(_status: AXConversationPresenceStatus, _statusText?: string): Promise<void> {\n // Mock presence update\n await Promise.resolve();\n }\n\n // =====================\n // User Blocking & Reporting\n // =====================\n\n async blockUser(_userId: string, _reason?: AXConversationBlockReportReason): Promise<void> {\n // Mock block\n await Promise.resolve();\n }\n\n async unblockUser(_userId: string): Promise<void> {\n // Mock unblock\n await Promise.resolve();\n }\n\n async getBlockedUsers(): Promise<string[]> {\n // Mock blocked users list\n return [];\n }\n\n async reportUser(_userId: string, _reason: AXConversationBlockReportReason): Promise<void> {\n // Mock report\n await Promise.resolve();\n }\n\n // =====================\n // User Settings & Preferences\n // =====================\n\n async getUserSettings(): Promise<Record<string, unknown>> {\n // Mock user settings\n return {\n theme: 'light',\n language: 'en',\n notifications: true,\n };\n }\n\n async updateUserSettings(_settings: Record<string, unknown>): Promise<void> {\n // Mock update settings\n await Promise.resolve();\n }\n}\n","/**\n * IndexedDB Conversation API Implementation\n * Inbox pagination: pinned first, then by last activity; scroll loads older chats.\n */\n\nimport { Injectable } from '@angular/core';\nimport type { AXConversation, AXConversationParticipant } from '../../models';\nimport {\n AXConversationApi,\n AXConversationCreateData,\n AXConversationFilters,\n AXConversationSettingsUpdate,\n AXConversationUpdateData,\n AXConversationPaginatedResult,\n AXConversationPagination,\n AXConversationParticipantUpdate,\n} from '../../services/api';\nimport { getConversationMessagesNewestFirst, getSortedConversationsForInbox } from './chat-storage.helpers';\nimport { axConversationIndexedDbStorage } from './indexeddb-storage';\nimport { paginateChatNewestFirst } from './pagination.utils';\nimport { axConversationSharedStorage } from './shared-storage';\n\n@Injectable()\nexport class AXConversationIndexedDbConversationApi extends AXConversationApi {\n // =====================\n // Conversation CRUD\n // =====================\n\n async createConversation(data: AXConversationCreateData): Promise<AXConversation> {\n const creatorId = data.creatorId ?? axConversationSharedStorage.currentUserId;\n const participantIds = new Set(data.participantIds);\n if (creatorId) {\n participantIds.add(creatorId);\n }\n\n const conversation: AXConversation = {\n id: `conv-${Date.now()}`,\n type: data.type,\n creatorId,\n title:\n data.title ||\n (data.type === 'private' ? 'New Chat' : data.type === 'group' ? 'New Group' : 'New Channel'),\n avatar: data.avatar,\n description: data.description,\n participants: [...participantIds].map((id) => {\n const participant = axConversationSharedStorage.participants.get(id);\n if (!participant) {\n throw this.createError('PARTICIPANT_NOT_FOUND', `Participant ${id} not found`, 404);\n }\n return {\n ...participant,\n role: id === creatorId ? 'admin' : 'member',\n };\n }),\n lastMessageAt: new Date(),\n unreadCount: 0,\n status: { isTyping: false, typingUsers: [] },\n settings: { notifications: true, showPreview: true },\n archived: false,\n metadata: data.metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n axConversationSharedStorage.conversations.set(conversation.id, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n return conversation;\n }\n\n async getConversation(conversationId: string): Promise<AXConversation> {\n const conversation = axConversationSharedStorage.conversations.get(conversationId);\n if (!conversation) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n return conversation;\n }\n\n /**\n * Inbox page (pinned + recent activity, newest first).\n * Page 0 / cursor align with {@link AXConversationService.loadConversations} and sidebar infinite scroll.\n */\n async getConversations(\n pagination: AXConversationPagination,\n filters?: AXConversationFilters,\n ): Promise<AXConversationPaginatedResult<AXConversation>> {\n const sorted = getSortedConversationsForInbox(filters);\n return paginateChatNewestFirst(sorted, pagination, 'conversation');\n }\n\n async updateConversation(conversationId: string, updates: AXConversationUpdateData): Promise<AXConversation> {\n const conversation = await this.getConversation(conversationId);\n const updated = {\n ...conversation,\n ...updates,\n ...(updates.metadata !== undefined\n ? { metadata: { ...conversation.metadata, ...updates.metadata } }\n : {}),\n updatedAt: new Date(),\n };\n axConversationSharedStorage.conversations.set(conversationId, updated);\n await axConversationIndexedDbStorage.putConversation(updated);\n axConversationSharedStorage.conversationUpdates$.next(updated);\n return updated;\n }\n\n async deleteConversation(conversationId: string): Promise<boolean> {\n axConversationSharedStorage.conversations.delete(conversationId);\n await axConversationIndexedDbStorage.deleteConversation(conversationId);\n const messageIds = axConversationSharedStorage.messagesByConversation.get(conversationId) || [];\n for (const id of messageIds) {\n axConversationSharedStorage.messages.delete(id);\n await axConversationIndexedDbStorage.deleteMessage(id);\n }\n axConversationSharedStorage.messagesByConversation.delete(conversationId);\n return true;\n }\n\n // =====================\n // Conversation Actions\n // =====================\n\n async archiveConversation(conversationId: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.archived = true;\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n }\n\n async unarchiveConversation(conversationId: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.archived = false;\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n }\n\n async pinConversation(conversationId: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.pinned = true;\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n }\n\n async unpinConversation(conversationId: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.pinned = false;\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n }\n\n async markConversationAsRead(conversationId: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.unreadCount = 0;\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n }\n\n async markConversationAsUnread(conversationId: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.unreadCount = Math.max(1, conversation.unreadCount);\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n }\n\n // =====================\n // Search & Filter\n // =====================\n\n async searchConversations(query: string): Promise<AXConversation[]> {\n return getSortedConversationsForInbox({ searchQuery: query });\n }\n\n async filterConversations(\n filters: AXConversationFilters,\n pagination: AXConversationPagination = { page: 0, pageSize: 30 },\n ): Promise<AXConversationPaginatedResult<AXConversation>> {\n return this.getConversations(pagination, filters);\n }\n\n // =====================\n // Participant Management\n // =====================\n\n async getParticipants(conversationId: string): Promise<AXConversationParticipant[]> {\n const conversation = await this.getConversation(conversationId);\n return conversation.participants;\n }\n\n async addParticipants(_conversationId: string, _userIds: string[]): Promise<AXConversation> {\n const conversation = await this.getConversation(_conversationId);\n return conversation;\n }\n\n async removeParticipant(conversationId: string, _userId: string): Promise<AXConversation> {\n return this.getConversation(conversationId);\n }\n\n async leaveConversation(_conversationId: string): Promise<void> {\n await Promise.resolve();\n }\n\n async updateParticipant(conversationId: string, _update: AXConversationParticipantUpdate): Promise<AXConversation> {\n return this.getConversation(conversationId);\n }\n\n // =====================\n // Settings Management\n // =====================\n\n async getConversationSettings(conversationId: string): Promise<AXConversationSettingsUpdate> {\n const conversation = await this.getConversation(conversationId);\n return conversation.settings;\n }\n\n async updateConversationSettings(\n conversationId: string,\n settings: AXConversationSettingsUpdate,\n ): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.settings = { ...conversation.settings, ...settings };\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n }\n\n async muteConversation(conversationId: string, duration?: number): Promise<void> {\n await this.updateConversationSettings(conversationId, {\n mutedUntil: duration ? new Date(Date.now() + duration) : new Date('2099-12-31'),\n });\n }\n\n async unmuteConversation(conversationId: string): Promise<void> {\n await this.updateConversationSettings(conversationId, { mutedUntil: undefined });\n }\n\n // =====================\n // Media & Files\n // =====================\n\n async uploadConversationAvatar(_conversationId: string, file: File): Promise<string> {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.readAsDataURL(file);\n });\n }\n\n async getConversationMedia(\n conversationId: string,\n pagination: AXConversationPagination = { page: 0, pageSize: 30 },\n ): Promise<AXConversationPaginatedResult<unknown>> {\n const media = getConversationMessagesNewestFirst(conversationId).filter((m) =>\n ['image', 'video', 'file', 'audio'].includes(m.type),\n );\n const result = paginateChatNewestFirst(media, pagination, 'message');\n return { ...result, items: result.items as unknown[] };\n }\n\n // =====================\n // Conversation Metadata & Tags\n // =====================\n\n async addConversationTags(conversationId: string, tags: string[]): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n const profile = (conversation.metadata?.['profile'] as Record<string, unknown> | undefined) ?? {};\n const existing = (profile['tags'] as string[] | undefined) ?? [];\n conversation.metadata = {\n ...conversation.metadata,\n profile: { ...profile, tags: [...new Set([...existing, ...tags])] },\n };\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n }\n\n async removeConversationTags(conversationId: string, tags: string[]): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n const profile = (conversation.metadata?.['profile'] as Record<string, unknown> | undefined) ?? {};\n const existing = (profile['tags'] as string[] | undefined) ?? [];\n conversation.metadata = {\n ...conversation.metadata,\n profile: { ...profile, tags: existing.filter((t) => !tags.includes(t)) },\n };\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n }\n\n async getConversationTags(conversationId: string): Promise<string[]> {\n const conversation = await this.getConversation(conversationId);\n const profile = conversation.metadata?.['profile'] as { tags?: string[] } | undefined;\n return profile?.tags ?? [];\n }\n\n // =====================\n // Draft Management\n // =====================\n\n async saveDraft(conversationId: string, draft: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n conversation.metadata = { ...conversation.metadata, draft };\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n }\n\n async getDraft(conversationId: string): Promise<string | null> {\n const conversation = await this.getConversation(conversationId);\n const draft = conversation.metadata?.['draft'];\n return typeof draft === 'string' ? draft : null;\n }\n\n async clearDraft(conversationId: string): Promise<void> {\n const conversation = await this.getConversation(conversationId);\n const metadata = { ...(conversation.metadata ?? {}) };\n delete metadata['draft'];\n conversation.metadata = metadata;\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n }\n}\n","/**\n * IndexedDB Message API Implementation\n * Chat-oriented pagination: page 0 = newest window, scroll-up loads older via page/cursor.\n */\n\nimport { Injectable } from '@angular/core';\nimport type { AXConversationMessage, AXConversationMessagePayload, AXConversationSendMessageCommand } from '../../models';\nimport { resolveConversationMessageFileType } from '../../models/message-file-type-catalog';\nimport {\n AXConversationMessageApi,\n AXConversationMessageForwardData,\n AXConversationMessageSearchFilters,\n AXConversationPaginatedResult,\n AXConversationPagination,\n AXConversationPinnedMessage,\n AXConversationReadReceipt,\n} from '../../services/api';\nimport {\n getConversationMessagesNewestFirst,\n registerChatMessage,\n unregisterChatMessage,\n} from './chat-storage.helpers';\nimport { axConversationIndexedDbStorage } from './indexeddb-storage';\nimport { paginateChatNewestFirst, paginateChatOldestFirst } from './pagination.utils';\nimport { axConversationSharedStorage } from './shared-storage';\n\n@Injectable()\nexport class AXConversationIndexedDbMessageApi extends AXConversationMessageApi {\n // =====================\n // Message CRUD\n // =====================\n\n async sendMessage(command: AXConversationSendMessageCommand): Promise<AXConversationMessage> {\n const currentUser = axConversationSharedStorage.participants.get(axConversationSharedStorage.currentUserId);\n if (!currentUser) {\n throw this.createError('USER_NOT_FOUND', 'Current user not found', 404);\n }\n\n const message: AXConversationMessage = {\n id: command.tempId || `msg-${Date.now()}`,\n conversationId: command.conversationId,\n senderId: currentUser.id,\n type: command.type,\n fileType: resolveConversationMessageFileType(command.type, command.fileType),\n timestamp: new Date(),\n payload: command.payload,\n status: 'sent',\n reactions: [],\n forwarded: command.forwarded,\n forwardedFrom: command.forwardedFrom,\n metadata: command.metadata || {},\n replyTo: command.replyToId ? axConversationSharedStorage.messages.get(command.replyToId) : undefined,\n };\n\n registerChatMessage(message);\n await axConversationIndexedDbStorage.putMessage(message);\n\n const conversation = axConversationSharedStorage.conversations.get(command.conversationId);\n if (conversation) {\n conversation.lastMessageAt = message.timestamp;\n conversation.lastMessage = message;\n axConversationSharedStorage.conversations.set(conversation.id, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n }\n\n axConversationSharedStorage.messageStream$.next(message);\n return message;\n }\n\n async getMessage(messageId: string): Promise<AXConversationMessage> {\n const message = axConversationSharedStorage.messages.get(messageId);\n if (!message) {\n throw this.createError('MESSAGE_NOT_FOUND', 'Message not found', 404);\n }\n return message;\n }\n\n /**\n * Message history for a chat (newest-first pages).\n * - Page 0: latest `pageSize` messages.\n * - Page 1+ or `pagination.cursor`: older messages before the previous window.\n */\n async getMessages(conversationId: string, pagination: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversationMessage>> {\n const sorted = getConversationMessagesNewestFirst(conversationId);\n return paginateChatNewestFirst(sorted, pagination, 'message');\n }\n\n async editMessage(messageId: string, payload: AXConversationMessagePayload): Promise<AXConversationMessage> {\n const message = await this.getMessage(messageId);\n message.payload = payload;\n message.metadata = { ...message.metadata, editedAt: new Date() };\n axConversationSharedStorage.messages.set(messageId, message);\n await axConversationIndexedDbStorage.putMessage(message);\n axConversationSharedStorage.messageUpdates$.next(message);\n return message;\n }\n\n async deleteMessage(messageId: string, _forEveryone?: boolean): Promise<void> {\n const message = await this.getMessage(messageId);\n unregisterChatMessage(messageId, message.conversationId);\n await axConversationIndexedDbStorage.deleteMessage(messageId);\n axConversationSharedStorage.messageDeletions$.next(messageId);\n }\n\n async deleteMessages(messageIds: string[], forEveryone?: boolean): Promise<void> {\n for (const id of messageIds) {\n await this.deleteMessage(id, forEveryone);\n }\n }\n\n // =====================\n // Message Search\n // =====================\n\n async searchMessages(\n conversationId: string,\n filters: AXConversationMessageSearchFilters,\n pagination: AXConversationPagination = { page: 0, pageSize: 20 },\n ): Promise<AXConversationPaginatedResult<AXConversationMessage>> {\n const sorted = getConversationMessagesNewestFirst(conversationId);\n const lowerQuery = filters.query.toLowerCase();\n const filtered = sorted.filter((m) => {\n if (m.type === 'text' && 'text' in m.payload) {\n return m.payload.text?.toLowerCase().includes(lowerQuery);\n }\n return false;\n });\n return paginateChatNewestFirst(filtered, pagination, 'message');\n }\n\n async searchAllMessages(\n filters: AXConversationMessageSearchFilters,\n pagination: AXConversationPagination = { page: 0, pageSize: 20 },\n ): Promise<AXConversationPaginatedResult<AXConversationMessage>> {\n const lowerQuery = filters.query.toLowerCase();\n const all = Array.from(axConversationSharedStorage.messages.values())\n .filter((m) => {\n if (m.type === 'text' && 'text' in m.payload) {\n return m.payload.text?.toLowerCase().includes(lowerQuery);\n }\n return false;\n })\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n\n return paginateChatNewestFirst(all, pagination, 'message');\n }\n\n // =====================\n // Reactions\n // =====================\n\n async addReaction(messageId: string, emoji: string): Promise<void> {\n const message = await this.getMessage(messageId);\n const currentUser = axConversationSharedStorage.participants.get(axConversationSharedStorage.currentUserId);\n if (!currentUser) return;\n\n const existingReaction = message.reactions.find((r) => r.emoji === emoji && r.userId === currentUser.id);\n if (existingReaction) {\n message.reactions = message.reactions.filter((r) => !(r.emoji === emoji && r.userId === currentUser.id));\n } else {\n message.reactions.push({ emoji, userId: currentUser.id, timestamp: new Date() });\n }\n axConversationSharedStorage.messages.set(messageId, message);\n await axConversationIndexedDbStorage.putMessage(message);\n axConversationSharedStorage.messageUpdates$.next(message);\n }\n\n async removeReaction(messageId: string, emoji: string): Promise<void> {\n const message = await this.getMessage(messageId);\n const currentUser = axConversationSharedStorage.participants.get(axConversationSharedStorage.currentUserId);\n if (!currentUser) return;\n\n message.reactions = message.reactions.filter((r) => !(r.emoji === emoji && r.userId === currentUser.id));\n axConversationSharedStorage.messages.set(messageId, message);\n await axConversationIndexedDbStorage.putMessage(message);\n axConversationSharedStorage.messageUpdates$.next(message);\n }\n\n async getAvailableReactions(): Promise<string[]> {\n return ['👍', '❤️', '😂', '😮', '😢', '🙏', '🎉', '🔥'];\n }\n\n // =====================\n // Read Receipts\n // =====================\n\n async markAsRead(conversationId: string, messageIds: string[]): Promise<void> {\n for (const messageId of messageIds) {\n const message = axConversationSharedStorage.messages.get(messageId);\n if (message && message.status !== 'read') {\n message.status = 'read';\n axConversationSharedStorage.messages.set(messageId, message);\n await axConversationIndexedDbStorage.putMessage(message);\n axConversationSharedStorage.messageUpdates$.next(message);\n }\n }\n const conversation = axConversationSharedStorage.conversations.get(conversationId);\n if (conversation) {\n conversation.unreadCount = Math.max(0, conversation.unreadCount - messageIds.length);\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n }\n }\n\n async markAsUnread(conversationId: string): Promise<void> {\n const conversation = axConversationSharedStorage.conversations.get(conversationId);\n if (conversation) {\n conversation.unreadCount = Math.max(1, conversation.unreadCount);\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n }\n }\n\n async getReadReceipts(_messageId: string): Promise<AXConversationReadReceipt[]> {\n return [];\n }\n\n // =====================\n // Message Actions\n // =====================\n\n async forwardMessage(_data: AXConversationMessageForwardData): Promise<AXConversationMessage[]> {\n return [];\n }\n\n async pinMessage(_conversationId: string, _messageId: string): Promise<void> {\n await Promise.resolve();\n }\n\n async unpinMessage(_conversationId: string, _messageId: string): Promise<void> {\n await Promise.resolve();\n }\n\n async getPinnedMessages(_conversationId: string): Promise<AXConversationPinnedMessage[]> {\n return [];\n }\n\n // =====================\n // Message Threads (Replies)\n // =====================\n\n async getMessageReplies(messageId: string, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversationMessage>> {\n const replies = Array.from(axConversationSharedStorage.messages.values())\n .filter((m) => m.replyTo?.id === messageId)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n const page = pagination ?? { page: 0, pageSize: 20 };\n return paginateChatOldestFirst(replies, page);\n }\n\n async getReplyCount(messageId: string): Promise<number> {\n return Array.from(axConversationSharedStorage.messages.values()).filter(\n (m) => m.replyTo?.id === messageId,\n ).length;\n }\n\n async getForwardCount(messageId: string): Promise<number> {\n return Array.from(axConversationSharedStorage.messages.values()).filter(\n (m) => m.forwardedFrom?.messageId === messageId,\n ).length;\n }\n\n // =====================\n // Typing Indicators\n // =====================\n\n async sendTypingIndicator(conversationId: string): Promise<void> {\n const currentUser = axConversationSharedStorage.participants.get(axConversationSharedStorage.currentUserId);\n axConversationSharedStorage.typingIndicators$.next({\n conversationId,\n userId: axConversationSharedStorage.currentUserId,\n userName: currentUser?.name || 'You',\n timestamp: new Date(),\n });\n }\n\n async stopTypingIndicator(conversationId: string): Promise<void> {\n const currentUser = axConversationSharedStorage.participants.get(axConversationSharedStorage.currentUserId);\n axConversationSharedStorage.typingIndicators$.next({\n conversationId,\n userId: axConversationSharedStorage.currentUserId,\n userName: currentUser?.name || 'You',\n timestamp: new Date(),\n });\n }\n\n // =====================\n // Message Metadata\n // =====================\n\n async updateMessageMetadata(messageId: string, metadata: Record<string, unknown>): Promise<void> {\n const message = await this.getMessage(messageId);\n message.metadata = { ...message.metadata, ...metadata };\n axConversationSharedStorage.messages.set(messageId, message);\n await axConversationIndexedDbStorage.putMessage(message);\n axConversationSharedStorage.messageUpdates$.next(message);\n }\n\n async getMessageMetadata(messageId: string): Promise<Record<string, unknown>> {\n const message = await this.getMessage(messageId);\n return message.metadata ?? {};\n }\n\n // =====================\n // Message Status\n // =====================\n\n async updateMessageStatus(\n messageId: string,\n status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed',\n ): Promise<void> {\n const message = await this.getMessage(messageId);\n message.status = status;\n axConversationSharedStorage.messages.set(messageId, message);\n await axConversationIndexedDbStorage.putMessage(message);\n axConversationSharedStorage.messageUpdates$.next(message);\n }\n\n async getMessageDeliveryStatus(_messageId: string): Promise<{\n delivered: number;\n read: number;\n total: number;\n }> {\n return { delivered: 0, read: 0, total: 0 };\n }\n\n // =====================\n // Bulk Operations\n // =====================\n\n async markMessagesAsRead(messageIds: string[]): Promise<void> {\n const byConversation = new Map<string, string[]>();\n for (const id of messageIds) {\n const message = axConversationSharedStorage.messages.get(id);\n if (!message) continue;\n const list = byConversation.get(message.conversationId) ?? [];\n list.push(id);\n byConversation.set(message.conversationId, list);\n }\n for (const [conversationId, ids] of byConversation) {\n await this.markAsRead(conversationId, ids);\n }\n }\n\n async bulkDeleteMessages(conversationId: string, messageIds: string[], forEveryone?: boolean): Promise<void> {\n for (const id of messageIds) {\n const message = axConversationSharedStorage.messages.get(id);\n if (message?.conversationId === conversationId) {\n await this.deleteMessage(id, forEveryone);\n }\n }\n }\n\n // =====================\n // Message Export\n // =====================\n\n async exportMessages(conversationId: string, _format: 'json' | 'csv' | 'txt'): Promise<string | Blob> {\n const messages = getConversationMessagesNewestFirst(conversationId).reverse();\n return JSON.stringify({ conversationId, messages });\n }\n}\n","/**\n * IndexedDB Realtime API Implementation\n * Implements AXConversationRealtimeApi using IndexedDB backend\n */\n\nimport { Injectable } from '@angular/core';\nimport { filter, Observable } from 'rxjs';\nimport type { AXConversation, AXConversationMessage, AXConversationPresenceUpdate, AXConversationTypingIndicator } from '../../models';\nimport {\n AXConversationCallEvent,\n AXConversationConnectionEvent,\n AXConversationConnectionOptions,\n AXConversationConnectionStatus,\n AXConversationNotificationEvent,\n AXConversationRealtimeApi,\n} from '../../services/api';\nimport { axConversationSharedStorage } from './shared-storage';\n\n@Injectable()\nexport class AXConversationIndexedDbRealtimeApi extends AXConversationRealtimeApi {\n readonly connectionStatus$: Observable<AXConversationConnectionStatus> = axConversationSharedStorage.connectionStatus$;\n\n // =====================\n // Connection Management\n // =====================\n\n async connect(_options?: AXConversationConnectionOptions): Promise<void> {\n axConversationSharedStorage.connectionStatus$.next('connecting');\n await axConversationSharedStorage.seedIfEmpty();\n axConversationSharedStorage.connectionStatus$.next('connected');\n }\n\n async disconnect(): Promise<void> {\n axConversationSharedStorage.connectionStatus$.next('disconnected');\n }\n\n isConnected(): boolean {\n return axConversationSharedStorage.connectionStatus$.value === 'connected';\n }\n\n async reconnect(): Promise<void> {\n await this.disconnect();\n await this.connect();\n }\n\n subscribeToConnectionEvents(): Observable<AXConversationConnectionEvent> {\n // Mock connection events\n return new Observable((subscriber) => {\n subscriber.next({\n type: 'connected',\n timestamp: new Date(),\n });\n });\n }\n\n // =====================\n // Message Events\n // =====================\n\n subscribeToMessages(conversationId: string): Observable<AXConversationMessage> {\n return axConversationSharedStorage.messageStream$.pipe(\n filter((msg) => !conversationId || msg.conversationId === conversationId),\n );\n }\n\n subscribeToMessageUpdates(_conversationId?: string): Observable<AXConversationMessage> {\n return axConversationSharedStorage.messageUpdates$;\n }\n\n subscribeToMessageDeletions(_conversationId?: string): Observable<string> {\n return axConversationSharedStorage.messageDeletions$;\n }\n\n subscribeToMessageReactions(_conversationId?: string): Observable<AXConversationMessage> {\n // Mock reactions - reuse message updates\n return axConversationSharedStorage.messageUpdates$;\n }\n\n // =====================\n // Conversation Events\n // =====================\n\n subscribeToConversationUpdates(): Observable<AXConversation> {\n return axConversationSharedStorage.conversationUpdates$;\n }\n\n subscribeToConversationCreated(): Observable<AXConversation> {\n // Mock conversation created\n return new Observable(() => {});\n }\n\n subscribeToConversationDeleted(): Observable<string> {\n // Mock conversation deleted\n return new Observable(() => {});\n }\n\n // =====================\n // Typing Indicators\n // =====================\n\n subscribeToTypingIndicators(conversationId: string): Observable<AXConversationTypingIndicator> {\n // If conversationId is empty, return all typing indicators (for global subscription)\n if (!conversationId) {\n return axConversationSharedStorage.typingIndicators$;\n }\n // Otherwise filter by specific conversation\n return axConversationSharedStorage.typingIndicators$.pipe(filter((ind) => ind.conversationId === conversationId));\n }\n\n // =====================\n // Presence Updates\n // =====================\n\n subscribeToPresenceUpdates(_userIds?: string[]): Observable<AXConversationPresenceUpdate> {\n return axConversationSharedStorage.presenceUpdates$;\n }\n\n // =====================\n // Read Receipts\n // =====================\n\n subscribeToReadReceipts(_conversationId?: string): Observable<{ messageId: string; userId: string; readAt: Date }> {\n // Mock read receipts\n return new Observable(() => {});\n }\n\n // =====================\n // Notifications\n // =====================\n\n subscribeToNotifications(): Observable<AXConversationNotificationEvent> {\n // Mock notifications\n return new Observable(() => {});\n }\n\n // =====================\n // Call Events (Optional)\n // =====================\n\n subscribeToCallEvents(): Observable<AXConversationCallEvent> {\n // Mock call events\n return new Observable(() => {});\n }\n\n // =====================\n // User Events\n // =====================\n\n subscribeToUserBlockEvents(): Observable<{ userId: string; blocked: boolean }> {\n // Mock block events\n return new Observable(() => {});\n }\n\n subscribeToParticipantEvents(\n _conversationId?: string,\n ): Observable<{ conversationId: string; userId: string; action: 'added' | 'removed' }> {\n // Mock participant events\n return new Observable(() => {});\n }\n\n // =====================\n // System Events\n // =====================\n\n subscribeToSystemEvents(): Observable<{ type: string; message: string; data?: any }> {\n // Mock system events\n return new Observable(() => {});\n }\n\n // =====================\n // Message Status Events\n // =====================\n\n subscribeToMessageStatusChanges(_conversationId?: string): Observable<{\n messageId: string;\n status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed';\n timestamp: Date;\n }> {\n // Mock message status changes\n return new Observable(() => {});\n }\n\n // =====================\n // Conversation Settings Events\n // =====================\n\n subscribeToConversationSettingsChanges(_conversationId?: string): Observable<{\n conversationId: string;\n settings: Record<string, unknown>;\n }> {\n // Mock settings changes\n return new Observable(() => {});\n }\n\n // =====================\n // Draft Events\n // =====================\n\n subscribeToDraftChanges(_conversationId?: string): Observable<{\n conversationId: string;\n draft: string | null;\n }> {\n // Mock draft changes\n return new Observable(() => {});\n }\n}\n","/**\n * AI Responder Service\n * Provides AI-powered automatic responses using Google Gemini API\n *\n * @security API key should be provided via injection token in production\n * @example\n * ```typescript\n * export const AX_CONVERSATION_AI_API_KEY = new InjectionToken<string>('AX_CONVERSATION_AI_API_KEY');\n *\n * providers: [\n * { provide: AX_CONVERSATION_AI_API_KEY, useValue: environment.geminiApiKey }\n * ]\n * ```\n */\n\nimport { inject, Injectable, InjectionToken } from '@angular/core';\n\n/**\n * Injection token for AI API key\n * Provide this in your app config to avoid hardcoding the API key\n */\nexport const AX_CONVERSATION_AI_API_KEY = new InjectionToken<string>('AX_CONVERSATION_AI_API_KEY');\n\n/**\n * Configuration for AI Responder\n */\nexport interface AXConversationAiResponderConfig {\n /** Maximum retry attempts for failed requests */\n maxRetries?: number;\n /** Timeout for API requests in milliseconds */\n timeout?: number;\n /** Enable fallback to random replies on error */\n useFallbackReplies?: boolean;\n}\n\n/**\n * Default configuration\n */\nconst AX_CONVERSATION_AI_DEFAULT_CONFIG: Required<AXConversationAiResponderConfig> = {\n maxRetries: 0,\n timeout: 2000,\n useFallbackReplies: true,\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXConversationAiResponderService {\n private readonly injectedApiKey = inject(AX_CONVERSATION_AI_API_KEY, { optional: true });\n private readonly config: Required<AXConversationAiResponderConfig> = AX_CONVERSATION_AI_DEFAULT_CONFIG;\n\n /**\n * Get API key from injection token\n * Returns undefined if not configured - service will use fallback responses\n */\n private getApiKey(): string | undefined {\n return this.injectedApiKey || undefined;\n }\n\n /**\n * Get AI-powered response for a given prompt\n * @param prompt - The user's message to respond to\n * @param retryCount - Current retry attempt (internal use)\n * @returns AI-generated response or fallback message\n */\n async getAIResponse(prompt: string, retryCount = 0): Promise<string> {\n // Validate prompt\n if (!prompt || prompt.trim().length === 0) {\n return this.getFallbackReply();\n }\n\n // Check if API key is available\n const apiKey = this.getApiKey();\n if (!apiKey) {\n // No API key configured - use fallback replies\n return this.getFallbackReply();\n }\n\n try {\n const response = await this.fetchWithTimeout(\n 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-goog-api-key': apiKey,\n },\n body: JSON.stringify({\n contents: [{ parts: [{ text: prompt }] }],\n generationConfig: {\n temperature: 0.7,\n maxOutputTokens: 200,\n },\n }),\n },\n this.config.timeout,\n );\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`AI API returned status ${response.status}: ${errorBody}`);\n }\n\n const data = await response.json();\n const aiText = data.candidates?.[0]?.content?.parts?.[0]?.text;\n\n if (aiText && aiText.trim().length > 0) {\n return aiText.trim();\n }\n\n // No valid response from AI\n throw new Error('AI returned empty response');\n } catch (error: any) {\n console.error(`AI response error (attempt ${retryCount + 1}/${this.config.maxRetries + 1}):`, error);\n\n // Retry logic\n if (retryCount < this.config.maxRetries) {\n // On auth error, fall back to simple responses\n if (retryCount === 0) {\n return this.getFallbackReply();\n }\n }\n\n // All retries exhausted, use fallback\n if (this.config.useFallbackReplies) {\n console.warn('AI service unavailable. Using fallback reply.');\n return this.getFallbackReply();\n }\n\n // Return user-friendly error message\n return \"I'm having trouble connecting right now. Please try again later.\";\n }\n }\n\n /**\n * Fetch with timeout\n */\n private async fetchWithTimeout(url: string, options: RequestInit, timeout: number): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n return response;\n } catch (error: any) {\n clearTimeout(timeoutId);\n if (error.name === 'AbortError') {\n throw new Error('Request timeout');\n }\n throw error;\n }\n }\n\n /**\n * Delay helper for retry logic\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Get a random fallback reply when AI is unavailable\n */\n private getFallbackReply(): string {\n const fallbackReplies = [\n 'That is a great point!',\n 'Interesting, tell me more.',\n \"I'm not so sure about that.\",\n 'Could you elaborate?',\n 'Thanks for sharing!',\n 'Got it.',\n 'lol 😂',\n 'Let me check and get back to you.',\n 'Totally agree.',\n 'What do you think?',\n 'Sounds good!',\n 'Perfect!',\n 'I see what you mean.',\n 'That makes sense.',\n 'Interesting perspective!',\n 'Tell me more about that.',\n 'I appreciate you sharing that.',\n 'Good to know!',\n ];\n return fallbackReplies[Math.floor(Math.random() * fallbackReplies.length)];\n }\n\n /**\n * Check if AI service is available\n * @returns true if API key is configured\n */\n isAvailable(): boolean {\n return !!this.getApiKey();\n }\n\n /**\n * Update configuration\n */\n configure(config: Partial<AXConversationAiResponderConfig>): void {\n Object.assign(this.config, config);\n }\n}\n","/**\n * IndexedDB Message API with AI Auto-Responder\n * Extends IndexedDB Message API to automatically respond to user messages with AI\n */\n\nimport { inject, Injectable } from '@angular/core';\nimport type { AXConversationMessage, AXConversationSendMessageCommand } from '../../models';\nimport { registerChatMessage } from './chat-storage.helpers';\nimport { AXConversationAiResponderService } from './ai-responder.service';\nimport { AXConversationIndexedDbMessageApi } from './indexeddb-message-api.service';\n\n@Injectable()\nexport class AXConversationIndexedDbMessageAiApi extends AXConversationIndexedDbMessageApi {\n private readonly aiResponder = inject(AXConversationAiResponderService);\n private readonly AI_TYPING_INDICATOR_DELAY = 1000; // 1 second delay to simulate typing\n private readonly AI_RESPONSE_DELAY = 2000; // 2 seconds delay to simulate typing\n\n /**\n * Override sendMessage to trigger AI auto-response\n */\n override async sendMessage(command: AXConversationSendMessageCommand): Promise<AXConversationMessage> {\n // Send the user's message first\n const userMessage = await super.sendMessage(command);\n\n // Auto-respond to any message type from the current user\n console.log('🤖 AI Auto-Responder: Detected user message, generating response...');\n \n // Extract context from different message types\n const messageContext = this.extractMessageContext(command);\n \n // Trigger AI response asynchronously (don't await), pass the user message ID\n this.generateAIResponse(command.conversationId, messageContext, userMessage.id).catch((error) => {\n console.error('❌ Failed to generate AI response:', error);\n });\n\n return userMessage;\n }\n\n /**\n * Extract context from different message types for AI processing\n */\n private extractMessageContext(command: AXConversationSendMessageCommand): string {\n switch (command.type) {\n case 'text':\n return 'text' in command.payload ? (command.payload.text as string) : 'sent a message';\n \n case 'image': {\n const imageCaption = 'caption' in command.payload ? command.payload.caption : '';\n return imageCaption ? `sent an image with caption: \"${imageCaption}\"` : 'sent an image';\n }\n \n case 'video': {\n const videoCaption = 'caption' in command.payload ? command.payload.caption : '';\n return videoCaption ? `sent a video with caption: \"${videoCaption}\"` : 'sent a video';\n }\n \n case 'audio': {\n const audioCaption = 'caption' in command.payload ? command.payload.caption : '';\n return audioCaption ? `sent audio with caption: \"${audioCaption}\"` : 'sent an audio message';\n }\n\n case 'file': {\n if (command.payload.type === 'file') {\n const fileCaption = command.payload.caption;\n const names = command.payload.files.map((f) => f.name).join(', ');\n const base =\n command.payload.files.length > 1\n ? `sent ${command.payload.files.length} files: ${names}`\n : `sent a file: ${names || 'attachment'}`;\n return fileCaption ? `${base} (caption: \"${fileCaption}\")` : base;\n }\n return 'sent a file';\n }\n \n case 'location': {\n const address = 'address' in command.payload ? command.payload.address : 'a location';\n return `shared location: ${address}`;\n }\n\n default:\n return `sent a ${command.type} message`;\n }\n }\n\n /**\n * Generate AI response to user message\n */\n private async generateAIResponse(conversationId: string, userText: string, replyToId: string): Promise<void> {\n try {\n const { axConversationSharedStorage } = await import('./shared-storage');\n\n // Get the conversation to find an AI bot or other participant\n const conversation = await this.getConversationForAI(conversationId);\n if (!conversation) {\n console.warn('⚠️ Conversation not found for AI response');\n return;\n }\n\n // Find all participants that are not the current user\n const otherParticipants = conversation.participants.filter((p) => p.id !== 'current-user');\n if (otherParticipants.length === 0) {\n console.warn('⚠️ No other participants found in conversation');\n return;\n }\n\n // In group conversations, randomly select a participant to respond\n // In 1-on-1 conversations, use the only other participant\n const randomIndex = Math.floor(Math.random() * otherParticipants.length);\n const aiSender = otherParticipants[randomIndex];\n \n console.log('🎲 Selected random responder:', aiSender.name, `(${randomIndex + 1}/${otherParticipants.length})`);\n\n console.log('🤖 AI Bot:', aiSender.name, 'is preparing to respond...');\n\n // 1. Mark user's message as READ by AI\n console.log('👁️ AI reading your message...');\n const userMessage = axConversationSharedStorage.messages.get(replyToId);\n if (userMessage) {\n userMessage.status = 'read';\n axConversationSharedStorage.messages.set(replyToId, userMessage);\n axConversationSharedStorage.messageUpdates$.next(userMessage);\n }\n\n // 2. Set AI user to ONLINE\n console.log('🟢 AI coming online...');\n const aiUser = axConversationSharedStorage.participants.get(aiSender.id);\n if (aiUser) {\n aiUser.status = 'online';\n aiUser.lastSeen = new Date();\n axConversationSharedStorage.participants.set(aiSender.id, aiUser);\n axConversationSharedStorage.presenceUpdates$.next({\n userId: aiSender.id,\n status: 'online',\n lastSeen: aiUser.lastSeen,\n });\n }\n\n // Small delay before typing\n await this.delay(500);\n\n // 3. Show TYPING indicator\n console.log('✍️ AI is typing...');\n axConversationSharedStorage.typingIndicators$.next({\n conversationId,\n userId: aiSender.id,\n userName: aiSender.name,\n timestamp: new Date(),\n });\n\n // Update conversation typing status\n conversation.status.isTyping = true;\n conversation.status.typingUsers = [aiSender.id];\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n\n // 4. Get conversation history (last 20 messages)\n const conversationHistory = await this.getConversationHistory(conversationId, 20);\n console.log('📚 Loaded conversation history:', conversationHistory.split('\\n').length, 'messages');\n\n // 5. Generate AI response with full context\n const contextPrompt = conversationHistory ? `${conversationHistory}\\nYou: ${userText}` : userText;\n console.log('🧠 Generating AI response with conversation context...');\n const aiResponse = await this.aiResponder.getAIResponse(contextPrompt);\n console.log('✅ AI Response received:', aiResponse);\n\n // Simulate realistic typing delay based on message length\n const typingDelay = Math.min(Math.max(aiResponse.length * 50, 2000), 5000);\n await this.delay(typingDelay);\n\n // 6. Stop TYPING indicator\n console.log('🛑 AI stopped typing...');\n axConversationSharedStorage.typingIndicators$.next({\n conversationId,\n userId: aiSender.id,\n userName: aiSender.name,\n timestamp: new Date(),\n });\n\n conversation.status.isTyping = false;\n conversation.status.typingUsers = [];\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n\n // 7. Send AI message\n console.log('📤 Sending AI message from:', aiSender.name);\n await this.createAIMessage(conversationId, aiSender.id, aiResponse, replyToId);\n console.log('✅ AI message sent successfully!');\n\n // 8. After a delay, set AI back to away/offline (optional)\n setTimeout(() => {\n if (aiUser) {\n aiUser.status = 'away';\n axConversationSharedStorage.participants.set(aiSender.id, aiUser);\n axConversationSharedStorage.presenceUpdates$.next({\n userId: aiSender.id,\n status: 'away',\n lastSeen: new Date(),\n });\n console.log('🟡 AI went away...');\n }\n }, 10000); // Go away after 10 seconds\n } catch (error) {\n console.error('❌ Error generating AI response:', error);\n }\n }\n\n /**\n * Get conversation for AI response\n */\n private async getConversationForAI(conversationId: string): Promise<any> {\n try {\n // Access shared storage directly\n const { axConversationSharedStorage } = await import('./shared-storage');\n return axConversationSharedStorage.conversations.get(conversationId);\n } catch {\n return null;\n }\n }\n\n /**\n * Get conversation history (last N messages)\n */\n private async getConversationHistory(conversationId: string, limit = 20): Promise<string> {\n try {\n const { axConversationSharedStorage } = await import('./shared-storage');\n \n // Get all messages for this conversation\n const messageIds = axConversationSharedStorage.messagesByConversation.get(conversationId) || [];\n \n // Get last N messages (excluding the very last one which is the current user message)\n const recentMessageIds = messageIds.slice(-limit - 1, -1);\n const messages: AXConversationMessage[] = [];\n \n for (const msgId of recentMessageIds) {\n const msg = axConversationSharedStorage.messages.get(msgId);\n if (msg) {\n messages.push(msg);\n }\n }\n \n // Format messages for AI context\n const formattedHistory = messages\n .map((msg) => {\n const sender = axConversationSharedStorage.participants.get(msg.senderId);\n const senderName = sender?.name || (msg.senderId === 'current-user' ? 'You' : 'Unknown');\n \n // Extract text from different message types\n let text = '';\n if (msg.type === 'text' && 'text' in msg.payload) {\n text = msg.payload.text as string;\n } else if (msg.type === 'image' && 'caption' in msg.payload) {\n text = `[Image: ${msg.payload.caption || 'no caption'}]`;\n } else if (msg.type === 'file' && msg.payload.type === 'file') {\n const names = msg.payload.files.map((f) => f.name).join(', ');\n text = `[File: ${names}]`;\n } else if (msg.type === 'audio') {\n text = '[Audio message]';\n } else if (msg.type === 'video' && 'caption' in msg.payload) {\n text = `[Video: ${msg.payload.caption || 'no caption'}]`;\n } else if (msg.type === 'location' && 'address' in msg.payload) {\n text = `[Location: ${msg.payload.address || 'shared location'}]`;\n } else {\n text = `[${msg.type} message]`;\n }\n \n return `${senderName}: ${text}`;\n })\n .join('\\n');\n \n return formattedHistory;\n } catch (error) {\n console.error('Error getting conversation history:', error);\n return '';\n }\n }\n\n /**\n * Create AI message directly in storage\n */\n private async createAIMessage(\n conversationId: string,\n senderId: string,\n text: string,\n replyToId: string,\n ): Promise<void> {\n try {\n const { axConversationSharedStorage } = await import('./shared-storage');\n\n const message: AXConversationMessage = {\n id: `msg-ai-${Date.now()}`,\n conversationId,\n senderId,\n type: 'text',\n timestamp: new Date(),\n payload: {\n type: 'text',\n text,\n },\n status: 'sent',\n reactions: [],\n metadata: { isAI: true },\n replyTo: axConversationSharedStorage.messages.get(replyToId),\n };\n\n const { axConversationIndexedDbStorage } = await import('./indexeddb-storage');\n registerChatMessage(message);\n await axConversationIndexedDbStorage.putMessage(message);\n\n // Update conversation\n const conversation = axConversationSharedStorage.conversations.get(conversationId);\n if (conversation) {\n conversation.lastMessageAt = message.timestamp;\n conversation.lastMessage = message;\n axConversationSharedStorage.conversations.set(conversationId, conversation);\n await axConversationIndexedDbStorage.putConversation(conversation);\n axConversationSharedStorage.conversationUpdates$.next(conversation);\n }\n\n // Emit message\n axConversationSharedStorage.messageStream$.next(message);\n } catch (error) {\n console.error('Error creating AI message:', error);\n }\n }\n\n /**\n * Delay helper\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * IndexedDB API implementations and storage for @acorex/components/conversation.\n *\n * Public symbols use the `AXConversation` prefix.\n */\n\nexport * from './indexeddb-storage';\nexport * from './shared-storage';\nexport * from './shared-storage.seed';\nexport * from './pagination.utils';\nexport * from './pagination-demo-data';\nexport * from './chat-storage.helpers';\n\n// Separated API implementations\nexport * from './indexeddb-user-api.service';\nexport * from './indexeddb-conversation-api.service';\nexport * from './indexeddb-message-api.service';\nexport * from './indexeddb-realtime-api.service';\n\n// AI-enhanced API implementations\nexport * from './ai-responder.service';\nexport * from './indexeddb-message-ai-api.service';\n","/** 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","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 Footer Component\n * Reusable footer for all picker components\n */\n\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\n\n@Component({\n selector: 'ax-conversation-picker-footer',\n imports: [AXButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-picker-footer\">\n <ax-button text=\"Cancel\" look=\"solid\" color=\"danger\" (onClick)=\"onCancel.emit()\" />\n <ax-button\n [text]=\"sendText()\"\n look=\"outline\"\n color=\"primary\"\n [disabled]=\"sendDisabled()\"\n (onClick)=\"onSend.emit()\"\n />\n </div>\n `,\n styles: [\n `\n .ax-conversation-picker-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-wrap: wrap;\n gap: 0.5rem;\n padding: 0.625rem 0.75rem;\n padding-bottom: calc(0.625rem + env(safe-area-inset-bottom, 0px));\n border-top: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n flex-shrink: 0;\n background: rgb(var(--ax-sys-color-lightest-surface));\n }\n\n @container picker (max-width: 480px) {\n .ax-conversation-picker-footer {\n flex-direction: column-reverse;\n align-items: stretch;\n gap: 0.375rem;\n padding-inline: 0.5rem;\n }\n\n .ax-conversation-picker-footer ax-button {\n width: 100%;\n }\n }\n `,\n ],\n})\nexport class AXConversationPickerFooterComponent {\n readonly sendText = input.required<string>();\n readonly sendDisabled = input<boolean>(false);\n readonly onCancel = output<void>();\n readonly onSend = output<void>();\n}\n","/**\n * Picker Header Component\n * Reusable header for all picker components\n */\n\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\n\n@Component({\n selector: 'ax-conversation-picker-header',\n imports: [AXTranslationModule, AsyncPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-picker-header\">\n <span class=\"ax-conversation-picker-header__title\">{{ title() }}</span>\n <button\n type=\"button\"\n class=\"ax-conversation-picker-header__close\"\n (click)=\"onClose.emit()\"\n [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n `,\n styles: [\n `\n .ax-conversation-picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n padding: 0.625rem 0.75rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n flex-shrink: 0;\n }\n\n .ax-conversation-picker-header__title {\n font-size: 0.8125rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .ax-conversation-picker-header__close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.75rem;\n height: 2.75rem;\n margin: -0.375rem -0.5rem -0.375rem 0;\n border: none;\n border-radius: var(--ax-sys-border-radius, 0.25rem);\n background: transparent;\n color: rgba(var(--ax-sys-color-on-surface), 0.55);\n font-size: 1.125rem;\n cursor: pointer;\n touch-action: manipulation;\n transition: background-color 0.15s ease, color 0.15s ease;\n }\n\n .ax-conversation-picker-header__close:hover,\n .ax-conversation-picker-header__close:focus-visible {\n background: rgba(var(--ax-sys-color-danger-500), 0.1);\n color: rgb(var(--ax-sys-color-danger-500));\n outline: none;\n }\n `,\n ],\n})\nexport class AXConversationPickerHeaderComponent {\n readonly title = input.required<string>();\n readonly onClose = output<void>();\n}\n","import { AXTextBoxModule } from '@acorex/components/text-box';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { ChangeDetectionStrategy, Component, inject, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\n/** Optional caption field shared by composer media pickers. */\n@Component({\n selector: 'ax-conversation-picker-caption',\n imports: [AXTextBoxModule, AXTranslationModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-picker__caption-slot\">\n <ax-text-box\n [(value)]=\"caption\"\n [placeholder]=\"translation.translateSync('@acorex:chat.pickers.common.caption-optional')\"\n />\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n flex-shrink: 0;\n width: 100%;\n }\n .ax-conversation-picker__caption-slot {\n padding: 0.5rem;\n }\n `,\n ],\n})\nexport class AXConversationPickerCaptionComponent {\n readonly translation = inject(AXTranslationService);\n readonly caption = model('');\n}\n","/**\n * Shell flex + max-height (on {@link AXConversationPickerShellComponent}).\n * Styles here target projected content inside the shell.\n */\nexport const AX_CONVERSATION_PICKER_SHELL_STYLES = `\n :host {\n display: block;\n width: 100%;\n max-width: 100%;\n min-height: 0;\n container-type: inline-size;\n container-name: picker;\n }\n\n .ax-conversation-picker {\n display: flex;\n flex-direction: column;\n width: 100%;\n max-width: 100%;\n max-height: min(32rem, 85dvh);\n background: rgb(var(--ax-sys-color-lightest-surface));\n border-radius: var(--ax-sys-border-radius, 0.5rem);\n overflow: hidden;\n }\n\n .ax-conversation-picker__content {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n }\n\n @container picker (max-width: 480px) {\n .ax-conversation-picker {\n max-height: min(28rem, 90dvh);\n border-radius: 0;\n }\n }\n`;\n\n/**\n * Shared layout and surface styles for composer media pickers.\n * Uses ACoreX system color tokens only.\n */\nexport const AX_CONVERSATION_PICKER_SHARED_STYLES = `\n :host {\n display: block;\n width: 100%;\n max-width: 100%;\n min-height: 0;\n }\n\n .ax-conversation-picker__scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n -webkit-overflow-scrolling: touch;\n }\n\n .ax-conversation-picker__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.375rem;\n min-height: 8.5rem;\n margin: 0.75rem;\n padding: 1rem 0.75rem;\n border: 1px dashed rgb(var(--ax-sys-color-border-surface));\n border-radius: var(--ax-sys-border-radius, 0.5rem);\n cursor: pointer;\n transition: border-color 0.15s ease, background-color 0.15s ease;\n text-align: center;\n touch-action: manipulation;\n }\n\n .ax-conversation-picker__empty:hover,\n .ax-conversation-picker__empty--drag {\n border-color: rgb(var(--ax-sys-color-primary-500));\n background: rgba(var(--ax-sys-color-primary-500), 0.06);\n }\n\n .ax-conversation-picker__empty-icon {\n font-size: 1.75rem;\n line-height: 1;\n color: rgba(var(--ax-sys-color-on-surface), 0.55);\n }\n\n .ax-conversation-picker__empty-title {\n margin: 0;\n font-size: 0.8125rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .ax-conversation-picker__empty-hint {\n margin: 0;\n font-size: 0.75rem;\n color: rgba(var(--ax-sys-color-on-surface), 0.6);\n }\n\n .ax-conversation-picker__body {\n padding: 0 0.75rem 0.75rem;\n }\n\n .ax-conversation-picker__list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n padding-top: 0.5rem;\n }\n\n .ax-conversation-picker__row {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 0.5rem 0.625rem;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n border-radius: var(--ax-sys-border-radius, 0.375rem);\n background: rgb(var(--ax-sys-color-surface));\n transition: background-color 0.15s ease;\n }\n\n @media (hover: hover) {\n .ax-conversation-picker__row:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n }\n\n .ax-conversation-picker__thumb {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n flex-shrink: 0;\n border-radius: var(--ax-sys-border-radius, 0.375rem);\n background: rgba(var(--ax-sys-color-primary-500), 0.08);\n color: rgb(var(--ax-sys-color-primary-500));\n font-size: 1.125rem;\n overflow: hidden;\n }\n\n .ax-conversation-picker__thumb img,\n .ax-conversation-picker__thumb video {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n pointer-events: none;\n }\n\n .ax-conversation-picker__thumb-badge {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(0 0 0 / 0.32);\n color: rgb(var(--ax-sys-color-light));\n font-size: 0.625rem;\n pointer-events: none;\n }\n\n .ax-conversation-picker__details {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n }\n\n .ax-conversation-picker__name {\n font-size: 0.8125rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .ax-conversation-picker__status {\n display: flex;\n flex-wrap: wrap;\n gap: 0.375rem;\n font-size: 0.6875rem;\n color: rgba(var(--ax-sys-color-on-surface), 0.65);\n }\n\n .ax-conversation-picker__status--ok {\n color: rgb(var(--ax-sys-color-success-600));\n font-weight: 500;\n }\n\n .ax-conversation-picker__status--err {\n color: rgb(var(--ax-sys-color-danger-600));\n font-weight: 500;\n }\n\n .ax-conversation-picker__progress {\n width: 100%;\n margin-top: 0.125rem;\n }\n\n .ax-conversation-picker__remove {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.75rem;\n height: 2.75rem;\n flex-shrink: 0;\n border: none;\n border-radius: var(--ax-sys-border-radius, 0.25rem);\n background: transparent;\n color: rgba(var(--ax-sys-color-on-surface), 0.55);\n font-size: 1rem;\n cursor: pointer;\n touch-action: manipulation;\n transition: background-color 0.15s ease, color 0.15s ease;\n }\n\n .ax-conversation-picker__remove:hover,\n .ax-conversation-picker__remove:focus-visible {\n background: rgba(var(--ax-sys-color-danger-500), 0.1);\n color: rgb(var(--ax-sys-color-danger-500));\n outline: none;\n }\n\n .ax-conversation-picker__grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(5.25rem, 1fr));\n gap: 0.5rem;\n }\n\n .ax-conversation-picker__tile {\n position: relative;\n aspect-ratio: 1;\n border-radius: var(--ax-sys-border-radius, 0.375rem);\n overflow: hidden;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .ax-conversation-picker__tile img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n .ax-conversation-picker__tile-remove {\n position: absolute;\n top: 0.25rem;\n inset-inline-end: 0.25rem;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: none;\n border-radius: 50%;\n background: rgb(var(--ax-sys-color-danger-500));\n color: rgb(var(--ax-sys-color-light));\n font-size: 0.6875rem;\n cursor: pointer;\n touch-action: manipulation;\n box-shadow: 0 1px 3px rgb(0 0 0 / 0.2);\n }\n\n .ax-conversation-picker__tile-overlay {\n position: absolute;\n inset-inline: 0;\n bottom: 0;\n padding: 0.25rem;\n background: linear-gradient(transparent, rgb(0 0 0 / 0.55));\n }\n\n .ax-conversation-picker__tile-status {\n font-size: 0.625rem;\n color: rgb(var(--ax-sys-color-light));\n line-height: 1.2;\n }\n\n .ax-conversation-picker__caption-slot {\n flex-shrink: 0;\n padding: 0.5rem 0.75rem;\n border-top: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-lightest-surface));\n }\n\n .ax-conversation-picker__input-hidden {\n display: none;\n }\n\n @container picker (max-width: 480px) {\n .ax-conversation-picker__grid {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 0.375rem;\n }\n\n .ax-conversation-picker__row {\n padding: 0.4375rem 0.5rem;\n gap: 0.5rem;\n }\n\n .ax-conversation-picker__thumb {\n width: 2.25rem;\n height: 2.25rem;\n }\n\n .ax-conversation-picker__empty {\n min-height: 7.5rem;\n margin: 0.5rem;\n }\n\n .ax-conversation-picker__body {\n padding-inline: 0.5rem;\n padding-bottom: 0.5rem;\n }\n }\n`;\n","import { AXUploaderBrowseDirective } from '@acorex/cdk/uploader';\nimport { ChangeDetectionStrategy, Component, ElementRef, inject, input } from '@angular/core';\nimport { AX_CONVERSATION_PICKER_SHARED_STYLES } from './picker-shared.styles';\n\n@Component({\n selector: 'ax-conversation-picker-empty',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXUploaderBrowseDirective],\n template: `\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 `,\n styles: [AX_CONVERSATION_PICKER_SHARED_STYLES],\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","/**\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 { 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 { afterNextRender, type InputSignal } from '@angular/core';\nimport type { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport type { AXConversationUploaderReference } from '../../../../models/conversation-upload.types';\n\nexport interface AXConversationComposerPickerUploadItem {\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/** Load files dropped onto the message list after the picker is mounted in a popup. */\nexport function seedPickerInitialFiles(\n initialFiles: InputSignal<File[]>,\n handleFiles: (files: File[]) => void | Promise<void>,\n): void {\n afterNextRender(() => {\n const files = initialFiles();\n if (files.length > 0) {\n void handleFiles([...files]);\n }\n });\n}\n\n/** Close inline composer shell or popup host after send/cancel. */\nexport function dismissComposerPickerHost(\n composerService: AXConversationComposerService,\n popupRef?: AXPopupRef | null,\n): void {\n if (popupRef) {\n popupRef.close();\n return;\n }\n composerService.hideComponent();\n}\n","import { AXUploaderFileChangeEvent, AXUploaderZoneDirective } from '@acorex/cdk/uploader';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { ChangeDetectionStrategy, Component, inject, input, output } from '@angular/core';\nimport { notifyPickerValidationErrors } from './picker-upload';\nimport { AX_CONVERSATION_PICKER_SHELL_STYLES } from './picker-shared.styles';\n\n/**\n * Wraps composer pickers with {@link AXUploaderZoneDirective} for browse, drop, and validation.\n */\n@Component({\n selector: 'ax-conversation-picker-shell',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXUploaderZoneDirective],\n styles: [AX_CONVERSATION_PICKER_SHELL_STYLES],\n template: `\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 `,\n})\nexport class AXConversationPickerShellComponent {\n private readonly toast = inject(AXToastService);\n private readonly translation = inject(AXTranslationService);\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 protected onZoneFileChange(event: AXUploaderFileChangeEvent): void {\n if (event.rejected?.length) {\n notifyPickerValidationErrors(this.toast, this.translation, event.rejected);\n }\n if (event.files.length > 0) {\n this.filesSelected.emit(event.files);\n }\n }\n}\n","import { AXUploaderBrowseDirective } from '@acorex/cdk/uploader';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nconst AX_CONVERSATION_PICKER_TOOLBAR_STYLES = `\n :host {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n flex-shrink: 0;\n position: sticky;\n top: 0;\n z-index: 10;\n box-sizing: border-box;\n width: calc(100% + 1.5rem);\n margin-inline: -0.75rem;\n padding: 0.375rem 0.75rem 0.5rem;\n background: rgb(var(--ax-sys-color-lightest-surface));\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .ax-conversation-picker__count {\n font-size: 0.75rem;\n font-weight: 500;\n color: rgba(var(--ax-sys-color-on-surface), 0.65);\n }\n\n @container picker (max-width: 480px) {\n :host {\n width: calc(100% + 1rem);\n margin-inline: -0.5rem;\n padding-inline: 0.5rem;\n }\n }\n`;\n\n@Component({\n selector: 'ax-conversation-picker-toolbar',\n imports: [AXButtonComponent, AXDecoratorModule, AXUploaderBrowseDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\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 styles: [AX_CONVERSATION_PICKER_TOOLBAR_STYLES],\n})\nexport class AXConversationPickerToolbarComponent {\n readonly countLabel = input.required<string>();\n readonly addMoreLabel = input.required<string>();\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 { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXFileService, AXFileTypeRegistryService, runFileTypeUtility, runFileTypeUtilityForFile, type AXFileType } from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, computed, inject, input, signal } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport { AXConversationPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AX_CONVERSATION_PICKER_SHARED_STYLES } from '../shared/picker-shared.styles';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport { AXConversationPickerToolbarComponent } from '../shared/picker-toolbar.component';\nimport {\n type AXConversationComposerPickerUploadItem,\n cleanupPickerUploads,\n dismissComposerPickerHost,\n getPickerCancelUploadLabel,\n isUploadAborted,\n seedPickerInitialFiles,\n limitFilesToCapacity,\n notifyMaxFilesCapacityExceeded,\n notifyPickerValidationErrors,\n pickerItemToUploadResult,\n uploadPickerFile,\n} from '../shared/picker-upload';\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 imports: [\n CommonModule,\n AXProgressBarModule,\n AXTranslationModule,\n AXConversationPickerHeaderComponent,\n AXConversationPickerFooterComponent,\n AXConversationPickerEmptyComponent,\n AXConversationPickerToolbarComponent,\n AXConversationPickerCaptionComponent,\n AXConversationPickerShellComponent,\n ],\n template: `\n <ax-conversation-picker-shell\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 [title]=\"translation.translateSync('@acorex:chat.pickers.audio.title')\" (onClose)=\"cancel()\" />\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 <ax-conversation-picker-toolbar\n [countLabel]=\"getSelectedCountText()\"\n [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n />\n\n <div class=\"ax-conversation-picker__list\">\n @for (audio of audioFiles(); track $index) {\n <div class=\"ax-conversation-picker__row\">\n <div class=\"ax-conversation-picker__thumb\">\n <i [class]=\"typeIconClass\"></i>\n </div>\n <div class=\"ax-conversation-picker__details\">\n <div class=\"ax-conversation-picker__name\">{{ audio.file.name }}</div>\n <div class=\"ax-conversation-picker__status\">\n @if (audio.uploading) {\n <span>{{ getUploadingLabel(audio.uploadProgress ?? 0) }}</span>\n } @else if (audio.uploaded) {\n <span class=\"ax-conversation-picker__status--ok\"\n ><i class=\"fa-light fa-check\"></i>\n {{ translation.translateSync('@acorex:chat.pickers.files.uploaded') }}</span\n >\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 || audio.uploaded) {\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 <button\n type=\"button\"\n class=\"ax-conversation-picker__remove\"\n (click)=\"removeAudio($index)\"\n [attr.aria-label]=\"\n audio.uploading\n ? getCancelUploadLabel()\n : translation.translateSync('@acorex:chat.pickers.common.remove')\n \"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <ax-conversation-picker-caption [(caption)]=\"caption\" />\n\n @if (audioFiles().length > 0) {\n <ax-conversation-picker-footer\n [sendText]=\"getSendText()\"\n [sendDisabled]=\"!canSend()\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendAudio()\"\n />\n }\n </ax-conversation-picker-shell>\n `,\n styles: [AX_CONVERSATION_PICKER_SHARED_STYLES],\n})\nexport class AXConversationAudioPickerComponent implements OnDestroy {\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 readonly translation = inject(AXTranslationService);\n\n readonly conversation = input.required<AXConversation>();\n readonly maxFiles = input<number>(10);\n readonly initialFiles = input<File[]>([]);\n readonly __popup__ = input<AXPopupRef | undefined>();\n\n readonly catalogFileType = AX_CONVERSATION_AUDIO_CATALOG;\n\n readonly audioFiles = signal<AXConversationAudioFile[]>([]);\n readonly isDragging = signal(false);\n readonly typeIconClass = AX_CONVERSATION_AUDIO_PRESENTATION.icon;\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\n readonly allowMultiple = computed(() => this.maxFiles() > 1);\n\n constructor() {\n this.fileTypeRegistry.registerTypes([createConversationAudioFileType()]);\n seedPickerInitialFiles(this.initialFiles, (files) => this.handleFiles(files));\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, { 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 sendAudio(): Promise<void> {\n const audioList = this.audioFiles();\n if (!this.canSend()) return;\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: this.caption.trim() || undefined,\n },\n };\n\n this.retainUploadedOnDismiss = true;\n const popup = this.__popup__();\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, popup);\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 cancel(): void {\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, this.__popup__());\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","import { AXConversationComposerTab } from '../../../../registries';\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),\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),\n enabled: true,\n};\n","/**\n * Composer Tabs Plugins\n */\n\nexport * from './default-tabs.plugin';\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, 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 imports: [CommonModule, FormsModule, AXSearchBoxModule, AXTranslationModule],\n template: `\n <div class=\"emoji-tab\">\n <!-- Search -->\n <div class=\"emoji-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search emoji...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"emoji-categories\">\n @for (category of categories(); track category.id) {\n <button\n type=\"button\"\n [class]=\"getCategoryClasses(category.id)\"\n (click)=\"selectCategory(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Emoji Grid -->\n <div class=\"emoji-grid\">\n @for (emoji of filteredEmojis(); track emoji.char) {\n <button\n type=\"button\"\n class=\"emoji-button\"\n (click)=\"selectEmoji(emoji.char)\"\n [attr.aria-label]=\"emoji.name\"\n [title]=\"emoji.name\"\n >\n {{ emoji.char }}\n </button>\n }\n </div>\n\n @if (filteredEmojis().length === 0) {\n <div class=\"emoji-empty\">\n <p>{{ '@acorex:chat.empty.no-emojis-found' | translate | async }}</p>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .emoji-tab {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .emoji-search {\n position: sticky;\n top: 0;\n z-index: 10;\n padding-block: 0.75rem;\n }\n\n .emoji-categories {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 0.25rem;\n margin-bottom: 0.75rem;\n padding-bottom: 0.75rem;\n overflow-x: auto;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .category-button {\n height: 2rem;\n width: 2rem;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 0.25rem;\n border: none;\n background: transparent;\n border-radius: 0.375rem;\n cursor: pointer;\n font-size: 1.25rem;\n transition: all 0.15s;\n font-family:\n 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Apple Color Emoji', 'Twemoji Mozilla', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .category-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .category-button-active {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n color: rgb(var(--ax-sys-color-on-primary-lightest-surface));\n }\n\n .emoji-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, 32px);\n gap: 0.25rem;\n max-height: 240px;\n }\n\n .emoji-button {\n width: 2rem;\n height: 2rem;\n padding: 0.25rem;\n border: none;\n background: transparent;\n border-radius: 0.375rem;\n cursor: pointer;\n font-size: 1.5rem;\n transition: all 0.15s;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family:\n 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Apple Color Emoji', 'Twemoji Mozilla', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .emoji-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .emoji-empty {\n padding: 2rem;\n text-align: center;\n opacity: 0.6;\n }\n `,\n ],\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","import type { AXConversationFileMediaItem, AXConversationFilePayload } 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: 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 sanitizeFileItem(item: AXConversationFileMediaItem): AXConversationFileMediaItem {\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 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: resolvePersistedThumbnailUrl(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 { 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 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\nexport function conversationFileUtilities(): NonNullable<AXFileType['utilities']> {\n return {\n [AX_CONVERSATION_FILE_UTILITY.preview]: async (ctx, file) => {\n const f = file as File;\n if (f.type.startsWith('image/')) {\n return (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(f);\n }\n return undefined;\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'],\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","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(file: File, result: AXConversationUploaderResult): AXConversationFileMediaItem {\n const extension = file.name.includes('.') ? file.name.split('.').pop() : undefined;\n const url = resolvePersistableMediaUrl(result.url);\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 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 * File Picker Component\n * General-purpose file attachment interface for the composer\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXFileService, AXFileTypeRegistryService, runFileTypeUtility, runFileTypeUtilityForFile, type AXFileType } from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, computed, inject, input, signal } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport { AXConversationPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AX_CONVERSATION_PICKER_SHARED_STYLES } from '../shared/picker-shared.styles';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport { AXConversationPickerToolbarComponent } from '../shared/picker-toolbar.component';\nimport {\n cleanupPickerUploads,\n dismissComposerPickerHost,\n getPickerCancelUploadLabel,\n isUploadAborted,\n seedPickerInitialFiles,\n limitFilesToCapacity,\n notifyMaxFilesCapacityExceeded,\n notifyPickerValidationErrors,\n pickerItemToUploadResult,\n uploadPickerFile,\n} from '../shared/picker-upload';\nimport { fileItemFromUpload } from './file-composer.payload';\nimport {\n AX_CONVERSATION_FILE_CATALOG,\n AX_CONVERSATION_FILE_PRESENTATION,\n createConversationFileFileType,\n} from './conversation-file.file-type';\n\ninterface AXConversationAttachedFile {\n file: File;\n preview?: string;\n icon: string;\n type: 'image' | 'video' | 'audio' | 'file';\n uploadProgress?: number;\n uploading?: boolean;\n uploaded?: boolean;\n uploadedUrl?: string;\n mediaId?: string;\n error?: string;\n abortController?: AbortController;\n}\n\n@Component({\n selector: 'ax-conversation-file-picker',\n imports: [\n CommonModule,\n AXProgressBarModule,\n AXTranslationModule,\n AXConversationPickerHeaderComponent,\n AXConversationPickerFooterComponent,\n AXConversationPickerEmptyComponent,\n AXConversationPickerToolbarComponent,\n AXConversationPickerCaptionComponent,\n AXConversationPickerShellComponent,\n ],\n template: `\n <ax-conversation-picker-shell\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 [title]=\"translation.translateSync('@acorex:chat.pickers.files.title')\" (onClose)=\"cancel()\" />\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 <ax-conversation-picker-toolbar\n [countLabel]=\"getSelectedCountText()\"\n [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n />\n\n <div class=\"ax-conversation-picker__list\">\n @for (file of files(); track $index) {\n <div class=\"ax-conversation-picker__row\">\n <div class=\"ax-conversation-picker__thumb\">\n @if (file.type === 'image' && file.preview) {\n <img [src]=\"file.preview\" [alt]=\"file.file.name\" />\n } @else {\n <i [class]=\"file.icon\"></i>\n }\n </div>\n <div class=\"ax-conversation-picker__details\">\n <div class=\"ax-conversation-picker__name\">{{ file.file.name }}</div>\n <div class=\"ax-conversation-picker__status\">\n @if (file.uploading) {\n <span>{{ getUploadingLabel(file.uploadProgress ?? 0) }}</span>\n } @else if (file.uploaded) {\n <span class=\"ax-conversation-picker__status--ok\"\n ><i class=\"fa-light fa-check\"></i>\n {{ translation.translateSync('@acorex:chat.pickers.files.uploaded') }}</span\n >\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 || file.uploaded) {\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 <button\n type=\"button\"\n class=\"ax-conversation-picker__remove\"\n (click)=\"removeFile($index)\"\n [attr.aria-label]=\"\n file.uploading\n ? getCancelUploadLabel()\n : translation.translateSync('@acorex:chat.pickers.common.remove')\n \"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <ax-conversation-picker-caption [(caption)]=\"caption\" />\n\n @if (files().length > 0) {\n <ax-conversation-picker-footer\n [sendText]=\"getSendButtonText()\"\n [sendDisabled]=\"!canSend()\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendFiles()\"\n />\n }\n </ax-conversation-picker-shell>\n `,\n styles: [AX_CONVERSATION_PICKER_SHARED_STYLES],\n})\nexport class AXConversationFilePickerComponent implements OnDestroy {\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 readonly translation = inject(AXTranslationService);\n\n readonly conversation = input.required<AXConversation>();\n readonly maxFiles = input<number>(10);\n readonly initialFiles = input<File[]>([]);\n readonly __popup__ = input<AXPopupRef | 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 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\n constructor() {\n this.fileTypeRegistry.registerTypes([createConversationFileFileType()]);\n seedPickerInitialFiles(this.initialFiles, (files) => this.handleFiles(files));\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 const fileType = await this.getCatalogFileTypeDef();\n const ctx = this.createUtilityContext();\n\n for (const file of accepted) {\n try {\n const previewResult = fileType\n ? await runFileTypeUtilityForFile(fileType, ctx, file, 'preview')\n : undefined;\n const rowCatalogResult = fileType\n ? await runFileTypeUtilityForFile(fileType, ctx, file, 'pickerCatalog')\n : 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\n let fileIndex = -1;\n this.files.update((files) => {\n fileIndex = files.length;\n return [...files, { file, preview, icon, type: pickerKind, uploadProgress: 0, uploading: true }];\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 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 cleanupPickerUploads(this.uploader, [item]);\n }\n this.files.update((files) => files.filter((_, i) => i !== index));\n }\n\n async sendFiles(): Promise<void> {\n const fileList = this.files();\n if (fileList.length === 0) return;\n\n // Check if all files are uploaded\n const allUploaded = fileList.every((f) => f.uploaded && !f.error);\n if (!allUploaded) {\n console.warn('Some files are still uploading or failed');\n return;\n }\n\n const files = fileList.flatMap((f) => {\n const result = pickerItemToUploadResult(f);\n return result ? [fileItemFromUpload(f.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: this.caption.trim() || undefined,\n },\n };\n\n this.retainUploadedOnDismiss = true;\n const popup = this.__popup__();\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, popup);\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__());\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 cleanupPickerUploads(this.uploader, snapshot, {\n retainUploaded: this.retainUploadedOnDismiss,\n });\n this.retainUploadedOnDismiss = false;\n this.files.set([]);\n this.caption = '';\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","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 { 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","/**\n * Image Picker Component\n * Full-width image selection and preview interface for the composer\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXFileService, AXFileTypeRegistryService, runFileTypeUtilityForFile, type AXFileType } from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, computed, inject, input, signal } 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 { AXConversationPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AX_CONVERSATION_PICKER_SHARED_STYLES } from '../shared/picker-shared.styles';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport { AXConversationPickerToolbarComponent } from '../shared/picker-toolbar.component';\nimport {\n type AXConversationComposerPickerUploadItem,\n cleanupPickerUploads,\n dismissComposerPickerHost,\n getPickerCancelUploadLabel,\n isUploadAborted,\n seedPickerInitialFiles,\n limitFilesToCapacity,\n notifyMaxFilesCapacityExceeded,\n notifyPickerValidationErrors,\n pickerItemToUploadResult,\n uploadPickerFile,\n} from '../shared/picker-upload';\nimport { resolvePersistableMediaUrl, resolvePersistedThumbnailUrl } from '../shared/persisted-media-url';\nimport {\n createConversationImageFileType,\n AX_CONVERSATION_IMAGE_CATALOG,\n AX_CONVERSATION_IMAGE_PRESENTATION,\n} from './conversation-image.file-type';\n\ninterface AXConversationImageFile extends AXConversationComposerPickerUploadItem {\n preview: string;\n}\n\nfunction imageItemFromUpload(file: File, result: AXConversationUploaderResult): AXConversationImageMediaItem {\n const url = resolvePersistableMediaUrl(result.url);\n const item: AXConversationImageMediaItem = {\n mediaId: result.mediaId,\n mimeType: result.mimeType,\n size: result.size,\n thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl, url),\n width: 0,\n height: 0,\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 imports: [\n CommonModule,\n AXProgressBarModule,\n AXTranslationModule,\n AXConversationPickerHeaderComponent,\n AXConversationPickerFooterComponent,\n AXConversationPickerEmptyComponent,\n AXConversationPickerToolbarComponent,\n AXConversationPickerCaptionComponent,\n AXConversationPickerShellComponent,\n ],\n template: `\n <ax-conversation-picker-shell\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 [title]=\"translation.translateSync('@acorex:chat.pickers.images.title')\" (onClose)=\"cancel()\" />\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 <ax-conversation-picker-toolbar\n [countLabel]=\"getSelectedCountText()\"\n [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n />\n\n <div class=\"ax-conversation-picker__grid\">\n @for (image of images(); track $index) {\n <div class=\"ax-conversation-picker__tile\">\n <img [src]=\"image.preview\" [alt]=\"image.file.name\" />\n @if (image.uploading || image.uploaded || image.error) {\n <div class=\"ax-conversation-picker__tile-overlay\">\n @if (image.uploading) {\n <span class=\"ax-conversation-picker__tile-status\">{{\n getUploadingLabel(image.uploadProgress ?? 0)\n }}</span>\n <ax-progress-bar [progress]=\"image.uploadProgress || 0\" [mode]=\"'determinate'\" [height]=\"3\" />\n } @else if (image.uploaded) {\n <span class=\"ax-conversation-picker__tile-status\"\n ><i class=\"fa-light fa-check\"></i>\n {{ translation.translateSync('@acorex:chat.pickers.files.uploaded') }}</span\n >\n } @else if (image.error) {\n <span class=\"ax-conversation-picker__tile-status\">{{ image.error }}</span>\n }\n </div>\n }\n <button\n type=\"button\"\n class=\"ax-conversation-picker__tile-remove\"\n (click)=\"removeImage($index)\"\n [attr.aria-label]=\"\n image.uploading\n ? getCancelUploadLabel()\n : translation.translateSync('@acorex:chat.pickers.common.remove')\n \"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <ax-conversation-picker-caption [(caption)]=\"caption\" />\n\n @if (images().length > 0) {\n <ax-conversation-picker-footer\n [sendText]=\"getSendText()\"\n [sendDisabled]=\"!canSend()\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendImages()\"\n />\n }\n </ax-conversation-picker-shell>\n `,\n styles: [AX_CONVERSATION_PICKER_SHARED_STYLES],\n})\nexport class AXConversationImagePickerComponent implements OnDestroy {\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 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 __popup__ = input<AXPopupRef | undefined>();\n\n readonly images = signal<AXConversationImageFile[]>([]);\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\n readonly allowMultiple = computed(() => this.maxFiles() > 1);\n private imageFileType?: AXFileType;\n\n constructor() {\n this.fileTypeRegistry.registerTypes([createConversationImageFileType()]);\n seedPickerInitialFiles(this.initialFiles, (files) => this.handleFiles(files));\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\n ? await runFileTypeUtilityForFile(fileType, ctx, file, 'preview')\n : undefined;\n const preview = typeof previewValue === 'string' ? previewValue : '';\n let index = -1;\n this.images.update((images) => {\n index = images.length;\n return [...images, { 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 sendImages(): Promise<void> {\n const imageList = this.images();\n if (!this.canSend()) return;\n\n const images = imageList.flatMap((image) => {\n const result = pickerItemToUploadResult(image);\n return result ? [imageItemFromUpload(image.file, result)] : [];\n });\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: this.caption.trim() || undefined,\n },\n };\n\n this.retainUploadedOnDismiss = true;\n const popup = this.__popup__();\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, popup);\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 cancel(): void {\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, this.__popup__());\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","/**\n * Location Picker Component\n * Full-width location selection interface for the composer\n */\n\nimport { AXMapMarker, AXMapModule } from '@acorex/components/map';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, inject, input, signal } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationLocationPayload, AXConversationSendMessageCommand } from '../../../../models';\nimport { AXConversationService } from '../../../../services';\nimport { AXConversationPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\n\n@Component({\n selector: 'ax-conversation-location-picker',\n imports: [CommonModule, AXMapModule, AXTranslationModule, AXConversationPickerHeaderComponent, AXConversationPickerFooterComponent],\n template: `\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 [sendText]=\"translation.translateSync('@acorex:chat.pickers.location.send')\"\n [sendDisabled]=\"false\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendLocation()\"\n />\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n container-type: inline-size;\n container-name: picker;\n }\n\n .ax-conversation-picker--location {\n max-height: min(70dvh, 28rem);\n }\n\n @container picker (max-width: 480px) {\n .ax-conversation-picker--location {\n max-height: 85dvh;\n }\n }\n\n .map-container {\n height: 10rem;\n overflow: hidden;\n }\n\n .location-info {\n padding: 0.75rem 1rem;\n background: rgb(var(--ax-sys-color-surface));\n border-top: 1px solid rgb(var(--ax-sys-color-border));\n }\n\n .info-row {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n .info-row i {\n font-size: 1.25rem;\n color: rgb(var(--ax-sys-color-primary));\n }\n\n .info-text {\n flex: 1;\n }\n\n .info-label {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface-variant));\n margin-bottom: 0.25rem;\n }\n\n .info-value {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n font-family: monospace;\n }\n `,\n ],\n})\nexport class AXConversationLocationPickerComponent {\n private readonly composerService = inject(AXConversationComposerService);\n private readonly conversationService = inject(AXConversationService);\n readonly translation = inject(AXTranslationService);\n\n readonly conversation = input.required<AXConversation>();\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 this.composerService.hideComponent();\n }\n}\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","/**\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 } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport { Component, DestroyRef, InjectionToken, 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: 'Trending', icon: '🔥', searchTerm: 'trending' },\n { id: 'happy', name: 'Happy', icon: '😊', searchTerm: 'happy' },\n { id: 'love', name: 'Love', icon: '❤️', searchTerm: 'love' },\n { id: 'funny', name: 'Funny', icon: '😂', searchTerm: 'funny' },\n { id: 'cool', name: 'Cool', icon: '😎', searchTerm: 'cool' },\n { id: 'party', name: 'Party', icon: '🎉', searchTerm: 'party' },\n];\n\n@Component({\n selector: 'ax-conversation-sticker-tab',\n imports: [CommonModule, FormsModule, AXSkeletonModule, AXSearchBoxModule, AXTranslationModule],\n template: `\n <div class=\"sticker-tab\">\n <!-- Search -->\n <div class=\"sticker-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search stickers...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"sticker-packs\">\n @for (category of stickerCategories; track category.id) {\n <button\n type=\"button\"\n [class]=\"getPackClasses(category.id)\"\n (click)=\"selectPack(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Loading State -->\n @if (loading()) {\n <div class=\"sticker-grid\">\n @for (i of skeletonItems; track i) {\n <div class=\"sticker-skeleton\">\n <ax-skeleton [animated]=\"true\" class=\"skeleton-item\"></ax-skeleton>\n </div>\n }\n </div>\n }\n\n <!-- Stickers Grid -->\n @if (!loading() && activeStickers().length > 0) {\n <div class=\"sticker-grid\">\n @for (sticker of activeStickers(); track sticker.id) {\n <button\n type=\"button\"\n class=\"sticker-button\"\n (click)=\"selectSticker(sticker)\"\n [attr.aria-label]=\"sticker.emoji\"\n >\n <img [src]=\"sticker.url\" [alt]=\"sticker.emoji || 'Sticker'\" class=\"sticker-image\" loading=\"lazy\" />\n </button>\n }\n </div>\n }\n\n <!-- Empty State -->\n @if (!loading() && activeStickers().length === 0) {\n <div class=\"sticker-empty\">\n <p>{{ '@acorex:chat.empty.no-stickers-available' | translate | async }}</p>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .sticker-tab {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .sticker-search {\n position: sticky;\n top: 0;\n z-index: 10;\n padding-block: 0.75rem;\n }\n\n .sticker-packs {\n display: flex;\n gap: 0.25rem;\n padding-top: 0.75rem;\n margin-bottom: 0.75rem;\n padding-bottom: 0.75rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .pack-button {\n width: 3rem;\n height: 3rem;\n padding: 0.5rem;\n border: none;\n background: transparent;\n border-radius: 0.375rem;\n cursor: pointer;\n font-size: 1.25rem;\n transition: all 0.15s;\n font-family:\n 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Apple Color Emoji', 'Twemoji Mozilla', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .pack-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .pack-button-active {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n }\n\n .sticker-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 0.5rem;\n overflow-y: auto;\n max-height: 240px;\n }\n\n .sticker-button {\n padding: 0.5rem;\n border: none;\n background: transparent;\n border-radius: 0.375rem;\n cursor: pointer;\n transition: all 0.15s;\n aspect-ratio: 1;\n }\n\n .sticker-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n }\n\n .sticker-image {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n .sticker-empty {\n padding: 2rem;\n text-align: center;\n opacity: 0.6;\n }\n\n .sticker-skeleton {\n height: 5rem;\n aspect-ratio: 1;\n border-radius: 0.375rem;\n overflow: hidden;\n }\n\n .skeleton-item {\n width: 100%;\n height: 100%;\n border-radius: 0.375rem;\n }\n `,\n ],\n})\nexport class AXConversationStickerTabComponent {\n private readonly http = inject(HttpClient);\n private readonly destroyRef = inject(DestroyRef);\n private readonly apiKey = inject(AX_CONVERSATION_STICKER_API_KEY);\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","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 { 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';\n\nexport function videoItemFromUpload(\n file: File,\n result: AXConversationUploaderResult,\n duration: number,\n): AXConversationVideoMediaItem {\n const url = resolvePersistableMediaUrl(result.url);\n const item: AXConversationVideoMediaItem = {\n mediaId: result.mediaId,\n mimeType: result.mimeType,\n size: result.size,\n thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl, url),\n duration,\n width: 0,\n height: 0,\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 { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXFileService, AXFileTypeRegistryService, runFileTypeUtility, runFileTypeUtilityForFile, type AXFileType } from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, computed, inject, input, signal } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport { AXConversationPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AX_CONVERSATION_PICKER_SHARED_STYLES } from '../shared/picker-shared.styles';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport { AXConversationPickerToolbarComponent } from '../shared/picker-toolbar.component';\nimport {\n type AXConversationComposerPickerUploadItem,\n cleanupPickerUploads,\n dismissComposerPickerHost,\n getPickerCancelUploadLabel,\n isUploadAborted,\n seedPickerInitialFiles,\n limitFilesToCapacity,\n notifyMaxFilesCapacityExceeded,\n notifyPickerValidationErrors,\n pickerItemToUploadResult,\n uploadPickerFile,\n} from '../shared/picker-upload';\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';\n\ninterface AXConversationVideoFile extends AXConversationComposerPickerUploadItem {\n preview?: string;\n duration?: number;\n}\n\n@Component({\n selector: 'ax-conversation-video-picker',\n imports: [\n CommonModule,\n AXProgressBarModule,\n AXTranslationModule,\n AXConversationPickerHeaderComponent,\n AXConversationPickerFooterComponent,\n AXConversationPickerEmptyComponent,\n AXConversationPickerToolbarComponent,\n AXConversationPickerCaptionComponent,\n AXConversationPickerShellComponent,\n ],\n template: `\n <ax-conversation-picker-shell\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 [title]=\"translation.translateSync('@acorex:chat.pickers.videos.title')\" (onClose)=\"cancel()\" />\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 <ax-conversation-picker-toolbar\n [countLabel]=\"getSelectedCountText()\"\n [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n />\n\n <div class=\"ax-conversation-picker__list\">\n @for (video of videos(); track $index) {\n <div class=\"ax-conversation-picker__row\">\n <div class=\"ax-conversation-picker__thumb\">\n @if (video.preview) {\n <video [src]=\"video.preview\" muted playsinline preload=\"metadata\"></video>\n <span class=\"ax-conversation-picker__thumb-badge\" aria-hidden=\"true\"\n ><i class=\"fa-solid fa-play\"></i\n ></span>\n } @else {\n <i [class]=\"typeIconClass\"></i>\n }\n </div>\n <div class=\"ax-conversation-picker__details\">\n <div class=\"ax-conversation-picker__name\">{{ video.file.name }}</div>\n <div class=\"ax-conversation-picker__status\">\n @if (video.uploading) {\n <span>{{ getUploadingLabel(video.uploadProgress ?? 0) }}</span>\n } @else if (video.uploaded) {\n <span class=\"ax-conversation-picker__status--ok\"\n ><i class=\"fa-light fa-check\"></i>\n {{ translation.translateSync('@acorex:chat.pickers.files.uploaded') }}</span\n >\n } @else if (video.error) {\n <span class=\"ax-conversation-picker__status--err\"\n ><i class=\"fa-light fa-xmark\"></i> {{ video.error }}</span\n >\n } @else {\n <span>{{ formatFileSize(video.file.size) }}</span>\n @if (video.duration) {\n <span>{{ formatDuration(video.duration) }}</span>\n }\n }\n </div>\n @if (video.uploading || video.uploaded) {\n <div class=\"ax-conversation-picker__progress\">\n <ax-progress-bar [progress]=\"video.uploadProgress || 0\" [mode]=\"'determinate'\" [height]=\"3\" />\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"ax-conversation-picker__remove\"\n (click)=\"removeVideo($index)\"\n [attr.aria-label]=\"\n video.uploading\n ? getCancelUploadLabel()\n : translation.translateSync('@acorex:chat.pickers.common.remove')\n \"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <ax-conversation-picker-caption [(caption)]=\"caption\" />\n\n @if (videos().length > 0) {\n <ax-conversation-picker-footer\n [sendText]=\"getSendText()\"\n [sendDisabled]=\"!canSend()\"\n (onCancel)=\"cancel()\"\n (onSend)=\"sendVideos()\"\n />\n }\n </ax-conversation-picker-shell>\n `,\n styles: [AX_CONVERSATION_PICKER_SHARED_STYLES],\n})\nexport class AXConversationVideoPickerComponent implements OnDestroy {\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 __popup__ = input<AXPopupRef | undefined>();\n\n readonly catalogFileType = AX_CONVERSATION_VIDEO_CATALOG;\n\n readonly videos = signal<AXConversationVideoFile[]>([]);\n readonly isDragging = signal(false);\n caption = '';\n\n readonly allowMultiple = computed(() => this.maxFiles() > 1);\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 seedPickerInitialFiles(this.initialFiles, (files) => this.handleFiles(files));\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 durationResult = await this.runUtility('duration', file);\n const preview = typeof previewResult === 'string' ? previewResult : undefined;\n const duration = typeof durationResult === 'number' ? durationResult : 0;\n let index = -1;\n this.videos.update((videos) => {\n index = videos.length;\n return [...videos, { file, preview, duration, uploadProgress: 0, uploading: true }];\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 sendVideos(): Promise<void> {\n const videoList = this.videos();\n if (!this.canSend()) return;\n\n const videos = videoList.flatMap((video) => {\n const result = pickerItemToUploadResult(video);\n return result ? [videoItemFromUpload(video.file, result, video.duration ?? 0)] : [];\n });\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: this.caption.trim() || undefined,\n },\n };\n\n this.retainUploadedOnDismiss = true;\n const popup = this.__popup__();\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, popup);\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 cancel(): void {\n this.dismissPicker();\n dismissComposerPickerHost(this.composerService, this.__popup__());\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","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 { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, DestroyRef, PLATFORM_ID, computed, inject, input, output, signal } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport type { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport { AX_CONVERSATION_VOICE_CATALOG } from './conversation-voice.file-type';\nimport { isUploadAborted, notifyPickerValidationErrors } from '../shared/picker-upload';\n\n@Component({\n selector: 'ax-conversation-voice-recorder',\n imports: [CommonModule, AXButtonComponent, AXDecoratorModule, AXLabelModule, AXProgressBarModule, AXTranslationModule],\n template: `\n <div class=\"voice-recorder\">\n <!-- Header with Close Button -->\n <div class=\"recorder-header\">\n <h3 class=\"recorder-title\">{{ '@acorex:chat.voice-recorder.title' | translate | async }}</h3>\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"cancel()\"\n [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"recorder-content\">\n @if (isUploading()) {\n <div class=\"recorder-upload\">\n <ax-label>{{ getUploadingLabel() }}</ax-label>\n <ax-progress-bar [progress]=\"uploadProgress()\" [mode]=\"'determinate'\" [height]=\"6\" />\n </div>\n } @else if (!isRecording()) {\n <!-- Start Recording State -->\n <div class=\"recorder-idle\">\n <button class=\"record-button\" (click)=\"startRecording()\">\n <i class=\"fa-light fa-microphone\"></i>\n </button>\n <span class=\"recorder-hint\">{{ '@acorex:chat.voice-recorder.tap-to-start' | translate | async }}</span>\n </div>\n } @else {\n <!-- Recording State -->\n <div class=\"recorder-active\">\n <div class=\"recorder-info\">\n <div class=\"recording-indicator\">\n <span class=\"pulse-dot\"></span>\n <span class=\"recording-text\">{{ '@acorex:chat.voice-recorder.recording' | translate | async }}</span>\n </div>\n <div class=\"recording-time\">{{ formattedTime() }}</div>\n </div>\n\n <div class=\"recorder-actions\">\n <ax-button\n [text]=\"translation.translateSync('@acorex:chat.actions.cancel')\"\n [look]=\"'ghost'\"\n (onClick)=\"cancelRecording()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-xmark\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n\n <ax-button\n [text]=\"translation.translateSync('@acorex:chat.actions.send')\"\n [look]=\"'primary'\"\n (onClick)=\"stopRecording()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-paper-plane\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n }\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n container-type: inline-size;\n }\n\n .voice-recorder {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n }\n\n .recorder-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .recorder-title {\n margin: 0;\n font-size: 0.875rem;\n font-weight: 600;\n }\n\n .close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n font-size: 1rem;\n cursor: pointer;\n transition: all 0.2s;\n opacity: 0.7;\n }\n\n .close-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n opacity: 1;\n }\n\n .recorder-upload {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 1.5rem;\n width: 100%;\n max-width: 320px;\n margin: 0 auto;\n }\n\n .recorder-content {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 1rem;\n }\n\n .recorder-idle {\n display: flex;\n align-items: center;\n gap: 1rem;\n width: 100%;\n }\n\n .record-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n border: none;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n border-radius: 50%;\n font-size: 1.5rem;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px rgba(var(--ax-sys-color-primary-500), 0.3);\n }\n\n .record-button:hover {\n background: rgb(var(--ax-sys-color-primary-600));\n }\n\n .recorder-hint {\n font-size: 0.875rem;\n opacity: 0.7;\n }\n\n .recorder-active {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n gap: 1rem;\n }\n\n .recorder-info {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n flex: 1;\n }\n\n .recording-indicator {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .pulse-dot {\n width: 12px;\n height: 12px;\n background: rgb(var(--ax-sys-color-danger-500));\n border-radius: 50%;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n }\n\n .recording-text {\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-danger-500));\n }\n\n .recording-time {\n font-size: 1.25rem;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n min-width: 80px;\n }\n\n .recorder-actions {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n @container (max-width: 768px) {\n .voice-recorder {\n padding: 0.75rem;\n }\n\n .record-button {\n width: 48px;\n height: 48px;\n font-size: 1.25rem;\n }\n\n .recorder-info {\n gap: 1rem;\n }\n\n .recording-time {\n font-size: 1.125rem;\n font-variant-numeric: tabular-nums;\n }\n\n .recorder-actions {\n gap: 0.5rem;\n }\n }\n\n @container (max-width: 480px) {\n .recorder-hint {\n font-size: 0.8125rem;\n }\n\n .recording-text {\n display: none;\n }\n\n .recording-time {\n font-size: 1rem;\n min-width: 60px;\n font-variant-numeric: tabular-nums;\n }\n }\n `,\n ],\n})\nexport class AXConversationVoiceRecorderComponent {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n private readonly composerService = inject(AXConversationComposerService);\n private readonly uploader = inject(AXUploaderService);\n private readonly toast = inject(AXToastService);\n readonly translation = inject(AXTranslationService);\n\n readonly conversation = input<AXConversation>();\n readonly recordingComplete = output<Blob>();\n readonly recordingCancelled = output<void>();\n\n readonly isRecording = signal(false);\n readonly isUploading = signal(false);\n readonly uploadProgress = signal(0);\n readonly recordingDuration = signal(0);\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 uploadAbortController?: AbortController;\n\n readonly formattedTime = computed(() => {\n const duration = this.recordingDuration();\n const minutes = Math.floor(duration / 60);\n const seconds = duration % 60;\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n });\n\n constructor() {\n this.destroyRef.onDestroy(() => this.stopAndCleanup());\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\n this.mediaRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n this.audioChunks.push(event.data);\n }\n };\n\n this.mediaRecorder.onstop = async () => {\n stream.getTracks().forEach((track) => track.stop());\n this.activeStream = undefined;\n\n if (this.cancelled) {\n this.cancelled = false;\n return;\n }\n\n const audioBlob = new Blob(this.audioChunks, { type: 'audio/webm' });\n this.recordingComplete.emit(audioBlob);\n\n const conv = this.conversation();\n if (conv && this.audioChunks.length > 0) {\n await this.sendVoiceMessage(audioBlob, conv);\n }\n };\n\n this.mediaRecorder.start();\n this.isRecording.set(true);\n this.recordingStartTime = Date.now();\n this.recordingDuration.set(0);\n\n this.timerInterval = window.setInterval(() => {\n const elapsed = Math.floor((Date.now() - this.recordingStartTime) / 1000);\n this.recordingDuration.set(elapsed);\n }, 1000);\n } catch (error) {\n console.error('Failed to start recording:', error);\n }\n }\n\n /** Stop recording and send */\n stopRecording(): void {\n if (this.mediaRecorder && this.isRecording()) {\n this.mediaRecorder.stop();\n this.isRecording.set(false);\n this.clearTimer();\n // Close the full-width component\n this.composerService.hideComponent();\n }\n }\n\n cancelRecording(): void {\n if (this.mediaRecorder && this.isRecording()) {\n this.cancelled = true;\n this.mediaRecorder.stop();\n this.isRecording.set(false);\n this.clearTimer();\n this.audioChunks = [];\n this.recordingCancelled.emit();\n this.composerService.hideComponent();\n }\n }\n\n /** Close the voice recorder */\n cancel(): void {\n if (this.isRecording()) {\n this.cancelRecording();\n return;\n }\n this.abortInProgressUploads();\n this.composerService.hideComponent();\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 /** Clear timer */\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 /** Send voice message */\n private async sendVoiceMessage(audioBlob: Blob, conversation: AXConversation): Promise<void> {\n const voiceFile = new File([audioBlob], `voice-${Date.now()}.webm`, { type: 'audio/webm' });\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.uploadAbortController = new AbortController();\n const uploadSignal = this.uploadAbortController.signal;\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: 'audio/webm',\n },\n };\n\n this.composerService.hideComponent();\n\n void this.composerService\n .sendMessage(command, {\n media: {\n source: audioBlob,\n fileName: `voice-${Date.now()}.webm`,\n mimeType: 'audio/webm',\n onProgress: (percent) => {\n if (!uploadSignal.aborted) {\n this.uploadProgress.set(percent);\n }\n },\n signal: uploadSignal,\n },\n })\n .catch((error) => {\n if (!isUploadAborted(error, uploadSignal)) {\n console.error('Failed to send voice message:', error);\n }\n })\n .finally(() => {\n this.uploadAbortController = undefined;\n if (!uploadSignal.aborted) {\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n }\n });\n }\n\n private stopAndCleanup(): void {\n this.abortInProgressUploads();\n this.clearTimer();\n if (this.mediaRecorder?.state === 'recording') {\n this.cancelled = true;\n this.mediaRecorder.stop();\n }\n this.activeStream?.getTracks().forEach((track) => track.stop());\n this.activeStream = undefined;\n }\n}\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: 'left',\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: 'right',\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 visible: (context) => !context.draftText?.trim() && !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: 'right',\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 visible: (context) => !context.draftText?.trim() && !context.isEditing,\n tooltip: '@acorex:chat.tooltips.send-video',\n};\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\nimport { AX_CONVERSATION_FILE_CATALOG } from '../../../models/message-file-type-catalog';\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: 'right',\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 visible: (context) => !context.draftText?.trim() && !context.isEditing,\n tooltip: '@acorex:chat.tooltips.attach-file',\n};\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\nimport { AX_CONVERSATION_VOICE_CATALOG } from '../../../models/message-file-type-catalog';\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: 'right',\n priority: 30,\n componentLoader: () =>\n import('../components/voice-recorder/voice-recorder.component').then((m) => m.AXConversationVoiceRecorderComponent),\n fileType: AX_CONVERSATION_VOICE_CATALOG,\n toggleable: true,\n visible: (context) => !context.draftText?.trim() && !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: 'right',\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 visible: (context) => !context.draftText?.trim() && !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: 'right',\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.draftText?.trim() && !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 base = normalizeImagePayload(payload as AXConversationImagePayload);\n const images = [...base.images];\n const slot = images.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n const preview = { url: localUrl, width: 0, height: 0, 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","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 { AXConversationMessageApi } from '../../../services/api';\nimport { resolvePrivatePeerUserId } from '../../../utils/avatar-context.utils';\nimport { resolveParticipantProfile } from '../../../utils/participant-profile.utils';\nimport { resolvePersistedThumbnailUrl } from '../../composer/components/shared/persisted-media-url';\nimport { normalizeAudioPayload } from '../../message-list/components/audio-renderer/audio.payload';\nimport { normalizeFilePayload } from '../../message-list/components/file-renderer/file.payload';\nimport { normalizeImagePayload, resolveImageDisplayUrl } from '../../message-list/components/image-renderer/image.payload';\nimport { normalizeVideoPayload } from '../../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 async function fetchAllConversationMessages(\n messageApi: AXConversationMessageApi,\n conversationId: string,\n pageSize: number,\n): Promise<AXConversationMessage[]> {\n const collected: AXConversationMessage[] = [];\n let page = 0;\n let hasMore = true;\n let cursor: string | undefined;\n\n while (hasMore) {\n const result = await messageApi.getMessages(conversationId, {\n page,\n pageSize,\n cursor,\n });\n\n collected.push(...result.items);\n hasMore = result.hasMore;\n cursor = result.nextCursor;\n page += 1;\n\n if (!result.items.length) {\n break;\n }\n }\n\n return collected.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n}\n","/**\n * Conversation Info Panel — Telegram-inspired profile / group details sheet.\n */\n\nimport { AXClosableComponent, AXComponentCloseEvent } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSwitchModule } from '@acorex/components/switch';\nimport { AXTextBoxComponent } from '@acorex/components/text-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n OnDestroy,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversationAvatarPickerComponent } from '../../../components/shared/avatar-picker.component';\nimport { AXConversationAvatarComponent } from '../../../components/shared/conversation-avatar.component';\nimport { AXConversationRegistryComponentOutletComponent } from '../../../components/shared/registry-component-outlet.component';\nimport type { AXConversation, AXConversationMessage, AXConversationParticipant } from '../../../models';\nimport { AXConversationService } from '../../../services/conversation.service';\nimport { AXConversationMessageUtilsService } from '../../../utils';\nimport {\n fetchAllConversationMessages,\n getConversationMediaCategories,\n getConversationProfileFields,\n type AXConversationMediaCategory,\n} from './conversation-info-panel.utils';\n\ninterface AXInfoPanelQuickAction {\n id: string;\n labelKey: string;\n icon: string;\n danger?: boolean;\n}\n\n@Component({\n selector: 'ax-conversation-info-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FormsModule,\n AXButtonComponent,\n AXDecoratorModule,\n AXLabelComponent,\n AXSearchBoxComponent,\n AXSwitchModule,\n AXTextBoxComponent,\n AXConversationAvatarPickerComponent,\n AXConversationAvatarComponent,\n AXConversationRegistryComponentOutletComponent,\n AXTranslationModule,\n ],\n providers: [\n { provide: AXClosableComponent, useExisting: AXConversationInfoPanelComponent },\n ],\n template: `\n @if (conversation) {\n <div class=\"tg-info-panel\">\n @if (panelView() === 'media' && selectedMediaCategory(); as category) {\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"mediaViewLoader\"\n [inputs]=\"getMediaViewInputs(category)\"\n />\n } @else {\n <div class=\"tg-info-panel__scroll\">\n <section class=\"tg-hero\">\n <ax-conversation-avatar kind=\"auto\" [conversation]=\"conversation\" [size]=\"96\" />\n <h2 class=\"tg-hero__title\">{{ conversation.title }}</h2>\n <p class=\"tg-hero__subtitle\">{{ heroSubtitle() }}</p>\n </section>\n\n <section class=\"tg-quick-actions\">\n @for (action of quickActions(); track action.id) {\n <button\n type=\"button\"\n class=\"tg-quick-action\"\n [class.tg-quick-action--danger]=\"action.danger\"\n [class.tg-quick-action--active]=\"action.id === 'mute' && isConversationMuted()\"\n (click)=\"onQuickAction(action.id)\"\n >\n <span class=\"tg-quick-action__icon\"><i [class]=\"action.icon\"></i></span>\n <span class=\"tg-quick-action__label\">{{ action.labelKey | translate | async }}</span>\n </button>\n }\n </section>\n\n <nav class=\"tg-tabs\" role=\"tablist\">\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'profile'\"\n [attr.aria-selected]=\"activeTab() === 'profile'\"\n (click)=\"setActiveTab('profile')\"\n >\n {{ '@acorex:chat.info-panel.tabs.profile' | translate | async }}\n </button>\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'manage'\"\n [attr.aria-selected]=\"activeTab() === 'manage'\"\n (click)=\"setActiveTab('manage')\"\n >\n {{ '@acorex:chat.info-panel.tabs.manage' | translate | async }}\n </button>\n </nav>\n\n @if (activeTab() === 'profile') {\n @if (profileFields().length > 0) {\n <section class=\"tg-section tg-details\">\n @for (field of profileFields(); track field.id) {\n <div class=\"tg-detail-row\">\n <span class=\"tg-detail-row__icon\"><i [class]=\"field.icon\"></i></span>\n <div class=\"tg-detail-row__content\">\n <span class=\"tg-detail-row__value\">{{ field.value }}</span>\n <span class=\"tg-detail-row__label\">{{ field.labelKey | translate | async }}</span>\n </div>\n </div>\n }\n </section>\n }\n\n @if (loadingMessages()) {\n <div class=\"tg-loading\">{{ '@acorex:chat.info-panel.media.loading' | translate | async }}</div>\n } @else if (mediaCategories().length > 0) {\n <section class=\"tg-section tg-media\">\n @for (category of mediaCategories(); track category.id) {\n <button type=\"button\" class=\"tg-media-row\" (click)=\"openMediaCategory(category)\">\n <span class=\"tg-media-row__icon\"><i [class]=\"category.icon\"></i></span>\n <span class=\"tg-media-row__label\">{{ getMediaRowLabel(category) }}</span>\n <i class=\"fa-light fa-chevron-right tg-media-row__chevron\"></i>\n </button>\n }\n </section>\n }\n\n @if (isGroupConversation()) {\n <section class=\"tg-section tg-members\">\n <div class=\"tg-section-header tg-section-header--row\">\n <span class=\"tg-section-header__title\">{{ membersSectionTitle() }}</span>\n <div class=\"tg-section-header__actions\">\n <button\n type=\"button\"\n class=\"tg-icon-btn\"\n (click)=\"toggleMemberSearch()\"\n [attr.aria-label]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n >\n <i class=\"fa-light fa-magnifying-glass\"></i>\n </button>\n </div>\n </div>\n @if (showMemberSearch()) {\n <div class=\"tg-members-search-wrap\">\n <ax-search-box\n class=\"tg-members-search\"\n [value]=\"memberSearchQuery()\"\n (valueChange)=\"onMemberSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n ></ax-search-box>\n </div>\n }\n @for (participant of filteredMembers(); track participant.id) {\n <div class=\"tg-member-row\">\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"participant.id\"\n [conversation]=\"conversation\"\n [size]=\"42\"\n />\n <div class=\"tg-member-row__content\">\n <span class=\"tg-member-row__name\">{{ participant.name }}</span>\n <span\n class=\"tg-member-row__meta\"\n [class.tg-member-row__meta--online]=\"participant.status === 'online'\"\n >\n {{ getMemberSubtitle(participant) }}\n </span>\n </div>\n @if (getMemberRoleLabel(participant); as roleLabel) {\n <span class=\"tg-member-row__badge\">{{ roleLabel | translate | async }}</span>\n }\n </div>\n }\n </section>\n }\n }\n\n @if (activeTab() === 'manage') {\n <section class=\"tg-section tg-manage\">\n @if (!isPrivateConversation()) {\n <div class=\"tg-manage-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.group-details.title' | translate | async\n }}</ax-label>\n <ax-text-box\n [value]=\"editTitle\"\n (valueChange)=\"onGroupTitleChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.enter-group-title' | translate | async\"\n ></ax-text-box>\n <div class=\"tg-manage-avatar\">\n <ax-conversation-avatar-picker\n [(avatarUrl)]=\"editAvatar\"\n (avatarUrlChange)=\"onGroupAvatarChange($event)\"\n ></ax-conversation-avatar-picker>\n </div>\n </div>\n }\n\n <div class=\"tg-setting-row\">\n <div class=\"tg-setting-row__info\">\n <span class=\"tg-setting-row__title\">{{\n '@acorex:chat.info-panel.settings.archived' | translate | async\n }}</span>\n <span class=\"tg-setting-row__desc\">{{\n '@acorex:chat.info-panel.settings.archived-description' | translate | async\n }}</span>\n </div>\n <ax-switch [(ngModel)]=\"archived\" (ngModelChange)=\"onArchivedChange($event)\"></ax-switch>\n </div>\n\n <div class=\"tg-manage-block tg-background-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.background.title' | translate | async\n }}</ax-label>\n <p class=\"tg-background-desc\">\n {{ '@acorex:chat.info-panel.background.description' | translate | async }}\n </p>\n <div class=\"tg-background-grid\">\n @for (preset of backgroundPresets; track preset.id) {\n <button\n type=\"button\"\n class=\"tg-background-swatch\"\n [class.tg-background-swatch--active]=\"isBackgroundSelected(preset.value)\"\n [style.background]=\"preset.value\"\n (click)=\"applyMessageListBackground(preset.value)\"\n [attr.aria-label]=\"getBackgroundAriaLabel(preset.label)\"\n >\n <span class=\"tg-background-swatch__label\">{{ preset.label }}</span>\n </button>\n }\n </div>\n <ax-button\n [text]=\"'@acorex:chat.info-panel.actions.reset-to-default' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"applyMessageListBackground('')\"\n ></ax-button>\n </div>\n </section>\n }\n </div>\n }\n </div>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .tg-info-panel {\n display: flex;\n flex-direction: column;\n max-height: min(85vh, 40rem);\n }\n\n .tg-info-panel__scroll {\n overflow-y: auto;\n overscroll-behavior: contain;\n }\n\n .tg-hero {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n padding: 1.25rem 1.5rem 1rem;\n text-align: center;\n }\n\n .tg-hero__title {\n margin: 0.25rem 0 0;\n font-size: 1.25rem;\n font-weight: 600;\n line-height: 1.35;\n color: rgb(var(--ax-sys-color-on-surface));\n word-break: break-word;\n }\n\n .tg-hero__subtitle {\n margin: 0;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.65;\n }\n\n .tg-quick-actions {\n display: flex;\n justify-content: center;\n gap: 0.35rem;\n padding: 0 0.75rem 1rem;\n flex-wrap: nowrap;\n }\n\n .tg-quick-action {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.35rem;\n flex: 1;\n min-width: 0;\n max-width: 5.5rem;\n padding: 0.55rem 0.4rem;\n border: none;\n border-radius: 0.75rem;\n background: rgb(var(--ax-sys-color-lighter-surface));\n color: rgb(var(--ax-sys-color-primary-500));\n cursor: pointer;\n transition: background-color 0.15s ease;\n }\n\n .tg-quick-action:hover {\n background: rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .tg-quick-action--danger {\n color: rgb(var(--ax-sys-color-danger-500));\n }\n\n .tg-quick-action--active {\n background: rgba(var(--ax-sys-color-warning-500), 0.14);\n color: rgb(var(--ax-sys-color-warning-500));\n }\n\n .tg-quick-action--active .tg-quick-action__label {\n color: rgb(var(--ax-sys-color-warning-500));\n opacity: 1;\n }\n\n .tg-quick-action__icon {\n font-size: 1.125rem;\n line-height: 1;\n }\n\n .tg-quick-action__label {\n font-size: 0.6875rem;\n font-weight: 500;\n line-height: 1.1;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.85;\n text-align: center;\n }\n\n .tg-tabs {\n display: flex;\n gap: 0;\n margin: 0 0.75rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .tg-tab {\n flex: 1;\n padding: 0.65rem 0.5rem;\n border: none;\n border-bottom: 2px solid transparent;\n background: transparent;\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.55;\n cursor: pointer;\n transition:\n opacity 0.15s ease,\n color 0.15s ease,\n border-color 0.15s ease;\n }\n\n .tg-tab:hover {\n opacity: 0.8;\n }\n\n .tg-tab--active {\n opacity: 1;\n color: rgb(var(--ax-sys-color-primary-500));\n border-bottom-color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .tg-section {\n padding: 0.25rem 0;\n }\n\n .tg-detail-row,\n .tg-member-row {\n display: flex;\n align-items: center;\n gap: 0.875rem;\n padding: 0.65rem 1rem;\n min-width: 0;\n }\n\n .tg-media-row {\n display: flex;\n align-items: center;\n gap: 0.875rem;\n width: 100%;\n padding: 0.7rem 1rem;\n border: none;\n background: transparent;\n text-align: start;\n cursor: pointer;\n transition: background-color 0.15s ease;\n }\n\n .tg-media-row:hover {\n background: rgb(var(--ax-sys-color-lighter-surface));\n }\n\n .tg-media-row__icon {\n flex-shrink: 0;\n width: 1.5rem;\n text-align: center;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.75;\n }\n\n .tg-media-row__label {\n flex: 1;\n min-width: 0;\n font-size: 0.9375rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .tg-media-row__chevron {\n flex-shrink: 0;\n font-size: 0.75rem;\n opacity: 0.45;\n }\n\n .tg-loading {\n padding: 0.75rem 1rem 1rem;\n font-size: 0.8125rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.6;\n text-align: center;\n }\n\n .tg-detail-row__icon {\n flex-shrink: 0;\n width: 1.5rem;\n text-align: center;\n color: rgb(var(--ax-sys-color-primary-500));\n opacity: 0.9;\n }\n\n .tg-detail-row__content,\n .tg-member-row__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n }\n\n .tg-detail-row__value,\n .tg-member-row__name {\n font-size: 0.9375rem;\n font-weight: 500;\n line-height: 1.3;\n color: rgb(var(--ax-sys-color-on-surface));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .tg-detail-row__label,\n .tg-member-row__meta {\n font-size: 0.75rem;\n line-height: 1.2;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.6;\n }\n\n .tg-member-row__meta--online {\n color: rgb(var(--ax-sys-color-primary-500));\n opacity: 1;\n }\n\n .tg-section-header {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n padding: 0.75rem 1rem 0.35rem;\n }\n\n .tg-section-header--row {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n }\n\n .tg-section-header__actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n\n .tg-icon-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: none;\n border-radius: 999px;\n background: transparent;\n color: rgb(var(--ax-sys-color-primary-500));\n cursor: pointer;\n }\n\n .tg-icon-btn:hover {\n background: rgb(var(--ax-sys-color-lighter-surface));\n }\n\n .tg-members-search-wrap {\n padding: 0 1rem 0.5rem;\n }\n\n .tg-section-header__title {\n font-size: 0.75rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.55;\n }\n\n .tg-members-search {\n width: 100%;\n }\n\n .tg-member-row__badge {\n flex-shrink: 0;\n padding: 0.15rem 0.5rem;\n border-radius: 999px;\n font-size: 0.6875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-primary-500));\n background: rgba(var(--ax-sys-color-primary-500), 0.14);\n }\n\n .tg-manage {\n padding: 0.75rem 1rem 1rem;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .tg-manage-block {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .tg-manage-label {\n font-size: 0.8125rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .tg-setting-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n padding: 0.5rem 0;\n }\n\n .tg-setting-row__info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n }\n\n .tg-setting-row__title {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .tg-setting-row__desc {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.65;\n }\n\n .tg-background-desc {\n margin: 0;\n font-size: 0.75rem;\n opacity: 0.7;\n }\n\n .tg-background-grid {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 0.5rem;\n }\n\n .tg-background-swatch {\n position: relative;\n height: 2.75rem;\n border-radius: 0.5rem;\n border: 2px solid transparent;\n cursor: pointer;\n overflow: hidden;\n }\n\n .tg-background-swatch--active {\n border-color: rgb(var(--ax-sys-color-primary-500));\n }\n\n .tg-background-swatch__label {\n position: absolute;\n inset-inline-start: 0.35rem;\n bottom: 0.2rem;\n font-size: 0.65rem;\n letter-spacing: 0.1rem;\n font-weight: 300;\n mix-blend-mode: difference;\n color: #fff;\n }\n\n .tg-danger {\n padding: 0.25rem 0 0.75rem;\n }\n\n .tg-danger-row {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n width: 100%;\n padding: 0.75rem 1rem;\n border: none;\n background: transparent;\n font-size: 0.9375rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-danger-500));\n cursor: pointer;\n text-align: start;\n }\n\n .tg-danger-row:hover {\n background: rgba(var(--ax-sys-color-danger-500), 0.06);\n }\n `,\n ],\n})\nexport class AXConversationInfoPanelComponent extends AXClosableComponent implements OnInit, OnDestroy {\n private readonly toastService = inject(AXToastService);\n readonly translation = inject(AXTranslationService);\n private readonly injectedConversationService = inject(AXConversationService, { optional: true });\n\n readonly onClosed = output<AXComponentCloseEvent>();\n\n conversation!: AXConversation;\n conversationService!: AXConversationService;\n\n readonly activeTab = signal<'profile' | 'manage'>('profile');\n readonly showMemberSearch = signal(false);\n readonly panelView = signal<'main' | 'media'>('main');\n readonly selectedMediaCategory = signal<AXConversationMediaCategory | null>(null);\n readonly mediaViewLoader = () =>\n import('./conversation-info-media-view.component').then((m) => m.AXConversationInfoMediaViewComponent);\n readonly conversationMessages = signal<AXConversationMessage[]>([]);\n readonly loadingMessages = signal(false);\n readonly memberSearchQuery = signal('');\n\n archived = false;\n\n private initialNotifications = false;\n private initialArchived = false;\n\n editTitle = '';\n editAvatar = '';\n\n private groupTitleSaveTimer: ReturnType<typeof setTimeout> | undefined;\n private groupDetailsSaveInFlight = false;\n\n readonly backgroundPresets: Array<{ id: string; label: string; value: string }> = [\n {\n id: 'solid-default',\n label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.default'),\n value: 'rgb(var(--ax-sys-color-primary-lightest-surface))',\n },\n {\n id: 'solid-graphite',\n label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.graphite'),\n value: 'rgb(var(--ax-sys-color-lighter-surface))',\n },\n {\n id: 'solid-olive',\n label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.olive'),\n value: 'rgba(132, 144, 88, 0.24)',\n },\n {\n id: 'solid-sky',\n label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.sky'),\n value: 'rgba(56, 189, 248, 0.2)',\n },\n {\n id: 'grad-aurora',\n label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.aurora'),\n value: 'linear-gradient(140deg, #60a5fa 0%, #a78bfa 55%, #f472b6 100%)',\n },\n {\n id: 'grad-sunset',\n label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.sunset'),\n value: 'linear-gradient(140deg, rgba(251, 113, 133, 0.34) 0%, rgba(251, 191, 36, 0.32) 100%)',\n },\n ];\n\n readonly heroSubtitle = computed(() => {\n const conversation = this.liveConversation();\n if (!conversation) return '';\n return AXConversationMessageUtilsService.getConversationSubtitle(conversation);\n });\n\n readonly liveConversation = computed(() => {\n const conversation = this.conversation;\n if (!conversation?.id) return conversation;\n const fromStore = this.conversationService?.conversations().find((c) => c.id === conversation.id);\n return fromStore ?? conversation;\n });\n\n readonly isConversationMuted = computed(\n () => this.liveConversation()?.settings?.notifications === false,\n );\n\n readonly profileFields = computed(() => {\n const conversation = this.liveConversation();\n if (!conversation) return [];\n return getConversationProfileFields(conversation, this.conversationService?.currentUser()?.id);\n });\n\n readonly mediaCategories = computed(() => {\n if (!this.conversation) return [];\n return getConversationMediaCategories(this.conversationMessages());\n });\n\n readonly quickActions = computed((): AXInfoPanelQuickAction[] => {\n if (!this.conversation) return [];\n const muted = this.isConversationMuted();\n const actions: AXInfoPanelQuickAction[] = [\n {\n id: 'mute',\n labelKey: muted ? '@acorex:chat.actions.unmute' : '@acorex:chat.actions.mute',\n icon: muted ? 'fa-light fa-bell-slash' : 'fa-light fa-bell',\n },\n ];\n\n if (!this.isPrivateConversation()) {\n actions.push({\n id: 'leave',\n labelKey: '@acorex:chat.actions.leave-and-delete',\n icon: 'fa-light fa-door-open',\n danger: true,\n });\n }\n\n return actions;\n });\n\n readonly filteredMembers = computed(() => {\n if (!this.conversation) return [];\n const query = this.memberSearchQuery().toLowerCase().trim();\n const members = this.conversation?.participants ?? [];\n if (!query) return members;\n return members.filter(\n (p) =>\n p.name.toLowerCase().includes(query) ||\n (p.description ?? '').toLowerCase().includes(query) ||\n (p.role ?? '').toLowerCase().includes(query),\n );\n });\n\n ngOnInit(): void {\n const resolvedService = this.conversationService ?? this.injectedConversationService;\n if (!resolvedService) {\n console.warn('AXConversationInfoPanelComponent opened without conversationService.');\n this.close();\n return;\n }\n this.conversationService = resolvedService;\n\n if (!this.conversation) {\n const activeConversation = this.conversationService.activeConversation();\n if (activeConversation) {\n this.conversation = activeConversation;\n } else {\n console.warn('AXConversationInfoPanelComponent opened without conversation context.');\n this.close();\n return;\n }\n }\n\n this.initialNotifications = this.conversation.settings?.notifications ?? true;\n this.archived = this.conversation.archived ?? false;\n\n this.initialArchived = this.archived;\n\n this.editTitle = this.conversation.title || '';\n this.editAvatar = this.conversation.avatar || '';\n\n void this.loadConversationMessages();\n }\n\n private async loadConversationMessages(): Promise<void> {\n this.loadingMessages.set(true);\n try {\n if (this.conversationService.activeConversationId() === this.conversation.id) {\n const activeMessages = this.conversationService.activeMessages();\n if (activeMessages.length > 0) {\n this.conversationMessages.set(activeMessages);\n }\n }\n\n const messages = await fetchAllConversationMessages(\n this.conversationService.messageApi,\n this.conversation.id,\n 30,\n );\n this.conversationMessages.set(messages);\n } catch (error) {\n console.error('Failed to load conversation media messages:', error);\n } finally {\n this.loadingMessages.set(false);\n }\n }\n\n isPrivateConversation(): boolean {\n return this.conversation.type === 'private';\n }\n\n isGroupConversation(): boolean {\n return this.conversation.type === 'group' || this.conversation.type === 'channel';\n }\n\n membersSectionTitle(): string {\n return this.translation.translateSync('@acorex:chat.info-panel.tabs.members-count-upper', {\n params: { count: this.conversation.participants.length },\n });\n }\n\n getMemberRoleLabel(participant: AXConversationParticipant): string | null {\n switch (participant.role) {\n case 'admin':\n return '@acorex:chat.info-panel.member-role.admin';\n case 'moderator':\n return '@acorex:chat.info-panel.member-role.moderator';\n default:\n return null;\n }\n }\n\n onMemberSearchChange(value: string | null | undefined): void {\n this.memberSearchQuery.set(value ?? '');\n }\n\n setActiveTab(tab: 'profile' | 'manage'): void {\n this.activeTab.set(tab);\n }\n\n toggleMemberSearch(): void {\n this.showMemberSearch.update((value) => !value);\n if (!this.showMemberSearch()) {\n this.memberSearchQuery.set('');\n }\n }\n\n openMediaCategory(category: AXConversationMediaCategory): void {\n this.selectedMediaCategory.set(category);\n this.panelView.set('media');\n }\n\n closeMediaView(): void {\n this.panelView.set('main');\n this.selectedMediaCategory.set(null);\n }\n\n getMediaViewInputs(category: AXConversationMediaCategory): Record<string, unknown> {\n return {\n category,\n messages: this.conversationMessages(),\n conversation: this.conversation,\n conversationService: this.conversationService,\n onBack: () => this.closeMediaView(),\n };\n }\n\n getMediaRowLabel(category: AXConversationMediaCategory): string {\n return this.translation.translateSync(category.countLabelKey, {\n params: { count: category.count },\n });\n }\n\n getMemberSubtitle(participant: AXConversationParticipant): string {\n if (participant.status === 'online') {\n return this.translation.translateSync('@acorex:chat.status.online');\n }\n if (participant.description?.trim()) return participant.description.trim();\n if (participant.role && participant.role !== 'member') return participant.role;\n return '';\n }\n\n onQuickAction(actionId: string): void {\n switch (actionId) {\n case 'mute':\n void this.toggleConversationMute();\n break;\n case 'leave':\n void this.onLeave();\n break;\n }\n }\n\n async toggleConversationMute(): Promise<void> {\n const notificationsEnabled = this.liveConversation()?.settings?.notifications ?? true;\n await this.onNotificationsChange(!notificationsEnabled);\n }\n\n async onNotificationsChange(value: boolean): Promise<void> {\n try {\n await this.conversationService.updateConversationSettings(this.conversation.id, {\n notifications: value,\n });\n const settings = this.conversation.settings ?? { notifications: true, showPreview: true };\n this.conversation.settings = { ...settings, notifications: value };\n } catch (error) {\n console.error('Failed to update notifications:', error);\n }\n }\n\n async onArchivedChange(value: boolean): Promise<void> {\n const previous = this.archived;\n this.archived = value;\n try {\n await this.conversationService.updateConversation(this.conversation.id, { archived: value });\n this.conversation.archived = value;\n this.initialArchived = value;\n } catch {\n this.archived = previous;\n }\n }\n\n close(data?: unknown): void {\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = data;\n this.onClosed.emit(event);\n }\n\n closeAll(): void {\n this.close();\n }\n\n async onLeave(): Promise<void> {\n const isGroup = this.isGroupConversation();\n await this.conversationService.deleteConversation(this.conversation.id);\n\n if (this.conversationService.activeConversation()?.id === this.conversation.id) {\n this.conversationService.closeActiveConversation();\n }\n\n this.toastService.success(\n isGroup\n ? this.translation.translateSync('@acorex:chat.info-panel.toasts.left-conversation')\n : this.translation.translateSync('@acorex:chat.info-panel.toasts.deleted-conversation'),\n );\n this.close();\n }\n\n onGroupTitleChange(value: string): void {\n this.editTitle = value;\n clearTimeout(this.groupTitleSaveTimer);\n this.groupTitleSaveTimer = setTimeout(() => void this.persistGroupDetails(), 400);\n }\n\n onGroupAvatarChange(value: string): void {\n this.editAvatar = value;\n void this.persistGroupDetails();\n }\n\n private async persistGroupDetails(): Promise<void> {\n if (this.isPrivateConversation() || this.groupDetailsSaveInFlight) {\n return;\n }\n\n const title = this.editTitle.trim();\n if (!title) {\n return;\n }\n\n const nextAvatar = this.editAvatar.trim() || undefined;\n const currentTitle = this.conversation.title || '';\n const currentAvatar = this.conversation.avatar || undefined;\n\n if (title === currentTitle && nextAvatar === currentAvatar) {\n return;\n }\n\n this.groupDetailsSaveInFlight = true;\n try {\n await this.conversationService.updateConversation(this.conversation.id, {\n title,\n avatar: nextAvatar,\n });\n this.conversation.title = title;\n this.conversation.avatar = nextAvatar;\n } catch (error) {\n console.error('Failed to update group details:', error);\n this.toastService.danger(this.translation.translateSync('@acorex:chat.info-panel.toasts.failed-group-update'));\n } finally {\n this.groupDetailsSaveInFlight = false;\n }\n }\n\n isBackgroundSelected(value: string): boolean {\n const bg = this.conversation?.metadata?.['messageListBackground'];\n return (typeof bg === 'string' ? bg : '') === value;\n }\n\n async applyMessageListBackground(value: string): Promise<void> {\n try {\n const metadata = {\n ...(this.conversation.metadata ?? {}),\n messageListBackground: value,\n };\n await this.conversationService.updateConversationMetadata(this.conversation.id, metadata);\n this.conversation.metadata = metadata;\n this.toastService.success(\n value\n ? this.translation.translateSync('@acorex:chat.info-panel.toasts.background-updated')\n : this.translation.translateSync('@acorex:chat.info-panel.toasts.background-reset'),\n );\n } catch (error) {\n console.error('Failed to update message list background:', error);\n this.toastService.danger(\n this.translation.translateSync('@acorex:chat.info-panel.toasts.failed-background-update'),\n );\n }\n }\n\n getBackgroundAriaLabel(label: string): string {\n return this.translation.translateSync('@acorex:chat.info-panel.background.set-label', {\n params: { label },\n });\n }\n\n ngOnDestroy(): void {\n if (this.groupTitleSaveTimer) {\n clearTimeout(this.groupTitleSaveTimer);\n this.groupTitleSaveTimer = undefined;\n void this.persistGroupDetails();\n }\n\n const currentNotifications = this.liveConversation()?.settings?.notifications ?? true;\n const hasChanges =\n currentNotifications !== this.initialNotifications ||\n this.archived !== this.initialArchived;\n\n if (hasChanges) {\n this.toastService.success(this.translation.translateSync('@acorex:chat.info-panel.toasts.settings-saved'));\n }\n }\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","/** 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 '0 B';\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 return `${Math.round((bytes / k ** i) * 100) / 100} ${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\n effect(() => {\n const ref = reference();\n abortController?.abort();\n abortController = new AbortController();\n\n const trimmedUrl = ref?.url?.trim();\n if (!trimmedUrl && !ref?.mediaId) {\n resolvedUrl.set(null);\n return;\n }\n\n const directUrl =\n trimmedUrl && !isNonPersistableMediaUrl(trimmedUrl) ? trimmedUrl : undefined;\n\n if (!ref?.mediaId) {\n resolvedUrl.set(directUrl ?? null);\n return;\n }\n\n resolvedUrl.set(directUrl ?? null);\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 && directUrl) {\n resolvedUrl.set(directUrl);\n }\n });\n });\n\n destroyRef.onDestroy(() => abortController?.abort());\n\n return resolvedUrl.asReadonly();\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ElementRef, computed, input, output, viewChild } 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],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-audio\">\n <span class=\"ax-conversation-audio__icon\" aria-hidden=\"true\"><i class=\"fa-light fa-music\"></i></span>\n <div class=\"ax-conversation-audio__main\">\n <span class=\"ax-conversation-audio__title\">{{ title() }}</span>\n <audio\n #audioElement\n class=\"ax-conversation-audio__el\"\n [src]=\"audioUrl() || null\"\n controls\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 <!-- @if (duration() > 0) {\n <span class=\"ax-conversation-audio__time\">{{ durationLabel() }}</span>\n } -->\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .ax-conversation-audio {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n min-width: 22rem;\n min-height: 2.75rem;\n padding: 0.5rem 0.625rem;\n border-radius: var(--ax-sys-border-radius, 0.5rem);\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-surface));\n }\n\n .ax-conversation-audio__icon {\n flex-shrink: 0;\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n background: rgba(var(--ax-sys-color-primary-500), 0.1);\n color: rgb(var(--ax-sys-color-primary-500));\n font-size: 0.875rem;\n }\n\n .ax-conversation-audio__main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .ax-conversation-audio__title {\n font-size: 0.75rem;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .ax-conversation-audio__el {\n width: 100%;\n height: 1.75rem;\n }\n\n .ax-conversation-audio__time {\n flex-shrink: 0;\n font-size: 0.6875rem;\n font-variant-numeric: tabular-nums;\n color: rgba(var(--ax-sys-color-on-surface), 0.65);\n }\n `,\n ],\n})\nexport class AXConversationAudioAttachmentComponent {\n readonly item = input.required<AXConversationAudioMediaItem>();\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(() => toUploaderReference(this.item()));\n private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n\n readonly audioUrl = computed(() =>\n pickDisplayMediaUrl(this.resolvedUrl(), this.item().url),\n );\n readonly title = computed(() => this.item().title ?? 'Audio');\n readonly duration = computed(() => this.item().duration ?? 0);\n readonly durationLabel = computed(() => formatMediaDuration(this.duration()));\n\n togglePlay(): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl) {\n return;\n }\n if (audioEl.paused) {\n void audioEl.play();\n } else {\n audioEl.pause();\n }\n }\n\n pause(): void {\n this.audioElementRef()?.nativeElement?.pause();\n }\n\n onPlay(): void {\n this.playingChange.emit(true);\n }\n\n onPause(): void {\n this.playingChange.emit(false);\n }\n\n onTimeUpdate(): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl) {\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.durationChange.emit(audioEl.duration);\n }\n }\n\n onEnded(): void {\n this.playingChange.emit(false);\n this.playbackEnded.emit();\n }\n\n onError(): void {\n this.playingChange.emit(false);\n this.playbackError.emit();\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\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 { createResolvedMediaUrlSignal } from './media-url-resolve';\n\n@Component({\n selector: 'ax-conversation-image-attachment',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <button\n type=\"button\"\n class=\"ax-conversation-image-attachment\"\n [class.ax-conversation-image-attachment--ready]=\"ready()\"\n [class.ax-conversation-image-attachment--loading]=\"!displayUrl()\"\n (click)=\"toggleFullscreen($event)\"\n [attr.aria-label]=\"alt()\"\n >\n @if (displayUrl(); as src) {\n <img [src]=\"src\" [alt]=\"alt()\" loading=\"lazy\" (load)=\"onImageLoad()\" (error)=\"onImageError()\" />\n }\n </button>\n `,\n styles: [\n `\n :host {\n display: block;\n min-width: 0;\n min-height: 0;\n }\n\n .ax-conversation-image-attachment {\n display: block;\n width: 100%;\n height: 100%;\n min-height: 4.5rem;\n padding: 0;\n border-radius: 0.5rem;\n border: none;\n background: rgb(var(--ax-sys-color-light-surface));\n overflow: hidden;\n }\n\n .ax-conversation-image-attachment--loading {\n background: rgba(var(--ax-sys-color-on-surface), 0.06);\n }\n\n .ax-conversation-image-attachment img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n\n .ax-conversation-image-attachment img:fullscreen {\n width: 100%;\n height: 100%;\n object-fit: contain;\n background: #000;\n }\n\n .ax-conversation-image-attachment--ready img {\n opacity: 1;\n }\n\n .ax-conversation-image-attachment:focus-visible {\n outline: 2px solid rgb(var(--ax-sys-color-primary-500));\n outline-offset: 2px;\n }\n `,\n ],\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\n readonly ready = signal(false);\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 this.displayUrl();\n this.item().mediaId;\n untracked(() => this.ready.set(false));\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: MouseEvent): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const img = (event.currentTarget as HTMLElement).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","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n input,\n output,\n viewChild,\n} 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 { createResolvedMediaUrlSignal } from './media-url-resolve';\n\n@Component({\n selector: 'ax-conversation-video-attachment',\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-video\">\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 `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .ax-conversation-video {\n width: 100%;\n border-radius: var(--ax-sys-border-radius, 0.5rem);\n overflow: hidden;\n background: rgb(var(--ax-sys-color-darker-surface));\n }\n\n .ax-conversation-video__player {\n width: 100%;\n max-height: min(40dvh, 14rem);\n display: block;\n vertical-align: middle;\n }\n `,\n ],\n})\nexport class AXConversationVideoAttachmentComponent {\n readonly item = input.required<AXConversationVideoMediaItem>();\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\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","/**\n * Shared media browser inside the conversation info panel.\n */\n\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, Injector, input, output } from '@angular/core';\nimport { AXConversationRegistryComponentOutletComponent } from '../../../components/shared/registry-component-outlet.component';\nimport type { AXConversation, AXConversationMessage } from '../../../models';\nimport { AXConversationService } from '../../../services';\nimport { AXConversationAudioAttachmentComponent } from '../../message-list/components/shared/audio-attachment.component';\nimport { AXConversationImageAttachmentComponent } from '../../message-list/components/shared/image-attachment.component';\nimport { AXConversationVideoAttachmentComponent } from '../../message-list/components/shared/video-attachment.component';\nimport {\n buildMediaGalleryTiles,\n filterMessagesByMediaCategory,\n getMessageAudioItems,\n getMessageVideoItems,\n isAttachmentListCategory,\n isGridMediaCategory,\n type AXConversationMediaCategory,\n} from './conversation-info-panel.utils';\n\n@Component({\n selector: 'ax-conversation-info-media-view',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n AXConversationRegistryComponentOutletComponent,\n AXDecoratorModule,\n AXTranslationModule,\n AXConversationImageAttachmentComponent,\n AXConversationVideoAttachmentComponent,\n AXConversationAudioAttachmentComponent,\n ],\n template: `\n <div class=\"tg-media-view\">\n <header class=\"tg-media-view__header\">\n <button type=\"button\" class=\"tg-media-view__back\" (click)=\"handleBack()\" [attr.aria-label]=\"'Back'\">\n <i class=\"fa-light fa-arrow-left\"></i>\n </button>\n <h3 class=\"tg-media-view__title\">{{ titleLabel() }}</h3>\n </header>\n\n @if (items().length === 0) {\n <div class=\"tg-media-view__empty\">\n {{ '@acorex:chat.info-panel.media.empty' | translate | async }}\n </div>\n } @else if (isGrid()) {\n <div class=\"tg-media-view__grid\">\n @for (tile of galleryTiles(); track tile.key) {\n <article\n class=\"tg-media-view__grid-cell\"\n [class.tg-media-view__grid-cell--sticker]=\"tile.kind === 'sticker'\"\n >\n @switch (tile.kind) {\n @case ('image') {\n @if (tile.image; as image) {\n <ax-conversation-image-attachment [item]=\"image\" [alt]=\"'Photo'\" />\n }\n }\n @case ('sticker') {\n @if (tile.stickerUrl) {\n <img\n class=\"tg-media-view__sticker\"\n [src]=\"tile.stickerUrl\"\n [alt]=\"tile.stickerAlt ?? 'Sticker'\"\n loading=\"lazy\"\n />\n }\n }\n }\n </article>\n }\n </div>\n } @else if (isAttachmentList()) {\n <div class=\"tg-media-view__list\">\n @for (message of items(); track message.id) {\n <article class=\"tg-media-view__list-item\">\n <div class=\"tg-media-view__list-body\">\n @if (category().id === 'video') {\n @for (video of getMessageVideoItems(message); track video.mediaId ?? video.url) {\n <ax-conversation-video-attachment [item]=\"video\" />\n }\n } @else {\n @for (audio of getMessageAudioItems(message); track audio.mediaId ?? audio.url) {\n <ax-conversation-audio-attachment [item]=\"audio\" />\n }\n }\n </div>\n <time class=\"tg-media-view__list-meta\">{{ formatTimestamp(message) }}</time>\n </article>\n }\n </div>\n } @else {\n <div class=\"tg-media-view__list\">\n @for (message of items(); track message.id) {\n <article class=\"tg-media-view__list-item\">\n <div class=\"tg-media-view__list-body\">\n <ax-conversation-registry-component-outlet\n [component]=\"getRendererComponent(message)\"\n [componentLoader]=\"getRendererComponentLoader(message)\"\n [inputs]=\"getRendererInputs(message)\"\n />\n </div>\n <time class=\"tg-media-view__list-meta\">{{ formatTimestamp(message) }}</time>\n </article>\n }\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .tg-media-view {\n display: flex;\n flex-direction: column;\n min-height: 12rem;\n max-height: min(85vh, 40rem);\n }\n\n .tg-media-view__header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.65rem 0.75rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n flex-shrink: 0;\n }\n\n .tg-media-view__back {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: none;\n border-radius: 999px;\n background: transparent;\n color: rgb(var(--ax-sys-color-primary-500));\n cursor: pointer;\n }\n\n .tg-media-view__back:hover {\n background: rgb(var(--ax-sys-color-lighter-surface));\n }\n\n .tg-media-view__title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .tg-media-view__empty {\n padding: 2rem 1rem;\n text-align: center;\n font-size: 0.875rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.65;\n }\n\n .tg-media-view__grid {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 2px;\n padding: 2px;\n overflow-y: auto;\n overscroll-behavior: contain;\n background: rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .tg-media-view__grid-cell {\n position: relative;\n aspect-ratio: 1;\n overflow: hidden;\n background: rgb(var(--ax-sys-color-lighter-surface));\n }\n\n .tg-media-view__grid-cell--sticker {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.35rem;\n }\n\n .tg-media-view__grid-cell ::ng-deep ax-conversation-image-attachment,\n .tg-media-view__grid-cell ::ng-deep .ax-conversation-image-attachment {\n width: 100%;\n height: 100%;\n min-height: 0;\n border-radius: 0;\n }\n\n .tg-media-view__grid-cell ::ng-deep img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .tg-media-view__sticker {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n }\n\n .tg-media-view__list {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n overscroll-behavior: contain;\n }\n\n .tg-media-view__list-item {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .tg-media-view__list-item:last-child {\n border-bottom: none;\n }\n\n .tg-media-view__list-body {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .tg-media-view__list-body ::ng-deep .ax-conversation-msg {\n max-width: 100%;\n }\n\n .tg-media-view__list-body ::ng-deep ax-conversation-message-renderer-state {\n display: none;\n }\n\n .tg-media-view__list-body ::ng-deep .ax-conversation-video__player {\n max-height: min(50vh, 16rem);\n }\n\n .tg-media-view__list-meta {\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.55;\n }\n `,\n ],\n})\nexport class AXConversationInfoMediaViewComponent {\n private readonly translation = inject(AXTranslationService);\n private readonly parentInjector = inject(Injector);\n\n readonly category = input.required<AXConversationMediaCategory>();\n readonly messages = input.required<AXConversationMessage[]>();\n readonly conversation = input.required<AXConversation>();\n readonly conversationServiceInput = input.required<AXConversationService>({ alias: 'conversationService' });\n /** Callback for lazy outlet wiring (alternative to the `back` output). */\n readonly onBack = input<(() => void) | undefined>(undefined);\n\n readonly back = output<void>();\n\n readonly items = computed(() => filterMessagesByMediaCategory(this.messages(), this.category().id));\n readonly isGrid = computed(() => isGridMediaCategory(this.category().id));\n readonly isAttachmentList = computed(() => isAttachmentListCategory(this.category().id));\n readonly galleryTiles = computed(() => buildMediaGalleryTiles(this.messages(), this.category().id));\n\n readonly rendererInjector = computed(() =>\n Injector.create({\n providers: [{ provide: AXConversationService, useValue: this.conversationServiceInput() }],\n parent: this.parentInjector,\n }),\n );\n\n readonly titleLabel = computed(() =>\n this.translation.translateSync(this.category().countLabelKey, {\n params: { count: this.category().count },\n }),\n );\n\n readonly getMessageVideoItems = getMessageVideoItems;\n readonly getMessageAudioItems = getMessageAudioItems;\n\n getRendererComponent(message: AXConversationMessage) {\n const renderer = this.conversationServiceInput().registry.messageRenderers.getRenderer(message);\n return renderer?.component;\n }\n\n getRendererComponentLoader(message: AXConversationMessage) {\n const renderer = this.conversationServiceInput().registry.messageRenderers.getRenderer(message);\n if (renderer?.componentLoader) {\n return renderer.componentLoader;\n }\n if (!renderer?.component) {\n return () =>\n import('../../message-list/components/fallback-renderer/fallback-renderer.component').then(\n (m) => m.AXConversationFallbackRendererComponent,\n );\n }\n return undefined;\n }\n\n getRendererInputs(message: AXConversationMessage) {\n return { message };\n }\n\n formatTimestamp(message: AXConversationMessage): string {\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(message.timestamp);\n }\n\n handleBack(): void {\n this.onBack()?.();\n this.back.emit();\n }\n}\n","/**\n * Search Component for Info Bar\n * Provides search functionality within conversations\n */\n\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, DestroyRef, PLATFORM_ID, computed, effect, inject, input } from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../components/info-bar/info-bar.service';\nimport type { AXConversation, AXConversationTextPayload } from '../../../models';\nimport { AXConversationService } from '../../../services/conversation.service';\n\n@Component({\n selector: 'ax-conversation-info-bar-search',\n imports: [CommonModule, AXSearchBoxComponent, AXButtonComponent, AXLabelComponent],\n template: `\n <div class=\"search-wrapper\">\n <ax-search-box\n class=\"search-input\"\n [placeholder]=\"'Search in conversation'\"\n [value]=\"searchQuery()\"\n (onValueChanged)=\"onSearchChange($event.value)\"\n ></ax-search-box>\n\n @if (searchQuery() && resultsCount() > 0) {\n <div class=\"search-results\">\n <ax-label class=\"results-text\"> {{ currentIndex() + 1 }} / {{ resultsCount() }} </ax-label>\n <ax-button\n class=\"nav-button\"\n [text]=\"'↑'\"\n [look]=\"'ghost'\"\n [size]=\"'sm'\"\n (onClick)=\"onPrevious()\"\n [disabled]=\"resultsCount() === 0\"\n ></ax-button>\n <ax-button\n class=\"nav-button\"\n [text]=\"'↓'\"\n [look]=\"'ghost'\"\n [size]=\"'sm'\"\n (onClick)=\"onNext()\"\n [disabled]=\"resultsCount() === 0\"\n ></ax-button>\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n flex: 1;\n min-width: 0;\n }\n\n .search-wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n }\n\n .search-input {\n flex: 1;\n min-width: 0;\n }\n\n .search-results {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n flex-shrink: 0;\n }\n\n .results-text {\n font-size: 0.75rem;\n color: var(--ax-text-secondary, #6b7280);\n white-space: nowrap;\n }\n\n .nav-button {\n min-width: 28px;\n height: 28px;\n padding: 0;\n }\n `,\n ],\n})\nexport class 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\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 /** Messages from conversation */\n readonly messages = computed(() => {\n // Get messages from active conversation\n const activeConv = this.conversationService.activeConversation();\n if (activeConv?.id === this.conversation().id) {\n return this.conversationService.activeMessages();\n }\n return [];\n });\n\n private scrollTimer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n effect(() => {\n const query = this.searchQuery();\n if (query) {\n this.performSearch(query);\n } else {\n this.infoBarService.setSearchResults(0, 0);\n }\n });\n\n this.destroyRef.onDestroy(() => {\n if (this.scrollTimer) clearTimeout(this.scrollTimer);\n });\n }\n\n /** Handle search input change */\n onSearchChange(value: string): void {\n this.infoBarService.setSearchQuery(value);\n }\n\n /** Perform search in messages */\n private performSearch(query: string): void {\n const messages = this.messages();\n const lowerQuery = query.toLowerCase();\n\n const results = messages.filter((msg) => {\n if (msg.type === 'text') {\n const text = (msg.payload as AXConversationTextPayload)?.text || '';\n return text.toLowerCase().includes(lowerQuery);\n }\n return false;\n });\n\n this.infoBarService.setSearchResults(results.length, 0);\n\n // Scroll to first result if exists\n if (results.length > 0) {\n this.scrollToResult(results[0].id);\n }\n }\n\n /** Navigate to next result */\n onNext(): void {\n this.infoBarService.nextSearchResult();\n this.scrollToCurrentResult();\n }\n\n /** Navigate to previous result */\n onPrevious(): void {\n this.infoBarService.previousSearchResult();\n this.scrollToCurrentResult();\n }\n\n /** Scroll to current search result */\n private scrollToCurrentResult(): void {\n const query = this.searchQuery();\n const currentIdx = this.currentIndex();\n const messages = this.messages();\n const lowerQuery = query.toLowerCase();\n\n // Find the nth matching message\n let matchCount = 0;\n for (const msg of messages) {\n if (msg.type === 'text') {\n const text = (msg.payload as AXConversationTextPayload)?.text || '';\n if (text.toLowerCase().includes(lowerQuery)) {\n if (matchCount === currentIdx) {\n this.scrollToResult(msg.id);\n break;\n }\n matchCount++;\n }\n }\n }\n }\n\n 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","/**\n * Info Bar Actions Plugin\n * Individual info bar action constants\n */\n\nimport { inject } from '@angular/core';\nimport { AXConversationInfoBarAction } from '../../../registries';\nimport { AXConversationService } from '../../../services';\n\n/**\n * Search in conversation action (inline)\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: '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 context.conversation.settings.notifications ? '@acorex:chat.actions.mute' : '@acorex:chat.actions.unmute',\n icon: (context) => (context.conversation.settings.notifications ? 'fa-light fa-bell-slash' : 'fa-light fa-bell'),\n location: 'menu',\n priority: 90,\n handler: async (context) => {\n await inject(AXConversationService).updateConversationSettings(context.conversation.id, {\n notifications: !context.conversation.settings.notifications,\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 const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n return isGroup ? '@acorex:chat.actions.leave-and-delete' : '@acorex:chat.actions.delete';\n },\n icon: (context) => {\n const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n return isGroup ? 'fa-light fa-door-open' : 'fa-light fa-trash';\n },\n location: 'menu',\n priority: 60,\n destructive: true,\n handler: async (context) => {\n 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","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { AXConversationFileMediaItem } from '../../../../models';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { toUploaderReference } from './attachment-uploader-reference';\nimport { formatFileByteSize } from './format-media';\nimport { createResolvedMediaUrlSignal } from './media-url-resolve';\n\nconst AX_CONVERSATION_EXT_COLORS: Record<string, string> = {\n pdf: 'rgb(var(--ax-sys-color-danger-500))',\n doc: 'rgb(var(--ax-sys-color-primary-500))',\n docx: 'rgb(var(--ax-sys-color-primary-500))',\n xls: 'rgb(var(--ax-sys-color-success-500))',\n xlsx: 'rgb(var(--ax-sys-color-success-500))',\n ppt: 'rgb(var(--ax-sys-color-warning-500))',\n pptx: 'rgb(var(--ax-sys-color-warning-500))',\n zip: 'rgb(var(--ax-sys-color-secondary-600))',\n};\n\n@Component({\n selector: 'ax-conversation-file-attachment',\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <a class=\"ax-conversation-file\" [href]=\"fileUrl()\" [download]=\"fileName()\" target=\"_blank\" rel=\"noopener noreferrer\">\n <span class=\"ax-conversation-file__badge\" [style.background]=\"swatchColor()\">{{ fileExtension() }}</span>\n <span class=\"ax-conversation-file__body\">\n <span class=\"ax-conversation-file__name\">{{ fileName() }}</span>\n <span class=\"ax-conversation-file__meta\">{{ formattedSize() }}</span>\n </span>\n <i class=\"fa-light fa-arrow-down-to-line ax-conversation-file__icon\" aria-hidden=\"true\"></i>\n </a>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .ax-conversation-file {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n width: 100%;\n min-height: 2.75rem;\n padding: 0.5rem 0.625rem;\n border-radius: var(--ax-sys-border-radius, 0.5rem);\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-surface));\n color: rgb(var(--ax-sys-color-on-surface));\n text-decoration: none;\n touch-action: manipulation;\n transition:\n border-color 0.15s ease,\n background-color 0.15s ease;\n }\n\n @media (hover: hover) {\n .ax-conversation-file:hover {\n border-color: rgb(var(--ax-sys-color-primary-500));\n background: rgb(var(--ax-sys-color-light-surface));\n }\n }\n\n .ax-conversation-file__badge {\n flex-shrink: 0;\n width: 2.5rem;\n height: 2.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--ax-sys-border-radius, 0.375rem);\n font-weight: 600;\n font-size: 0.5625rem;\n text-transform: uppercase;\n color: rgb(var(--ax-sys-color-light));\n }\n\n .ax-conversation-file__body {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n }\n\n .ax-conversation-file__name {\n font-size: 0.8125rem;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .ax-conversation-file__meta {\n font-size: 0.6875rem;\n color: rgba(var(--ax-sys-color-on-surface), 0.65);\n }\n\n .ax-conversation-file__icon {\n flex-shrink: 0;\n font-size: 0.875rem;\n color: rgba(var(--ax-sys-color-on-surface), 0.55);\n }\n `,\n ],\n})\nexport class AXConversationFileAttachmentComponent {\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\n readonly fileExtension = computed(() => {\n const name = this.fileName();\n const parts = name.split('.');\n return parts.length > 1 ? parts[parts.length - 1]! : 'FILE';\n });\n\n readonly swatchColor = computed(() => {\n const ext = this.fileExtension().toLowerCase();\n return AX_CONVERSATION_EXT_COLORS[ext] ?? 'rgb(var(--ax-sys-color-secondary-500))';\n });\n\n readonly formattedSize = computed(() => formatFileByteSize(this.fileSize()));\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } 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}\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};\n\n@Component({\n selector: 'ax-conversation-media-playback-info-bar-banner',\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-playback-banner\">\n <div class=\"ax-conversation-playback-banner__row\">\n <button\n type=\"button\"\n class=\"ax-conversation-playback-banner__play\"\n (click)=\"onTogglePlayClick()\"\n [attr.aria-label]=\"isPlaying() ? 'Pause' : 'Play'\"\n >\n <i class=\"fa-solid\" [class.fa-pause]=\"isPlaying()\" [class.fa-play]=\"!isPlaying()\"></i>\n </button>\n\n <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 (showSpeedControl()) {\n <button\n type=\"button\"\n class=\"ax-conversation-playback-banner__speed\"\n (click)=\"onCycleSpeedClick()\"\n [attr.aria-label]=\"'Playback speed ' + playbackSpeed() + 'x'\"\n >\n {{ playbackSpeed() }}x\n </button>\n }\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n color: rgb(var(--ax-sys-color-on-primary-lightest-surface));\n }\n\n .ax-conversation-playback-banner {\n width: 100%;\n min-width: 0;\n }\n\n .ax-conversation-playback-banner__row {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n min-width: 0;\n }\n\n .ax-conversation-playback-banner__play {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.25rem;\n height: 2.25rem;\n padding: 0;\n padding-inline-start: 0.1rem;\n border: none;\n border-radius: 50%;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n font-size: 0.75rem;\n cursor: pointer;\n touch-action: manipulation;\n transition: background-color 0.15s ease;\n }\n\n @media (hover: hover) {\n .ax-conversation-playback-banner__play:hover {\n background: rgb(var(--ax-sys-color-primary-600));\n }\n }\n\n .ax-conversation-playback-banner__play:focus-visible {\n outline: 2px solid rgb(var(--ax-sys-color-primary-700));\n outline-offset: 2px;\n }\n\n .ax-conversation-playback-banner__main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n }\n\n .ax-conversation-playback-banner__meta-row {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n min-width: 0;\n }\n\n .ax-conversation-playback-banner__type-icon {\n flex-shrink: 0;\n font-size: 0.8125rem;\n opacity: 0.75;\n }\n\n .ax-conversation-playback-banner__title {\n flex: 1;\n min-width: 0;\n font-size: 0.8125rem;\n font-weight: 600;\n line-height: 1.25;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .ax-conversation-playback-banner__time {\n flex-shrink: 0;\n font-size: 0.6875rem;\n font-variant-numeric: tabular-nums;\n opacity: 0.8;\n }\n\n .ax-conversation-playback-banner__track {\n position: relative;\n width: 100%;\n height: 3px;\n border-radius: 999px;\n overflow: hidden;\n background: rgba(var(--ax-sys-color-primary-500), 0.2);\n }\n\n .ax-conversation-playback-banner__fill {\n position: absolute;\n inset-block: 0;\n inset-inline-start: 0;\n width: 0;\n border-radius: inherit;\n background: rgb(var(--ax-sys-color-primary-600));\n transition: width 0.12s linear;\n }\n\n .ax-conversation-playback-banner__speed {\n flex-shrink: 0;\n min-width: 2.5rem;\n height: 1.75rem;\n padding: 0 0.375rem;\n border: 1px solid rgba(var(--ax-sys-color-primary-600), 0.45);\n border-radius: 999px;\n background: transparent;\n color: rgb(var(--ax-sys-color-primary-700));\n font-size: 0.6875rem;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n touch-action: manipulation;\n transition:\n background-color 0.15s ease,\n border-color 0.15s ease;\n }\n\n @media (hover: hover) {\n .ax-conversation-playback-banner__speed:hover {\n background: rgba(var(--ax-sys-color-primary-500), 0.12);\n }\n }\n\n .ax-conversation-playback-banner__speed:focus-visible {\n outline: 2px solid rgb(var(--ax-sys-color-primary-500));\n outline-offset: 2px;\n }\n `,\n ],\n})\nexport class AXConversationMediaPlaybackInfoBarBannerComponent implements AXConversationMessageInfoBarBannerComponent {\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\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","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 { ChangeDetectionStrategy, Component, computed, inject, input, output, signal } 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 changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (hasVisibleChrome()) {\n <div\n class=\"ax-conversation-renderer-state\"\n [class.ax-conversation-renderer-state--below]=\"placement() === 'below'\"\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\"\n [text]=\"translation.translateSync('@acorex:chat.renderer-state.retry')\"\n [look]=\"'outline'\"\n [size]=\"'sm'\"\n [disabled]=\"retryBusy()\"\n (onClick)=\"onRetry()\"\n />\n </div>\n }\n @if (showContentError()) {\n <div\n class=\"ax-conversation-renderer-state__content-err\"\n [class.ax-conversation-renderer-state__content-err--inline]=\"contentErrorStyle() === 'inline'\"\n [class.ax-conversation-renderer-state__row]=\"contentErrorStyle() === 'banner'\"\n [class.ax-conversation-renderer-state__row--warn]=\"contentErrorStyle() === 'banner'\"\n role=\"alert\"\n >\n @if (contentErrorIconClass(); as iconClass) {\n <i [class]=\"iconClass + ' ax-conversation-renderer-state__ico'\" aria-hidden=\"true\"></i>\n }\n <span class=\"ax-conversation-renderer-state__msg\">{{ contentErrorText() }}</span>\n @if (contentRetryEnabled()) {\n <ax-button\n class=\"ax-conversation-renderer-state__retry\"\n [text]=\"translation.translateSync('@acorex:chat.renderer-state.try-again')\"\n [look]=\"'outline'\"\n [size]=\"'sm'\"\n (onClick)=\"contentRetry.emit()\"\n />\n }\n </div>\n }\n </div>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .ax-conversation-renderer-state {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n margin-block: 0.25rem 0;\n }\n\n .ax-conversation-renderer-state--below {\n margin-top: 0.375rem;\n margin-bottom: 0;\n }\n\n .ax-conversation-renderer-state__content-err--inline {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.75rem;\n color: rgb(var(--ax-sys-color-danger-600));\n padding: 0.125rem 0.25rem;\n }\n\n .ax-conversation-renderer-state__row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.5rem;\n border-radius: var(--ax-sys-border-radius);\n font-size: 0.8125rem;\n line-height: 1.35;\n }\n\n .ax-conversation-renderer-state__row--danger {\n background: rgb(var(--ax-sys-color-danger-lightest-surface));\n color: rgb(var(--ax-sys-color-danger-700));\n }\n\n .ax-conversation-renderer-state__row--warn {\n background: rgb(var(--ax-sys-color-warning-lightest-surface));\n color: rgb(var(--ax-sys-color-warning-800));\n }\n\n .ax-conversation-renderer-state__ico {\n flex-shrink: 0;\n font-size: 0.875rem;\n opacity: 0.9;\n }\n\n .ax-conversation-renderer-state__msg {\n flex: 1;\n min-width: 0;\n }\n\n .ax-conversation-renderer-state__retry {\n flex-shrink: 0;\n }\n `,\n ],\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 private 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(\n () => this.rendererState().deliveryStatus === 'failed' && this.isOwn(),\n );\n\n readonly showContentError = computed(() => {\n const { contentState } = this.rendererState();\n return (\n this.showContentErrorChrome() &&\n canShowRendererContentError(this.message().status, contentState)\n );\n });\n\n readonly hasVisibleChrome = computed(() => this.showFailed() || this.showContentError());\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","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\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","/**\n * Shared layout tokens for conversation message renderers.\n */\nexport const AX_CONVERSATION_RENDERER_SHARED_STYLES = `\n :host {\n display: block;\n max-width: 100%;\n }\n\n .ax-conversation-msg {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n }\n\n .ax-conversation-msg__stack {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n }\n\n .ax-conversation-msg__grid {\n display: grid;\n gap: 2px;\n width: 100%;\n border-radius: var(--ax-sys-border-radius, 0.5rem);\n overflow: hidden;\n background: rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .ax-conversation-msg__grid--single {\n grid-template-columns: 1fr;\n }\n\n .ax-conversation-msg__grid--single ::ng-deep .ax-conversation-image-attachment {\n max-height: min(50dvh, 20rem);\n }\n\n .ax-conversation-msg__grid--dual {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .ax-conversation-msg__grid--multi {\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 10rem;\n }\n\n @container (max-width: 380px) {\n .ax-conversation-msg__grid--multi {\n grid-template-columns: repeat(2, 1fr);\n grid-auto-rows: 10rem;\n }\n }\n\n .ax-conversation-msg__caption {\n margin: 0;\n padding: 0 0.125rem;\n font-size: 0.8125rem;\n line-height: 1.4;\n word-break: break-word;\n opacity: 0.88;\n }\n\n /* Flush layout: media fills the message bubble edge-to-edge (image / video). */\n .ax-conversation-msg--flush {\n width: 100%;\n max-width: 100%;\n gap: 0;\n }\n\n .ax-conversation-msg--flush .ax-conversation-msg__caption {\n padding: 0.375rem 0.625rem 0;\n }\n\n .ax-conversation-msg--flush .ax-conversation-msg__grid {\n border-radius: 0;\n background: transparent;\n }\n\n .ax-conversation-msg--flush .ax-conversation-msg__stack {\n gap: 2px;\n }\n\n .ax-conversation-msg--flush ::ng-deep .ax-conversation-video {\n border-radius: 0;\n }\n\n .ax-conversation-msg__card {\n border-radius: var(--ax-sys-border-radius, 0.5rem);\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-surface));\n overflow: hidden;\n }\n`;\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n computed,\n inject,\n input,\n signal,\n viewChildren,\n} from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationAudioPayload, AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n AXConversationMessageRendererCopyHostComponent,\n mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { normalizeAudioPayload } from './audio.payload';\nimport { AXConversationAudioAttachmentComponent } from '../shared/audio-attachment.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { bindMediaRendererContentState, reportMediaLoadError } from '../shared/media-renderer-content-state';\nimport { syncPlaybackInfoBarBanner } from '../shared/playback-banner-sync';\nimport { AX_CONVERSATION_RENDERER_SHARED_STYLES } from '../shared/renderer-shared.styles';\n\n@Component({\n selector: 'ax-conversation-audio-renderer',\n imports: [CommonModule, AXConversationAudioAttachmentComponent, AXConversationMessageRendererStateComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-msg ax-conversation-msg--wide\">\n <ax-conversation-message-renderer-state\n [rendererState]=\"rendererState()\"\n [message]=\"message()\"\n [contentErrorLabel]=\"audioLoadErrorLabel()\"\n />\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 @if (caption()) {\n <p class=\"ax-conversation-msg__caption\">{{ caption() }}</p>\n }\n </div>\n `,\n styles: [AX_CONVERSATION_RENDERER_SHARED_STYLES],\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\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 'Audio',\n '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.syncInfoBarBanner(true);\n return;\n }\n\n if (this.activeTrackIndex() === index) {\n this.isPlaying.set(false);\n this.syncInfoBarBanner();\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();\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();\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 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 syncInfoBarBanner(forceOpen = false): void {\n if (!this.infoBarService) {\n return;\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.togglePlay(),\n onClose: () => this.pausePlayback(),\n },\n { forceOpen },\n );\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, signal } 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 template: `\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 `,\n styles: [\n `\n :host {\n display: block;\n }\n\n /* Match layout rhythm from ax-conversation-message-renderer-state */\n .ax-conversation-fallback {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n max-width: min(100%, 18rem);\n }\n\n /* Mirrors .ax-conversation-renderer-state__row / __row--warn / __ico / __msg */\n .ax-conversation-renderer-state__row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.5rem;\n border-radius: var(--ax-sys-border-radius);\n font-size: 0.8125rem;\n line-height: 1.35;\n }\n\n .ax-conversation-renderer-state__row--warn {\n background: rgb(var(--ax-sys-color-warning-lightest-surface));\n color: rgb(var(--ax-sys-color-warning-800));\n }\n\n .ax-conversation-renderer-state__msg {\n flex: 1;\n min-width: 0;\n }\n `,\n ],\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","import { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport type { AXConversationFilePayload, AXConversationMessage } from '../../../../models';\nimport { normalizeFilePayload } from './file.payload';\nimport {\n AXConversationMessageRendererCopyHostComponent,\n mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { AXConversationFileAttachmentComponent } from '../shared/file-attachment.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { AX_CONVERSATION_RENDERER_SHARED_STYLES } from '../shared/renderer-shared.styles';\n\n@Component({\n selector: 'ax-conversation-file-renderer',\n imports: [CommonModule, AXConversationFileAttachmentComponent, AXConversationMessageRendererStateComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-msg ax-conversation-msg--wide\">\n <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n <div class=\"ax-conversation-msg__stack\">\n @for (file of files(); track file.mediaId ?? file.url) {\n <ax-conversation-file-attachment [item]=\"file\" />\n }\n </div>\n @if (caption()) {\n <p class=\"ax-conversation-msg__caption\">{{ caption() }}</p>\n }\n </div>\n `,\n styles: [AX_CONVERSATION_RENDERER_SHARED_STYLES],\n})\nexport class AXConversationFileRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n private readonly fileTypes = inject(AXFileTypeRegistryService);\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(() => normalizeFilePayload(this.message().payload as AXConversationFilePayload));\n readonly files = computed(() => this.payload().files);\n readonly caption = computed(() => this.payload().caption?.trim() || '');\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() || 'File';\n const url = file.url?.trim();\n return url ? `${name}\\n${url}` : name;\n }\n return mediaCopyText(\n p.caption,\n 'File',\n 'files',\n p.files.length,\n p.files.map((file) => file.name?.trim() || file.url?.trim()),\n );\n });\n }\n}\n","import { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport type { AXConversationImagePayload, AXConversationMessage } from '../../../../models';\nimport { AXConversationImageAttachmentComponent } from '../shared/image-attachment.component';\nimport {\n AXConversationMessageRendererCopyHostComponent,\n mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { AX_CONVERSATION_RENDERER_SHARED_STYLES } from '../shared/renderer-shared.styles';\nimport { normalizeImagePayload } from './image.payload';\n\n@Component({\n selector: 'ax-conversation-image-renderer',\n imports: [CommonModule, AXConversationImageAttachmentComponent, AXConversationMessageRendererStateComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-msg ax-conversation-msg--flush\">\n <div class=\"ax-conversation-msg__grid\" [class]=\"gridModeClass()\">\n @for (image of images(); track image.mediaId ?? image.url) {\n <ax-conversation-image-attachment [item]=\"image\" [alt]=\"caption() || 'Image'\" />\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 contentErrorLabel=\"Couldn't load image\"\n contentErrorStyle=\"inline\"\n placement=\"below\"\n />\n </div>\n `,\n styles: [AX_CONVERSATION_RENDERER_SHARED_STYLES],\n})\nexport class AXConversationImageRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n private readonly fileTypes = inject(AXFileTypeRegistryService);\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\n copy(): Promise<string> {\n return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n const p = this.payload();\n return mediaCopyText(\n p.caption,\n 'Image',\n 'images',\n p.images.length,\n p.images.map((item) => item.url?.trim() || item.thumbnailUrl?.trim()),\n );\n });\n }\n\n readonly gridModeClass = computed(() => {\n const n = this.images().length;\n if (n <= 1) return 'ax-conversation-msg__grid--single';\n if (n === 2) return 'ax-conversation-msg__grid--dual';\n return 'ax-conversation-msg__grid--multi';\n });\n}\n","import { AXMapModule } from '@acorex/components/map';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, signal } 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: [CommonModule, AXMapModule, AXConversationMessageRendererStateComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-loc\">\n <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n <div class=\"ax-conversation-loc__map\">\n <ax-map\n [latitude]=\"latitude()\"\n [longitude]=\"longitude()\"\n [zoomLevel]=\"15\"\n [markers]=\"markers()\"\n [hasLocator]=\"false\"\n [hasDraw]=\"false\"\n ></ax-map>\n </div>\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 class=\"ax-conversation-loc__meta\">\n <span class=\"ax-conversation-loc__coords\">{{ coordinatesText() }}</span>\n </div>\n </div>\n <a class=\"ax-conversation-loc__action\" [href]=\"mapsUrl()\" target=\"_blank\" rel=\"noopener noreferrer\">\n <span>Open in Maps</span>\n <i class=\"fa-light fa-arrow-up-right-from-square\" aria-hidden=\"true\"></i>\n </a>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n :host {\n max-width: 100%;\n }\n\n .ax-conversation-loc {\n display: flex;\n flex-direction: column;\n width: 100%;\n max-width: min(100%, 20rem);\n border-radius: var(--ax-sys-border-radius, 0.5rem);\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n overflow: hidden;\n background: rgb(var(--ax-sys-color-surface));\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .ax-conversation-loc__map {\n position: relative;\n height: min(28dvh, 10rem);\n width: 100%;\n overflow: hidden;\n }\n\n @container conversation (min-width: 480px) {\n .ax-conversation-loc__map {\n height: 10.5rem;\n }\n }\n\n .ax-conversation-loc__map ::ng-deep ax-map {\n display: block;\n height: 100%;\n width: 100%;\n }\n .ax-conversation-loc__body {\n padding: 0.625rem 0.75rem 0.5rem;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .ax-conversation-loc__title {\n display: flex;\n align-items: center;\n font-size: 0.875rem;\n font-weight: 600;\n line-height: 1.2;\n }\n\n .ax-conversation-loc__title-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .ax-conversation-loc__addr {\n font-size: 0.75rem;\n opacity: 0.78;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .ax-conversation-loc__meta {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .ax-conversation-loc__coords {\n font-size: 0.6875rem;\n opacity: 0.62;\n font-variant-numeric: tabular-nums;\n font-family: ui-monospace, monospace;\n }\n\n .ax-conversation-loc__action {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n min-height: 2.75rem;\n padding: 0.5rem 0.75rem;\n border-top: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-light-surface));\n font-size: 0.8125rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-primary-600));\n text-decoration: none;\n touch-action: manipulation;\n transition:\n background 0.15s ease,\n color 0.15s ease;\n }\n\n @media (hover: hover) {\n .ax-conversation-loc__action:hover {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n color: rgb(var(--ax-sys-color-primary-700));\n }\n }\n\n .ax-conversation-loc__action i {\n font-size: 0.75rem;\n opacity: 0.85;\n }\n `,\n ],\n})\nexport class AXConversationLocationRendererComponent extends AXConversationMessageRendererCopyHostComponent {\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 AXConversationLocationPayload);\n\n readonly latitude = computed(() => this.payload().latitude);\n readonly longitude = computed(() => this.payload().longitude);\n readonly locationName = computed(() => this.payload().name || 'Location');\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","import { AXLabelComponent } from '@acorex/components/label';\nimport { AXLoadingComponent } from '@acorex/components/loading';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, input, signal } from '@angular/core';\nimport type { AXConversationMessage, AXConversationStickerPayload } from '../../../../models';\nimport type {\n AXConversationMessageRendererComponent,\n AXConversationMessageRendererContentState,\n} from '../../../../registries/message-renderer.registry';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { createResolvedMediaUrlSignal } from '../shared/media-url-resolve';\n\n@Component({\n selector: 'ax-conversation-sticker-renderer',\n imports: [CommonModule, AXLabelComponent, AXLoadingComponent, AXConversationMessageRendererStateComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-sticker\">\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\">Loading sticker...</ax-label>\n </div>\n }\n <img\n class=\"ax-conversation-sticker__img\"\n [src]=\"stickerUrl()\"\n [alt]=\"alt()\"\n [class.ax-conversation-sticker__img--loading]=\"rendererState().contentState === 'loading'\"\n [class.ax-conversation-sticker__img--ready]=\"rendererState().contentState === 'ready'\"\n [class.ax-conversation-sticker__img--hidden]=\"rendererState().contentState === 'error'\"\n loading=\"lazy\"\n (load)=\"onLoad()\"\n (error)=\"onError()\"\n />\n <ax-conversation-message-renderer-state\n [rendererState]=\"rendererState()\"\n [message]=\"message()\"\n contentErrorLabel=\"Sticker unavailable\"\n contentErrorStyle=\"inline\"\n contentErrorIconClass=\"fa-light fa-face-smile\"\n placement=\"below\"\n />\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n :host {\n max-width: 100%;\n }\n\n .ax-conversation-sticker {\n position: relative;\n display: inline-block;\n max-width: min(100%, 8.75rem);\n margin-block: 0.125rem;\n }\n\n .ax-conversation-sticker__img {\n display: block;\n width: 100%;\n height: auto;\n max-height: min(40dvh, 8.75rem);\n object-fit: contain;\n opacity: 0;\n transition: opacity 0.2s ease;\n cursor: default;\n }\n\n /* While loading, keep <img> in the DOM (so it still loads) but out of layout — opacity alone still reserves intrinsic size */\n .ax-conversation-sticker__img--loading {\n position: absolute;\n width: 0;\n height: 0;\n margin: 0;\n border: 0;\n padding: 0;\n overflow: hidden;\n visibility: hidden;\n pointer-events: none;\n }\n\n .ax-conversation-sticker__img--ready {\n opacity: 1;\n }\n\n .ax-conversation-sticker__img--hidden {\n visibility: hidden;\n position: absolute;\n width: 0;\n height: 0;\n opacity: 0;\n pointer-events: none;\n }\n\n .ax-conversation-sticker__state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n min-width: 112px;\n min-height: 112px;\n max-width: 160px;\n padding: 0.5rem 0.375rem;\n text-align: center;\n border-radius: var(--ax-sys-border-radius);\n background: rgb(var(--ax-sys-color-lighter-surface));\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.85;\n }\n\n .ax-conversation-sticker__loading-label {\n font-size: 0.6875rem;\n line-height: 1.2;\n }\n\n `,\n ],\n})\nexport class AXConversationStickerRendererComponent implements AXConversationMessageRendererComponent {\n private readonly _contentState = signal<AXConversationMessageRendererContentState>('loading');\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 || 'Sticker');\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","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, signal } 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 changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\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 <span class=\"ax-conversation-system__icon\" aria-hidden=\"true\">\n <i [class]=\"iconClass()\"></i>\n </span>\n <span class=\"ax-conversation-system__label\">{{ payload().text }}</span>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .ax-conversation-system-stack {\n display: flex;\n flex-direction: column;\n width: 100%;\n align-items: stretch;\n }\n\n .ax-conversation-system {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.375rem;\n margin-block: 0.375rem;\n padding-inline: 0.5rem;\n font-size: 0.75rem;\n font-style: italic;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.62;\n }\n\n .ax-conversation-system__icon {\n display: inline-flex;\n font-size: 0.8125rem;\n opacity: 0.9;\n }\n `,\n ],\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] ?? 'fa-light fa-info-circle';\n });\n}\n","/**\n * Sanitizer Utility Service\n * Centralized DOM sanitization helpers for user-generated content\n */\n\nimport { Injectable, SecurityContext, inject } from '@angular/core';\nimport { DomSanitizer, SafeHtml, SafeUrl } from '@angular/platform-browser';\n\n@Injectable({ providedIn: 'root' })\nexport class 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 { ChangeDetectionStrategy, Component, computed, inject, input, signal } 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 { AXConversationMessageRendererCopyHostComponent } from '../shared/message-renderer-copy-host.component';\nimport { AXConversationSanitizerService } from '../../../../utils/sanitizer.service';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\n\n@Component({\n selector: 'ax-conversation-text-renderer',\n imports: [AXConversationMessageRendererStateComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-text\">\n <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n <div class=\"ax-conversation-text__body\" [innerHTML]=\"formattedText()\"></div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .ax-conversation-text__body {\n word-break: break-word;\n overflow-wrap: break-word;\n text-wrap: pretty;\n white-space: pre-wrap;\n line-height: 1.5;\n font-size: 0.875rem;\n letter-spacing: 0.01em;\n }\n\n .ax-conversation-text__body ::ng-deep a {\n color: rgb(var(--ax-sys-color-primary-600));\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 2px;\n }\n\n @media (hover: hover) {\n .ax-conversation-text__body ::ng-deep a:hover {\n color: rgb(var(--ax-sys-color-primary-700));\n text-decoration-thickness: 2px;\n }\n }\n\n .ax-conversation-text__body ::ng-deep mark {\n background: rgb(var(--ax-sys-color-warning-lightest-surface));\n padding: 0.0625rem 0.3125rem;\n border-radius: var(--ax-sys-border-radius);\n font-weight: 500;\n box-shadow: 0 0 0 1px rgba(var(--ax-sys-color-warning-500), 0.2);\n }\n `,\n ],\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 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","import { CommonModule, isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n PLATFORM_ID,\n computed,\n inject,\n input,\n signal,\n viewChildren,\n} from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationMessage, AXConversationVideoPayload } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n AXConversationMessageRendererCopyHostComponent,\n mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { normalizeVideoPayload } from './video.payload';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { bindMediaRendererContentState, reportMediaLoadError } from '../shared/media-renderer-content-state';\nimport { syncPlaybackInfoBarBanner } from '../shared/playback-banner-sync';\nimport { AX_CONVERSATION_RENDERER_SHARED_STYLES } from '../shared/renderer-shared.styles';\nimport { AXConversationVideoAttachmentComponent } from '../shared/video-attachment.component';\n\n@Component({\n selector: 'ax-conversation-video-renderer',\n imports: [CommonModule, AXConversationVideoAttachmentComponent, AXConversationMessageRendererStateComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-msg\">\n <ax-conversation-message-renderer-state\n [rendererState]=\"rendererState()\"\n [message]=\"message()\"\n [contentErrorLabel]=\"videoLoadErrorLabel()\"\n />\n <div class=\"ax-conversation-msg__stack\">\n @for (video of videos(); track video.mediaId ?? video.url; let i = $index) {\n <ax-conversation-video-attachment\n [item]=\"video\"\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 @if (caption()) {\n <p class=\"ax-conversation-msg__caption\">{{ caption() }}</p>\n }\n </div>\n `,\n styles: [AX_CONVERSATION_RENDERER_SHARED_STYLES],\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 copy(): Promise<string> {\n return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n const p = this.payload();\n return mediaCopyText(\n p.caption,\n 'Video',\n '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 =\n 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","import { CommonModule, isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationMessage, AXConversationVoicePayload } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXConversationMessageRendererCopyHostComponent, mediaCopyText } from '../shared/message-renderer-copy-host.component';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { formatMediaDuration } from '../shared/format-media';\nimport { createResolvedMediaUrlSignal } from '../shared/media-url-resolve';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { bindMediaRendererContentState, reportMediaLoadError } from '../shared/media-renderer-content-state';\nimport { syncPlaybackInfoBarBanner } from '../shared/playback-banner-sync';\n\n/** Decorative bars when payload has no waveform (deterministic, no random). */\nconst AX_CONVERSATION_FALLBACK_WAVEFORM: readonly number[] = [\n 38, 58, 44, 72, 48, 64, 40, 68, 52, 60, 42, 56, 46, 70, 50, 62, 36, 54, 48, 66,\n];\n\n@Component({\n selector: 'ax-conversation-voice-renderer',\n imports: [CommonModule, AXConversationMessageRendererStateComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ax-conversation-voice\">\n <div class=\"ax-conversation-voice__bar\">\n <button\n type=\"button\"\n class=\"ax-conversation-voice__fab\"\n (click)=\"togglePlay()\"\n [attr.aria-label]=\"isPlaying() ? 'Pause' : 'Play voice message'\"\n >\n <i class=\"fa-solid\" [class.fa-pause]=\"isPlaying()\" [class.fa-play]=\"!isPlaying()\"></i>\n </button>\n <div class=\"ax-conversation-voice__wave\" aria-hidden=\"true\">\n <div class=\"ax-conversation-voice__cols\">\n @for (bar of waveformBars(); track $index) {\n <div\n class=\"ax-conversation-voice__col\"\n [style.height.%]=\"bar\"\n [class.ax-conversation-voice__col--on]=\"$index < activeBarIndex()\"\n ></div>\n }\n </div>\n </div>\n <div class=\"ax-conversation-voice__side\">\n <button\n type=\"button\"\n class=\"ax-conversation-voice__speed\"\n (click)=\"cyclePlaybackSpeed()\"\n [attr.aria-label]=\"'Playback speed: ' + playbackSpeed() + 'x'\"\n >\n {{ playbackSpeed() }}x\n </button>\n <span class=\"ax-conversation-voice__time\">{{ timeLabel() }}</span>\n </div>\n </div>\n <audio\n #audioElement\n class=\"ax-conversation-voice__el\"\n [src]=\"voiceUrl() || null\"\n (error)=\"onError()\"\n (timeupdate)=\"onTimeUpdate()\"\n (ended)=\"onEnded()\"\n ></audio>\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 </div>\n `,\n styles: [\n `\n :host {\n display: block;\n max-width: 100%;\n }\n\n .ax-conversation-voice {\n width: 100%;\n max-width: min(100%, 17rem);\n }\n\n .ax-conversation-voice__bar {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.5rem;\n border-radius: 999px;\n background: rgb(var(--ax-sys-color-light-surface));\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .ax-conversation-voice__fab {\n flex-shrink: 0;\n width: 2.25rem;\n height: 2.25rem;\n touch-action: manipulation;\n display: flex;\n align-items: center;\n justify-content: center;\n padding-inline-start: 0.12rem;\n border: none;\n border-radius: 50%;\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n font-size: 0.75rem;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n @media (hover: hover) {\n .ax-conversation-voice__fab:hover {\n background: rgb(var(--ax-sys-color-primary-600));\n }\n }\n\n .ax-conversation-voice__fab:focus-visible {\n outline: 2px solid rgb(var(--ax-sys-color-primary-500));\n outline-offset: 2px;\n }\n\n .ax-conversation-voice__wave {\n flex: 1;\n min-width: 0;\n }\n\n .ax-conversation-voice__cols {\n display: flex;\n align-items: center;\n gap: 2px;\n height: 1.75rem;\n }\n\n .ax-conversation-voice__col {\n flex: 1;\n min-width: 2px;\n max-height: 100%;\n align-self: center;\n border-radius: 2px;\n background: rgb(var(--ax-sys-color-border-light-surface));\n transition: background 0.12s ease;\n }\n\n .ax-conversation-voice__col--on {\n background: rgb(var(--ax-sys-color-primary-500));\n }\n\n .ax-conversation-voice__side {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.125rem;\n flex-shrink: 0;\n }\n\n .ax-conversation-voice__speed {\n min-width: 2.5rem;\n height: 1.25rem;\n padding: 0 0.25rem;\n border: 1px solid rgb(var(--ax-sys-color-primary-500));\n border-radius: 999px;\n background: transparent;\n color: rgb(var(--ax-sys-color-primary-600));\n font-size: 0.6875rem;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .ax-conversation-voice__speed:hover {\n background: rgb(var(--ax-sys-color-primary-lightest-surface));\n }\n\n .ax-conversation-voice__time {\n font-size: 0.625rem;\n font-variant-numeric: tabular-nums;\n opacity: 0.72;\n color: rgb(var(--ax-sys-color-primary-600));\n }\n\n .ax-conversation-voice__el {\n display: none;\n }\n `,\n ],\n})\nexport class AXConversationVoiceRendererComponent 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 audioElementRef = viewChild<ElementRef<HTMLAudioElement>>('audioElement');\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\n private readonly speeds = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] as const;\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 waveformBars = computed(() => {\n const w = this.payload().waveform;\n return w?.length ? w : [...AX_CONVERSATION_FALLBACK_WAVEFORM];\n });\n\n readonly activeBarIndex = computed(() => {\n const dur = this.duration();\n const n = this.waveformBars().length;\n return dur > 0 ? Math.floor((this.currentTime() / dur) * n) : 0;\n });\n\n readonly timeLabel = computed(() => formatMediaDuration(this.isPlaying() ? this.currentTime() : this.duration()));\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(undefined, 'Voice message', 'voice messages', 1, [url]);\n });\n }\n\n constructor() {\n super();\n bindMediaRendererContentState(this.message, this._contentState, () => this.voiceUrl());\n\n effect((onCleanup) => {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl || !isPlatformBrowser(this.platformId)) {\n return;\n }\n const onMeta = (): void => {\n this.duration.set(audioEl.duration);\n };\n audioEl.addEventListener('loadedmetadata', onMeta);\n onCleanup(() => audioEl.removeEventListener('loadedmetadata', onMeta));\n });\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 audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl) {\n return;\n }\n if (this.isPlaying()) {\n audioEl.pause();\n this.isPlaying.set(false);\n this.syncInfoBarBanner();\n } else {\n void audioEl.play();\n this.isPlaying.set(true);\n this.syncInfoBarBanner(true);\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 const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl) {\n audioEl.playbackRate = next;\n this.syncInfoBarBanner();\n }\n }\n\n onTimeUpdate(): void {\n const audioEl = this.audioElementRef()?.nativeElement;\n if (audioEl) {\n this.currentTime.set(audioEl.currentTime);\n this.syncInfoBarBanner();\n }\n }\n\n onEnded(): void {\n this.isPlaying.set(false);\n this.currentTime.set(0);\n this.syncInfoBarBanner();\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 const audioEl = this.audioElementRef()?.nativeElement;\n if (!audioEl) {\n this.isPlaying.set(false);\n return;\n }\n audioEl.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 payload = this.payload();\n\n syncPlaybackInfoBarBanner(\n this.infoBarService,\n message,\n {\n title: 'Voice message',\n currentTime: this.currentTime(),\n duration: this.duration() || payload.duration || 0,\n isPlaying: this.isPlaying(),\n onTogglePlay: () => this.togglePlay(),\n onClose: () => this.pausePlayback(),\n playbackSpeed: this.playbackSpeed(),\n onCycleSpeed: () => this.cyclePlaybackSpeed(),\n showSpeedControl: true,\n },\n { forceOpen },\n );\n }\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: () => true,\n handler: async (context) => {\n const conversationService = inject(AXConversationService);\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","/**\n * @deprecated Import from `../../utils/message-payload-normalize` instead.\n */\nexport {\n normalizeMessagePayload,\n normalizeMessagePayloadAsync,\n} from '../../utils/message-payload-normalize';\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_EMOJI_ACTION } from '../../composer/composer-actions/emoji-action.plugin';\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 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 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 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';\n\n/**\n * Mute/Unmute conversation notifications\n */\nexport const AX_CONVERSATION_ITEM_MUTE_ACTION: AXConversationItemAction = {\n id: 'mute',\n label: (context) =>\n context.conversation.settings?.notifications === false\n ? '@acorex:chat.actions.unmute'\n : '@acorex:chat.actions.mute',\n icon: (context) =>\n context.conversation.settings?.notifications === false ? 'fa-light fa-bell-slash' : 'fa-light fa-bell',\n tooltip: '@acorex:chat.tooltips.toggle-notifications',\n priority: 100,\n handler: async (context) => {\n const currentNotifications = context.conversation.settings?.notifications ?? true;\n await inject(AXConversationService).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 const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n return isGroup ? '@acorex:chat.actions.leave-and-delete' : '@acorex:chat.actions.delete';\n },\n icon: (context) => {\n const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n return isGroup ? 'fa-light fa-door-open' : 'fa-light fa-trash';\n },\n tooltip: (context) => {\n const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n return isGroup ? '@acorex:chat.tooltips.leave-and-delete-group' : '@acorex:chat.tooltips.delete-conversation';\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 * 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 { AXConversationInfiniteScrollDirective } from './directives';\nimport {\n AXConversationComposerActionRegistry,\n AXConversationComposerTabRegistry,\n AXConversationItemActionRegistry,\n AXConversationTabRegistry,\n AXConversationInfoBarActionRegistry,\n AXConversationMessageActionRegistry,\n AXConversationMessageRendererRegistry,\n} from './registries';\nimport { AXConversationService, AXConversationRegistryService } from './services';\nimport { provideConversationComposerFileTypes } from './plugins/composer/composer-actions/composer-file-types.plugin';\nimport { AXConversationApi, AXConversationMessageApi, AXConversationRealtimeApi, AXConversationUserApi } from './services/api';\nimport {\n AXConversationAvatarComponents,\n AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT,\n AX_CONVERSATION_USER_AVATAR_COMPONENT,\n AXConversationConfig,\n AXConversationRegistryConfiguration,\n AX_CONVERSATION_CONFIG,\n mergeWithDefaults,\n AX_CONVERSATION_REGISTRY_CONFIG,\n} from './tokens';\n\n/**\n * Configuration options for conversation module\n */\nexport interface AXConversationOptions {\n /** User API implementation (required) */\n userApi: Type<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/**\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(mergedConfig.features));\n\n if (realtimeApi) {\n providers.push(\n { provide: AXConversationRealtimeApi, useClass: realtimeApi },\n );\n }\n\n providers.push(\n AXConversationService,\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 }\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],\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// Pluggins\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","i3","i4","i1","i2","loose","str","num","MB","blobUrl","mediaDuration","i5"],"mappings":"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"}