@acorex/components 21.0.3-next.38 → 21.0.3-next.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{conversation2 → conversation}/README.md +23 -23
- package/fesm2022/acorex-components-button.mjs +4 -4
- package/fesm2022/acorex-components-button.mjs.map +1 -1
- package/fesm2022/acorex-components-conversation-acorex-components-conversation-YhVa42TC.mjs +13711 -0
- package/fesm2022/acorex-components-conversation-acorex-components-conversation-YhVa42TC.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-audio-attachment.component-CLvS3W8F.mjs +119 -0
- package/fesm2022/acorex-components-conversation-audio-attachment.component-CLvS3W8F.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-audio-composer.payload-BHQJNyXz.mjs +59 -0
- package/fesm2022/acorex-components-conversation-audio-composer.payload-BHQJNyXz.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-audio-picker.component-BD_fN2Ip.mjs +432 -0
- package/fesm2022/acorex-components-conversation-audio-picker.component-BD_fN2Ip.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-audio-renderer.component-CcxVVprx.mjs +177 -0
- package/fesm2022/acorex-components-conversation-audio-renderer.component-CcxVVprx.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-audio.payload-Bag4aTut.mjs +54 -0
- package/fesm2022/acorex-components-conversation-audio.payload-Bag4aTut.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-C28hl7iD.mjs +101 -0
- package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-C28hl7iD.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-conversation-audio.file-type-CfGSVnMA.mjs +100 -0
- package/fesm2022/acorex-components-conversation-conversation-audio.file-type-CfGSVnMA.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-conversation-file.file-type-DB-2xhaC.mjs +121 -0
- package/fesm2022/acorex-components-conversation-conversation-file.file-type-DB-2xhaC.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-conversation-image.file-type-C02OzZZB.mjs +84 -0
- package/fesm2022/acorex-components-conversation-conversation-image.file-type-C02OzZZB.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-conversation-info-media-view.component-Mhk7JE6K.mjs +238 -0
- package/fesm2022/acorex-components-conversation-conversation-info-media-view.component-Mhk7JE6K.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-conversation-info-panel.component-CNaM5ajR.mjs +1080 -0
- package/fesm2022/acorex-components-conversation-conversation-info-panel.component-CNaM5ajR.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-conversation-video.file-type-Pescv4Vu.mjs +102 -0
- package/fesm2022/acorex-components-conversation-conversation-video.file-type-Pescv4Vu.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-conversation-voice.file-type-DDd47o4r.mjs +90 -0
- package/fesm2022/acorex-components-conversation-conversation-voice.file-type-DDd47o4r.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-emoji-categories-C7Gm95V0.mjs +1840 -0
- package/fesm2022/acorex-components-conversation-emoji-categories-C7Gm95V0.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-fallback-renderer.component-CYh_6O6j.mjs +44 -0
- package/fesm2022/acorex-components-conversation-fallback-renderer.component-CYh_6O6j.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-file-composer.payload-Dy7aG-EH.mjs +64 -0
- package/fesm2022/acorex-components-conversation-file-composer.payload-Dy7aG-EH.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-file-picker.component-DCVgl33l.mjs +468 -0
- package/fesm2022/acorex-components-conversation-file-picker.component-DCVgl33l.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-file-renderer.component-DgCi06Mg.mjs +125 -0
- package/fesm2022/acorex-components-conversation-file-renderer.component-DgCi06Mg.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-file.payload-DyFxTQYn.mjs +50 -0
- package/fesm2022/acorex-components-conversation-file.payload-DyFxTQYn.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-format-media-DUD4vA6F.mjs +21 -0
- package/fesm2022/acorex-components-conversation-format-media-DUD4vA6F.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-image-attachment.component-CLMGxXPl.mjs +77 -0
- package/fesm2022/acorex-components-conversation-image-attachment.component-CLMGxXPl.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-image-picker.component-CS343UDa.mjs +407 -0
- package/fesm2022/acorex-components-conversation-image-picker.component-CS343UDa.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-image-renderer.component-Cy0TA6cL.mjs +83 -0
- package/fesm2022/acorex-components-conversation-image-renderer.component-Cy0TA6cL.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-index-3V2b14I0.mjs +184 -0
- package/fesm2022/acorex-components-conversation-index-3V2b14I0.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-index-MCvfr9Zd.mjs +266 -0
- package/fesm2022/acorex-components-conversation-index-MCvfr9Zd.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-location-picker.component-DcNQzuoU.mjs +149 -0
- package/fesm2022/acorex-components-conversation-location-picker.component-DcNQzuoU.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-location-renderer.component-Cw2PB0LM.mjs +118 -0
- package/fesm2022/acorex-components-conversation-location-renderer.component-Cw2PB0LM.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-media-formatters-DV3wEEno.mjs +17 -0
- package/fesm2022/acorex-components-conversation-media-formatters-DV3wEEno.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-media-playback-info-bar-banner.component-DbWUl6M2.mjs +140 -0
- package/fesm2022/acorex-components-conversation-media-playback-info-bar-banner.component-DbWUl6M2.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-message-renderer-copy-host.component-oXTr_Lfq.mjs +33 -0
- package/fesm2022/acorex-components-conversation-message-renderer-copy-host.component-oXTr_Lfq.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-message-renderer-state.component-Dp-JdHWr.mjs +172 -0
- package/fesm2022/acorex-components-conversation-message-renderer-state.component-Dp-JdHWr.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-Du8Lj9Sp.mjs +224 -0
- package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-Du8Lj9Sp.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-pagination-demo-data-oIT_YJmN.mjs +81 -0
- package/fesm2022/acorex-components-conversation-pagination-demo-data-oIT_YJmN.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-picker-header.component-BneIFjXq.mjs +91 -0
- package/fesm2022/acorex-components-conversation-picker-header.component-BneIFjXq.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-picker-toolbar.component-BthRvEeE.mjs +537 -0
- package/fesm2022/acorex-components-conversation-picker-toolbar.component-BthRvEeE.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-picker-upload-C-PlKPaU.mjs +163 -0
- package/fesm2022/acorex-components-conversation-picker-upload-C-PlKPaU.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-playback-banner-sync-D8FFKde6.mjs +68 -0
- package/fesm2022/acorex-components-conversation-playback-banner-sync-D8FFKde6.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-renderer-shared.styles-Digah3Zn.mjs +95 -0
- package/fesm2022/acorex-components-conversation-renderer-shared.styles-Digah3Zn.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-search.component-B-nc6xiA.mjs +187 -0
- package/fesm2022/acorex-components-conversation-search.component-B-nc6xiA.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-send-message-media-BRklgfV7.mjs +170 -0
- package/fesm2022/acorex-components-conversation-send-message-media-BRklgfV7.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-shared-storage.seed-J9PA4l3c.mjs +750 -0
- package/fesm2022/acorex-components-conversation-shared-storage.seed-J9PA4l3c.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-sticker-renderer.component-BmBwy7Ig.mjs +103 -0
- package/fesm2022/acorex-components-conversation-sticker-renderer.component-BmBwy7Ig.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-system-renderer.component-uie3tm5N.mjs +55 -0
- package/fesm2022/acorex-components-conversation-system-renderer.component-uie3tm5N.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-text-renderer.component-DNAquHYK.mjs +109 -0
- package/fesm2022/acorex-components-conversation-text-renderer.component-DNAquHYK.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-video-attachment.component-CGaUhnSb.mjs +105 -0
- package/fesm2022/acorex-components-conversation-video-attachment.component-CGaUhnSb.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-video-composer.payload-DMqRkafr.mjs +62 -0
- package/fesm2022/acorex-components-conversation-video-composer.payload-DMqRkafr.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-video-picker.component-DPwSBnoH.mjs +446 -0
- package/fesm2022/acorex-components-conversation-video-picker.component-DPwSBnoH.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-video-renderer.component-DKa9mUe2.mjs +181 -0
- package/fesm2022/acorex-components-conversation-video-renderer.component-DKa9mUe2.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-video.payload-C8QaqxuX.mjs +54 -0
- package/fesm2022/acorex-components-conversation-video.payload-C8QaqxuX.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-voice-composer.payload-DLVow7ex.mjs +17 -0
- package/fesm2022/acorex-components-conversation-voice-composer.payload-DLVow7ex.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-voice-recorder.component-D_rdANZN.mjs +344 -0
- package/fesm2022/acorex-components-conversation-voice-recorder.component-D_rdANZN.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation-voice-renderer.component-BY5FJcT8.mjs +270 -0
- package/fesm2022/acorex-components-conversation-voice-renderer.component-BY5FJcT8.mjs.map +1 -0
- package/fesm2022/acorex-components-conversation.mjs +2 -0
- package/fesm2022/acorex-components-conversation.mjs.map +1 -0
- package/fesm2022/acorex-components-kbd.mjs +2 -2
- package/fesm2022/acorex-components-kbd.mjs.map +1 -1
- package/fesm2022/acorex-components-scheduler-picker.mjs +22 -14
- package/fesm2022/acorex-components-scheduler-picker.mjs.map +1 -1
- package/fesm2022/acorex-components-tree-view.mjs +2 -2
- package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
- package/package.json +6 -6
- package/types/{acorex-components-conversation2.d.ts → acorex-components-conversation.d.ts} +1127 -1928
- package/types/acorex-components-scheduler-picker.d.ts +2 -0
- package/fesm2022/acorex-components-conversation2.mjs +0 -22347
- package/fesm2022/acorex-components-conversation2.mjs.map +0 -1
package/fesm2022/acorex-components-conversation-conversation-info-panel.component-CNaM5ajR.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-components-conversation-conversation-info-panel.component-CNaM5ajR.mjs","sources":["../../../../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"],"sourcesContent":["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"],"names":["i3","i4"],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { createFileTypeMetadata, AXFileTypeInfoProvider } from '@acorex/core/file';
|
|
2
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { Injectable } from '@angular/core';
|
|
5
|
+
import { u as AX_CONVERSATION_VIDEO_CATALOG } from './acorex-components-conversation-acorex-components-conversation-YhVa42TC.mjs';
|
|
6
|
+
import { normalizeVideoPayload } from './acorex-components-conversation-video.payload-C8QaqxuX.mjs';
|
|
7
|
+
import { f as formatDuration, a as formatFileSize } from './acorex-components-conversation-media-formatters-DV3wEEno.mjs';
|
|
8
|
+
|
|
9
|
+
const MB = 1024 * 1024;
|
|
10
|
+
const AX_CONVERSATION_VIDEO_PRESENTATION = {
|
|
11
|
+
icon: 'fa-light fa-video ax-text-blue-500',
|
|
12
|
+
title: 'Video',
|
|
13
|
+
};
|
|
14
|
+
const AX_CONVERSATION_VIDEO_UTILITY = {
|
|
15
|
+
preview: 'preview',
|
|
16
|
+
duration: 'duration',
|
|
17
|
+
formatSize: 'formatSize',
|
|
18
|
+
formatDuration: 'formatDuration',
|
|
19
|
+
createLocalPreviewUrl: 'createLocalPreviewUrl',
|
|
20
|
+
};
|
|
21
|
+
function blobUrl(ctx, blob) {
|
|
22
|
+
if (!isPlatformBrowser(ctx.platformId)) {
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
return URL.createObjectURL(blob);
|
|
26
|
+
}
|
|
27
|
+
function mediaDuration(ctx, file, tag) {
|
|
28
|
+
if (!isPlatformBrowser(ctx.platformId)) {
|
|
29
|
+
return Promise.resolve(0);
|
|
30
|
+
}
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
const el = document.createElement(tag);
|
|
33
|
+
el.preload = 'metadata';
|
|
34
|
+
el.onloadedmetadata = () => {
|
|
35
|
+
URL.revokeObjectURL(el.src);
|
|
36
|
+
resolve(el.duration);
|
|
37
|
+
};
|
|
38
|
+
el.onerror = () => {
|
|
39
|
+
URL.revokeObjectURL(el.src);
|
|
40
|
+
reject(new Error(`Failed to load ${tag} metadata`));
|
|
41
|
+
};
|
|
42
|
+
el.src = URL.createObjectURL(file);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function conversationVideoUtilities() {
|
|
46
|
+
return {
|
|
47
|
+
[AX_CONVERSATION_VIDEO_UTILITY.preview]: (ctx, file) => ctx.readAsDataUrl(file),
|
|
48
|
+
[AX_CONVERSATION_VIDEO_UTILITY.duration]: (ctx, file) => mediaDuration(ctx, file, 'video'),
|
|
49
|
+
[AX_CONVERSATION_VIDEO_UTILITY.formatSize]: (_ctx, bytes) => formatFileSize(bytes),
|
|
50
|
+
[AX_CONVERSATION_VIDEO_UTILITY.formatDuration]: (_ctx, seconds) => formatDuration(seconds),
|
|
51
|
+
[AX_CONVERSATION_VIDEO_UTILITY.createLocalPreviewUrl]: async (ctx, source) => {
|
|
52
|
+
const blob = source;
|
|
53
|
+
if (blob.type.startsWith('image/')) {
|
|
54
|
+
return ctx.readAsDataUrl(blob);
|
|
55
|
+
}
|
|
56
|
+
return blobUrl(ctx, blob);
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function createConversationVideoFileType() {
|
|
61
|
+
const presentation = AX_CONVERSATION_VIDEO_PRESENTATION;
|
|
62
|
+
return {
|
|
63
|
+
name: AX_CONVERSATION_VIDEO_CATALOG,
|
|
64
|
+
metadata: createFileTypeMetadata('conversation'),
|
|
65
|
+
title: presentation.title,
|
|
66
|
+
icon: presentation.icon,
|
|
67
|
+
validations: {
|
|
68
|
+
mimeTypes: ['video/*'],
|
|
69
|
+
minSize: 1,
|
|
70
|
+
maxSize: 500 * MB,
|
|
71
|
+
},
|
|
72
|
+
extensions: [
|
|
73
|
+
{ name: 'mp4', title: 'MP4' },
|
|
74
|
+
{ name: 'webm', title: 'WebM', validations: { maxSize: 200 * MB } },
|
|
75
|
+
{ name: 'ogg', title: 'OGG' },
|
|
76
|
+
],
|
|
77
|
+
utilities: conversationVideoUtilities(),
|
|
78
|
+
copy: (payload) => {
|
|
79
|
+
const video = normalizeVideoPayload(payload);
|
|
80
|
+
const caption = video.caption?.trim();
|
|
81
|
+
const urls = video.videos.map((item) => item.url?.trim()).filter((url) => !!url);
|
|
82
|
+
return {
|
|
83
|
+
text: caption ?? '',
|
|
84
|
+
meta: { kind: 'video', caption, urls, count: video.videos.length },
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
class AXConversationVideoFileTypeProvider extends AXFileTypeInfoProvider {
|
|
90
|
+
items() {
|
|
91
|
+
return Promise.resolve([createConversationVideoFileType()]);
|
|
92
|
+
}
|
|
93
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXConversationVideoFileTypeProvider, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
94
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXConversationVideoFileTypeProvider, providedIn: 'root' }); }
|
|
95
|
+
}
|
|
96
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXConversationVideoFileTypeProvider, decorators: [{
|
|
97
|
+
type: Injectable,
|
|
98
|
+
args: [{ providedIn: 'root' }]
|
|
99
|
+
}] });
|
|
100
|
+
|
|
101
|
+
export { AXConversationVideoFileTypeProvider, AX_CONVERSATION_VIDEO_CATALOG, AX_CONVERSATION_VIDEO_PRESENTATION, conversationVideoUtilities, createConversationVideoFileType };
|
|
102
|
+
//# sourceMappingURL=acorex-components-conversation-conversation-video.file-type-Pescv4Vu.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-components-conversation-conversation-video.file-type-Pescv4Vu.mjs","sources":["../../../../packages/components/conversation/src/lib/plugins/composer/components/video-picker/conversation-video.file-type.ts"],"sourcesContent":["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"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createFileTypeMetadata, AXFileTypeInfoProvider } from '@acorex/core/file';
|
|
2
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { Injectable } from '@angular/core';
|
|
5
|
+
import { v as AX_CONVERSATION_VOICE_CATALOG } from './acorex-components-conversation-acorex-components-conversation-YhVa42TC.mjs';
|
|
6
|
+
import { f as formatDuration } from './acorex-components-conversation-media-formatters-DV3wEEno.mjs';
|
|
7
|
+
|
|
8
|
+
const MB = 1024 * 1024;
|
|
9
|
+
const AX_CONVERSATION_VOICE_PRESENTATION = {
|
|
10
|
+
icon: 'fa-light fa-microphone text-green-500',
|
|
11
|
+
title: 'Voice message',
|
|
12
|
+
};
|
|
13
|
+
const AX_CONVERSATION_VOICE_UTILITY = {
|
|
14
|
+
duration: 'duration',
|
|
15
|
+
formatDuration: 'formatDuration',
|
|
16
|
+
createLocalPreviewUrl: 'createLocalPreviewUrl',
|
|
17
|
+
};
|
|
18
|
+
function blobUrl(ctx, blob) {
|
|
19
|
+
if (!isPlatformBrowser(ctx.platformId)) {
|
|
20
|
+
return '';
|
|
21
|
+
}
|
|
22
|
+
return URL.createObjectURL(blob);
|
|
23
|
+
}
|
|
24
|
+
function mediaDuration(ctx, file) {
|
|
25
|
+
if (!isPlatformBrowser(ctx.platformId)) {
|
|
26
|
+
return Promise.resolve(0);
|
|
27
|
+
}
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const el = document.createElement('audio');
|
|
30
|
+
el.preload = 'metadata';
|
|
31
|
+
el.onloadedmetadata = () => {
|
|
32
|
+
URL.revokeObjectURL(el.src);
|
|
33
|
+
resolve(el.duration);
|
|
34
|
+
};
|
|
35
|
+
el.onerror = () => {
|
|
36
|
+
URL.revokeObjectURL(el.src);
|
|
37
|
+
reject(new Error('Failed to load audio metadata'));
|
|
38
|
+
};
|
|
39
|
+
el.src = URL.createObjectURL(file);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function conversationVoiceUtilities() {
|
|
43
|
+
return {
|
|
44
|
+
[AX_CONVERSATION_VOICE_UTILITY.duration]: (ctx, file) => mediaDuration(ctx, file),
|
|
45
|
+
[AX_CONVERSATION_VOICE_UTILITY.formatDuration]: (_ctx, seconds) => formatDuration(seconds),
|
|
46
|
+
[AX_CONVERSATION_VOICE_UTILITY.createLocalPreviewUrl]: (ctx, source) => blobUrl(ctx, source),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function createConversationVoiceFileType() {
|
|
50
|
+
const presentation = AX_CONVERSATION_VOICE_PRESENTATION;
|
|
51
|
+
return {
|
|
52
|
+
name: AX_CONVERSATION_VOICE_CATALOG,
|
|
53
|
+
metadata: createFileTypeMetadata('conversation'),
|
|
54
|
+
title: presentation.title,
|
|
55
|
+
icon: presentation.icon,
|
|
56
|
+
validations: {
|
|
57
|
+
mimeTypes: ['audio/webm', 'audio/ogg', 'audio/mp4', 'audio/*'],
|
|
58
|
+
minSize: 1,
|
|
59
|
+
maxSize: 50 * MB,
|
|
60
|
+
},
|
|
61
|
+
utilities: conversationVoiceUtilities(),
|
|
62
|
+
copy: (payload) => {
|
|
63
|
+
const voice = payload;
|
|
64
|
+
const url = voice.url?.trim() ?? '';
|
|
65
|
+
return {
|
|
66
|
+
text: '',
|
|
67
|
+
meta: {
|
|
68
|
+
kind: 'voice',
|
|
69
|
+
url,
|
|
70
|
+
duration: voice.duration,
|
|
71
|
+
mimeType: voice.mimeType,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
class AXConversationVoiceFileTypeProvider extends AXFileTypeInfoProvider {
|
|
78
|
+
items() {
|
|
79
|
+
return Promise.resolve([createConversationVoiceFileType()]);
|
|
80
|
+
}
|
|
81
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXConversationVoiceFileTypeProvider, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
82
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXConversationVoiceFileTypeProvider, providedIn: 'root' }); }
|
|
83
|
+
}
|
|
84
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXConversationVoiceFileTypeProvider, decorators: [{
|
|
85
|
+
type: Injectable,
|
|
86
|
+
args: [{ providedIn: 'root' }]
|
|
87
|
+
}] });
|
|
88
|
+
|
|
89
|
+
export { AXConversationVoiceFileTypeProvider, AX_CONVERSATION_VOICE_CATALOG, AX_CONVERSATION_VOICE_PRESENTATION, conversationVoiceUtilities, createConversationVoiceFileType };
|
|
90
|
+
//# sourceMappingURL=acorex-components-conversation-conversation-voice.file-type-DDd47o4r.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-components-conversation-conversation-voice.file-type-DDd47o4r.mjs","sources":["../../../../packages/components/conversation/src/lib/plugins/composer/components/voice-recorder/conversation-voice.file-type.ts"],"sourcesContent":["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"],"names":[],"mappings":"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"}
|