stream-chat-angular 6.4.1 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -18
- package/assets/version.d.ts +1 -1
- package/{esm2020 → esm2022}/assets/version.mjs +2 -2
- package/{esm2020 → esm2022}/lib/attachment-configuration.service.mjs +4 -4
- package/esm2022/lib/attachment-list/attachment-list.component.mjs +232 -0
- package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
- package/{esm2020 → esm2022}/lib/attachment.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/avatar/avatar.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/avatar-placeholder/avatar-placeholder.component.mjs +6 -6
- package/esm2022/lib/channel/channel.component.mjs +45 -0
- package/{esm2020 → esm2022}/lib/channel-header/channel-header.component.mjs +6 -6
- package/esm2022/lib/channel-list/channel-list.component.mjs +47 -0
- package/{esm2020 → esm2022}/lib/channel-preview/channel-preview.component.mjs +6 -6
- package/esm2022/lib/channel.service.mjs +1575 -0
- package/{esm2020 → esm2022}/lib/chat-client.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/custom-templates.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/date-parser.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/icon/icon-placeholder/icon-placeholder.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/icon/icon.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/icon/icon.module.mjs +11 -11
- package/{esm2020 → esm2022}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +6 -6
- package/esm2022/lib/message/message.component.mjs +501 -0
- package/{esm2020 → esm2022}/lib/message-actions-box/message-actions-box.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/message-actions.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-blocked/message-blocked.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/message-input/emoji-input.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-input/message-input-config.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-input/message-input.component.mjs +7 -7
- package/{esm2020 → esm2022}/lib/message-input/textarea/textarea.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-input/textarea.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-input/voice-recorder.service.mjs +5 -5
- package/esm2022/lib/message-list/message-list.component.mjs +717 -0
- package/{esm2020 → esm2022}/lib/message-reactions/message-reactions.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/message-reactions-selector/message-reactions-selector.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-reactions.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-text/message-text.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/message.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/modal/modal.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/modal/stream-modal.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/notification/notification.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/notification-list/notification-list.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/notification-list/stream-notification.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/notification.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/paginated-list/paginated-list.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/paginated-list/stream-paginated-list.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/polls/base-poll.component.mjs +5 -5
- package/esm2022/lib/polls/poll/poll.component.mjs +34 -0
- package/{esm2020 → esm2022}/lib/polls/poll-actions/add-option/add-option.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-actions.component.mjs +6 -6
- package/esm2022/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.mjs +82 -0
- package/esm2022/lib/polls/poll-actions/poll-results/poll-results-list/poll-results-list.component.mjs +63 -0
- package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-results/poll-vote/poll-vote.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/polls/poll-actions/upsert-answer/upsert-answer.component.mjs +4 -4
- package/esm2022/lib/polls/poll-composer/poll-composer.component.mjs +134 -0
- package/{esm2020 → esm2022}/lib/polls/poll-header/poll-header.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/polls/poll-option-selector/poll-option-selector.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/polls/poll-options-list/poll-options-list.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/polls/poll-preview/poll-preview.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/polls/stream-polls.module.mjs +41 -41
- package/esm2022/lib/stream-autocomplete-textarea.module.mjs +33 -0
- package/{esm2020 → esm2022}/lib/stream-avatar.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/stream-chat.module.mjs +67 -67
- package/esm2022/lib/stream-i18n.service.mjs +34 -0
- package/esm2022/lib/stream-textarea.module.mjs +31 -0
- package/{esm2020 → esm2022}/lib/theme.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/thread/thread.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/transliteration.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/types.mjs +1 -1
- package/{esm2020 → esm2022}/lib/user-list/user-list.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/transcoder.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
- package/{esm2020 → esm2022}/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recording/voice-recording.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/voice-recording/voice-recording.module.mjs +5 -5
- package/{fesm2020 → fesm2022}/stream-chat-angular.mjs +463 -470
- package/fesm2022/stream-chat-angular.mjs.map +1 -0
- package/lib/attachment-list/attachment-list.component.d.ts +1 -1
- package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
- package/lib/avatar/avatar.component.d.ts +1 -1
- package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
- package/lib/channel-preview/channel-preview.component.d.ts +1 -1
- package/lib/chat-client.service.d.ts +1 -1
- package/lib/custom-templates.service.d.ts +1 -0
- package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +1 -1
- package/lib/icon/icon.component.d.ts +2 -2
- package/lib/message/message.component.d.ts +1 -1
- package/lib/message-actions-box/message-actions-box.component.d.ts +1 -1
- package/lib/message-blocked/message-blocked.component.d.ts +1 -1
- package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -1
- package/lib/message-input/message-input.component.d.ts +1 -1
- package/lib/message-input/textarea/textarea.component.d.ts +1 -1
- package/lib/message-input/textarea.directive.d.ts +1 -1
- package/lib/message-list/group-styles.d.ts +1 -1
- package/lib/message-list/message-list.component.d.ts +1 -1
- package/lib/message-reactions/message-reactions.component.d.ts +1 -1
- package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +1 -1
- package/lib/message-text/message-text.component.d.ts +2 -2
- package/lib/modal/modal.component.d.ts +1 -1
- package/lib/notification/notification.component.d.ts +1 -1
- package/lib/paginated-list/paginated-list.component.d.ts +5 -2
- package/lib/polls/base-poll.component.d.ts +1 -1
- package/lib/polls/poll-actions/add-option/add-option.component.d.ts +1 -1
- package/lib/polls/poll-actions/poll-actions.component.d.ts +2 -2
- package/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.d.ts +1 -1
- package/lib/polls/poll-actions/poll-results/poll-vote/poll-vote.component.d.ts +1 -1
- package/lib/polls/poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component.d.ts +1 -1
- package/lib/polls/poll-actions/upsert-answer/upsert-answer.component.d.ts +1 -1
- package/lib/polls/poll-composer/poll-composer.component.d.ts +2 -2
- package/lib/polls/poll-header/poll-header.component.d.ts +1 -1
- package/lib/polls/poll-option-selector/poll-option-selector.component.d.ts +1 -1
- package/lib/polls/poll-options-list/poll-options-list.component.d.ts +1 -1
- package/lib/types.d.ts +79 -79
- package/lib/user-list/user-list.component.d.ts +1 -1
- package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
- package/lib/voice-recorder/media-recorder.d.ts +2 -2
- package/lib/voice-recorder/transcoder.service.d.ts +4 -4
- package/lib/voice-recorder/voice-recorder.component.d.ts +1 -1
- package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +1 -1
- package/lib/voice-recording/voice-recording.component.d.ts +1 -1
- package/package.json +11 -17
- package/src/assets/version.ts +1 -1
- package/esm2020/lib/attachment-list/attachment-list.component.mjs +0 -232
- package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
- package/esm2020/lib/channel/channel.component.mjs +0 -45
- package/esm2020/lib/channel-list/channel-list.component.mjs +0 -47
- package/esm2020/lib/channel.service.mjs +0 -1575
- package/esm2020/lib/message/message.component.mjs +0 -501
- package/esm2020/lib/message-list/message-list.component.mjs +0 -717
- package/esm2020/lib/polls/poll/poll.component.mjs +0 -34
- package/esm2020/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.mjs +0 -82
- package/esm2020/lib/polls/poll-actions/poll-results/poll-results-list/poll-results-list.component.mjs +0 -63
- package/esm2020/lib/polls/poll-composer/poll-composer.component.mjs +0 -134
- package/esm2020/lib/stream-autocomplete-textarea.module.mjs +0 -33
- package/esm2020/lib/stream-i18n.service.mjs +0 -41
- package/esm2020/lib/stream-textarea.module.mjs +0 -31
- package/fesm2015/stream-chat-angular.mjs +0 -10596
- package/fesm2015/stream-chat-angular.mjs.map +0 -1
- package/fesm2020/stream-chat-angular.mjs.map +0 -1
- /package/{esm2020 → esm2022}/assets/i18n/en.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/channel-query.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/file-utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/format-duration.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/get-channel-display-text.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/get-message-translation.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/injection-tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/is-image-attachment.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/is-on-separate-date.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/is-safari.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/list-users.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/message-input/textarea.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/message-list/group-styles.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/message-preview.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/parse-date.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/polls/poll-composer/validators.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/polls/unique.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/read-by.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/types-custom.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/virtualized-list.service.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/virtualized-message-list.service.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/voice-recorder/media-recorder.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/voice-recorder/mp3-transcoder.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/wave-form-sampler.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/stream-chat-angular.mjs +0 -0
- /package/{esm2020 → esm2022}/stream-chat.mjs +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stream-chat-angular.mjs","sources":["../../../projects/stream-chat-angular/src/assets/version.ts","../../../projects/stream-chat-angular/src/lib/notification.service.ts","../../../projects/stream-chat-angular/src/lib/chat-client.service.ts","../../../projects/stream-chat-angular/src/lib/get-message-translation.ts","../../../projects/stream-chat-angular/src/lib/message-preview.ts","../../../projects/stream-chat-angular/src/lib/read-by.ts","../../../projects/stream-chat-angular/src/lib/channel-query.ts","../../../projects/stream-chat-angular/src/lib/channel.service.ts","../../../projects/stream-chat-angular/src/lib/theme.service.ts","../../../projects/stream-chat-angular/src/lib/file-utils.ts","../../../projects/stream-chat-angular/src/lib/is-image-attachment.ts","../../../projects/stream-chat-angular/src/lib/message.service.ts","../../../projects/stream-chat-angular/src/lib/attachment.service.ts","../../../projects/stream-chat-angular/src/lib/attachment-configuration.service.ts","../../../projects/stream-chat-angular/src/assets/i18n/en.ts","../../../projects/stream-chat-angular/src/lib/stream-i18n.service.ts","../../../projects/stream-chat-angular/src/lib/avatar/avatar.component.ts","../../../projects/stream-chat-angular/src/lib/avatar/avatar.component.html","../../../projects/stream-chat-angular/src/lib/custom-templates.service.ts","../../../projects/stream-chat-angular/src/lib/avatar-placeholder/avatar-placeholder.component.ts","../../../projects/stream-chat-angular/src/lib/avatar-placeholder/avatar-placeholder.component.html","../../../projects/stream-chat-angular/src/lib/icon/icon.component.ts","../../../projects/stream-chat-angular/src/lib/icon/icon.component.html","../../../projects/stream-chat-angular/src/lib/icon/icon-placeholder/icon-placeholder.component.ts","../../../projects/stream-chat-angular/src/lib/icon/icon-placeholder/icon-placeholder.component.html","../../../projects/stream-chat-angular/src/lib/icon/loading-indicator/loading-indicator.component.ts","../../../projects/stream-chat-angular/src/lib/icon/loading-indicator/loading-indicator.component.html","../../../projects/stream-chat-angular/src/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.ts","../../../projects/stream-chat-angular/src/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.html","../../../projects/stream-chat-angular/src/lib/message-actions.service.ts","../../../projects/stream-chat-angular/src/lib/message-reactions.service.ts","../../../projects/stream-chat-angular/src/lib/message-reactions-selector/message-reactions-selector.component.ts","../../../projects/stream-chat-angular/src/lib/message-reactions-selector/message-reactions-selector.component.html","../../../projects/stream-chat-angular/src/lib/message-actions-box/message-actions-box.component.ts","../../../projects/stream-chat-angular/src/lib/message-actions-box/message-actions-box.component.html","../../../projects/stream-chat-angular/src/lib/notification/notification.component.ts","../../../projects/stream-chat-angular/src/lib/notification/notification.component.html","../../../projects/stream-chat-angular/src/lib/notification-list/notification-list.component.ts","../../../projects/stream-chat-angular/src/lib/notification-list/notification-list.component.html","../../../projects/stream-chat-angular/src/lib/modal/modal.component.ts","../../../projects/stream-chat-angular/src/lib/modal/modal.component.html","../../../projects/stream-chat-angular/src/lib/message-bounce-prompt/message-bounce-prompt.component.ts","../../../projects/stream-chat-angular/src/lib/message-bounce-prompt/message-bounce-prompt.component.html","../../../projects/stream-chat-angular/src/lib/channel/channel.component.ts","../../../projects/stream-chat-angular/src/lib/channel/channel.component.html","../../../projects/stream-chat-angular/src/lib/list-users.ts","../../../projects/stream-chat-angular/src/lib/get-channel-display-text.ts","../../../projects/stream-chat-angular/src/lib/channel-header/channel-header.component.ts","../../../projects/stream-chat-angular/src/lib/channel-header/channel-header.component.html","../../../projects/stream-chat-angular/src/lib/is-on-separate-date.ts","../../../projects/stream-chat-angular/src/lib/parse-date.ts","../../../projects/stream-chat-angular/src/lib/date-parser.service.ts","../../../projects/stream-chat-angular/src/lib/channel-preview/channel-preview.component.ts","../../../projects/stream-chat-angular/src/lib/channel-preview/channel-preview.component.html","../../../projects/stream-chat-angular/src/lib/paginated-list/paginated-list.component.ts","../../../projects/stream-chat-angular/src/lib/paginated-list/paginated-list.component.html","../../../projects/stream-chat-angular/src/lib/channel-list/channel-list.component.ts","../../../projects/stream-chat-angular/src/lib/channel-list/channel-list.component.html","../../../projects/stream-chat-angular/src/lib/is-safari.ts","../../../projects/stream-chat-angular/src/lib/format-duration.ts","../../../projects/stream-chat-angular/src/lib/wave-form-sampler.ts","../../../projects/stream-chat-angular/src/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.ts","../../../projects/stream-chat-angular/src/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.html","../../../projects/stream-chat-angular/src/lib/voice-recording/voice-recording.component.ts","../../../projects/stream-chat-angular/src/lib/voice-recording/voice-recording.component.html","../../../projects/stream-chat-angular/src/lib/attachment-list/attachment-list.component.ts","../../../projects/stream-chat-angular/src/lib/attachment-list/attachment-list.component.html","../../../projects/stream-chat-angular/src/lib/user-list/user-list.component.ts","../../../projects/stream-chat-angular/src/lib/user-list/user-list.component.html","../../../projects/stream-chat-angular/src/lib/message-reactions/message-reactions.component.ts","../../../projects/stream-chat-angular/src/lib/message-reactions/message-reactions.component.html","../../../projects/stream-chat-angular/src/lib/message-text/message-text.component.ts","../../../projects/stream-chat-angular/src/lib/message-text/message-text.component.html","../../../projects/stream-chat-angular/src/lib/message-blocked/message-blocked.component.ts","../../../projects/stream-chat-angular/src/lib/message-blocked/message-blocked.component.html","../../../projects/stream-chat-angular/src/lib/message/message.component.ts","../../../projects/stream-chat-angular/src/lib/message/message.component.html","../../../projects/stream-chat-angular/src/lib/injection-tokens.ts","../../../projects/stream-chat-angular/src/lib/message-input/textarea.directive.ts","../../../projects/stream-chat-angular/src/lib/message-input/emoji-input.service.ts","../../../projects/stream-chat-angular/src/lib/message-input/voice-recorder.service.ts","../../../projects/stream-chat-angular/src/lib/message-input/message-input-config.service.ts","../../../projects/stream-chat-angular/src/lib/voice-recorder/media-recorder.ts","../../../projects/stream-chat-angular/src/lib/voice-recorder/transcoder.service.ts","../../../projects/stream-chat-angular/src/lib/voice-recorder/amplitude-recorder.service.ts","../../../projects/stream-chat-angular/src/lib/voice-recorder/audio-recorder.service.ts","../../../projects/stream-chat-angular/src/lib/attachment-preview-list/attachment-preview-list.component.ts","../../../projects/stream-chat-angular/src/lib/attachment-preview-list/attachment-preview-list.component.html","../../../projects/stream-chat-angular/src/lib/message-input/message-input.component.ts","../../../projects/stream-chat-angular/src/lib/message-input/message-input.component.html","../../../projects/stream-chat-angular/src/lib/message-input/textarea/textarea.component.ts","../../../projects/stream-chat-angular/src/lib/message-input/textarea/textarea.component.html","../../../projects/stream-chat-angular/src/lib/transliteration.service.ts","../../../projects/stream-chat-angular/src/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.ts","../../../projects/stream-chat-angular/src/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.html","../../../projects/stream-chat-angular/src/lib/message-list/group-styles.ts","../../../projects/stream-chat-angular/src/lib/virtualized-list.service.ts","../../../projects/stream-chat-angular/src/lib/virtualized-message-list.service.ts","../../../projects/stream-chat-angular/src/lib/message-list/message-list.component.ts","../../../projects/stream-chat-angular/src/lib/message-list/message-list.component.html","../../../projects/stream-chat-angular/src/lib/thread/thread.component.ts","../../../projects/stream-chat-angular/src/lib/thread/thread.component.html","../../../projects/stream-chat-angular/src/lib/stream-avatar.module.ts","../../../projects/stream-chat-angular/src/lib/icon/icon.module.ts","../../../projects/stream-chat-angular/src/lib/voice-recording/voice-recording.module.ts","../../../projects/stream-chat-angular/src/lib/modal/stream-modal.module.ts","../../../projects/stream-chat-angular/src/lib/notification-list/stream-notification.module.ts","../../../projects/stream-chat-angular/src/lib/paginated-list/stream-paginated-list.module.ts","../../../projects/stream-chat-angular/src/lib/stream-chat.module.ts","../../../projects/stream-chat-angular/src/lib/stream-autocomplete-textarea.module.ts","../../../projects/stream-chat-angular/src/lib/stream-textarea.module.ts","../../../projects/stream-chat-angular/src/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.ts","../../../projects/stream-chat-angular/src/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.html","../../../projects/stream-chat-angular/src/lib/voice-recorder/voice-recorder.component.ts","../../../projects/stream-chat-angular/src/lib/voice-recorder/voice-recorder.component.html","../../../projects/stream-chat-angular/src/lib/voice-recorder/voice-recorder.module.ts","../../../projects/stream-chat-angular/src/lib/voice-recorder/mp3-transcoder.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-composer/validators.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-composer/poll-composer.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-composer/poll-composer.component.html","../../../projects/stream-chat-angular/src/lib/polls/base-poll.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-header/poll-header.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-header/poll-header.component.html","../../../projects/stream-chat-angular/src/lib/polls/poll-option-selector/poll-option-selector.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-option-selector/poll-option-selector.component.html","../../../projects/stream-chat-angular/src/lib/polls/poll-options-list/poll-options-list.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-options-list/poll-options-list.component.html","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/poll-results/poll-vote/poll-vote.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/poll-results/poll-vote/poll-vote.component.html","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component.html","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/poll-results/poll-results-list/poll-results-list.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/poll-results/poll-results-list/poll-results-list.component.html","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.html","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/upsert-answer/upsert-answer.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/upsert-answer/upsert-answer.component.html","../../../projects/stream-chat-angular/src/lib/polls/unique.validator.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/add-option/add-option.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/add-option/add-option.component.html","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/poll-actions.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-actions/poll-actions.component.html","../../../projects/stream-chat-angular/src/lib/polls/poll/poll.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll/poll.component.html","../../../projects/stream-chat-angular/src/lib/polls/poll-preview/poll-preview.component.ts","../../../projects/stream-chat-angular/src/lib/polls/poll-preview/poll-preview.component.html","../../../projects/stream-chat-angular/src/lib/polls/stream-polls.module.ts","../../../projects/stream-chat-angular/src/public-api.ts","../../../projects/stream-chat-angular/src/stream-chat-angular.ts"],"sourcesContent":["export const version = '6.4.1';\n","import { Injectable, TemplateRef } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { NotificationPayload, NotificationType } from './types';\n\n/**\n * The `NotificationService` can be used to add or remove notifications. By default the [`NotificationList`](/chat/docs/sdk/angular/components/NotificationListComponent/) component displays the currently active notifications.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationService {\n /**\n * Emits the currently active [notifications](https://github.com/GetStream/stream-chat-angular/blob/master/projects/stream-chat-angular/src/lib/notification.service.ts).\n */\n notifications$: Observable<NotificationPayload[]>;\n private notificationsSubject = new BehaviorSubject<NotificationPayload[]>([]);\n\n constructor() {\n this.notifications$ = this.notificationsSubject.asObservable();\n }\n\n /**\n * Displays a notification for the given amount of time.\n * @param content The text of the notification or the HTML template for the notification\n * @param type The type of the notification\n * @param timeout The number of milliseconds while the notification should be visible\n * @param translateParams Translation parameters for the `content` (for text notifications)\n * @param templateContext The input of the notification template (for HTML notifications)\n * @returns A method to clear the notification (before the timeout).\n */\n addTemporaryNotification<T>(\n content: string | TemplateRef<T>,\n type: NotificationType = 'error',\n timeout: number = 5000,\n translateParams?: object,\n templateContext?: T\n ) {\n const notification = this.createNotification<T>(\n content,\n type,\n translateParams,\n templateContext\n );\n const id = setTimeout(\n () => this.removeNotification(notification.id),\n timeout\n );\n notification.dismissFn = () => {\n clearTimeout(id);\n this.removeNotification(notification.id);\n };\n this.notificationsSubject.next([\n ...this.notificationsSubject.getValue(),\n notification,\n ]);\n\n return notification.dismissFn;\n }\n\n /**\n * Displays a notification, that will be visible until it's removed.\n * @param content The text of the notification or the HTML template for the notification\n * @param type The type of the notification\n * @param translateParams Translation parameters for the `content` (for text notifications)\n * @param templateContext The input of the notification template (for HTML notifications)\n * @returns A method to clear the notification.\n */\n addPermanentNotification<T = object>(\n content: string | TemplateRef<T>,\n type: NotificationType = 'error',\n translateParams?: object,\n templateContext?: T\n ) {\n const notification = this.createNotification<T>(\n content,\n type,\n translateParams,\n templateContext\n );\n this.notificationsSubject.next([\n ...this.notificationsSubject.getValue(),\n notification,\n ]);\n\n return notification.dismissFn;\n }\n\n private createNotification<T>(\n content: string | TemplateRef<T>,\n type: NotificationType,\n translateParams?: object,\n templateContext?: T\n ) {\n const id = new Date().getTime().toString() + Math.random().toString();\n return {\n id,\n [typeof content === 'string' ? 'text' : 'template']: content,\n type,\n translateParams,\n templateContext: templateContext ?? {},\n dismissFn: () => this.removeNotification(id),\n };\n }\n\n private removeNotification(id: string) {\n const notifications = this.notificationsSubject.getValue();\n const index = notifications.findIndex((n) => n.id === id);\n if (index === -1) {\n return;\n }\n notifications.splice(index, 1);\n this.notificationsSubject.next([...notifications]);\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { BehaviorSubject, Observable, ReplaySubject } from 'rxjs';\nimport {\n AppSettingsAPIResponse,\n Channel,\n ChannelFilters,\n ConnectAPIResponse,\n OwnUserResponse,\n StreamChatOptions,\n UserFilters,\n UserResponse,\n} from 'stream-chat';\nimport { AppSettings, Event, StreamChat, TokenOrProvider } from 'stream-chat';\nimport { version } from '../assets/version';\nimport { NotificationService } from './notification.service';\nimport { take } from 'rxjs/operators';\n\nexport type ClientEvent = {\n eventType: string;\n event: Event;\n};\n\n/**\n * The `ChatClient` service connects the user to the Stream chat.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ChatClientService {\n /**\n * The [StreamChat client](https://github.com/GetStream/stream-chat-js/blob/master/src/client.ts) instance. In general you shouldn't need to access the client, but it's there if you want to use it.\n */\n chatClient!: StreamChat;\n /**\n * Emits [`ClientEvent`](https://github.com/GetStream/stream-chat-angular/blob/master/projects/stream-chat-angular/src/lib/chat-client.service.ts) events. The platform documentation covers [the list of client, user presence and notification events](/chat/docs/javascript/event_object/).\n * :::important\n * For performance reasons this Observable operates outside of the Angular change detection zone. If you subscribe to it, you need to manually reenter Angular's change detection zone, our [Change detection guide](/chat/docs/sdk/angular/concepts/change-detection/) explains this in detail.\n * :::\n */\n events$: Observable<ClientEvent>;\n /**\n * Emits the current [application settings](/chat/docs/javascript/app_setting_overview/). Since getting the application settings is an expensive API call and we don't always need the result, this is not initialized by default, you need to call `getApplicationSettings` to load them.\n */\n appSettings$: Observable<AppSettings | undefined>;\n /**\n * Emits the current connection state of the user (`online` or `offline`)\n */\n connectionState$: Observable<'offline' | 'online'>;\n /**\n * Emits the list of pending invites of the user. It emits every pending invitation during initialization and then extends the list when a new invite is received. More information can be found in the [channel invitations](/chat/docs/sdk/angular/code-examples/channel-invites/) guide.\n */\n pendingInvites$: Observable<Channel[]>;\n /**\n * Emits the current chat user\n */\n user$: Observable<OwnUserResponse | UserResponse | undefined>;\n private notificationSubject = new ReplaySubject<ClientEvent>(1);\n private connectionStateSubject = new ReplaySubject<'offline' | 'online'>(1);\n private appSettingsSubject = new BehaviorSubject<AppSettings | undefined>(\n undefined\n );\n private pendingInvitesSubject = new BehaviorSubject<Channel[]>([]);\n private userSubject = new ReplaySubject<\n OwnUserResponse | UserResponse | undefined\n >(1);\n private subscriptions: { unsubscribe: () => void }[] = [];\n private trackPendingChannelInvites = true;\n private appSettingsPromise?: Promise<AppSettingsAPIResponse>;\n\n constructor(\n private ngZone: NgZone,\n private notificationService: NotificationService\n ) {\n this.events$ = this.notificationSubject.asObservable();\n this.connectionState$ = this.connectionStateSubject.asObservable();\n this.appSettings$ = this.appSettingsSubject.asObservable();\n this.pendingInvites$ = this.pendingInvitesSubject.asObservable();\n this.user$ = this.userSubject.asObservable();\n }\n\n /**\n * Creates a [`StreamChat`](https://github.com/GetStream/stream-chat-js/blob/668b3e5521339f4e14fc657834531b4c8bf8176b/src/client.ts#L124) instance using the provided `apiKey`, and connects a user with the given meta data and token. More info about [connecting users](/chat/docs/javascript/init_and_users/) can be found in the platform documentation.\n * @param apiKey\n * @param userOrId you can emit this for anonymous logins\n * @param userTokenOrProvider You can provide:<ul>\n * <li> a token, </li>\n * <li> a token provider, a method that returns `Promise<string>`, which can be called when the previous token expires (recommended setup for production applications)</li>\n * <li> the keyword 'guest' to connect as [guest user](/chat/docs/javascript/authless_users/#guest-users) </li>\n * <li> the keyword 'anonymous' to connect as [anonymous user](/chat/docs/javascript/authless_users/#anonymous-users) </li>\n * </ul>\n * @param clientOptions Setting to provide to the Stream client instance\n */\n async init(\n apiKey: string,\n userOrId: string | OwnUserResponse | UserResponse | undefined,\n userTokenOrProvider: TokenOrProvider,\n clientOptions?: StreamChatOptions & {\n trackPendingChannelInvites?: boolean;\n }\n ): ConnectAPIResponse {\n if (this.chatClient && this.chatClient.key !== apiKey) {\n this.appSettingsSubject.next(undefined);\n this.appSettingsPromise = undefined;\n }\n this.trackPendingChannelInvites =\n clientOptions?.trackPendingChannelInvites === true;\n this.chatClient = StreamChat.getInstance(apiKey, clientOptions);\n this.chatClient.sdkIdentifier = {\n name: 'angular',\n version,\n };\n this.chatClient.recoverStateOnReconnect = false;\n this.chatClient.devToken;\n let result;\n await this.ngZone.runOutsideAngular(async () => {\n const user = typeof userOrId === 'string' ? { id: userOrId } : userOrId;\n try {\n result = await (\n {\n guest: () => this.chatClient.setGuestUser(user!),\n anonymous: () => this.chatClient.connectAnonymousUser(),\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n }[`${userTokenOrProvider}`] ??\n (() => this.chatClient.connectUser(user!, userTokenOrProvider))\n )();\n } catch (error) {\n this.notificationService.addPermanentNotification(\n 'streamChat.Error connecting to chat, refresh the page to try again.',\n 'error'\n );\n throw error;\n }\n this.userSubject.next(\n this.chatClient.user ? { ...this.chatClient.user } : undefined\n );\n });\n if (this.chatClient.user?.id && this.trackPendingChannelInvites) {\n const channels = await this.chatClient.queryChannels(\n {\n invite: 'pending',\n members: { $in: [this.chatClient.user?.id] },\n } as unknown as ChannelFilters // TODO: find out why we need this typecast\n );\n this.pendingInvitesSubject.next(channels);\n }\n this.subscriptions.push(\n this.chatClient.on((e) => {\n this.updateUser(e);\n this.updatePendingInvites(e);\n this.notificationSubject.next({\n eventType: e.type,\n event: e,\n });\n })\n );\n let removeNotification: undefined | (() => void);\n this.subscriptions.push(\n this.chatClient.on('connection.changed', (e) => {\n this.ngZone.run(() => {\n const isOnline = e.online;\n if (isOnline) {\n if (removeNotification) {\n removeNotification();\n }\n } else {\n removeNotification =\n this.notificationService.addPermanentNotification(\n 'streamChat.Connection failure, reconnecting now...'\n );\n }\n this.connectionStateSubject.next(isOnline ? 'online' : 'offline');\n });\n })\n );\n return result;\n }\n\n /**\n * Disconnects the current user, and closes the WebSocket connection. Useful when disconnecting a chat user, use in combination with [`reset`](/chat/docs/sdk/angular/services/ChannelService/#reset/).\n */\n async disconnectUser() {\n this.pendingInvitesSubject.next([]);\n await this.chatClient.disconnectUser();\n this.userSubject.next(undefined);\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n /**\n * Loads the current [application settings](/chat/docs/javascript/app_setting_overview/), if the application settings have already been loaded, it does nothing.\n */\n async getAppSettings() {\n if (this.appSettingsPromise) {\n return;\n }\n if (this.appSettingsSubject.getValue()) {\n return;\n }\n this.appSettingsPromise = this.chatClient.getAppSettings();\n void this.appSettingsPromise.finally(() => {\n this.appSettingsPromise = undefined;\n });\n const settings = await this.appSettingsPromise;\n this.appSettingsSubject.next((settings.app as AppSettings) || {});\n }\n\n /**\n * Flag the message with the given ID. If you want to know [more about flags](/chat/docs/javascript/moderation/) check out the platform documentation.\n * @param messageId\n */\n async flagMessage(messageId: string) {\n await this.chatClient.flagMessage(messageId);\n }\n\n /**\n * Searches for users in the application that have ID or name matching the provided search term\n * @param searchTerm\n * @returns The users matching the search\n */\n async autocompleteUsers(searchTerm: string) {\n if (!searchTerm) {\n return [];\n }\n const result = await this.chatClient.queryUsers({\n $or: [\n { id: { $autocomplete: searchTerm } },\n { name: { $autocomplete: searchTerm } },\n ],\n } as UserFilters); // TODO: find out why we need this typecast\n return result.users.filter((u) => u.id !== this.chatClient?.user?.id);\n }\n\n private updatePendingInvites(e: Event) {\n if (!this.trackPendingChannelInvites) {\n return;\n }\n if (e.member?.user?.id === this.chatClient.user?.id && e.channel) {\n const pendingInvites = this.pendingInvitesSubject.getValue();\n if (e.type === 'notification.invited') {\n const channel = this.chatClient.channel(e.channel?.type, e.channel?.id);\n this.pendingInvitesSubject.next([...pendingInvites, channel]);\n } else if (\n e.type === 'notification.invite_accepted' ||\n e.type === 'notification.invite_rejected'\n ) {\n const index = pendingInvites.findIndex(\n (i) => i?.cid === e.channel?.cid\n );\n if (index !== -1) {\n pendingInvites.splice(index, 1);\n this.pendingInvitesSubject.next([...pendingInvites]);\n }\n }\n }\n }\n\n private updateUser(e: Event) {\n if (typeof e.total_unread_count !== 'undefined') {\n let user: OwnUserResponse | UserResponse | undefined;\n this.userSubject.pipe(take(1)).subscribe((u) => {\n user = u;\n });\n if (\n user &&\n 'total_unread_count' in user &&\n user.total_unread_count !== e.total_unread_count\n ) {\n this.userSubject.next({\n ...user,\n total_unread_count: e.total_unread_count,\n });\n }\n }\n if (typeof e.unread_channels !== 'undefined') {\n let user: OwnUserResponse | UserResponse | undefined;\n this.userSubject.pipe(take(1)).subscribe((u) => {\n user = u;\n });\n if (\n user &&\n 'unread_channels' in user &&\n user.unread_channels !== e.unread_channels\n ) {\n this.userSubject.next({\n ...user,\n unread_channels: e.unread_channels,\n });\n }\n }\n if (typeof e.unread_count !== 'undefined') {\n let user: OwnUserResponse | UserResponse | undefined;\n this.userSubject.pipe(take(1)).subscribe((u) => {\n user = u;\n });\n if (\n user &&\n 'unread_count' in user &&\n user.unread_count !== e.unread_count\n ) {\n this.userSubject.next({\n ...user,\n unread_count: e.unread_count,\n });\n }\n }\n if (\n e.type === 'user.updated' &&\n this.chatClient.user &&\n e.user?.id === this.chatClient.user.id\n ) {\n this.userSubject.next({ ...this.chatClient.user });\n }\n }\n}\n","import {\n Channel,\n FormatMessageResponse,\n MessageResponse,\n TranslationLanguages,\n UserResponse,\n} from 'stream-chat';\nimport { StreamMessage } from './types';\n\nexport const getMessageTranslation = (\n message?: StreamMessage | MessageResponse | FormatMessageResponse,\n channel?: Channel,\n user?: UserResponse\n) => {\n const language =\n user?.language ||\n (channel?.data?.auto_translation_language as TranslationLanguages);\n if (language && message?.i18n && message?.user?.id !== user?.id) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-base-to-string\n return message.i18n[`${language}_text`];\n } else {\n return undefined;\n }\n};\n","import {\n Attachment,\n CustomMessageData,\n MessageResponse,\n UserResponse,\n} from 'stream-chat';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport const createMessagePreview = (\n user: UserResponse,\n text: string,\n attachments: Attachment[] = [],\n mentionedUsers: UserResponse[] = [],\n parentId: undefined | string = undefined,\n quotedMessageId: undefined | string = undefined,\n customData: undefined | CustomMessageData,\n pollId: undefined | string = undefined\n) => {\n const clientSideId = `${user.id}-${uuidv4()}`;\n\n return {\n __html: text,\n created_at: new Date(),\n html: text,\n id: clientSideId,\n reactions: [],\n status: 'sending',\n text,\n type: 'regular',\n user,\n attachments,\n mentioned_users: mentionedUsers,\n parent_id: parentId,\n quoted_message_id: quotedMessageId,\n poll_id: pollId,\n ...customData,\n } as unknown as MessageResponse;\n};\n","import { Channel, FormatMessageResponse, UserResponse } from 'stream-chat';\n\nexport const getReadBy = (message: FormatMessageResponse, channel: Channel) => {\n const readBy: UserResponse[] = [];\n Object.keys(channel.state.read).forEach((key) => {\n if (\n channel.state.read[key].last_read.getTime() >=\n message.created_at.getTime() &&\n message.user?.id !== key\n ) {\n readBy.push(channel.state.read[key].user);\n }\n });\n\n return readBy;\n};\n","import {\n Channel,\n ChannelFilters,\n ChannelOptions,\n ChannelSort,\n} from 'stream-chat';\nimport { ChannelService } from './channel.service';\nimport {\n ChannelQueryResult,\n ChannelQueryType,\n NextPageConfiguration,\n} from './types';\nimport { ChatClientService } from './chat-client.service';\n\n/**\n * This class allows you to make paginated channel query requests.\n */\nexport class ChannelQuery {\n /**\n * By default the SDK uses an offset based pagination, you can change/extend this by providing your own custom paginator method.\n *\n * The method will be called with the result of the latest channel query.\n *\n * You can return either an offset, or a filter using the [`$lte`/`$gte` operator](/chat/docs/javascript/query_syntax_operators/). If you return a filter, it will be merged with the filter provided for the `init` method.\n */\n customPaginator?: (channelQueryResult: Channel[]) => NextPageConfiguration;\n private nextPageConfiguration?: NextPageConfiguration;\n\n constructor(\n private chatService: ChatClientService,\n private channelService: ChannelService,\n private filters: ChannelFilters,\n private sort: ChannelSort = { last_message_at: -1 },\n private options: ChannelOptions = {\n limit: 25,\n state: true,\n presence: true,\n watch: true,\n }\n ) {}\n\n async query(queryType: ChannelQueryType): Promise<ChannelQueryResult> {\n if (queryType === 'first-page' || queryType === 'recover-state') {\n this.nextPageConfiguration = undefined;\n }\n const prevChannels =\n queryType === 'recover-state' ? [] : this.channelService.channels;\n let filters: ChannelFilters;\n let options: ChannelOptions;\n if (this.nextPageConfiguration) {\n if (this.nextPageConfiguration.type === 'filter') {\n filters = {\n ...this.filters,\n ...this.nextPageConfiguration.paginationFilter,\n };\n options = this.options;\n } else {\n options = {\n ...this.options,\n offset: this.nextPageConfiguration.offset,\n };\n filters = this.filters;\n }\n } else {\n filters = this.filters;\n options = this.options;\n }\n const channels = await this.chatService.chatClient.queryChannels(\n filters,\n this.sort || {},\n options\n );\n this.setNextPageConfiguration(channels);\n\n const currentActiveChannel = this.channelService.activeChannel;\n if (\n queryType === 'recover-state' &&\n currentActiveChannel &&\n !channels.find((c) => c.cid === currentActiveChannel?.cid)\n ) {\n try {\n await currentActiveChannel.watch();\n channels.unshift(currentActiveChannel);\n } catch (error) {\n this.chatService.chatClient.logger(\n 'warn',\n 'Unable to refetch active channel after state recover',\n error as Record<string, unknown>\n );\n }\n }\n\n return {\n channels: [...prevChannels, ...channels],\n hasMorePage: channels.length >= this.options.limit!,\n };\n }\n\n setNextPageConfiguration(channelQueryResult: Channel[]) {\n if (this.customPaginator) {\n this.nextPageConfiguration = this.customPaginator(channelQueryResult);\n } else {\n this.nextPageConfiguration = {\n type: 'offset',\n offset:\n (this.nextPageConfiguration?.type === 'offset'\n ? this.nextPageConfiguration.offset\n : 0) + channelQueryResult.length,\n };\n }\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport {\n BehaviorSubject,\n combineLatest,\n Observable,\n ReplaySubject,\n Subscription,\n} from 'rxjs';\nimport { filter, first, map, shareReplay, take } from 'rxjs/operators';\nimport {\n Attachment,\n Channel,\n ChannelFilters,\n ChannelOptions,\n ChannelResponse,\n ChannelSort,\n CustomMessageData,\n CustomReactionData,\n Event,\n EventTypes,\n FormatMessageResponse,\n LocalMessage,\n MemberFilters,\n Message,\n MessageResponse,\n ReactionResponse,\n UserResponse,\n} from 'stream-chat';\nimport { ChatClientService, ClientEvent } from './chat-client.service';\nimport { getMessageTranslation } from './get-message-translation';\nimport { createMessagePreview } from './message-preview';\nimport { NotificationService } from './notification.service';\nimport { getReadBy } from './read-by';\nimport {\n AttachmentUpload,\n AttachmentUploadErrorReason,\n ChannelQueryResult,\n ChannelQueryState,\n ChannelQueryType,\n MessageInput,\n MessageReactionType,\n NextPageConfiguration,\n StreamMessage,\n} from './types';\nimport { ChannelQuery } from './channel-query';\n\n/**\n * The `ChannelService` provides data and interaction for the channel list and message list.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ChannelService {\n /**\n * Emits `false` if there are no more pages of channels that can be loaded.\n */\n hasMoreChannels$: Observable<boolean>;\n /**\n * Emits the currently loaded and [watched](/chat/docs/javascript/watch_channel/) channel list.\n *\n * :::important\n * If you want to subscribe to channel events, you need to manually reenter Angular's change detection zone, our [Change detection guide](/chat/docs/sdk/angular/concepts/change-detection/) explains this in detail.\n * :::\n */\n channels$: Observable<Channel[] | undefined>;\n /**\n * The result of the latest channel query request.\n */\n channelQueryState$: Observable<ChannelQueryState | undefined>;\n /**\n * Emits the currently active channel.\n *\n * :::important\n * If you want to subscribe to channel events, you need to manually reenter Angular's change detection zone, our [Change detection guide](/chat/docs/sdk/angular/concepts/change-detection/) explains this in detail.\n * :::\n *\n * The active channel will always be marked as read when a new message is received\n */\n activeChannel$: Observable<Channel | undefined>;\n /**\n * Emits the list of currently loaded messages of the active channel.\n */\n activeChannelMessages$: Observable<StreamMessage[]>;\n /**\n * Emits the list of pinned messages of the active channel.\n */\n activeChannelPinnedMessages$: Observable<StreamMessage[]>;\n /**\n * Emits the id of the currently selected parent message. If no message is selected, it emits undefined.\n */\n activeParentMessageId$: Observable<string | undefined>;\n /**\n * Emits the list of currently loaded thread replies belonging to the selected parent message. If there is no currently active thread it emits an empty array.\n */\n activeThreadMessages$: Observable<StreamMessage[]>;\n /**\n * Emits the currently selected parent message. If no message is selected, it emits undefined.\n */\n activeParentMessage$: Observable<StreamMessage | undefined>;\n /**\n * Emits the currently selected message to quote\n */\n messageToQuote$: Observable<StreamMessage | undefined>;\n /**\n * Emits the ID of the message the message list should jump to (can be a channel message or thread message)\n */\n jumpToMessage$: Observable<{ id?: string; parentId?: string }>;\n /**\n * Emits the list of users that are currently typing in the channel (current user is not included)\n */\n usersTypingInChannel$: Observable<UserResponse[]>;\n /**\n * Emits the list of users that are currently typing in the active thread (current user is not included)\n */\n usersTypingInThread$: Observable<UserResponse[]>;\n /**\n * Emits a map that contains the date of the latest message sent by the current user by channels (this is used to detect if slow mode countdown should be started)\n */\n latestMessageDateByUserByChannels$: Observable<{ [key: string]: Date }>;\n /**\n * If you're using [semantic filters for moderation](/moderation/docs/) you can set up rules for bouncing messages.\n *\n * If a message is bounced, it will be emitted via this `Observable`. The built-in [`MessageBouncePrompt` component](/chat/docs/sdk/angular/components/MessageBouncePromptComponent/) will display the bounce option to the user if a bounced message is clicked.\n */\n bouncedMessage$: BehaviorSubject<StreamMessage | undefined>;\n /**\n * The last read message id of the active channel, it's used by the message list component to display unread UI, and jump to latest read message\n *\n * This property isn't always updated, please use `channel.read` to display up-to-date read information\n */\n activeChannelLastReadMessageId?: string;\n /**\n * The unread count of the active channel, it's used by the message list component to display unread UI\n *\n * This property isn't always updated, please use `channel.read` to display up-to-date read information\n */\n activeChannelUnreadCount?: number;\n /**\n * Custom event handler to call if a new message received from a channel that is not being watched, provide an event handler if you want to override the [default channel list ordering](/chat/docs/sdk/angular/services/ChannelService/#channels/)\n *\n * If you're adding a new channel, make sure that it's a [watched](/chat/docs/javascript/watch_channel/) channel.\n */\n customNewMessageNotificationHandler?: (\n clientEvent: ClientEvent,\n channelListSetter: (\n channels: Channel[],\n shouldStopWatchingRemovedChannels?: boolean\n ) => void\n ) => void;\n /**\n * Custom event handler to call when the user is added to a channel, provide an event handler if you want to override the [default channel list ordering](/chat/docs/sdk/angular/services/ChannelService/#channels/).\n *\n * If you're adding a new channel, make sure that it's a [watched](/chat/docs/javascript/watch_channel/) channel.\n */\n customAddedToChannelNotificationHandler?: (\n clientEvent: ClientEvent,\n channelListSetter: (\n channels: Channel[],\n shouldStopWatchingRemovedChannels?: boolean\n ) => void\n ) => void;\n /**\n * Custom event handler to call when the user is removed from a channel, provide an event handler if you want to override the [default channel list ordering](/chat/docs/sdk/angular/services/ChannelService/#channels/).\n *\n * If you're adding a new channel, make sure that it's a [watched](/chat/docs/javascript/watch_channel/) channel.\n */\n customRemovedFromChannelNotificationHandler?: (\n clientEvent: ClientEvent,\n channelListSetter: (\n channels: Channel[],\n shouldStopWatchingRemovedChannels?: boolean\n ) => void\n ) => void;\n /**\n * Custom event handler to call when a channel is deleted, provide an event handler if you want to override the [default channel list ordering](/chat/docs/sdk/angular/services/ChannelService/#channels/).\n *\n * If you're adding a new channel, make sure that it's a [watched](/chat/docs/javascript/watch_channel/) channel.\n */\n customChannelDeletedHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (\n channels: Channel[],\n shouldStopWatchingRemovedChannels?: boolean\n ) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n /**\n * Custom event handler to call when a channel is updated, provide an event handler if you want to override the [default channel list ordering](/chat/docs/sdk/angular/services/ChannelService/#channels/).\n *\n * If you're adding a new channel, make sure that it's a [watched](/chat/docs/javascript/watch_channel/) channel.\n */\n customChannelUpdatedHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (\n channels: Channel[],\n shouldStopWatchingRemovedChannels?: boolean\n ) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n /**\n * Custom event handler to call when a channel is truncated, provide an event handler if you want to override the [default channel list ordering](/chat/docs/sdk/angular/services/ChannelService/#channels/).\n *\n * If you're adding a new channel, make sure that it's a [watched](/chat/docs/javascript/watch_channel/) channel.\n */\n customChannelTruncatedHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (\n channels: Channel[],\n shouldStopWatchingRemovedChannels?: boolean\n ) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n /**\n * Custom event handler to call when a channel becomes hidden, provide an event handler if you want to override the [default channel list ordering](/chat/docs/sdk/angular/services/ChannelService/#channels/).\n *\n * If you're adding a new channel, make sure that it's a [watched](/chat/docs/javascript/watch_channel/) channel.\n */\n customChannelHiddenHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (\n channels: Channel[],\n shouldStopWatchingRemovedChannels?: boolean\n ) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n /**\n * Custom event handler to call when a channel becomes visible, provide an event handler if you want to override the [default channel list ordering](/chat/docs/sdk/angular/services/ChannelService/#channels/).\n *\n * If you're adding a new channel, make sure that it's a [watched](/chat/docs/javascript/watch_channel/) channel.\n */\n customChannelVisibleHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (\n channels: Channel[],\n shouldStopWatchingRemovedChannels?: boolean\n ) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n /**\n * Custom event handler to call if a new message received from a channel that is being watched, provide an event handler if you want to override the [default channel list ordering](/chat/docs/sdk/angular/services/ChannelService/#channels/).\n *\n * If you're adding a new channel, make sure that it's a [watched](/chat/docs/javascript/watch_channel/) channel.\n */\n customNewMessageHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (\n channels: Channel[],\n shouldStopWatchingRemovedChannels?: boolean\n ) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n /**\n * You can override the default file upload request - you can use this to upload files to your own CDN\n */\n customFileUploadRequest?: (\n file: File,\n channel: Channel\n ) => Promise<{ file: string }>;\n /**\n * You can override the default image upload request - you can use this to upload images to your own CDN\n */\n customImageUploadRequest?: (\n file: File,\n channel: Channel\n ) => Promise<{ file: string }>;\n /**\n * You can override the default file delete request - override this if you use your own CDN\n */\n customFileDeleteRequest?: (url: string, channel: Channel) => Promise<void>;\n /**\n * You can override the default image delete request - override this if you use your own CDN\n */\n customImageDeleteRequest?: (url: string, channel: Channel) => Promise<void>;\n /**\n * The provided method will be called before deleting a message. If the returned Promise resolves to `true` to deletion will go ahead. If `false` is returned, the message won't be deleted.\n */\n messageDeleteConfirmationHandler?: (\n message: StreamMessage\n ) => Promise<boolean>;\n /**\n * The provided method will be called before a new message is sent to Stream's API. You can use this hook to tranfrom or enrich the message being sent.\n */\n beforeSendMessage?: (\n input: MessageInput\n ) => MessageInput | Promise<MessageInput>;\n /**\n * The provided method will be called before a message is sent to Stream's API for update. You can use this hook to tranfrom or enrich the message being updated.\n */\n beforeUpdateMessage?: (\n message: StreamMessage\n ) => StreamMessage | Promise<StreamMessage>;\n /**\n * Since switching channels changes the state of multiple obserables, this observable can be used to check if all observables are updated.\n * - `end` means all observables are in stable state\n * - `start` means all observables are in unstable state\n */\n channelSwitchState$: Observable<'start' | 'end'>;\n /**\n * @internal\n */\n static readonly MAX_MESSAGE_REACTIONS_TO_FETCH = 1200;\n /**\n * @internal\n */\n isMessageLoadingInProgress = false;\n messagePageSize = 25;\n private channelsSubject = new BehaviorSubject<Channel[] | undefined>(\n undefined\n );\n private activeChannelSubject = new BehaviorSubject<Channel | undefined>(\n undefined\n );\n private activeChannelMessagesSubject = new BehaviorSubject<\n (StreamMessage | MessageResponse | FormatMessageResponse)[]\n >([]);\n private activeChannelPinnedMessagesSubject = new BehaviorSubject<\n StreamMessage[]\n >([]);\n private hasMoreChannelsSubject = new ReplaySubject<boolean>(1);\n private activeChannelSubscriptions: { unsubscribe: () => void }[] = [];\n private channelSubscriptions: { [key: string]: () => void } = {};\n private activeParentMessageIdSubject = new BehaviorSubject<\n string | undefined\n >(undefined);\n private activeThreadMessagesSubject = new BehaviorSubject<\n (StreamMessage | MessageResponse | FormatMessageResponse)[]\n >([]);\n private jumpToMessageSubject = new BehaviorSubject<{\n id?: string;\n parentId?: string;\n }>({ id: undefined, parentId: undefined });\n private latestMessageDateByUserByChannelsSubject = new BehaviorSubject<{\n [key: string]: Date;\n }>({});\n private readonly attachmentMaxSizeFallbackInMB = 100;\n private messageToQuoteSubject = new BehaviorSubject<\n StreamMessage | undefined\n >(undefined);\n private usersTypingInChannelSubject = new BehaviorSubject<UserResponse[]>([]);\n private usersTypingInThreadSubject = new BehaviorSubject<UserResponse[]>([]);\n private _shouldMarkActiveChannelAsRead = true;\n private shouldSetActiveChannel: boolean | undefined;\n private clientEventsSubscription: Subscription | undefined;\n private isStateRecoveryInProgress = false;\n private channelQueryStateSubject = new BehaviorSubject<\n ChannelQueryState | undefined\n >(undefined);\n private channelSwitchStateSubject = new BehaviorSubject<'start' | 'end'>(\n 'end'\n );\n private channelQuery?:\n | ChannelQuery\n | ((queryType: ChannelQueryType) => Promise<ChannelQueryResult>);\n private _customPaginator:\n | ((channelQueryResult: Channel[]) => NextPageConfiguration)\n | undefined;\n\n private channelListSetter = (\n channels: Channel[],\n shouldStopWatchingRemovedChannels = true\n ) => {\n const currentChannels = this.channelsSubject.getValue() || [];\n const deletedChannels = currentChannels.filter(\n (c) => !channels?.find((channel) => channel.cid === c.cid)\n );\n\n for (let i = 0; i < channels.length; i++) {\n const channel = channels[i];\n if (!this.channelSubscriptions[channel.cid]) {\n this.watchForChannelEvents(channel);\n }\n if (deletedChannels.includes(channel)) {\n if (shouldStopWatchingRemovedChannels) {\n if (this.channelSubscriptions[channel.cid]) {\n this.channelSubscriptions[channel.cid]();\n delete this.channelSubscriptions.cid;\n }\n void this.chatClientService.chatClient.activeChannels[channel.cid]\n ?.stopWatching()\n .catch((err) =>\n this.chatClientService.chatClient.logger(\n 'warn',\n 'Failed to unwatch channel',\n err as Record<string, unknown>\n )\n );\n }\n }\n }\n const nextChannels = channels;\n this.channelsSubject.next(nextChannels);\n if (\n !nextChannels.find(\n (c) => c.cid === this.activeChannelSubject.getValue()?.cid\n )\n ) {\n if (nextChannels.length > 0) {\n this.setAsActiveChannel(nextChannels[0]);\n } else {\n this.activeChannelSubject.next(undefined);\n }\n }\n };\n\n private messageListSetter = (messages: StreamMessage[]) => {\n this.activeChannelMessagesSubject.next(messages);\n };\n\n private threadListSetter = (messages: StreamMessage[]) => {\n this.activeThreadMessagesSubject.next(messages);\n };\n\n private parentMessageSetter = (message: StreamMessage | undefined) => {\n this.activeParentMessageIdSubject.next(message?.id);\n };\n private dismissErrorNotification?: () => void;\n private areReadEventsPaused = false;\n private markReadThrottleTime = 1050;\n private markReadTimeout?: ReturnType<typeof setTimeout>;\n private scheduledMarkReadRequest?: () => void;\n\n constructor(\n private chatClientService: ChatClientService,\n private ngZone: NgZone,\n private notificationService: NotificationService\n ) {\n this.channels$ = this.channelsSubject.asObservable().pipe(shareReplay(1));\n this.activeChannel$ = this.activeChannelSubject\n .asObservable()\n .pipe(shareReplay(1));\n this.activeChannelMessages$ = this.activeChannelMessagesSubject.pipe(\n map((messages) => {\n const channel = this.activeChannelSubject.getValue()!;\n return messages.map((message) =>\n this.transformToStreamMessage(message, channel)\n );\n }),\n shareReplay(1)\n );\n this.bouncedMessage$ = new BehaviorSubject<StreamMessage | undefined>(\n undefined\n );\n this.hasMoreChannels$ = this.hasMoreChannelsSubject\n .asObservable()\n .pipe(shareReplay(1));\n this.activeParentMessageId$ = this.activeParentMessageIdSubject\n .asObservable()\n .pipe(shareReplay(1));\n this.activeThreadMessages$ = this.activeThreadMessagesSubject.pipe(\n map((messages) => {\n const channel = this.activeChannelSubject.getValue()!;\n return messages.map((message) =>\n this.transformToStreamMessage(message, channel)\n );\n }),\n shareReplay(1)\n );\n this.activeParentMessage$ = combineLatest([\n this.activeChannelMessages$,\n this.activeParentMessageId$,\n ]).pipe(\n map(\n ([messages, parentMessageId]: [\n StreamMessage[],\n string | undefined\n ]) => {\n if (!parentMessageId) {\n return undefined;\n } else {\n const message = messages.find((m) => m.id === parentMessageId);\n if (!message) {\n void this.setAsActiveParentMessage(undefined);\n return undefined;\n } else {\n return message;\n }\n }\n }\n ),\n shareReplay(1)\n );\n this.messageToQuote$ = this.messageToQuoteSubject\n .asObservable()\n .pipe(shareReplay(1));\n this.jumpToMessage$ = this.jumpToMessageSubject\n .asObservable()\n .pipe(shareReplay(1));\n\n this.usersTypingInChannel$ = this.usersTypingInChannelSubject\n .asObservable()\n .pipe(shareReplay(1));\n this.usersTypingInThread$ = this.usersTypingInThreadSubject\n .asObservable()\n .pipe(shareReplay(1));\n this.latestMessageDateByUserByChannels$ =\n this.latestMessageDateByUserByChannelsSubject\n .asObservable()\n .pipe(shareReplay(1));\n this.activeChannelPinnedMessages$ = this.activeChannelPinnedMessagesSubject\n .asObservable()\n .pipe(shareReplay(1));\n this.channelQueryState$ = this.channelQueryStateSubject\n .asObservable()\n .pipe(shareReplay(1));\n this.channelSwitchState$ = this.channelSwitchStateSubject\n .asObservable()\n .pipe(shareReplay(1));\n }\n\n /**\n * If set to false, read events won't be sent as new messages are received. If set to true active channel (if any) will immediately be marked as read.\n */\n get shouldMarkActiveChannelAsRead() {\n return this._shouldMarkActiveChannelAsRead;\n }\n\n /**\n * If set to false, read events won't be sent as new messages are received. If set to true active channel (if any) will immediately be marked as read.\n */\n set shouldMarkActiveChannelAsRead(shouldMarkActiveChannelAsRead: boolean) {\n if (!this._shouldMarkActiveChannelAsRead && shouldMarkActiveChannelAsRead) {\n const activeChannel = this.activeChannelSubject.getValue();\n if (activeChannel && this.canSendReadEvents) {\n void activeChannel.markRead();\n }\n }\n this._shouldMarkActiveChannelAsRead = shouldMarkActiveChannelAsRead;\n }\n\n /**\n * By default the SDK uses an offset based pagination, you can change/extend this by providing your own custom paginator method.\n *\n * The method will be called with the result of the latest channel query.\n *\n * You can return either an offset, or a filter using the [`$lte`/`$gte` operator](/chat/docs/javascript/query_syntax_operators/). If you return a filter, it will be merged with the filter provided for the `init` method.\n */\n set customPaginator(\n paginator:\n | ((channelQueryResult: Channel[]) => NextPageConfiguration)\n | undefined\n ) {\n this._customPaginator = paginator;\n if (this.channelQuery && 'customPaginator' in this.channelQuery) {\n this.channelQuery.customPaginator = this._customPaginator;\n }\n }\n\n /**\n * Sets the given `channel` as active and marks it as read.\n * If the channel wasn't previously part of the channel, it will be added to the beginning of the list.\n * @param channel\n */\n setAsActiveChannel(channel: Channel) {\n this.channelSwitchStateSubject.next('start');\n const prevActiveChannel = this.activeChannelSubject.getValue();\n if (prevActiveChannel?.cid === channel.cid) {\n return;\n }\n this.stopWatchForActiveChannelEvents(prevActiveChannel);\n this.flushMarkReadQueue();\n this.areReadEventsPaused = false;\n this.isMessageLoadingInProgress = false;\n const readState =\n channel.state.read[this.chatClientService.chatClient.user?.id || ''];\n this.activeChannelLastReadMessageId = readState?.last_read_message_id;\n if (\n channel.state.latestMessages[channel.state.latestMessages.length - 1]\n ?.id === this.activeChannelLastReadMessageId\n ) {\n this.activeChannelLastReadMessageId = undefined;\n }\n this.activeChannelUnreadCount = readState?.unread_messages || 0;\n this.watchForActiveChannelEvents(channel);\n this.addChannel(channel);\n this.activeChannelSubject.next(channel);\n const channelStateLength = channel.state.latestMessages.length;\n if (channelStateLength > 2 * this.messagePageSize) {\n channel.state.latestMessages = channel.state.latestMessages.slice(\n channelStateLength - 2 * this.messagePageSize\n );\n }\n this.setChannelState(channel);\n this.channelSwitchStateSubject.next('end');\n }\n\n /**\n * Deselects the currently active (if any) channel\n */\n deselectActiveChannel() {\n this.channelSwitchStateSubject.next('start');\n const activeChannel = this.activeChannelSubject.getValue();\n if (!activeChannel) {\n return;\n }\n this.stopWatchForActiveChannelEvents(activeChannel);\n this.flushMarkReadQueue();\n this.activeChannelMessagesSubject.next([]);\n this.activeChannelSubject.next(undefined);\n this.activeParentMessageIdSubject.next(undefined);\n this.activeThreadMessagesSubject.next([]);\n this.latestMessageDateByUserByChannelsSubject.next({});\n this.selectMessageToQuote(undefined);\n this.jumpToMessageSubject.next({ id: undefined, parentId: undefined });\n this.activeChannelPinnedMessagesSubject.next([]);\n this.usersTypingInChannelSubject.next([]);\n this.usersTypingInThreadSubject.next([]);\n this.activeChannelLastReadMessageId = undefined;\n this.activeChannelUnreadCount = undefined;\n this.areReadEventsPaused = false;\n this.isMessageLoadingInProgress = false;\n this.channelSwitchStateSubject.next('end');\n }\n\n /**\n * Sets the given `message` as an active parent message. If `undefined` is provided, it will deleselect the current parent message.\n * @param message\n * @param loadMessagesForm\n */\n async setAsActiveParentMessage(\n message: StreamMessage | undefined,\n loadMessagesForm: 'request' | 'state' = 'request'\n ) {\n const messageToQuote = this.messageToQuoteSubject.getValue();\n if (messageToQuote && !!messageToQuote.parent_id) {\n this.messageToQuoteSubject.next(undefined);\n }\n if (!message) {\n this.activeParentMessageIdSubject.next(undefined);\n this.activeThreadMessagesSubject.next([]);\n const messageToJumpTo = this.jumpToMessageSubject.getValue();\n if (messageToJumpTo && !!messageToJumpTo.parentId) {\n this.jumpToMessageSubject.next({ id: undefined, parentId: undefined });\n }\n } else {\n this.activeParentMessageIdSubject.next(message.id);\n const activeChannel = this.activeChannelSubject.getValue();\n if (loadMessagesForm === 'request') {\n const result = await activeChannel?.getReplies(message.id, {\n limit: this.messagePageSize,\n });\n this.activeThreadMessagesSubject.next(result?.messages || []);\n } else {\n this.activeThreadMessagesSubject.next(\n activeChannel?.state.threads[message.id] || []\n );\n }\n }\n }\n\n /**\n * Loads the next page of messages of the active channel. The page size can be set in the [query option](/chat/docs/javascript/query_channels/#query-options) object.\n * @param direction\n */\n loadMoreMessages(direction: 'older' | 'newer' = 'older') {\n const activeChnannel = this.activeChannelSubject.getValue();\n const messages = this.activeChannelMessagesSubject.getValue();\n const lastMessageId =\n messages[direction === 'older' ? 0 : messages.length - 1]?.id;\n if (\n direction === 'newer' &&\n activeChnannel?.state?.latestMessages === activeChnannel?.state?.messages\n ) {\n // If we are on latest message set, activeChannelMessages$ will be refreshed by WS events, no need for a request\n return false;\n }\n return activeChnannel\n ?.query({\n messages: {\n limit: this.messagePageSize,\n [direction === 'older' ? 'id_lt' : 'id_gt']: lastMessageId,\n },\n members: { limit: 0 },\n watchers: { limit: 0 },\n })\n .then((res) => {\n if (\n activeChnannel?.data?.id ===\n this.activeChannelSubject.getValue()?.data?.id\n ) {\n this.activeChannelMessagesSubject.next([\n ...activeChnannel.state.messages,\n ]);\n }\n\n return res;\n });\n }\n\n /**\n * Loads the next page of messages of the active thread. The page size can be set in the [query option](/chat/docs/javascript/query_channels/#query-options) object.\n * @param direction\n */\n loadMoreThreadReplies(direction: 'older' | 'newer' = 'older') {\n if (direction === 'newer') {\n // Thread replies aren't broke into different message sets, activeThreadMessages$ will be refreshed by WS events, no need for a request\n return false;\n }\n const activeChnannel = this.activeChannelSubject.getValue();\n const parentMessageId = this.activeParentMessageIdSubject.getValue();\n if (!parentMessageId || !activeChnannel) {\n return false;\n }\n const threadMessages = this.activeThreadMessagesSubject.getValue();\n const lastMessageId =\n threadMessages[direction === 'older' ? 0 : threadMessages.length - 1]?.id;\n return activeChnannel\n .getReplies(parentMessageId, {\n limit: this.messagePageSize,\n [direction === 'older' ? 'id_lt' : 'id_gt']: lastMessageId,\n })\n .then(() => {\n this.activeThreadMessagesSubject.next(\n activeChnannel?.state.threads[parentMessageId] || []\n );\n });\n }\n\n /**\n * Queries the channels with the given filters, sorts and options. More info about [channel querying](/chat/docs/javascript/query_channels/) can be found in the platform documentation. By default the first channel in the list will be set as active channel and will be marked as read.\n * @param filters\n * @param sort\n * @param options\n * @param shouldSetActiveChannel Decides if the first channel in the result should be made as an active channel or not.\n * @returns the list of channels found by the query\n */\n init(\n filters: ChannelFilters,\n sort?: ChannelSort,\n options?: ChannelOptions,\n shouldSetActiveChannel: boolean = true\n ) {\n this.channelQuery = new ChannelQuery(\n this.chatClientService,\n this,\n filters,\n sort || { last_message_at: -1 },\n {\n limit: 25,\n state: true,\n presence: true,\n watch: true,\n message_limit: this.messagePageSize,\n ...options,\n }\n );\n this.channelQuery.customPaginator = this._customPaginator;\n\n return this._init({\n shouldSetActiveChannel,\n messagePageSize: options?.message_limit ?? this.messagePageSize,\n });\n }\n\n /**\n * Queries the channels with the given query function. More info about [channel querying](/chat/docs/javascript/query_channels/) can be found in the platform documentation.\n * @param query\n * @param options\n * @param options.shouldSetActiveChannel The `shouldSetActiveChannel` specifies if the first channel in the result should be selected as the active channel or not. Default is `true`.\n * @param options.messagePageSize How many messages should we load? The default is 25\n * @returns the channels that were loaded\n */\n initWithCustomQuery(\n query: (queryType: ChannelQueryType) => Promise<ChannelQueryResult>,\n options: { shouldSetActiveChannel: boolean; messagePageSize: number } = {\n shouldSetActiveChannel: true,\n messagePageSize: this.messagePageSize,\n }\n ) {\n this.channelQuery = query;\n return this._init(options);\n }\n\n /**\n * Resets the `activeChannel$`, `channels$` and `activeChannelMessages$` Observables. Useful when disconnecting a chat user, use in combination with [`disconnectUser`](/chat/docs/sdk/angular/services/ChatClientService/#disconnectuser/).\n */\n reset() {\n this.deselectActiveChannel();\n this.channelsSubject.next(undefined);\n this.channelQueryStateSubject.next(undefined);\n this.clientEventsSubscription?.unsubscribe();\n this.dismissErrorNotification?.();\n this.dismissErrorNotification = undefined;\n Object.keys(this.channelSubscriptions).forEach((cid) => {\n this.channelSubscriptions[cid]();\n });\n this.channelSubscriptions = {};\n }\n\n /**\n * Loads the next page of channels. The page size can be set in the [query option](/chat/docs/javascript/query_channels/#query-options) object.\n */\n async loadMoreChannels() {\n await this.queryChannels(false, 'next-page');\n }\n\n /**\n * Adds a reaction to a message.\n * @param messageId The id of the message to add the reaction to\n * @param reactionType The type of the reaction\n * @param customData\n */\n async addReaction(\n messageId: string,\n reactionType: MessageReactionType,\n customData?: CustomReactionData\n ) {\n await this.activeChannelSubject.getValue()?.sendReaction(messageId, {\n type: reactionType,\n ...customData,\n });\n }\n\n /**\n * Removes a reaction from a message.\n * @param messageId The id of the message to remove the reaction from\n * @param reactionType Thr type of reaction to remove\n */\n async removeReaction(messageId: string, reactionType: MessageReactionType) {\n await this.activeChannelSubject\n .getValue()\n ?.deleteReaction(messageId, reactionType);\n }\n\n /**\n * Sends a message to the active channel. The message is immediately added to the message list, if an error occurs and the message can't be sent, the error is indicated in `state` of the message.\n * @param text The text of the message\n * @param attachments The attachments\n * @param mentionedUsers Mentioned users\n * @param parentId Id of the parent message (if sending a thread reply)\n * @param quotedMessageId Id of the message to quote (if sending a quote reply)\n * @param customData\n * @param pollId Id of the poll (if sending a poll message)\n */\n async sendMessage(\n text: string,\n attachments: Attachment[] = [],\n mentionedUsers: UserResponse[] = [],\n parentId: string | undefined = undefined,\n quotedMessageId: string | undefined = undefined,\n customData: undefined | CustomMessageData = undefined,\n pollId: string | undefined = undefined\n ) {\n let input: MessageInput = {\n text,\n attachments,\n mentionedUsers,\n parentId,\n quotedMessageId,\n customData,\n pollId,\n };\n if (this.beforeSendMessage) {\n input = await this.beforeSendMessage(input);\n }\n const preview = createMessagePreview(\n this.chatClientService.chatClient.user!,\n input.text,\n input.attachments,\n input.mentionedUsers,\n input.parentId,\n input.quotedMessageId,\n input.customData,\n input.pollId\n );\n const channel = this.activeChannelSubject.getValue()!;\n channel.state.addMessageSorted(preview, true);\n const response = await this.sendMessageRequest(preview, input.customData);\n return response;\n }\n\n /**\n * Resends the given message to the active channel\n * @param message The message to resend\n */\n async resendMessage(message: StreamMessage) {\n const channel = this.activeChannelSubject.getValue()!;\n channel.state.addMessageSorted(\n {\n ...(message as unknown as MessageResponse),\n // @ts-expect-error stream-chat doesn't know about this property\n errorStatusCode: undefined,\n status: 'sending',\n },\n true\n );\n return this.sendMessageRequest(message, undefined, true);\n }\n\n /**\n * Updates the message in the active channel\n * @param message Mesage to be updated\n */\n async updateMessage(message: StreamMessage) {\n let messageToUpdate: StreamMessage = {\n ...message,\n };\n if (messageToUpdate.quoted_message) {\n messageToUpdate.quoted_message = {\n ...messageToUpdate.quoted_message,\n };\n }\n delete messageToUpdate.i18n;\n if (this.beforeUpdateMessage) {\n messageToUpdate = await this.beforeUpdateMessage(messageToUpdate);\n }\n if (messageToUpdate.readBy) {\n // @ts-expect-error this is only a run time proparty for the SDK\n delete messageToUpdate.readBy;\n }\n if (messageToUpdate.translation) {\n delete messageToUpdate.translation;\n }\n if (messageToUpdate.quoted_message?.translation) {\n delete messageToUpdate.quoted_message.translation;\n }\n if (message.moderation_details) {\n return this.resendMessage(message);\n }\n const response = await this.chatClientService.chatClient.updateMessage(\n messageToUpdate as unknown as LocalMessage\n );\n\n const channel = this.channelsSubject\n .getValue()\n ?.find((c) => c.cid === message.cid);\n\n if (\n response.message.type === 'error' &&\n response.message.moderation_details\n ) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.This message did not meet our content guidelines'\n );\n return message;\n }\n\n return this.transformToStreamMessage(response.message, channel);\n }\n\n /**\n * Deletes the message from the active channel\n * @param message Message to be deleted\n * @param isLocalDelete set this `true` if you want to delete a message that's only part of the local state, not yet saved on the backend\n */\n async deleteMessage(message: StreamMessage, isLocalDelete = false) {\n if (isLocalDelete && this.activeChannel) {\n const result = this.activeChannel.state.removeMessage({\n id: message.id,\n parent_id: message.parent_id,\n });\n if (result) {\n message.parent_id\n ? this.activeThreadMessagesSubject.next(\n this.activeChannel.state.threads[message.parent_id]\n )\n : this.activeChannelMessagesSubject.next(\n this.activeChannel.state.messages\n );\n }\n return;\n }\n if (this.messageDeleteConfirmationHandler) {\n const result = await this.messageDeleteConfirmationHandler(message);\n if (result) {\n await this.chatClientService.chatClient.deleteMessage(message.id);\n }\n } else {\n await this.chatClientService.chatClient.deleteMessage(message.id);\n }\n }\n\n /**\n * Uploads files to the channel. If you want to know more about [file uploads](/chat/docs/javascript/file_uploads/) check out the platform documentation.\n * @param uploads the attachments to upload (output of the [`AttachmentService`](/chat/docs/sdk/angular/services/AttachmentService/))\n * @returns the result of file upload requests\n */\n async uploadAttachments(\n uploads: AttachmentUpload[]\n ): Promise<AttachmentUpload[]> {\n const result: AttachmentUpload[] = [];\n const channel = this.activeChannelSubject.getValue()!;\n const uploadResults = await Promise.allSettled(\n uploads.map((upload) =>\n upload.type === 'image'\n ? this.customImageUploadRequest\n ? this.customImageUploadRequest(upload.file, channel)\n : channel.sendImage(upload.file, upload.file.name, upload.file.type)\n : this.customFileUploadRequest\n ? this.customFileUploadRequest(upload.file, channel)\n : channel.sendFile(upload.file, upload.file.name, upload.file.type)\n )\n );\n uploadResults.forEach((uploadResult, i) => {\n const file = uploads[i].file;\n const type = uploads[i].type;\n if (uploadResult.status === 'fulfilled') {\n result.push({\n file,\n type,\n state: 'success',\n url: uploadResult.value.file,\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */\n thumb_url: (uploadResult.value as any).thumb_url,\n });\n } else {\n let reason: AttachmentUploadErrorReason = 'unknown';\n let extraData: { param: string } | undefined;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-assignment */\n const message: string | undefined =\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n uploadResult.reason.response?.data?.message;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-assignment */\n const code: number | undefined =\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n uploadResult.reason.response?.data?.code;\n if (\n code === 22 ||\n (code === 4 && message?.toLowerCase()?.includes('bytes'))\n ) {\n reason = 'file-size';\n extraData = {\n param:\n /\\d+MB|\\d+\\s?bytes/.exec(message || '')?.[0] ||\n `${this.attachmentMaxSizeFallbackInMB}MB`,\n };\n if (extraData.param.includes('bytes')) {\n const limitInBytes = +(\n /\\d+/.exec(extraData.param)?.[0] ||\n this.attachmentMaxSizeFallbackInMB * 1024 * 1024\n );\n extraData.param = `${limitInBytes / (1024 * 1024)}MB`;\n }\n } else if (\n code === 4 &&\n message?.toLowerCase()?.includes('file extension')\n ) {\n reason = 'file-extension';\n extraData = { param: /\\.\\w+/.exec(message)?.[0] || '' };\n }\n result.push({\n file,\n type,\n state: 'error',\n errorReason: reason,\n errorExtraInfo: extraData ? [extraData] : undefined,\n });\n }\n });\n\n return result;\n }\n\n /**\n * Deletes an uploaded file by URL. If you want to know more about [file uploads](/chat/docs/javascript/file_uploads/) check out the platform documentation\n * @param attachmentUpload Attachment to be deleted (output of the [`AttachmentService`](/chat/docs/sdk/angular/services/AttachmentService/))\n */\n async deleteAttachment(attachmentUpload: AttachmentUpload) {\n const channel = this.activeChannelSubject.getValue()!;\n await (attachmentUpload.type === 'image'\n ? this.customImageDeleteRequest\n ? this.customImageDeleteRequest(attachmentUpload.url!, channel)\n : channel.deleteImage(attachmentUpload.url!)\n : this.customFileDeleteRequest\n ? this.customFileDeleteRequest(attachmentUpload.url!, channel)\n : channel.deleteFile(attachmentUpload.url!));\n }\n\n /**\n * Returns the autocomplete options for current channel members. If the channel has less than 100 members, it returns the channel members, otherwise sends a [search request](/chat/docs/javascript/query_members/#pagination-and-ordering) with the given search term.\n * @param searchTerm Text to search for in the names of members\n * @returns The list of members matching the search filter\n */\n async autocompleteMembers(searchTerm: string) {\n const activeChannel = this.activeChannelSubject.getValue();\n if (!activeChannel) {\n return [];\n }\n if (Object.keys(activeChannel.state.members).length < 100) {\n return Object.values(activeChannel.state.members).filter(\n (m) => m.user?.id !== this.chatClientService.chatClient.userID!\n );\n } else {\n if (!searchTerm) {\n return [];\n }\n const result = await activeChannel.queryMembers({\n name: { $autocomplete: searchTerm },\n } as MemberFilters); // TODO: find out why we need typecast here\n\n return result.members.filter(\n (m) => m.user_id !== this.chatClientService.chatClient?.user?.id\n );\n }\n }\n\n /**\n * [Runs a message action](https://getstream.io/chat/docs/rest/#messages-runmessageaction) in the current channel. Updates the message list based on the action result (if no message is returned, the message will be removed from the message list).\n * @param messageId\n * @param formData\n * @param parentMessageId\n */\n async sendAction(\n messageId: string,\n formData: Record<string, string>,\n parentMessageId?: string\n ) {\n const channel = this.activeChannelSubject.getValue()!;\n const response = await channel.sendAction(messageId, formData);\n if (response?.message) {\n channel.state.addMessageSorted({\n ...response.message,\n status: 'received',\n });\n const isThreadReply = !!response.message.parent_id;\n isThreadReply\n ? this.activeThreadMessagesSubject.next([\n ...channel.state.threads[response.message.parent_id!],\n ])\n : this.activeChannelMessagesSubject.next([...channel.state.messages]);\n } else {\n channel.state.removeMessage({\n id: messageId,\n parent_id: parentMessageId,\n });\n if (parentMessageId) {\n this.activeThreadMessagesSubject.next(\n channel.state.threads[this.activeParentMessageIdSubject.getValue()!]\n );\n } else {\n this.activeChannelMessagesSubject.next([...channel.state.messages]);\n }\n }\n }\n\n /**\n * Selects or deselects the current message to quote reply to\n * @param message The message to select, if called with `undefined`, it deselects the message\n */\n selectMessageToQuote(message: StreamMessage | undefined | MessageResponse) {\n if (message && !this.isStreamMessage(message)) {\n message = this.transformToStreamMessage(message);\n }\n this.messageToQuoteSubject.next(message);\n }\n\n /**\n * Add a new channel to the channel list\n * The channel will be added to the beginning of the channel list\n * @param channel\n */\n addChannel(channel: Channel) {\n if (!this.channels.find((c) => c.cid === channel.cid)) {\n this.channelsSubject.next([channel, ...this.channels]);\n this.watchForChannelEvents(channel);\n }\n }\n\n /**\n *\n * @param cid\n * @param shouldStopWatching\n */\n removeChannel(cid: string, shouldStopWatching = true) {\n const remainingChannels = this.channels.filter((c) => c.cid !== cid);\n\n if (shouldStopWatching) {\n if (this.channelSubscriptions[cid]) {\n this.channelSubscriptions[cid]();\n delete this.channelSubscriptions.cid;\n }\n void this.chatClientService.chatClient.activeChannels[cid]\n ?.stopWatching()\n .catch((err) =>\n this.chatClientService.chatClient.logger(\n 'warn',\n 'Failed to unwatch channel',\n err as Record<string, unknown>\n )\n );\n }\n\n if (remainingChannels.length < this.channels.length) {\n this.channelsSubject.next(remainingChannels);\n if (cid === this.activeChannelSubject.getValue()?.cid) {\n if (remainingChannels.length > 0) {\n this.setAsActiveChannel(remainingChannels[0]);\n } else {\n this.activeChannelSubject.next(undefined);\n }\n }\n }\n }\n\n private async sendMessageRequest(\n preview: MessageResponse | StreamMessage,\n customData?: CustomMessageData,\n isResend = false\n ) {\n const channel = this.activeChannelSubject.getValue()!;\n const isThreadReply = !!preview.parent_id;\n isThreadReply\n ? this.activeThreadMessagesSubject.next([\n ...channel.state.threads[preview.parent_id!],\n ])\n : this.activeChannelMessagesSubject.next([...channel.state.messages]);\n try {\n const response = await channel.sendMessage({\n id: preview.id,\n text: preview.text,\n attachments: preview.attachments,\n mentioned_users: preview.mentioned_users?.map((u) => u.id),\n parent_id: preview.parent_id,\n quoted_message_id: preview.quoted_message_id,\n poll_id: preview.poll_id,\n ...customData,\n } as Message); // TODO: find out why we need typecast here\n channel.state.addMessageSorted(\n {\n ...response.message,\n status: 'received',\n },\n true\n );\n isThreadReply\n ? this.activeThreadMessagesSubject.next([\n ...channel.state.threads[preview.parent_id!],\n ])\n : this.activeChannelMessagesSubject.next([...channel.state.messages]);\n let messages!: StreamMessage[];\n (isThreadReply ? this.activeThreadMessages$ : this.activeChannelMessages$)\n .pipe(take(1))\n .subscribe((m) => (messages = m));\n const newMessage = messages[messages.length - 1];\n return newMessage;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const stringError = JSON.stringify(error);\n const parsedError: {\n status?: number;\n code?: number;\n response?: { data?: { message?: string } };\n } = stringError ? (JSON.parse(stringError) as { status?: number }) : {};\n\n let isAlreadyExists = false;\n if (isResend) {\n if (\n parsedError.status === 400 &&\n parsedError.code === 4 &&\n parsedError?.response?.data?.message?.includes('already exists')\n ) {\n isAlreadyExists = true;\n }\n }\n\n channel.state.addMessageSorted(\n {\n ...(preview as MessageResponse),\n // @ts-expect-error stream-chat doesn't know about this property\n errorStatusCode: isAlreadyExists\n ? undefined\n : parsedError.status || undefined,\n status: isAlreadyExists ? 'received' : 'failed',\n },\n true\n );\n isThreadReply\n ? this.activeThreadMessagesSubject.next([\n ...channel.state.threads[preview.parent_id!],\n ])\n : this.activeChannelMessagesSubject.next([...channel.state.messages]);\n let messages!: StreamMessage[];\n (isThreadReply ? this.activeThreadMessages$ : this.activeChannelMessages$)\n .pipe(take(1))\n .subscribe((m) => (messages = m));\n const newMessage = messages[messages.length - 1];\n return newMessage;\n }\n }\n\n /**\n * Jumps to the selected message inside the message list, if the message is not yet loaded, it'll load the message (and it's surroundings) from the API.\n * @param messageId The ID of the message to be loaded, 'latest' means jump to the latest messages\n * @param parentMessageId The ID of the parent message if we want to load a thread message\n */\n async jumpToMessage(messageId: string, parentMessageId?: string) {\n this.isMessageLoadingInProgress = true;\n const activeChannel = this.activeChannelSubject.getValue();\n try {\n await activeChannel?.state.loadMessageIntoState(\n messageId,\n parentMessageId\n );\n const messages = activeChannel?.state.messages || [];\n this.activeChannelMessagesSubject.next([...messages]);\n if (parentMessageId) {\n const parentMessage = messages.find((m) => m.id === parentMessageId);\n void this.setAsActiveParentMessage(\n parentMessage as StreamMessage,\n 'state'\n );\n }\n this.jumpToMessageSubject.next({\n id: messageId,\n parentId: parentMessageId,\n });\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Message not found'\n );\n throw error;\n } finally {\n this.isMessageLoadingInProgress = false;\n }\n }\n\n /**\n * Clears the currently selected message to jump\n */\n clearMessageJump() {\n this.jumpToMessageSubject.next({ id: undefined, parentId: undefined });\n }\n\n /**\n * Pins the given message in the channel\n * @param message\n */\n async pinMessage(message: StreamMessage) {\n try {\n await this.chatClientService.chatClient?.pinMessage(message);\n this.notificationService.addTemporaryNotification(\n 'streamChat.Message pinned',\n 'success'\n );\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error pinning message'\n );\n throw error;\n }\n }\n\n /**\n * Removes the given message from pinned messages\n * @param message\n */\n async unpinMessage(message: StreamMessage) {\n try {\n await this.chatClientService.chatClient?.unpinMessage(message);\n this.notificationService.addTemporaryNotification(\n 'streamChat.Message unpinned',\n 'success'\n );\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error removing message pin'\n );\n throw error;\n }\n }\n\n private handleNotification(clientEvent: ClientEvent) {\n switch (clientEvent.eventType) {\n case 'connection.recovered': {\n void this.ngZone.run(async () => {\n if (this.isStateRecoveryInProgress) {\n return;\n }\n this.isStateRecoveryInProgress = true;\n try {\n // If channel list is not inited, we set the active channel\n const shoulSetActiveChannel =\n this.shouldSetActiveChannel &&\n !this.activeChannelSubject.getValue();\n await this.queryChannels(\n shoulSetActiveChannel || false,\n 'recover-state'\n );\n if (this.activeChannelSubject.getValue()) {\n // Thread messages are not refetched so active thread gets deselected to avoid displaying stale messages\n void this.setAsActiveParentMessage(undefined);\n // Update and reselect message to quote\n const messageToQuote = this.messageToQuoteSubject.getValue();\n this.setChannelState(this.activeChannelSubject.getValue()!);\n let messages!: StreamMessage[];\n this.activeChannelMessages$\n .pipe(take(1))\n .subscribe((m) => (messages = m));\n const updatedMessageToQuote = messages.find(\n (m) => m.id === messageToQuote?.id\n );\n if (updatedMessageToQuote) {\n this.selectMessageToQuote(updatedMessageToQuote);\n }\n }\n this.isStateRecoveryInProgress = false;\n } catch {\n this.isStateRecoveryInProgress = false;\n }\n });\n break;\n }\n case 'notification.message_new': {\n this.ngZone.run(() => {\n if (this.customNewMessageNotificationHandler) {\n this.customNewMessageNotificationHandler(\n clientEvent,\n this.channelListSetter\n );\n } else {\n this.handleNewMessageNotification(clientEvent);\n }\n });\n break;\n }\n case 'notification.added_to_channel': {\n this.ngZone.run(() => {\n if (this.customAddedToChannelNotificationHandler) {\n this.customAddedToChannelNotificationHandler(\n clientEvent,\n this.channelListSetter\n );\n } else {\n this.handleAddedToChannelNotification(clientEvent);\n }\n });\n break;\n }\n case 'notification.removed_from_channel': {\n this.ngZone.run(() => {\n if (this.customRemovedFromChannelNotificationHandler) {\n this.customRemovedFromChannelNotificationHandler(\n clientEvent,\n this.channelListSetter\n );\n } else {\n this.handleRemovedFromChannelNotification(clientEvent);\n }\n });\n break;\n }\n case 'user.updated': {\n this.ngZone.run(() => {\n const updatedChannels = this.channelsSubject.getValue()?.map((c) => {\n if (this.chatClientService.chatClient.activeChannels[c.cid]) {\n return this.chatClientService.chatClient.activeChannels[c.cid];\n } else {\n return c;\n }\n });\n this.channelsSubject.next(updatedChannels);\n const activeChannel = this.activeChannelSubject.getValue();\n if (activeChannel) {\n this.activeChannelSubject.next(\n this.chatClientService.chatClient.activeChannels[\n activeChannel.cid\n ] || activeChannel\n );\n this.activeChannelMessagesSubject.next(\n activeChannel.state.messages.map((m) => {\n (m as StreamMessage).readBy = getReadBy(m, activeChannel);\n return { ...m };\n })\n );\n const activeParentMessage =\n this.activeParentMessageIdSubject.getValue();\n if (activeParentMessage) {\n const messages = activeChannel.state.threads[activeParentMessage];\n this.activeThreadMessagesSubject.next([...messages]);\n }\n this.activeChannelPinnedMessagesSubject.next([\n ...(activeChannel.state.pinnedMessages as StreamMessage[]),\n ]);\n }\n });\n break;\n }\n }\n }\n\n private handleRemovedFromChannelNotification(clientEvent: ClientEvent) {\n const channelIdToBeRemoved = clientEvent.event.channel!.cid;\n this.removeChannel(channelIdToBeRemoved, true);\n }\n\n private handleNewMessageNotification(clientEvent: ClientEvent) {\n if (clientEvent.event.channel) {\n void this.addChannelFromNotification(clientEvent.event.channel);\n }\n }\n\n private handleAddedToChannelNotification(clientEvent: ClientEvent) {\n if (clientEvent.event.channel) {\n void this.addChannelFromNotification(clientEvent.event.channel);\n }\n }\n\n private async addChannelFromNotification(channelResponse: ChannelResponse) {\n const newChannel = this.chatClientService.chatClient.channel(\n channelResponse.type,\n channelResponse.id\n );\n let currentChannels = this.channelsSubject.getValue() || [];\n if (currentChannels.find((c) => c.cid === newChannel.cid)) {\n return;\n }\n await newChannel.watch().catch((err) => {\n this.chatClientService.chatClient.logger(\n 'error',\n 'Failed to add channel to channel list because watch request failed',\n err as Record<string, unknown>\n );\n });\n currentChannels = this.channelsSubject.getValue() || [];\n if (currentChannels.find((c) => c.cid === newChannel.cid)) {\n return;\n }\n this.watchForChannelEvents(newChannel);\n this.channelsSubject.next([newChannel, ...currentChannels]);\n }\n\n private watchForActiveChannelEvents(channel: Channel) {\n this.activeChannelSubscriptions.push(\n channel.on('message.new', (event) => {\n this.ngZone.run(() => {\n event.message && event.message.parent_id\n ? event.message.parent_id ===\n this.activeParentMessageIdSubject.getValue()\n ? this.activeThreadMessagesSubject.next([\n ...channel.state.threads[event.message.parent_id],\n ])\n : null\n : this.activeChannelMessagesSubject.next([\n ...channel.state.messages,\n ]);\n this.activeChannel$.pipe(first()).subscribe((c) => {\n if (c) {\n this.markRead(c);\n }\n });\n this.updateLatestMessages(event);\n });\n })\n );\n this.activeChannelSubscriptions.push(\n channel.on('message.updated', (event) => this.messageUpdated(event))\n );\n this.activeChannelSubscriptions.push(\n channel.on('message.deleted', (event) => this.messageUpdated(event))\n );\n this.activeChannelSubscriptions.push(\n channel.on('reaction.new', (e) => this.messageReactionEventReceived(e))\n );\n this.activeChannelSubscriptions.push(\n channel.on('reaction.deleted', (e) =>\n this.messageReactionEventReceived(e)\n )\n );\n this.activeChannelSubscriptions.push(\n channel.on('reaction.updated', (e) =>\n this.messageReactionEventReceived(e)\n )\n );\n this.activeChannelSubscriptions.push(\n channel.on('message.read', (e) => {\n this.ngZone.run(() => {\n let latestMessage!: StreamMessage;\n let messages!: StreamMessage[];\n this.activeChannelMessages$.pipe(first()).subscribe((m) => {\n messages = m;\n latestMessage = messages[messages.length - 1];\n });\n if (!latestMessage || !e.user) {\n return;\n }\n if (latestMessage.readBy) {\n latestMessage.readBy.splice(0, latestMessage.readBy.length);\n } else {\n latestMessage.readBy = [];\n }\n latestMessage.readBy.push(...getReadBy(latestMessage, channel));\n messages[messages.length - 1] = { ...latestMessage };\n\n this.activeChannelMessagesSubject.next([...messages]);\n });\n })\n );\n this.activeChannelSubscriptions.push(\n this.chatClientService.events$\n .pipe(\n filter(\n (e) =>\n e.eventType === 'notification.mark_unread' &&\n e.event.channel_id === channel.id\n ),\n map((e) => e.event)\n )\n .subscribe((e) => {\n this.ngZone.run(() => {\n this.activeChannelLastReadMessageId = e.last_read_message_id;\n this.activeChannelUnreadCount = e.unread_messages;\n this.activeChannelSubject.next(this.activeChannel);\n });\n })\n );\n this.activeChannelSubscriptions.push(\n channel.on('typing.start', (e) =>\n this.ngZone.run(() => this.handleTypingStartEvent(e))\n )\n );\n this.activeChannelSubscriptions.push(\n channel.on('typing.stop', (e) =>\n this.ngZone.run(() => this.handleTypingStopEvent(e))\n )\n );\n }\n\n /**\n * Call this method if user started typing in the active channel\n * @param parentId The id of the parent message, if user is typing in a thread\n */\n async typingStarted(parentId?: string) {\n const activeChannel = this.activeChannelSubject.getValue();\n await activeChannel?.keystroke(parentId);\n }\n\n /**\n * Call this method if user stopped typing in the active channel\n * @param parentId The id of the parent message, if user were typing in a thread\n */\n async typingStopped(parentId?: string) {\n const activeChannel = this.activeChannelSubject.getValue();\n await activeChannel?.stopTyping(parentId);\n }\n\n /**\n * The current list of channels\n */\n get channels() {\n return this.channelsSubject.getValue() || [];\n }\n\n /**\n * The current active channel\n */\n get activeChannel() {\n return this.activeChannelSubject.getValue() || undefined;\n }\n\n /**\n * The current active channel messages\n */\n get activeChannelMessages() {\n return this.activeChannelMessagesSubject.getValue() || [];\n }\n\n /**\n * The current thread replies\n */\n get activeChannelThreadReplies() {\n return this.activeThreadMessagesSubject.getValue() || [];\n }\n\n /**\n * Get the last 1200 reactions of a message in the current active channel. If you need to fetch more reactions please use the [following endpoint](/chat/docs/javascript/send_reaction/#paginating-reactions).\n * @deprecated use [`messageReactionsService.queryReactions()`](/chat/docs/sdk/angular/services/MessageReactionsService/#queryreactions) instead\n * @param messageId\n * @returns all reactions of a message\n */\n async getMessageReactions(messageId: string) {\n const reactions: ReactionResponse[] = [];\n const limit = 300;\n let offset = 0;\n const reactionsLimit = ChannelService.MAX_MESSAGE_REACTIONS_TO_FETCH;\n let lastPageSize = limit;\n\n while (lastPageSize === limit && reactions.length < reactionsLimit) {\n try {\n const response = await this.activeChannel?.getReactions(messageId, {\n offset,\n limit,\n });\n lastPageSize = response?.reactions?.length || 0;\n if (lastPageSize > 0) {\n reactions.push(...response!.reactions);\n }\n offset += lastPageSize;\n } catch (e) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error loading reactions'\n );\n throw e;\n }\n }\n return reactions;\n }\n\n /**\n * Marks the channel from the given message as unread\n * @param messageId\n * @returns the result of the request\n */\n async markMessageUnread(messageId: string) {\n if (!this.activeChannel) {\n return;\n }\n\n try {\n const response = await this.activeChannel.markUnread({\n message_id: messageId,\n });\n this.areReadEventsPaused = true;\n return response;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n const error: {\n response?: {\n data?: { code?: number; message?: string; StatusCode?: number };\n };\n } = JSON.parse(JSON.stringify(e)) as {\n response?: {\n data?: { code?: number; message?: string; StatusCode?: number };\n };\n };\n const data = error?.response?.data;\n if (\n data &&\n data.code === 4 &&\n data.StatusCode === 400 &&\n data.message?.includes('it is older than last')\n ) {\n const count = /\\d+ channel messages/\n .exec(data.message)?.[0]\n .match(/\\d+/)?.[0];\n if (count) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error, only the first {{count}} message can be marked as unread',\n undefined,\n undefined,\n { count }\n );\n throw e;\n }\n }\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error marking message as unread'\n );\n throw e;\n }\n }\n\n private messageUpdated(event: Event) {\n this.ngZone.run(() => {\n const isThreadReply = event.message && event.message.parent_id;\n const channel = this.activeChannelSubject.getValue();\n if (!channel) {\n return;\n }\n // Get messages from state as message order could change, and message could've been deleted\n const messages: FormatMessageResponse[] = isThreadReply\n ? channel.state.threads[event?.message?.parent_id || '']\n : channel.state.messages;\n if (!messages) {\n return;\n }\n const messageIndex = messages.findIndex(\n (m) => m.id === event?.message?.id\n );\n if (messageIndex !== -1 || event.type === 'message.deleted') {\n isThreadReply\n ? this.activeThreadMessagesSubject.next([...messages])\n : this.activeChannelMessagesSubject.next([...messages]);\n this.activeChannelPinnedMessagesSubject.next([\n ...(channel.state.pinnedMessages as StreamMessage[]),\n ]);\n }\n });\n }\n\n private messageReactionEventReceived(e: Event) {\n this.ngZone.run(() => {\n const isThreadMessage = e.message && e.message.parent_id;\n let messages!: StreamMessage[];\n (isThreadMessage\n ? this.activeThreadMessages$\n : this.activeChannelMessages$\n )\n .pipe(first())\n .subscribe((m) => (messages = m));\n const messageIndex = messages.findIndex((m) => m.id === e?.message?.id);\n if (messageIndex === -1) {\n return;\n }\n const message = messages[messageIndex];\n message.reaction_counts = { ...e.message?.reaction_counts };\n message.reaction_scores = { ...e.message?.reaction_scores };\n message.latest_reactions = [...(e.message?.latest_reactions || [])];\n message.own_reactions = [...(e.message?.own_reactions || [])];\n message.reaction_groups = { ...e.message?.reaction_groups };\n\n messages[messageIndex] = { ...message };\n isThreadMessage\n ? this.activeThreadMessagesSubject.next([...messages])\n : this.activeChannelMessagesSubject.next([...messages]);\n });\n }\n\n private formatMessage(message: MessageResponse) {\n const m = message as unknown as FormatMessageResponse;\n m.pinned_at = message.pinned_at ? new Date(message.pinned_at) : null;\n m.created_at = message.created_at\n ? new Date(message.created_at)\n : new Date();\n m.updated_at = message.updated_at\n ? new Date(message.updated_at)\n : new Date();\n message.status = message.status || 'received';\n\n return m;\n }\n\n private isStreamMessage(\n message: StreamMessage | FormatMessageResponse | MessageResponse\n ): message is StreamMessage {\n return 'readBy' in message;\n }\n\n private isFormatMessageResponse(\n message: StreamMessage | FormatMessageResponse | MessageResponse\n ): message is FormatMessageResponse {\n return message.created_at instanceof Date;\n }\n\n private stopWatchForActiveChannelEvents(channel: Channel | undefined) {\n if (!channel) {\n return;\n }\n this.activeChannelSubscriptions.forEach((s) => s.unsubscribe());\n this.activeChannelSubscriptions = [];\n }\n\n private async queryChannels(\n shouldSetActiveChannel: boolean,\n queryType: ChannelQueryType\n ) {\n if (!this.channelQuery) {\n throw new Error(\n 'Query channels called before initializing ChannelQuery instance'\n );\n }\n try {\n this.channelQueryStateSubject.next({ state: 'in-progress' });\n\n const { channels, hasMorePage } = await ('query' in this.channelQuery\n ? this.channelQuery.query(queryType)\n : this.channelQuery(queryType));\n const filteredChannels = channels.filter(\n (channel, index) =>\n !channels.slice(0, index).find((c) => c.cid === channel.cid)\n );\n filteredChannels.forEach((c) => {\n if (!this.channelSubscriptions[c.cid]) {\n this.watchForChannelEvents(c);\n }\n });\n\n this.channelsSubject.next(filteredChannels);\n const currentActiveChannel = this.activeChannelSubject.getValue();\n if (\n currentActiveChannel &&\n !filteredChannels.find((c) => c.cid === currentActiveChannel?.cid)\n ) {\n this.deselectActiveChannel();\n } else if (\n filteredChannels.length > 0 &&\n !currentActiveChannel &&\n shouldSetActiveChannel\n ) {\n this.setAsActiveChannel(filteredChannels[0]);\n }\n this.hasMoreChannelsSubject.next(hasMorePage);\n this.channelQueryStateSubject.next({ state: 'success' });\n this.dismissErrorNotification?.();\n return channels;\n } catch (error) {\n this.channelQueryStateSubject.next({\n state: 'error',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n error,\n });\n throw error;\n }\n }\n\n private watchForChannelEvents(channel: Channel) {\n if (this.channelSubscriptions[channel.cid]) {\n this.channelSubscriptions[channel.cid]();\n }\n const unsubscribe = channel.on((event: Event) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n const type = event.type as EventTypes | 'capabilities.changed';\n switch (type) {\n case 'message.new': {\n this.ngZone.run(() => {\n if (this.customNewMessageHandler) {\n this.customNewMessageHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleNewMessage(event, channel);\n }\n });\n break;\n }\n case 'channel.hidden': {\n this.ngZone.run(() => {\n if (this.customChannelHiddenHandler) {\n this.customChannelHiddenHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleChannelHidden(event);\n }\n });\n break;\n }\n case 'channel.deleted': {\n this.ngZone.run(() => {\n if (this.customChannelDeletedHandler) {\n this.customChannelDeletedHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleChannelDeleted(event);\n }\n });\n break;\n }\n case 'channel.visible': {\n this.ngZone.run(() => {\n if (this.customChannelVisibleHandler) {\n this.customChannelVisibleHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleChannelVisible(event, channel);\n }\n });\n break;\n }\n case 'channel.updated': {\n this.ngZone.run(() => {\n if (this.customChannelUpdatedHandler) {\n this.customChannelUpdatedHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleChannelUpdate(event);\n }\n });\n break;\n }\n case 'channel.truncated': {\n this.ngZone.run(() => {\n if (this.customChannelTruncatedHandler) {\n this.customChannelTruncatedHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleChannelTruncate(event);\n }\n });\n break;\n }\n case 'capabilities.changed': {\n this.ngZone.run(() => {\n const cid = event.cid;\n if (cid) {\n const currentChannels = this.channelsSubject.getValue();\n const index = currentChannels?.findIndex((c) => c.cid === cid);\n if (index !== -1 && index !== undefined) {\n this.channelsSubject.next([...currentChannels!]);\n if (cid === this.activeChannelSubject.getValue()?.cid) {\n this.activeChannelSubject.next(\n this.activeChannelSubject.getValue()\n );\n }\n }\n }\n });\n break;\n }\n }\n });\n this.channelSubscriptions[channel.cid] = unsubscribe.unsubscribe;\n }\n\n private handleNewMessage(_: Event, channel: Channel) {\n const channelIndex = this.channels.findIndex((c) => c.cid === channel.cid);\n this.channels.splice(channelIndex, 1);\n this.channelsSubject.next([channel, ...this.channels]);\n }\n\n private handleChannelHidden(event: Event) {\n this.removeChannel(event.channel!.cid, false);\n }\n\n private handleChannelDeleted(event: Event) {\n this.removeChannel(event.channel!.cid, false);\n }\n\n private handleChannelVisible(event: Event, channel: Channel) {\n if (!this.channels.find((c) => c.cid === event.cid)) {\n this.ngZone.run(() =>\n this.channelsSubject.next([...this.channels, channel])\n );\n }\n }\n\n private handleChannelUpdate(event: Event) {\n const channelIndex = this.channels.findIndex(\n (c) => c.cid === event.channel!.cid\n );\n if (channelIndex !== -1) {\n const channel = this.channels[channelIndex];\n const notIncludedProperies = {\n hidden: channel.data?.hidden || false,\n own_capabilities: channel.data?.own_capabilities || [],\n };\n channel.data = {\n ...event.channel!,\n ...notIncludedProperies,\n };\n this.channelsSubject.next([...this.channels]);\n if (event.channel?.cid === this.activeChannelSubject.getValue()?.cid) {\n this.activeChannelSubject.next(channel);\n }\n }\n }\n\n private handleChannelTruncate(event: Event) {\n const channelIndex = this.channels.findIndex(\n (c) => c.cid === event.channel!.cid\n );\n if (channelIndex !== -1) {\n this.channels[channelIndex].state.messages = [];\n this.channelsSubject.next([...this.channels]);\n if (event.channel?.cid === this.activeChannelSubject.getValue()?.cid) {\n const channel = this.activeChannelSubject.getValue()!;\n channel.state.messages = [];\n this.activeChannelSubject.next(channel);\n this.activeChannelMessagesSubject.next([]);\n this.activeParentMessageIdSubject.next(undefined);\n this.activeThreadMessagesSubject.next([]);\n }\n }\n }\n\n private get canSendReadEvents() {\n const channel = this.activeChannelSubject.getValue();\n if (!channel) {\n return false;\n }\n const capabilites = channel.data?.own_capabilities as string[];\n return capabilites.indexOf('read-events') !== -1;\n }\n\n private transformToStreamMessage(\n message: StreamMessage | MessageResponse | FormatMessageResponse,\n channel?: Channel\n ) {\n const isThreadMessage = !!message.parent_id;\n if (\n this.isStreamMessage(message) &&\n this.isFormatMessageResponse(message)\n ) {\n if (message.quoted_message) {\n message.quoted_message.translation = getMessageTranslation(\n message.quoted_message,\n channel,\n this.chatClientService.chatClient.user\n );\n }\n message.translation = getMessageTranslation(\n message,\n channel,\n this.chatClientService.chatClient.user\n );\n return message;\n } else {\n if (message.quoted_message) {\n (message as StreamMessage).quoted_message!.translation =\n getMessageTranslation(\n message.quoted_message,\n channel,\n this.chatClientService.chatClient.user\n );\n }\n if (this.isFormatMessageResponse(message)) {\n (message as StreamMessage).readBy = isThreadMessage\n ? []\n : channel\n ? getReadBy(message, channel)\n : [];\n (message as StreamMessage).translation = getMessageTranslation(\n message,\n channel,\n this.chatClientService.chatClient.user\n );\n\n return message as StreamMessage;\n } else {\n message = this.formatMessage(message);\n (message as StreamMessage).readBy = isThreadMessage\n ? []\n : channel\n ? getReadBy(message, channel)\n : [];\n (message as StreamMessage).translation = getMessageTranslation(\n message,\n channel,\n this.chatClientService.chatClient.user\n );\n return message as StreamMessage;\n }\n }\n }\n\n private handleTypingStartEvent(event: Event) {\n if (event.user?.id === this.chatClientService.chatClient.user?.id) {\n return;\n }\n const isTypingInThread = !!event.parent_id;\n if (\n isTypingInThread &&\n event.parent_id !== this.activeParentMessageIdSubject.getValue()\n ) {\n return;\n }\n const subject = isTypingInThread\n ? this.usersTypingInThreadSubject\n : this.usersTypingInChannelSubject;\n const users: UserResponse[] = subject.getValue();\n const user = event.user;\n if (user && !users.find((u) => u.id === user.id)) {\n users.push(user);\n subject.next([...users]);\n }\n }\n\n private handleTypingStopEvent(event: Event) {\n const usersTypingInChannel = this.usersTypingInChannelSubject.getValue();\n const usersTypingInThread = this.usersTypingInThreadSubject.getValue();\n const user = event.user;\n if (user && usersTypingInChannel.find((u) => u.id === user.id)) {\n usersTypingInChannel.splice(\n usersTypingInChannel.findIndex((u) => u.id === user.id),\n 1\n );\n this.usersTypingInChannelSubject.next([...usersTypingInChannel]);\n return;\n }\n if (user && usersTypingInThread.find((u) => u.id === user.id)) {\n usersTypingInThread.splice(\n usersTypingInThread.findIndex((u) => u.id === user.id),\n 1\n );\n this.usersTypingInThreadSubject.next([...usersTypingInThread]);\n return;\n }\n }\n\n private updateLatestMessages(event: Event) {\n if (\n event.message?.user?.id !== this.chatClientService?.chatClient.user?.id\n ) {\n return;\n }\n const latestMessages =\n this.latestMessageDateByUserByChannelsSubject.getValue();\n if (!event.message?.created_at) {\n return;\n }\n const channelId = event?.message?.cid;\n if (!channelId) {\n return;\n }\n const messageDate = new Date(event.message.created_at);\n if (\n !latestMessages[channelId] ||\n latestMessages[channelId]?.getTime() < messageDate.getTime()\n ) {\n latestMessages[channelId] = messageDate;\n this.latestMessageDateByUserByChannelsSubject.next({\n ...latestMessages,\n });\n }\n }\n\n private setChannelState(channel: Channel) {\n channel.state.messages.forEach((m) => {\n (m as StreamMessage).readBy = getReadBy(m, channel);\n (m as StreamMessage).translation = getMessageTranslation(\n m,\n channel,\n this.chatClientService.chatClient.user\n );\n if (m.quoted_message) {\n (m as StreamMessage).quoted_message!.translation =\n getMessageTranslation(\n m.quoted_message,\n channel,\n this.chatClientService.chatClient.user\n );\n }\n });\n this.markRead(channel);\n this.activeChannelMessagesSubject.next([...channel.state.messages]);\n this.activeChannelPinnedMessagesSubject.next([\n ...(channel.state.pinnedMessages as StreamMessage[]),\n ]);\n this.activeParentMessageIdSubject.next(undefined);\n this.activeThreadMessagesSubject.next([]);\n this.messageToQuoteSubject.next(undefined);\n this.usersTypingInChannelSubject.next([]);\n this.usersTypingInThreadSubject.next([]);\n }\n\n private markRead(channel: Channel, isThrottled = true) {\n if (\n this.canSendReadEvents &&\n this.shouldMarkActiveChannelAsRead &&\n !this.areReadEventsPaused\n ) {\n if (isThrottled) {\n this.markReadThrottled(channel);\n } else {\n void channel.markRead();\n }\n }\n }\n\n private markReadThrottled(channel: Channel) {\n if (!this.markReadTimeout) {\n this.markRead(channel, false);\n this.markReadTimeout = setTimeout(() => {\n this.flushMarkReadQueue();\n }, this.markReadThrottleTime);\n } else {\n clearTimeout(this.markReadTimeout);\n this.scheduledMarkReadRequest = () => this.markRead(channel, false);\n this.markReadTimeout = setTimeout(() => {\n this.flushMarkReadQueue();\n }, this.markReadThrottleTime);\n }\n }\n\n private flushMarkReadQueue() {\n this.scheduledMarkReadRequest?.();\n this.scheduledMarkReadRequest = undefined;\n clearTimeout(this.markReadTimeout);\n this.markReadTimeout = undefined;\n }\n\n private async _init(settings: {\n shouldSetActiveChannel: boolean;\n messagePageSize: number;\n }) {\n this.shouldSetActiveChannel = settings.shouldSetActiveChannel;\n this.messagePageSize = settings.messagePageSize;\n this.clientEventsSubscription = this.chatClientService.events$.subscribe(\n (notification) => void this.handleNotification(notification)\n );\n try {\n const result = await this.queryChannels(\n this.shouldSetActiveChannel,\n 'first-page'\n );\n return result;\n } catch (error) {\n this.dismissErrorNotification =\n this.notificationService.addPermanentNotification(\n 'streamChat.Error loading channels',\n 'error'\n );\n throw error;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * The `ThemeService` can be used to change the theme of the chat UI and to customize the theme. Our [theming guide](/chat/docs/sdk/angular/theming/themingv2/) gives a complete overview about the topic.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ThemeService {\n /**\n * A Subject that can be used to get or set the currently active theme. By default light and dark themes are supported.\n */\n theme$ = new BehaviorSubject<string>('light');\n\n constructor() {}\n}\n","export const isImageFile = (file: File) => {\n // photoshop files begin with 'image/'\n return file.type.startsWith('image/') && !file.type.endsWith('.photoshop');\n};\n\nexport const readBlobAsArrayBuffer = (blob: Blob): Promise<ArrayBuffer> =>\n new Promise((resolve, reject) => {\n const fileReader = new FileReader();\n fileReader.onload = () => {\n resolve(fileReader.result as ArrayBuffer);\n };\n\n fileReader.onerror = () => {\n reject(fileReader.error);\n };\n\n fileReader.readAsArrayBuffer(blob);\n });\n\nexport const createFileFromBlobs = ({\n blobsArray,\n fileName,\n mimeType,\n}: {\n blobsArray: Blob[];\n fileName: string;\n mimeType: string;\n}) => {\n const concatenatedBlob = new Blob(blobsArray, { type: mimeType });\n return new File([concatenatedBlob], fileName, {\n type: concatenatedBlob.type,\n });\n};\n\nexport const getExtensionFromMimeType = (mimeType: string) => {\n const match = mimeType.match(/\\/([^/;]+)/);\n return match && match[1];\n};\n\nexport const createUriFromBlob = (blob: Blob) => {\n return new Promise<string | ArrayBuffer | undefined>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (event) => {\n resolve(event.target?.result ?? undefined);\n };\n reader.onerror = (e) => reject(e);\n reader.readAsDataURL(blob);\n });\n};\n","import { Attachment } from 'stream-chat';\n\nexport const isImageAttachment = (attachment: Attachment) => {\n return (\n attachment.type === 'image' &&\n !attachment.title_link &&\n !attachment.og_scrape_url\n );\n};\n","import { Injectable } from '@angular/core';\nimport { Attachment } from 'stream-chat';\n\n/**\n * The message service contains configuration options related to displaying the message content\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class MessageService {\n /**\n * Decides if the message content should be formatted as text or HTML\n *\n * If you display messages as text the following parts are still be displayed as HTML:\n * - user mentions -> you can customize this with your own template using the [`customTemplatesService.mentionTemplate$`](/chat/docs/sdk/angular/services/CustomTemplatesService/#mentiontemplate)\n * - links -> you can customize this by providing you own [`customLinkRenderer`](#customlinkrenderer) method\n */\n displayAs: 'text' | 'html' = 'text';\n\n /**\n * You can provide a custom method to display links\n * @param url the url the link should refer to\n * @returns the HTML markup as a string for the link\n */\n customLinkRenderer?: (url: string) => string;\n /**\n * The SDK supports the following attachment types: `image`, `file`, `giphy`, `video` and `voiceRecording` attachments.\n *\n * All other types are treated as custom attachments, however it's possible to override this logic, and provide a custom filtering method which can be used to treat some built-in attachments as custom.\n *\n * Provide a method which retruns `true` if an attachment should be considered as custom.\n */\n filterCustomAttachment?: (attachment: Attachment) => boolean;\n\n constructor() {}\n\n /**\n * Tells if an attachment is custom (you need to provide your own template to display them) or built-in (the SDK supports it out-of-the-box)\n * @param attachment\n * @returns `true` if the attachment is custom\n */\n isCustomAttachment(attachment: Attachment) {\n if (this.filterCustomAttachment) {\n return this.filterCustomAttachment(attachment);\n } else {\n return (\n attachment.type !== 'image' &&\n attachment.type !== 'file' &&\n attachment.type !== 'video' &&\n attachment.type !== 'voiceRecording' &&\n attachment.type !== 'giphy'\n );\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { createUriFromBlob, isImageFile } from './file-utils';\nimport {\n BehaviorSubject,\n combineLatest,\n map,\n Observable,\n shareReplay,\n take,\n} from 'rxjs';\nimport { AppSettings, Attachment } from 'stream-chat';\nimport { ChannelService } from './channel.service';\nimport { isImageAttachment } from './is-image-attachment';\nimport { NotificationService } from './notification.service';\nimport { AttachmentUpload, AudioRecording } from './types';\nimport { ChatClientService } from './chat-client.service';\nimport { MessageService } from './message.service';\n\n/**\n * The `AttachmentService` manages the uploads of a message input.\n *\n * You can read more about [uploads](/chat/docs/javascript/file_uploads/) in the Stream API documentation. You can use Stream's API or the dashboard to customize the [file](/chat/docs/javascript/app_setting_overview/#file-uploads) and [image upload](/chat/docs/javascript/app_setting_overview/#image-uploads) configuration.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AttachmentService {\n /**\n * Emits the number of uploads in progress.\n *\n * You can increment and decrement this counter if you're using custom attachments and want to disable message sending until all attachments are uploaded.\n *\n * The SDK will handle updating this counter for built-in attachments, but for custom attachments you should take care of this.\n */\n attachmentUploadInProgressCounter$ = new BehaviorSubject<number>(0);\n /**\n * Emits the state of the uploads ([`AttachmentUpload[]`](https://github.com/GetStream/stream-chat-angular/blob/master/projects/stream-chat-angular/src/lib/types.ts)), it adds a state (`success`, `error` or `uploading`) to each file the user selects for upload. It is used by the [`AttachmentPreviewList`](/chat/docs/sdk/angular/components/AttachmentPreviewListComponent/) to display the attachment previews.\n */\n attachmentUploads$: Observable<AttachmentUpload[]>;\n /**\n * You can get and set the list if uploaded custom attachments\n *\n * By default the SDK components won't display these, but you can provide your own `customAttachmentPreviewListTemplate$` and `customAttachmentListTemplate$` for the [`CustomTemplatesService`](/chat/docs/sdk/angular/services/CustomTemplatesService/).\n */\n customAttachments$ = new BehaviorSubject<Attachment[]>([]);\n /**\n * The current number of attachments\n */\n attachmentsCounter$: Observable<number>;\n /**\n * The maximum number of attachments allowed for a message.\n *\n * The maximum is 30, you can set it to lower, but not higher.\n */\n maxNumberOfAttachments = 30;\n private attachmentUploadsSubject = new BehaviorSubject<AttachmentUpload[]>(\n []\n );\n private appSettings: AppSettings | undefined;\n private attachmentLimitNotificationHide?: () => void;\n\n constructor(\n private channelService: ChannelService,\n private notificationService: NotificationService,\n private chatClientService: ChatClientService,\n private messageService: MessageService\n ) {\n this.attachmentUploads$ = this.attachmentUploadsSubject.asObservable();\n this.chatClientService.appSettings$.subscribe(\n (appSettings) => (this.appSettings = appSettings)\n );\n this.attachmentsCounter$ = combineLatest([\n this.attachmentUploads$,\n this.customAttachments$,\n ]).pipe(\n map(([attchmentUploads, customAttachments]) => {\n return (\n attchmentUploads.filter((u) => u.state === 'success').length +\n customAttachments.length\n );\n }),\n shareReplay(1)\n );\n this.attachmentsCounter$.subscribe((count) => {\n if (count > this.maxNumberOfAttachments) {\n this.attachmentLimitNotificationHide =\n this.notificationService.addPermanentNotification(\n 'streamChat.You currently have {{count}} attachments, the maximum is {{max}}',\n 'error',\n { count, max: this.maxNumberOfAttachments }\n );\n } else {\n this.attachmentLimitNotificationHide?.();\n }\n });\n }\n\n /**\n * Resets the attachments uploads (for example after the message with the attachments sent successfully)\n */\n resetAttachmentUploads() {\n this.attachmentUploadsSubject.next([]);\n this.customAttachments$.next([]);\n this.attachmentLimitNotificationHide?.();\n }\n\n /**\n * Upload a voice recording\n * @param audioRecording\n * @returns A promise with true or false. If false is returned the upload was canceled because of a client side error. The error is emitted via the `NotificationService`.\n */\n async uploadVoiceRecording(audioRecording: AudioRecording) {\n if (!this.isWithinLimit(1)) {\n return false;\n }\n if (\n !(await this.areAttachmentsHaveValidExtension([audioRecording.recording]))\n ) {\n return false;\n }\n if (!(await this.areAttachmentsHaveValidSize([audioRecording.recording]))) {\n return false;\n }\n\n const upload = {\n file: audioRecording.recording,\n previewUri: audioRecording.asset_url,\n extraData: {\n duration: audioRecording.duration,\n waveform_data: audioRecording.waveform_data,\n },\n state: 'uploading' as const,\n type: 'voiceRecording' as const,\n };\n this.attachmentUploadsSubject.next([\n ...this.attachmentUploadsSubject.getValue(),\n upload,\n ]);\n await this.uploadAttachments([upload]);\n return true;\n }\n\n /**\n * Uploads the selected files, and creates preview for image files. The result is propagated throught the `attachmentUploads$` stream.\n * @param fileList The files selected by the user, if you have Blobs instead of Files, you can convert them with this method: https://developer.mozilla.org/en-US/docs/Web/API/File/File\n * @returns A promise with true or false. If false is returned the upload was canceled because of a client side error. The error is emitted via the `NotificationService`.\n */\n async filesSelected(fileList: FileList | File[] | null) {\n if (!fileList) {\n return;\n }\n\n const files = Array.from(fileList);\n\n if (!this.isWithinLimit(files.length)) {\n return false;\n }\n\n if (!(await this.areAttachmentsHaveValidExtension(files))) {\n return false;\n }\n if (!(await this.areAttachmentsHaveValidSize(files))) {\n return false;\n }\n const imageFiles: File[] = [];\n const dataFiles: File[] = [];\n const videoFiles: File[] = [];\n\n files.forEach((file) => {\n if (isImageFile(file)) {\n imageFiles.push(file);\n } else if (file.type.startsWith('video/')) {\n videoFiles.push(file);\n } else {\n dataFiles.push(file);\n }\n });\n imageFiles.forEach((f) => void this.createPreview(f));\n const newUploads = [\n ...imageFiles.map((file) => ({\n file,\n state: 'uploading' as const,\n type: 'image' as const,\n })),\n ...videoFiles.map((file) => ({\n file,\n state: 'uploading' as const,\n type: 'video' as const,\n })),\n ...dataFiles.map((file) => ({\n file,\n state: 'uploading' as const,\n type: 'file' as const,\n })),\n ];\n this.attachmentUploadsSubject.next([\n ...this.attachmentUploadsSubject.getValue(),\n ...newUploads,\n ]);\n await this.uploadAttachments(newUploads);\n return true;\n }\n\n /**\n * You can add custom `image`, `video` and `file` attachments using this method.\n *\n * Note: If you just want to use your own CDN for file uploads, you don't necessary need this method, you can just specify you own upload function in the [`ChannelService`](/chat/docs/sdk/angular/services/ChannelService/)\n * @param attachment\n *\n * Will set `isCustomAttachment` to `true` on the attachment. This is a non-standard field, other SDKs will ignore this property.\n */\n addAttachment(attachment: Attachment) {\n attachment.isCustomAttachment = true;\n this.createFromAttachments([attachment]);\n }\n\n /**\n * Retries to upload an attachment.\n * @param file\n * @returns A promise with the result\n */\n async retryAttachmentUpload(file: File) {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n const upload = attachmentUploads.find((u) => u.file === file);\n if (!upload) {\n return;\n }\n upload.state = 'uploading';\n this.attachmentUploadsSubject.next([...attachmentUploads]);\n await this.uploadAttachments([upload]);\n }\n\n /**\n * Deletes an attachment, the attachment can have any state (`error`, `uploading` or `success`).\n * @param upload\n */\n async deleteAttachment(upload: AttachmentUpload) {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n let result!: AttachmentUpload[];\n if (\n upload.state === 'success' &&\n !upload.fromAttachment?.isCustomAttachment\n ) {\n try {\n await this.channelService.deleteAttachment(upload);\n result = [...attachmentUploads];\n const index = attachmentUploads.indexOf(upload);\n result.splice(index, 1);\n } catch (error) {\n result = attachmentUploads;\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error deleting attachment'\n );\n }\n } else {\n result = [...attachmentUploads];\n const index = attachmentUploads.indexOf(upload);\n result.splice(index, 1);\n }\n this.attachmentUploadsSubject.next([...result]);\n }\n\n /**\n * Maps the current uploads to a format that can be sent along with the message to the Stream API.\n * @returns the attachments\n */\n mapToAttachments() {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n const builtInAttachments = attachmentUploads\n .filter((r) => r.state === 'success')\n .map((r) => {\n let attachment: Attachment = {\n type: r.type,\n };\n if (r.fromAttachment) {\n return r.fromAttachment;\n } else {\n attachment.mime_type = r.file?.type;\n if (r.type === 'image') {\n attachment.fallback = r.file?.name;\n attachment.image_url = r.url;\n } else {\n attachment.asset_url = r.url;\n attachment.title = r.file?.name;\n attachment.file_size = r.file?.size;\n attachment.thumb_url = r.thumb_url;\n }\n if (r.extraData) {\n attachment = { ...attachment, ...r.extraData };\n }\n }\n\n return attachment;\n });\n return [...builtInAttachments, ...this.customAttachments$.value];\n }\n\n /**\n * Maps attachments received from the Stream API to uploads. This is useful when editing a message.\n * @param attachments Attachemnts received with the message\n */\n createFromAttachments(attachments: Attachment[]) {\n const attachmentUploads: AttachmentUpload[] = [];\n const builtInAttachments: Attachment[] = [];\n const customAttachments: Attachment[] = [];\n attachments.forEach((attachment) => {\n if (this.messageService.isCustomAttachment(attachment)) {\n customAttachments.push(attachment);\n } else {\n builtInAttachments.push(attachment);\n }\n });\n builtInAttachments.forEach((attachment) => {\n if (isImageAttachment(attachment)) {\n attachmentUploads.push({\n url: (attachment.img_url ||\n attachment.thumb_url ||\n attachment.image_url) as string,\n state: 'success',\n type: 'image',\n file: {\n name: attachment.fallback,\n type: attachment.mime_type,\n } as File,\n fromAttachment: attachment,\n });\n } else if (attachment.type === 'file' || attachment.type === 'video') {\n attachmentUploads.push({\n url: attachment.asset_url,\n state: 'success',\n file: {\n name: attachment.title,\n size: attachment.file_size,\n type: attachment.mime_type,\n } as File,\n type: attachment.type,\n thumb_url: attachment.thumb_url,\n fromAttachment: attachment,\n });\n } else if (attachment.type === 'voiceRecording') {\n attachmentUploads.push({\n url: attachment.asset_url,\n state: 'success',\n file: {\n name: attachment.title,\n size: attachment.file_size,\n type: attachment.mime_type,\n } as File,\n type: 'voiceRecording',\n extraData: {\n duration: attachment.duration,\n waveform_data: attachment.waveform_data,\n },\n });\n }\n });\n\n if (attachmentUploads.length > 0) {\n this.attachmentUploadsSubject.next([\n ...this.attachmentUploadsSubject.getValue(),\n ...attachmentUploads,\n ]);\n }\n\n if (customAttachments.length > 0) {\n this.customAttachments$.next(customAttachments);\n }\n }\n\n private async createPreview(file: File | Blob) {\n try {\n const uri = await createUriFromBlob(file);\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n const upload = attachmentUploads.find((upload) => upload.file === file);\n if (!upload) {\n return;\n }\n upload.previewUri = uri;\n this.attachmentUploadsSubject.next([...attachmentUploads]);\n } catch (e: unknown) {\n this.chatClientService?.chatClient?.logger(\n 'error',\n e instanceof Error ? e.message : `Can't create image preview`,\n { error: e, tag: ['AttachmentService'] }\n );\n }\n }\n\n private async uploadAttachments(uploads: AttachmentUpload[]) {\n this.attachmentUploadInProgressCounter$.next(\n this.attachmentUploadInProgressCounter$.value + 1\n );\n const result = await this.channelService.uploadAttachments(uploads);\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n result.forEach((r) => {\n const upload = attachmentUploads.find((upload) => upload.file === r.file);\n if (!upload) {\n if (r.url) {\n void this.channelService.deleteAttachment(r);\n }\n return;\n }\n upload.state = r.state;\n upload.url = r.url;\n upload.thumb_url = r.thumb_url;\n if (upload.state === 'error') {\n upload.errorReason = r.errorReason;\n upload.errorExtraInfo = r.errorExtraInfo;\n let errorKey;\n const translateParams: { name: string; ext?: string; limit?: string } =\n { name: upload.file.name };\n switch (upload.errorReason) {\n case 'file-extension':\n errorKey =\n 'streamChat.Error uploading file, extension not supported';\n translateParams.ext = upload.errorExtraInfo?.[0]?.param;\n break;\n case 'file-size':\n errorKey =\n 'streamChat.Error uploading file, maximum file size exceeded';\n translateParams.limit = upload.errorExtraInfo?.[0]?.param;\n break;\n default:\n errorKey = 'streamChat.Error uploading file';\n }\n this.notificationService.addTemporaryNotification(\n errorKey,\n 'error',\n undefined,\n translateParams\n );\n }\n });\n this.attachmentUploadInProgressCounter$.next(\n this.attachmentUploadInProgressCounter$.value - 1\n );\n this.attachmentUploadsSubject.next([...attachmentUploads]);\n }\n\n private async areAttachmentsHaveValidExtension(files: File[]) {\n if (!this.appSettings) {\n try {\n await this.chatClientService.getAppSettings();\n } catch (error) {\n return true;\n }\n }\n let isValid = true;\n files.forEach((f) => {\n let hasBlockedExtension: boolean;\n let hasBlockedMimeType: boolean;\n let hasNotAllowedExtension: boolean;\n let hasNotAllowedMimeType: boolean;\n if (isImageFile(f)) {\n hasBlockedExtension =\n !!this.appSettings?.image_upload_config?.blocked_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasBlockedMimeType =\n !!this.appSettings?.image_upload_config?.blocked_mime_types?.find(\n (type) => f.type === type\n );\n hasNotAllowedExtension =\n !!this.appSettings?.image_upload_config?.allowed_file_extensions\n ?.length &&\n !this.appSettings?.image_upload_config?.allowed_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasNotAllowedMimeType =\n !!this.appSettings?.image_upload_config?.allowed_mime_types?.length &&\n !this.appSettings?.image_upload_config?.allowed_mime_types?.find(\n (type) => f.type === type\n );\n } else {\n hasBlockedExtension =\n !!this.appSettings?.file_upload_config?.blocked_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasBlockedMimeType =\n !!this.appSettings?.file_upload_config?.blocked_mime_types?.find(\n (type) => f.type === type\n );\n hasNotAllowedExtension =\n !!this.appSettings?.file_upload_config?.allowed_file_extensions\n ?.length &&\n !this.appSettings?.file_upload_config?.allowed_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasNotAllowedMimeType =\n !!this.appSettings?.file_upload_config?.allowed_mime_types?.length &&\n !this.appSettings?.file_upload_config?.allowed_mime_types?.find(\n (type) => f.type === type\n );\n }\n if (\n hasBlockedExtension ||\n hasBlockedMimeType ||\n hasNotAllowedExtension ||\n hasNotAllowedMimeType\n ) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error uploading file, extension not supported',\n undefined,\n undefined,\n { name: f.name, ext: f.type }\n );\n isValid = false;\n }\n });\n return isValid;\n }\n\n private async areAttachmentsHaveValidSize(files: File[]) {\n if (!this.appSettings) {\n try {\n await this.chatClientService.getAppSettings();\n } catch (error) {\n return true;\n }\n }\n const imageSizeLimitInBytes =\n this.appSettings?.image_upload_config?.size_limit || 0;\n const imageSizeLimiString = `${imageSizeLimitInBytes / (1024 * 1024)}MB`;\n const fileSizeLimitInBytes =\n this.appSettings?.file_upload_config?.size_limit || 0;\n const fileSizeLimitInString = `${fileSizeLimitInBytes / (1024 * 1024)}MB`;\n let isValid = true;\n files.forEach((f) => {\n let isOverSized = false;\n let limit = '';\n if (isImageFile(f) && imageSizeLimitInBytes > 0) {\n isOverSized = f.size > imageSizeLimitInBytes;\n limit = imageSizeLimiString;\n } else if (fileSizeLimitInBytes > 0) {\n isOverSized = f.size > fileSizeLimitInBytes;\n limit = fileSizeLimitInString;\n }\n if (isOverSized) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error uploading file, maximum file size exceeded',\n undefined,\n undefined,\n { name: f.name, limit: limit }\n );\n isValid = false;\n }\n });\n return isValid;\n }\n\n private isWithinLimit(numberOfNewAttachments: number) {\n let currentNumberOfAttachments: number = 0;\n this.attachmentsCounter$\n .pipe(take(1))\n .subscribe((counter) => (currentNumberOfAttachments = counter));\n if (\n currentNumberOfAttachments + numberOfNewAttachments >\n this.maxNumberOfAttachments\n ) {\n this.notificationService.addTemporaryNotification(\n `streamChat.You can't uplod more than {{max}} attachments`,\n 'error',\n undefined,\n { max: this.maxNumberOfAttachments }\n );\n return false;\n } else {\n return true;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Attachment } from 'stream-chat';\nimport {\n AttachmentConfigration,\n ImageAttachmentConfiguration,\n VideoAttachmentConfiguration,\n} from './types';\n\n/**\n * The `AttachmentConfigurationService` provides customization for certain attributes of attachments displayed inside the message component. If you're using your own CDN, you can integrate resizing features of it by providing your own handlers.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AttachmentConfigurationService {\n /**\n * A custom handler can be provided to override the default image attachment (images uploaded from files) configuration. By default the SDK uses fixed image height (a size that's known before image is loaded), if you override that with dynamic image height (for example: height: 100%) the scrolling logic inside the message list can break.\n */\n customImageAttachmentConfigurationHandler?: (\n a: Attachment,\n type: 'gallery' | 'single' | 'carousel',\n containerElement: HTMLElement\n ) => ImageAttachmentConfiguration;\n /**\n * A custom handler can be provided to override the default video attachment (videos uploaded from files) configuration. By default the SDK uses fixed height (a size that's known before video is loaded), if you override that with dynamic height (for example: height: 100%) the scrolling logic inside the message list can break.\n */\n customVideoAttachmentConfigurationHandler?: (\n a: Attachment,\n containerElement: HTMLElement\n ) => VideoAttachmentConfiguration;\n /**\n * A custom handler can be provided to override the default giphy attachment (GIFs sent with the /giphy command) configuration. By default the SDK uses fixed height (a size that's known before the GIF is loaded), if you override that with dynamic height (for example: height: 100%) the scrolling logic inside the message list can break.\n */\n customGiphyAttachmentConfigurationHandler?: (\n a: Attachment\n ) => AttachmentConfigration;\n /**\n * A custom handler can be provided to override the default scraped image attachment (images found in links inside messages) configuration. By default the SDK uses fixed height (a size that's known before image is loaded), if you override that with dynamic height (for example: height: 100%) the scrolling logic inside the message list can break.\n */\n customScrapedImageAttachmentConfigurationHandler?: (\n a: Attachment\n ) => AttachmentConfigration;\n /**\n * You can turn on/off thumbnail generation for video attachments\n */\n shouldGenerateVideoThumbnail = true;\n\n /**\n * Handles the configuration for image attachments, it's possible to provide your own function to override the default logic\n * @param attachment The attachment to configure\n * @param location Specifies where the image is being displayed\n * @param element The default resizing logics reads the height/max-height and max-width propperties of this element and reduces file size based on the given values. File size reduction is done by Stream's CDN.\n */\n getImageAttachmentConfiguration(\n attachment: Attachment,\n location: 'gallery' | 'single' | 'carousel',\n element: HTMLElement\n ): ImageAttachmentConfiguration {\n if (this.customImageAttachmentConfigurationHandler) {\n return this.customImageAttachmentConfigurationHandler(\n attachment,\n location,\n element\n );\n }\n\n const defaultOriginalDimension = 1000000;\n const urlString =\n attachment.img_url || attachment.thumb_url || attachment.image_url || '';\n let url: URL;\n try {\n url = new URL(urlString);\n } catch (error) {\n return {\n url: urlString,\n width: '', // Not set to respect responsive width\n height: '', // Set from CSS\n originalHeight: defaultOriginalDimension,\n originalWidth: defaultOriginalDimension,\n };\n }\n const originalHeight =\n Number(url.searchParams.get('oh')) > 1\n ? Number(url.searchParams.get('oh'))\n : defaultOriginalDimension;\n const originalWidth =\n Number(url.searchParams.get('ow')) > 1\n ? Number(url.searchParams.get('ow'))\n : defaultOriginalDimension;\n const displayWarning = location === 'gallery' || location === 'single';\n const sizeRestriction = this.getSizingRestrictions(\n url,\n element,\n displayWarning\n );\n\n if (sizeRestriction) {\n // Apply 2x for retina displays\n sizeRestriction.height *= 2;\n sizeRestriction.width *= 2;\n this.addResizingParamsToUrl(sizeRestriction, url);\n }\n\n return {\n url: url.href,\n width: '', // Not set to respect responsive width\n height: '', // Set from CSS\n originalHeight,\n originalWidth,\n };\n }\n\n /**\n * Handles the configuration for video attachments, it's possible to provide your own function to override the default logic\n * @param attachment The attachment to configure\n * @param element The default resizing logics reads the height/max-height and max-width propperties of this element and reduces file size based on the given values. File size reduction is done by Stream's CDN.\n */\n getVideoAttachmentConfiguration(\n attachment: Attachment,\n element: HTMLElement\n ): VideoAttachmentConfiguration {\n if (this.customVideoAttachmentConfigurationHandler) {\n return this.customVideoAttachmentConfigurationHandler(\n attachment,\n element\n );\n }\n\n let thumbUrl: string | undefined = undefined;\n let originalHeight = 1000000;\n let originalWidth = 1000000;\n if (attachment.thumb_url && this.shouldGenerateVideoThumbnail) {\n let url: URL;\n try {\n url = new URL(attachment.thumb_url);\n\n originalHeight =\n Number(url.searchParams.get('oh')) > 1\n ? Number(url.searchParams.get('oh'))\n : originalHeight;\n originalWidth =\n Number(url.searchParams.get('ow')) > 1\n ? Number(url.searchParams.get('ow'))\n : originalWidth;\n const displayWarning = true;\n const sizeRestriction = this.getSizingRestrictions(\n url,\n element,\n displayWarning\n );\n if (sizeRestriction) {\n sizeRestriction.height *= 2;\n sizeRestriction.width *= 2;\n this.addResizingParamsToUrl(sizeRestriction, url);\n }\n thumbUrl = url.href;\n } catch {\n thumbUrl = attachment.thumb_url;\n }\n }\n return {\n url: attachment.asset_url || '',\n width: '', // Not set to respect responsive width\n height: '', // Set from CSS\n thumbUrl: thumbUrl,\n originalHeight,\n originalWidth,\n };\n }\n\n /**\n * Handles the configuration for giphy attachments, it's possible to provide your own function to override the default logic\n * @param attachment The attachment to configure\n */\n getGiphyAttachmentConfiguration(\n attachment: Attachment\n ): AttachmentConfigration {\n if (this.customGiphyAttachmentConfigurationHandler) {\n return this.customGiphyAttachmentConfigurationHandler(attachment);\n }\n\n const giphy = attachment.giphy?.fixed_height_downsampled;\n\n return {\n url: giphy?.url || attachment.image_url || attachment.thumb_url || '',\n height: giphy?.height ? `${giphy?.height}px` : '300px',\n width: giphy?.width ? `${giphy?.width}px` : '',\n };\n }\n\n /**\n * Handles the configuration for scraped image attachments, it's possible to provide your own function to override the default logic\n * @param attachment The attachment to configure\n */\n getScrapedImageAttachmentConfiguration(\n attachment: Attachment\n ): AttachmentConfigration {\n if (this.customScrapedImageAttachmentConfigurationHandler) {\n return this.customScrapedImageAttachmentConfigurationHandler(attachment);\n }\n\n return {\n url: attachment.image_url || attachment.thumb_url || '',\n width: '',\n height: '', // Set from CSS\n };\n }\n\n private addResizingParamsToUrl(\n sizeRestriction: { width: number; height: number },\n url: URL\n ) {\n url.searchParams.set('h', sizeRestriction.height.toString());\n url.searchParams.set('w', sizeRestriction.width.toString());\n }\n\n private getSizingRestrictions(\n url: URL,\n htmlElement: HTMLElement,\n displayWarning = false\n ) {\n const urlParams = url.searchParams;\n const originalHeight = Number(urlParams.get('oh')) || 1;\n const originalWidth = Number(urlParams.get('ow')) || 1;\n const cssSizeRestriction = this.getCSSSizeRestriction(htmlElement);\n let sizeRestriction: { width: number; height: number } | undefined;\n\n if (\n (cssSizeRestriction.maxHeight || cssSizeRestriction.height) &&\n cssSizeRestriction.maxWidth\n ) {\n sizeRestriction = this.getSizeRestrictions(\n originalHeight,\n originalWidth,\n (cssSizeRestriction.maxHeight || cssSizeRestriction.height)!,\n cssSizeRestriction.maxWidth\n );\n } else {\n sizeRestriction = undefined;\n if (displayWarning) {\n console.warn(\n `Invalid value set for height/max-height and/or max-width for HTML element, this can cause scrolling issues inside the message list, more info https://getstream.io/chat/docs/sdk/angular/components/AttachmentListComponent/#image-and-video-sizing, attachment URL: ${url.toString()}`\n );\n }\n }\n\n return sizeRestriction;\n }\n\n private getSizeRestrictions(\n originalHeight: number,\n originalWidth: number,\n maxHeight: number,\n maxWidth: number\n ) {\n return {\n height: Math.round(\n Math.max(maxHeight, (maxWidth / originalWidth) * originalHeight)\n ),\n width: Math.round(\n Math.max(maxHeight, (maxWidth / originalHeight) * originalWidth)\n ),\n };\n }\n\n private getCSSSizeRestriction(htmlElement: HTMLElement) {\n const computedStylesheet = getComputedStyle(htmlElement);\n const height = this.getValueRepresentationOfCSSProperty(\n computedStylesheet.getPropertyValue('height')\n );\n const maxHeight = this.getValueRepresentationOfCSSProperty(\n computedStylesheet.getPropertyValue('max-height')\n );\n const maxWidth = this.getValueRepresentationOfCSSProperty(\n computedStylesheet.getPropertyValue('max-width')\n );\n\n return { height, maxHeight, maxWidth };\n }\n\n private getValueRepresentationOfCSSProperty(property: string) {\n return Number(property.replace('px', '')) || undefined;\n }\n}\n","export const en = {\n streamChat: {\n '1 reply': '1 reply',\n 'Attach files': 'Attach files',\n Cancel: 'Cancel',\n 'Channel Missing': 'Channel Missing',\n Close: 'Close',\n 'Close emoji picker': 'Close emoji picker',\n 'Commands matching': 'Commands matching',\n 'Connection failure, reconnecting now...':\n 'Connection failure, reconnecting now...',\n Delete: 'Delete',\n Delivered: 'Delivered',\n 'Edit Message': 'Edit Message',\n 'Edit message request failed': 'Edit message request failed',\n 'Emoji matching': 'Emoji matching',\n 'Empty message...': 'Empty message...',\n 'Error adding flag': 'Error adding flag',\n 'Error connecting to chat, refresh the page to try again.':\n 'Error connecting to chat, refresh the page to try again',\n 'Error deleting message': 'Error deleting message',\n 'Error loading reactions': 'Error loading reactions',\n 'Error muting a user ...': 'Error muting a user ...',\n 'Error pinning message': 'Error pinning message',\n 'Error removing message pin': 'Error removing message pin',\n 'Error unmuting a user ...': 'Error unmuting a user ...',\n 'Error uploading file': 'Error uploading file \"{{ name }}\"',\n 'Error uploading file, maximum file size exceeded':\n 'Error uploading \"{{ name }}\", maximum file size {{ limit }} exceeded',\n 'Error uploading file, extension not supported':\n 'Error uploading \"{{ name }}\", type {{ ext }} not supported',\n 'Error deleting attachment': 'Error deleting attachment',\n 'Error · Unsent': \"Message couldn't be sent\",\n 'Error: {{ errorMessage }}': 'Error: {{ errorMessage }}',\n Flag: 'Flag',\n 'Message Failed': 'Message Failed',\n 'Message Failed · Unauthorized': 'Unauthorized to send message',\n 'Message Failed · Click to try again':\n \"Message couldn't be sent, click to try again\",\n 'Message deleted': 'Message deleted',\n 'Message has been successfully flagged':\n 'Message has been successfully flagged',\n 'Message pinned': 'Message pinned',\n 'Message unpinned': 'Message unpinned',\n Mute: 'Mute',\n New: 'New',\n 'New Messages!': 'New Messages!',\n 'No results found': 'No results found',\n 'Nothing yet...': 'Nothing yet...',\n 'Only visible to you': 'Only visible to you',\n 'Open emoji picker': 'Open emoji picker',\n 'People matching': 'People matching',\n 'Pick your emoji': 'Pick your emoji',\n Pin: 'Pin',\n 'Pinned by': 'Pinned by',\n Reply: 'Quote Reply',\n 'Reply to Message': 'Reply to Message',\n Search: 'Search',\n 'Searching...': 'Searching...',\n Send: 'Send',\n 'Send message request failed': 'Send message request failed',\n 'Sending...': 'Sending...',\n 'Slow Mode ON': 'Slow Mode ON',\n 'Start of a new thread': 'Start of a new thread',\n 'This message was deleted...': 'This message was deleted...',\n Thread: 'Thread reply',\n 'Type your message': 'Type your message',\n Unmute: 'Unmute',\n Unpin: 'Unpin',\n 'Wait until all attachments have uploaded':\n 'Wait until all attachments have uploaded',\n 'You have no channels currently': 'You have no channels currently',\n \"You've reached the maximum number of files\":\n \"You've reached the maximum number of files\",\n live: 'live',\n 'this content could not be displayed':\n 'this content could not be displayed',\n '{{ commaSeparatedUsers }} and {{ moreCount }} more':\n '{{ commaSeparatedUsers }} and {{ moreCount }} more',\n '{{ commaSeparatedUsers }}, and {{ lastUser }}':\n '{{ commaSeparatedUsers }}, and {{ lastUser }}',\n '{{ firstUser }} and {{ secondUser }}':\n '{{ firstUser }} and {{ secondUser }}',\n '{{ imageCount }} more': '{{ imageCount }} more',\n '{{ memberCount }} members': '{{ memberCount }} members',\n '{{ replyCount }} replies': '{{ replyCount }} replies',\n '{{ user }} has been muted': '{{ user }} has been muted',\n '{{ user }} has been unmuted': '{{ user }} has been unmuted',\n '{{ watcherCount }} online': '{{ watcherCount }} online',\n '🏙 Attachment...': '🏙 Attachment...',\n 'Connection error': 'Connection error',\n 'Load more': 'Load more',\n failed: 'failed',\n retry: 'retry',\n test: 'success',\n 'Sending links is not allowed in this conversation':\n 'Sending links is not allowed in this conversation',\n \"You can't send messages in this channel\":\n \"You can't send messages in this channel\",\n \"You can't send thread replies in this channel\":\n \"You can't send thread replies in this channel\",\n 'Message not found': 'Message not found',\n 'No chats here yet…': 'No chats here yet…',\n 'user is typing': '{{ user }} is typing',\n 'users are typing': '{{ users }} are typing',\n 'Error loading channels': 'Error loading channels',\n 'See original (automatically translated)':\n 'See original (automatically translated)',\n 'See translation': 'See translation',\n 'Mark as unread': 'Mark as unread',\n 'Error marking message as unread': 'Error marking message as unread',\n 'Error, only the first {{count}} message can be marked as unread':\n 'Error, only the first {{count}} message can be marked as unread',\n 'Unread messages': 'Unread messages',\n '{{count}} unread messages': '{{count}} unread messages',\n '{{count}} unread message': '{{count}} unread message',\n 'This message did not meet our content guidelines':\n 'This message did not meet our content guidelines',\n 'Send Anyway': 'Send Anyway',\n Edited: 'Edited',\n 'Error playing audio': 'Error playing audio',\n 'Copy text': 'Copy text',\n 'Please grant permission to use microhpone':\n 'Please grant permission to use microhpone',\n 'Error starting recording': 'Error starting recording',\n 'An error has occurred during recording':\n 'An error has occurred during recording',\n 'Media recording not supported': 'Media recording not supported',\n \"You can't uplod more than {{max}} attachments\":\n \"You can't uplod more than {{max}} attachments\",\n 'You currently have {{count}} attachments, the maximum is {{max}}':\n 'You currently have {{count}} attachments, the maximum is {{max}}',\n 'and others': 'and others',\n 'Message was blocked by moderation policies':\n 'Message was blocked by moderation policies',\n 'Vote ended': 'Vote ended',\n 'Select one': 'Select one',\n 'Select up to {{count}}': 'Select up to {{count}}',\n 'Select one or more': 'Select one or more',\n 'See all options ({{count}})': 'See all options ({{count}})',\n 'Suggest an option': 'Suggest an option',\n 'Add a comment': 'Add a comment',\n 'Update your comment': 'Update your comment',\n 'View {{ count }} comments': 'View {{ count }} comments',\n 'View {{ count }} comment': 'View {{ count }} comment',\n 'View results': 'View results',\n 'End vote': 'End vote',\n 'After a poll is closed, no more votes can be cast':\n 'After a poll is closed, no more votes can be cast',\n 'Failed to end vote': 'Failed to end vote',\n 'Failed to cast vote': 'Failed to cast vote',\n Anonymous: 'Anonymous',\n '{{ count }} votes': '{{ count }} votes',\n 'Show all': 'Show all',\n 'Poll results': 'Poll results',\n 'Error loading votes': 'Error loading votes',\n 'Poll comments': 'Poll comments',\n 'Error loading answers': 'Error loading answers',\n Comment: 'Comment',\n 'Failed to add comment': 'Failed to add comment',\n 'Failed to add option ({{ message }})':\n 'Failed to add option ({{ message }})',\n 'Option already exists': 'Option already exists',\n 'You have reached the maximum number of votes allowed':\n 'You have reached the maximum number of votes allowed',\n 'Create poll': 'Create poll',\n Create: 'Create',\n Question: 'Question',\n 'Ask a question': 'Ask a question',\n 'Question is required': 'Question is required',\n Options: 'Options',\n 'Add an option': 'Add an option',\n 'Multiple answers': 'Multiple answers',\n 'Maximum number of votes': 'Maximum number of votes',\n 'Provide a value between {{ min }} and {{ max }}':\n 'Provide a value between {{ min }} and {{ max }}',\n 'Anonymous poll': 'Anonymous poll',\n 'Allow option suggestions': 'Allow option suggestions',\n 'Allow comments': 'Allow comments',\n 'Failed to create poll': 'Failed to create poll',\n 'Provide at least one option': 'Provide at least one option',\n 'Poll options': 'Poll options',\n },\n};\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { en } from '../assets/i18n/en';\n\n/**\n * The `StreamI18nService` can be used to customize the labels of the chat UI. Our [translation guide](/chat/docs/sdk/angular/concepts/translation/) covers this topic in detail.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class StreamI18nService {\n constructor(private translateService: TranslateService) {}\n\n /**\n * Registers the translation to the [ngx-translate](https://github.com/ngx-translate/core) TranslateService.\n * @param lang The language key to register the translation to\n * @param overrides An object which keys are translation keys, and the values are custom translations\n */\n setTranslation(lang = 'en', overrides?: { [key: string]: string }) {\n const translateService = this.translateService as TranslateService & {\n getFallbackLang?: () => string;\n setDefaultLang?: (lang: string) => void;\n };\n\n const defaultLang =\n 'getFallbackLang' in translateService\n ? translateService.getFallbackLang?.()\n : translateService.defaultLang;\n if (!defaultLang) {\n if (typeof translateService.setDefaultLang !== 'undefined') {\n translateService.setDefaultLang(lang);\n } else {\n translateService.defaultLang = lang;\n }\n }\n this.translateService.setTranslation(\n lang,\n { streamChat: { ...en.streamChat, ...overrides } },\n true\n );\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { Channel, User } from 'stream-chat';\nimport { ChatClientService } from '../chat-client.service';\nimport { AvatarLocation, AvatarType } from '../types';\n\n/**\n * The `Avatar` component displays the provided image, with fallback to the first letter of the optional name input.\n */\n@Component({\n selector: 'stream-avatar',\n templateUrl: './avatar.component.html',\n styleUrls: ['./avatar.component.scss'],\n})\nexport class AvatarComponent\n implements OnChanges, OnInit, OnChanges, AfterViewInit, OnDestroy\n{\n /**\n * An optional name of the image, used for fallback image or image title (if `imageUrl` is provided)\n */\n @Input() name: string | undefined;\n /**\n * The URL of the image to be displayed. If the image can't be displayed the first letter of the name input is displayed.\n */\n @Input() imageUrl: string | undefined;\n /**\n * The location the avatar will be displayed in\n */\n @Input() location: AvatarLocation | undefined;\n /**\n * The channel the avatar belongs to (if avatar of a channel is displayed)\n */\n @Input() channel?: Channel;\n /**\n * The user the avatar belongs to (if avatar of a user is displayed)\n */\n @Input() user?: User;\n /**\n * The type of the avatar: channel if channel avatar is displayed, user if user avatar is displayed\n */\n @Input() type: AvatarType | undefined;\n /**\n * If a channel avatar is displayed, and if the channel has exactly two members a green dot is displayed if the other member is online. Set this flag to `false` to turn off this behavior.\n */\n @Input() showOnlineIndicator = true;\n /**\n * If channel/user image isn't provided the initials of the name of the channel/user is shown instead, you can choose how the initals should be computed\n */\n @Input() initialsType:\n | 'first-letter-of-first-word'\n | 'first-letter-of-each-word' = 'first-letter-of-first-word';\n isError = false;\n isOnline = false;\n private isOnlineSubscription?: Subscription;\n initials: string = '';\n fallbackChannelImage: string | undefined;\n private userId?: string;\n private isViewInited = false;\n private subscriptions: Subscription[] = [];\n\n constructor(\n private chatClientService: ChatClientService,\n private ngZone: NgZone,\n private cdRef: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.chatClientService.user$.subscribe((u) => {\n if (u?.id !== this.userId) {\n this.userId = u?.id;\n if (this.type || this.channel || this.name) {\n this.setInitials();\n this.setFallbackChannelImage();\n this.updateIsOnlineSubscription();\n }\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n })\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['channel']) {\n this.updateIsOnlineSubscription();\n }\n if (changes.type || changes.name || changes.channel) {\n this.setInitials();\n }\n\n if (changes.type || changes.channel) {\n this.setFallbackChannelImage();\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n private setFallbackChannelImage() {\n if (this.type !== 'channel') {\n this.fallbackChannelImage = undefined;\n } else {\n const otherMember = this.getOtherMemberIfOneToOneChannel();\n if (otherMember) {\n this.fallbackChannelImage = otherMember.image;\n } else {\n this.fallbackChannelImage = undefined;\n }\n }\n }\n\n private setInitials() {\n let result: string = '';\n if (this.type === 'user') {\n result = this.name?.toString() || '';\n } else if (this.type === 'channel') {\n if (this.channel?.data?.name) {\n result = this.channel?.data?.name;\n } else {\n const otherMember = this.getOtherMemberIfOneToOneChannel();\n if (otherMember) {\n result = otherMember.name || otherMember.id || '';\n } else {\n result = '#';\n }\n }\n }\n\n const words = result.split(' ');\n let initials: string;\n if (this.initialsType === 'first-letter-of-each-word') {\n initials = words.map((w) => w.charAt(0) || '').join('');\n } else {\n initials = words[0].charAt(0) || '';\n }\n this.initials = initials;\n }\n\n private updateIsOnlineSubscription() {\n if (this.channel) {\n const otherMember = this.getOtherMemberIfOneToOneChannel();\n if (otherMember) {\n this.isOnline = otherMember.online || false;\n this.isOnlineSubscription = this.chatClientService.events$\n .pipe(filter((e) => e.eventType === 'user.presence.changed'))\n .subscribe((event) => {\n if (event.event.user?.id === otherMember.id) {\n this.ngZone.run(() => {\n this.isOnline = event.event.user?.online || false;\n });\n }\n });\n } else {\n this.isOnline = false;\n this.isOnlineSubscription?.unsubscribe();\n }\n } else {\n this.isOnline = false;\n this.isOnlineSubscription?.unsubscribe();\n }\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n }\n\n private getOtherMemberIfOneToOneChannel() {\n const otherMembers = Object.values(\n this.channel?.state?.members || {}\n ).filter((m) => m.user_id !== this.userId);\n if (otherMembers.length === 1) {\n return otherMembers[0].user;\n } else {\n return undefined;\n }\n }\n}\n","<div\n class=\"str-chat__avatar str-chat-angular__avatar str-chat__avatar--circle stream-chat__avatar--{{\n location\n }} stream-chat__avatar--{{\n initialsType === 'first-letter-of-first-word'\n ? 'one-letter'\n : 'multiple-letters'\n }}\"\n title=\"{{ name }}\"\n>\n <img\n *ngIf=\"(imageUrl || fallbackChannelImage) && !isError; else fallback\"\n class=\"str-chat__avatar-image\"\n data-testid=\"avatar-img\"\n fetchpriority=\"high\"\n src=\"{{ imageUrl || fallbackChannelImage }}\"\n alt=\"{{ initials }}\"\n (error)=\"isError = true\"\n />\n <ng-template #fallback>\n <div data-testid=\"fallback-img\" class=\"str-chat__avatar-fallback\">\n {{ initials }}\n </div>\n </ng-template>\n <div\n *ngIf=\"isOnline && showOnlineIndicator\"\n data-testid=\"online-indicator\"\n class=\"str-chat__avatar--online-indicator\"\n ></div>\n</div>\n","import { Injectable, TemplateRef } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport {\n AttachmentContext,\n AttachmentListContext,\n AttachmentPreviewListContext,\n AvatarContext,\n ChannelActionsContext,\n ChannelHeaderInfoContext,\n ChannelPreviewContext,\n ChannelPreviewInfoContext,\n CommandAutocompleteListItemContext,\n CustomAttachmentListContext,\n CustomAttachmentPreviewListContext,\n CustomAttachmentUploadContext,\n CustomMetadataContext,\n DateSeparatorContext,\n DeliveredStatusContext,\n EmojiPickerContext,\n GalleryAttachmentContext,\n IconContext,\n MentionAutcompleteListItemContext,\n MentionTemplateContext,\n MessageActionBoxItemContext,\n MessageActionsBoxContext,\n MessageBlockedContext,\n MessageContext,\n MessageReactionsContext,\n MessageReactionsSelectorContext,\n MessageTextContext,\n ModalContext,\n NotificationContext,\n ReadStatusContext,\n SendingStatusContext,\n SystemMessageContext,\n ThreadHeaderContext,\n ThreadReplyButtonContext,\n TypingIndicatorContext,\n UnreadMessagesIndicatorContext,\n UnreadMessagesNotificationContext,\n} from './types';\n\n/**\n * A central location for registering your custom templates to override parts of the chat application.\n *\n * For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).\n *\n * You can find the type definitions of the context that is provided for each template [on GitHub](https://github.com/GetStream/stream-chat-angular/blob/master/projects/stream-chat-angular/src/lib/types.ts)\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class CustomTemplatesService {\n /**\n * The autocomplete list item template for mentioning users (used in the [`AutocompleteTextareaComponent`](/chat/docs/sdk/angular/components/AutocompleteTextareaComponent/))\n */\n mentionAutocompleteItemTemplate$ = new BehaviorSubject<\n TemplateRef<MentionAutcompleteListItemContext> | undefined\n >(undefined);\n /**\n * The autocomplete list item template for commands (used in the [`AutocompleteTextareaComponent`](/chat/docs/sdk/angular/components/AutocompleteTextareaComponent/))\n */\n commandAutocompleteItemTemplate$ = new BehaviorSubject<\n TemplateRef<CommandAutocompleteListItemContext> | undefined\n >(undefined);\n /**\n * Template used to display an item in the [channel list](/chat/docs/sdk/angular/components/ChannelListComponent/) (instead of the default [channal list item](/chat/docs/sdk/angular/components/ChannelPreviewComponent/))\n *\n */\n channelPreviewTemplate$ = new BehaviorSubject<\n TemplateRef<ChannelPreviewContext> | undefined\n >(undefined);\n /**\n * The template used for displaying a [mention inside a message](/chat/docs/sdk/angular/code-examples/mention-actions/)\n *\n */\n mentionTemplate$ = new BehaviorSubject<\n TemplateRef<MentionTemplateContext> | undefined\n >(undefined);\n /**\n * The template for [emoji picker](/chat/docs/sdk/angular/code-examples/emoji-picker)\n *\n */\n emojiPickerTemplate$ = new BehaviorSubject<\n TemplateRef<EmojiPickerContext> | undefined\n >(undefined);\n /**\n * The typing indicator template used in the [message list](/chat/docs/sdk/angular/components/MessageListComponent/)\n *\n */\n typingIndicatorTemplate$ = new BehaviorSubject<\n TemplateRef<TypingIndicatorContext> | undefined\n >(undefined);\n /**\n * The template used to display a message in the [message list](/chat/docs/sdk/angular/components/MessageListComponent/) (instead of the [default message component](/chat/docs/sdk/angular/components/MessageComponent/))\n *\n */\n messageTemplate$ = new BehaviorSubject<\n TemplateRef<MessageContext> | undefined\n >(undefined);\n /**\n * The template for channel actions displayed in the [channel header](/chat/docs/sdk/angular/components/ChannelHeaderComponent/) (by default no channel action is displayed)\n *\n */\n channelActionsTemplate$ = new BehaviorSubject<\n TemplateRef<ChannelActionsContext> | undefined\n >(undefined);\n /**\n * The template used to display attachments of a [message](/chat/docs/sdk/angular/components/MessageComponent/) (instead of the [default attachment list](/chat/docs/sdk/angular/components/AttachmentListComponent/))\n *\n */\n attachmentListTemplate$ = new BehaviorSubject<\n TemplateRef<AttachmentListContext> | undefined\n >(undefined);\n /**\n * The template used to display attachments in the [message input](/chat/docs/sdk/angular/components/MessageInputComponent) component (instead of the [default attachment preview](/chat/docs/sdk/angular/components/AttachmentPreviewListComponent))\n *\n */\n attachmentPreviewListTemplate$ = new BehaviorSubject<\n TemplateRef<AttachmentPreviewListContext> | undefined\n >(undefined);\n /**\n * The template used to display avatars for channels and users (instead of the [default avatar](/chat/docs/sdk/angular/components/AvatarComponent/))\n *\n */\n avatarTemplate$ = new BehaviorSubject<TemplateRef<AvatarContext> | undefined>(\n undefined\n );\n /**\n * Template for displaying icons (instead of the [default icon component](/chat/docs/sdk/angular/components/IconComponent/))\n *\n */\n iconTemplate$ = new BehaviorSubject<TemplateRef<IconContext> | undefined>(\n undefined\n );\n /**\n * Template for displaying the loading indicator (instead of the [default loading indicator](/chat/docs/sdk/angular/components/LoadingIndicatorComponent/))\n *\n */\n loadingIndicatorTemplate$ = new BehaviorSubject<\n TemplateRef<void> | undefined\n >(undefined);\n /**\n * Template for displaying the message actions box (instead of the [default message actions box](/chat/docs/sdk/angular/components/MessageActionsBoxComponent/))\n *\n */\n messageActionsBoxTemplate$ = new BehaviorSubject<\n TemplateRef<MessageActionsBoxContext> | undefined\n >(undefined);\n /**\n * The template used for displaying an item in the [message actions box](/chat/docs/sdk/angular/components/MessageActionsBoxComponent/)\n *\n */\n messageActionsBoxItemTemplate$ = new BehaviorSubject<\n TemplateRef<MessageActionBoxItemContext> | undefined\n >(undefined);\n /**\n * The template used to display the reactions of a [message](/chat/docs/sdk/angular/components/MessageComponent/), and the selector to add a reaction to a message (instead of the [default message reactions component](/chat/docs/sdk/angular/components/MessageReactionsComponent/))\n *\n */\n messageReactionsTemplate$ = new BehaviorSubject<\n TemplateRef<MessageReactionsContext> | undefined\n >(undefined);\n /**\n * The template used to display the reactions of a [message](/chat/docs/sdk/angular/components/MessageComponent/), and the selector to add a reaction to a message (instead of the [default message reactions component](/chat/docs/sdk/angular/components/MessageReactionsComponent/))\n *\n */\n messageReactionsSelectorTemplate$ = new BehaviorSubject<\n TemplateRef<MessageReactionsSelectorContext> | undefined\n >(undefined);\n /**\n * The template used to display a modal window (instead of the [default modal](/chat/docs/sdk/angular/components/ModalComponent/))\n *\n */\n modalTemplate$ = new BehaviorSubject<TemplateRef<ModalContext> | undefined>(\n undefined\n );\n /**\n * The template used to override the [default notification component](/chat/docs/sdk/angular/components/NotificationComponent/)\n *\n */\n notificationTemplate$ = new BehaviorSubject<\n TemplateRef<NotificationContext> | undefined\n >(undefined);\n /**\n * The template used for header of a [thread](/chat/docs/sdk/angular/components/ThreadComponent/)\n *\n */\n threadHeaderTemplate$ = new BehaviorSubject<\n TemplateRef<ThreadHeaderContext> | undefined\n >(undefined);\n /**\n * The template used for displaying the delivered state of the message inside the [message component](/chat/docs/sdk/angular/components/MessageComponent/)\n *\n * Displayed for the last message sent by the current user, if the message isn't yet read by anyone\n *\n */\n deliveredStatusTemplate$ = new BehaviorSubject<\n TemplateRef<DeliveredStatusContext> | undefined\n >(undefined);\n /**\n * The template used for displaying the sending state of the message inside the [message component](/chat/docs/sdk/angular/components/MessageComponent/)\n *\n * Displayed for the last message sent by the current user, if the message is currently being sent\n *\n */\n sendingStatusTemplate$ = new BehaviorSubject<\n TemplateRef<SendingStatusContext> | undefined\n >(undefined);\n /**\n * The template used for displaying the sent state of the message inside the [message component](/chat/docs/sdk/angular/components/MessageComponent/)\n *\n * Displayed for the last message sent by the current user, if the message is read at least by one user\n *\n */\n readStatusTemplate$ = new BehaviorSubject<\n TemplateRef<ReadStatusContext> | undefined\n >(undefined);\n /**\n * Template to display custom metadata inside [message component](/chat/docs/sdk/angular/components/MessageComponent/)\n *\n */\n customMessageMetadataTemplate$ = new BehaviorSubject<\n TemplateRef<CustomMetadataContext> | undefined\n >(undefined);\n /**\n * The template used to display additional information about a channel under the channel name inside the [channel header component](/chat/docs/sdk/angular/components/ChannelHeaderComponent/)\n *\n */\n channelHeaderInfoTemplate$ = new BehaviorSubject<\n TemplateRef<ChannelHeaderInfoContext> | undefined\n >(undefined);\n /**\n * The template used for displaying file upload/attachment selector inside the [message input](/chat/docs/sdk/angular/components/MessageInputComponent/)\n *\n */\n customAttachmentUploadTemplate$ = new BehaviorSubject<\n TemplateRef<CustomAttachmentUploadContext> | undefined\n >(undefined);\n /**\n * The template that can be used to override how a single image attachment is displayed inside the [attachment list](/chat/docs/sdk/angular/components/AttachmentListComponent/)\n */\n imageAttachmentTemplate$ = new BehaviorSubject<\n TemplateRef<AttachmentContext> | undefined\n >(undefined);\n /**\n * The template that can be used to override how a voice recording attachment is displayed inside the [attachment list](/chat/docs/sdk/angular/components/AttachmentListComponent/), by default the [voice recording component](/chat/docs/sdk/angular/components/VoiceRecordingComponent/) is used\n */\n voiceRecordingAttachmentTemplate$ = new BehaviorSubject<\n TemplateRef<AttachmentContext> | undefined\n >(undefined);\n /**\n * The template that can be used to override how a video attachment is displayed inside the [attachment list](/chat/docs/sdk/angular/components/AttachmentListComponent/)\n */\n videoAttachmentTemplate$ = new BehaviorSubject<\n TemplateRef<AttachmentContext> | undefined\n >(undefined);\n /**\n * The template that can be used to override how image gallery is displayed inside the [attachment list](/chat/docs/sdk/angular/components/AttachmentListComponent/)\n */\n galleryAttachmentTemplate$ = new BehaviorSubject<\n TemplateRef<GalleryAttachmentContext> | undefined\n >(undefined);\n /**\n * The template that can be used to override how a file attachment is displayed inside the [attachment list](/chat/docs/sdk/angular/components/AttachmentListComponent/)\n */\n fileAttachmentTemplate$ = new BehaviorSubject<\n TemplateRef<AttachmentContext> | undefined\n >(undefined);\n /**\n * The template that can be used to override how a card attachment is displayed inside the [attachment list](/chat/docs/sdk/angular/components/AttachmentListComponent/)\n */\n cardAttachmentTemplate$ = new BehaviorSubject<\n TemplateRef<AttachmentContext> | undefined\n >(undefined);\n /**\n * The template that can be used to override how attachment actions are displayed inside the [attachment list](/chat/docs/sdk/angular/components/AttachmentListComponent/)\n */\n attachmentActionsTemplate$ = new BehaviorSubject<\n TemplateRef<AttachmentContext> | undefined\n >(undefined);\n /**\n * The template used to display [system messages](/chat/docs/javascript/silent_messages/) indise the [message component](/chat/docs/sdk/angular/components/MessageComponent/)\n */\n systemMessageTemplate$ = new BehaviorSubject<\n TemplateRef<SystemMessageContext> | undefined\n >(undefined);\n /**\n * The template used to display the date separator inside the [message list](/chat/docs/sdk/angular/components/MessageListComponent/)\n */\n dateSeparatorTemplate$ = new BehaviorSubject<\n TemplateRef<DateSeparatorContext> | undefined\n >(undefined);\n /**\n * The template used to display unread messages indicator inside the [message list](/chat/docs/sdk/angular/components/MessageListComponent/) when the channel is opened\n *\n * This UI element is used to separate unread messages from read messages\n */\n newMessagesIndicatorTemplate$ = new BehaviorSubject<\n TemplateRef<UnreadMessagesIndicatorContext> | undefined\n >(undefined);\n /**\n * The template used to display unread messages notification inside the [message list](/chat/docs/sdk/angular/components/MessageListComponent/) when the channel is opened\n *\n * Users can use this notification to jump to the first unread message when it's clicked\n */\n newMessagesNotificationTemplate$ = new BehaviorSubject<\n TemplateRef<UnreadMessagesNotificationContext> | undefined\n >(undefined);\n /**\n * The template to show if the main message list is empty\n */\n emptyMainMessageListPlaceholder$ = new BehaviorSubject<\n TemplateRef<void> | undefined\n >(undefined);\n /**\n * The template to show if the thread message list is empty\n */\n emptyThreadMessageListPlaceholder$ = new BehaviorSubject<\n TemplateRef<void> | undefined\n >(undefined);\n /**\n * The template used to display the [message bounce prompt](/chat/docs/sdk/angular/components/MessageBouncePromptComponent/)\n */\n messageBouncePromptTemplate$ = new BehaviorSubject<\n TemplateRef<void> | undefined\n >(undefined);\n /**\n * Template used to display the channel information inside the [channel list item](/chat/docs/sdk/angular/components/ChannelPreviewComponent/)\n *\n */\n channelPreviewInfoTemplate$ = new BehaviorSubject<\n TemplateRef<ChannelPreviewInfoContext> | undefined\n >(undefined);\n /**\n * The template used to display custom attachment previews in the [message input component](/chat/docs/sdk/angular/components/MessageInputComponent/)\n */\n customAttachmentPreviewListTemplate$ = new BehaviorSubject<\n TemplateRef<CustomAttachmentPreviewListContext> | undefined\n >(undefined);\n /**\n * The template used to display custom attachments in the [message component](/chat/docs/sdk/angular/components/MessageComponent/)\n */\n customAttachmentListTemplate$ = new BehaviorSubject<\n TemplateRef<CustomAttachmentListContext> | undefined\n >(undefined);\n /**\n * The template used to display the number of thread replies inside the [message component](/chat/docs/sdk/angular/components/MessageComponent/)\n */\n threadLinkButton$ = new BehaviorSubject<\n TemplateRef<ThreadReplyButtonContext> | undefined\n >(undefined);\n /**\n * Template to display custom metadata inside the message bubble of the [message component](/chat/docs/sdk/angular/components/MessageComponent/)\n *\n * To properly position your template you should override the `grid-template-areas` of the `.str-chat__message-inner` selector\n */\n customMessageMetadataInsideBubbleTemplate$ = new BehaviorSubject<\n TemplateRef<CustomMetadataContext> | undefined\n >(undefined);\n /**\n * Template to display the text content inside the [message component](/chat/docs/sdk/angular/components/MessageComponent/). The default component is [stream-message-text](/chat/docs/sdk/angular/components/MessageTextComponent/)\n */\n messageTextTemplate$ = new BehaviorSubject<\n TemplateRef<MessageTextContext> | undefined\n >(undefined);\n\n /**\n * The template used to display blocked messages that have been removed by moderation policies instead of the default [message blocked component](/chat/docs/sdk/angular/components/MessageBlockedComponent/)\n *\n * The template has no effect if you're using a custom `messageTemplate$`\n */\n messageBlockedTemplate$ = new BehaviorSubject<\n TemplateRef<MessageBlockedContext> | undefined\n >(undefined);\n /**\n * Template to display polls inside [message component](/chat/docs/sdk/angular/components/MessageComponent/). There is no default template, but the `PollsModule` contains default components.\n */\n pollTemplate$ = new BehaviorSubject<\n TemplateRef<{ pollId: string; messageId: string }> | undefined\n >(undefined);\n /**\n * Template to display poll composer inside [message input component](/chat/docs/sdk/angular/components/MessageInputComponent/). There is no default template, but the `PollsModule` contains default components.\n */\n pollComposerTemplate$ = new BehaviorSubject<\n | TemplateRef<{ pollCompose: (pollId: string) => void; cancel: () => void }>\n | undefined\n >(undefined);\n\n constructor() {}\n}\n","import { Component, Input, OnChanges } from '@angular/core';\nimport { Channel, User } from 'stream-chat';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { AvatarContext, AvatarLocation, AvatarType } from '../types';\n\n/**\n * The `AvatarPlaceholder` component displays the [default avatar](/chat/docs/sdk/angular/components/AvatarComponent/) unless a [custom template](/chat/docs/sdk/angular/services/CustomTemplatesService/) is provided. This component is used by the SDK internally, you likely won't need to use it.\n */\n@Component({\n selector: 'stream-avatar-placeholder',\n templateUrl: './avatar-placeholder.component.html',\n styles: [],\n})\nexport class AvatarPlaceholderComponent implements OnChanges {\n /**\n * An optional name of the image, used for fallback image or image title (if `imageUrl` is provided)\n */\n @Input() name: string | undefined;\n /**\n * The URL of the image to be displayed. If the image can't be displayed the first letter of the name input is displayed.\n */\n @Input() imageUrl: string | undefined;\n /**\n * The location the avatar will be displayed in\n */\n @Input() location: AvatarLocation | undefined;\n /**\n * The channel the avatar belongs to (if avatar of a channel is displayed)\n */\n @Input() channel?: Channel;\n /**\n * The user the avatar belongs to (if avatar of a user is displayed)\n */\n @Input() user?: User;\n /**\n * The type of the avatar: channel if channel avatar is displayed, user if user avatar is displayed\n */\n @Input() type: AvatarType | undefined;\n /**\n * If channel/user image isn't provided the initials of the name of the channel/user is shown instead, you can choose how the initals should be computed\n */\n @Input() initialsType:\n | 'first-letter-of-first-word'\n | 'first-letter-of-each-word' = 'first-letter-of-first-word';\n /**\n * If a channel avatar is displayed, and if the channel has exactly two members a green dot is displayed if the other member is online. Set this flag to `false` to turn off this behavior.\n */\n @Input() showOnlineIndicator = true;\n context: AvatarContext = {\n name: undefined,\n imageUrl: undefined,\n location: undefined,\n channel: undefined,\n user: undefined,\n type: undefined,\n initialsType: undefined,\n showOnlineIndicator: undefined,\n };\n constructor(public customTemplatesService: CustomTemplatesService) {}\n\n ngOnChanges(): void {\n this.context = {\n name: this.name,\n imageUrl: this.imageUrl,\n location: this.location,\n type: this.type,\n user: this.user,\n channel: this.channel,\n initialsType: this.initialsType,\n showOnlineIndicator: this.showOnlineIndicator,\n };\n }\n}\n","<ng-template\n #defaultAvatar\n let-name=\"name\"\n let-imageUrl=\"imageUrl\"\n let-type=\"type\"\n let-channel=\"channel\"\n let-user=\"user\"\n let-location=\"location\"\n let-initialsType=\"initialsType\"\n let-showOnlineIndicator=\"showOnlineIndicator\"\n>\n <stream-avatar\n [name]=\"name\"\n [imageUrl]=\"imageUrl\"\n [type]=\"type\"\n [channel]=\"channel\"\n [user]=\"user\"\n [location]=\"location\"\n [initialsType]=\"initialsType\"\n [showOnlineIndicator]=\"showOnlineIndicator\"\n ></stream-avatar>\n</ng-template>\n<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.avatarTemplate$ | async) || defaultAvatar;\n context: context\n \"\n></ng-container>\n","import { Component, Input } from '@angular/core';\n\nexport type Icon =\n | 'action'\n | 'delivered'\n | 'read'\n | 'reaction'\n | 'send'\n | 'retry'\n | 'close'\n | 'audio-file'\n | 'reply-in-thread'\n | 'arrow-left'\n | 'arrow-up'\n | 'arrow-down'\n | 'arrow-right'\n | 'chat-bubble'\n | 'attach'\n | 'unspecified-filetype'\n | 'download'\n | 'error'\n | 'play'\n | 'pause'\n | 'mic'\n | 'bin'\n | 'poll';\n\n/**\n * The `Icon` component can be used to display different icons (i. e. message delivered icon).\n */\n@Component({\n selector: 'stream-icon',\n templateUrl: './icon.component.html',\n styles: [],\n})\nexport class IconComponent {\n /**\n * The icon to display, the list of [supported icons](https://github.com/GetStream/stream-chat-angular/tree/master/projects/stream-chat-angular/src/lib/icon/icon.component.ts) can be found on GitHub.\n */\n @Input() icon: Icon | undefined;\n constructor() {}\n}\n","<div class=\"str-chat__icon str-chat__icon--{{ icon }}\"></div>\n","import { Component, Input, OnChanges } from '@angular/core';\nimport { Icon } from '../icon.component';\nimport { IconContext } from '../../types';\nimport { CustomTemplatesService } from '../../custom-templates.service';\n\n/**\n * The `IconPlaceholder` component displays the [default icons](/chat/docs/sdk/angular/components/IconComponent/) unless a [custom template](/chat/docs/sdk/angular/services/CustomTemplatesService/) is provided. This component is used by the SDK internally, you likely won't need to use it.\n */\n@Component({\n selector: 'stream-icon-placeholder',\n templateUrl: './icon-placeholder.component.html',\n styles: [],\n})\nexport class IconPlaceholderComponent implements OnChanges {\n /**\n * The icon to display, the list of [supported icons](https://github.com/GetStream/stream-chat-angular/tree/master/projects/stream-chat-angular/src/lib/icon/icon.component.ts) can be found on GitHub.\n */\n @Input() icon: Icon | undefined;\n iconContext: IconContext = { icon: undefined };\n\n constructor(public customTemplatesService: CustomTemplatesService) {}\n\n ngOnChanges(): void {\n this.iconContext = {\n icon: this.icon,\n };\n }\n}\n","<ng-template #defaultIcon let-icon=\"icon\">\n <stream-icon [icon]=\"icon\"></stream-icon>\n</ng-template>\n<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.iconTemplate$ | async) || defaultIcon;\n context: iconContext\n \"\n></ng-container>\n","import { Component } from '@angular/core';\n\n/**\n * The `LoadingIndicator` component displays a spinner to indicate that an action is in progress.\n */\n@Component({\n selector: 'stream-loading-indicator',\n templateUrl: './loading-indicator.component.html',\n styles: [],\n})\nexport class LoadingIndicatorComponent {\n constructor() {}\n}\n","<div class=\"str-chat__loading-indicator\">\n <svg\n viewBox=\"0 0 30 30\"\n data-testid=\"loading-indicator\"\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"30\"\n width=\"30\"\n >\n <defs>\n <linearGradient\n x1=\"50%\"\n x2=\"50%\"\n y1=\"0%\"\n y2=\"100%\"\n id=\"stream-chat-loading-circle\"\n >\n <stop offset=\"0%\" stop-color=\"#FFF\" stop-opacity=\"0\" />\n <stop data-testid=\"stop-color\" offset=\"100%\" stop-opacity=\"1\" />\n </linearGradient>\n </defs>\n <path\n d=\"M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z\"\n fillRule=\"evenodd\"\n fill=\"url(#stream-chat-loading-circle)\"\n />\n </svg>\n</div>\n","import { Component } from '@angular/core';\nimport { CustomTemplatesService } from '../../custom-templates.service';\n\n/**\n * The `LoadingInficatorPlaceholder` component displays the [default loading indicator](/chat/docs/sdk/angular/components/LoadingIndicatorComponent/) unless a [custom template](/chat/docs/sdk/angular/services/CustomTemplatesService/) is provided. This component is used by the SDK internally, you likely won't need to use it.\n */\n@Component({\n selector: 'stream-loading-indicator-placeholder',\n templateUrl: './loading-indicator-placeholder.component.html',\n styles: [],\n})\nexport class LoadingIndicatorPlaceholderComponent {\n constructor(public customTemplatesService: CustomTemplatesService) {}\n}\n","<ng-template #defaultLoadingIndicator>\n <stream-loading-indicator></stream-loading-indicator>\n</ng-template>\n<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.loadingIndicatorTemplate$ | async) ||\n defaultLoadingIndicator\n \"\n></ng-container>\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, combineLatest } from 'rxjs';\nimport {\n CustomMessageActionItem,\n MessageActionHandlerExtraParams,\n MessageActionItem,\n MessageActionsClickDetails,\n MessageReactionActionItem,\n StreamMessage,\n} from './types';\nimport { ChatClientService } from './chat-client.service';\nimport { NotificationService } from './notification.service';\nimport { ChannelService } from './channel.service';\n\n/**\n * The message actions service provides customization options for the [message actions](/chat/docs/sdk/angular/components/MessageActionsBoxComponent)\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class MessageActionsService {\n /**\n * Default actions - these are the actions that are handled by the built-in component\n */\n readonly defaultActions: (MessageActionItem | MessageReactionActionItem)[] = [\n {\n actionName: 'react',\n isVisible: (enabledActions: string[]) => {\n return enabledActions.indexOf('send-reaction') !== -1;\n },\n },\n {\n actionName: 'mark-unread',\n actionLabelOrTranslationKey: 'streamChat.Mark as unread',\n actionHandler: (message: StreamMessage) => {\n void this.channelService.markMessageUnread(message.id);\n },\n isVisible: (\n enabledActions: string[],\n _: boolean,\n message: StreamMessage\n ) => enabledActions.indexOf('read-events') !== -1 && !message.parent_id,\n },\n {\n actionName: 'quote',\n actionLabelOrTranslationKey: 'streamChat.Reply',\n actionHandler: (message: StreamMessage) => {\n this.channelService.selectMessageToQuote(message);\n },\n isVisible: (enabledActions: string[]) =>\n enabledActions.indexOf('quote-message') !== -1,\n },\n {\n actionName: 'thread-reply',\n actionLabelOrTranslationKey: 'streamChat.Thread',\n actionHandler: (message: StreamMessage) => {\n void this.channelService.setAsActiveParentMessage(message);\n },\n isVisible: (\n enabledActions: string[],\n _: boolean,\n message: StreamMessage\n ) => enabledActions.indexOf('send-reply') !== -1 && !message.parent_id,\n },\n {\n actionName: 'pin',\n actionLabelOrTranslationKey: (message: StreamMessage) =>\n message.pinned ? 'streamChat.Unpin' : 'streamChat.Pin',\n actionHandler: (message: StreamMessage) => {\n message.pinned\n ? void this.channelService.unpinMessage(message)\n : void this.channelService.pinMessage(message);\n },\n isVisible: (enabledActions: string[]) =>\n enabledActions.indexOf('pin-message') !== -1,\n },\n {\n actionName: 'flag',\n actionLabelOrTranslationKey: 'streamChat.Flag',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n actionHandler: async (message: StreamMessage) => {\n try {\n await this.chatClientService.flagMessage(message.id);\n this.notificationService.addTemporaryNotification(\n 'streamChat.Message has been successfully flagged',\n 'success'\n );\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error adding flag'\n );\n }\n },\n isVisible: (enabledActions: string[], isMine: boolean) =>\n enabledActions.indexOf('flag-message') !== -1 && !isMine,\n },\n {\n actionName: 'edit',\n actionLabelOrTranslationKey: 'streamChat.Edit Message',\n actionHandler: (message: StreamMessage) => {\n this.messageToEdit$.next(message);\n },\n isVisible: (enabledActions: string[], isMine: boolean) =>\n (enabledActions.indexOf('update-own-message') !== -1 && isMine) ||\n enabledActions.indexOf('update-any-message') !== -1,\n },\n {\n actionName: 'delete',\n actionLabelOrTranslationKey: 'streamChat.Delete',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n actionHandler: async (message: StreamMessage) => {\n try {\n await this.channelService.deleteMessage(message);\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error deleting message'\n );\n }\n },\n isVisible: (enabledActions: string[], isMine: boolean) =>\n ((enabledActions.indexOf('delete') !== -1 ||\n enabledActions.indexOf('delete-own-message') !== -1) &&\n isMine) ||\n enabledActions.indexOf('delete-any') !== -1 ||\n enabledActions.indexOf('delete-any-message') !== -1,\n },\n {\n actionName: 'copy-message-text',\n actionLabelOrTranslationKey: 'streamChat.Copy text',\n isVisible: (_: string[], __: boolean, message: StreamMessage) => {\n const isClipboardSupported = navigator?.clipboard?.write !== undefined;\n if (!isClipboardSupported && !this.hasDisplayedClipboardWarning) {\n console.warn(\n `[Stream Chat] Copy action is disabled because clipboard API isn't available, please check security and browser requirements: https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/write#security_considerations`\n );\n this.hasDisplayedClipboardWarning = true;\n }\n return (\n !!message.text &&\n (message.type === 'regular' || message.type === 'reply') &&\n isClipboardSupported\n );\n },\n actionHandler: (\n message: StreamMessage,\n extraParams: MessageActionHandlerExtraParams\n ) => {\n const fallbackContent = message.text || '';\n // Android Chrome can only copy plain text: https://issues.chromium.org/issues/40851502\n void navigator.clipboard.write([\n new ClipboardItem({\n 'text/plain': new Blob(\n [\n extraParams.messageTextHtmlElement?.innerText ||\n fallbackContent,\n ],\n { type: 'text/plain' }\n ),\n 'text/html': new Blob(\n [\n extraParams.messageTextHtmlElement?.innerHTML ||\n fallbackContent,\n ],\n { type: 'text/html' }\n ),\n }),\n ]);\n },\n },\n ];\n /**\n * The built-in components will handle changes to this observable.\n */\n messageToEdit$ = new BehaviorSubject<StreamMessage | undefined>(undefined);\n /**\n * You can pass your own custom actions that will be displayed inside the built-in message actions component\n */\n customActions$ = new BehaviorSubject<CustomMessageActionItem[]>([]);\n /**\n * By default the [`MessageComponent`](/chat/docs/sdk/angular/components/MessageComponent/) will display the [`MessageActionsBoxComponent`](/chat/docs/sdk/angular/components/MessageActionsBoxComponent/). You can override that behavior by providing your own event handler.\n */\n customActionClickHandler?: (details: MessageActionsClickDetails) => void;\n /**\n * @internal\n */\n messageMenuOpenedFor$ = new BehaviorSubject<string | undefined>(undefined);\n /**\n * @internal\n */\n modalOpenedForMessage = new BehaviorSubject<string | undefined>(undefined);\n private hasDisplayedClipboardWarning = false;\n\n constructor(\n private chatClientService: ChatClientService,\n private notificationService: NotificationService,\n private channelService: ChannelService\n ) {\n combineLatest([\n this.messageToEdit$,\n this.channelService.activeChannel$,\n ]).subscribe(([messageToEdit, activeChannel]) => {\n if (\n messageToEdit &&\n (!activeChannel || activeChannel?.cid !== messageToEdit.cid)\n ) {\n this.messageToEdit$.next(undefined);\n }\n });\n combineLatest([\n this.messageToEdit$,\n this.channelService.activeParentMessageId$,\n ]).subscribe(([messageToEdit, parentMessageId]) => {\n if (\n messageToEdit &&\n messageToEdit.parent_id &&\n messageToEdit.parent_id !== parentMessageId\n ) {\n this.messageToEdit$.next(undefined);\n }\n });\n }\n\n /**\n * This method returns how many authorized actions are available to the given message\n * @param message\n * @param enabledActions\n * @returns the count\n */\n getAuthorizedMessageActionsCount(\n message: StreamMessage,\n enabledActions: string[]\n ) {\n const customActions = this.customActions$.getValue() || [];\n const allActions = [...this.defaultActions, ...customActions];\n const currentUserId = this.chatClientService.chatClient.user?.id;\n const isMine = message.user_id === currentUserId;\n\n return allActions.filter((item) =>\n item.isVisible(enabledActions, isMine, message)\n ).length;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { MessageReactionClickDetails, MessageReactionType } from './types';\nimport { BehaviorSubject } from 'rxjs';\nimport { ChatClientService } from './chat-client.service';\nimport { NotificationService } from './notification.service';\n\n/**\n * The `MessageReactionsService` provides customization options to message [reactions](/chat/docs/javascript/send_reaction/).\n *\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class MessageReactionsService {\n /**\n * The enabled [reactions](/chat/docs/javascript/send_reaction/) and the associated emoji\n *\n * You can provide any string as a reaction. The emoji can be provided as a string, if you want to use custom images for reactions you have to provide a [custom reactions UI](/chat/docs/sdk/angular/services/CustomTemplatesService/#messagereactionstemplate/)\n */\n reactions$ = new BehaviorSubject<{ [key in MessageReactionType]: string }>({\n haha: '😂',\n like: '👍',\n love: '❤️',\n sad: '😞',\n wow: '😮',\n });\n /**\n * By default the [`MessageReactionsComponent`](/chat/docs/sdk/angular/components/MessageReactionsComponent/) will display the reacting users when a reaction is clicked. You can override this with your own UI by providing a custom event handler.\n *\n * The event handler can retrieve all reactions of a message using the [`messageReactionsService.queryReactions()`](/chat/docs/sdk/angular/services/MessageReactionsService/#queryreactions)\n */\n customReactionClickHandler?: (details: MessageReactionClickDetails) => void;\n\n constructor(\n private chatClientService: ChatClientService,\n private notificationService: NotificationService\n ) {}\n\n /**\n * Sets the enabled reactions\n */\n set reactions(reactions: { [key in MessageReactionType]: string }) {\n this.reactions$.next(reactions);\n }\n\n /**\n * Get the currently enabled reactions\n */\n get reactions() {\n return this.reactions$.getValue();\n }\n\n /**\n * Query reactions of a specific message, more info in the [API documentation](/chat/docs/javascript/send_reaction/#query-reactions)\n * @param messageId\n * @param type\n * @param next\n * @returns the reactions and the cursor for the next/prev pages\n */\n async queryReactions(messageId: string, type: string, next?: string) {\n if (!this.chatClientService.chatClient) {\n throw new Error(\n 'Intialize the ChatClientService before querying reactions'\n );\n } else {\n try {\n const response = await this.chatClientService.chatClient.queryReactions(\n messageId,\n { type },\n { created_at: -1 },\n { next }\n );\n\n return response;\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error loading reactions'\n );\n throw error;\n }\n }\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { MessageReactionType } from '../types';\nimport { ReactionResponse } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { MessageReactionsService } from '../message-reactions.service';\nimport { Subscription } from 'rxjs';\n\n/**\n * The `MessageReactionsSelectorComponent` makes it possible for users to react to a message, the reaction options can be set using the [`MessageReactionsService`](/chat/docs/sdk/angular/services/MessageReactionsService/). You can read more about [message reactions](/chat/docs/javascript/send_reaction/) in the platform documentation.\n */\n@Component({\n selector: 'stream-message-reactions-selector',\n templateUrl: './message-reactions-selector.component.html',\n styles: [],\n})\nexport class MessageReactionsSelectorComponent\n implements OnInit, OnDestroy, AfterViewInit\n{\n /**\n * List of the user's own reactions of a [message](/chat/docs/sdk/angular/types/stream-message/), used to display the users of a reaction type.\n */\n @Input() ownReactions: ReactionResponse[] = [];\n /**\n * The id of the message the reactions belong to\n */\n @Input() messageId: string | undefined;\n reactionOptions: string[] = [];\n private subscriptions: Subscription[] = [];\n private isViewInited = false;\n\n constructor(\n private channelService: ChannelService,\n private messageReactionsService: MessageReactionsService,\n private cdRef: ChangeDetectorRef\n ) {}\n ngOnInit(): void {\n this.subscriptions.push(\n this.messageReactionsService.reactions$.subscribe((reactions) => {\n this.reactionOptions = Object.keys(reactions);\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n })\n );\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n trackByMessageReaction(_: number, item: MessageReactionType) {\n return item;\n }\n\n isOwnReaction(reactionType: MessageReactionType) {\n return !!this.ownReactions.find((r) => r.type === reactionType);\n }\n\n getEmojiByReaction(reactionType: MessageReactionType) {\n return this.messageReactionsService.reactions[reactionType];\n }\n\n async react(type: MessageReactionType) {\n this.ownReactions.find((r) => r.type === type)\n ? await this.channelService.removeReaction(this.messageId!, type)\n : await this.channelService.addReaction(this.messageId!, type);\n }\n}\n","<div\n #selectorContainer\n data-testid=\"reaction-selector\"\n class=\"str-chat__reaction-selector str-chat-angular-v5__reaction-selector str-chat__message-reaction-selector\"\n>\n <ul\n class=\"str-chat__message-reactions-list str-chat__message-reactions-options\"\n >\n <li\n *ngFor=\"\n let reactionType of reactionOptions;\n trackBy: trackByMessageReaction\n \"\n class=\"str-chat__message-reactions-option str-chat__message-reactions-list-item str-chat__emoji\"\n data-testclass=\"emoji-option\"\n [attr.data-testid]=\"reactionType\"\n [class.str-chat__message-reactions-option-selected]=\"\n isOwnReaction(reactionType)\n \"\n (click)=\"react(reactionType)\"\n (keyup.enter)=\"react(reactionType)\"\n >\n <span\n class=\"emoji str-chat__emoji-selector-emoji-angular str-chat__message-reaction-emoji\"\n >\n {{ getEmojiByReaction(reactionType) }}\n </span>\n </li>\n </ul>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport {\n CustomMessageActionItem,\n MessageActionBoxItemContext,\n MessageActionItem,\n MessageReactionActionItem,\n MessageReactionsSelectorContext,\n StreamMessage,\n} from '../types';\nimport { MessageActionsService } from '../message-actions.service';\n/**\n * The `MessageActionsBox` component displays a list of message actions (i.e edit), that can be opened or closed. You can find the [list of the supported actions](/chat/docs/sdk/angular/concepts/message-interactions/) in the message interaction guide.\n */\n@Component({\n selector: 'stream-message-actions-box',\n templateUrl: './message-actions-box.component.html',\n styles: [],\n})\nexport class MessageActionsBoxComponent\n implements OnInit, OnChanges, OnDestroy, AfterViewInit\n{\n /**\n * Indicates if the message actions are belonging to a message that was sent by the current user or not.\n */\n @Input() isMine = false;\n /**\n * The message the actions will be executed on\n */\n @Input() message: StreamMessage | undefined;\n /**\n * The HTML element which contains the message text, it's used for the \"copy message text\" action\n */\n @Input() messageTextHtmlElement: HTMLElement | undefined;\n /**\n * The list of [channel capabilities](/chat/docs/javascript/channel_capabilities/) that are enabled for the current user, the list of [supported interactions](/chat/docs/sdk/angular/concepts/message-interactions) can be found in our message interaction guide. Unathorized actions won't be displayed on the UI.\n */\n @Input() enabledActions: string[] = [];\n messageActionItemTemplate:\n | TemplateRef<MessageActionBoxItemContext>\n | undefined;\n visibleMessageActionItems: (\n | MessageActionItem\n | CustomMessageActionItem\n | MessageReactionActionItem\n )[] = [];\n isEditModalOpen = false;\n customActions: CustomMessageActionItem[] = [];\n private readonly messageActionItems: (\n | MessageActionItem\n | MessageReactionActionItem\n )[];\n private subscriptions: Subscription[] = [];\n private isViewInited = false;\n constructor(\n public readonly customTemplatesService: CustomTemplatesService,\n private messageActionsService: MessageActionsService,\n private cdRef: ChangeDetectorRef\n ) {\n this.messageActionItems = this.messageActionsService.defaultActions;\n }\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.messageActionsService.customActions$.subscribe((actions) => {\n this.customActions = actions;\n this.setVisibleActions();\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n })\n );\n this.subscriptions.push(\n this.messageActionsService.messageToEdit$.subscribe((m) => {\n let isEditModalOpen = false;\n if (m && m.id === this.message?.id) {\n isEditModalOpen = true;\n }\n if (isEditModalOpen !== this.isEditModalOpen) {\n this.isEditModalOpen = isEditModalOpen;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n })\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.isMine || changes.enabledActions || changes.message) {\n this.setVisibleActions();\n }\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n getActionLabel(\n actionLabelOrTranslationKey: ((message: StreamMessage) => string) | string\n ) {\n return typeof actionLabelOrTranslationKey === 'string'\n ? actionLabelOrTranslationKey\n : actionLabelOrTranslationKey(this.message!);\n }\n\n getReactionSelectorTemplateContext(): MessageReactionsSelectorContext {\n return {\n messageId: this.message?.id,\n ownReactions: this.message?.own_reactions || [],\n };\n }\n\n getMessageActionTemplateContext(\n item:\n | MessageActionItem\n | CustomMessageActionItem\n | MessageReactionActionItem\n ): MessageActionBoxItemContext {\n if (this.isReactAction(item)) {\n return {} as MessageActionBoxItemContext;\n } else {\n return {\n actionHandler: item.actionHandler,\n actionHandlerExtraParams: {\n isMine: this.isMine,\n messageTextHtmlElement: this.messageTextHtmlElement,\n },\n actionName: item.actionName,\n message: this.message!,\n actionLabelOrTranslationKey: item.actionLabelOrTranslationKey,\n };\n }\n }\n\n trackByActionName(\n _: number,\n item:\n | MessageActionItem\n | CustomMessageActionItem\n | MessageReactionActionItem\n ) {\n return item.actionName;\n }\n\n private isReactAction(\n item:\n | MessageActionItem\n | CustomMessageActionItem\n | MessageReactionActionItem\n ): item is MessageReactionActionItem {\n return item.actionName === 'react';\n }\n\n private setVisibleActions() {\n if (!this.message) {\n this.visibleMessageActionItems = [];\n } else {\n this.visibleMessageActionItems = [\n ...this.messageActionItems,\n ...this.customActions,\n ].filter((item) =>\n item.isVisible(this.enabledActions, this.isMine, this.message!)\n );\n }\n }\n}\n","<div\n #actionBox\n data-testid=\"action-box\"\n class=\"str-chat__message-actions-box str-chat__message-actions-box-angular str-chat__message-actions-box--open\"\n>\n <ul class=\"str-chat__message-actions-list\">\n <ng-container\n *ngFor=\"let item of visibleMessageActionItems; trackBy: trackByActionName\"\n >\n <ng-container [ngSwitch]=\"item.actionName\">\n <ng-container *ngSwitchCase=\"'react'\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageReactionsSelectorTemplate$\n | async) || defaultReactionSelector;\n context: getReactionSelectorTemplateContext()\n \"\n ></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageActionsBoxItemTemplate$ | async) ||\n defaultMessageActionItem;\n context: getMessageActionTemplateContext(item)\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </ul>\n</div>\n\n<ng-template\n #defaultMessageActionItem\n let-actionName=\"actionName\"\n let-actionHandler=\"actionHandler\"\n let-actionLabelOrTranslationKey=\"actionLabelOrTranslationKey\"\n let-actionHandlerExtraParams=\"actionHandlerExtraParams\"\n>\n <button\n class=\"str-chat__message-actions-list-item-button\"\n [attr.data-testid]=\"actionName + '-action'\"\n (click)=\"actionHandler(message, actionHandlerExtraParams)\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ getActionLabel(actionLabelOrTranslationKey) | translate }}\n </li>\n </button>\n</ng-template>\n\n<ng-template\n #defaultReactionSelector\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n>\n <stream-message-reactions-selector\n [messageId]=\"message?.id\"\n [ownReactions]=\"message?.own_reactions || []\"\n ></stream-message-reactions-selector>\n</ng-template>\n","import { Component, Input, TemplateRef } from '@angular/core';\nimport { NotificationType } from '../types';\n\n/**\n * The `Notification` component displays a notification within the [`NotificationList`](/chat/docs/sdk/angular/components/NotificationListComponent/)\n */\n@Component({\n selector: 'stream-notification',\n templateUrl: './notification.component.html',\n styles: [],\n})\nexport class NotificationComponent {\n /**\n * The type of the notification\n */\n @Input() type: NotificationType | undefined;\n /**\n * The content of the notification (can also be provided using `ng-content`)\n */\n @Input() content: TemplateRef<void> | undefined;\n\n constructor() {}\n}\n","<div\n data-testid=\"custom-notification\"\n class=\"str-chat__custom-notification notification-{{\n type\n }} str-chat__notification\"\n>\n <ng-container *ngIf=\"content; else elseContent\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n <ng-template #elseContent>\n <ng-content></ng-content>\n </ng-template>\n</div>\n","import { Component } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { NotificationService } from '../notification.service';\nimport { ThemeService } from '../theme.service';\nimport { NotificationPayload } from '../types';\n\n/**\n * The `NotificationList` component displays the list of active notifications.\n */\n@Component({\n selector: 'stream-notification-list',\n templateUrl: './notification-list.component.html',\n styles: [],\n})\nexport class NotificationListComponent {\n notifications$: Observable<NotificationPayload[]>;\n theme$: Observable<string>;\n\n constructor(\n public readonly customTemplatesService: CustomTemplatesService,\n private notificationService: NotificationService,\n private themeService: ThemeService\n ) {\n this.notifications$ = this.notificationService.notifications$;\n this.theme$ = this.themeService.theme$;\n }\n\n trackById(_: number, item: NotificationPayload) {\n return item.id;\n }\n\n getNotificationContentContext(notification: NotificationPayload) {\n return {\n ...notification.templateContext,\n dismissFn: notification.dismissFn,\n };\n }\n}\n","<div\n data-testid=\"notification-list\"\n class=\"str-chat str-chat__theme-{{\n theme$ | async\n }} str-chat__list-notifications\"\n>\n <ng-container\n *ngFor=\"let notification of notifications$ | async; trackBy: trackById\"\n >\n <ng-template #notificationContent>\n <div\n *ngIf=\"notification.text !== undefined\"\n data-testclass=\"notification-content\"\n >\n {{ notification.text | translate : notification.translateParams }}\n </div>\n <ng-container *ngIf=\"notification.template !== undefined\">\n <ng-container\n *ngTemplateOutlet=\"\n notification.template;\n context: getNotificationContentContext(notification)\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.notificationTemplate$ | async) ||\n defaultNotification;\n context: { type: notification.type, content: notificationContent }\n \"\n ></ng-container>\n </ng-container>\n</div>\n\n<ng-template #defaultNotification let-type=\"type\" let-content=\"content\">\n <stream-notification [type]=\"type\" [content]=\"content\"></stream-notification>\n</ng-template>\n","import {\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\n\n/**\n * The `Modal` component displays its content in an overlay. The modal can be closed with a close button, if the user clicks outside of the modal content, or if the escape button is pressed. The modal can also be closed from outside.\n */\n@Component({\n selector: 'stream-modal',\n templateUrl: './modal.component.html',\n styles: [],\n})\nexport class ModalComponent implements OnChanges {\n /**\n * If `true` the modal will be displayed, if `false` the modal will be hidden\n */\n @Input() isOpen = false;\n /**\n * The content of the modal (can also be provided using `ng-content`)\n */\n @Input() content: TemplateRef<void> | undefined;\n /**\n * Emits `true` if the modal becomes visible, and `false` if the modal is closed.\n */\n @Output() readonly isOpenChange = new EventEmitter<boolean>();\n @ViewChild('modalInner') private innerContainer:\n | ElementRef<HTMLElement>\n | undefined;\n\n constructor() {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.isOpen) {\n if (this.isOpen) {\n window.addEventListener('keyup', this.watchForEscPress);\n setTimeout(\n () => window.addEventListener('click', this.watchForOutsideClicks),\n 0\n );\n } else {\n this.stopWatchForOutsideClicks();\n this.stopWatchForEscPress();\n }\n }\n }\n\n close() {\n this.isOpen = false;\n this.isOpenChange.emit(false);\n this.stopWatchForOutsideClicks();\n this.stopWatchForEscPress();\n }\n\n private watchForEscPress = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.close();\n }\n };\n\n private stopWatchForEscPress = () => {\n window.removeEventListener('keyup', this.watchForEscPress);\n };\n\n private watchForOutsideClicks = (event: Event) => {\n if (!this.innerContainer?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n };\n\n private stopWatchForOutsideClicks() {\n window.removeEventListener('click', this.watchForOutsideClicks);\n }\n}\n","<div\n data-testid=\"modal\"\n class=\"str-chat__modal str-chat__modal--{{ isOpen ? 'open' : 'close' }}\"\n>\n <div\n data-testid=\"close\"\n class=\"str-chat__modal__close-button\"\n (click)=\"close()\"\n (keyup.enter)=\"close()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </div>\n <div\n #modalInner\n class=\"str-chat__modal__inner\"\n (click)=\"$event.stopPropagation()\"\n (keyup.enter)=\"$event.stopPropagation()\"\n >\n <ng-container *ngIf=\"content; else elseContent\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n <ng-template #elseContent>\n <ng-content></ng-content>\n </ng-template>\n </div>\n</div>\n","import { Component, HostBinding, OnDestroy } from '@angular/core';\nimport { ChannelService } from '../channel.service';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { Subscription } from 'rxjs';\nimport { MessageActionsService } from '../message-actions.service';\nimport { StreamMessage } from '../types';\n\n/**\n * The component watches for the [`channelService.bouncedMessage$` stream](/chat/docs/sdk/angular/services/ChannelService/#bouncedmessage) and opens the bounce modal if a message is emitted.\n *\n * To bounce messages, you need to set up [semantic filters for moderation](https://getstream.io/automated-moderation/docs/automod_configuration/?q=semantic%20filters).\n */\n@Component({\n selector: 'stream-message-bounce-prompt',\n templateUrl: './message-bounce-prompt.component.html',\n styles: [],\n})\nexport class MessageBouncePromptComponent implements OnDestroy {\n @HostBinding() class = 'str-chat__message-bounce-prompt';\n isModalOpen = false;\n message?: StreamMessage;\n private subscriptions: Subscription[] = [];\n\n constructor(\n private channelService: ChannelService,\n readonly customTemplatesService: CustomTemplatesService,\n private messageActionsService: MessageActionsService\n ) {\n this.subscriptions.push(\n this.channelService.bouncedMessage$.subscribe((m) => {\n if (m !== this.message) {\n this.message = m;\n if (this.message) {\n this.isModalOpen = true;\n }\n }\n })\n );\n }\n\n messageBounceModalOpenChanged = (isOpen: boolean) => {\n this.isModalOpen = isOpen;\n if (!isOpen) {\n this.message = undefined;\n this.channelService.bouncedMessage$.next(undefined);\n }\n };\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n async resendMessage() {\n this.isModalOpen = false;\n await this.channelService.resendMessage(this.message!);\n this.message = undefined;\n this.channelService.bouncedMessage$.next(undefined);\n }\n\n async deleteMessage() {\n if (!this.message) {\n return;\n }\n this.isModalOpen = false;\n await this.channelService.deleteMessage(this.message, true);\n this.message = undefined;\n this.channelService.bouncedMessage$.next(undefined);\n }\n\n editMessage() {\n this.isModalOpen = false;\n this.messageActionsService.messageToEdit$.next(this.message);\n this.message = undefined;\n this.channelService.bouncedMessage$.next(undefined);\n }\n}\n","<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: {\n message: message,\n isOpen: isModalOpen,\n isOpenChangeHandler: messageBounceModalOpenChanged,\n content: modalContent\n }\n \"\n></ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n *ngIf=\"isOpen\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div\n class=\"str-chat__message-bounce-prompt\"\n data-testid=\"message-bounce-prompt\"\n >\n <div class=\"str-chat__message-bounce-prompt-header\">\n {{\n \"streamChat.This message did not meet our content guidelines\"\n | translate\n }}\n </div>\n <div class=\"str-chat__message-bounce-actions\">\n <button\n class=\"str-chat__message-bounce-edit\"\n data-testid=\"message-bounce-edit\"\n type=\"button\"\n (click)=\"editMessage()\"\n (keyup.enter)=\"editMessage()\"\n >\n {{ \"streamChat.Edit Message\" | translate }}\n </button>\n <button\n class=\"str-chat__message-bounce-send\"\n data-testid=\"message-bounce-send\"\n (click)=\"resendMessage()\"\n (keyup.enter)=\"resendMessage()\"\n >\n {{ \"streamChat.Send Anyway\" | translate }}\n </button>\n <button\n class=\"str-chat__message-bounce-delete\"\n data-testid=\"message-bounce-delete\"\n (click)=\"deleteMessage()\"\n (keyup.enter)=\"deleteMessage()\"\n >\n {{ \"streamChat.Delete\" | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n","import { Component } from '@angular/core';\nimport { combineLatest, Observable, Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ChannelService } from '../channel.service';\nimport { ThemeService } from '../theme.service';\nimport { CustomTemplatesService } from '../custom-templates.service';\n\n/**\n * The `Channel` component is a container component that displays the [`ChannelHeader`](/chat/docs/sdk/angular/components/ChannelHeaderComponent/), [`MessageList`](/chat/docs/sdk/angular/components/MessageListComponent), [`NotificationList`](/chat/docs/sdk/angular/components/NotificationListComponent/) and [`MessageInput`](/chat/docs/sdk/angular/components/MessageInputComponent/) components. You can also provide the [`Thread`](/chat/docs/sdk/angular/components/ThreadComponent/) component to use message [threads](/chat/docs/javascript/threads/).\n */\n@Component({\n selector: 'stream-channel',\n templateUrl: './channel.component.html',\n styles: [],\n})\nexport class ChannelComponent {\n isError$: Observable<boolean>;\n isInitializing$: Observable<boolean>;\n isActiveThread$: Observable<boolean>;\n isActiveChannel$: Observable<boolean>;\n subscriptions: Subscription[] = [];\n theme$: Observable<string>;\n\n constructor(\n private channelService: ChannelService,\n private themeService: ThemeService,\n readonly customTemplatesService: CustomTemplatesService\n ) {\n this.isError$ = combineLatest([\n this.channelService.channelQueryState$,\n this.channelService.activeChannel$,\n ]).pipe(\n map(([state, activeChannel]) => {\n return !activeChannel && state?.state === 'error';\n })\n );\n this.isInitializing$ = combineLatest([\n this.channelService.channelQueryState$,\n this.channelService.activeChannel$,\n ]).pipe(\n map(([state, activeChannel]) => {\n return !activeChannel && state?.state === 'in-progress';\n })\n );\n this.isActiveThread$ = this.channelService.activeParentMessageId$.pipe(\n map((id) => !!id)\n );\n this.theme$ = this.themeService.theme$;\n this.isActiveChannel$ = this.channelService.activeChannel$.pipe(\n map((c) => !!c)\n );\n }\n}\n","<div\n class=\"str-chat str-chat-channel messaging str-chat__channel str-chat__theme-{{\n theme$ | async\n }}\"\n>\n <div\n *ngIf=\"\n (isError$ | async) === false &&\n (isInitializing$ | async) === false &&\n (isActiveChannel$ | async) === true;\n else noChannel\n \"\n class=\"str-chat__container\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageBouncePromptTemplate$ | async) ||\n defaultMessageBouncePrompt\n \"\n ></ng-container>\n <ng-template #defaultMessageBouncePrompt>\n <stream-message-bounce-prompt></stream-message-bounce-prompt>\n </ng-template>\n <div class=\"str-chat__main-panel\">\n <ng-content></ng-content>\n </div>\n <ng-content\n *ngIf=\"isActiveThread$ | async\"\n select='[name=\"thread\"]'\n ></ng-content>\n </div>\n <ng-template #noChannel>\n <div\n *ngIf=\"\n (isInitializing$ | async) === false &&\n ((isError$ | async) === true || (isActiveChannel$ | async) === false)\n \"\n class=\"str-chat__empty-channel\"\n >\n <stream-icon icon=\"chat-bubble\"></stream-icon>\n <p class=\"str-chat__empty-channel-text\">\n {{ \"streamChat.No chats here yet…\" | translate }}\n </p>\n <div class=\"str-chat__empty-channel-notifications\">\n <stream-notification-list></stream-notification-list>\n </div>\n </div>\n <div\n *ngIf=\"\n (isInitializing$ | async) === true &&\n (isError$ | async) === false &&\n (isActiveChannel$ | async) === false\n \"\n class=\"str-chat__loading-channel\"\n >\n <div class=\"str-chat__loading-channel-header\">\n <div class=\"str-chat__loading-channel-header-avatar\"></div>\n <div class=\"str-chat__loading-channel-header-end\">\n <div class=\"str-chat__loading-channel-header-name\"></div>\n <div class=\"str-chat__loading-channel-header-info\"></div>\n </div>\n </div>\n <div class=\"str-chat__loading-channel-message-list\">\n <div class=\"str-chat__loading-channel-message\">\n <div class=\"str-chat__loading-channel-message-avatar\"></div>\n <div class=\"str-chat__loading-channel-message-end\">\n <div class=\"str-chat__loading-channel-message-sender\"></div>\n <div class=\"str-chat__loading-channel-message-last-row\">\n <div class=\"str-chat__loading-channel-message-text\"></div>\n <div class=\"str-chat__loading-channel-message-date\"></div>\n </div>\n </div>\n </div>\n <div class=\"str-chat__loading-channel-message\">\n <div class=\"str-chat__loading-channel-message-avatar\"></div>\n <div class=\"str-chat__loading-channel-message-end\">\n <div class=\"str-chat__loading-channel-message-sender\"></div>\n <div class=\"str-chat__loading-channel-message-last-row\">\n <div class=\"str-chat__loading-channel-message-text\"></div>\n <div class=\"str-chat__loading-channel-message-date\"></div>\n </div>\n </div>\n </div>\n <div class=\"str-chat__loading-channel-message\">\n <div class=\"str-chat__loading-channel-message-avatar\"></div>\n <div class=\"str-chat__loading-channel-message-end\">\n <div class=\"str-chat__loading-channel-message-sender\"></div>\n <div class=\"str-chat__loading-channel-message-last-row\">\n <div class=\"str-chat__loading-channel-message-text\"></div>\n <div class=\"str-chat__loading-channel-message-date\"></div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"str-chat__loading-channel-message-input-row\">\n <div class=\"str-chat__loading-channel-message-input\"></div>\n <div class=\"str-chat__loading-channel-message-send\"></div>\n </div>\n </div>\n </ng-template>\n</div>\n","import { UserResponse } from 'stream-chat';\n\nexport const listUsers = (\n users: UserResponse[],\n displayRestCount = true,\n othersText = ''\n) => {\n let outStr = '';\n\n const slicedArr = users.map((item) => item.name || item.id).slice(0, 5);\n const restLength = users.length - slicedArr.length;\n\n const commaSeparatedUsers = slicedArr.join(', ');\n outStr = commaSeparatedUsers;\n if (restLength > 0) {\n outStr += displayRestCount ? ` +${restLength}` : ` ${othersText}`;\n }\n\n return outStr;\n};\n","import { Channel, UserResponse } from 'stream-chat';\nimport { listUsers } from './list-users';\n\nexport const getChannelDisplayText = (\n channel: Channel,\n currentUser: UserResponse\n) => {\n if (channel.data?.name) {\n return channel.data.name;\n }\n if (channel.state.members && Object.keys(channel.state.members).length > 0) {\n const members = Object.values(channel.state.members)\n .map((m) => m.user || { id: m.user_id! })\n .filter((m) => m.id !== currentUser?.id);\n return listUsers(members);\n }\n return channel.id;\n};\n","import {\n ChangeDetectorRef,\n Component,\n OnDestroy,\n OnInit,\n TemplateRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Channel } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { ChatClientService } from '../chat-client.service';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { getChannelDisplayText } from '../get-channel-display-text';\nimport { ChannelActionsContext, ChannelHeaderInfoContext } from '../types';\n\n/**\n * The `ChannelHeader` component displays the avatar and name of the currently active channel along with member and watcher information. You can read about [the difference between members and watchers](/chat/docs/javascript/watch_channel/#watchers-vs-members) in the platform documentation. Please note that number of watchers is only displayed if the user has [`connect-events` capability](/chat/docs/javascript/channel_capabilities/)\n */\n@Component({\n selector: 'stream-channel-header',\n templateUrl: './channel-header.component.html',\n styles: [],\n})\nexport class ChannelHeaderComponent implements OnInit, OnDestroy {\n channelActionsTemplate?: TemplateRef<ChannelActionsContext>;\n channelHeaderInfoTemplate?: TemplateRef<ChannelHeaderInfoContext>;\n activeChannel: Channel | undefined;\n canReceiveConnectEvents: boolean | undefined;\n private subscriptions: Subscription[] = [];\n\n constructor(\n private channelService: ChannelService,\n private customTemplatesService: CustomTemplatesService,\n private cdRef: ChangeDetectorRef,\n private chatClientService: ChatClientService\n ) {\n this.channelService.activeChannel$.subscribe((c) => {\n this.activeChannel = c;\n const capabilities = this.activeChannel?.data\n ?.own_capabilities as string[];\n if (!capabilities) {\n return;\n }\n this.canReceiveConnectEvents =\n capabilities.indexOf('connect-events') !== -1;\n });\n }\n ngOnInit(): void {\n this.subscriptions.push(\n this.customTemplatesService.channelActionsTemplate$.subscribe(\n (template) => {\n this.channelActionsTemplate = template;\n this.cdRef.detectChanges();\n }\n )\n );\n this.subscriptions.push(\n this.customTemplatesService.channelHeaderInfoTemplate$.subscribe(\n (template) => {\n this.channelHeaderInfoTemplate = template;\n this.cdRef.detectChanges();\n }\n )\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n getChannelActionsContext(): ChannelActionsContext {\n return { channel: this.activeChannel! };\n }\n\n getChannelInfoContext(): ChannelHeaderInfoContext {\n return { channel: this.activeChannel! };\n }\n\n get memberCountParam() {\n return { memberCount: this.activeChannel?.data?.member_count || 0 };\n }\n\n get watcherCountParam() {\n return { watcherCount: this.activeChannel?.state?.watcher_count || 0 };\n }\n\n get displayText() {\n if (!this.activeChannel) {\n return '';\n }\n return getChannelDisplayText(\n this.activeChannel,\n this.chatClientService.chatClient.user!\n );\n }\n\n get avatarName() {\n return this.activeChannel?.data?.name;\n }\n}\n","<div class=\"str-chat__header-livestream str-chat__channel-header\">\n <ng-content></ng-content>\n <stream-avatar-placeholder\n type=\"channel\"\n location=\"channel-header\"\n imageUrl=\"{{ activeChannel?.data?.image }}\"\n name=\"{{ avatarName }}\"\n [channel]=\"activeChannel\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__header-livestream-left str-chat__channel-header-end\">\n <p\n data-testid=\"name\"\n class=\"str-chat__header-livestream-left--title str-chat__channel-header-title\"\n >\n {{ displayText }}\n </p>\n <ng-container\n *ngTemplateOutlet=\"\n channelHeaderInfoTemplate || defaultChannelInfo;\n context: getChannelInfoContext()\n \"\n ></ng-container>\n <ng-template #defaultChannelInfo>\n <p\n data-testid=\"info\"\n class=\"str-chat__header-livestream-left--members str-chat__channel-header-info\"\n >\n {{'streamChat.{{ memberCount }} members' | translate:memberCountParam}}\n {{canReceiveConnectEvents ? ('streamChat.{{ watcherCount }} online' |\n translate:watcherCountParam) : ''}}\n </p>\n </ng-template>\n </div>\n <ng-container *ngIf=\"channelActionsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n channelActionsTemplate;\n context: getChannelActionsContext()\n \"\n ></ng-container>\n </ng-container>\n</div>\n","export const isOnSeparateDate = (date1: Date, date2: Date) => {\n if (date1.getDate() !== date2.getDate()) {\n return true;\n } else if (\n date1.getFullYear() !== date2.getFullYear() ||\n date1.getMonth() !== date2.getMonth()\n ) {\n return true;\n }\n return false;\n};\n","import Dayjs from 'dayjs';\nimport calendar from 'dayjs/plugin/calendar';\nimport relativeTime from 'dayjs/plugin/relativeTime';\n\nDayjs.extend(calendar);\nDayjs.extend(relativeTime);\n\nexport const parseDate = (\n date: Date,\n format: 'date' | 'date-time' | 'time' = 'date-time'\n) => {\n const parsedTime = Dayjs(date);\n\n switch (format) {\n case 'date': {\n return parsedTime.calendar(null, {\n sameDay: '[Today]', // The same day ( Today at 2:30 AM )\n nextDay: '[Tomorrow]', // The next day ( Tomorrow at 2:30 AM )\n nextWeek: 'dddd', // The next week ( Sunday at 2:30 AM )\n lastDay: '[Yesterday]', // The day before ( Yesterday at 2:30 AM )\n lastWeek: '[Last] dddd', // Last week ( Last Monday at 2:30 AM )\n sameElse: 'MM/DD/YYYY', // Everything else ( 10/17/2011 )\n });\n }\n case 'date-time': {\n return parsedTime.calendar();\n }\n case 'time': {\n return parsedTime.format('h:mm A');\n }\n }\n};\n","import { Injectable } from '@angular/core';\nimport { parseDate } from './parse-date';\n\n/**\n * The `DateParserService` parses dates into user-friendly string representations.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class DateParserService {\n /**\n * Custom parser to override `parseTime`\n */\n customTimeParser?: (date: Date) => string;\n /**\n * Custom parser to override `parseDate`\n */\n customDateParser?: (date: Date) => string;\n /**\n * Custom parser to override `parseDateTime`\n */\n customDateTimeParser?: (date: Date) => string;\n\n constructor() {}\n\n /**\n * Return a user-friendly string representation of the time\n * @param date\n * @returns The parsed time\n */\n parseTime(date: Date) {\n if (this.customTimeParser) {\n return this.customTimeParser(date);\n }\n return parseDate(date, 'time');\n }\n\n /**\n * Return a user-friendly string representation of the date (year, month and date)\n * @param date\n * @returns The parsed date\n */\n parseDate(date: Date) {\n if (this.customDateParser) {\n return this.customDateParser(date);\n }\n return parseDate(date, 'date');\n }\n\n /**\n * Return a user-friendly string representation of the date and time\n * @param date\n * @returns The parsed date\n */\n parseDateTime(date: Date) {\n if (this.customDateTimeParser) {\n return this.customDateTimeParser(date);\n }\n return parseDate(date, 'date-time');\n }\n}\n","import { Component, Input, NgZone, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { Channel, Event, FormatMessageResponse } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { getChannelDisplayText } from '../get-channel-display-text';\nimport { ChatClientService } from '../chat-client.service';\nimport { getMessageTranslation } from '../get-message-translation';\nimport { MessageService } from '../message.service';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { getReadBy } from '../read-by';\nimport { isOnSeparateDate } from '../is-on-separate-date';\nimport { DateParserService } from '../date-parser.service';\n\n/**\n * The `ChannelPreview` component displays a channel preview in the channel list, it consists of the image, name and latest message of the channel.\n */\n@Component({\n selector: 'stream-channel-preview',\n templateUrl: './channel-preview.component.html',\n styles: [],\n})\nexport class ChannelPreviewComponent implements OnInit, OnDestroy {\n /**\n * The channel to be displayed\n */\n @Input() channel: Channel | undefined;\n isActive = false;\n isUnreadMessageWasCalled = false;\n isUnread = false;\n unreadCount: number | undefined;\n latestMessageText: string = 'streamChat.Nothing yet...';\n latestMessageStatus?: 'delivered' | 'read';\n latestMessageTime?: string;\n latestMessage?: FormatMessageResponse;\n displayAs: 'text' | 'html';\n userId?: string;\n private subscriptions: (Subscription | { unsubscribe: () => void })[] = [];\n private canSendReadEvents = true;\n\n constructor(\n private channelService: ChannelService,\n private ngZone: NgZone,\n private chatClientService: ChatClientService,\n messageService: MessageService,\n public customTemplatesService: CustomTemplatesService,\n private dateParser: DateParserService\n ) {\n this.displayAs = messageService.displayAs;\n }\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.chatClientService.user$.subscribe((user) => {\n if (user?.id !== this.userId) {\n this.userId = user?.id;\n }\n })\n );\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe(\n (activeChannel) =>\n (this.isActive = activeChannel?.id === this.channel?.id)\n )\n );\n const messages = this.channel?.state?.latestMessages;\n if (messages && messages.length > 0) {\n this.setLatestMessage(messages[messages.length - 1]);\n }\n this.updateUnreadState();\n const capabilities =\n (this.channel?.data?.own_capabilities as string[]) || [];\n this.canSendReadEvents = capabilities.indexOf('read-events') !== -1;\n this.subscriptions.push(\n this.channel!.on('message.new', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('message.updated', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('message.deleted', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('channel.truncated', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('message.read', () =>\n this.ngZone.run(() => {\n this.isUnreadMessageWasCalled = false;\n this.updateUnreadState();\n })\n )\n );\n this.subscriptions.push(\n this.chatClientService.events$\n .pipe(\n filter(\n (e) =>\n e.eventType === 'notification.mark_unread' &&\n this.channel!.id === e.event?.channel_id\n )\n )\n .subscribe(() => {\n this.ngZone.run(() => {\n this.isUnreadMessageWasCalled = true;\n this.updateUnreadState();\n });\n })\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n get avatarImage() {\n return this.channel?.data?.image;\n }\n\n get avatarName() {\n return this.channel?.data?.name;\n }\n\n get title() {\n if (!this.channel) {\n return '';\n }\n return getChannelDisplayText(\n this.channel,\n this.chatClientService.chatClient.user!\n );\n }\n\n setAsActiveChannel(): void {\n void this.channelService.setAsActiveChannel(this.channel!);\n }\n\n private handleMessageEvent(event: Event) {\n this.ngZone.run(() => {\n if (this.channel?.state.latestMessages.length === 0) {\n this.latestMessage = undefined;\n this.latestMessageStatus = undefined;\n this.latestMessageText = 'streamChat.Nothing yet...';\n this.latestMessageTime = undefined;\n return;\n }\n const latestMessage =\n this.channel?.state.latestMessages[\n this.channel?.state.latestMessages.length - 1\n ];\n if (!event.message || latestMessage?.id !== event.message.id) {\n return;\n }\n this.setLatestMessage(latestMessage);\n this.updateUnreadState();\n });\n }\n\n private setLatestMessage(message?: FormatMessageResponse) {\n this.latestMessage = message;\n if (message?.deleted_at) {\n this.latestMessageText = 'streamChat.Message deleted';\n } else if (message?.text) {\n this.latestMessageText =\n getMessageTranslation(\n message,\n this.channel,\n this.chatClientService.chatClient.user\n ) || message.text;\n } else if (message?.attachments && message.attachments.length) {\n this.latestMessageText = 'streamChat.🏙 Attachment...';\n } else if (message?.poll_id) {\n this.latestMessageText = `📊 ${message.poll?.name}`;\n }\n if (this.latestMessage && this.latestMessage.type === 'regular') {\n this.latestMessageTime = isOnSeparateDate(\n new Date(),\n this.latestMessage.created_at\n )\n ? this.dateParser.parseDate(this.latestMessage.created_at)\n : this.dateParser.parseTime(this.latestMessage.created_at);\n } else {\n this.latestMessageTime = undefined;\n }\n }\n\n private updateUnreadState() {\n if (\n this.channel &&\n this.latestMessage &&\n this.latestMessage.user?.id === this.userId &&\n this.latestMessage.status === 'received' &&\n this.latestMessage.type === 'regular'\n ) {\n this.latestMessageStatus =\n getReadBy(this.latestMessage, this.channel).length > 0\n ? 'read'\n : 'delivered';\n } else {\n this.latestMessageStatus = undefined;\n }\n if (\n (this.isActive && !this.isUnreadMessageWasCalled) ||\n !this.canSendReadEvents\n ) {\n this.unreadCount = 0;\n this.isUnread = false;\n return;\n }\n this.unreadCount = this.channel!.countUnread();\n this.isUnread = !!this.unreadCount;\n }\n}\n","<button\n class=\"str-chat__channel-preview-messenger str-chat__channel-preview\"\n data-testid=\"channel-preview-container\"\n [class.str-chat__channel-preview-messenger--active]=\"isActive\"\n [class.str-chat__channel-preview--active]=\"isActive\"\n [class.str-chat__channel-preview-messenger--unread]=\"isUnread\"\n (click)=\"setAsActiveChannel()\"\n>\n <div class=\"str-chat__channel-preview-messenger--left\">\n <stream-avatar-placeholder\n type=\"channel\"\n location=\"channel-preview\"\n name=\"{{ avatarName }}\"\n imageUrl=\"{{ avatarImage }}\"\n [channel]=\"channel\"\n ></stream-avatar-placeholder>\n </div>\n <div\n class=\"str-chat__channel-preview-messenger--right str-chat__channel-preview-end\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.channelPreviewInfoTemplate$ | async) ||\n defaultChannelInfo;\n context: {\n channelDisplayTitle: title,\n channel: channel,\n unreadCount: unreadCount,\n latestMessageText: latestMessageText,\n latestMessageStatus: latestMessageStatus,\n latestMessageTime: latestMessageTime,\n latestMessage: latestMessage\n }\n \"\n ></ng-container>\n <ng-template\n #defaultChannelInfo\n let-channelDisplayTitle=\"channelDisplayTitle\"\n let-unreadCount=\"unreadCount\"\n let-latestMessageText=\"latestMessageText\"\n let-latestMessageStatus=\"latestMessageStatus\"\n let-latestMessageTime=\"latestMessageTime\"\n >\n <div class=\"str-chat__channel-preview-end-first-row\">\n <div class=\"str-chat__channel-preview-messenger--name\">\n <span data-testid=\"channel-preview-title\">{{\n channelDisplayTitle\n }}</span>\n </div>\n <div\n *ngIf=\"unreadCount\"\n data-testid=\"unread-badge\"\n class=\"str-chat__channel-preview-unread-badge\"\n >\n {{ unreadCount }}\n </div>\n </div>\n <div class=\"str-chat__channel-preview-end-second-row\">\n <div\n data-testid=\"latest-message\"\n class=\"str-chat__channel-preview-messenger--last-message\"\n >\n <ng-container *ngIf=\"displayAs === 'text'; else asHTML\">\n {{ latestMessageText | translate }}\n </ng-container>\n <ng-template #asHTML>\n <span\n data-testid=\"html-content\"\n [innerHTML]=\"latestMessageText | translate\"\n ></span>\n </ng-template>\n </div>\n <div\n *ngIf=\"latestMessageStatus\"\n data-testid=\"latest-message-status\"\n class=\"str-chat__channel-preview-messenger--status str-chat__channel-preview-messenger--status-{{\n latestMessageStatus\n }}\"\n >\n <stream-icon-placeholder\n [icon]=\"latestMessageStatus === 'delivered' ? 'delivered' : 'read'\"\n ></stream-icon-placeholder>\n </div>\n <div\n *ngIf=\"latestMessageTime\"\n data-testid=\"latest-message-time\"\n class=\"str-chat__channel-preview-messenger--time\"\n >\n {{ latestMessageTime }}\n </div>\n </div>\n </ng-template>\n </div>\n</button>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n Input,\n NgZone,\n Output,\n TemplateRef,\n TrackByFunction,\n ViewChild,\n} from '@angular/core';\n\n/**\n * The `PaginatedListComponent` is a utility element that can display a list of any items. It uses infinite scrolls to load more elements. Providing the data to display, is the responsibility of the parent component.\n */\n@Component({\n selector: 'stream-paginated-list',\n templateUrl: './paginated-list.component.html',\n styles: [],\n})\nexport class PaginatedListComponent<T> implements AfterViewInit {\n /**\n * The items to display\n */\n @Input() items: T[] = [];\n /**\n * If `true`, the loading indicator will be displayed\n */\n @Input() isLoading = false;\n /**\n * If `false` the component won't ask for more data vua the `loadMore` output\n */\n @Input() hasMore = false;\n /**\n * The `trackBy` to use with the `NgFor` directive\n * @param i\n * @returns the track by id\n */\n @Input() trackBy: TrackByFunction<T> = (i) => i;\n @ContentChild(TemplateRef) itemTempalteRef: TemplateRef<T> | undefined;\n /**\n * The component will signal via this output when more items should be fetched\n *\n * The new items should be appended to the `items` array\n */\n @Output() readonly loadMore = new EventEmitter<void>();\n isScrollable = false;\n isAtBottom = false;\n @ViewChild('container')\n private scrollContainer!: ElementRef<HTMLElement>;\n\n constructor(private ngZone: NgZone, private cdRef: ChangeDetectorRef) {}\n\n ngAfterViewInit(): void {\n this.ngZone.runOutsideAngular(() => {\n this.scrollContainer?.nativeElement?.addEventListener('scroll', () =>\n this.scrolled()\n );\n });\n }\n\n private scrolled() {\n if (!this.hasMore) {\n return;\n }\n\n const isScrollable =\n this.scrollContainer.nativeElement.scrollHeight >\n this.scrollContainer.nativeElement.clientHeight;\n\n if (this.isScrollable !== isScrollable) {\n this.ngZone.run(() => {\n this.isScrollable = isScrollable;\n this.cdRef.detectChanges();\n });\n }\n const isAtBottom =\n Math.ceil(this.scrollContainer.nativeElement.scrollTop) +\n this.scrollContainer.nativeElement.clientHeight +\n 1 >=\n this.scrollContainer.nativeElement.scrollHeight;\n if (this.isAtBottom !== isAtBottom) {\n this.ngZone.run(() => {\n this.isAtBottom = isAtBottom;\n if (this.isAtBottom && !this.isLoading) {\n this.loadMore.emit();\n }\n this.cdRef.detectChanges();\n });\n }\n }\n}\n","<div class=\"stream-chat__paginated-list\" #container>\n <div\n data-testid=\"item\"\n class=\"stream-chat__paginated-list-item\"\n *ngFor=\"let item of items; let index = index; trackBy: trackBy\"\n >\n <ng-template\n *ngIf=\"itemTempalteRef\"\n [ngTemplateOutlet]=\"itemTempalteRef\"\n [ngTemplateOutletContext]=\"{ item: item, index: index }\"\n ></ng-template>\n </div>\n <button\n *ngIf=\"hasMore && !isScrollable\"\n class=\"str-chat__load-more-button__button str-chat__cta-button\"\n data-testid=\"load-more-button\"\n [disabled]=\"isLoading\"\n (click)=\"loadMore.emit()\"\n (keyup.enter)=\"loadMore.emit()\"\n >\n <span>{{ \"Load more\" | translate }}</span>\n </button>\n <stream-loading-indicator-placeholder\n data-testid=\"loading-indicator\"\n *ngIf=\"isLoading\"\n ></stream-loading-indicator-placeholder>\n</div>\n","import { Component, OnDestroy, TemplateRef } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { Channel } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { ThemeService } from '../theme.service';\nimport { ChannelPreviewContext } from '../types';\n\n/**\n * The `ChannelList` component renders the list of channels.\n */\n@Component({\n selector: 'stream-channel-list',\n templateUrl: './channel-list.component.html',\n styles: [],\n})\nexport class ChannelListComponent implements OnDestroy {\n channels$: Observable<Channel[] | undefined>;\n isError$: Observable<boolean>;\n isInitializing$: Observable<boolean>;\n isLoadingMoreChannels = false;\n hasMoreChannels$: Observable<boolean>;\n customChannelPreviewTemplate: TemplateRef<ChannelPreviewContext> | undefined;\n theme$: Observable<string>;\n subscriptions: Subscription[] = [];\n\n constructor(\n private channelService: ChannelService,\n private customTemplatesService: CustomTemplatesService,\n private themeService: ThemeService\n ) {\n this.theme$ = this.themeService.theme$;\n this.channels$ = this.channelService.channels$;\n this.hasMoreChannels$ = this.channelService.hasMoreChannels$;\n this.isError$ = this.channelService.channelQueryState$.pipe(\n map((s) => !this.isLoadingMoreChannels && s?.state === 'error')\n );\n this.isInitializing$ = this.channelService.channelQueryState$.pipe(\n map((s) => !this.isLoadingMoreChannels && s?.state === 'in-progress')\n );\n this.subscriptions.push(\n this.customTemplatesService.channelPreviewTemplate$.subscribe(\n (template) => (this.customChannelPreviewTemplate = template)\n )\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n async loadMoreChannels() {\n this.isLoadingMoreChannels = true;\n await this.channelService.loadMoreChannels();\n this.isLoadingMoreChannels = false;\n }\n\n trackByChannelId(_: number, item: Channel) {\n return item.cid;\n }\n}\n","<div\n #container\n data-testid=\"channel-list-container\"\n class=\"str-chat str-chat-angular__channel-list str-chat__channel-list str-chat-channel-list messaging str-chat__theme-{{\n theme$ | async\n }}\"\n>\n <div\n *ngIf=\"\n (isError$ | async) === false && (isInitializing$ | async) === false;\n else statusIndicator\n \"\n class=\"str-chat__channel-list-messenger\"\n >\n <div class=\"str-chat__channel-list-messenger__main\">\n <ng-content select=\"[channel-list-top]\"></ng-content>\n <div\n *ngIf=\"!(channels$ | async)?.length\"\n class=\"str-chat__channel-list-empty\"\n >\n <stream-icon icon=\"chat-bubble\"></stream-icon>\n <p data-testid=\"empty-channel-list-indicator\">\n {{ \"streamChat.You have no channels currently\" | translate }}\n </p>\n </div>\n <p\n *ngIf=\"!(channels$ | async)?.length\"\n class=\"str-chat__channel-list-empty-v1\"\n data-testid=\"empty-channel-list-indicator\"\n >\n {{ \"streamChat.You have no channels currently\" | translate }}\n </p>\n <stream-paginated-list\n [items]=\"(channels$ | async) ?? []\"\n [hasMore]=\"(hasMoreChannels$ | async) ?? false\"\n [isLoading]=\"isLoadingMoreChannels\"\n (loadMore)=\"loadMoreChannels()\"\n [trackBy]=\"trackByChannelId\"\n >\n <ng-template let-channel=\"item\">\n <ng-template #defaultTemplate let-channelInput=\"channel\">\n <stream-channel-preview\n data-testclass=\"channel-preview\"\n [channel]=\"channelInput\"\n ></stream-channel-preview>\n </ng-template>\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n customChannelPreviewTemplate || defaultTemplate;\n context: { channel: channel }\n \"\n ></ng-container>\n </div>\n </ng-template>\n </stream-paginated-list>\n <ng-content select=\"[channel-list-bottom]\"></ng-content>\n </div>\n </div>\n</div>\n\n<ng-template #statusIndicator>\n <ng-container *ngIf=\"isError$ | async\">\n <ng-container *ngTemplateOutlet=\"chatDown\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"isInitializing$ | async\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\"></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #chatDown>\n <div data-testid=\"chatdown-container\" class=\"str-chat__down\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #loadingChannels>\n <div\n data-testid=\"loading-indicator-full-size\"\n class=\"str-chat__loading-channels\"\n >\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #loadingChannel>\n <div\n class=\"str-chat__loading-channels-item str-chat__channel-preview-loading\"\n >\n <div class=\"str-chat__loading-channels-avatar\"></div>\n <div\n class=\"str-chat__loading-channels-meta str-chat__channel-preview-end-loading\"\n >\n <div class=\"str-chat__loading-channels-username\"></div>\n <div class=\"str-chat__loading-channels-status\"></div>\n </div>\n </div>\n</ng-template>\n","export const isSafari = () =>\n /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n","export const formatDuration = (durationInSeconds?: number) => {\n if (durationInSeconds === undefined || durationInSeconds <= 0) return '00:00';\n\n const [hours, hoursLeftover] = divMod(durationInSeconds, 3600);\n const [minutes, seconds] = divMod(hoursLeftover, 60);\n const roundedSeconds = Math.ceil(seconds);\n\n const prependHrsZero = hours.toString().length === 1 ? '0' : '';\n const prependMinZero = minutes.toString().length === 1 ? '0' : '';\n const prependSecZero = roundedSeconds.toString().length === 1 ? '0' : '';\n const minSec = `${prependMinZero}${minutes}:${prependSecZero}${roundedSeconds}`;\n\n return hours ? `${prependHrsZero}${hours}:` + minSec : minSec;\n};\n\nconst divMod = (num: number, divisor: number) => {\n return [Math.floor(num / divisor), num % divisor];\n};\n","export const resampleWaveForm = (\n waveFormData: number[],\n sampleSize: number\n) => {\n return waveFormData.length > sampleSize\n ? downsample(waveFormData, sampleSize)\n : upsample(waveFormData, sampleSize);\n};\n\nconst downsample = (waveFormData: number[], sampleSize: number) => {\n if (waveFormData.length <= sampleSize) {\n return waveFormData;\n }\n\n if (sampleSize === 1) return [mean(waveFormData)];\n\n const result: number[] = [];\n // bucket size adjusted due to the fact that the first and the last item in the original data array is kept in target output\n const bucketSize = (waveFormData.length - 2) / (sampleSize - 2);\n let lastSelectedPointIndex = 0;\n result.push(waveFormData[lastSelectedPointIndex]); // Always add the first point\n let maxAreaPoint, maxArea, triangleArea;\n\n for (let bucketIndex = 1; bucketIndex < sampleSize - 1; bucketIndex++) {\n const previousBucketRefPoint = waveFormData[lastSelectedPointIndex];\n const nextBucketMean = getNextBucketMean(\n waveFormData,\n bucketIndex,\n bucketSize\n );\n\n const currentBucketStartIndex =\n Math.floor((bucketIndex - 1) * bucketSize) + 1;\n const nextBucketStartIndex = Math.floor(bucketIndex * bucketSize) + 1;\n const countUnitsBetweenAtoC =\n 1 + nextBucketStartIndex - currentBucketStartIndex;\n\n maxArea = triangleArea = -1;\n\n for (\n let currentPointIndex = currentBucketStartIndex;\n currentPointIndex < nextBucketStartIndex;\n currentPointIndex++\n ) {\n const countUnitsBetweenAtoB =\n Math.abs(currentPointIndex - currentBucketStartIndex) + 1;\n const countUnitsBetweenBtoC =\n countUnitsBetweenAtoC - countUnitsBetweenAtoB;\n const currentPointValue = waveFormData[currentPointIndex];\n\n triangleArea = triangleAreaHeron(\n triangleBase(\n Math.abs(previousBucketRefPoint - currentPointValue),\n countUnitsBetweenAtoB\n ),\n triangleBase(\n Math.abs(currentPointValue - nextBucketMean),\n countUnitsBetweenBtoC\n ),\n triangleBase(\n Math.abs(previousBucketRefPoint - nextBucketMean),\n countUnitsBetweenAtoC\n )\n );\n\n if (triangleArea > maxArea) {\n maxArea = triangleArea;\n maxAreaPoint = waveFormData[currentPointIndex];\n lastSelectedPointIndex = currentPointIndex;\n }\n }\n\n if (typeof maxAreaPoint !== 'undefined') result.push(maxAreaPoint);\n }\n\n result.push(waveFormData[waveFormData.length - 1]); // Always add the last point\n\n return result;\n};\n\nconst upsample = (waveFormData: number[], sampleSize: number) => {\n if (sampleSize === waveFormData.length) return waveFormData;\n\n // eslint-disable-next-line prefer-const\n let [bucketSize, remainder] = divMod(sampleSize, waveFormData.length);\n const result: number[] = [];\n\n for (let i = 0; i < waveFormData.length; i++) {\n const extra = remainder && remainder-- ? 1 : 0;\n result.push(...Array<number>(bucketSize + extra).fill(waveFormData[i]));\n }\n return result;\n};\n\nconst getNextBucketMean = (\n data: number[],\n currentBucketIndex: number,\n bucketSize: number\n) => {\n const nextBucketStartIndex = Math.floor(currentBucketIndex * bucketSize) + 1;\n let nextNextBucketStartIndex =\n Math.floor((currentBucketIndex + 1) * bucketSize) + 1;\n nextNextBucketStartIndex =\n nextNextBucketStartIndex < data.length\n ? nextNextBucketStartIndex\n : data.length;\n\n return mean(data.slice(nextBucketStartIndex, nextNextBucketStartIndex));\n};\n\nconst mean = (values: number[]) =>\n values.reduce((acc, value) => acc + value, 0) / values.length;\n\nconst triangleAreaHeron = (a: number, b: number, c: number) => {\n const s = (a + b + c) / 2;\n return Math.sqrt(s * (s - a) * (s - b) * (s - c));\n};\n\nconst triangleBase = (a: number, b: number) =>\n Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));\n\nconst divMod = (num: number, divisor: number) => {\n return [Math.floor(num / divisor), num % divisor];\n};\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n NgZone,\n OnChanges,\n OnInit,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { resampleWaveForm } from '../../wave-form-sampler';\n\n/**\n * This component can be used to visualize the wave bar of a voice recording\n */\n@Component({\n selector: 'stream-voice-recording-wavebar',\n templateUrl: './voice-recording-wavebar.component.html',\n styles: [],\n})\nexport class VoiceRecordingWavebarComponent\n implements OnInit, OnChanges, AfterViewInit\n{\n /**\n * The audio element that plays the voice recording\n */\n @Input() audioElement?: HTMLAudioElement;\n /**\n * The waveform data to visualize\n */\n @Input() waveFormData: number[] = [];\n /**\n * The duration of the voice recording in seconds\n */\n @Input() duration?: number;\n resampledWaveFormData: number[] = [];\n progress: number = 0;\n isDragging = false;\n private sampleSize: number = 40;\n @ViewChild('container', { static: true })\n private container?: ElementRef<HTMLElement>;\n private isViewInited = false;\n\n constructor(private ngZone: NgZone, private cdRef: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n this.containerSizeChanged();\n if (this.container?.nativeElement) {\n this.ngZone.runOutsideAngular(() => {\n new ResizeObserver(() => {\n this.containerSizeChanged();\n }).observe(this.container!.nativeElement);\n });\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.waveFormData) {\n this.resampledWaveFormData = resampleWaveForm(\n this.waveFormData,\n this.sampleSize\n );\n }\n if (changes.audioElement) {\n this.ngZone.runOutsideAngular(() => {\n this.audioElement?.addEventListener('timeupdate', () => {\n const progress =\n (this.audioElement?.currentTime || 0) / (this.duration || 0) || 0;\n if (Math.abs(progress - this.progress) >= 0.02) {\n this.ngZone.run(() => {\n this.progress = progress;\n this.cdRef.detectChanges();\n });\n }\n });\n });\n }\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n }\n\n seek(event: MouseEvent) {\n const containerWidth =\n this.container?.nativeElement?.getBoundingClientRect().width || 0;\n const containerStart =\n this.container?.nativeElement?.getBoundingClientRect()?.x || 0;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const progress = (event.x - containerStart) / containerWidth;\n\n if (!isNaN(progress) && this.audioElement) {\n const duration = this.duration || 0;\n const time = duration * progress;\n this.audioElement.currentTime = time;\n }\n }\n\n trackByIndex(index: number) {\n return index;\n }\n\n private containerSizeChanged() {\n if (!this.container?.nativeElement) {\n return;\n }\n const containerWidth = this.container.nativeElement.clientWidth;\n if (containerWidth === 0) {\n return;\n }\n const barWidth = +getComputedStyle(this.container.nativeElement)\n .getPropertyValue('--str-chat__voice-recording-amplitude-bar-width')\n .replace('px', '');\n const barGap = +getComputedStyle(this.container.nativeElement)\n .getPropertyValue('--str-chat__voice-recording-amplitude-bar-gap-width')\n .replace('px', '');\n if (!isNaN(barWidth) && !isNaN(barGap)) {\n const sampleSize = Math.floor(containerWidth / (barWidth + barGap));\n if (\n sampleSize !== this.sampleSize &&\n !isNaN(sampleSize) &&\n sampleSize !== Infinity\n ) {\n this.ngZone.run(() => {\n this.sampleSize = sampleSize;\n this.resampledWaveFormData = resampleWaveForm(\n this.waveFormData,\n this.sampleSize\n );\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n });\n }\n }\n }\n}\n","<!--eslint-disable @angular-eslint/template/click-events-have-key-events-->\n<div\n #container\n class=\"str-chat__wave-progress-bar__track\"\n data-testid=\"wave-progress-bar-track\"\n role=\"progressbar\"\n (mousedown)=\"isDragging = true\"\n (mouseup)=\"isDragging = false\"\n (mouseleave)=\"isDragging = false\"\n (mousemove)=\"isDragging ? seek($event) : null\"\n (click)=\"seek($event)\"\n>\n <!--eslint-enable @angular-eslint/template/click-events-have-key-events-->\n <div\n *ngFor=\"\n let dataPoint of resampledWaveFormData;\n let i = index;\n trackBy: trackByIndex\n \"\n class=\"str-chat__wave-progress-bar__amplitude-bar\"\n [class.str-chat__wave-progress-bar__amplitude-bar--active]=\"\n progress > i / resampledWaveFormData.length\n \"\n [style.--str-chat__wave-progress-bar__amplitude-bar-height]=\"\n dataPoint ? dataPoint * 100 + '%' : '0%'\n \"\n ></div>\n <div\n class=\"str-chat__wave-progress-bar__progress-indicator\"\n data-testid=\"wave-progress-bar-progress-indicator\"\n [ngStyle]=\"{ 'inset-inline-start': progress * 100 + '%' }\"\n ></div>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n NgZone,\n OnChanges,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { Attachment } from 'stream-chat';\nimport prettybytes from 'pretty-bytes';\nimport { formatDuration } from '../format-duration';\n\n/**\n * This component can be used to display an attachment with type `voiceRecording`. The component allows playing the attachment inside the browser.\n */\n@Component({\n selector: 'stream-voice-recording',\n templateUrl: './voice-recording.component.html',\n styles: [],\n})\nexport class VoiceRecordingComponent implements OnChanges, AfterViewInit {\n /**\n * The voice recording attachment\n */\n @Input() attachment?: Attachment;\n fileSize: string = '';\n secondsElapsedFormatted: string;\n durationFormatted: string = '';\n secondsElapsed = 0;\n isError = false;\n @ViewChild('audioElement')\n private audioElement?: ElementRef<HTMLAudioElement>;\n\n constructor(private ngZone: NgZone, private cdRef: ChangeDetectorRef) {\n this.secondsElapsedFormatted = this.getFormattedDuration(\n this.secondsElapsed\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.attachment) {\n this.fileSize = this.getFileSize();\n this.durationFormatted = this.getFormattedDuration(\n this.attachment?.duration\n );\n }\n }\n\n ngAfterViewInit(): void {\n // timeupdate fired frequntly so we optimize change detections\n this.ngZone.runOutsideAngular(() => {\n this.audioElement?.nativeElement.addEventListener('timeupdate', () => {\n const secondsElapsed = this.audioElement?.nativeElement?.ended\n ? this.attachment?.duration || 0\n : Math.round(this.audioElement?.nativeElement?.currentTime || 0);\n if (this.secondsElapsed !== secondsElapsed) {\n this.ngZone.run(() => {\n this.secondsElapsed = secondsElapsed;\n this.secondsElapsedFormatted = this.getFormattedDuration(\n this.secondsElapsed\n );\n this.cdRef.detectChanges();\n });\n }\n });\n });\n }\n\n async togglePlay() {\n if (!this.audioElement || !this.attachment?.asset_url) {\n return;\n }\n try {\n this.audioElement?.nativeElement.paused\n ? await this.audioElement.nativeElement.play()\n : this.audioElement.nativeElement.pause();\n this.isError = false;\n } catch (error) {\n this.isError = true;\n }\n }\n\n setPlaybackRate() {\n if (!this.audioElement?.nativeElement) {\n return;\n }\n let playbackRate = this.audioElement?.nativeElement?.playbackRate + 0.5;\n if (playbackRate > 2) {\n playbackRate = 1;\n }\n this.audioElement.nativeElement.playbackRate = playbackRate;\n }\n\n private getFormattedDuration(duration?: number) {\n return formatDuration(duration);\n }\n\n private getFileSize() {\n if (\n this.attachment?.file_size === undefined ||\n this.attachment?.file_size === null\n ) {\n return '';\n }\n return prettybytes(Number(this.attachment.file_size || 0));\n }\n}\n","<div\n class=\"str-chat__message-attachment__voice-recording-widget\"\n data-testid=\"voice-recording-widget\"\n [class.str-chat__message-attachment__voice-recording-widget--error]=\"isError\"\n>\n <!-- Empty event handlers to trigger change detection -->\n <audio\n #audioElement\n (play)=\"(null)\"\n (pause)=\"(null)\"\n (ended)=\"(null)\"\n (error)=\"isError = true\"\n (abort)=\"isError = true\"\n >\n <source\n data-testid=\"audio-source\"\n [src]=\"attachment?.asset_url\"\n [type]=\"attachment?.mime_type\"\n />\n </audio>\n <button\n class=\"str-chat__message-attachment-audio-widget--play-button\"\n data-testid=\"play-button\"\n (click)=\"togglePlay()\"\n >\n <stream-icon-placeholder\n [icon]=\"audioElement?.paused ? 'play' : 'pause'\"\n ></stream-icon-placeholder>\n </button>\n <div class=\"str-chat__message-attachment__voice-recording-widget__metadata\">\n <div class=\"str-chat__message-attachment-voice-recording-widget--first-row\">\n <div\n class=\"str-chat__message-attachment__voice-recording-widget__title\"\n data-testid=\"voice-recording-title\"\n [title]=\"attachment?.title\"\n >\n {{ attachment?.title }}\n </div>\n </div>\n\n <ng-container *ngIf=\"isError; else state\">\n <div\n class=\"str-chat__message-attachment__voice-recording-widget__error-message\"\n >\n <stream-icon-placeholder icon=\"error\"></stream-icon-placeholder>\n <span data-testid=\"error-message\">{{\n \"streamChat.Error playing audio\" | translate\n }}</span>\n </div>\n </ng-container>\n <ng-template #state>\n <div\n class=\"str-chat__message-attachment__voice-recording-widget__audio-state\"\n >\n <div\n class=\"str-chat__message-attachment__voice-recording-widget__timer\"\n >\n <span\n *ngIf=\"!!attachment?.duration; else fileSizeTemplate\"\n data-testid=\"duration\"\n >\n {{\n secondsElapsed > 0 || !audioElement.paused\n ? secondsElapsedFormatted\n : durationFormatted\n }}</span\n >\n <ng-template #fileSizeTemplate>\n <span\n class=\"str-chat__message-attachment-file--item-size\"\n data-testid=\"file-size-indicator\"\n >\n {{ fileSize }}\n </span>\n </ng-template>\n </div>\n <stream-voice-recording-wavebar\n *ngIf=\"attachment?.waveform_data && attachment?.duration\"\n [waveFormData]=\"attachment?.waveform_data || []\"\n [duration]=\"attachment?.duration\"\n [audioElement]=\"audioElement\"\n ></stream-voice-recording-wavebar>\n </div>\n </ng-template>\n </div>\n <div\n class=\"str-chat__message-attachment__voice-recording-widget__right-section\"\n >\n <button\n *ngIf=\"!audioElement?.paused; else fileIcon\"\n class=\"str-chat__message_attachment__playback-rate-button\"\n data-testid=\"playback-rate-button\"\n (click)=\"setPlaybackRate()\"\n >\n {{ audioElement?.playbackRate | number : \"1.1-1\" }}x\n </button>\n <ng-template #fileIcon>\n <stream-icon-placeholder\n class=\"str-chat__attachment-type-icon\"\n icon=\"audio-file\"\n ></stream-icon-placeholder>\n </ng-template>\n </div>\n</div>\n","import {\n Component,\n EventEmitter,\n HostBinding,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { Action, Attachment } from 'stream-chat';\nimport {\n ModalContext,\n AttachmentConfigration,\n VideoAttachmentConfiguration,\n ImageAttachmentConfiguration,\n AttachmentContext,\n CustomAttachmentListContext,\n GalleryAttachment,\n} from '../types';\nimport prettybytes from 'pretty-bytes';\nimport { isImageAttachment } from '../is-image-attachment';\nimport { ChannelService } from '../channel.service';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { AttachmentConfigurationService } from '../attachment-configuration.service';\nimport { Subscription } from 'rxjs';\nimport { MessageService } from '../message.service';\n\n/**\n * The `AttachmentList` component displays the attachments of a message\n */\n@Component({\n selector: 'stream-attachment-list',\n templateUrl: './attachment-list.component.html',\n styles: [],\n})\nexport class AttachmentListComponent implements OnChanges, OnInit, OnDestroy {\n /**\n * The id of the message the attachments belong to\n */\n @Input() messageId: string | undefined;\n /**\n * The parent id of the message the attachments belong to\n */\n @Input() parentMessageId: string | undefined;\n /**\n * The attachments to display\n */\n @Input() attachments: Attachment[] = [];\n /**\n * Emits the state of the image carousel window\n */\n @Output() readonly imageModalStateChange = new EventEmitter<\n 'opened' | 'closed'\n >();\n @HostBinding() class = 'str-chat__attachment-list-angular-host';\n orderedAttachments: (Attachment | GalleryAttachment)[] = [];\n customAttachments: Attachment[] = [];\n imagesToView: Attachment[] = [];\n imagesToViewCurrentIndex = 0;\n customAttachmentsTemplate?: TemplateRef<CustomAttachmentListContext>;\n @ViewChild('modalContent', { static: true })\n private modalContent!: TemplateRef<void>;\n private attachmentConfigurations: Map<\n Attachment,\n | AttachmentConfigration\n | VideoAttachmentConfiguration\n | ImageAttachmentConfiguration\n > = new Map();\n private subscriptions: Subscription[] = [];\n\n constructor(\n public readonly customTemplatesService: CustomTemplatesService,\n private channelService: ChannelService,\n private attachmentConfigurationService: AttachmentConfigurationService,\n private messageService: MessageService\n ) {}\n\n trackByUrl = (_: number, attachment: Attachment | GalleryAttachment) => {\n return this.isGalleryType(attachment)\n ? attachment.images.map(this.getAttachmentUrl).join(',')\n : this.getAttachmentUrl(attachment);\n };\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.customTemplatesService.customAttachmentListTemplate$.subscribe(\n (t) => (this.customAttachmentsTemplate = t)\n )\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.attachments) {\n const builtInAttachments: Attachment[] = [];\n const customAttachments: Attachment[] = [];\n this.attachments.forEach((a) => {\n if (this.messageService.isCustomAttachment(a)) {\n customAttachments.push(a);\n } else {\n builtInAttachments.push(a);\n }\n });\n const images = builtInAttachments.filter(this.isImage);\n const containsGallery = images.length >= 2;\n this.orderedAttachments = [\n ...(containsGallery ? this.createGallery(images) : images),\n ...builtInAttachments.filter((a) => this.isVideo(a)),\n ...builtInAttachments.filter((a) => this.isVoiceMessage(a)),\n ...builtInAttachments.filter((a) => this.isFile(a)),\n ];\n this.attachmentConfigurations = new Map();\n // Display link attachments only if there are no other attachments\n // Giphy-s always sent without other attachments\n if (this.orderedAttachments.length === 0) {\n this.orderedAttachments.push(\n ...builtInAttachments.filter((a) => this.isCard(a))\n );\n }\n this.customAttachments = customAttachments;\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n isImage(attachment: Attachment) {\n return isImageAttachment(attachment);\n }\n\n isSvg(attachment: Attachment) {\n const filename = attachment.fallback || '';\n return !!filename.toLowerCase().endsWith('.svg');\n }\n\n isFile(attachment: Attachment) {\n return attachment.type === 'file';\n }\n\n isGallery(attachment: Attachment) {\n return attachment.type === 'gallery';\n }\n\n isVideo(attachment: Attachment) {\n return (\n attachment.type === 'video' &&\n attachment.asset_url &&\n !attachment.og_scrape_url\n );\n }\n\n isCard(attachment: Attachment) {\n return (\n !attachment.type ||\n (attachment.type === 'image' && !this.isImage(attachment)) ||\n attachment.type === 'giphy' ||\n (attachment.type === 'video' && attachment.og_scrape_url)\n );\n }\n\n isVoiceMessage(attachment: Attachment) {\n return attachment.type === 'voiceRecording';\n }\n\n hasFileSize(attachment: Attachment) {\n return (\n attachment.file_size && Number.isFinite(Number(attachment.file_size))\n );\n }\n\n getFileSize(attachment: Attachment) {\n return prettybytes(Number(attachment.file_size!));\n }\n\n getModalContext(): ModalContext {\n return {\n isOpen: this.imagesToView && this.imagesToView.length > 0,\n isOpenChangeHandler: (isOpen) => (isOpen ? null : this.closeImageModal()),\n content: this.modalContent,\n };\n }\n\n trimUrl(url?: string | null) {\n if (url !== undefined && url !== null) {\n const [trimmedUrl] = url\n .replace(/^(?:https?:\\/\\/)?(?:www\\.)?/i, '')\n .split('/');\n\n return trimmedUrl;\n }\n return null;\n }\n\n sendAction(action: Action) {\n void this.channelService.sendAction(\n this.messageId!,\n {\n [action.name!]: action.value!,\n },\n this.parentMessageId\n );\n }\n\n trackByActionValue(_: number, item: Action) {\n return item.value;\n }\n\n openImageModal(attachments: Attachment[], selectedIndex = 0) {\n this.imageModalStateChange.next('opened');\n this.imagesToView = attachments;\n this.imagesToViewCurrentIndex = selectedIndex;\n }\n\n stepImages(dir: -1 | 1) {\n this.imagesToViewCurrentIndex += dir * 1;\n }\n\n trackByImageUrl(_: number, item: Attachment) {\n return item.image_url || item.img_url || item.thumb_url;\n }\n\n getAttachmentContext(attachment: Attachment): AttachmentContext {\n return { attachment };\n }\n\n getImageAttachmentConfiguration(\n attachment: Attachment,\n type: 'gallery' | 'single',\n element: HTMLElement\n ): ImageAttachmentConfiguration {\n const existingConfiguration = this.attachmentConfigurations.get(attachment);\n if (existingConfiguration) {\n return existingConfiguration as ImageAttachmentConfiguration;\n }\n const configuration =\n this.attachmentConfigurationService.getImageAttachmentConfiguration(\n attachment,\n type,\n element\n );\n this.attachmentConfigurations.set(attachment, configuration);\n return configuration;\n }\n\n getCarouselImageAttachmentConfiguration(\n attachment: Attachment,\n element: HTMLElement\n ) {\n return this.attachmentConfigurationService.getImageAttachmentConfiguration(\n attachment,\n 'carousel',\n element\n );\n }\n\n getVideoAttachmentConfiguration(\n attachment: Attachment,\n element: HTMLElement\n ): VideoAttachmentConfiguration {\n const existingConfiguration = this.attachmentConfigurations.get(attachment);\n if (existingConfiguration) {\n return existingConfiguration as VideoAttachmentConfiguration;\n }\n const configuration =\n this.attachmentConfigurationService.getVideoAttachmentConfiguration(\n attachment,\n element\n );\n this.attachmentConfigurations.set(attachment, configuration);\n return configuration;\n }\n\n getCardAttachmentConfiguration(attachment: Attachment) {\n const existingConfiguration = this.attachmentConfigurations.get(attachment);\n if (existingConfiguration) {\n return existingConfiguration;\n }\n if (attachment.type === 'giphy') {\n return this.attachmentConfigurationService.getGiphyAttachmentConfiguration(\n attachment\n );\n } else {\n const configuration =\n this.attachmentConfigurationService.getScrapedImageAttachmentConfiguration(\n attachment\n );\n this.attachmentConfigurations.set(attachment, configuration);\n return configuration;\n }\n }\n\n isGalleryType(\n attachment: Attachment | GalleryAttachment\n ): attachment is GalleryAttachment {\n return attachment.type === 'gallery';\n }\n\n get isImageModalPrevButtonVisible() {\n return this.imagesToViewCurrentIndex !== 0;\n }\n\n get isImageModalNextButtonVisible() {\n return this.imagesToViewCurrentIndex !== this.imagesToView.length - 1;\n }\n\n private createGallery(images: Attachment[]): GalleryAttachment[] {\n return [\n {\n type: 'gallery',\n images,\n },\n ];\n }\n\n private closeImageModal() {\n this.imageModalStateChange.next('closed');\n this.imagesToView = [];\n }\n\n private getAttachmentUrl(attachment: Attachment) {\n return (\n attachment.image_url ||\n attachment.img_url ||\n attachment.asset_url ||\n attachment.thumb_url\n );\n }\n}\n","<div\n *ngIf=\"\n orderedAttachments.length > 0 ||\n (customAttachments.length > 0 && customAttachmentsTemplate)\n \"\n class=\"str-chat__attachment-list\"\n>\n <ng-container\n *ngFor=\"let attachment of orderedAttachments; trackBy: trackByUrl\"\n >\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }} str-chat__message-attachment-dynamic-size\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n [class.str-chat__message-attachment--voice-recording]=\"\n isVoiceMessage(attachment)\n \"\n [class.str-chat__message-attachment-with-actions]=\"\n !isGalleryType(attachment) &&\n attachment.actions &&\n attachment.actions.length > 0\n \"\n [class.str-chat__message-attachment--svg-image]=\"isSvg(attachment)\"\n >\n <ng-container *ngIf=\"isImage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.imageAttachmentTemplate$ | async) ||\n defaultImage;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultImage let-attachmentContext=\"attachment\">\n <img\n #imgElement\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"\n getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).url\n \"\n [alt]=\"attachmentContext?.fallback\"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalWidth\n }\"\n (click)=\"openImageModal([attachmentContext])\"\n (keyup.enter)=\"openImageModal([attachmentContext])\"\n />\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isGallery(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.galleryAttachmentTemplate$ | async) ||\n defaultGallery;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultGallery let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__gallery\"\n data-testid=\"image-gallery\"\n [class.str-chat__gallery--square]=\"\n (attachmentContext?.images)!.length > 3\n \"\n [class.str-chat__gallery-two-rows]=\"\n (attachmentContext?.images)!.length > 2\n \"\n >\n <ng-container\n *ngFor=\"\n let galleryImage of attachmentContext.images;\n let index = index;\n let isLast = last;\n trackBy: trackByImageUrl\n \"\n >\n <button\n *ngIf=\"index < 3 || (index === 3 && isLast)\"\n class=\"str-chat__gallery-image\"\n data-testclass=\"gallery-image\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <img\n #imgElement\n fetchpriority=\"low\"\n loading=\"lazy\"\n [src]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).url\n \"\n [alt]=\"galleryImage.fallback\"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalWidth\n \"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).width\n }\"\n />\n </button>\n <button\n *ngIf=\"index === 3 && !isLast\"\n #element\n class=\"str-chat__gallery-placeholder\"\n data-testclass=\"gallery-image\"\n data-testid=\"more-image-button\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n [ngStyle]=\"{\n 'background-image':\n 'url(' +\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).url +\n ')',\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalWidth\n }\"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <p\n [innerHTML]=\"\n 'streamChat.{{ imageCount }} more'\n | translate\n : { imageCount: attachmentContext!.images!.length - 4 }\n \"\n ></p>\n </button>\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVideo(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.videoAttachmentTemplate$ | async) ||\n defaultVideo;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultVideo let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__player-wrapper\"\n data-testclass=\"video-attachment-parent\"\n [style.--original-height]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalHeight\n \"\n [style.--original-width]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalWidth\n \"\n [ngStyle]=\"{\n height: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).height,\n width: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).width\n }\"\n >\n <video\n #videoElement\n class=\"str-chat__video-angular\"\n controls\n data-testclass=\"video-attachment\"\n [src]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .url\n \"\n [poster]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .thumbUrl\n \"\n ></video>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isFile(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.fileAttachmentTemplate$ | async) ||\n defaultFile;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultFile let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-file--item str-chat-angular__message-attachment-file-single\"\n >\n <stream-icon-placeholder\n class=\"str-chat__attachment-type-icon\"\n icon=\"unspecified-filetype\"\n ></stream-icon-placeholder>\n <div class=\"str-chat__message-attachment-file--item-text\">\n <a\n class=\"str-chat__message-attachment-file--item-first-row\"\n data-testclass=\"file-link\"\n target=\"_blank\"\n href=\"{{ attachmentContext.asset_url }}\"\n >\n <div\n data-testclass=\"file-title\"\n class=\"str-chat__message-attachment-file--item-name\"\n >\n {{ attachmentContext.title }}\n </div>\n <stream-icon-placeholder\n class=\"str-chat__message-attachment-download-icon\"\n icon=\"download\"\n ></stream-icon-placeholder>\n </a>\n <span\n *ngIf=\"hasFileSize(attachmentContext)\"\n class=\"str-chat__message-attachment-file--item-size\"\n data-testclass=\"size\"\n >{{ getFileSize(attachmentContext) }}</span\n >\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVoiceMessage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.voiceRecordingAttachmentTemplate$\n | async) || defaultRecording;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultRecording>\n <stream-voice-recording\n data-testclass=\"voice-recording\"\n [attachment]=\"attachment\"\n ></stream-voice-recording>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"\n isCard(attachment) &&\n getCardAttachmentConfiguration(attachment) as attachmentConfiguration\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.cardAttachmentTemplate$ | async) ||\n defaultCard;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultCard let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-card str-chat__message-attachment-card--{{\n attachmentContext.type\n }}\"\n >\n <div\n *ngIf=\"attachmentConfiguration.url\"\n class=\"str-chat__message-attachment-card--header\"\n >\n <a\n *ngIf=\"attachmentContext.type === 'video'; else cardImage\"\n [href]=\"\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n \"\n target=\"_blank\"\n data-testclass=\"scraped-video\"\n >\n <ng-content *ngTemplateOutlet=\"cardImage\"></ng-content>\n <div\n class=\"str-chat__message-attachment-card--video-play\"\n ></div>\n <stream-icon-placeholder icon=\"play\"></stream-icon-placeholder>\n </a>\n <ng-template #cardImage>\n <img\n fetchpriority=\"low\"\n loading=\"lazy\"\n data-testclass=\"card-img\"\n alt=\"{{ attachmentConfiguration.url }}\"\n src=\"{{ attachmentConfiguration.url }}\"\n [ngStyle]=\"{\n height: attachmentConfiguration.height,\n width: attachmentConfiguration.width\n }\"\n />\n </ng-template>\n </div>\n <div class=\"str-chat__message-attachment-card--content\">\n <div class=\"str-chat__message-attachment-card--flex\">\n <div\n *ngIf=\"attachmentContext.title\"\n data-testclass=\"card-title\"\n class=\"str-chat__message-attachment-card--title\"\n >\n {{ attachmentContext.title }}\n </div>\n <div\n *ngIf=\"attachmentContext.text\"\n class=\"str-chat__message-attachment-card--text\"\n data-testclass=\"card-text\"\n >\n {{ attachmentContext.text }}\n </div>\n <a\n *ngIf=\"\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n \"\n class=\"str-chat__message-attachment-card--url\"\n data-testclass=\"url-link\"\n noopener\n noreferrer\n target=\"_blank\"\n href=\"{{\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n }}\"\n >\n {{\n trimUrl(\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n )\n }}\n </a>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"\n !isGalleryType(attachment) &&\n attachment.actions &&\n attachment.actions.length > 0\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentActionsTemplate$ | async) ||\n defaultActions;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultActions let-attachmentContext=\"attachment\">\n <div class=\"str-chat__message-attachment-actions\">\n <div class=\"str-chat__message-attachment-actions-form\">\n <button\n *ngFor=\"\n let action of attachmentContext.actions;\n trackBy: trackByActionValue\n \"\n data-testclass=\"attachment-action\"\n class=\"str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--{{\n action.style\n }}\"\n (click)=\"sendAction(action)\"\n (keyup.enter)=\"sendAction(action)\"\n >\n {{ action.text }}\n </button>\n </div>\n </div>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"customAttachmentsTemplate\">\n <ng-template\n *ngTemplateOutlet=\"\n customAttachmentsTemplate;\n context: {\n messageId: messageId,\n parentMessageId: parentMessageId,\n attachments: customAttachments\n }\n \"\n ></ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"imagesToView && imagesToView.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getModalContext()\n \"\n ></ng-container>\n </ng-container>\n</div>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"stream-chat-angular__image-modal-host\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"stream-chat-angular__image-modal str-chat__image-carousel\">\n <img\n #imgElement\n class=\"stream-chat-angular__image-modal-image str-chat__image-carousel-image\"\n data-testid=\"modal-image\"\n [src]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).url\n \"\n [style.--original-height]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalWidth\n \"\n [alt]=\"imagesToView[imagesToViewCurrentIndex].fallback\"\n [ngStyle]=\"{\n width: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).width,\n height: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).height\n }\"\n />\n <div>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-prev\"\n data-testid=\"image-modal-prev\"\n type=\"button\"\n [ngStyle]=\"{\n visibility: isImageModalPrevButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(-1)\"\n (keyup.enter)=\"stepImages(-1)\"\n >\n <stream-icon-placeholder icon=\"arrow-left\"></stream-icon-placeholder>\n </button>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-next\"\n type=\"button\"\n data-testid=\"image-modal-next\"\n [ngStyle]=\"{\n visibility: isImageModalNextButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(1)\"\n (keyup.enter)=\"stepImages(1)\"\n >\n <stream-icon-placeholder icon=\"arrow-right\"></stream-icon-placeholder>\n </button>\n </div>\n </div>\n</ng-template>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { UserResponse } from 'stream-chat';\n\n/**\n * The `UserListComponent` can display a list of Stream users with pagination\n */\n@Component({\n selector: 'stream-user-list',\n templateUrl: './user-list.component.html',\n styles: [],\n})\nexport class UserListComponent {\n /**\n * The users to display\n */\n @Input() users: UserResponse[] = [];\n /**\n * If `true`, the loading indicator will be displayed\n */\n @Input() isLoading = false;\n /**\n * If `false` the component won't ask for more data vua the `loadMore` output\n */\n @Input() hasMore = false;\n /**\n * The component will signal via this output when more items should be fetched\n *\n * The new items should be appended to the `items` array\n */\n @Output() readonly loadMore = new EventEmitter<void>();\n\n trackByUserId(_: number, item: UserResponse) {\n return item.id;\n }\n}\n","<stream-paginated-list\n [items]=\"users\"\n [hasMore]=\"hasMore\"\n (loadMore)=\"loadMore.emit()\"\n [isLoading]=\"isLoading\"\n [trackBy]=\"trackByUserId\"\n>\n <ng-template let-user=\"item\">\n <div class=\"str-chat__user-list-item\">\n <stream-avatar-placeholder\n data-testclass=\"avatar\"\n class=\"str-chat__avatar str-chat__avatar--circle\"\n type=\"user\"\n location=\"reaction\"\n [imageUrl]=\"user.image\"\n [name]=\"user.name\"\n [user]=\"user\"\n ></stream-avatar-placeholder>\n <span data-testclass=\"username\" class=\"str-chat__user-item--name\">{{\n user.name\n }}</span>\n </div>\n </ng-template>\n</stream-paginated-list>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {\n ReactionGroupResponse,\n ReactionResponse,\n UserResponse,\n} from 'stream-chat';\nimport { MessageReactionType } from '../types';\nimport { MessageReactionsService } from '../message-reactions.service';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { Subscription } from 'rxjs';\n\n/**\n * The `MessageReactions` component displays the reactions of a message. You can read more about [message reactions](/chat/docs/javascript/send_reaction/) in the platform documentation.\n */\n@Component({\n selector: 'stream-message-reactions',\n templateUrl: './message-reactions.component.html',\n})\nexport class MessageReactionsComponent\n implements OnChanges, OnInit, AfterViewInit, OnDestroy\n{\n /**\n * The id of the message the reactions belong to\n */\n @Input() messageId: string | undefined;\n /**\n * The number of reactions grouped by [reaction types](https://github.com/GetStream/stream-chat-angular/tree/master/projects/stream-chat-angular/src/lib/message-reactions/message-reactions.component.ts)\n */\n @Input() messageReactionGroups:\n | { [key: string]: ReactionGroupResponse }\n | undefined = undefined;\n /**\n * The number of reactions grouped by [reaction types](https://github.com/GetStream/stream-chat-angular/tree/master/projects/stream-chat-angular/src/lib/message-reactions/message-reactions.component.ts)\n * @deprecated use `messageReactionGroups`\n */\n @Input() messageReactionCounts: { [key in MessageReactionType]?: number } =\n {};\n /**\n * List of reactions of a [message](/chat/docs/sdk/angular/types/stream-message/), used to display the users of a reaction type.\n * @deprecated you can fetch the reactions using [`messageReactionsService.queryReactions()`](/chat/docs/sdk/angular/services/MessageReactionsService/#queryreactions)\n */\n @Input() latestReactions: ReactionResponse[] = [];\n /**\n * List of the user's own reactions of a [message](/chat/docs/sdk/angular/types/stream-message/), used to display the users of a reaction type.\n */\n @Input() ownReactions: ReactionResponse[] = [];\n @ViewChild('selectorContainer') private selectorContainer:\n | ElementRef<HTMLElement>\n | undefined;\n selectedReactionType: string | undefined;\n isLoading = true;\n reactions: ReactionResponse[] = [];\n shouldHandleReactionClick = true;\n existingReactions: string[] = [];\n reactionOptions: string[] = [];\n usersByReactions: {\n [key: string]: { users: UserResponse[]; next?: string };\n } = {};\n private subscriptions: Subscription[] = [];\n private isViewInited = false;\n\n constructor(\n private cdRef: ChangeDetectorRef,\n private messageReactionsService: MessageReactionsService,\n public customTemplatesService: CustomTemplatesService\n ) {}\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.messageReactionsService.reactions$.subscribe((reactions) => {\n this.reactionOptions = Object.keys(reactions);\n this.setExistingReactions();\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n })\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.messageReactionCounts || changes.messageReactionGroups) {\n if (this.messageReactionCounts && !this.messageReactionGroups) {\n this.messageReactionGroups = {};\n Object.keys(this.messageReactionCounts).forEach((k) => {\n this.messageReactionGroups![k] = {\n count: this.messageReactionCounts?.[k] ?? 0,\n sum_scores: this.messageReactionCounts?.[k] ?? 0,\n first_reaction_at: undefined,\n last_reaction_at: undefined,\n };\n });\n }\n this.setExistingReactions();\n }\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n getEmojiByReaction(reactionType: MessageReactionType) {\n return this.messageReactionsService.reactions[reactionType];\n }\n\n async reactionSelected(reactionType: string) {\n if (!this.messageId) {\n return;\n }\n if (this.messageReactionsService.customReactionClickHandler) {\n this.messageReactionsService.customReactionClickHandler({\n messageId: this.messageId,\n reactionType: reactionType,\n });\n } else {\n this.selectedReactionType = reactionType;\n if (!this.usersByReactions[this.selectedReactionType]) {\n this.usersByReactions[this.selectedReactionType] = {\n users: [],\n };\n await this.loadNextPageOfReactions();\n }\n }\n }\n\n async loadNextPageOfReactions() {\n if (!this.messageId || !this.selectedReactionType) {\n return;\n }\n\n this.isLoading = true;\n try {\n const response = await this.messageReactionsService.queryReactions(\n this.messageId,\n this.selectedReactionType,\n this.usersByReactions[this.selectedReactionType].next\n );\n this.usersByReactions[this.selectedReactionType].users = [\n ...this.usersByReactions[this.selectedReactionType].users,\n ...(response.reactions\n .map((r) => r.user)\n .filter((u) => !!u) as UserResponse[]),\n ];\n this.usersByReactions[this.selectedReactionType].next = response.next;\n } catch (_) {\n this.selectedReactionType = undefined;\n } finally {\n this.isLoading = false;\n }\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n\n trackByMessageReaction(_: number, item: MessageReactionType) {\n return item;\n }\n\n isOwnReaction(reactionType: MessageReactionType) {\n return !!this.ownReactions.find((r) => r.type === reactionType);\n }\n\n isOpenChange = (isOpen: boolean) => {\n this.selectedReactionType = isOpen ? this.selectedReactionType : undefined;\n if (!isOpen) {\n this.usersByReactions = {};\n }\n };\n\n private setExistingReactions() {\n this.existingReactions = Object.keys(this.messageReactionGroups ?? {})\n .filter((k) => this.reactionOptions.indexOf(k) !== -1)\n .filter((k) => this.messageReactionGroups![k].count > 0)\n .sort((r1, r2) => {\n const date1 = this.messageReactionGroups![r1].first_reaction_at\n ? new Date(this.messageReactionGroups![r1].first_reaction_at!)\n : new Date();\n const date2 = this.messageReactionGroups![r2].first_reaction_at\n ? new Date(this.messageReactionGroups![r2].first_reaction_at!)\n : new Date();\n\n return date1.getTime() - date2.getTime();\n });\n }\n}\n","<div\n *ngIf=\"existingReactions.length > 0\"\n data-testid=\"reaction-list\"\n class=\"str-chat__reaction-list str-chat__message-reactions-container\"\n [class.str-chat__reaction-list--reverse]=\"true\"\n>\n <ul class=\"str-chat__message-reactions\">\n <li\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n class=\"str-chat__message-reaction\"\n data-testclass=\"emoji\"\n [class.str-chat__message-reaction-own]=\"isOwnReaction(reactionType)\"\n (click)=\"reactionSelected(reactionType)\"\n (keyup.enter)=\"reactionSelected(reactionType)\"\n >\n <span class=\"emoji str-chat__message-reaction-emoji\">\n {{ getEmojiByReaction(reactionType) }} \n </span>\n <span\n data-testclass=\"reaction-list-reaction-count\"\n class=\"str-chat__message-reaction-count\"\n >\n {{ messageReactionGroups?.[reactionType]?.count ?? 0 }}\n </span>\n </li>\n </ul>\n</div>\n\n<ng-container *ngIf=\"selectedReactionType\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: {\n isOpen: !!selectedReactionType,\n messageId: messageId,\n reactionType: selectedReactionType,\n isOpenChangeHandler: isOpenChange,\n content: modalContent\n }\n \"\n ></ng-container>\n</ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-messageId=\"messageId\"\n let-reactionType=\"reactionType\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"str-chat__message-reactions-details-modal\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"str-chat__message-reactions-details\">\n <div class=\"str-chat__message-reactions-details-reaction-types\">\n <div\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n class=\"str-chat__message-reactions-details-reaction-type\"\n attr.data-testid=\"reaction-details-selector-{{ reactionType }}\"\n [class.str-chat__message-reactions-details-reaction-type--selected]=\"\n reactionType === selectedReactionType\n \"\n (click)=\"reactionSelected(reactionType)\"\n (keyup.enter)=\"reactionSelected(reactionType)\"\n >\n <span class=\"emoji str-chat__message-reaction-emoji\">\n {{ getEmojiByReaction(reactionType) }} \n </span>\n <span class=\"str-chat__message-reaction-count\">\n {{ messageReactionGroups?.[reactionType]?.count ?? 0 }}\n </span>\n </div>\n </div>\n <div\n class=\"emoji str-chat__message-reaction-emoji str-chat__message-reaction-emoji-big\"\n >\n {{ getEmojiByReaction(selectedReactionType!) }}\n </div>\n <div\n data-testid=\"all-reacting-users\"\n class=\"str-chat__message-reactions-details-reacting-users\"\n >\n <ng-container\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n >\n <stream-user-list\n attr.data-testid=\"{{ reactionType }}-user-list\"\n [style.display]=\"\n selectedReactionType === reactionType ? 'block' : 'none'\n \"\n [users]=\"usersByReactions[reactionType]?.users || []\"\n [isLoading]=\"isLoading\"\n [hasMore]=\"!!usersByReactions[reactionType]?.next || false\"\n (loadMore)=\"loadNextPageOfReactions()\"\n ></stream-user-list>\n </ng-container>\n </div>\n </div>\n</ng-template>\n","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { MentionTemplateContext, StreamMessage } from '../types';\nimport { UserResponse } from 'stream-chat';\nimport emojiRegex from 'emoji-regex';\nimport { MessageService } from '../message.service';\nimport { CustomTemplatesService } from '../custom-templates.service';\n\ntype MessagePart = {\n content: string;\n type: 'text' | 'mention';\n user?: UserResponse;\n};\n\n/**\n * The `MessageTextComponent` displays the text content of a message.\n */\n@Component({\n selector: 'stream-message-text',\n templateUrl: './message-text.component.html',\n styles: [],\n})\nexport class MessageTextComponent implements OnChanges {\n /**\n * The message which text should be displayed\n */\n @Input() message: StreamMessage | undefined | StreamMessage['quoted_message'];\n /**\n * `true` if the component displayes a message quote\n */\n @Input() isQuoted: boolean = false;\n /**\n * `true` if the\n */\n @Input() shouldTranslate: boolean = false;\n messageTextParts: MessagePart[] | undefined = [];\n messageText?: string;\n displayAs: 'text' | 'html';\n private readonly urlRegexp: RegExp;\n private emojiRegexp = new RegExp(emojiRegex(), 'g');\n\n constructor(\n private messageService: MessageService,\n readonly customTemplatesService: CustomTemplatesService\n ) {\n this.displayAs = this.messageService.displayAs;\n try {\n this.urlRegexp = new RegExp(\n '(?:(?:https?|ftp|file):\\\\/\\\\/|www\\\\.|ftp\\\\.|(?:[a-zA-Z0-9-]+\\\\.)+[a-zA-Z]{2,})(?![^\\\\s]*@[^\\\\s]*)(?:[^\\\\s()<>]+|\\\\([\\\\w\\\\d]+\\\\))*(?<!@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,})',\n 'gim'\n );\n } catch {\n this.urlRegexp =\n /(?:(?:https?|ftp|file):\\/\\/|www\\.|ftp\\.)(?:\\([-A-Z0-9+&@#/%=~_|$?!:,.]*\\)|[-A-Z0-9+&@#/%=~_|$?!:,.])*(?:\\([-A-Z0-9+&@#/%=~_|$?!:,.]*\\)|[A-Z0-9+&@#/%=~_|$])/gim;\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.message || changes.shouldTranslate) {\n this.createMessageParts();\n }\n }\n\n getMentionContext(messagePart: MessagePart): MentionTemplateContext {\n return {\n content: messagePart.content,\n user: messagePart.user!,\n };\n }\n\n private createMessageParts() {\n this.messageTextParts = undefined;\n this.messageText = undefined;\n let content = this.getMessageContent();\n if (\n (!this.message!.mentioned_users ||\n this.message!.mentioned_users.length === 0) &&\n !content?.match(this.emojiRegexp) &&\n !content?.match(this.urlRegexp)\n ) {\n this.messageTextParts = undefined;\n this.messageText = content;\n return;\n }\n if (!content) {\n return;\n }\n if (\n !this.message!.mentioned_users ||\n this.message!.mentioned_users.length === 0\n ) {\n content = this.fixEmojiDisplay(content);\n content = this.wrapLinksWithAnchorTag(content);\n this.messageTextParts = [{ content, type: 'text' }];\n } else {\n this.messageTextParts = [];\n let text = content;\n this.message!.mentioned_users.forEach((user) => {\n const mention = `@${user.name || user.id}`;\n const precedingText = text.substring(0, text.indexOf(mention));\n let formattedPrecedingText = this.fixEmojiDisplay(precedingText);\n formattedPrecedingText = this.wrapLinksWithAnchorTag(\n formattedPrecedingText\n );\n this.messageTextParts!.push({\n content: formattedPrecedingText,\n type: 'text',\n });\n this.messageTextParts!.push({\n content: mention,\n type: 'mention',\n user,\n });\n text = text.replace(precedingText + mention, '');\n });\n if (text) {\n text = this.fixEmojiDisplay(text);\n text = this.wrapLinksWithAnchorTag(text);\n this.messageTextParts.push({ content: text, type: 'text' });\n }\n }\n }\n\n private getMessageContent() {\n const originalContent = this.message?.text;\n if (this.shouldTranslate) {\n const translation = this.message?.translation;\n return translation || originalContent;\n } else {\n return originalContent;\n }\n }\n\n private fixEmojiDisplay(content: string) {\n // Wrap emojis in span to display emojis correctly in Chrome https://bugs.chromium.org/p/chromium/issues/detail?id=596223\n // Based on this: https://stackoverflow.com/questions/4565112/javascript-how-to-find-out-if-the-user-browser-is-chrome\n /* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */\n const isChrome =\n !!(window as any).chrome && typeof (window as any).opr === 'undefined';\n /* eslint-enable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */\n content = content.replace(\n this.emojiRegexp,\n (match) =>\n `<span ${\n isChrome ? 'class=\"str-chat__emoji-display-fix\"' : ''\n }>${match}</span>`\n );\n\n return content;\n }\n\n private wrapLinksWithAnchorTag(content: string) {\n if (this.displayAs === 'html') {\n return content;\n }\n content = content.replace(this.urlRegexp, (match) => {\n if (this.messageService.customLinkRenderer) {\n return this.messageService.customLinkRenderer(match);\n } else {\n let href = match;\n if (\n !href.startsWith('http') &&\n !href.startsWith('ftp') &&\n !href.startsWith('file')\n ) {\n href = `https://${match}`;\n }\n return `<a href=\"${href}\" target=\"_blank\" rel=\"nofollow\">${match}</a>`;\n }\n });\n\n return content;\n }\n}\n","<p\n [class.str-chat__quoted-message-text-value]=\"isQuoted\"\n [class.str-chat__message-text-value]=\"!isQuoted\"\n *ngIf=\"message?.text\"\n data-testid=\"text\"\n>\n <ng-container *ngIf=\"messageTextParts; else defaultContent\">\n <!-- eslint-disable-next-line @angular-eslint/template/use-track-by-function -->\n <ng-container *ngFor=\"let part of messageTextParts\">\n <span\n *ngIf=\"part.type === 'text'; else mention\"\n [innerHTML]=\"part.content\"\n ></span>\n <ng-template #mention>\n <ng-template #defaultMention let-content=\"content\">\n <span class=\"str-chat__message-mention\">{{ content }}</span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.mentionTemplate$ | async) || defaultMention;\n context: getMentionContext(part)\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #defaultContent>\n <ng-container *ngIf=\"displayAs === 'text'; else asHTML\">\n {{ messageText || \"\" }}\n </ng-container>\n <ng-template #asHTML\n ><span data-testid=\"html-content\" [innerHTML]=\"messageText\"></span\n ></ng-template>\n </ng-template>\n</p>\n","import { Component, ChangeDetectionStrategy, Input } from '@angular/core';\nimport { StreamMessage } from '../types';\n\n/**\n * The `MessageBlocked` component displays a message that has been blocked by moderation policies.\n */\n@Component({\n selector: 'stream-message-blocked',\n templateUrl: './message-blocked.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageBlockedComponent {\n /**\n * The message that has been blocked.\n */\n @Input() message: StreamMessage | undefined;\n /**\n * Whether the message is the current user's own message.\n */\n @Input() isMyMessage = false;\n}\n","<div\n class=\"str-chat__message str-chat__message-simple str-chat__message--blocked\"\n [class.str-chat__message--me]=\"isMyMessage\"\n [class.str-chat__message-simple--me]=\"isMyMessage\"\n [class.str-chat__message--other]=\"!isMyMessage\"\n [attr.data-testid]=\"'message-blocked-component'\"\n>\n <div class=\"str-chat__message--blocked-inner\">\n {{ \"streamChat.Message was blocked by moderation policies\" | translate }}\n </div>\n</div>\n","import {\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n OnDestroy,\n OnInit,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n AfterViewInit,\n ViewChild,\n ElementRef,\n NgZone,\n} from '@angular/core';\nimport { Attachment, UserResponse } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { ChatClientService } from '../chat-client.service';\nimport {\n AttachmentListContext,\n MessageActionsBoxContext,\n MessageReactionsContext,\n StreamMessage,\n DeliveredStatusContext,\n SendingStatusContext,\n ReadStatusContext,\n SystemMessageContext,\n CustomMetadataContext,\n MessageTextContext,\n MessageBlockedContext,\n} from '../types';\nimport { Observable, pairwise, Subscription, take } from 'rxjs';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { listUsers } from '../list-users';\nimport { DateParserService } from '../date-parser.service';\nimport { MessageActionsService } from '../message-actions.service';\nimport {\n NgxFloatUiContentComponent,\n NgxFloatUiLooseDirective,\n} from 'ngx-float-ui';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isSafari } from '../is-safari';\n\n/**\n * The `Message` component displays a message with additional information such as sender and date, and enables [interaction with the message (i.e. edit or react)](/chat/docs/sdk/angular/concepts/message-interactions/).\n */\n@Component({\n selector: 'stream-message',\n templateUrl: './message.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageComponent\n implements OnInit, OnChanges, OnDestroy, AfterViewInit\n{\n /**\n * The message to be displayed\n */\n @Input() message: StreamMessage | undefined;\n /**\n * The list of [channel capabilities](/chat/docs/javascript/channel_capabilities/) that are enabled for the current user, the list of [supported interactions](/chat/docs/sdk/angular/concepts/message-interactions/) can be found in our message interaction guide. Unathorized actions won't be displayed on the UI. The [`MessageList`](/chat/docs/sdk/angular/components/MessageListComponent/) component automatically sets this based on [channel capabilities](/chat/docs/javascript/channel_capabilities/).\n */\n @Input() enabledMessageActions: string[] = [];\n /**\n * If `true`, the message status (sending, sent, who read the message) is displayed.\n */\n @Input() isLastSentMessage: boolean | undefined;\n /**\n * Determines if the message is being dispalyed in a channel or in a [thread](/chat/docs/javascript/threads/).\n */\n @Input() mode: 'thread' | 'main' = 'main';\n /**\n * Highlighting is used to add visual emphasize to a message when jumping to the message\n */\n @Input() isHighlighted = false;\n /**\n * An Observable that emits when the message list is scrolled, it's used to prevent opening the message menu while scroll is in progress\n */\n @Input() scroll$?: Observable<void>;\n canReceiveReadEvents: boolean | undefined;\n canReactToMessage: boolean | undefined;\n isEditedFlagOpened = false;\n shouldDisplayTranslationNotice = false;\n displayedMessageTextContent: 'original' | 'translation' = 'original';\n nestedModalState: 'opened' | 'closed' = 'closed';\n shouldDisplayThreadLink = false;\n isSentByCurrentUser = false;\n readByText = '';\n lastReadUser: UserResponse | undefined = undefined;\n isOnlyReadByMe = false;\n isReadByMultipleUsers = false;\n isMessageDeliveredAndRead = false;\n parsedDate = '';\n pasedEditedDate = '';\n areOptionsVisible = false;\n hasAttachment = false;\n hasReactions = false;\n replyCountParam: { replyCount: number | undefined } = {\n replyCount: undefined,\n };\n areMessageOptionsOpen = false;\n canDisplayReadStatus = false;\n hasTouchSupport = isSafari()\n ? 'ontouchstart' in window || navigator.maxTouchPoints > 0\n : window.matchMedia('(any-hover: none)').matches;\n private quotedMessageAttachments: Attachment[] | undefined;\n private subscriptions: Subscription[] = [];\n private isViewInited = false;\n private userId?: string;\n @ViewChild('messageMenuTrigger')\n messageMenuTrigger!: NgxFloatUiLooseDirective;\n @ViewChild('messageMenuFloat')\n messageMenuFloat!: NgxFloatUiContentComponent;\n @ViewChild('messageTextElement') messageTextElement?: ElementRef<HTMLElement>;\n @ViewChild('messageBubble') messageBubble?: ElementRef<HTMLElement>;\n private showMessageMenuTimeout?: ReturnType<typeof setTimeout>;\n private shouldPreventMessageMenuClose = false;\n private _visibleMessageActionsCount = 0;\n private channelMemberCount?: number;\n\n constructor(\n private chatClientService: ChatClientService,\n private channelService: ChannelService,\n public customTemplatesService: CustomTemplatesService,\n private cdRef: ChangeDetectorRef,\n private dateParser: DateParserService,\n public messageActionsService: MessageActionsService,\n private ngZone: NgZone,\n private translateService: TranslateService\n ) {}\n\n get visibleMessageActionsCount() {\n return this._visibleMessageActionsCount;\n }\n\n set visibleMessageActionsCount(count: number) {\n this._visibleMessageActionsCount = count;\n if (this.areOptionsVisible && this._visibleMessageActionsCount === 0) {\n this.areOptionsVisible = false;\n }\n }\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.chatClientService.user$.subscribe((u) => {\n if (u?.id !== this.userId) {\n this.userId = u?.id;\n this.setIsSentByCurrentUser();\n this.setLastReadUser();\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n })\n );\n this.subscriptions.push(\n this.messageActionsService.customActions$.subscribe(() => {\n if (this.message) {\n const numberOfEnabledActions =\n this.messageActionsService.getAuthorizedMessageActionsCount(\n this.message,\n this.enabledMessageActions\n );\n if (numberOfEnabledActions !== this.visibleMessageActionsCount) {\n this.visibleMessageActionsCount = numberOfEnabledActions;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n }\n })\n );\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe((activeChannel) => {\n const newChannelMemberCount = activeChannel?.data?.member_count;\n if (newChannelMemberCount !== this.channelMemberCount) {\n const shouldUpdateText =\n this.channelMemberCount !== undefined &&\n newChannelMemberCount != undefined &&\n ((this.channelMemberCount <= 1000 && newChannelMemberCount > 100) ||\n (this.channelMemberCount > 100 && newChannelMemberCount <= 100));\n this.channelMemberCount = activeChannel?.data?.member_count;\n if (\n this.message &&\n this.message.cid === activeChannel?.cid &&\n shouldUpdateText\n ) {\n this.updateReadByText();\n }\n }\n })\n );\n this.subscriptions.push(\n this.messageActionsService.modalOpenedForMessage.subscribe(\n (messageId) => {\n if (messageId === this.message?.id) {\n this.nestedModalState = 'opened';\n }\n }\n )\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.message) {\n this.displayedMessageTextContent = this.message?.translation\n ? 'translation'\n : 'original';\n this.shouldDisplayTranslationNotice =\n this.displayedMessageTextContent === 'translation';\n const originalAttachments = this.message?.quoted_message?.attachments;\n this.quotedMessageAttachments =\n originalAttachments && originalAttachments.length\n ? [originalAttachments[0]]\n : [];\n this.setIsSentByCurrentUser();\n this.setLastReadUser();\n this.updateReadByText();\n this.isOnlyReadByMe = !!(\n this.message &&\n this.message.readBy &&\n this.message.readBy.length === 0\n );\n this.isReadByMultipleUsers = !!(\n this.message &&\n this.message.readBy &&\n this.message.readBy.length > 1\n );\n this.isMessageDeliveredAndRead = !!(\n this.message &&\n this.message.readBy &&\n this.message.status === 'received' &&\n this.message.readBy.length > 0\n );\n this.parsedDate =\n (this.message &&\n this.message.created_at &&\n this.dateParser.parseDateTime(this.message.created_at)) ||\n '';\n this.pasedEditedDate =\n (this.message &&\n this.message.message_text_updated_at &&\n this.dateParser.parseDateTime(\n new Date(this.message.message_text_updated_at)\n )) ||\n '';\n this.hasAttachment =\n !!this.message?.attachments && !!this.message.attachments.length;\n this.hasReactions =\n !!this.message?.reaction_groups &&\n Object.keys(this.message.reaction_groups).length > 0;\n this.replyCountParam = { replyCount: this.message?.reply_count };\n }\n if (changes.enabledMessageActions) {\n this.canReactToMessage =\n this.enabledMessageActions.indexOf('send-reaction') !== -1;\n this.canReceiveReadEvents =\n this.enabledMessageActions.indexOf('read-events') !== -1;\n this.canDisplayReadStatus =\n this.canReceiveReadEvents !== false &&\n this.enabledMessageActions.indexOf('read-events') !== -1;\n }\n if (changes.message || changes.enabledMessageActions || changes.mode) {\n this.shouldDisplayThreadLink =\n !!this.message?.reply_count && this.mode !== 'thread';\n }\n if (changes.message || changes.mode || changes.enabledMessageActions) {\n this.areOptionsVisible = this.message\n ? !(\n !this.message.type ||\n this.message.type === 'error' ||\n this.message.type === 'system' ||\n this.message.type === 'deleted' ||\n this.message.type === 'ephemeral' ||\n this.message.status === 'failed' ||\n this.message.status === 'sending' ||\n (this.mode === 'thread' && !this.message.parent_id) ||\n this.message.deleted_at ||\n this.enabledMessageActions.length === 0\n )\n : false;\n }\n if (changes.message || changes.enabledMessageActions) {\n if (this.message) {\n this.visibleMessageActionsCount =\n this.messageActionsService.getAuthorizedMessageActionsCount(\n this.message,\n this.enabledMessageActions\n );\n } else {\n this.visibleMessageActionsCount = 0;\n }\n }\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n if (this.hasTouchSupport && this.messageBubble?.nativeElement) {\n this.ngZone.runOutsideAngular(() => {\n this.registerMenuTriggerEventHandlers();\n });\n }\n this.subscriptions.push(\n this.messageActionsService.messageMenuOpenedFor$.subscribe((id) => {\n if (\n (id === undefined || this.message?.id !== id) &&\n this.areMessageOptionsOpen\n ) {\n this.messageMenuTrigger?.hide();\n }\n })\n );\n this.subscriptions.push(\n this.messageActionsService.modalOpenedForMessage\n .pipe(pairwise())\n .subscribe(([oldId, newId]) => {\n if (newId === this.message?.id) {\n this.nestedModalState = 'opened';\n } else if (oldId === this.message?.id && newId === undefined) {\n this.nestedModalState = 'closed';\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n if (this.showMessageMenuTimeout) {\n clearTimeout(this.showMessageMenuTimeout);\n }\n }\n\n mousePushedDown(event: MouseEvent) {\n if (\n !this.hasTouchSupport ||\n event.button !== 0 ||\n !this.areOptionsVisible\n ) {\n return;\n }\n this.startMessageMenuShowTimer({ fromTouch: false });\n }\n\n mouseReleased() {\n this.stopMessageMenuShowTimer();\n }\n\n touchStarted() {\n if (!this.areOptionsVisible) {\n return;\n }\n this.startMessageMenuShowTimer({ fromTouch: true });\n }\n\n touchEnded() {\n this.stopMessageMenuShowTimer();\n }\n\n messageBubbleClicked(event: Event) {\n if (!this.hasTouchSupport) {\n return;\n }\n if (this.shouldPreventMessageMenuClose) {\n event.stopPropagation();\n this.shouldPreventMessageMenuClose = false;\n } else if (this.areMessageOptionsOpen) {\n this.messageMenuTrigger?.hide();\n }\n }\n\n messageOptionsButtonClicked() {\n if (!this.message) {\n return;\n }\n if (this.messageActionsService.customActionClickHandler) {\n this.messageActionsService.customActionClickHandler({\n message: this.message,\n enabledActions: this.enabledMessageActions,\n customActions: this.messageActionsService.customActions$.getValue(),\n isMine: this.isSentByCurrentUser,\n messageTextHtmlElement: this.messageTextElement?.nativeElement,\n });\n } else {\n this.areMessageOptionsOpen = !this.areMessageOptionsOpen;\n }\n }\n\n messageActionsBoxClicked(floatingContent: NgxFloatUiContentComponent) {\n floatingContent.hide();\n }\n\n getAttachmentListContext(): AttachmentListContext {\n return {\n messageId: this.message?.id || '',\n attachments: this.message?.attachments || [],\n parentMessageId: this.message?.parent_id,\n imageModalStateChangeHandler: (state) => (this.nestedModalState = state),\n };\n }\n\n getMessageContext(): SystemMessageContext {\n return {\n message: this.message,\n enabledMessageActions: this.enabledMessageActions,\n isHighlighted: this.isHighlighted,\n isLastSentMessage: this.isLastSentMessage,\n mode: this.mode,\n customActions: this.messageActionsService.customActions$.getValue(),\n parsedDate: this.parsedDate,\n scroll$: this.scroll$,\n };\n }\n\n getMessageTextContext(): MessageTextContext {\n return {\n message: this.message,\n isQuoted: false,\n shouldTranslate: this.displayedMessageTextContent === 'translation',\n };\n }\n\n getQuotedMessageTextContext(): MessageTextContext {\n return {\n message: this.message?.quoted_message,\n isQuoted: true,\n shouldTranslate: this.displayedMessageTextContent === 'translation',\n };\n }\n\n getQuotedMessageAttachmentListContext(): AttachmentListContext {\n return {\n messageId: this.message?.quoted_message?.id || '',\n attachments: this.quotedMessageAttachments!,\n parentMessageId: this?.message?.quoted_message?.parent_id,\n };\n }\n\n getMessageReactionsContext(): MessageReactionsContext {\n return {\n messageReactionCounts: this.message?.reaction_counts || {},\n latestReactions: this.message?.latest_reactions || [],\n messageId: this.message?.id,\n ownReactions: this.message?.own_reactions || [],\n messageReactionGroups: this.message?.reaction_groups || {},\n };\n }\n\n messageClicked() {\n if (\n this.message?.status === 'failed' &&\n this.message?.errorStatusCode !== 403\n ) {\n this.resendMessage();\n } else if (\n this.message?.type === 'error' &&\n this.message?.moderation_details\n ) {\n this.openMessageBouncePrompt();\n } else {\n this.isEditedFlagOpened = !this.isEditedFlagOpened;\n }\n }\n\n resendMessage() {\n void this.channelService.resendMessage(this.message!);\n }\n\n setAsActiveParentMessage() {\n void this.channelService.setAsActiveParentMessage(this.message);\n }\n\n getMessageActionsBoxContext(): MessageActionsBoxContext {\n return {\n isMine: this.isSentByCurrentUser,\n enabledActions: this.enabledMessageActions,\n message: this.message,\n messageTextHtmlElement: this.messageTextElement?.nativeElement,\n };\n }\n\n getDeliveredStatusContext(): DeliveredStatusContext {\n return {\n message: this.message!,\n };\n }\n\n getSendingStatusContext(): SendingStatusContext {\n return {\n message: this.message!,\n };\n }\n\n getReadStatusContext(): ReadStatusContext {\n return {\n message: this.message!,\n readByText: this.readByText,\n };\n }\n\n getMessageMetadataContext(): CustomMetadataContext {\n return { message: this.message! };\n }\n\n getMessageBlockedContext(): MessageBlockedContext {\n return {\n message: this.message!,\n isMyMessage: this.isSentByCurrentUser,\n };\n }\n\n jumpToMessage(messageId: string, parentMessageId?: string) {\n void this.channelService.jumpToMessage(messageId, parentMessageId);\n }\n\n openMessageBouncePrompt() {\n this.channelService.bouncedMessage$.next(this.message);\n }\n\n displayTranslatedMessage() {\n this.shouldDisplayTranslationNotice = true;\n this.displayedMessageTextContent = 'translation';\n }\n\n displayOriginalMessage() {\n this.displayedMessageTextContent = 'original';\n }\n\n private updateReadByText() {\n const others = this.translateService.instant(\n 'streamChat.and others'\n ) as string;\n const hasMoreThan100Members = (this.channelMemberCount ?? 0) > 100;\n this.readByText = this.message?.readBy\n ? listUsers(this.message.readBy, !hasMoreThan100Members, others)\n : '';\n }\n\n private setIsSentByCurrentUser() {\n this.isSentByCurrentUser = this.message?.user?.id === this.userId;\n }\n\n private setLastReadUser() {\n this.lastReadUser = this.message?.readBy?.filter(\n (u) => u.id !== this.userId\n )[0];\n }\n\n private startMessageMenuShowTimer(options: { fromTouch: boolean }) {\n this.stopMessageMenuShowTimer();\n if (this.scroll$) {\n this.subscriptions.push(\n this.scroll$.pipe(take(1)).subscribe(() => {\n this.stopMessageMenuShowTimer();\n })\n );\n }\n this.showMessageMenuTimeout = setTimeout(() => {\n if (!this.message) {\n return;\n }\n this.ngZone.run(() => {\n if (this.messageActionsService.customActionClickHandler) {\n this.messageActionsService.customActionClickHandler({\n message: this.message,\n enabledActions: this.enabledMessageActions,\n customActions: this.messageActionsService.customActions$.getValue(),\n isMine: this.isSentByCurrentUser,\n messageTextHtmlElement: this.messageTextElement?.nativeElement,\n });\n return;\n } else {\n this.shouldPreventMessageMenuClose = !options.fromTouch;\n // Fix for iOS Safari: iOS Safari won't close the input if we open message menu\n // The virtual keyboard can hide parts of the message menu, so we close the input here\n if (\n document.activeElement &&\n typeof (document.activeElement as HTMLInputElement).blur !==\n 'undefined'\n )\n (document.activeElement as HTMLInputElement).blur();\n this.messageMenuTrigger.show();\n this.messageActionsService.messageMenuOpenedFor$.next(\n this.message?.id\n );\n }\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n this.showMessageMenuTimeout = undefined;\n });\n }, 400);\n }\n\n private registerMenuTriggerEventHandlers() {\n this.messageBubble!.nativeElement.addEventListener('touchstart', () =>\n this.touchStarted()\n );\n this.messageBubble!.nativeElement.addEventListener('touchend', () =>\n this.touchEnded()\n );\n this.messageBubble!.nativeElement.addEventListener('mousedown', (e) =>\n this.mousePushedDown(e)\n );\n this.messageBubble!.nativeElement.addEventListener('mouseup', () =>\n this.mouseReleased()\n );\n this.messageBubble!.nativeElement.addEventListener('click', (e) =>\n this.messageBubbleClicked(e)\n );\n }\n\n private stopMessageMenuShowTimer() {\n if (this.showMessageMenuTimeout) {\n clearTimeout(this.showMessageMenuTimeout);\n this.showMessageMenuTimeout = undefined;\n }\n }\n}\n","<ng-container\n *ngIf=\"\n message?.type === 'error' &&\n (message?.moderation_details?.action ===\n 'MESSAGE_RESPONSE_ACTION_REMOVE' ||\n message?.moderation?.action === 'remove');\n else notBlockedMessage\n \"\n>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageBlockedTemplate$ | async) ||\n defaultBlockedMessage;\n context: getMessageBlockedContext()\n \"\n ></ng-container>\n <ng-template #defaultBlockedMessage>\n <stream-message-blocked\n [message]=\"message\"\n [isMyMessage]=\"isSentByCurrentUser\"\n ></stream-message-blocked>\n </ng-template>\n</ng-container>\n<ng-template #notBlockedMessage>\n <div\n data-testid=\"message-container\"\n class=\"str-chat__message-simple str-chat__message str-chat__message--{{\n message?.type\n }} str-chat__message--{{ message?.status }} {{\n message?.text ? 'str-chat__message--has-text' : 'has-no-text'\n }} str-chat__message-menu-{{ areMessageOptionsOpen ? 'opened' : 'closed' }}\"\n [class.str-chat__message--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--other]=\"!isSentByCurrentUser\"\n [class.str-chat__message-simple--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--has-attachment]=\"hasAttachment\"\n [class.str-chat__message--with-reactions]=\"hasReactions\"\n [class.str-chat__message--highlighted]=\"isHighlighted\"\n [class.str-chat__message-with-thread-link]=\"shouldDisplayThreadLink\"\n [class.str-chat__message-send-can-be-retried]=\"\n (message?.status === 'failed' && message?.errorStatusCode !== 403) ||\n (message?.type === 'error' && message?.moderation_details)\n \"\n [class.str-chat__message-with-touch-support]=\"hasTouchSupport\"\n [class.str-chat__message-without-touch-support]=\"!hasTouchSupport\"\n >\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <stream-avatar-placeholder\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"message-sender\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n [user]=\"message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__message-inner\">\n <div\n *ngIf=\"!hasTouchSupport && areOptionsVisible\"\n class=\"str-chat__message-simple__actions str-chat__message-options\"\n data-testid=\"message-options\"\n [class.str-chat__message-actions-open]=\"areMessageOptionsOpen\"\n >\n <div\n #messageActionsToggle\n data-testid=\"message-actions-container\"\n class=\"str-chat__message-actions-container str-chat__message-simple__actions__action str-chat__message-simple__actions__action--options\"\n [floatUiLoose]=\"messageMenuFloat\"\n [looseTrigger]=\"\n messageActionsService.customActionClickHandler\n ? 'none'\n : 'click'\n \"\n [hideOnScroll]=\"false\"\n [hideOnClickOutside]=\"true\"\n [hideOnMouseLeave]=\"false\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n (onSHown)=\"areMessageOptionsOpen = true\"\n (onHidden)=\"areMessageOptionsOpen = false\"\n >\n <div\n *ngIf=\"visibleMessageActionsCount > 0\"\n class=\"str-chat__message-actions-box-button\"\n data-testid=\"message-options-button\"\n (click)=\"messageOptionsButtonClicked()\"\n (keyup.enter)=\"messageOptionsButtonClicked()\"\n >\n <stream-icon-placeholder\n icon=\"action\"\n class=\"str-chat__message-action-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"\n customTemplatesService.customMessageMetadataInsideBubbleTemplate$\n | async\n \"\n >\n <ng-template\n *ngTemplateOutlet=\"\n (customTemplatesService.customMessageMetadataInsideBubbleTemplate$\n | async)!;\n context: { message: message }\n \"\n ></ng-template>\n </ng-container>\n <div class=\"str-chat__message-reactions-host\">\n <ng-template\n #defaultMessageReactions\n let-messageReactionCounts=\"messageReactionCounts\"\n let-latestReactions=\"latestReactions\"\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n let-messageReactionGroups=\"messageReactionGroups\"\n >\n <stream-message-reactions\n [messageReactionCounts]=\"messageReactionCounts\"\n [latestReactions]=\"latestReactions\"\n [messageId]=\"messageId\"\n [ownReactions]=\"ownReactions\"\n [messageReactionGroups]=\"messageReactionGroups\"\n ></stream-message-reactions>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageReactionsTemplate$ | async) ||\n defaultMessageReactions;\n context: getMessageReactionsContext()\n \"\n ></ng-container>\n </div>\n <float-ui-content #messageMenuFloat>\n <ng-template\n #defaultMessageActionsBox\n let-isMine=\"isMine\"\n let-messageInput=\"message\"\n let-enabledActions=\"enabledActions\"\n let-messageTextHtmlElement=\"messageTextHtmlElement\"\n >\n <stream-message-actions-box\n [isMine]=\"isMine\"\n [message]=\"messageInput\"\n [enabledActions]=\"enabledActions\"\n [messageTextHtmlElement]=\"messageTextHtmlElement\"\n ></stream-message-actions-box>\n </ng-template>\n <ng-container>\n <div\n (click)=\"messageActionsBoxClicked(messageMenuFloat)\"\n (keyup.enter)=\"messageActionsBoxClicked(messageMenuFloat)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageActionsBoxTemplate$\n | async) || defaultMessageActionsBox;\n context: getMessageActionsBoxContext()\n \"\n >\n </ng-container>\n </div>\n </ng-container>\n </float-ui-content>\n <div\n class=\"str-chat__message-bubble str-chat-angular__message-bubble\"\n [class.str-chat-angular__message-bubble--attachment-modal-open]=\"\n nestedModalState === 'opened'\n \"\n data-testid=\"message-bubble\"\n [floatUiLoose]=\"messageMenuFloat\"\n #messageMenuTrigger=\"floatUiLoose\"\n #messageBubble\n looseTrigger=\"none\"\n [hideOnScroll]=\"false\"\n [hideOnClickOutside]=\"true\"\n [hideOnMouseLeave]=\"false\"\n [disableAnimation]=\"true\"\n [preventOverflow]=\"true\"\n (onShown)=\"areMessageOptionsOpen = true\"\n (onHidden)=\"areMessageOptionsOpen = false\"\n [positionFixed]=\"true\"\n >\n <ng-container *ngIf=\"hasAttachment && !message?.quoted_message\">\n <div class=\"str-chat__attachments-container\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"\n message?.poll_id &&\n (customTemplatesService.pollTemplate$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.pollTemplate$ | async)!;\n context: {\n pollId: message?.poll_id,\n messageId: message?.id,\n isQuote: false\n }\n \"\n ></ng-container>\n </ng-container>\n <div\n *ngIf=\"\n message?.text || (message?.quoted_message && hasAttachment)\n \"\n class=\"str-chat__message-text\"\n tabindex=\"0\"\n [class.str-chat__message-text--pointer-cursor]=\"\n (message?.status === 'failed' &&\n message?.errorStatusCode !== 403) ||\n (this.message?.type === 'error' &&\n this.message?.moderation_details) ||\n message?.message_text_updated_at\n \"\n (click)=\"messageClicked()\"\n (keyup.enter)=\"messageClicked()\"\n >\n <div\n data-testid=\"inner-message\"\n class=\"str-chat__message-text-inner str-chat__message-simple-text-inner\"\n [class.str-chat__message-light-text-inner--has-attachment]=\"\n hasAttachment\n \"\n >\n <ng-container *ngTemplateOutlet=\"quotedMessage\"></ng-container>\n <ng-container *ngIf=\"hasAttachment && message?.quoted_message\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </ng-container>\n <div\n *ngIf=\"message?.type === 'error'\"\n data-testid=\"client-error-message\"\n class=\"str-chat__simple-message--error-message str-chat__message--error-message\"\n >\n <ng-container *ngIf=\"!message?.moderation_details\">{{\n \"streamChat.Error · Unsent\" | translate\n }}</ng-container>\n </div>\n <div\n *ngIf=\"message?.status === 'failed'\"\n data-testid=\"error-message\"\n class=\"str-chat__simple-message--error-message str-chat__message--error-message\"\n >\n {{\n (message?.errorStatusCode === 403\n ? \"streamChat.Message Failed · Unauthorized\"\n : \"streamChat.Message Failed · Click to try again\"\n ) | translate\n }}\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageTextTemplate$ | async) ||\n defaultText;\n context: getMessageTextContext()\n \"\n ></ng-container>\n <ng-template\n #defaultText\n let-message=\"message\"\n let-isQuoted=\"isQuoted\"\n let-shouldTranslate=\"shouldTranslate\"\n >\n <stream-message-text\n [message]=\"message\"\n [isQuoted]=\"isQuoted\"\n [shouldTranslate]=\"shouldTranslate\"\n data-testid=\"quoted-message-text\"\n ></stream-message-text>\n </ng-template>\n </div>\n </div>\n <stream-icon-placeholder\n class=\"str-chat__message-error-icon\"\n icon=\"error\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <ng-container\n *ngTemplateOutlet=\"replyCountButton; context: { message: message }\"\n ></ng-container>\n\n <ng-container *ngTemplateOutlet=\"messageDateAndSender\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <ng-template #deletedMessage>\n <div data-testid=\"message-deleted-component\">\n <div class=\"str-chat__message--deleted-inner\" translate>\n streamChat.This message was deleted...\n </div>\n </div>\n </ng-template>\n\n <ng-template #systemMessage>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.systemMessageTemplate$ | async) ||\n defaultSystemMessage;\n context: getMessageContext()\n \"\n ></ng-container>\n <ng-template #defaultSystemMessage let-messageInput=\"message\">\n <div data-testid=\"system-message\" class=\"str-chat__message--system\">\n <div class=\"str-chat__message--system__text\">\n <div class=\"str-chat__message--system__line\"></div>\n <p>{{ messageInput?.text }}</p>\n <div class=\"str-chat__message--system__line\"></div>\n </div>\n <div class=\"str-chat__message--system__date\">\n {{ parsedDate }}\n </div>\n </div>\n </ng-template>\n </ng-template>\n\n <ng-template #quotedMessage>\n <div\n *ngIf=\"message?.quoted_message\"\n class=\"quoted-message str-chat__quoted-message-preview\"\n data-testid=\"quoted-message-container\"\n [class.mine]=\"isSentByCurrentUser\"\n (click)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n (keyup.enter)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"quoted-message-sender\"\n [imageUrl]=\"message?.quoted_message?.user?.image\"\n [name]=\"\n message?.quoted_message?.user?.name ||\n message?.quoted_message?.user?.id\n \"\n [user]=\"message?.quoted_message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"quoted-message-inner str-chat__quoted-message-bubble\">\n <ng-container\n *ngIf=\"\n message?.quoted_message?.attachments &&\n message?.quoted_message?.attachments?.length\n \"\n >\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getQuotedMessageAttachmentListContext()\n \"\n ></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"\n message?.quoted_message?.poll_id &&\n (customTemplatesService.pollTemplate$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.pollTemplate$ | async)!;\n context: {\n pollId: message?.quoted_message?.poll_id,\n messageId: message?.quoted_message?.id,\n isQuote: true\n }\n \"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"message?.quoted_message\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageTextTemplate$ | async) ||\n defaultText;\n context: getQuotedMessageTextContext()\n \"\n ></ng-container>\n <ng-template\n #defaultText\n let-message=\"message\"\n let-isQuoted=\"isQuoted\"\n let-shouldTranslate=\"shouldTranslate\"\n >\n <stream-message-text\n [message]=\"message\"\n [isQuoted]=\"isQuoted\"\n [shouldTranslate]=\"shouldTranslate\"\n data-testid=\"quoted-message-text\"\n ></stream-message-text>\n </ng-template>\n </ng-container>\n </div>\n </div>\n </ng-template>\n\n <ng-template #messageDateAndSender>\n <ng-container>\n <div\n *ngIf=\"shouldDisplayTranslationNotice\"\n class=\"str-chat__translation-notice\"\n data-testid=\"translation-notice\"\n >\n <button\n *ngIf=\"displayedMessageTextContent === 'translation'\"\n data-testid=\"see-original\"\n translate\n (click)=\"displayOriginalMessage()\"\n (keyup.enter)=\"displayOriginalMessage()\"\n >\n streamChat.See original (automatically translated)\n </button>\n <button\n *ngIf=\"displayedMessageTextContent === 'original'\"\n data-testid=\"see-translation\"\n translate\n (click)=\"displayTranslatedMessage()\"\n (keyup.enter)=\"displayTranslatedMessage()\"\n >\n streamChat.See translation\n </button>\n </div>\n <ng-container\n *ngIf=\"customTemplatesService.customMessageMetadataTemplate$ | async\"\n >\n <div class=\"str-chat__custom-message-metadata\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.customMessageMetadataTemplate$ | async)!;\n context: getMessageMetadataContext()\n \"\n ></ng-container>\n </div>\n </ng-container>\n <div\n class=\"str-chat__message-data str-chat__message-simple-data str-chat__message-metadata\"\n >\n <ng-container *ngTemplateOutlet=\"messageStatus\"></ng-container>\n\n <span\n *ngIf=\"!isSentByCurrentUser\"\n data-testid=\"sender\"\n class=\"str-chat__message-simple-name str-chat__message-sender-name\"\n >\n {{ message?.user?.name ? message?.user?.name : message?.user?.id }}\n </span>\n <span\n data-testid=\"date\"\n class=\"str-chat__message-simple-timestamp str-chat__message-simple-time\"\n >\n {{ parsedDate }}\n </span>\n <ng-container *ngIf=\"message?.message_text_updated_at\">\n <span\n data-testid=\"edited-flag\"\n class=\"str-chat__mesage-simple-edited\"\n translate\n >streamChat.Edited</span\n >\n <div\n data-testid=\"edited-timestamp\"\n class=\"str-chat__message-edited-timestamp\"\n [ngClass]=\"{\n 'str-chat__message-edited-timestamp--open': isEditedFlagOpened,\n 'str-chat__message-edited-timestamp--collapsed':\n !isEditedFlagOpened\n }\"\n >\n <span translate>streamChat.Edited</span>\n <time\n dateTime=\"{{ message?.message_text_updated_at }}\"\n title=\"{{ message?.message_text_updated_at }}\"\n >\n {{ pasedEditedDate }}\n </time>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n\n <ng-template #messageStatus>\n <ng-container\n *ngIf=\"\n isSentByCurrentUser &&\n ((isLastSentMessage && message?.status === 'received') ||\n message?.status === 'sending')\n \"\n >\n <ng-container *ngIf=\"message?.status === 'sending'; else sentStatus\">\n <ng-container *ngTemplateOutlet=\"sendingStatus\"></ng-container>\n </ng-container>\n <ng-template #sentStatus>\n <ng-container\n *ngIf=\"\n mode === 'main' &&\n isMessageDeliveredAndRead &&\n canDisplayReadStatus;\n else deliveredStatus\n \"\n >\n <ng-container *ngTemplateOutlet=\"readStatus\"></ng-container>\n </ng-container>\n </ng-template>\n <ng-template #deliveredStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.deliveredStatusTemplate$ | async) ||\n defaultDeliveredStatus;\n context: getDeliveredStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultDeliveredStatus>\n <span\n *ngIf=\"mode === 'main'\"\n class=\"str-chat__message-simple-status str-chat__message-simple-status-angular str-chat__message-status\"\n data-testid=\"delivered-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n [looseTrigger]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"true\"\n >\n <float-ui-content #floatingContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n </float-ui-content>\n <stream-icon-placeholder\n data-testid=\"delivered-icon\"\n icon=\"delivered\"\n ></stream-icon-placeholder>\n </span>\n </ng-template>\n <ng-template #sendingStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.sendingStatusTemplate$ | async) ||\n defaultSendingStatus;\n context: getSendingStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultSendingStatus>\n <span\n class=\"str-chat__message-simple-status str-chat__message-simple-status-angular str-chat__message-status\"\n data-testid=\"sending-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n [looseTrigger]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"true\"\n >\n <float-ui-content #floatingContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n </float-ui-content>\n <stream-loading-indicator-placeholder\n data-testid=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </span>\n </ng-template>\n <ng-template #readStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.readStatusTemplate$ | async) ||\n defaultReadStatus;\n context: getReadStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultReadStatus let-readByText=\"readByText\">\n <span\n class=\"str-chat__message-simple-status str-chat__message-simple-status-angular str-chat__message-status\"\n data-testid=\"read-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n [looseTrigger]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"true\"\n >\n <float-ui-content #floatingContent>\n <div\n class=\"str-chat__tooltip str-chat__tooltip-angular\"\n data-testid=\"read-by-tooltip\"\n >\n {{ readByText }}\n </div>\n </float-ui-content>\n <stream-icon-placeholder icon=\"read\"></stream-icon-placeholder>\n </span>\n </ng-template>\n </ng-container>\n </ng-template>\n\n <ng-template #replyCountButton>\n <div\n class=\"str-chat__message-simple-reply-button str-chat__message-replies-count-button-wrapper\"\n >\n <ng-container *ngIf=\"shouldDisplayThreadLink\">\n <ng-template\n *ngTemplateOutlet=\"\n (customTemplatesService.threadLinkButton$ | async) || defaultButton;\n context: { message: message }\n \"\n ></ng-template>\n </ng-container>\n <ng-template #defaultButton let-message=\"message\">\n <button\n class=\"str-chat__message-replies-count-button\"\n data-testid=\"reply-count-button\"\n (click)=\"setAsActiveParentMessage()\"\n >\n {{message?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </button>\n </ng-template>\n </div>\n </ng-template>\n\n <ng-template #attachmentsTemplate>\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getAttachmentListContext()\n \"\n ></ng-container>\n </ng-template>\n</ng-template>\n","import { InjectionToken, Type } from '@angular/core';\nimport { TextareaInterface } from './message-input/textarea.interface';\n\nexport const textareaInjectionToken = new InjectionToken<\n Type<TextareaInterface>\n>('textareaInjectionToken');\n","import {\n ComponentRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewContainerRef,\n} from '@angular/core';\nimport { Directive } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { UserResponse } from 'stream-chat';\nimport { TextareaInterface } from './textarea.interface';\n\n@Directive({\n selector: '[streamTextarea]',\n})\nexport class TextareaDirective implements OnChanges {\n @Input() componentRef:\n | ComponentRef<TextareaInterface & Partial<OnChanges>>\n | undefined;\n @Input() areMentionsEnabled: boolean | undefined;\n @Input() mentionScope?: 'channel' | 'application';\n @Input() inputMode!: 'mobile' | 'desktop';\n @Input() value = '';\n @Input() placeholder: string | undefined;\n @Input() autoFocus!: boolean;\n @Output() readonly valueChange = new EventEmitter<string>();\n @Output() readonly send = new EventEmitter<void>();\n @Output() readonly userMentions = new EventEmitter<UserResponse[]>();\n @Output() readonly pasteFromClipboard = new EventEmitter<ClipboardEvent>();\n private subscriptions: Subscription[] = [];\n private unpropagatedChanges: SimpleChanges[] = [];\n constructor(public viewContainerRef: ViewContainerRef) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n this.unpropagatedChanges.push(changes);\n if (!this.componentRef) {\n return;\n }\n if (changes.componentRef) {\n this.subscriptions.forEach((s) => s.unsubscribe());\n if (this.componentRef) {\n this.subscriptions.push(\n this.componentRef.instance.valueChange.subscribe((value) =>\n this.valueChange.next(value)\n )\n );\n this.subscriptions.push(\n this.componentRef.instance.send.subscribe((value) =>\n this.send.next(value)\n )\n );\n if (this.componentRef.instance.userMentions) {\n this.subscriptions.push(\n this.componentRef.instance.userMentions.subscribe((value) =>\n this.userMentions.next(value)\n )\n );\n }\n this.subscriptions.push(\n this.componentRef.instance.pasteFromClipboard.subscribe((value) =>\n this.pasteFromClipboard.next(value)\n )\n );\n this.componentRef.instance.areMentionsEnabled = this.areMentionsEnabled;\n this.componentRef.instance.mentionScope = this.mentionScope;\n this.componentRef.instance.value = this.value;\n this.componentRef.instance.placeholder = this.placeholder;\n this.componentRef.instance.inputMode = this.inputMode;\n this.componentRef.instance.autoFocus = this.autoFocus;\n }\n }\n if (changes.areMentionsEnabled) {\n this.componentRef.instance.areMentionsEnabled = this.areMentionsEnabled;\n }\n if (changes.mentionScope) {\n this.componentRef.instance.mentionScope = this.mentionScope;\n }\n if (changes.value) {\n this.componentRef.instance.value = this.value;\n }\n if (changes.placeholder) {\n this.componentRef.instance.placeholder = this.placeholder;\n }\n if (changes.inputMode) {\n this.componentRef.instance.inputMode = this.inputMode;\n }\n if (changes.autoFocus) {\n this.componentRef.instance.autoFocus = this.autoFocus;\n }\n // ngOnChanges not called for dynamic components since we don't use template binding\n let changesToPropagate = {};\n this.unpropagatedChanges.forEach(\n (c) => (changesToPropagate = { ...changesToPropagate, ...c })\n );\n // eslint-disable-next-line @angular-eslint/no-lifecycle-call\n this.componentRef.instance.ngOnChanges?.(changesToPropagate);\n this.unpropagatedChanges = [];\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n/**\n * If you have an emoji picker in your application, you can propagate the selected emoji to the textarea using this service, more info can be found in [custom emoji picker guide](/chat/docs/sdk/angular/code-examples/emoji-picker/)\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmojiInputService {\n /**\n * If you have an emoji picker in your application, you can propagate the selected emoji to the textarea using this Subject, more info can be found in [custom emoji picker guide](/chat/docs/sdk/angular/code-examples/emoji-picker/)\n */\n emojiInput$ = new Subject<string>();\n\n constructor() {}\n}\n","import { Injectable, NgModule } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { AudioRecording } from '../types';\n\n/**\n * The `VoiceRecorderService` provides a commincation outlet between the message input and voice recorder components.\n */\n@Injectable({\n providedIn: NgModule,\n})\nexport class VoiceRecorderService {\n /**\n * Use this property to get/set if the recording component should be visible\n */\n isRecorderVisible$ = new BehaviorSubject<boolean>(false);\n /**\n * The audio recording that was created\n */\n recording$ = new BehaviorSubject<AudioRecording | undefined>(undefined);\n\n constructor() {}\n}\n","import { Injectable } from '@angular/core';\nimport { MessageInputComponent } from './message-input.component';\nimport { BehaviorSubject } from 'rxjs';\nimport { CustomAutocomplete } from '../types';\n\n/**\n * The `MessageInputConfigService` is used to keep a consistent configuration among the different [`MessageInput`](/chat/docs/sdk/angular/components/MessageInputComponent/) components if your UI has more than one input component.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class MessageInputConfigService {\n /**\n * If file upload is enabled, the user can open a file selector from the input. Please note that the user also needs to have the necessary [channel capability](/chat/docs/javascript/channel_capabilities/).\n */\n isFileUploadEnabled: boolean | undefined = true;\n /**\n * If true, users can mention other users in messages. You also [need to use the `AutocompleteTextarea`](/chat/docs/sdk/angular/concepts/opt-in-architecture/) for this feature to work.\n */\n areMentionsEnabled: boolean | undefined = true;\n /**\n * If `false`, users can only upload one attachment per message\n */\n isMultipleFileUploadEnabled: boolean | undefined = true;\n /**\n * The scope for user mentions, either members of the current channel of members of the application\n */\n mentionScope: 'channel' | 'application' | undefined = 'channel';\n /**\n * In `desktop` mode the `Enter` key will trigger message sending, in `mobile` mode the `Enter` key will insert a new line to the message input.\n */\n inputMode: 'desktop' | 'mobile' = 'desktop';\n /**\n * If `true` the recording will be sent as a message immediately after the recording is completed.\n * If `false`, the recording will added to the attachment preview, and users can continue composing the message.\n */\n sendVoiceRecordingImmediately = true;\n /**\n * Override the message input's default event handler for [paste events](https://developer.mozilla.org/en-US/docs/Web/API/Element/paste_event)\n *\n * The event handler will receive the event object, and the [message input component](/chat/docs/sdk/angular/components/MessageInputComponent).\n *\n * You can use the public API of the message input component to update the composer. Typically you want to update the message text and/or attachments, this is how you can do these:\n * - Change message text: `inputComponent.textareaValue = '<new value>'`\n * - Upload file or image attachments: `inputComponent.attachmentService.filesSelected(<files>)`\n * - Upload custom attachments: `inputComponent.attachmentService.customAttachments$.next(<custom attachments>)`\n */\n customPasteEventHandler?: (\n event: ClipboardEvent,\n inputComponent: MessageInputComponent\n ) => void;\n /**\n * Add custom autocomplete configurations to the message input\n *\n * Only works when using StreamAutocompleteTextareaModule\n */\n customAutocompletes$ = new BehaviorSubject<CustomAutocomplete[]>([]);\n\n constructor() {}\n}\n","import { BehaviorSubject, Observable } from 'rxjs';\nimport {\n createFileFromBlobs,\n createUriFromBlob,\n getExtensionFromMimeType,\n} from '../file-utils';\nimport { NotificationService } from '../notification.service';\nimport { ChatClientService } from '../chat-client.service';\nimport fixWebmDuration from 'fix-webm-duration';\nimport { TranscoderService } from './transcoder.service';\nimport { MediaRecording } from '../types';\n\nexport type MediaRecorderConfig = Omit<MediaRecorderOptions, 'mimeType'> &\n Required<Pick<MediaRecorderOptions, 'mimeType'>>;\n\nexport enum MediaRecordingState {\n PAUSED = 'paused',\n RECORDING = 'recording',\n STOPPED = 'stopped',\n ERROR = 'error',\n}\n\nexport type MediaRecordingTitleOptions = {\n mimeType: string;\n};\n\nexport abstract class MultimediaRecorder<T = null> {\n abstract config: MediaRecorderConfig;\n customGenerateRecordingTitle:\n | ((options: MediaRecordingTitleOptions) => string)\n | undefined;\n recordingState$: Observable<MediaRecordingState>;\n recording$: Observable<(MediaRecording & T) | undefined>;\n\n protected recordingSubject = new BehaviorSubject<\n (MediaRecording & T) | undefined\n >(undefined);\n\n protected mediaRecorder: MediaRecorder | undefined;\n protected startTime: number | undefined;\n protected recordedChunkDurations: number[] = [];\n private recordingStateSubject = new BehaviorSubject<MediaRecordingState>(\n MediaRecordingState.STOPPED\n );\n\n constructor(\n protected notificationService: NotificationService,\n protected chatService: ChatClientService,\n private transcoder: TranscoderService\n ) {\n this.recording$ = this.recordingSubject.asObservable();\n this.recordingState$ = this.recordingStateSubject.asObservable();\n }\n\n get durationMs() {\n return (\n this.recordedChunkDurations.reduce((acc, val) => acc + val, 0) +\n (this.startTime ? Date.now() - this.startTime : 0)\n );\n }\n\n get mediaType() {\n return this.config.mimeType.split('/')?.[0] || 'unknown';\n }\n\n get isRecording() {\n return (\n this.recordingStateSubject.value === MediaRecordingState.RECORDING ||\n this.recordingStateSubject.value === MediaRecordingState.PAUSED\n );\n }\n\n generateRecordingTitle = (mimeType: string) => {\n if (this.customGenerateRecordingTitle) {\n return this.customGenerateRecordingTitle({ mimeType });\n } else {\n return `${\n this.mediaType\n }_recording_${new Date().toISOString()}.${getExtensionFromMimeType(\n mimeType\n )}`; // extension needed so that desktop Safari can play the asset\n }\n };\n\n async makeRecording(blob: Blob) {\n const { mimeType } = this.config;\n try {\n if (mimeType.includes('webm')) {\n // The browser does not include duration metadata with the recorded blob\n blob = await fixWebmDuration(blob, this.durationMs, {\n logger: () => null, // prevents polluting the browser console\n });\n }\n blob = await this.transcoder.transcode(blob);\n\n if (!blob) return;\n\n const file = createFileFromBlobs({\n blobsArray: [blob],\n fileName: this.generateRecordingTitle(blob.type),\n mimeType: blob.type,\n });\n const previewUrl = await createUriFromBlob(file);\n\n const extraData = this.enrichWithExtraData();\n this.recordingSubject.next({\n recording: file,\n duration: this.durationMs / 1000,\n asset_url: previewUrl,\n mime_type: mimeType,\n ...extraData,\n });\n return file;\n } catch (error) {\n this.logError(error as Error);\n this.recordingStateSubject.next(MediaRecordingState.ERROR);\n return undefined;\n }\n }\n\n handleErrorEvent = (e: Event) => {\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */\n this.logError((e as ErrorEvent).error);\n this.recordingStateSubject.next(MediaRecordingState.ERROR);\n this.notificationService.addTemporaryNotification(\n 'streamChat.An error has occurred during recording'\n );\n void this.stop({ cancel: true });\n };\n\n handleDataavailableEvent = (e: BlobEvent) => {\n if (!e.data.size) return;\n void this.makeRecording(e.data);\n };\n\n get recordingState() {\n return this.recordingStateSubject.value;\n }\n\n async start() {\n if (\n [MediaRecordingState.RECORDING, MediaRecordingState.PAUSED].includes(\n this.recordingStateSubject.value\n )\n ) {\n return;\n }\n\n this.recordingSubject.next(undefined);\n\n // account for requirement on iOS as per this bug report: https://bugs.webkit.org/show_bug.cgi?id=252303\n if (!navigator.mediaDevices) {\n console.warn(\n `[Stream Chat] Media devices API missing, it's possible your app is not served from a secure context (https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts)`\n );\n const error = new Error('Media recording is not supported');\n this.logError(error);\n this.recordingStateSubject.next(MediaRecordingState.ERROR);\n this.notificationService.addTemporaryNotification(\n `streamChat.Media recording not supported`\n );\n return;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n this.mediaRecorder = new MediaRecorder(stream, this.config);\n\n this.mediaRecorder.addEventListener(\n 'dataavailable',\n this.handleDataavailableEvent\n );\n this.mediaRecorder.addEventListener('error', this.handleErrorEvent);\n\n this.startTime = new Date().getTime();\n this.mediaRecorder.start();\n\n this.recordingStateSubject.next(MediaRecordingState.RECORDING);\n } catch (error) {\n this.logError(error as Error);\n void this.stop({ cancel: true });\n this.recordingStateSubject.next(MediaRecordingState.ERROR);\n const isNotAllowed = (error as Error).name?.includes('NotAllowedError');\n this.notificationService.addTemporaryNotification(\n isNotAllowed\n ? `streamChat.Please grant permission to use microhpone`\n : `streamChat.Error starting recording`\n );\n }\n }\n\n pause() {\n if (this.recordingStateSubject.value !== MediaRecordingState.RECORDING)\n return;\n if (this.startTime) {\n this.recordedChunkDurations.push(new Date().getTime() - this.startTime);\n this.startTime = undefined;\n }\n this.mediaRecorder?.pause();\n this.recordingStateSubject.next(MediaRecordingState.PAUSED);\n }\n\n resume() {\n if (this.recordingStateSubject.value !== MediaRecordingState.PAUSED) return;\n this.startTime = new Date().getTime();\n this.mediaRecorder?.resume();\n this.recordingStateSubject.next(MediaRecordingState.RECORDING);\n }\n\n async stop(options: { cancel: boolean } = { cancel: false }) {\n if (this.startTime) {\n this.recordedChunkDurations.push(new Date().getTime() - this.startTime);\n this.startTime = undefined;\n }\n let recording!: MediaRecording & T;\n this.mediaRecorder?.stop();\n try {\n if (\n !options.cancel &&\n this.recordingStateSubject.value !== MediaRecordingState.ERROR\n ) {\n recording = await new Promise((resolve, reject) => {\n this.recording$.subscribe((r) => {\n if (r) {\n resolve(r);\n }\n });\n this.recordingState$.subscribe((s) => {\n if (s === MediaRecordingState.ERROR) {\n reject(new Error(`Recording couldn't be created`));\n }\n });\n });\n }\n } catch {\n this.notificationService.addTemporaryNotification(\n 'streamChat.An error has occurred during recording'\n );\n } finally {\n this.recordedChunkDurations = [];\n this.startTime = undefined;\n\n this.mediaRecorder?.removeEventListener(\n 'dataavailable',\n this.handleDataavailableEvent\n );\n this.mediaRecorder?.removeEventListener('error', this.handleErrorEvent);\n if (this.mediaRecorder?.stream?.active) {\n this.mediaRecorder?.stream?.getTracks().forEach((track) => {\n track.stop();\n this.mediaRecorder?.stream?.removeTrack(track);\n });\n this.mediaRecorder = undefined;\n }\n\n this.recordingStateSubject.next(MediaRecordingState.STOPPED);\n }\n\n return recording;\n }\n\n protected abstract enrichWithExtraData(): T;\n\n protected logError(error: Error) {\n this.chatService.chatClient?.logger('error', error.message, {\n error: error,\n tag: ['MediaRecorder'],\n });\n }\n}\n","import { Injectable, NgModule } from '@angular/core';\nimport { readBlobAsArrayBuffer } from '../file-utils';\n\nexport type TranscoderConfig = {\n sampleRate: number;\n};\n\nexport type TranscodeParams = TranscoderConfig & {\n blob: Blob;\n};\n\nconst WAV_HEADER_LENGTH_BYTES = 44 as const;\nconst BYTES_PER_SAMPLE = 2 as const;\nconst RIFF_FILE_MAX_BYTES = 4294967295 as const;\n\nconst HEADER = {\n AUDIO_FORMAT: { offset: 20, value: 1 }, // PCM = 1\n BITS_PER_SAMPLE: { offset: 34, value: BYTES_PER_SAMPLE * 8 }, // 16 bits encoding\n BLOCK_ALIGN: { offset: 32 },\n BYTE_RATE: { offset: 28 },\n CHANNEL_COUNT: { offset: 22 }, // 1 - mono, 2 - stereo\n CHUNK_ID: { offset: 0, value: 0x52494646 }, // hex representation of string \"RIFF\" (Resource Interchange File Format) - identifies the file structure that defines a class of more specific file formats, e.g. WAVE\n CHUNK_SIZE: { offset: 4 },\n FILE_FORMAT: { offset: 8, value: 0x57415645 }, // hex representation of string \"WAVE\"\n SAMPLE_RATE: { offset: 24 },\n SUBCHUNK1_ID: { offset: 12, value: 0x666d7420 }, // hex representation of string \"fmt \" - identifies the start of \"format\" section of the header\n SUBCHUNK1_SIZE: { offset: 16, value: 16 }, // Subchunk1 Size without SUBCHUNK1_ID and SUBCHUNK1_SIZE fields\n SUBCHUNK2_ID: { offset: 36, value: 0x64617461 }, // hex representation of string \"data\" - identifies the start of actual audio data section\n SUBCHUNK2_SIZE: { offset: 40 }, // actual audio data size\n} as const;\n\ntype WriteWaveHeaderParams = {\n arrayBuffer: ArrayBuffer;\n // 1 - mono, 2 - stereo\n channelCount: number;\n // Number of samples per second, e.g. 44100Hz\n sampleRate: number;\n};\n\ntype WriteAudioDataParams = {\n arrayBuffer: ArrayBuffer;\n dataByChannel: Float32Array[];\n};\n\n/**\n * The `TranscoderService` is used to transcibe audio recording to a format that's supported by all major browsers. The SDK uses this to create voice messages.\n *\n * If you want to use your own transcoder you can provide a `customTranscoder`.\n */\n@Injectable({ providedIn: NgModule })\nexport class TranscoderService {\n config: TranscoderConfig = {\n sampleRate: 16000,\n };\n customTranscoder?: (blob: Blob) => Blob | Promise<Blob>;\n constructor() {}\n\n /**\n * The default transcoder will leave audio/mp4 files as is, and transcode webm files to wav. If you want to customize this, you can provide your own transcoder using the `customTranscoder` field\n * @param blob\n * @returns the transcoded file\n */\n async transcode(blob: Blob) {\n if (this.customTranscoder) {\n return this.customTranscoder(blob);\n }\n if (blob.type.includes('audio/mp4')) {\n return blob;\n }\n const audioBuffer = await this.renderAudio(\n await this.toAudioBuffer(blob),\n this.config.sampleRate\n );\n const numberOfSamples = audioBuffer.duration * this.config.sampleRate;\n const fileSizeBytes =\n numberOfSamples * audioBuffer.numberOfChannels * BYTES_PER_SAMPLE +\n WAV_HEADER_LENGTH_BYTES;\n\n const arrayBuffer = new ArrayBuffer(fileSizeBytes);\n this.writeWavHeader({\n arrayBuffer,\n channelCount: audioBuffer.numberOfChannels,\n sampleRate: this.config.sampleRate,\n });\n this.writeWavAudioData({\n arrayBuffer,\n dataByChannel: this.splitDataByChannel(audioBuffer),\n });\n return new Blob([arrayBuffer], { type: 'audio/wav' });\n }\n\n protected async renderAudio(audioBuffer: AudioBuffer, sampleRate: number) {\n const offlineAudioCtx = new OfflineAudioContext(\n audioBuffer.numberOfChannels,\n audioBuffer.duration * sampleRate,\n sampleRate\n );\n const source = offlineAudioCtx.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(offlineAudioCtx.destination);\n source.start();\n\n return await offlineAudioCtx.startRendering();\n }\n\n protected async toAudioBuffer(blob: Blob) {\n const audioCtx = new AudioContext();\n\n const arrayBuffer = await readBlobAsArrayBuffer(blob);\n const decodedData = await audioCtx.decodeAudioData(arrayBuffer);\n if (audioCtx.state !== 'closed') await audioCtx.close();\n return decodedData;\n }\n\n protected writeWavAudioData({\n arrayBuffer,\n dataByChannel,\n }: WriteAudioDataParams) {\n const dataView = new DataView(arrayBuffer);\n const channelCount = dataByChannel.length;\n\n dataByChannel.forEach((channelData, channelIndex) => {\n let writeOffset = WAV_HEADER_LENGTH_BYTES + channelCount * channelIndex;\n\n channelData.forEach((float32Value) => {\n dataView.setInt16(\n writeOffset,\n float32Value < 0\n ? Math.max(-1, float32Value) * 32768\n : Math.min(1, float32Value) * 32767,\n true\n );\n writeOffset += channelCount * BYTES_PER_SAMPLE;\n });\n });\n }\n\n protected writeWavHeader({\n arrayBuffer,\n channelCount,\n sampleRate,\n }: WriteWaveHeaderParams) {\n const byteRate = sampleRate * channelCount * BYTES_PER_SAMPLE; // bytes/sec\n const blockAlign = channelCount * BYTES_PER_SAMPLE;\n\n const dataView = new DataView(arrayBuffer);\n /*\n * The maximum size of a RIFF file is 4294967295 bytes and since the header takes up 44 bytes there are 4294967251 bytes left for the\n * data chunk.\n */\n const dataChunkSize = Math.min(\n dataView.byteLength - WAV_HEADER_LENGTH_BYTES,\n RIFF_FILE_MAX_BYTES - WAV_HEADER_LENGTH_BYTES\n );\n\n dataView.setUint32(HEADER.CHUNK_ID.offset, HEADER.CHUNK_ID.value); // \"RIFF\"\n dataView.setUint32(\n HEADER.CHUNK_SIZE.offset,\n arrayBuffer.byteLength - 8,\n true\n ); // adjustment for the first two headers - chunk id + file size\n dataView.setUint32(HEADER.FILE_FORMAT.offset, HEADER.FILE_FORMAT.value); // \"WAVE\"\n\n dataView.setUint32(HEADER.SUBCHUNK1_ID.offset, HEADER.SUBCHUNK1_ID.value); // \"fmt \"\n dataView.setUint32(\n HEADER.SUBCHUNK1_SIZE.offset,\n HEADER.SUBCHUNK1_SIZE.value,\n true\n );\n dataView.setUint16(\n HEADER.AUDIO_FORMAT.offset,\n HEADER.AUDIO_FORMAT.value,\n true\n );\n dataView.setUint16(HEADER.CHANNEL_COUNT.offset, channelCount, true);\n dataView.setUint32(HEADER.SAMPLE_RATE.offset, sampleRate, true);\n dataView.setUint32(HEADER.BYTE_RATE.offset, byteRate, true);\n dataView.setUint16(HEADER.BLOCK_ALIGN.offset, blockAlign, true);\n dataView.setUint16(\n HEADER.BITS_PER_SAMPLE.offset,\n HEADER.BITS_PER_SAMPLE.value,\n true\n );\n\n dataView.setUint32(HEADER.SUBCHUNK2_ID.offset, HEADER.SUBCHUNK2_ID.value); // \"data\"\n dataView.setUint32(HEADER.SUBCHUNK2_SIZE.offset, dataChunkSize, true);\n }\n\n protected splitDataByChannel = (audioBuffer: AudioBuffer) =>\n Array.from({ length: audioBuffer.numberOfChannels }, (_, i) =>\n audioBuffer.getChannelData(i)\n );\n}\n","import { Injectable, NgModule } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { ChatClientService } from '../chat-client.service';\n\nconst MAX_FREQUENCY_AMPLITUDE = 255 as const;\n\nconst rootMeanSquare = (values: Uint8Array) =>\n Math.sqrt(\n values.reduce((acc, val) => acc + Math.pow(val, 2), 0) / values.length\n );\n\n/**\n * fftSize\n * An unsigned integer, representing the window size of the FFT, given in number of samples.\n * A higher value will result in more details in the frequency domain but fewer details\n * in the amplitude domain.\n *\n * Must be a power of 2 between 2^5 and 2^15, so one of: 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, and 32768.\n * Defaults to 32.\n *\n * maxDecibels\n * A double, representing the maximum decibel value for scaling the FFT analysis data,\n * where 0 dB is the loudest possible sound, -10 dB is a 10th of that, etc.\n * The default value is -30 dB.\n *\n * minDecibels\n * A double, representing the minimum decibel value for scaling the FFT analysis data,\n * where 0 dB is the loudest possible sound, -10 dB is a 10th of that, etc.\n * The default value is -100 dB.\n */\nexport type AmplitudeAnalyserConfig = Pick<\n AnalyserNode,\n 'fftSize' | 'maxDecibels' | 'minDecibels'\n>;\nexport type AmplitudeRecorderConfig = {\n analyserConfig: AmplitudeAnalyserConfig;\n sampleCount: number;\n samplingFrequencyMs: number;\n};\n\nexport const DEFAULT_AMPLITUDE_RECORDER_CONFIG: AmplitudeRecorderConfig = {\n analyserConfig: {\n fftSize: 32,\n maxDecibels: 0,\n minDecibels: -100,\n } as AmplitudeAnalyserConfig,\n sampleCount: 100,\n samplingFrequencyMs: 60,\n};\n\n/**\n * The `AmplitudeRecorderService` is a utility service used to create amplitude values for voice recordings, making it possible to display a wave bar\n */\n@Injectable({ providedIn: NgModule })\nexport class AmplitudeRecorderService {\n config = DEFAULT_AMPLITUDE_RECORDER_CONFIG;\n amplitudes$: Observable<number[]>;\n error$: Observable<Error | undefined>;\n\n private amplitudesSubject = new BehaviorSubject<number[]>([]);\n private errorSubject = new BehaviorSubject<Error | undefined>(undefined);\n private audioContext: AudioContext | undefined;\n private analyserNode: AnalyserNode | undefined;\n private microphone: MediaStreamAudioSourceNode | undefined;\n private stream: MediaStream | undefined;\n private amplitudeSamplingInterval: ReturnType<typeof setInterval> | undefined;\n\n constructor(private chatService: ChatClientService) {\n this.amplitudes$ = this.amplitudesSubject.asObservable();\n this.error$ = this.errorSubject.asObservable();\n }\n\n /**\n * The recorded amplitudes\n */\n get amplitudes() {\n return this.amplitudesSubject.value;\n }\n\n /**\n * Start amplitude recording for the given media stream\n * @param stream\n */\n start = (stream: MediaStream) => {\n this.stop();\n\n this.stream = stream;\n this.init();\n\n this.resume();\n };\n\n /**\n * Temporarily pause amplitude recording, recording can be resumed with `resume`\n */\n pause() {\n clearInterval(this.amplitudeSamplingInterval);\n this.amplitudeSamplingInterval = undefined;\n }\n\n /**\n * Resume amplited recording after it was pasued\n */\n resume() {\n this.amplitudeSamplingInterval = setInterval(() => {\n if (!this.analyserNode) {\n return;\n }\n const frequencyBins = new Uint8Array(this.analyserNode.frequencyBinCount);\n try {\n this.analyserNode.getByteFrequencyData(frequencyBins);\n } catch (e) {\n this.logError(e as Error);\n this.errorSubject.next(e as Error);\n return;\n }\n const normalizedSignalStrength =\n rootMeanSquare(frequencyBins) / MAX_FREQUENCY_AMPLITUDE;\n this.amplitudesSubject.next([\n ...this.amplitudesSubject.value,\n normalizedSignalStrength,\n ]);\n }, this.config.samplingFrequencyMs);\n }\n\n /**\n * Stop the amplitude recording and frees up used resources\n */\n stop() {\n if (!this.stream) {\n return;\n }\n this.stream = undefined;\n clearInterval(this.amplitudeSamplingInterval);\n this.amplitudeSamplingInterval = undefined;\n this.amplitudesSubject.next([]);\n this.errorSubject.next(undefined);\n this.microphone?.disconnect();\n this.analyserNode?.disconnect();\n if (this.audioContext?.state !== 'closed') {\n void this.audioContext?.close();\n }\n }\n\n private init() {\n if (!this.stream) {\n return;\n }\n\n this.audioContext = new AudioContext();\n this.analyserNode = this.audioContext.createAnalyser();\n const { analyserConfig } = this.config;\n this.analyserNode.fftSize = analyserConfig.fftSize;\n this.analyserNode.maxDecibels = analyserConfig.maxDecibels;\n this.analyserNode.minDecibels = analyserConfig.minDecibels;\n\n this.microphone = this.audioContext.createMediaStreamSource(this.stream);\n this.microphone.connect(this.analyserNode);\n }\n\n private logError(error: Error) {\n this.chatService.chatClient?.logger('error', error.message, {\n error: error,\n tag: ['AmplitudeRecorderService'],\n });\n }\n}\n","import { Injectable, NgModule } from '@angular/core';\nimport { AmplitudeRecorderService } from './amplitude-recorder.service';\nimport { MediaRecorderConfig, MultimediaRecorder } from './media-recorder';\nimport { NotificationService } from '../notification.service';\nimport { ChatClientService } from '../chat-client.service';\nimport { TranscoderService } from './transcoder.service';\nimport { resampleWaveForm } from '../wave-form-sampler';\nimport { AudioRecording, MediaRecording } from '../types';\n\n/**\n * The `AudioRecorderService` can record an audio file, the SDK uses this to record a voice message\n */\n@Injectable({ providedIn: NgModule })\nexport class AudioRecorderService extends MultimediaRecorder<\n Omit<AudioRecording, keyof MediaRecording>\n> {\n /**\n * Due to browser restrictions the following config is used:\n * - In Safari we record in audio/mp4\n * - For all other browsers we use audio/webm (which is then transcoded to wav)\n */\n config: MediaRecorderConfig = {\n mimeType: MediaRecorder.isTypeSupported('audio/webm')\n ? 'audio/webm'\n : 'audio/mp4;codecs=mp4a.40.2', // fallback for Safari\n };\n\n constructor(\n notificationService: NotificationService,\n chatService: ChatClientService,\n transcoder: TranscoderService,\n private amplitudeRecorder: AmplitudeRecorderService\n ) {\n super(notificationService, chatService, transcoder);\n }\n\n protected enrichWithExtraData() {\n const waveformData = resampleWaveForm(\n this.amplitudeRecorder.amplitudes,\n this.amplitudeRecorder.config.sampleCount\n );\n\n return { waveform_data: waveformData };\n }\n\n /**\n * Start audio recording\n */\n async start() {\n const result = await super.start();\n\n if (this.mediaRecorder?.stream) {\n this.amplitudeRecorder.start(this.mediaRecorder?.stream);\n }\n\n return result;\n }\n\n /**\n * Pause audio recording, it can be restarted using `resume`\n */\n pause() {\n const result = super.pause();\n\n this.amplitudeRecorder.pause();\n\n return result;\n }\n\n /**\n * Resume a previously paused recording\n */\n resume() {\n const result = super.resume();\n\n this.amplitudeRecorder.resume();\n\n return result;\n }\n\n /**\n * Stop the recording and free up used resources\n * @param options\n * @param options.cancel if this is `true` no recording will be created, but resources will be freed\n * @returns the recording\n */\n async stop(options?: { cancel: boolean }) {\n try {\n const result = await super.stop(options);\n\n return result;\n } finally {\n this.amplitudeRecorder.stop();\n }\n }\n}\n","import {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n TemplateRef,\n} from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { AttachmentUpload, CustomAttachmentPreviewListContext } from '../types';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { AttachmentService } from '../attachment.service';\nimport { Attachment } from 'stream-chat';\n\n/**\n * The `AttachmentPreviewList` component displays a preview of the attachments uploaded to a message. Users can delete attachments using the preview component, or retry upload if it failed previously.\n */\n@Component({\n selector: 'stream-attachment-preview-list',\n templateUrl: './attachment-preview-list.component.html',\n styles: [],\n})\nexport class AttachmentPreviewListComponent implements OnInit, OnDestroy {\n /**\n * A stream that emits the current file uploads and their states\n */\n @Input() attachmentUploads$: Observable<AttachmentUpload[]> | undefined;\n /**\n * An output to notify the parent component if the user tries to retry a failed upload\n */\n @Output() readonly retryAttachmentUpload = new EventEmitter<File>();\n /**\n * An output to notify the parent component if the user wants to delete a file\n */\n @Output() readonly deleteAttachment = new EventEmitter<AttachmentUpload>();\n customAttachments: Attachment[] = [];\n customAttachmentsPreview?: TemplateRef<CustomAttachmentPreviewListContext>;\n private subscriptions: Subscription[] = [];\n\n constructor(\n private customTemplateService: CustomTemplatesService,\n public readonly attachmentService: AttachmentService\n ) {}\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.customTemplateService.customAttachmentPreviewListTemplate$.subscribe(\n (t) => (this.customAttachmentsPreview = t)\n )\n );\n this.subscriptions.push(\n this.attachmentService.customAttachments$.subscribe(\n (a) => (this.customAttachments = a)\n )\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n attachmentUploadRetried(file: File) {\n this.retryAttachmentUpload.emit(file);\n }\n\n attachmentDeleted(upload: AttachmentUpload) {\n this.deleteAttachment.emit(upload);\n }\n\n trackByFile(_: number, item: AttachmentUpload) {\n return item.file;\n }\n}\n","<div\n *ngIf=\"\n (attachmentUploads$ | async)?.length ||\n (customAttachments.length > 0 && customAttachmentsPreview)\n \"\n class=\"str-chat__attachment-preview-list\"\n>\n <div class=\"str-chat__attachment-list-scroll-container\">\n <ng-container\n *ngFor=\"\n let attachmentUpload of attachmentUploads$ | async;\n trackBy: trackByFile\n \"\n >\n <div\n *ngIf=\"attachmentUpload.type === 'image'\"\n class=\"str-chat__attachment-preview-image\"\n data-testclass=\"attachment-image-preview\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n deleteButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <div\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n class=\"str-chat__attachment-preview-image-loading\"\n >\n <stream-loading-indicator-placeholder\n data-testclass=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n retryButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <img\n *ngIf=\"attachmentUpload.url || attachmentUpload.previewUri\"\n class=\"str-chat__attachment-preview-thumbnail\"\n data-testclass=\"attachment-image\"\n src=\"{{\n attachmentUpload.url\n ? attachmentUpload.url\n : attachmentUpload.previewUri\n }}\"\n alt=\"{{ attachmentUpload.file.name }}\"\n />\n </div>\n <div\n *ngIf=\"\n attachmentUpload.type === 'file' ||\n attachmentUpload.type === 'video' ||\n attachmentUpload.type === 'voiceRecording'\n \"\n class=\"str-chat__attachment-preview-file str-chat__attachment-preview-type-{{\n attachmentUpload.type\n }}\"\n data-testclass=\"attachment-file-preview\"\n >\n <stream-icon-placeholder\n class=\"str-chat__attachment-preview-file-icon\"\n icon=\"unspecified-filetype\"\n ></stream-icon-placeholder>\n\n <div class=\"str-chat__attachment-preview-file-end\">\n <div\n class=\"str-chat__attachment-preview-file-name\"\n title=\"{{ attachmentUpload.file.name }}\"\n >\n {{ attachmentUpload.file.name }}\n </div>\n <a\n *ngIf=\"attachmentUpload.state === 'success'\"\n class=\"str-chat__attachment-preview-file-download\"\n data-testclass=\"file-download-link\"\n download\n href=\"{{ attachmentUpload.url }}\"\n (click)=\"attachmentUpload.url ? null : $event.preventDefault()\"\n (keyup.enter)=\"\n attachmentUpload.url ? null : $event.preventDefault()\n \"\n >\n <stream-icon-placeholder icon=\"download\"></stream-icon-placeholder>\n </a>\n <stream-loading-indicator-placeholder\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n data-testclass=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n deleteButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n retryButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"customAttachmentsPreview\">\n <ng-template\n *ngTemplateOutlet=\"\n customAttachmentsPreview;\n context: { service: attachmentService }\n \"\n ></ng-template>\n </ng-container>\n </div>\n</div>\n\n<ng-template #deleteButton let-attachmentUpload=\"attachmentUpload\">\n <div\n class=\"str-chat__attachment-preview-delete\"\n data-testclass=\"file-delete\"\n role=\"button\"\n (click)=\"attachmentDeleted(attachmentUpload)\"\n (keyup.enter)=\"attachmentDeleted(attachmentUpload)\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </div>\n</ng-template>\n\n<ng-template #retryButton let-attachmentUpload=\"attachmentUpload\">\n <div\n *ngIf=\"attachmentUpload.state === 'error'\"\n data-testclass=\"upload-retry\"\n class=\"str-chat__attachment-preview-error str-chat__attachment-preview-error-{{\n attachmentUpload.type === 'image' ? 'image' : 'file'\n }}\"\n (click)=\"attachmentUploadRetried(attachmentUpload.file)\"\n (keyup.enter)=\"attachmentUploadRetried(attachmentUpload.file)\"\n >\n <stream-icon-placeholder icon=\"retry\"></stream-icon-placeholder>\n </div>\n</ng-template>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ComponentFactoryResolver,\n ComponentRef,\n ContentChild,\n ElementRef,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n SimpleChanges,\n TemplateRef,\n Type,\n ViewChild,\n} from '@angular/core';\nimport { combineLatest, Observable, Subject, Subscription, timer } from 'rxjs';\nimport { distinctUntilChanged, first, map, take, tap } from 'rxjs/operators';\nimport {\n Attachment,\n Channel,\n DraftMessagePayload,\n DraftResponse,\n UserResponse,\n} from 'stream-chat';\nimport { AttachmentService } from '../attachment.service';\nimport { ChannelService } from '../channel.service';\nimport { textareaInjectionToken } from '../injection-tokens';\nimport { NotificationService } from '../notification.service';\nimport {\n AttachmentPreviewListContext,\n AttachmentUpload,\n AudioRecording,\n CustomAttachmentUploadContext,\n EmojiPickerContext,\n MessageTextContext,\n StreamMessage,\n} from '../types';\nimport { MessageInputConfigService } from './message-input-config.service';\nimport { TextareaDirective } from './textarea.directive';\nimport { TextareaInterface } from './textarea.interface';\nimport { EmojiInputService } from './emoji-input.service';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { v4 as uuidv4 } from 'uuid';\nimport { MessageActionsService } from '../message-actions.service';\nimport { VoiceRecorderService } from './voice-recorder.service';\nimport { AudioRecorderService } from '../voice-recorder/audio-recorder.service';\n\n/**\n * The `MessageInput` component displays an input where users can type their messages and upload files, and sends the message to the active channel. The component can be used to compose new messages or update existing ones. To send messages, the chat user needs to have the necessary [channel capability](/chat/docs/javascript/channel_capabilities/).\n */\n@Component({\n selector: 'stream-message-input',\n templateUrl: './message-input.component.html',\n styles: [],\n providers: [AttachmentService, EmojiInputService, VoiceRecorderService],\n})\nexport class MessageInputComponent\n implements OnInit, OnChanges, OnDestroy, AfterViewInit\n{\n /**\n * If file upload is enabled, the user can open a file selector from the input. Please note that the user also needs to have the necessary [channel capability](/chat/docs/javascript/channel_capabilities/). If no value is provided, it is set from the [`MessageInputConfigService`](/chat/docs/sdk/angular/services/MessageInputConfigService/).\n */\n @Input() isFileUploadEnabled: boolean | undefined;\n /**\n * If true, users can mention other users in messages. You also [need to use the `AutocompleteTextarea`](/chat/docs/sdk/angular/concepts/opt-in-architecture/) for this feature to work. If no value is provided, it is set from the [`MessageInputConfigService`](/chat/docs/sdk/angular/services/MessageInputConfigService/).\n */\n @Input() areMentionsEnabled: boolean | undefined;\n /**\n * The scope for user mentions, either members of the current channel of members of the application. If no value is provided, it is set from the [`MessageInputConfigService`](/chat/docs/sdk/angular/services/MessageInputConfigService/).\n */\n @Input() mentionScope: 'channel' | 'application' | undefined;\n /**\n * Determines if the message is being dispalyed in a channel or in a [thread](/chat/docs/javascript/threads/).\n */\n @Input() mode: 'thread' | 'main' = 'main';\n /**\n * If true, users can select multiple files to upload. If no value is provided, it is set from the [`MessageInputConfigService`](/chat/docs/sdk/angular/services/MessageInputConfigService/).\n */\n @Input() isMultipleFileUploadEnabled: boolean | undefined;\n /**\n * The message to edit\n */\n @Input() message: StreamMessage | undefined;\n /**\n * An observable that can be used to trigger message sending from the outside\n */\n @Input() sendMessage$: Observable<void> | undefined;\n /**\n * In `desktop` mode the `Enter` key will trigger message sending, in `mobile` mode the `Enter` key will insert a new line to the message input. If no value is provided, it is set from the [`MessageInputConfigService`](/chat/docs/sdk/angular/services/MessageInputConfigService/).\n */\n @Input() inputMode: 'desktop' | 'mobile';\n /**\n * Enables or disables auto focus on the textarea element\n */\n @Input() autoFocus = true;\n /**\n * By default the input will react to changes in `messageToEdit$` from [`MessageActionsService`](/chat/docs/sdk/angular/services/MessageActionsService/) and display the message to be edited (taking into account the current `mode`).\n *\n * If you don't need that behavior, you can turn this of with this flag. In that case you should create your own edit message UI.\n */\n @Input() watchForMessageToEdit = true;\n /**\n * Use this input to control wether a send button is rendered or not. If you don't render a send button, you can still trigger message send using the `sendMessage$` input.\n */\n @Input() displaySendButton = true;\n /**\n * You can enable/disable voice recordings with this input\n */\n @Input() displayVoiceRecordingButton = false;\n /**\n * You can enable/disable polls with this input\n */\n @Input() displayPollCreateButton = false;\n /**\n * Emits when a message was successfuly sent or updated\n */\n @Output() readonly messageUpdate = new EventEmitter<{\n message: StreamMessage;\n }>();\n /**\n * Emits the messsage draft whenever the composed message changes.\n * - If the user clears the message input, or sends the message, undefined is emitted.\n * - If active channel changes, nothing is emitted.\n *\n * To save and fetch message drafts, you can use the [Stream message drafts API](https://getstream.io/chat/docs/javascript/drafts/).\n *\n * Message draft only works for new messages, nothing is emitted when input is in edit mode (if `message` input is set).\n *\n * To load a message draft into the input, use the `loadDraft` method.\n * - If channel id doesn't match the active channel id, the draft is ignored.\n * - If a thread message is loaded, and the input isn't in thread mode or parent ids don't match, the draft is ignored.\n */\n @Output() readonly messageDraftChange = new EventEmitter<\n DraftMessagePayload | undefined\n >();\n @ContentChild(TemplateRef) voiceRecorderRef:\n | TemplateRef<{ service: VoiceRecorderService }>\n | undefined;\n @HostBinding() class = 'str-chat__message-input-angular-host';\n isVoiceRecording = true;\n isFileUploadAuthorized: boolean | undefined;\n canSendLinks: boolean | undefined;\n canSendMessages: boolean | undefined;\n canSendPolls: boolean | undefined;\n attachmentUploads$: Observable<AttachmentUpload[]>;\n customAttachments$: Observable<Attachment[]>;\n attachmentUploadInProgressCounter$: Observable<number>;\n textareaValue = '';\n textareaRef: ComponentRef<TextareaInterface & Partial<OnChanges>> | undefined;\n mentionedUsers: UserResponse[] = [];\n quotedMessage: undefined | StreamMessage;\n typingStart$ = new Subject<void>();\n cooldown$: Observable<number> | undefined;\n isCooldownInProgress = false;\n emojiPickerTemplate: TemplateRef<EmojiPickerContext> | undefined;\n customAttachmentUploadTemplate:\n | TemplateRef<CustomAttachmentUploadContext>\n | undefined;\n attachmentPreviewListTemplate:\n | TemplateRef<AttachmentPreviewListContext>\n | undefined;\n textareaPlaceholder: string;\n fileInputId = uuidv4();\n isComposerOpen = false;\n @ViewChild('fileInput') private fileInput!: ElementRef<HTMLInputElement>;\n @ViewChild(TextareaDirective, { static: false })\n private textareaAnchor!: TextareaDirective;\n private subscriptions: Subscription[] = [];\n private hideNotification: (() => void) | undefined;\n private isViewInited = false;\n private channel: Channel | undefined;\n private sendMessageSubcription: Subscription | undefined;\n private readonly defaultTextareaPlaceholder = 'streamChat.Type your message';\n private readonly slowModeTextareaPlaceholder = 'streamChat.Slow Mode ON';\n private messageToEdit?: StreamMessage;\n private pollId: string | undefined;\n private isChannelChangeResetInProgress = false;\n private isSendingMessage = false;\n private isLoadingDraft = false;\n\n constructor(\n private channelService: ChannelService,\n private notificationService: NotificationService,\n public readonly attachmentService: AttachmentService,\n private configService: MessageInputConfigService,\n @Inject(textareaInjectionToken)\n private textareaType: Type<TextareaInterface>,\n private componentFactoryResolver: ComponentFactoryResolver,\n private cdRef: ChangeDetectorRef,\n private emojiInputService: EmojiInputService,\n readonly customTemplatesService: CustomTemplatesService,\n private messageActionsService: MessageActionsService,\n public readonly voiceRecorderService: VoiceRecorderService,\n @Optional() public audioRecorder?: AudioRecorderService\n ) {\n this.textareaPlaceholder = this.defaultTextareaPlaceholder;\n this.subscriptions.push(\n this.attachmentService.attachmentUploadInProgressCounter$.subscribe(\n (counter) => {\n if (counter === 0 && this.hideNotification) {\n this.hideNotification();\n this.hideNotification = undefined;\n }\n }\n )\n );\n this.subscriptions.push(\n this.attachmentService.attachmentUploads$\n .pipe(\n distinctUntilChanged(\n (prev, current) =>\n prev.filter((v) => v.state === 'success').length ===\n current.filter((v) => v.state === 'success').length\n )\n )\n .subscribe(() => {\n this.updateMessageDraft();\n })\n );\n this.subscriptions.push(\n this.attachmentService.customAttachments$.subscribe(() => {\n this.updateMessageDraft();\n })\n );\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe((channel) => {\n if (channel && this.channel && channel.id !== this.channel.id) {\n this.textareaValue = '';\n this.attachmentService.resetAttachmentUploads();\n this.pollId = undefined;\n this.voiceRecorderService.isRecorderVisible$.next(false);\n // Preemptively deselect quoted message, to avoid unwanted draft emission\n this.channelService.selectMessageToQuote(undefined);\n }\n const capabilities = channel?.data?.own_capabilities as string[];\n if (capabilities) {\n this.isFileUploadAuthorized =\n capabilities.indexOf('upload-file') !== -1;\n this.canSendLinks = capabilities.indexOf('send-links') !== -1;\n this.canSendPolls = capabilities.indexOf('send-poll') !== -1;\n this.channel = channel;\n this.setCanSendMessages();\n }\n })\n );\n this.subscriptions.push(\n this.channelService.channelSwitchState$.subscribe((state) => {\n this.isChannelChangeResetInProgress = state === 'start';\n })\n );\n this.subscriptions.push(\n this.channelService.messageToQuote$.subscribe((m) => {\n const isThreadReply = m && m.parent_id;\n if (\n (this.mode === 'thread' && isThreadReply) ||\n (this.mode === 'thread' && this.quotedMessage && !m) ||\n (this.mode === 'main' && !isThreadReply)\n ) {\n this.quotedMessage = m;\n this.updateMessageDraft();\n }\n })\n );\n this.subscriptions.push(\n this.messageActionsService.messageToEdit$.subscribe((message) => {\n this.messageToEdit = message;\n this.checkIfInEditMode();\n })\n );\n this.attachmentUploads$ = this.attachmentService.attachmentUploads$;\n this.customAttachments$ = this.attachmentService.customAttachments$;\n this.attachmentUploadInProgressCounter$ =\n this.attachmentService.attachmentUploadInProgressCounter$;\n this.isFileUploadEnabled = this.configService.isFileUploadEnabled;\n this.isMultipleFileUploadEnabled =\n this.configService.isMultipleFileUploadEnabled;\n this.areMentionsEnabled = this.configService.areMentionsEnabled;\n this.mentionScope = this.configService.mentionScope;\n this.inputMode = this.configService.inputMode;\n\n this.subscriptions.push(\n this.typingStart$.subscribe(\n () => void this.channelService.typingStarted(this.parentMessageId)\n )\n );\n this.subscriptions.push(\n this.voiceRecorderService.isRecorderVisible$.subscribe((isVisible) => {\n this.isVoiceRecording = isVisible;\n })\n );\n\n this.subscriptions.push(\n combineLatest([\n this.channelService.latestMessageDateByUserByChannels$,\n this.channelService.activeChannel$,\n ])\n .pipe(\n map(\n ([latestMessages, channel]): [\n Date | undefined,\n Channel | undefined\n ] => [latestMessages[channel?.cid || ''], channel!]\n )\n )\n .subscribe(([latestMessageDate, channel]) => {\n const cooldown =\n (channel?.data?.cooldown as number) &&\n latestMessageDate &&\n Math.round(\n (channel?.data?.cooldown as number) -\n (new Date().getTime() - latestMessageDate.getTime()) / 1000\n );\n if (\n cooldown &&\n cooldown > 0 &&\n (channel?.data?.own_capabilities as string[]).includes('slow-mode')\n ) {\n this.startCooldown(cooldown);\n } else if (this.isCooldownInProgress) {\n this.stopCooldown();\n }\n })\n );\n this.subscriptions.push(\n this.voiceRecorderService.recording$.subscribe((recording) => {\n if (recording) {\n void this.voiceRecordingReady(recording);\n }\n })\n );\n }\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.customTemplatesService.emojiPickerTemplate$.subscribe((template) => {\n this.emojiPickerTemplate = template;\n this.cdRef.detectChanges();\n })\n );\n this.subscriptions.push(\n this.customTemplatesService.attachmentPreviewListTemplate$.subscribe(\n (template) => {\n this.attachmentPreviewListTemplate = template;\n this.cdRef.detectChanges();\n }\n )\n );\n this.subscriptions.push(\n this.customTemplatesService.customAttachmentUploadTemplate$.subscribe(\n (template) => {\n this.customAttachmentUploadTemplate = template;\n this.cdRef.detectChanges();\n }\n )\n );\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n this.initTextarea();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.message) {\n this.messageToUpdateChanged();\n }\n if (changes.isFileUploadEnabled) {\n this.configService.isFileUploadEnabled = this.isFileUploadEnabled;\n }\n if (changes.isMultipleFileUploadEnabled) {\n this.configService.isMultipleFileUploadEnabled =\n this.isMultipleFileUploadEnabled;\n }\n if (changes.areMentionsEnabled) {\n this.configService.areMentionsEnabled = this.areMentionsEnabled;\n }\n if (changes.mentionScope) {\n this.configService.mentionScope = this.mentionScope;\n }\n if (changes.mode) {\n this.setCanSendMessages();\n this.checkIfInEditMode();\n }\n if (changes.watchForMessageToEdit) {\n this.checkIfInEditMode();\n }\n if (changes.inputMode) {\n this.configService.inputMode = this.inputMode;\n }\n if (changes.sendMessage$) {\n if (this.sendMessageSubcription) {\n this.sendMessageSubcription.unsubscribe();\n }\n if (this.sendMessage$) {\n this.sendMessageSubcription = this.sendMessage$.subscribe(\n () => void this.messageSent()\n );\n }\n }\n }\n\n ngOnDestroy(): void {\n if (this.sendMessageSubcription) {\n this.sendMessageSubcription.unsubscribe();\n }\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n async messageSent() {\n if (this.isCooldownInProgress) {\n return;\n }\n this.isSendingMessage = true;\n let attachmentUploadInProgressCounter!: number;\n this.attachmentService.attachmentUploadInProgressCounter$\n .pipe(first())\n .subscribe((counter) => (attachmentUploadInProgressCounter = counter));\n if (attachmentUploadInProgressCounter > 0) {\n if (!this.hideNotification) {\n this.hideNotification =\n this.notificationService.addPermanentNotification(\n 'streamChat.Wait until all attachments have uploaded'\n );\n }\n return;\n }\n const attachments = this.attachmentService.mapToAttachments();\n let text = this.textareaValue;\n text = text.replace(/^\\n+/g, ''); // leading empty lines\n text = text.replace(/\\n+$/g, ''); // ending empty lines\n const textContainsOnlySpaceChars = !text.replace(/ /g, ''); //spcae\n if (\n (!text || textContainsOnlySpaceChars) &&\n (!attachments || attachments.length === 0) &&\n !this.pollId\n ) {\n return;\n }\n if (textContainsOnlySpaceChars) {\n text = '';\n }\n if (this.containsLinks && !this.canSendLinks) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Sending links is not allowed in this conversation'\n );\n return;\n }\n const pollId = this.pollId;\n if (!this.isUpdate) {\n this.textareaValue = '';\n this.pollId = undefined;\n }\n try {\n const message = await (this.isUpdate\n ? this.channelService.updateMessage({\n ...this.message!,\n text: text,\n attachments: attachments,\n })\n : this.channelService.sendMessage(\n text,\n attachments,\n this.mentionedUsers,\n this.parentMessageId,\n this.quotedMessage?.id,\n undefined,\n pollId\n ));\n this.messageUpdate.emit({ message });\n if (this.isUpdate) {\n this.deselectMessageToEdit();\n } else {\n this.attachmentService.resetAttachmentUploads();\n }\n } catch (error) {\n this.isSendingMessage = false;\n if (this.isUpdate) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Edit message request failed'\n );\n }\n } finally {\n this.isSendingMessage = false;\n this.updateMessageDraft();\n }\n void this.channelService.typingStopped(this.parentMessageId);\n if (this.quotedMessage) {\n this.deselectMessageToQuote();\n }\n }\n\n get containsLinks() {\n return /(?:(?:https?|ftp):\\/\\/)?[\\w/\\-?=%.]+\\.[\\w/\\-&?=%.]+/.test(\n this.textareaValue\n );\n }\n\n get quotedMessageAttachments() {\n const originalAttachments = this.quotedMessage?.attachments;\n return originalAttachments && originalAttachments.length\n ? [originalAttachments[0]]\n : [];\n }\n\n get disabledTextareaText() {\n if (!this.canSendMessages) {\n return this.mode === 'thread'\n ? \"streamChat.You can't send thread replies in this channel\"\n : \"streamChat.You can't send messages in this channel\";\n }\n return '';\n }\n\n itemsPasted(event: ClipboardEvent) {\n if (this.configService.customPasteEventHandler) {\n this.configService.customPasteEventHandler(event, this);\n } else {\n if (event.clipboardData?.files && event.clipboardData?.files.length > 0) {\n event.preventDefault();\n void this.filesSelected(event.clipboardData?.files);\n }\n }\n }\n\n async filesSelected(fileList: FileList | null) {\n await this.attachmentService.filesSelected(fileList);\n this.clearFileInput();\n }\n\n deselectMessageToQuote() {\n this.channelService.selectMessageToQuote(undefined);\n }\n\n deselectMessageToEdit() {\n this.messageActionsService.messageToEdit$.next(undefined);\n }\n\n getEmojiPickerContext(): EmojiPickerContext {\n return {\n emojiInput$: this.emojiInputService.emojiInput$,\n };\n }\n\n getAttachmentPreviewListContext(): AttachmentPreviewListContext {\n return {\n attachmentUploads$: this.attachmentService.attachmentUploads$,\n deleteUploadHandler: this.deleteUpload.bind(this),\n retryUploadHandler: this.retryUpload.bind(this),\n service: this.attachmentService,\n };\n }\n\n getAttachmentUploadContext(): CustomAttachmentUploadContext {\n return {\n isMultipleFileUploadEnabled: this.isMultipleFileUploadEnabled,\n attachmentService: this.attachmentService,\n };\n }\n\n getQuotedMessageTextContext(): MessageTextContext {\n return {\n message: this.quotedMessage,\n isQuoted: true,\n shouldTranslate: true,\n };\n }\n\n async startVoiceRecording() {\n await this.audioRecorder?.start();\n if (this.audioRecorder?.isRecording) {\n this.voiceRecorderService.isRecorderVisible$.next(true);\n }\n }\n\n openPollComposer() {\n this.isComposerOpen = true;\n }\n\n closePollComposer = () => {\n this.isComposerOpen = false;\n };\n\n addPoll = (pollId: string) => {\n this.isComposerOpen = false;\n this.pollId = pollId;\n this.updateMessageDraft();\n void this.messageSent();\n };\n\n userMentionsChanged(userMentions: UserResponse[]) {\n if (\n userMentions.map((u) => u.id).join(',') !==\n this.mentionedUsers.map((u) => u.id).join(',')\n ) {\n this.mentionedUsers = userMentions;\n this.updateMessageDraft();\n }\n }\n\n updateMessageDraft() {\n if (\n this.isLoadingDraft ||\n this.isSendingMessage ||\n this.isChannelChangeResetInProgress ||\n this.isUpdate\n ) {\n return;\n }\n const attachments = this.attachmentService.mapToAttachments();\n\n if (\n !this.textareaValue &&\n !this.mentionedUsers.length &&\n !attachments?.length &&\n !this.pollId &&\n !this.quotedMessage?.id\n ) {\n this.messageDraftChange.emit(undefined);\n } else {\n this.messageDraftChange.emit({\n text: this.textareaValue,\n attachments: this.attachmentService.mapToAttachments(),\n mentioned_users: this.mentionedUsers.map((user) => user.id),\n poll_id: this.pollId,\n parent_id: this.parentMessageId,\n quoted_message_id: this.quotedMessage?.id,\n });\n }\n }\n\n async voiceRecordingReady(recording: AudioRecording) {\n try {\n await this.attachmentService.uploadVoiceRecording(recording);\n if (this.configService.sendVoiceRecordingImmediately) {\n await this.messageSent();\n }\n } finally {\n this.voiceRecorderService.isRecorderVisible$.next(false);\n }\n }\n\n get isUpdate() {\n return !!this.message;\n }\n\n /**\n *\n * @param draft DraftResponse to load into the message input.\n * - Draft messages are only supported for new messages, input is ignored in edit mode (if `message` input is set).\n * - If channel id doesn't match the active channel id, the draft is ignored.\n * - If a thread message is loaded, and the input isn't in thread mode or parent ids don't match, the draft is ignored.\n */\n loadDraft(draft: DraftResponse) {\n if (\n this.channel?.cid !== draft.channel_cid ||\n draft?.message?.parent_id !== this.parentMessageId ||\n this.isUpdate\n ) {\n return;\n }\n this.isLoadingDraft = true;\n\n this.textareaValue = draft.message?.text || '';\n this.mentionedUsers =\n draft?.message?.mentioned_users?.map((id) => ({ id })) || [];\n this.pollId = draft?.message?.poll_id;\n this.attachmentService.resetAttachmentUploads();\n this.attachmentService.createFromAttachments(\n draft?.message?.attachments || []\n );\n this.channelService.selectMessageToQuote(draft.quoted_message);\n this.isLoadingDraft = false;\n }\n\n private deleteUpload(upload: AttachmentUpload) {\n if (this.isUpdate) {\n // Delay delete to avoid modal detecting this click as outside click\n setTimeout(() => {\n void this.attachmentService.deleteAttachment(upload);\n });\n } else {\n void this.attachmentService.deleteAttachment(upload);\n }\n }\n\n private retryUpload(file: File) {\n void this.attachmentService.retryAttachmentUpload(file);\n }\n\n private clearFileInput() {\n this.fileInput.nativeElement.value = '';\n }\n\n private initTextarea() {\n // cleanup previously built textarea\n if (!this.canSendMessages) {\n this.textareaRef = undefined;\n }\n\n if (!this.canSendMessages || this.textareaRef || !this.textareaAnchor) {\n return;\n }\n\n const componentFactory =\n this.componentFactoryResolver.resolveComponentFactory(this.textareaType);\n this.textareaRef =\n this.textareaAnchor.viewContainerRef.createComponent<TextareaInterface>(\n componentFactory\n );\n this.cdRef.detectChanges();\n }\n\n private setCanSendMessages() {\n const capabilities = this.channel?.data?.own_capabilities as string[];\n if (!capabilities) {\n this.canSendMessages = false;\n } else {\n this.canSendMessages =\n capabilities.indexOf(\n this.mode === 'main' ? 'send-message' : 'send-reply'\n ) !== -1 || this.isUpdate;\n }\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n this.initTextarea();\n }\n }\n\n private get parentMessageId() {\n let parentMessageId: string | undefined = undefined;\n if (this.mode === 'thread') {\n this.channelService.activeParentMessageId$\n .pipe(first())\n .subscribe((id) => (parentMessageId = id));\n }\n\n return parentMessageId;\n }\n\n private startCooldown(cooldown: number) {\n this.textareaPlaceholder = this.slowModeTextareaPlaceholder;\n this.isCooldownInProgress = true;\n this.cooldown$ = timer(0, 1000).pipe(\n take(cooldown + 1),\n map((v) => cooldown - v),\n tap((v) => {\n if (v === 0) {\n this.stopCooldown();\n }\n })\n );\n }\n\n private stopCooldown() {\n this.cooldown$ = undefined;\n this.isCooldownInProgress = false;\n this.textareaPlaceholder = this.defaultTextareaPlaceholder;\n }\n\n private checkIfInEditMode() {\n if (!this.watchForMessageToEdit) {\n return;\n }\n if (!this.messageToEdit && this.message) {\n this.message = undefined;\n this.messageToUpdateChanged();\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n if (\n this.messageToEdit &&\n ((this.mode === 'main' && !this.messageToEdit.parent_id) ||\n (this.mode === 'thread' && this.messageToEdit.parent_id))\n ) {\n this.message = this.messageToEdit;\n this.messageToUpdateChanged();\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n }\n\n private messageToUpdateChanged() {\n this.attachmentService.resetAttachmentUploads();\n this.setCanSendMessages();\n if (this.isUpdate) {\n this.attachmentService.createFromAttachments(\n this.message!.attachments || []\n );\n this.textareaValue = this.message!.text || '';\n this.pollId = this.message!.poll_id;\n } else {\n this.textareaValue = '';\n this.pollId = undefined;\n }\n }\n}\n","<div\n class=\"str-chat__message-input str-chat-angular__message-input\"\n [style.display]=\"isVoiceRecording ? 'none' : 'flex'\"\n>\n <div *ngIf=\"quotedMessage\" class=\"str-chat__quoted-message-preview-header\">\n <div class=\"str-chat__quoted-message-reply-to-message\">\n {{ \"streamChat.Reply to Message\" | translate }}\n </div>\n <button\n class=\"str-chat__quoted-message-remove\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToQuote()\"\n (keyup.enter)=\"deselectMessageToQuote()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </button>\n </div>\n <div *ngIf=\"isUpdate\" class=\"str-chat__quoted-message-preview-header\">\n <div class=\"str-chat__quoted-message-reply-to-message\">\n {{ \"streamChat.Edit Message\" | translate }}\n </div>\n <button\n class=\"str-chat__quoted-message-remove\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToEdit()\"\n (keyup.enter)=\"deselectMessageToEdit()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </button>\n </div>\n <ng-container *ngIf=\"canSendMessages; else notAllowed\">\n <div\n class=\"str-chat__message-input-inner str-chat-angular__message-input-inner\"\n >\n <ng-content select=\"[message-input-start]\"></ng-content>\n <ng-container\n *ngIf=\"isFileUploadEnabled && isFileUploadAuthorized && canSendMessages\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n customAttachmentUploadTemplate || defaultAttachmentUpload;\n context: getAttachmentUploadContext()\n \"\n ></ng-container>\n <ng-template #defaultAttachmentUpload>\n <div\n class=\"str-chat__file-input-container\"\n data-testid=\"file-upload-button\"\n >\n <input\n #fileInput\n type=\"file\"\n class=\"str-chat__file-input\"\n data-testid=\"file-input\"\n [multiple]=\"isMultipleFileUploadEnabled\"\n id=\"{{ fileInputId }}\"\n [disabled]=\"\n (attachmentService.attachmentsCounter$ | async)! >=\n attachmentService.maxNumberOfAttachments\n \"\n (change)=\"filesSelected(fileInput.files)\"\n />\n <label class=\"str-chat__file-input-label\" for=\"{{ fileInputId }}\">\n <stream-icon-placeholder icon=\"attach\"></stream-icon-placeholder>\n </label>\n </div>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"canSendPolls && displayPollCreateButton && mode !== 'thread'\"\n >\n <button\n class=\"str-chat-angular__create-poll\"\n (click)=\"openPollComposer()\"\n >\n <stream-icon-placeholder icon=\"poll\"></stream-icon-placeholder>\n </button>\n </ng-container>\n <div class=\"str-chat__message-textarea-container\">\n <div\n *ngIf=\"quotedMessage\"\n data-testid=\"quoted-message-container\"\n class=\"str-chat__quoted-message-preview\"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"quoted-message-sender\"\n [imageUrl]=\"quotedMessage.user?.image\"\n [name]=\"quotedMessage.user?.name || quotedMessage.user?.id\"\n [user]=\"quotedMessage.user || undefined\"\n ></stream-avatar-placeholder>\n <div\n class=\"quoted-message-preview-content-inner str-chat__quoted-message-bubble\"\n >\n <stream-attachment-list\n *ngIf=\"\n quotedMessage?.attachments && quotedMessage?.attachments?.length\n \"\n [attachments]=\"quotedMessageAttachments\"\n [messageId]=\"quotedMessage.id\"\n ></stream-attachment-list>\n <ng-container\n *ngIf=\"\n quotedMessage?.poll_id &&\n (customTemplatesService.pollTemplate$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.pollTemplate$ | async)!;\n context: {\n pollId: quotedMessage?.poll_id,\n messageId: quotedMessage?.id,\n isQuote: true\n }\n \"\n ></ng-container>\n </ng-container>\n <div class=\"str-chat__quoted-message-text\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageTextTemplate$ | async) ||\n defaultText;\n context: getQuotedMessageTextContext()\n \"\n ></ng-container>\n <ng-template\n #defaultText\n let-message=\"message\"\n let-isQuoted=\"isQuoted\"\n let-shouldTranslate=\"shouldTranslate\"\n >\n <stream-message-text\n [message]=\"message\"\n [isQuoted]=\"isQuoted\"\n [shouldTranslate]=\"shouldTranslate\"\n data-testid=\"quoted-message-text\"\n ></stream-message-text>\n </ng-template>\n </div>\n </div>\n </div>\n <ng-template\n #defaultAttachmentsPreview\n let-attachmentUploads$=\"attachmentUploads$\"\n let-retryUploadHandler=\"retryUploadHandler\"\n let-deleteUploadHandler=\"deleteUploadHandler\"\n >\n <stream-attachment-preview-list\n class=\"str-chat__attachment-preview-list-angular-host\"\n [attachmentUploads$]=\"attachmentUploads$\"\n (retryAttachmentUpload)=\"retryUploadHandler($event)\"\n (deleteAttachment)=\"deleteUploadHandler($event)\"\n ></stream-attachment-preview-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n attachmentPreviewListTemplate || defaultAttachmentsPreview;\n context: getAttachmentPreviewListContext()\n \"\n ></ng-container>\n <div class=\"str-chat__message-textarea-with-emoji-picker\">\n <ng-container\n streamTextarea\n [componentRef]=\"textareaRef\"\n [areMentionsEnabled]=\"areMentionsEnabled\"\n [mentionScope]=\"mentionScope\"\n [inputMode]=\"inputMode\"\n [autoFocus]=\"autoFocus\"\n [placeholder]=\"textareaPlaceholder\"\n [(value)]=\"textareaValue\"\n (valueChange)=\"typingStart$.next(); updateMessageDraft()\"\n (send)=\"messageSent()\"\n (userMentions)=\"userMentionsChanged($event)\"\n (pasteFromClipboard)=\"itemsPasted($event)\"\n ></ng-container>\n <ng-container *ngIf=\"emojiPickerTemplate\" data-testid=\"emoji-picker\">\n <ng-container\n *ngTemplateOutlet=\"\n emojiPickerTemplate;\n context: getEmojiPickerContext()\n \"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n <button\n *ngIf=\"canSendMessages && !isCooldownInProgress && displaySendButton\"\n data-testid=\"send-button\"\n class=\"str-chat__send-button\"\n [disabled]=\"\n (attachmentUploadInProgressCounter$ | async)! > 0 ||\n (attachmentService.attachmentsCounter$ | async)! >\n attachmentService.maxNumberOfAttachments ||\n (!textareaValue &&\n (attachmentUploads$ | async)!.length === 0 &&\n (customAttachments$ | async)!.length === 0)\n \"\n (click)=\"messageSent()\"\n (keyup.enter)=\"messageSent()\"\n >\n <stream-icon-placeholder icon=\"send\"></stream-icon-placeholder>\n </button>\n <div\n *ngIf=\"isCooldownInProgress\"\n class=\"str-chat__message-input-cooldown\"\n data-testid=\"cooldown-timer\"\n >\n {{ cooldown$ | async }}\n </div>\n <button\n *ngIf=\"displayVoiceRecordingButton\"\n class=\"str-chat__start-recording-audio-button\"\n data-testid=\"start-voice-recording\"\n [disabled]=\"\n voiceRecorderService.isRecorderVisible$.value ||\n audioRecorder?.isRecording ||\n (attachmentService.attachmentsCounter$ | async)! >=\n attachmentService.maxNumberOfAttachments\n \"\n (click)=\"startVoiceRecording()\"\n (keyup.enter)=\"startVoiceRecording()\"\n >\n <stream-icon-placeholder icon=\"mic\"></stream-icon-placeholder>\n </button>\n <ng-content select=\"[message-input-end]\"></ng-content>\n </div>\n </ng-container>\n <ng-template #notAllowed>\n <div\n class=\"str-chat__message-input-not-allowed\"\n data-testid=\"disabled-textarea\"\n >\n {{ disabledTextareaText | translate }}\n </div>\n </ng-template>\n</div>\n<ng-template\n *ngIf=\"voiceRecorderRef\"\n [ngTemplateOutlet]=\"voiceRecorderRef\"\n [ngTemplateOutletContext]=\"{ service: voiceRecorderService }\"\n></ng-template>\n<ng-template\n *ngIf=\"\n isComposerOpen && (customTemplatesService.pollComposerTemplate$ | async)\n \"\n [ngTemplateOutlet]=\"(customTemplatesService.pollComposerTemplate$ | async)!\"\n [ngTemplateOutletContext]=\"{\n pollCompose: addPoll,\n cancel: closePollComposer\n }\"\n></ng-template>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { EmojiInputService } from '../emoji-input.service';\nimport { TextareaInterface } from '../textarea.interface';\nimport { UserResponse } from 'stream-chat';\n\n/**\n * The `Textarea` component is used by the [`MessageInput`](/chat/docs/sdk/angular/components/MessageInputComponent/) component to display the input HTML element where users can type their message.\n */\n@Component({\n selector: 'stream-textarea',\n templateUrl: './textarea.component.html',\n styles: [],\n})\nexport class TextareaComponent\n implements TextareaInterface, OnChanges, OnDestroy, AfterViewInit\n{\n @HostBinding() class =\n 'str-chat__textarea str-chat__message-textarea-angular-host';\n /**\n * The value of the input HTML element.\n */\n @Input() value = '';\n /**\n * Placeholder of the textarea\n */\n @Input() placeholder = '';\n /**\n * See [`MessageInputConfigService`](/chat/docs/sdk/angular/services/MessageInputConfigService) for more information\n */\n @Input() inputMode!: 'desktop' | 'mobile';\n /**\n * Enables or disables auto focus on the textarea element\n */\n @Input() autoFocus = true;\n /**\n * Emits the current value of the input element when a user types.\n */\n @Output() readonly valueChange = new EventEmitter<string>();\n /**\n * Emits when a user triggers a message send event (this happens when they hit the `Enter` key).\n */\n @Output() readonly send = new EventEmitter<void>();\n /**\n * Emits any paste event that occured inside the textarea\n */\n @Output() readonly pasteFromClipboard = new EventEmitter<ClipboardEvent>();\n @ViewChild('input') private messageInput!: ElementRef<HTMLInputElement>;\n userMentions?: EventEmitter<UserResponse[]> | undefined;\n areMentionsEnabled?: boolean | undefined;\n mentionScope?: 'channel' | 'application' | undefined;\n private subscriptions: Subscription[] = [];\n private isViewInited = false;\n\n constructor(private emojiInputService: EmojiInputService) {\n this.subscriptions.push(\n this.emojiInputService.emojiInput$.subscribe((emoji) => {\n this.messageInput.nativeElement.focus();\n const { selectionStart } = this.messageInput.nativeElement;\n this.messageInput.nativeElement.setRangeText(emoji);\n this.messageInput.nativeElement.selectionStart =\n selectionStart! + emoji.length;\n this.messageInput.nativeElement.selectionEnd =\n selectionStart! + emoji.length;\n this.inputChanged();\n })\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.value && !this.value && this.messageInput) {\n this.messageInput.nativeElement.style.height = 'auto';\n } else if (\n changes.value &&\n this.value &&\n this.messageInput &&\n this.isViewInited\n ) {\n setTimeout(() => {\n if (this.messageInput.nativeElement.scrollHeight > 0) {\n this.adjustTextareaHeight();\n }\n }, 0);\n }\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n if (this.messageInput.nativeElement.scrollHeight > 0 && this.value) {\n this.adjustTextareaHeight();\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n inputChanged() {\n this.valueChange.emit(this.messageInput.nativeElement.value);\n this.adjustTextareaHeight();\n }\n\n enterHit(event: Event) {\n if (this.inputMode === 'desktop' && !(event as KeyboardEvent).isComposing) {\n event.preventDefault();\n this.send.next();\n }\n }\n\n private adjustTextareaHeight() {\n this.messageInput.nativeElement.style.height = '';\n this.messageInput.nativeElement.style.height = `${this.messageInput.nativeElement.scrollHeight}px`;\n }\n}\n","<textarea\n #input\n data-testid=\"textarea\"\n class=\"rta__textarea str-chat__textarea__textarea str-chat__angular-textarea str-chat__message-textarea\"\n rows=\"1\"\n [value]=\"value || ''\"\n [autofocus]=\"autoFocus\"\n placeholder=\"{{ placeholder | translate }}\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"enterHit($event)\"\n (paste)=\"pasteFromClipboard.emit($event)\"\n></textarea>\n","import { Injectable } from '@angular/core';\nimport transliterate from '@stream-io/transliterate';\n\n/**\n * The `TransliterationService` wraps the [@sindresorhus/transliterate](https://www.npmjs.com/package/@sindresorhus/transliterate) library\n */\n@Injectable({ providedIn: 'root' })\nexport class TransliterationService {\n constructor() {}\n\n /**\n *\n * @param s the string to be transliterated\n * @returns the result of the transliteration\n */\n transliterate(s: string) {\n return transliterate(s);\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { MentionConfig, Mentions } from 'angular-mentions';\nimport {\n MentionAutcompleteListItemContext,\n MentionAutcompleteListItem,\n CommandAutocompleteListItemContext,\n} from '../../types';\n\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { UserResponse } from 'stream-chat';\nimport { ChannelService } from '../../channel.service';\nimport { TextareaInterface } from '../textarea.interface';\nimport { ChatClientService } from '../../chat-client.service';\nimport { debounceTime, filter } from 'rxjs/operators';\nimport { TransliterationService } from '../../transliteration.service';\nimport { EmojiInputService } from '../emoji-input.service';\nimport { CustomTemplatesService } from '../../custom-templates.service';\nimport { MessageInputConfigService } from '../message-input-config.service';\n\n/**\n * The `AutocompleteTextarea` component is used by the [`MessageInput`](/chat/docs/sdk/angular/components/MessageInputComponent/) component to display the input HTML element where users can type their message.\n */\n@Component({\n selector: 'stream-autocomplete-textarea',\n templateUrl: './autocomplete-textarea.component.html',\n styles: [],\n})\nexport class AutocompleteTextareaComponent\n implements TextareaInterface, OnChanges, AfterViewInit\n{\n @HostBinding() class =\n 'str-chat__textarea str-chat__message-textarea-angular-host';\n /**\n * The value of the input HTML element.\n */\n @Input() value = '';\n /**\n * Placeholder of the textarea\n */\n @Input() placeholder = '';\n /**\n * If true, users can mention other users in messages. You can also set this input on the [`MessageInput`](/chat/docs/sdk/angular/components/MessageInputComponent/#inputs-and-outputs/) component.\n */\n @Input() areMentionsEnabled: boolean | undefined = true;\n /**\n * See [`MessageInputConfigService`](/chat/docs/sdk/angular/services/MessageInputConfigService) for more information\n */\n @Input() inputMode!: 'desktop' | 'mobile';\n /**\n * The scope for user mentions, either members of the current channel of members of the application. You can also set this input on the [`MessageInput`](/chat/docs/sdk/angular/components/MessageInputComponent/#inputs-and-outputs) component.\n */\n @Input() mentionScope: 'channel' | 'application' = 'channel';\n /**\n * Enables or disables auto focus on the textarea element\n */\n @Input() autoFocus = true;\n /**\n * Emits the current value of the input element when a user types.\n */\n @Output() readonly valueChange = new EventEmitter<string>();\n /**\n * Emits when a user triggers a message send event (this happens when they hit the `Enter` key).\n */\n @Output() readonly send = new EventEmitter<void>();\n /**\n * Emits the array of users that are mentioned in the message, it is updated when a user mentions a new user or deletes a mention.\n */\n @Output() readonly userMentions = new EventEmitter<UserResponse[]>();\n /**\n * Emits any paste event that occured inside the textarea\n */\n @Output() readonly pasteFromClipboard = new EventEmitter<ClipboardEvent>();\n mentionAutocompleteItemTemplate:\n | TemplateRef<MentionAutcompleteListItemContext>\n | undefined;\n commandAutocompleteItemTemplate:\n | TemplateRef<CommandAutocompleteListItemContext>\n | undefined;\n private readonly autocompleteKey = 'autocompleteLabel';\n private readonly mentionTriggerChar = '@';\n private readonly commandTriggerChar = '/';\n autocompleteConfig: MentionConfig = {\n mentions: [],\n };\n @ViewChild('input') private messageInput!: ElementRef<HTMLInputElement>;\n private subscriptions: Subscription[] = [];\n private mentionedUsers: UserResponse[] = [];\n private userMentionConfig: Mentions = {\n triggerChar: this.mentionTriggerChar,\n dropUp: true,\n allowSpace: true,\n labelKey: this.autocompleteKey,\n returnTrigger: true,\n mentionFilter: (\n searchString: string,\n items: { autocompleteLabel: string }[]\n ) => this.filter(searchString, items),\n mentionSelect: (item, triggerChar) =>\n this.itemSelectedFromAutocompleteList(\n item as MentionAutcompleteListItem,\n triggerChar\n ),\n };\n private slashCommandConfig: Mentions = {\n triggerChar: this.commandTriggerChar,\n dropUp: true,\n labelKey: 'name',\n returnTrigger: true,\n mentionFilter: (\n searchString: string,\n items: { autocompleteLabel: string }[]\n ) => this.filter(searchString, items),\n mentionSelect: (item, triggerChar) =>\n this.itemSelectedFromAutocompleteList(\n item as MentionAutcompleteListItem,\n triggerChar\n ),\n };\n private searchTerm$ = new BehaviorSubject<string>('');\n private isViewInited = false;\n\n constructor(\n private channelService: ChannelService,\n private chatClientService: ChatClientService,\n private transliterationService: TransliterationService,\n private emojiInputService: EmojiInputService,\n private customTemplatesService: CustomTemplatesService,\n private cdRef: ChangeDetectorRef,\n private messageInputConfigService: MessageInputConfigService\n ) {\n this.searchTerm$\n .pipe(\n filter((searchTerm) => searchTerm.length !== 1),\n debounceTime(300)\n )\n .subscribe((searchTerm) => {\n if (searchTerm.startsWith(this.mentionTriggerChar)) {\n void this.updateMentionOptions(searchTerm);\n } else {\n void this.updateCustomAutocompleteOptions(searchTerm);\n }\n });\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe((channel) => {\n const commands = channel?.getConfig()?.commands || [];\n this.slashCommandConfig.items = commands.map((c) => ({\n ...c,\n [this.autocompleteKey]: c.name,\n type: 'command',\n }));\n this.mentionedUsers = [];\n this.userMentions.next([...this.mentionedUsers]);\n void this.updateMentionOptions(this.searchTerm$.getValue());\n void this.updateCustomAutocompleteOptions(this.searchTerm$.getValue());\n })\n );\n this.subscriptions.push(\n this.emojiInputService.emojiInput$.subscribe((emoji) => {\n this.messageInput.nativeElement.focus();\n const { selectionStart } = this.messageInput.nativeElement;\n this.messageInput.nativeElement.setRangeText(emoji);\n this.messageInput.nativeElement.selectionStart =\n selectionStart! + emoji.length;\n this.messageInput.nativeElement.selectionEnd =\n selectionStart! + emoji.length;\n this.inputChanged();\n })\n );\n this.subscriptions.push(\n this.customTemplatesService.mentionAutocompleteItemTemplate$.subscribe(\n (template) => (this.mentionAutocompleteItemTemplate = template)\n )\n );\n this.subscriptions.push(\n this.customTemplatesService.commandAutocompleteItemTemplate$.subscribe(\n (template) => (this.commandAutocompleteItemTemplate = template)\n )\n );\n this.autocompleteConfig.mentions = [\n this.userMentionConfig,\n this.slashCommandConfig,\n ];\n this.subscriptions.push(\n this.messageInputConfigService.customAutocompletes$.subscribe(\n (customConfigs) => {\n const builtInItems =\n this.autocompleteConfig.mentions?.filter(\n (m) =>\n m === this.userMentionConfig || m === this.slashCommandConfig\n ) ?? [];\n const transformedCustomConfigs = customConfigs.map((c) => {\n const copy: Mentions = {\n items: c.options.map((o) => ({\n ...o,\n templateRef: c.templateRef,\n })),\n triggerChar: c.triggerCharacter,\n dropUp: true,\n labelKey: this.autocompleteKey,\n returnTrigger: true,\n allowSpace: c.allowSpace,\n mentionFilter: (\n searchString: string,\n items: { autocompleteLabel: string }[]\n ) => this.filter(searchString, items),\n mentionSelect: (item, triggerChar) =>\n this.itemSelectedFromAutocompleteList(\n item as MentionAutcompleteListItem,\n triggerChar\n ),\n };\n\n return copy;\n });\n\n this.autocompleteConfig.mentions = [\n ...builtInItems,\n ...transformedCustomConfigs,\n ];\n this.autocompleteConfig = { ...this.autocompleteConfig };\n }\n )\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.areMentionsEnabled) {\n this.autocompleteConfig.mentions =\n this.autocompleteConfig?.mentions?.filter((c) => {\n if (c !== this.userMentionConfig) {\n return true;\n } else {\n return this.areMentionsEnabled;\n }\n }) ?? [];\n this.autocompleteConfig = { ...this.autocompleteConfig };\n }\n if (changes.mentionScope) {\n void this.updateMentionOptions(this.searchTerm$.getValue());\n }\n if (changes.value && !this.value && this.messageInput) {\n this.messageInput.nativeElement.style.height = 'auto';\n this.chatClientService?.chatClient?.logger?.(\n 'info',\n '[Autocomplete textarea] Value reset, adjusting textarea height to auto'\n );\n this.updateMentionedUsersFromText();\n } else if (\n changes.value &&\n this.value &&\n this.messageInput &&\n this.isViewInited\n ) {\n this.chatClientService?.chatClient?.logger?.(\n 'info',\n '[Autocomplete textarea] Value changed'\n );\n setTimeout(() => {\n if (this.messageInput.nativeElement.scrollHeight > 0) {\n this.adjustTextareaHeight();\n }\n }, 0);\n }\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n this.chatClientService?.chatClient?.logger?.(\n 'info',\n '[Autocomplete textarea] View inited'\n );\n if (this.messageInput.nativeElement.scrollHeight > 0 && this.value) {\n this.adjustTextareaHeight();\n }\n }\n\n filter(searchString: string, items: { autocompleteLabel: string }[]) {\n return items.filter((item) =>\n this.transliterate(item.autocompleteLabel.toLowerCase()).includes(\n this.transliterate(searchString.toLowerCase())\n )\n );\n }\n\n itemSelectedFromAutocompleteList(\n item: MentionAutcompleteListItem,\n triggerChar = ''\n ) {\n if (triggerChar === this.mentionTriggerChar) {\n this.mentionedUsers.push(\n ('user' in item ? item.user : item) as UserResponse\n );\n this.userMentions.next([...this.mentionedUsers]);\n }\n this.searchTerm$.next('');\n return triggerChar + item.autocompleteLabel + ' ';\n }\n\n autcompleteSearchTermChanged(searchTerm: string) {\n if (searchTerm.length === 1) {\n if (searchTerm === this.mentionTriggerChar) {\n void this.updateMentionOptions();\n } else {\n void this.updateCustomAutocompleteOptions(searchTerm);\n }\n }\n this.searchTerm$.next(searchTerm);\n }\n\n inputChanged() {\n this.chatClientService?.chatClient?.logger?.(\n 'info',\n '[Autocomplete textarea] Input changed'\n );\n this.valueChange.emit(this.messageInput.nativeElement.value);\n this.adjustTextareaHeight();\n }\n\n inputLeft() {\n this.updateMentionedUsersFromText();\n }\n\n enterHit(event: Event) {\n if (this.inputMode === 'desktop' && !(event as KeyboardEvent).isComposing) {\n event.preventDefault();\n this.updateMentionedUsersFromText();\n this.send.next();\n }\n }\n\n private adjustTextareaHeight() {\n this.chatClientService?.chatClient?.logger?.(\n 'info',\n `[Autocomplete textarea] Textarea height set from ${this.messageInput.nativeElement.style.height} to ${this.messageInput.nativeElement.scrollHeight}px`\n );\n this.messageInput.nativeElement.style.height = '';\n this.messageInput.nativeElement.style.height = `${this.messageInput.nativeElement.scrollHeight}px`;\n }\n\n private transliterate(s: string) {\n if (this.transliterationService) {\n return this.transliterationService.transliterate(s);\n } else {\n return s;\n }\n }\n\n private async updateMentionOptions(searchTerm?: string) {\n if (!this.areMentionsEnabled) {\n return;\n }\n searchTerm = searchTerm?.replace(this.mentionTriggerChar, '');\n const request =\n this.mentionScope === 'application'\n ? (s: string) => this.chatClientService.autocompleteUsers(s)\n : (s: string) => this.channelService.autocompleteMembers(s);\n const result = await request(searchTerm || '');\n const items = this.filter(\n searchTerm || '',\n result.map((i) => {\n const user = ('user' in i ? i.user : i) as UserResponse;\n return {\n ...i,\n autocompleteLabel: user.name || user.id,\n type: 'mention',\n };\n })\n );\n this.userMentionConfig.items = items;\n this.autocompleteConfig.mentions = [\n ...(this.autocompleteConfig?.mentions ?? []),\n ];\n this.autocompleteConfig = { ...this.autocompleteConfig };\n this.cdRef.detectChanges();\n }\n\n private updateMentionedUsersFromText() {\n const updatedMentionedUsers: UserResponse[] = [];\n this.mentionedUsers.forEach((u) => {\n const key = u.name || u.id;\n if (this.value.includes(`${this.mentionTriggerChar}${key}`)) {\n updatedMentionedUsers.push(u);\n }\n });\n if (updatedMentionedUsers.length !== this.mentionedUsers.length) {\n this.userMentions.next([...updatedMentionedUsers]);\n this.mentionedUsers = updatedMentionedUsers;\n }\n }\n\n private async updateCustomAutocompleteOptions(searchTerm: string) {\n if (\n this.messageInputConfigService.customAutocompletes$.getValue().length ===\n 0\n ) {\n return;\n }\n const customMentionConfig = this.autocompleteConfig.mentions?.find(\n (c) => c.triggerChar && searchTerm.startsWith(c.triggerChar)\n );\n const customAutocompleteConfig = customMentionConfig\n ? this.messageInputConfigService.customAutocompletes$\n .getValue()\n .find((c) => c.triggerCharacter === customMentionConfig?.triggerChar)\n : undefined;\n if (customMentionConfig && customAutocompleteConfig?.updateOptions) {\n const newOptions = await customAutocompleteConfig.updateOptions(\n searchTerm.replace(customMentionConfig.triggerChar || '', '')\n );\n customMentionConfig.items = newOptions.map((o) => ({\n ...o,\n templateRef: customAutocompleteConfig.templateRef,\n }));\n this.autocompleteConfig = { ...this.autocompleteConfig };\n }\n }\n}\n","<textarea\n #input\n data-testid=\"textarea\"\n class=\"rta__textarea str-chat__textarea__textarea str-chat__angular-textarea str-chat__message-textarea\"\n rows=\"1\"\n [value]=\"value || ''\"\n [autofocus]=\"autoFocus\"\n placeholder=\"{{ placeholder | translate }}\"\n [mentionConfig]=\"autocompleteConfig\"\n [mentionListTemplate]=\"autocompleteItem\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"enterHit($event)\"\n (searchTerm)=\"autcompleteSearchTermChanged($event)\"\n (blur)=\"inputLeft()\"\n (paste)=\"pasteFromClipboard.emit($event)\"\n></textarea>\n<ng-template #autocompleteItem let-item=\"item\">\n <ng-container *ngIf=\"item.templateRef; else builtinItem\">\n <ng-container\n *ngTemplateOutlet=\"item.templateRef; context: { item: item }\"\n ></ng-container>\n </ng-container>\n <ng-template #builtinItem>\n <div\n class=\"rta rta__item str-chat__emojisearch__item\"\n [ngSwitch]=\"item.type\"\n >\n <div *ngSwitchCase=\"'mention'\" class=\"rta__entity\">\n <ng-container\n *ngTemplateOutlet=\"\n mentionAutocompleteItemTemplate || defaultMentionTemplate;\n context: { item: item }\n \"\n ></ng-container>\n </div>\n <div *ngSwitchCase=\"'command'\" class=\"rta__entity\">\n <ng-container\n *ngTemplateOutlet=\"\n commandAutocompleteItemTemplate || defaultCommandTemplate;\n context: { item: item }\n \"\n ></ng-container>\n </div>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #defaultCommandTemplate let-item=\"item\">\n <div class=\"str-chat__slash-command\">\n <span class=\"str-chat__slash-command-header\">\n <strong\n class=\"str-chat__slash-command-name\"\n data-testclass=\"command-name\"\n >{{ item.name }}</strong\n >\n <span class=\"str-chat__slash-command-args\"\n >/{{ item.name }} {{ item.args }}</span\n >\n </span>\n <br />\n </div>\n</ng-template>\n\n<ng-template #defaultMentionTemplate let-item=\"item\">\n <div class=\"str-chat__user-item\">\n <stream-avatar-placeholder\n data-testclass=\"avatar\"\n class=\"str-chat__avatar str-chat__avatar--circle\"\n type=\"user\"\n location=\"autocomplete-item\"\n [imageUrl]=\"item.image || item.user?.image\"\n [name]=\"item.autocompleteLabel\"\n [user]=\"item.user || item\"\n ></stream-avatar-placeholder>\n <span data-testclass=\"username\" class=\"str-chat__user-item--name\">{{\n item.autocompleteLabel\n }}</span>\n </div>\n</ng-template>\n","import { GroupStyleOptions, StreamMessage } from '../types';\n\nexport type GroupStyle = '' | 'middle' | 'top' | 'bottom' | 'single';\n\nexport const getGroupStyles = (\n message: StreamMessage,\n previousMessage?: StreamMessage,\n nextMessage?: StreamMessage,\n options: GroupStyleOptions = {\n noGroupByUser: false,\n lastReadMessageId: undefined,\n noGroupByReadState: false,\n }\n): GroupStyle => {\n if (\n options.noGroupByUser ||\n (message.attachments && message.attachments.length !== 0)\n )\n return 'single';\n\n const isTopMessage =\n !previousMessage ||\n !isOnSameDay(previousMessage.created_at, message.created_at) ||\n previousMessage.type === 'system' ||\n (previousMessage.attachments &&\n previousMessage.attachments?.length !== 0) ||\n message.user?.id !== previousMessage.user?.id ||\n previousMessage.type === 'error' ||\n previousMessage.deleted_at ||\n (previousMessage.id === options.lastReadMessageId &&\n !options.noGroupByReadState) ||\n previousMessage.message_text_updated_at ||\n (message.reaction_counts &&\n Object.keys(message.reaction_counts).length > 0);\n\n const isBottomMessage =\n !nextMessage ||\n !isOnSameDay(message.created_at, nextMessage.created_at) ||\n nextMessage.type === 'system' ||\n (nextMessage.attachments && nextMessage.attachments?.length !== 0) ||\n message.user?.id !== nextMessage.user?.id ||\n nextMessage.type === 'error' ||\n nextMessage.deleted_at ||\n (message.id === options.lastReadMessageId && !options.noGroupByReadState) ||\n message.message_text_updated_at ||\n (nextMessage.reaction_counts &&\n Object.keys(nextMessage.reaction_counts).length > 0);\n\n if (!isTopMessage && !isBottomMessage) {\n if (message.deleted_at || message.type === 'error') return 'single';\n return 'middle';\n }\n\n if (isBottomMessage) {\n if (isTopMessage || message.deleted_at || message.type === 'error')\n return 'single';\n return 'bottom';\n }\n\n if (isTopMessage) return 'top';\n\n return '';\n};\n\nconst isOnSameDay = (date1: Date, date2: Date) => {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n","import {\n BehaviorSubject,\n Observable,\n Subject,\n Subscription,\n combineLatest,\n distinctUntilChanged,\n filter,\n merge,\n of,\n pairwise,\n switchMap,\n take,\n} from 'rxjs';\nimport {\n VirtualizedListQueryDirection,\n VirtualizedListQueryState,\n VirtualizedListScrollPosition,\n VirtualizedListVerticalItemPosition,\n} from './types';\n\n/**\n * The `VirtualizedListService` removes items from a list that are not currently displayed. This is a high-level overview of how it works:\n * - Create a new instance for each list that needs virtualization\n * - Input: Provide a reactive stream that emits all items in the list\n * - Input: Provide a reactive stream that emit the current scroll position (top, middle or bottom)\n * - Input: maximum number of items that are allowed in the list (in practice the service can make the virtualized list half this number, you should take this into account when choosing the value)\n * - Output: The service will emit the current list of displayed items via the virtualized items reactive stream\n * - For simplicity, the service won't track the height of the items, nor it needs an exact scroll location -> this is how removing items work:\n * - If scroll location is bottom/top items around the current bottom/top item will be emitted in the virtualized items stream\n * - If scroll location is middle, the service won't remove items, if new items are received, those will be appended to the virtualized list (this means that in theory the list can grow very big if a lot of new items are received while the user is scrolled somewhere, this is a trade-off for the simplicity of no height tracking)\n * - Since there is no height tracking, you should make sure to provide a maximum number that is big enough to fill the biggest expected screen size twice\n * - If the user scrolls to the bottom/top and there are no more local items to show, the service will trigger a query to load more items\n * - Input: you should provide the page size to use, in order for the service to determine if loading is necessary\n *\n * The `VirtualizedMessageListService` provides an implementation for the message list component.\n */\nexport abstract class VirtualizedListService<T> {\n /**\n * The items that should be currently displayed, a subset of all items\n */\n virtualizedItems$: Observable<T[]>;\n /**\n * The result of the last query used to load more items\n */\n queryState$: Observable<VirtualizedListQueryState>;\n protected queryStateSubject = new BehaviorSubject<VirtualizedListQueryState>({\n state: 'success',\n });\n protected bufferOnTop = 0;\n protected bufferOnBottom = 0;\n protected loadFromBuffer$ = new Subject<void>();\n private virtualizedItemsSubject = new BehaviorSubject<T[]>([]);\n private subscriptions: Subscription[] = [];\n\n constructor(\n private allItems$: Observable<T[]>,\n private scrollPosition$: Observable<VirtualizedListScrollPosition>,\n public readonly jumpToItem$?: Observable<{\n item: Partial<T> | undefined;\n position?: VirtualizedListVerticalItemPosition;\n }>,\n public readonly pageSize = 25,\n public readonly maxItemCount = pageSize * 4\n ) {\n this.virtualizedItems$ = this.virtualizedItemsSubject.asObservable();\n this.queryState$ = this.queryStateSubject.asObservable();\n this.subscriptions.push(\n this.virtualizedItems$.subscribe((virtaluzedItems) => {\n this.allItems$.pipe(take(1)).subscribe((allItems) => {\n if (virtaluzedItems.length === allItems.length) {\n this.bufferOnTop = 0;\n this.bufferOnBottom = 0;\n } else if (virtaluzedItems.length === 0) {\n this.bufferOnTop = allItems.length;\n this.bufferOnBottom = 0;\n } else {\n this.bufferOnTop = allItems.indexOf(virtaluzedItems[0]);\n this.bufferOnBottom =\n allItems.length -\n allItems.indexOf(virtaluzedItems[virtaluzedItems.length - 1]) -\n 1;\n }\n });\n })\n );\n this.subscriptions.push(\n merge(this.allItems$, this.loadFromBuffer$)\n .pipe(\n switchMap(() => {\n return combineLatest([\n this.allItems$.pipe(take(1)),\n this.scrollPosition$.pipe(take(1)),\n ]);\n })\n )\n .subscribe(([items, scrollPosition]) => {\n if (scrollPosition === 'middle') {\n return;\n }\n const currentItems = this.virtualizedItemsSubject.getValue();\n if (items.length <= this.maxItemCount) {\n this.virtualizedItemsSubject.next(items);\n } else {\n let startIndex = 0;\n let endIndex = undefined;\n const numberOfItemsToRemove =\n items.length - Math.round(this.maxItemCount / 2);\n const numberOfItemsAfterRemove =\n items.length - numberOfItemsToRemove;\n switch (scrollPosition) {\n case 'top':\n if (currentItems.length > 0) {\n const middleIndex = items.findIndex((i) =>\n this.isEqual(i, currentItems[0])\n );\n if (middleIndex !== -1) {\n startIndex = Math.max(\n 0,\n middleIndex - Math.ceil(numberOfItemsAfterRemove / 2)\n );\n endIndex = startIndex + numberOfItemsAfterRemove;\n }\n } else {\n endIndex = numberOfItemsAfterRemove;\n }\n break;\n case 'bottom':\n if (currentItems.length > 0) {\n const middleIndex = items.findIndex((i) =>\n this.isEqual(i, currentItems[currentItems.length - 1])\n );\n if (middleIndex !== -1) {\n endIndex = Math.min(\n items.length,\n middleIndex + Math.floor(numberOfItemsAfterRemove / 2) + 1\n );\n startIndex = endIndex - numberOfItemsAfterRemove;\n }\n } else {\n startIndex = items.length - numberOfItemsAfterRemove;\n }\n break;\n }\n const virtualizedItems = items.slice(startIndex, endIndex);\n this.virtualizedItemsSubject.next(virtualizedItems);\n }\n })\n );\n this.subscriptions.push(\n this.scrollPosition$\n .pipe(distinctUntilChanged())\n .subscribe((position) => {\n if (\n this.queryStateSubject.getValue().state === `loading-${position}`\n ) {\n return;\n }\n if (position === 'top') {\n if (this.bufferOnTop < this.pageSize) {\n void this.loadMore(position);\n } else {\n this.loadMoreFromBuffer('top');\n }\n } else if (position === 'bottom') {\n if (this.bufferOnBottom < this.pageSize) {\n void this.loadMore(position);\n } else {\n this.loadMoreFromBuffer('bottom');\n }\n }\n })\n );\n this.subscriptions.push(\n this.allItems$\n .pipe(\n pairwise(),\n filter(() => {\n let scrollPosition!: VirtualizedListScrollPosition;\n this.scrollPosition$\n .pipe(take(1))\n .subscribe((s) => (scrollPosition = s));\n return scrollPosition === 'middle';\n })\n )\n .subscribe(([prevItems, currentItems]) => {\n if (\n currentItems.length < this.maxItemCount ||\n this.virtualizedItems.length === 0\n ) {\n this.virtualizedItemsSubject.next(currentItems);\n } else {\n const currentFirstItem = this.virtualizedItems[0];\n const currentLastItem =\n this.virtualizedItems[this.virtualizedItems.length - 1];\n const prevStartIndex = prevItems.findIndex((i) =>\n this.isEqual(i, currentFirstItem)\n );\n const prevEndIndex = prevItems.findIndex((i) =>\n this.isEqual(i, currentLastItem)\n );\n\n const isStartRemainedSame = currentItems[prevStartIndex]\n ? this.isEqual(currentItems[prevStartIndex], currentFirstItem)\n : false;\n const isEndRemainedSame = currentItems[prevEndIndex]\n ? this.isEqual(currentItems[prevEndIndex], currentLastItem)\n : false;\n\n const hasNewItemsBottom =\n prevEndIndex === prevItems.length - 1 && isEndRemainedSame\n ? prevItems.length !== currentItems.length\n : false;\n\n if (isStartRemainedSame && isEndRemainedSame) {\n const endIndex = hasNewItemsBottom ? undefined : prevEndIndex + 1;\n this.virtualizedItemsSubject.next(\n currentItems.slice(prevStartIndex, endIndex)\n );\n }\n\n let currentStartIndex = isStartRemainedSame ? prevStartIndex : -1;\n let currentEndIndex = isEndRemainedSame ? prevEndIndex : -1;\n\n if (!isStartRemainedSame) {\n currentStartIndex = currentItems.findIndex((i) =>\n this.isEqual(i, currentFirstItem)\n );\n }\n if (!isEndRemainedSame) {\n currentEndIndex = currentItems.findIndex((i) =>\n this.isEqual(i, currentLastItem)\n );\n }\n\n const hasNewItemsTop =\n prevStartIndex === 0 && !isStartRemainedSame\n ? currentStartIndex !== 0\n : false;\n\n if (currentStartIndex !== -1 && currentEndIndex !== -1) {\n const startIndex = hasNewItemsTop ? 0 : currentStartIndex;\n this.virtualizedItemsSubject.next(\n currentItems.slice(startIndex, currentEndIndex + 1)\n );\n } else {\n if (currentStartIndex === -1 && currentEndIndex !== -1) {\n currentStartIndex = Math.max(\n 0,\n currentEndIndex - (prevEndIndex - prevStartIndex)\n );\n }\n\n if (currentEndIndex === -1 && currentStartIndex !== -1) {\n currentEndIndex = Math.min(\n currentItems.length - 1,\n currentStartIndex + (prevEndIndex - prevStartIndex)\n );\n }\n\n this.virtualizedItemsSubject.next(\n currentItems.slice(currentStartIndex, currentEndIndex + 1)\n );\n }\n }\n })\n );\n if (this.jumpToItem$) {\n this.subscriptions.push(\n this.jumpToItem$\n .pipe(\n switchMap((jumpToItem) =>\n combineLatest([this.allItems$.pipe(take(1)), of(jumpToItem)])\n )\n )\n .subscribe(([allItems, jumpToItem]) => {\n if (jumpToItem.item) {\n if (allItems.length < this.maxItemCount) {\n this.virtualizedItemsSubject.next(allItems);\n } else {\n const itemIndex = allItems.findIndex((i) =>\n // @ts-expect-error TODO: do we know a better typing here?\n this.isEqual(i, jumpToItem.item)\n );\n if (itemIndex === -1) {\n return;\n } else {\n const position = jumpToItem.position || 'middle';\n const numberOfItemsToRemove =\n allItems.length - Math.round(this.maxItemCount / 2);\n const numberOfItemsAfterRemove =\n allItems.length - numberOfItemsToRemove;\n let startIndex = -1;\n let endIndex = -1;\n\n switch (position) {\n case 'top':\n startIndex = itemIndex;\n endIndex = Math.min(\n allItems.length,\n startIndex + numberOfItemsAfterRemove\n );\n break;\n case 'bottom':\n endIndex = itemIndex + 1;\n startIndex = Math.max(\n 0,\n endIndex - numberOfItemsAfterRemove\n );\n break;\n case 'middle': {\n const itemsOnTop = itemIndex;\n const itemsOnBottom = allItems.length - itemIndex;\n if (\n itemsOnTop < Math.ceil(numberOfItemsAfterRemove / 2)\n ) {\n startIndex = 0;\n }\n if (\n itemsOnBottom <\n Math.floor(numberOfItemsAfterRemove / 2) + 1\n ) {\n endIndex = allItems.length;\n }\n\n if (startIndex === -1) {\n if (endIndex !== -1) {\n startIndex = endIndex - numberOfItemsAfterRemove;\n } else {\n startIndex =\n itemIndex - Math.ceil(numberOfItemsAfterRemove / 2);\n }\n }\n\n if (endIndex === -1) {\n endIndex = startIndex + numberOfItemsAfterRemove;\n }\n }\n }\n\n this.virtualizedItemsSubject.next(\n allItems.slice(startIndex, endIndex)\n );\n }\n }\n }\n })\n );\n }\n }\n\n /**\n * The current value of virtualized items\n */\n get virtualizedItems() {\n return this.virtualizedItemsSubject.getValue();\n }\n\n /**\n * Remove all subscriptions, call this once you're done using an instance of this service\n */\n dispose() {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n protected loadMoreFromBuffer(_: VirtualizedListQueryDirection) {\n this.loadFromBuffer$.next();\n }\n\n private async loadMore(direction: VirtualizedListQueryDirection) {\n this.queryStateSubject.next({ state: `loading-${direction}` });\n try {\n await this.query(direction);\n this.queryStateSubject.next({ state: 'success' });\n } catch (e) {\n this.queryStateSubject.next({ state: 'error', error: e });\n }\n }\n\n protected abstract isEqual: (t1: T, t2: T) => boolean;\n\n protected abstract query: (\n direction: VirtualizedListQueryDirection\n ) => Promise<unknown>;\n}\n","import { ChannelService } from './channel.service';\nimport {\n VirtualizedListQueryDirection,\n VirtualizedListScrollPosition,\n StreamMessage,\n VirtualizedListVerticalItemPosition,\n} from './types';\nimport { map, Observable } from 'rxjs';\nimport { VirtualizedListService } from './virtualized-list.service';\n\n/**\n * The `VirtualizedMessageListService` removes messages from the message list that are currently not in view\n */\nexport class VirtualizedMessageListService extends VirtualizedListService<StreamMessage> {\n constructor(\n public readonly mode: 'thread' | 'main',\n scrollPosition$: Observable<VirtualizedListScrollPosition>,\n private channelService: ChannelService\n ) {\n const jumpToMessage$ = channelService.jumpToMessage$.pipe(\n map<\n { id?: string; parentId?: string },\n {\n item: Partial<StreamMessage> | undefined;\n position?: VirtualizedListVerticalItemPosition;\n }\n >((jumpToMessage) => {\n let result: {\n item: Partial<StreamMessage> | undefined;\n position?: VirtualizedListVerticalItemPosition;\n } = {\n item: undefined,\n };\n let targetMessageId: string | undefined;\n if (mode === 'main') {\n targetMessageId = jumpToMessage.parentId\n ? jumpToMessage.parentId\n : jumpToMessage.id;\n } else {\n targetMessageId = jumpToMessage.parentId\n ? jumpToMessage.id\n : undefined;\n }\n\n if (targetMessageId) {\n const messages =\n mode === 'main'\n ? channelService.activeChannelMessages\n : channelService.activeChannelThreadReplies;\n const id =\n targetMessageId === 'latest'\n ? messages[messages.length - 1]?.id\n : targetMessageId;\n if (id) {\n result = {\n item: { id },\n position: jumpToMessage.id === 'latest' ? 'bottom' : 'middle',\n };\n }\n channelService.clearMessageJump();\n }\n\n return result;\n })\n );\n const messages$ =\n mode === 'main'\n ? channelService.activeChannelMessages$\n : channelService.activeThreadMessages$;\n super(\n messages$,\n scrollPosition$,\n jumpToMessage$,\n channelService.messagePageSize\n );\n }\n\n protected loadMoreFromBuffer(direction: VirtualizedListQueryDirection): void {\n this.queryStateSubject.next({ state: `loading-${direction}` });\n setTimeout(() => {\n this.loadFromBuffer$.next();\n this.queryStateSubject.next({ state: 'success' });\n });\n }\n\n protected isEqual = (t1: StreamMessage, t2: StreamMessage) => t1.id === t2.id;\n\n protected query = (direction: VirtualizedListQueryDirection) => {\n const request =\n this.mode === 'main'\n ? (direction: 'older' | 'newer') =>\n this.channelService.loadMoreMessages(direction)\n : (direction: 'older' | 'newer') =>\n this.channelService.loadMoreThreadReplies(direction);\n const result = request(direction === 'top' ? 'older' : 'newer');\n if (result) {\n return result;\n } else {\n this.queryStateSubject.next({ state: 'success' });\n if (\n (direction === 'top' && this.bufferOnTop > 0) ||\n (direction === 'bottom' && this.bufferOnBottom > 0)\n ) {\n this.loadFromBuffer$.next();\n }\n return Promise.resolve();\n }\n };\n}\n","import {\n AfterViewChecked,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostBinding,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { ChannelService } from '../channel.service';\nimport { BehaviorSubject, Observable, Subject, Subscription } from 'rxjs';\nimport {\n filter,\n map,\n shareReplay,\n take,\n tap,\n throttleTime,\n} from 'rxjs/operators';\nimport {\n MessageContext,\n StreamMessage,\n TypingIndicatorContext,\n DateSeparatorContext,\n UnreadMessagesNotificationContext,\n UnreadMessagesIndicatorContext,\n VirtualizedListScrollPosition,\n} from '../types';\nimport { ChatClientService } from '../chat-client.service';\nimport { getGroupStyles, GroupStyle } from './group-styles';\nimport { MessageResponse, UserResponse } from 'stream-chat';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { listUsers } from '../list-users';\nimport { DateParserService } from '../date-parser.service';\nimport { isOnSeparateDate } from '../is-on-separate-date';\nimport { VirtualizedMessageListService } from '../virtualized-message-list.service';\nimport { isSafari } from '../is-safari';\n\n/**\n * The `MessageList` component renders a scrollable list of messages.\n */\n@Component({\n selector: 'stream-message-list',\n templateUrl: './message-list.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageListComponent\n implements AfterViewChecked, OnChanges, OnInit, OnDestroy, AfterViewInit\n{\n /**\n * Determines if the message list should display channel messages or [thread messages](/chat/docs/javascript/threads/).\n */\n @Input() mode: 'main' | 'thread' = 'main';\n /**\n * The direction of the messages in the list, `bottom-to-top` means newest message is at the bottom of the message list and users scroll upwards to load older messages\n */\n @Input() direction: 'bottom-to-top' | 'top-to-bottom' = 'bottom-to-top';\n /**\n * You can hide the \"jump to latest\" button while scrolling. A potential use-case for this input would be to [workaround a known issue on iOS Safar webview](https://github.com/GetStream/stream-chat-angular/issues/418)\n *\n */\n @Input() hideJumpToLatestButtonDuringScroll = false;\n /**\n * If `true` date separators will be displayed\n */\n @Input() displayDateSeparator = true;\n /**\n * If `true` unread indicator will be displayed\n */\n @Input() displayUnreadSeparator = true;\n /**\n * If date separators are displayed, you can set the horizontal position of the date text.\n */\n @Input() dateSeparatorTextPos: 'center' | 'right' | 'left' = 'center';\n /**\n * `last-message` option will open the message list at the last message, `last-read-message` will open the list at the last unread message. This option only works if mode is `main`.\n */\n @Input() openMessageListAt: 'last-message' | 'last-read-message' =\n 'last-message';\n /**\n * If the user has unread messages when they open the channel the UI shows the unread indicator / notification which features the unread count by default. This count will be increased every time a user receives a new message. If you don't want to show the unread count, you can turn that off.\n *\n * This is only applicable for `main` mode, as threads doesn't have read infromation.\n */\n @Input() hideUnreadCountForNotificationAndIndicator = false;\n /**\n * You can turn on and off the loading indicator that signals to users that more messages are being loaded to the message list\n */\n @Input() displayLoadingIndicator = true;\n typingIndicatorTemplate: TemplateRef<TypingIndicatorContext> | undefined;\n messageTemplate: TemplateRef<MessageContext> | undefined;\n customDateSeparatorTemplate: TemplateRef<DateSeparatorContext> | undefined;\n customnewMessagesIndicatorTemplate:\n | TemplateRef<UnreadMessagesIndicatorContext>\n | undefined;\n customnewMessagesNotificationTemplate:\n | TemplateRef<UnreadMessagesNotificationContext>\n | undefined;\n emptyMainMessageListTemplate: TemplateRef<void> | null = null;\n emptyThreadMessageListTemplate: TemplateRef<void> | null = null;\n messages$!: Observable<StreamMessage[]>;\n enabledMessageActions: string[] = [];\n isEmpty = true;\n newMessageCountWhileBeingScrolled = 0;\n isUserScrolled: boolean | undefined;\n groupStyles: GroupStyle[] = [];\n isNextMessageOnSeparateDate: boolean[] = [];\n lastSentMessageId: string | undefined;\n parentMessage: StreamMessage | undefined;\n highlightedMessageId: string | undefined;\n loadingState: 'idle' | 'loading-top' | 'loading-bottom' = 'idle';\n scrollEndTimeout?: ReturnType<typeof setTimeout>;\n lastReadMessageId?: string;\n isUnreadNotificationVisible = true;\n firstUnreadMessageId?: string;\n unreadCount?: number;\n isJumpingToLatestUnreadMessage = false;\n isJumpToLatestButtonVisible = true;\n isJumpingToMessage = false;\n scroll$ = new Subject<void>();\n @ViewChild('scrollContainer')\n private scrollContainer!: ElementRef<HTMLElement>;\n @ViewChild('parentMessageElement')\n private parentMessageElement!: ElementRef<HTMLElement>;\n private isNewMessageSentByUser: boolean = false;\n private subscriptions: Subscription[] = [];\n private newMessageSubscription: { unsubscribe: () => void } | undefined;\n private usersTypingInChannel$!: Observable<UserResponse[]>;\n private usersTypingInThread$!: Observable<UserResponse[]>;\n private isLatestMessageInList = true;\n private channelId?: string;\n private parsedDates = new Map<Date, string>();\n private isViewInited = false;\n private checkIfUnreadNotificationIsVisibleTimeout?: ReturnType<\n typeof setTimeout\n >;\n private jumpToMessageTimeouts: ReturnType<typeof setTimeout>[] = [];\n private jumpToLatestButtonVisibilityTimeout?: ReturnType<typeof setTimeout>;\n private forceRepaintSubject = new Subject<void>();\n private messageIdToAnchorTo?: string;\n private anchorMessageTopOffset?: number;\n private isSafari = isSafari();\n\n @HostBinding('class')\n private get class() {\n return `str-chat-angular__main-panel-inner str-chat-angular__message-list-host str-chat__main-panel-inner ${\n this.isEmpty ? 'str-chat-angular__message-list-host--empty' : ''\n }`;\n }\n private virtualizedList?: VirtualizedMessageListService;\n private scrollPosition$ = new BehaviorSubject<VirtualizedListScrollPosition>(\n 'bottom'\n );\n private jumpToItemSubscription?: Subscription;\n private queryStateSubscription?: Subscription;\n\n constructor(\n private channelService: ChannelService,\n private chatClientService: ChatClientService,\n private customTemplatesService: CustomTemplatesService,\n private dateParser: DateParserService,\n private ngZone: NgZone,\n private cdRef: ChangeDetectorRef\n ) {\n this.usersTypingInChannel$ = this.channelService.usersTypingInChannel$;\n this.usersTypingInThread$ = this.channelService.usersTypingInThread$;\n }\n\n messageNotificationJumpClicked = () => {\n this.jumpToFirstUnreadMessage();\n this.isUnreadNotificationVisible = false;\n };\n\n messageNotificationDismissClicked = () => {\n this.isUnreadNotificationVisible = false;\n };\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.forceRepaintSubject.pipe(throttleTime(1000)).subscribe(() => {\n this.forceRepaint();\n })\n );\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe((channel) => {\n let wasChannelSwitch = false;\n if (this.channelId !== channel?.id) {\n wasChannelSwitch = true;\n if (this.checkIfUnreadNotificationIsVisibleTimeout) {\n clearTimeout(this.checkIfUnreadNotificationIsVisibleTimeout);\n }\n this.jumpToMessageTimeouts.forEach((timeout) =>\n clearTimeout(timeout)\n );\n this.jumpToMessageTimeouts = [];\n this.highlightedMessageId = undefined;\n this.isUnreadNotificationVisible = false;\n this.parsedDates = new Map();\n this.resetScrollState();\n this.setMessages$();\n this.channelId = channel?.id;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n if (this.mode === 'main') {\n const lastReadMessageId =\n this.channelService.activeChannelLastReadMessageId;\n const unreadCount = this.channelService.activeChannelUnreadCount;\n if (\n lastReadMessageId !== this.lastReadMessageId ||\n unreadCount !== this.unreadCount\n ) {\n this.lastReadMessageId = lastReadMessageId;\n this.unreadCount = unreadCount || 0;\n if (wasChannelSwitch && this.lastReadMessageId) {\n // Delay jumping to last read message in case we need to give precedence to channelService.jumpToMessage\n if (this.openMessageListAt === 'last-read-message') {\n setTimeout(() => {\n // Don't jump if a jump to a message was already started (using channelService.jumpToMessage)\n if (\n !this.isJumpingToMessage &&\n !this.channelService.isMessageLoadingInProgress\n ) {\n this.jumpToFirstUnreadMessage();\n }\n }, 0);\n } else {\n // Wait till messages and the unread banner is rendered\n // If unread banner isn't visible on the screen, we display the unread notificaion\n setTimeout(() => {\n const bannerElement = document.getElementById(\n 'stream-chat-new-message-indicator'\n );\n if (\n !bannerElement ||\n bannerElement?.offsetTop <\n this.scrollContainer?.nativeElement?.scrollHeight -\n this.scrollContainer?.nativeElement?.clientHeight\n ) {\n this.isUnreadNotificationVisible = true;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n }, 100);\n }\n }\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n } else if (this.lastReadMessageId) {\n this.lastReadMessageId = undefined;\n this.unreadCount = 0;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n const capabilites = channel?.data?.own_capabilities as string[];\n const capabilitesString = [...(capabilites || [])].sort().join('');\n const enabledActionsString = [...(this.enabledMessageActions || [])]\n .sort()\n .join('');\n if (capabilitesString !== enabledActionsString) {\n this.enabledMessageActions = capabilites || [];\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n this.newMessageSubscription?.unsubscribe();\n if (channel) {\n this.newMessageSubscription = channel.on('message.new', (event) => {\n if (!event.message) {\n return;\n } else {\n this.newMessageReceived(event.message);\n }\n });\n }\n })\n );\n this.subscriptions.push(\n this.channelService.activeParentMessage$.subscribe((message) => {\n if (!message && this.parentMessage && this.mode === 'thread') {\n this.resetScrollState();\n }\n if (\n message &&\n this.parentMessage &&\n message.id !== this.parentMessage.id &&\n this.mode === 'thread'\n ) {\n this.resetScrollState();\n this.setMessages$();\n }\n if (this.parentMessage === message) {\n return;\n }\n this.parentMessage = message;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n })\n );\n this.subscriptions.push(\n this.customTemplatesService.messageTemplate$.subscribe((template) => {\n if (this.messageTemplate === template) {\n return;\n }\n this.messageTemplate = template;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n })\n );\n this.subscriptions.push(\n this.customTemplatesService.dateSeparatorTemplate$.subscribe(\n (template) => {\n if (this.customDateSeparatorTemplate === template) {\n return;\n }\n this.customDateSeparatorTemplate = template;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n )\n );\n this.subscriptions.push(\n this.customTemplatesService.newMessagesIndicatorTemplate$.subscribe(\n (template) => {\n if (this.customnewMessagesIndicatorTemplate === template) {\n return;\n }\n this.customnewMessagesIndicatorTemplate = template;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n )\n );\n this.subscriptions.push(\n this.customTemplatesService.newMessagesNotificationTemplate$.subscribe(\n (template) => {\n if (this.customnewMessagesNotificationTemplate === template) {\n return;\n }\n this.customnewMessagesNotificationTemplate = template;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n )\n );\n this.subscriptions.push(\n this.customTemplatesService.typingIndicatorTemplate$.subscribe(\n (template) => {\n if (this.typingIndicatorTemplate === template) {\n return;\n }\n this.typingIndicatorTemplate = template;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n )\n );\n this.subscriptions.push(\n this.customTemplatesService.emptyMainMessageListPlaceholder$.subscribe(\n (template) => {\n const isChanged = this.emptyMainMessageListTemplate !== template;\n this.emptyMainMessageListTemplate = template || null;\n if (isChanged && this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n )\n );\n this.subscriptions.push(\n this.customTemplatesService.emptyThreadMessageListPlaceholder$.subscribe(\n (template) => {\n const isChanged = this.emptyThreadMessageListTemplate !== template;\n this.emptyThreadMessageListTemplate = template || null;\n if (isChanged && this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n )\n );\n this.setMessages$();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.mode || changes.direction) {\n this.resetScrollState();\n this.setMessages$();\n }\n if (changes.direction) {\n if (this.scrollContainer?.nativeElement) {\n this.jumpToLatestMessage();\n }\n }\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n this.ngZone.runOutsideAngular(() => {\n this.scrollContainer?.nativeElement?.addEventListener('scroll', () =>\n this.scrolled()\n );\n });\n }\n\n ngAfterViewChecked() {\n if (this.isJumpingToMessage) {\n this.isNewMessageSentByUser = false;\n this.messageIdToAnchorTo = undefined;\n this.anchorMessageTopOffset = undefined;\n return;\n }\n if (this.messageIdToAnchorTo && this.loadingState === 'idle') {\n this.preserveScrollbarPosition();\n } else if (\n (!this.isUserScrolled &&\n this.scrollContainer.nativeElement?.scrollHeight >\n this.scrollContainer?.nativeElement.clientHeight &&\n this.getScrollPosition() !==\n (this.direction === 'bottom-to-top' ? 'bottom' : 'top')) ||\n (this.isUserScrolled && this.isNewMessageSentByUser)\n ) {\n this.isNewMessageSentByUser = false;\n this.jumpToLatestMessage();\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n this.newMessageSubscription?.unsubscribe();\n if (this.scrollEndTimeout) {\n clearTimeout(this.scrollEndTimeout);\n }\n if (this.checkIfUnreadNotificationIsVisibleTimeout) {\n clearTimeout(this.checkIfUnreadNotificationIsVisibleTimeout);\n }\n if (this.jumpToLatestButtonVisibilityTimeout) {\n clearTimeout(this.jumpToLatestButtonVisibilityTimeout);\n }\n this.jumpToMessageTimeouts.forEach((timeout) => clearTimeout(timeout));\n this.disposeVirtualizedList();\n }\n\n trackByMessageId(_: number, item: StreamMessage) {\n return item.id;\n }\n\n trackByUserId(_: number, user: UserResponse) {\n return user.id;\n }\n\n jumpToLatestMessage() {\n if (this.isLatestMessageInList) {\n this.direction === 'bottom-to-top'\n ? this.scrollToBottom()\n : this.scrollToTop();\n } else {\n void this.channelService.jumpToMessage(\n 'latest',\n this.mode === 'thread' ? this.parentMessage?.id : undefined\n );\n }\n }\n\n scrollToBottom(): void {\n this.scrollContainer.nativeElement.scrollTop =\n this.scrollContainer.nativeElement.scrollHeight + 0.1;\n if (this.isSafari) {\n this.forceRepaintSubject.next();\n }\n }\n\n scrollToTop() {\n this.scrollContainer.nativeElement.scrollTop = 0;\n }\n\n scrolled() {\n if (\n this.scrollContainer.nativeElement.scrollHeight ===\n this.scrollContainer.nativeElement.clientHeight\n ) {\n if (this.isJumpToLatestButtonVisible) {\n this.isJumpToLatestButtonVisible = false;\n this.newMessageCountWhileBeingScrolled = 0;\n this.cdRef.detectChanges();\n }\n return;\n }\n if (\n this.scrollContainer.nativeElement.scrollHeight >\n this.scrollContainer.nativeElement.clientHeight\n ) {\n if (!this.isJumpToLatestButtonVisible) {\n this.isJumpToLatestButtonVisible = true;\n }\n }\n\n this.scroll$.next();\n\n this.checkIfUserScrolled();\n\n if (this.hideJumpToLatestButtonDuringScroll) {\n if (this.isJumpToLatestButtonVisible) {\n this.isJumpToLatestButtonVisible = false;\n this.cdRef.detectChanges();\n }\n if (this.jumpToLatestButtonVisibilityTimeout) {\n clearTimeout(this.jumpToLatestButtonVisibilityTimeout);\n }\n this.jumpToLatestButtonVisibilityTimeout = setTimeout(() => {\n if (this.isUserScrolled) {\n this.isJumpToLatestButtonVisible = true;\n this.jumpToLatestButtonVisibilityTimeout = undefined;\n this.cdRef.detectChanges();\n }\n }, 100);\n }\n }\n\n jumpToFirstUnreadMessage() {\n if (!this.lastReadMessageId) {\n return;\n }\n this.isJumpingToLatestUnreadMessage = true;\n void this.channelService.jumpToMessage(this.lastReadMessageId);\n }\n\n getTypingIndicatorContext(): TypingIndicatorContext {\n return {\n usersTyping$: this.usersTyping$,\n };\n }\n\n getTypingIndicatorText(users: UserResponse[]) {\n const text = listUsers(users);\n\n return text;\n }\n\n isSentByCurrentUser(message?: StreamMessage) {\n if (!message) {\n return false;\n }\n return message.user?.id === this.chatClientService.chatClient.user?.id;\n }\n\n parseDate(date: Date) {\n if (this.parsedDates.has(date)) {\n return this.parsedDates.get(date);\n }\n const parsedDate = this.dateParser.parseDate(date);\n this.parsedDates.set(date, parsedDate);\n return parsedDate;\n }\n\n get replyCountParam() {\n return { replyCount: this.parentMessage?.reply_count };\n }\n\n get emptyListTemplate() {\n return this.mode === 'main'\n ? this.emptyMainMessageListTemplate\n : this.emptyThreadMessageListTemplate;\n }\n\n private checkIfUserScrolled() {\n let scrollPosition = this.getScrollPosition();\n\n const isUserScrolled =\n (this.direction === 'bottom-to-top'\n ? scrollPosition !== 'bottom'\n : scrollPosition !== 'top') || !this.isLatestMessageInList;\n if (this.isUserScrolled !== isUserScrolled) {\n this.ngZone.run(() => {\n this.isUserScrolled = isUserScrolled;\n if (!this.isUserScrolled) {\n this.newMessageCountWhileBeingScrolled = 0;\n }\n this.cdRef.detectChanges();\n });\n }\n\n const prevScrollPosition = this.scrollPosition$.getValue();\n\n if (this.direction === 'top-to-bottom') {\n if (scrollPosition === 'top') {\n scrollPosition = 'bottom';\n } else if (scrollPosition === 'bottom') {\n scrollPosition = 'top';\n }\n }\n\n if (prevScrollPosition !== scrollPosition && !this.isJumpingToMessage) {\n if (scrollPosition === 'top' || scrollPosition === 'bottom') {\n this.virtualizedList?.virtualizedItems$\n .pipe(take(1))\n .subscribe((items) => {\n this.messageIdToAnchorTo =\n scrollPosition === 'top'\n ? items[0]?.id\n : items[items.length - 1]?.id;\n this.anchorMessageTopOffset = document\n .getElementById(this.messageIdToAnchorTo)\n ?.getBoundingClientRect()?.top;\n });\n }\n this.ngZone.run(() => {\n this.scrollPosition$.next(scrollPosition);\n });\n }\n }\n\n private preserveScrollbarPosition() {\n if (!this.messageIdToAnchorTo) {\n return;\n }\n const messageToAlignTo = document.getElementById(this.messageIdToAnchorTo);\n this.messageIdToAnchorTo = undefined;\n this.scrollContainer.nativeElement.scrollTop +=\n (messageToAlignTo?.getBoundingClientRect()?.top || 0) -\n (this.anchorMessageTopOffset || 0);\n this.anchorMessageTopOffset = undefined;\n if (this.isSafari) {\n this.forceRepaintSubject.next();\n }\n }\n\n private forceRepaint() {\n // Solves the issue of empty screen on Safari when scrolling\n this.scrollContainer.nativeElement.style.display = 'none';\n this.scrollContainer.nativeElement.offsetHeight; // no need to store this anywhere, the reference is enough\n this.scrollContainer.nativeElement.style.display = '';\n }\n\n private getScrollPosition(): 'top' | 'bottom' | 'middle' {\n let position: 'top' | 'bottom' | 'middle' = 'middle';\n if (\n Math.ceil(this.scrollContainer.nativeElement.scrollTop) +\n this.scrollContainer.nativeElement.clientHeight +\n 1 >=\n this.scrollContainer.nativeElement.scrollHeight\n ) {\n position = 'bottom';\n } else if (\n Math.floor(this.scrollContainer.nativeElement.scrollTop) <=\n (this.parentMessageElement?.nativeElement?.clientHeight || 0)\n ) {\n position = 'top';\n }\n\n return position;\n }\n\n private setMessages$() {\n this.disposeVirtualizedList();\n this.virtualizedList = new VirtualizedMessageListService(\n this.mode,\n this.scrollPosition$,\n this.channelService\n );\n this.queryStateSubscription = this.virtualizedList.queryState$.subscribe(\n (queryState) => {\n let mappedState: 'idle' | 'loading-top' | 'loading-bottom' = 'idle';\n if (queryState.state.includes('loading')) {\n mappedState = (queryState.state as 'loading-top') || 'loading-bottom';\n }\n if (mappedState !== this.loadingState) {\n this.loadingState = mappedState;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n }\n );\n this.messages$ = this.virtualizedList.virtualizedItems$.pipe(\n tap(() => {\n if (this.isEmpty) {\n // cdRef.detectChanges() isn't enough here, test will fail\n setTimeout(() => (this.isEmpty = false), 0);\n }\n }),\n tap((messages) => {\n if (\n this.isJumpingToLatestUnreadMessage &&\n !this.firstUnreadMessageId &&\n this.lastReadMessageId\n ) {\n const lastReadIndex = messages.findIndex(\n (m) => m.id === this.lastReadMessageId\n );\n if (lastReadIndex !== -1) {\n this.firstUnreadMessageId = messages[lastReadIndex + 1]?.id;\n }\n }\n }),\n tap(\n (messages) =>\n (this.lastSentMessageId = [...messages]\n .reverse()\n .find(\n (m) =>\n m.user?.id === this.chatClientService.chatClient?.user?.id &&\n m.status !== 'sending'\n )?.id)\n ),\n tap((messages) => {\n const latestMessageInList = messages[messages.length - 1];\n const channel = this.channelService.activeChannel;\n const messagesFromState =\n (this.mode === 'main'\n ? channel?.state.latestMessages\n : channel?.state.threads[this.parentMessage?.id || '']) || [];\n this.isLatestMessageInList =\n !latestMessageInList ||\n latestMessageInList.cid !== channel?.cid ||\n (this.mode === 'thread' &&\n latestMessageInList?.parent_id !== this.parentMessage?.id) ||\n latestMessageInList?.id ===\n messagesFromState[messagesFromState.length - 1]?.id;\n if (!this.isLatestMessageInList) {\n this.isUserScrolled = true;\n }\n }),\n map((messages) => {\n return this.direction === 'bottom-to-top'\n ? messages\n : [...messages].reverse();\n }),\n tap((messages) => {\n this.groupStyles = messages.map((m, i) =>\n getGroupStyles(m, messages[i - 1], messages[i + 1], {\n lastReadMessageId: this.lastReadMessageId,\n })\n );\n this.isNextMessageOnSeparateDate = messages.map((m, i) =>\n this.checkIfOnSeparateDates(m, messages[i + 1])\n );\n }),\n shareReplay(1)\n );\n if (this.virtualizedList?.jumpToItem$) {\n this.jumpToItemSubscription = this.virtualizedList.jumpToItem$\n .pipe(filter((jumpToMessage) => !!jumpToMessage.item?.id))\n .subscribe((jumpToMessage) => {\n let messageId = jumpToMessage.item?.id;\n if (messageId) {\n if (this.isJumpingToLatestUnreadMessage) {\n messageId = this.firstUnreadMessageId || messageId;\n }\n if (jumpToMessage.position !== 'bottom') {\n this.highlightedMessageId = messageId;\n } else if (this.direction === 'top-to-bottom') {\n jumpToMessage.position = 'top';\n }\n this.isJumpingToMessage = true;\n this.scrollMessageIntoView({\n messageId: this.firstUnreadMessageId || messageId,\n position: jumpToMessage.position || 'middle',\n });\n }\n });\n }\n }\n\n private resetScrollState() {\n this.isEmpty = true;\n this.isUserScrolled = false;\n this.messageIdToAnchorTo = undefined;\n this.anchorMessageTopOffset = undefined;\n this.newMessageCountWhileBeingScrolled = 0;\n this.isNewMessageSentByUser = false;\n this.isLatestMessageInList = true;\n this.isJumpingToMessage = false;\n this.scrollPosition$.next('bottom');\n this.loadingState = 'idle';\n }\n\n private disposeVirtualizedList() {\n this.virtualizedList?.dispose();\n this.jumpToItemSubscription?.unsubscribe();\n this.queryStateSubscription?.unsubscribe();\n }\n\n private get usersTyping$() {\n return this.mode === 'thread'\n ? this.usersTypingInThread$\n : this.usersTypingInChannel$;\n }\n\n private scrollMessageIntoView(\n options: { messageId: string; position: 'top' | 'bottom' | 'middle' },\n withRetry: boolean = true\n ) {\n const element = document.getElementById(options.messageId);\n this.jumpToMessageTimeouts.forEach((t) => clearTimeout(t));\n this.jumpToMessageTimeouts = [];\n if (!element && withRetry) {\n // If the message was newly inserted into activeChannelMessages$, the message will be rendered after the current change detection cycle -> wait for this cycle to complete\n this.jumpToMessageTimeouts.push(\n setTimeout(() => this.scrollMessageIntoView(options, false))\n );\n } else if (element) {\n const blockMapping: { [key: string]: ScrollLogicalPosition } = {\n top: 'start',\n bottom: 'end',\n middle: 'center',\n };\n // We can't know when smooth scrolling ends, so we set the behavior to instant https://github.com/w3c/csswg-drafts/issues/3744\n element.scrollIntoView({\n behavior: 'instant' as ScrollBehavior,\n block: blockMapping[options.position],\n });\n if (options.position !== 'middle') {\n options.position === 'bottom'\n ? this.scrollToBottom()\n : this.scrollToTop();\n }\n this.jumpToMessageTimeouts.push(\n setTimeout(() => {\n this.isJumpingToMessage = false;\n if (!this.isUserScrolled) {\n this.checkIfUserScrolled();\n }\n }, 200)\n );\n this.jumpToMessageTimeouts.push(\n setTimeout(() => {\n this.highlightedMessageId = undefined;\n this.firstUnreadMessageId = undefined;\n this.isJumpingToLatestUnreadMessage = false;\n this.jumpToMessageTimeouts = [];\n this.cdRef.detectChanges();\n }, 1000)\n );\n } else {\n this.isJumpingToMessage = false;\n this.highlightedMessageId = undefined;\n this.firstUnreadMessageId = undefined;\n this.isJumpingToLatestUnreadMessage = false;\n }\n }\n\n private newMessageReceived(message: MessageResponse) {\n if (\n (this.mode === 'main' && message.parent_id) ||\n (this.mode === 'thread' && message.parent_id !== this.parentMessage?.id)\n ) {\n return;\n }\n const isNewMessageSentByCurrentUser =\n message.user?.id === this.chatClientService.chatClient?.user?.id;\n\n let shouldDetectChanges = false;\n\n if (!this.isNewMessageSentByUser && isNewMessageSentByCurrentUser) {\n this.isNewMessageSentByUser = true;\n shouldDetectChanges = true;\n }\n\n if (this.isUserScrolled) {\n this.newMessageCountWhileBeingScrolled++;\n shouldDetectChanges = true;\n }\n if (!this.isNewMessageSentByUser && this.unreadCount !== undefined) {\n this.unreadCount++;\n shouldDetectChanges = true;\n }\n\n if (shouldDetectChanges && this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n\n private checkIfOnSeparateDates(\n message?: StreamMessage,\n nextMessage?: StreamMessage\n ) {\n if (!message || !nextMessage) {\n return false;\n }\n return isOnSeparateDate(message.created_at, nextMessage.created_at);\n }\n}\n","<ng-container\n *ngIf=\"\n lastReadMessageId &&\n isUnreadNotificationVisible &&\n openMessageListAt === 'last-message' &&\n displayUnreadSeparator\n \"\n>\n <ng-container\n *ngTemplateOutlet=\"\n customnewMessagesNotificationTemplate ||\n defaultUnreadMessagesNotification;\n context: {\n unreadCount: unreadCount,\n onDismiss: messageNotificationDismissClicked,\n onJump: messageNotificationJumpClicked\n }\n \"\n ></ng-container>\n</ng-container>\n<ng-template\n #defaultUnreadMessagesNotification\n let-unreadCount=\"unreadCount\"\n let-onDismiss=\"onDismiss\"\n let-onJump=\"onJump\"\n>\n <div\n class=\"str-chat__unread-messages-notification\"\n data-testid=\"unread-messages-notification\"\n >\n <button\n data-testid=\"unread-messages-notification-jump-to-message\"\n (click)=\"onJump()\"\n >\n <ng-container\n *ngIf=\"\n unreadCount > 0 && !hideUnreadCountForNotificationAndIndicator;\n else noUnreadCount\n \"\n >\n {{\n (unreadCount === 1\n ? \"streamChat.\\{\\{count\\}\\} unread message\"\n : \"streamChat.\\{\\{count\\}\\} unread messages\"\n ) | translate : { count: unreadCount }\n }}\n </ng-container>\n <ng-template #noUnreadCount>\n {{ \"streamChat.Unread messages\" | translate }}\n </ng-template>\n </button>\n <button\n data-testid=\"unread-messages-notification-dismiss\"\n (click)=\"onDismiss()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </button>\n </div>\n</ng-template>\n<div #scrollContainer data-testid=\"scroll-container\" class=\"str-chat__list\">\n <ng-container *ngIf=\"mode === 'main' && isEmpty && emptyListTemplate\">\n <ng-container *ngTemplateOutlet=\"emptyListTemplate\"></ng-container>\n </ng-container>\n <div class=\"str-chat__reverse-infinite-scroll str-chat__message-list-scroll\">\n <ul class=\"str-chat__ul\">\n <li\n *ngIf=\"mode === 'thread' && parentMessage\"\n #parentMessageElement\n data-testid=\"parent-message\"\n class=\"str-chat__parent-message-li\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: parentMessage, index: 'parent' }\n \"\n ></ng-container>\n <div data-testid=\"reply-count\" class=\"str-chat__thread-start\">\n {{parentMessage.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </div>\n </li>\n <ng-container *ngIf=\"mode === 'thread' && isEmpty && emptyListTemplate\">\n <ng-container *ngTemplateOutlet=\"emptyListTemplate\"></ng-container>\n </ng-container>\n <stream-loading-indicator-placeholder\n *ngIf=\"\n ((loadingState === 'loading-top' && direction === 'bottom-to-top') ||\n (loadingState === 'loading-bottom' &&\n direction === 'top-to-bottom')) &&\n displayLoadingIndicator;\n else loadingIndicatorPlaceholder\n \"\n data-testid=\"top-loading-indicator\"\n ></stream-loading-indicator-placeholder>\n <ng-container *ngIf=\"messages$ | async as messages\">\n <ng-container\n *ngFor=\"\n let message of messages;\n let i = index;\n let isFirst = first;\n let isLast = last;\n trackBy: trackByMessageId\n \"\n >\n <ng-container *ngIf=\"isFirst\">\n <ng-container\n *ngTemplateOutlet=\"\n dateSeparator;\n context: {\n date: message.created_at,\n parsedDate: parseDate(message.created_at)\n }\n \"\n ></ng-container>\n </ng-container>\n <li\n tabindex=\"0\"\n data-testclass=\"message\"\n class=\"str-chat__li str-chat__li--{{ groupStyles[i] }}\"\n id=\"{{ message.id }}\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: message, index: i }\n \"\n ></ng-container>\n </li>\n <ng-container\n *ngIf=\"\n (lastReadMessageId === message?.id &&\n direction === 'bottom-to-top') ||\n (direction === 'top-to-bottom' &&\n lastReadMessageId === messages[i + 1]?.id)\n \"\n >\n <li\n *ngIf=\"displayUnreadSeparator\"\n id=\"stream-chat-new-message-indicator\"\n data-testid=\"new-messages-indicator\"\n class=\"str-chat__li str-chat__unread-messages-separator-wrapper\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n customnewMessagesIndicatorTemplate ||\n defaultNewMessagesIndicator;\n context: { unreadCount: unreadCount }\n \"\n ></ng-container>\n </li>\n </ng-container>\n <ng-container *ngIf=\"isNextMessageOnSeparateDate[i]\">\n <ng-container\n *ngTemplateOutlet=\"\n dateSeparator;\n context: {\n date: messages[i + 1].created_at,\n parsedDate: parseDate(messages[i + 1].created_at)\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <stream-loading-indicator-placeholder\n *ngIf=\"\n ((loadingState === 'loading-bottom' &&\n direction === 'bottom-to-top') ||\n (loadingState === 'loading-top' &&\n direction === 'top-to-bottom')) &&\n displayLoadingIndicator;\n else loadingIndicatorPlaceholder\n \"\n data-testid=\"bottom-loading-indicator\"\n ></stream-loading-indicator-placeholder>\n <ng-template #loadingIndicatorPlaceholder>\n <div class=\"str-chat__loading-indicator-placeholder\"></div>\n </ng-template>\n </ul>\n <ng-template #defaultTypingIndicator let-usersTyping$=\"usersTyping$\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <ng-container *ngIf=\"$any(usersTyping$ | async) as users\">\n <div\n *ngIf=\"users.length > 0\"\n data-testid=\"typing-indicator\"\n class=\"str-chat__typing-indicator str-chat__typing-indicator--typing\"\n >\n <div class=\"str-chat__typing-indicator__dots\">\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n </div>\n <div\n data-testid=\"typing-users\"\n class=\"str-chat__typing-indicator__users\"\n >\n {{\n users.length === 1\n ? (\"streamChat.user is typing\"\n | translate : { user: getTypingIndicatorText(users) })\n : (\"streamChat.users are typing\"\n | translate : { users: getTypingIndicatorText(users) })\n }}\n </div>\n </div>\n </ng-container>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n typingIndicatorTemplate || defaultTypingIndicator;\n context: getTypingIndicatorContext()\n \"\n ></ng-container>\n </div>\n</div>\n<div class=\"str-chat__jump-to-latest-message\">\n <button\n *ngIf=\"isUserScrolled && isJumpToLatestButtonVisible\"\n data-testid=\"scroll-to-latest\"\n class=\"str-chat__message-notification-scroll-to-latest str-chat__message-notification-scroll-to-latest-right str-chat__circle-fab\"\n (keyup.enter)=\"jumpToLatestMessage()\"\n (click)=\"jumpToLatestMessage()\"\n >\n <stream-icon\n class=\"str-chat__jump-to-latest-icon str-chat__circle-fab-icon\"\n [icon]=\"direction === 'bottom-to-top' ? 'arrow-down' : 'arrow-up'\"\n ></stream-icon>\n <div\n *ngIf=\"newMessageCountWhileBeingScrolled > 0\"\n class=\"str-chat__message-notification str-chat__message-notification-scroll-to-latest-unread-count str-chat__jump-to-latest-unread-count\"\n >\n {{ newMessageCountWhileBeingScrolled }}\n </div>\n </button>\n</div>\n\n<ng-template #messageTemplateContainer let-message=\"message\" let-index=\"index\">\n <ng-template\n #defaultMessageTemplate\n let-messageInput=\"message\"\n let-isLastSentMessage=\"isLastSentMessage\"\n let-enabledMessageActions=\"enabledMessageActions\"\n let-mode=\"mode\"\n let-isHighlighted=\"isHighlighted\"\n let-scroll$=\"scroll$\"\n >\n <stream-message\n [message]=\"messageInput\"\n [isLastSentMessage]=\"isLastSentMessage\"\n [enabledMessageActions]=\"enabledMessageActions\"\n [mode]=\"mode\"\n [isHighlighted]=\"isHighlighted\"\n [scroll$]=\"scroll$\"\n ></stream-message>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplate || defaultMessageTemplate;\n context: {\n message: message,\n isLastSentMessage: !!(\n lastSentMessageId && message?.id === lastSentMessageId\n ),\n enabledMessageActions: enabledMessageActions,\n mode: mode,\n isHighlighted: message?.id === highlightedMessageId,\n scroll$: scroll$\n }\n \"\n ></ng-container>\n</ng-template>\n\n<ng-template #dateSeparator let-date=\"date\" let-parsedDate=\"parsedDate\">\n <ng-container *ngIf=\"displayDateSeparator\">\n <ng-container\n *ngTemplateOutlet=\"\n customDateSeparatorTemplate || defaultDateSeparator;\n context: {\n date: date,\n parsedDate: parsedDate\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template\n #defaultDateSeparator\n let-date=\"date\"\n let-parsedDate=\"parsedDate\"\n >\n <div data-testid=\"date-separator\" class=\"str-chat__date-separator\">\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'right' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n <div class=\"str-chat__date-separator-date\">\n {{ parsedDate }}\n </div>\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'left' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #defaultNewMessagesIndicator let-unreadCount=\"unreadCount\">\n <div class=\"str-chat__unread-messages-separator\">\n <ng-container\n *ngIf=\"\n unreadCount > 0 && !hideUnreadCountForNotificationAndIndicator;\n else noUnreadCount\n \"\n >\n {{\n (unreadCount === 1\n ? \"streamChat.\\{\\{count\\}\\} unread message\"\n : \"streamChat.\\{\\{count\\}\\} unread messages\"\n ) | translate : { count: unreadCount }\n }}\n </ng-container>\n <ng-template #noUnreadCount>\n {{ \"streamChat.Unread messages\" | translate }}\n </ng-template>\n </div>\n</ng-template>\n","import { Component, HostBinding, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Channel } from 'stream-chat';\nimport { ChatClientService } from '../chat-client.service';\nimport { ChannelService } from '../channel.service';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { getChannelDisplayText } from '../get-channel-display-text';\nimport { StreamMessage, ThreadHeaderContext } from '../types';\n\n/**\n * The `Thread` component represents a [message thread](/chat/docs/javascript/threads/), it is a container component that displays a thread with a header, [`MessageList`](/chat/docs/sdk/angular/components/MessageListComponent) and [`MessageInput`](/chat/docs/sdk/angular/components/MessageInputComponent/) components.\n */\n@Component({\n selector: 'stream-thread',\n templateUrl: './thread.component.html',\n styles: [],\n})\nexport class ThreadComponent implements OnDestroy {\n @HostBinding('class') private class = 'str-chat__thread';\n parentMessage: StreamMessage | undefined;\n channel: Channel | undefined;\n private subscriptions: Subscription[] = [];\n\n constructor(\n public customTemplatesService: CustomTemplatesService,\n private channelService: ChannelService,\n private chatClientService: ChatClientService\n ) {\n this.subscriptions.push(\n this.channelService.activeParentMessage$.subscribe(\n (parentMessage) => (this.parentMessage = parentMessage)\n )\n );\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe(\n (channel) => (this.channel = channel)\n )\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n getThreadHeaderContext(): ThreadHeaderContext {\n return {\n parentMessage: this.parentMessage,\n closeThreadHandler: () => this.closeThread(),\n };\n }\n\n closeThread() {\n void this.channelService.setAsActiveParentMessage(undefined);\n }\n\n get channelName() {\n if (!this.channel || !this.chatClientService.chatClient.user) {\n return '';\n }\n return getChannelDisplayText(\n this.channel,\n this.chatClientService.chatClient.user\n );\n }\n}\n","<div class=\"str-chat__thread-container\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.threadHeaderTemplate$ | async) ||\n defaultThreadHeader;\n context: getThreadHeaderContext()\n \"\n ></ng-container>\n <ng-content></ng-content>\n</div>\n\n<ng-template\n #defaultThreadHeader\n let-parentMessage=\"parentMessage\"\n let-closeThreadHandler=\"closeThreadHandler\"\n>\n <div class=\"str-chat__thread-header\">\n <div class=\"str-chat__thread-header-details\">\n <div class=\"str-chat__thread-header-name\" translate>\n streamChat.Thread\n </div>\n <div\n class=\"str-chat__thread-header-channel-name\"\n data-testid=\"channel-name\"\n >\n {{ channelName }}\n </div>\n </div>\n <button\n class=\"str-chat__square-button str-chat__close-thread-button\"\n data-testid=\"close-button\"\n (click)=\"closeThreadHandler()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </button>\n </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AvatarComponent } from './avatar/avatar.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AvatarPlaceholderComponent } from './avatar-placeholder/avatar-placeholder.component';\n\n@NgModule({\n declarations: [AvatarComponent, AvatarPlaceholderComponent],\n imports: [CommonModule, TranslateModule],\n exports: [AvatarComponent, AvatarPlaceholderComponent],\n})\nexport class StreamAvatarModule {}\n","import { NgModule } from '@angular/core';\nimport { IconComponent } from './icon.component';\nimport { CommonModule } from '@angular/common';\nimport { LoadingIndicatorComponent } from './loading-indicator/loading-indicator.component';\nimport { IconPlaceholderComponent } from './icon-placeholder/icon-placeholder.component';\nimport { LoadingIndicatorPlaceholderComponent } from './loading-indicator-placeholder/loading-indicator-placeholder.component';\n\n@NgModule({\n declarations: [\n IconComponent,\n IconPlaceholderComponent,\n LoadingIndicatorComponent,\n LoadingIndicatorPlaceholderComponent,\n ],\n imports: [CommonModule],\n exports: [\n IconComponent,\n IconPlaceholderComponent,\n LoadingIndicatorComponent,\n LoadingIndicatorPlaceholderComponent,\n ],\n})\nexport class IconModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { VoiceRecordingComponent } from './voice-recording.component';\nimport { VoiceRecordingWavebarComponent } from './voice-recording-wavebar/voice-recording-wavebar.component';\nimport { IconModule } from '../icon/icon.module';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n declarations: [VoiceRecordingComponent, VoiceRecordingWavebarComponent],\n imports: [CommonModule, IconModule, TranslateModule],\n exports: [VoiceRecordingComponent, VoiceRecordingWavebarComponent],\n})\nexport class VoiceRecordingModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ModalComponent } from './modal.component';\nimport { IconModule } from '../icon/icon.module';\n\n@NgModule({\n declarations: [ModalComponent],\n imports: [CommonModule, IconModule],\n exports: [ModalComponent],\n})\nexport class StreamModalModule {}\n","import { NgModule } from '@angular/core';\nimport { NotificationListComponent } from './notification-list.component';\nimport { NotificationComponent } from '../notification/notification.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n declarations: [NotificationComponent, NotificationListComponent],\n imports: [CommonModule, TranslateModule],\n exports: [NotificationComponent, NotificationListComponent],\n})\nexport class StreamNotificationModule {}\n","import { NgModule } from '@angular/core';\nimport { PaginatedListComponent } from './paginated-list.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IconModule } from '../icon/icon.module';\n\n@NgModule({\n declarations: [PaginatedListComponent],\n imports: [CommonModule, TranslateModule, IconModule],\n exports: [PaginatedListComponent],\n})\nexport class StreamPaginatedListModule {}\n","import { NgModule } from '@angular/core';\nimport { ChannelComponent } from './channel/channel.component';\nimport { ChannelHeaderComponent } from './channel-header/channel-header.component';\nimport { ChannelListComponent } from './channel-list/channel-list.component';\nimport { ChannelPreviewComponent } from './channel-preview/channel-preview.component';\nimport { MessageComponent } from './message/message.component';\nimport { MessageInputComponent } from './message-input/message-input.component';\nimport { MessageListComponent } from './message-list/message-list.component';\nimport { CommonModule } from '@angular/common';\nimport { MessageActionsBoxComponent } from './message-actions-box/message-actions-box.component';\nimport { AttachmentListComponent } from './attachment-list/attachment-list.component';\nimport { MessageReactionsComponent } from './message-reactions/message-reactions.component';\nimport { NotificationComponent } from './notification/notification.component';\nimport { NotificationListComponent } from './notification-list/notification-list.component';\nimport { AttachmentPreviewListComponent } from './attachment-preview-list/attachment-preview-list.component';\nimport { TextareaDirective } from './message-input/textarea.directive';\nimport { StreamAvatarModule } from './stream-avatar.module';\nimport { ThreadComponent } from './thread/thread.component';\nimport { MessageBouncePromptComponent } from './message-bounce-prompt/message-bounce-prompt.component';\nimport { NgxFloatUiModule } from 'ngx-float-ui';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MessageReactionsSelectorComponent } from './message-reactions-selector/message-reactions-selector.component';\nimport { UserListComponent } from './user-list/user-list.component';\nimport { VoiceRecordingModule } from './voice-recording/voice-recording.module';\nimport { IconModule } from './icon/icon.module';\nimport { VoiceRecorderService } from './message-input/voice-recorder.service';\nimport { MessageTextComponent } from './message-text/message-text.component';\nimport { MessageBlockedComponent } from './message-blocked/message-blocked.component';\nimport { StreamModalModule } from './modal/stream-modal.module';\nimport { StreamNotificationModule } from './notification-list/stream-notification.module';\nimport { StreamPaginatedListModule } from './paginated-list/stream-paginated-list.module';\n\n@NgModule({\n declarations: [\n ChannelComponent,\n ChannelHeaderComponent,\n ChannelListComponent,\n ChannelPreviewComponent,\n MessageComponent,\n MessageInputComponent,\n MessageListComponent,\n MessageActionsBoxComponent,\n AttachmentListComponent,\n MessageReactionsComponent,\n AttachmentPreviewListComponent,\n TextareaDirective,\n ThreadComponent,\n MessageBouncePromptComponent,\n MessageReactionsSelectorComponent,\n UserListComponent,\n MessageTextComponent,\n MessageBlockedComponent,\n ],\n imports: [\n CommonModule,\n NgxFloatUiModule,\n StreamAvatarModule,\n TranslateModule,\n VoiceRecordingModule,\n IconModule,\n StreamModalModule,\n StreamNotificationModule,\n StreamPaginatedListModule,\n ],\n exports: [\n ChannelComponent,\n ChannelHeaderComponent,\n ChannelListComponent,\n ChannelPreviewComponent,\n MessageComponent,\n MessageInputComponent,\n MessageListComponent,\n MessageActionsBoxComponent,\n AttachmentListComponent,\n MessageReactionsComponent,\n NotificationComponent,\n NotificationListComponent,\n AttachmentPreviewListComponent,\n StreamModalModule,\n StreamAvatarModule,\n ThreadComponent,\n MessageBouncePromptComponent,\n VoiceRecordingModule,\n MessageReactionsSelectorComponent,\n UserListComponent,\n StreamPaginatedListModule,\n IconModule,\n MessageTextComponent,\n MessageBlockedComponent,\n StreamNotificationModule,\n ],\n providers: [VoiceRecorderService],\n})\nexport class StreamChatModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AutocompleteTextareaComponent } from './message-input/autocomplete-textarea/autocomplete-textarea.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MentionModule } from 'angular-mentions';\nimport { StreamAvatarModule } from './stream-avatar.module';\nimport { textareaInjectionToken } from './injection-tokens';\n\n@NgModule({\n declarations: [AutocompleteTextareaComponent],\n imports: [CommonModule, TranslateModule, MentionModule, StreamAvatarModule],\n exports: [AutocompleteTextareaComponent],\n providers: [\n {\n provide: textareaInjectionToken,\n useValue: AutocompleteTextareaComponent,\n },\n ],\n})\nexport class StreamAutocompleteTextareaModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { TextareaComponent } from './message-input/textarea/textarea.component';\nimport { textareaInjectionToken } from './injection-tokens';\n\n@NgModule({\n declarations: [TextareaComponent],\n imports: [CommonModule, TranslateModule],\n exports: [TextareaComponent],\n providers: [\n {\n provide: textareaInjectionToken,\n useValue: TextareaComponent,\n },\n ],\n})\nexport class StreamTextareaModule {}\n","import { Component, OnDestroy } from '@angular/core';\nimport { AmplitudeRecorderService } from '../amplitude-recorder.service';\nimport { Observable } from 'rxjs';\nimport { AudioRecorderService } from '../audio-recorder.service';\nimport { formatDuration } from '../../format-duration';\n\n/**\n * The `VoiceRecorderWavebarComponent` displays the amplitudes of the recording while the recoding is in progress\n */\n@Component({\n selector: 'stream-voice-recorder-wavebar',\n templateUrl: './voice-recorder-wavebar.component.html',\n styles: [],\n})\nexport class VoiceRecorderWavebarComponent implements OnDestroy {\n amplitudes$: Observable<number[]>;\n formattedDuration: string;\n durationComputeInterval: ReturnType<typeof setInterval>;\n isLongerThanOneHour = false;\n\n constructor(\n private amplitudeRecorder: AmplitudeRecorderService,\n private audioRecorder: AudioRecorderService\n ) {\n this.amplitudes$ = this.amplitudeRecorder.amplitudes$;\n this.formattedDuration = formatDuration(\n this.audioRecorder.durationMs / 1000\n );\n this.durationComputeInterval = setInterval(() => {\n this.isLongerThanOneHour = this.audioRecorder.durationMs / 1000 > 3600;\n this.formattedDuration = formatDuration(\n this.audioRecorder.durationMs / 1000\n );\n }, 1000);\n }\n\n trackByIndex(i: number) {\n return i;\n }\n\n ngOnDestroy(): void {\n clearInterval(this.durationComputeInterval);\n }\n}\n","<div\n class=\"str-chat__recording-timer\"\n [class.str-chat__recording-timer--hours]=\"isLongerThanOneHour\"\n>\n {{ formattedDuration }}\n</div>\n<div class=\"str-chat__waveform-box-container\">\n <div class=\"str-chat__audio_recorder__waveform-box\">\n <div\n *ngFor=\"let amplitude of amplitudes$ | async; trackBy: trackByIndex\"\n class=\"str-chat__wave-progress-bar__amplitude-bar\"\n [style.--str-chat__wave-progress-bar__amplitude-bar-height]=\"\n (amplitude ?? 0) * 100 + '%'\n \"\n ></div>\n </div>\n</div>\n","import {\n Component,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n} from '@angular/core';\nimport { AudioRecorderService } from './audio-recorder.service';\nimport { MediaRecordingState } from './media-recorder';\nimport { Subscription } from 'rxjs';\nimport { AudioRecording } from '../types';\nimport { VoiceRecorderService } from '../message-input/voice-recorder.service';\n\n/**\n * The `VoiceRecorderComponent` makes it possible to record audio, and then upload it as a voice recording attachment\n */\n@Component({\n selector: 'stream-voice-recorder',\n templateUrl: './voice-recorder.component.html',\n styles: [],\n providers: [],\n})\nexport class VoiceRecorderComponent implements OnInit, OnDestroy, OnChanges {\n @Input() voiceRecorderService?: VoiceRecorderService;\n recordState: MediaRecordingState = MediaRecordingState.STOPPED;\n isLoading = false;\n recording?: AudioRecording;\n readonly MediaRecordingState = MediaRecordingState;\n private subscriptions: Subscription[] = [];\n private isVisibleSubscription?: Subscription;\n\n constructor(public readonly recorder: AudioRecorderService) {}\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.recorder.recordingState$.subscribe((s) => {\n this.recordState = s;\n if (this.recordState === MediaRecordingState.ERROR) {\n this.voiceRecorderService?.isRecorderVisible$.next(false);\n }\n })\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.voiceRecorderService && this.voiceRecorderService) {\n this.isVisibleSubscription =\n this.voiceRecorderService.isRecorderVisible$.subscribe((isVisible) => {\n if (!isVisible) {\n this.recording = undefined;\n this.isLoading = false;\n }\n });\n } else {\n this.isVisibleSubscription?.unsubscribe();\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n cancel() {\n if (this.recording) {\n this.recording = undefined;\n } else {\n void this.recorder.stop({ cancel: true });\n }\n this.voiceRecorderService?.isRecorderVisible$.next(false);\n }\n\n async stop() {\n this.recording = await this.recorder.stop();\n }\n\n pause() {\n this.recorder.pause();\n }\n\n resume() {\n this.recorder.resume();\n }\n\n uploadRecording() {\n if (!this.recording) {\n return;\n }\n this.isLoading = true;\n this.voiceRecorderService?.recording$.next(this.recording);\n }\n}\n","<div\n class=\"str-chat__audio_recorder-container\"\n *ngIf=\"voiceRecorderService?.isRecorderVisible$ | async\"\n>\n <div class=\"str-chat__audio_recorder\" data-testid=\"audio-recorder\">\n <button\n class=\"str-chat__audio_recorder__cancel-button\"\n data-testid=\"cancel-recording-audio-button\"\n [disabled]=\"isLoading\"\n (click)=\"cancel()\"\n (keyup.enter)=\"cancel()\"\n >\n <stream-icon-placeholder icon=\"bin\"></stream-icon-placeholder>\n </button>\n <stream-voice-recorder-wavebar\n *ngIf=\"\n (recordState === MediaRecordingState.RECORDING ||\n recordState === MediaRecordingState.PAUSED) &&\n !recording\n \"\n ></stream-voice-recorder-wavebar>\n <!-- eslint-disable @angular-eslint/template/no-any -->\n <stream-voice-recording\n [attachment]=\"$any(recording)\"\n *ngIf=\"!!recording\"\n ></stream-voice-recording>\n <!-- eslint-enable @angular-eslint/template/no-any -->\n <button\n *ngIf=\"recordState === MediaRecordingState.PAUSED && !recording\"\n class=\"str-chat__audio_recorder__resume-recording-button\"\n (click)=\"resume()\"\n (keyup.enter)=\"resume()\"\n >\n <stream-icon-placeholder icon=\"mic\"></stream-icon-placeholder>\n </button>\n <button\n *ngIf=\"recordState === MediaRecordingState.RECORDING && !recording\"\n class=\"str-chat__audio_recorder__pause-recording-button\"\n data-testid=\"pause-recording-audio-button\"\n (click)=\"pause()\"\n (keyup.enter)=\"pause()\"\n >\n <stream-icon-placeholder icon=\"pause\"></stream-icon-placeholder>\n </button>\n <ng-container\n *ngIf=\"recordState === MediaRecordingState.STOPPED; else stopButton\"\n >\n <button\n class=\"str-chat__audio_recorder__complete-button\"\n data-testid=\"audio-recorder-complete-button\"\n [disabled]=\"!recording\"\n (click)=\"uploadRecording()\"\n (keyup.enter)=\"uploadRecording()\"\n >\n <stream-loading-indicator\n *ngIf=\"isLoading; else sendIcon\"\n ></stream-loading-indicator>\n <ng-template #sendIcon>\n <stream-icon-placeholder icon=\"send\"></stream-icon-placeholder>\n </ng-template>\n </button>\n </ng-container>\n <ng-template #stopButton>\n <button\n class=\"str-chat__audio_recorder__stop-button\"\n data-testid=\"audio-recorder-stop-button\"\n [disabled]=\"recordState === MediaRecordingState.STOPPED\"\n (click)=\"stop()\"\n (keyup.enter)=\"stop()\"\n >\n <stream-icon-placeholder icon=\"delivered\"></stream-icon-placeholder>\n </button>\n </ng-template>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { VoiceRecorderComponent } from './voice-recorder.component';\nimport { VoiceRecordingModule } from '../voice-recording/voice-recording.module';\nimport { IconModule } from '../icon/icon.module';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AudioRecorderService } from './audio-recorder.service';\nimport { TranscoderService } from './transcoder.service';\nimport { AmplitudeRecorderService } from './amplitude-recorder.service';\nimport { VoiceRecorderWavebarComponent } from './voice-recorder-wavebar/voice-recorder-wavebar.component';\n\n@NgModule({\n declarations: [VoiceRecorderComponent, VoiceRecorderWavebarComponent],\n imports: [CommonModule, VoiceRecordingModule, IconModule, TranslateModule],\n exports: [VoiceRecorderComponent, VoiceRecorderWavebarComponent],\n providers: [\n AudioRecorderService,\n TranscoderService,\n AmplitudeRecorderService,\n ],\n})\nexport class VoiceRecorderModule {}\n","const ENCODING_BIT_RATE = 128; // kbps;\nconst COUNT_SAMPLES_PER_ENCODED_BLOCK = 1152;\nconst SAMPLE_RATE = 16000;\n\nconst readFileAsArrayBuffer = (blob: Blob): Promise<ArrayBuffer> =>\n new Promise((resolve, reject) => {\n const blobReader = new FileReader();\n blobReader.onload = () => {\n resolve(blobReader.result as ArrayBuffer);\n };\n\n blobReader.onerror = () => {\n reject(blobReader.error);\n };\n\n blobReader.readAsArrayBuffer(blob);\n });\n\nconst toAudioBuffer = async (blob: Blob) => {\n const audioCtx = new AudioContext();\n\n const arrayBuffer = await readFileAsArrayBuffer(blob);\n const decodedData = await audioCtx.decodeAudioData(arrayBuffer);\n if (audioCtx.state !== 'closed') await audioCtx.close();\n return decodedData;\n};\n\nconst renderAudio = async (audioBuffer: AudioBuffer, sampleRate: number) => {\n const offlineAudioCtx = new OfflineAudioContext(\n audioBuffer.numberOfChannels,\n audioBuffer.duration * sampleRate,\n sampleRate\n );\n const source = offlineAudioCtx.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(offlineAudioCtx.destination);\n source.start();\n\n return await offlineAudioCtx.startRendering();\n};\n\nconst float32ArrayToInt16Array = (float32Arr: Float32Array) => {\n const int16Arr = new Int16Array(float32Arr.length);\n for (let i = 0; i < float32Arr.length; i++) {\n const float32Value = float32Arr[i];\n // Clamp the float value between -1 and 1\n const clampedValue = Math.max(-1, Math.min(1, float32Value));\n // Convert the float value to a signed 16-bit integer\n int16Arr[i] = Math.round(clampedValue * 32767);\n }\n return int16Arr;\n};\n\nconst splitDataByChannel = (audioBuffer: AudioBuffer) =>\n Array.from({ length: audioBuffer.numberOfChannels }, (_, i) =>\n audioBuffer.getChannelData(i)\n ).map(float32ArrayToInt16Array);\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument */\nexport async function encodeWebmToMp3(blob: Blob, lameJs: any) {\n const audioBuffer = await renderAudio(await toAudioBuffer(blob), SAMPLE_RATE);\n const channelCount = audioBuffer.numberOfChannels;\n const dataByChannel = splitDataByChannel(audioBuffer);\n const mp3Encoder = new lameJs.Mp3Encoder(\n channelCount,\n SAMPLE_RATE,\n ENCODING_BIT_RATE\n );\n\n const dataBuffer: Int8Array[] = [];\n let remaining = dataByChannel[0].length;\n for (\n let i = 0;\n remaining >= COUNT_SAMPLES_PER_ENCODED_BLOCK;\n i += COUNT_SAMPLES_PER_ENCODED_BLOCK\n ) {\n const [leftChannelBlock, rightChannelBlock] = dataByChannel.map((channel) =>\n channel.subarray(i, i + COUNT_SAMPLES_PER_ENCODED_BLOCK)\n );\n dataBuffer.push(\n new Int8Array(\n mp3Encoder.encodeBuffer(leftChannelBlock, rightChannelBlock)\n )\n );\n remaining -= COUNT_SAMPLES_PER_ENCODED_BLOCK;\n }\n\n const lastBlock = mp3Encoder.flush();\n if (lastBlock.length) dataBuffer.push(new Int8Array(lastBlock));\n return new Blob(dataBuffer, { type: 'audio/mp3;sbu_type=voice' });\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument */\n","import {\n AbstractControl,\n FormArray,\n FormControl,\n ValidatorFn,\n} from '@angular/forms';\n\nexport function atLeastOneOption(): ValidatorFn {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (control: AbstractControl<any, any>) => {\n const formArray = control as FormArray<FormControl<string | null>>;\n const hasAtLeastOne = formArray.value.some((item) => !!item);\n return hasAtLeastOne ? null : { atLeastOne: true };\n };\n}\n\nexport function maximumNumberOfVotes(\n canHaveMultipleVotes: FormControl<boolean>\n): ValidatorFn {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (control: AbstractControl<any, any>) => {\n const formControl = control as FormControl<number | null>;\n return canHaveMultipleVotes.value && !formControl.value\n ? { maximumNumberOfVotes: true }\n : null;\n };\n}\n","import {\n Component,\n EventEmitter,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';\nimport { VotingVisibility } from 'stream-chat';\nimport { CustomTemplatesService } from '../../custom-templates.service';\nimport { ModalContext } from '../../types';\nimport { ChatClientService } from '../../chat-client.service';\nimport { NotificationService } from '../../notification.service';\nimport { atLeastOneOption, maximumNumberOfVotes } from './validators';\n\n/**\n *\n */\n@Component({\n selector: 'stream-poll-composer',\n templateUrl: './poll-composer.component.html',\n styles: [],\n})\nexport class PollComposerComponent {\n /**\n * Emitted when a poll is created, the poll id is emitted\n */\n @Output() pollCompose = new EventEmitter<string>();\n /**\n * Emitted when the poll composing is cancelled\n */\n @Output() cancel = new EventEmitter<void>();\n formGroup = new FormGroup({\n name: new FormControl('', [Validators.required]),\n options: new FormArray<FormControl<string | null>>(\n [new FormControl<string | null>('')],\n [atLeastOneOption()]\n ),\n multiple_answers: new FormControl(false),\n maximum_number_of_votes: new FormControl(null, [\n Validators.min(2),\n Validators.max(10),\n ]),\n is_anonymous: new FormControl(false),\n allow_user_suggested_options: new FormControl(false),\n allow_answers: new FormControl(false),\n });\n isModalOpen = true;\n @ViewChild('formContent') private formContent!: TemplateRef<void>;\n\n constructor(\n readonly customTemplatesService: CustomTemplatesService,\n private chatService: ChatClientService,\n private notificationService: NotificationService\n ) {\n this.formGroup\n .get('maximum_number_of_votes')\n ?.addValidators([\n maximumNumberOfVotes(\n this.formGroup.get('multiple_answers') as FormControl<boolean>\n ),\n ]);\n this.formGroup.get('maximum_number_of_votes')?.disable();\n this.formGroup.valueChanges.subscribe((value) => {\n if (\n value.multiple_answers &&\n this.formGroup.get('maximum_number_of_votes')?.disabled\n ) {\n this.formGroup.get('maximum_number_of_votes')?.enable();\n } else if (\n !value.multiple_answers &&\n this.formGroup.get('maximum_number_of_votes')?.enabled\n ) {\n this.formGroup.get('maximum_number_of_votes')?.disable();\n }\n });\n }\n\n optionChanged(index: number) {\n const control = this.options.at(index);\n const penultimateIndex = this.options.length - 2;\n if (index === this.options.length - 1) {\n this.addOption();\n } else if (\n index === penultimateIndex &&\n control.value?.length === 0 &&\n this.options.at(this.options.length - 1).value?.length === 0\n ) {\n this.removeLastOption();\n }\n }\n\n get options() {\n return this.formGroup.get('options') as FormArray<\n FormControl<string | null>\n >;\n }\n\n addOption() {\n const control = new FormControl<string | null>('', []);\n this.options.push(control);\n }\n\n removeLastOption() {\n this.options.removeAt(this.options.length - 1);\n }\n\n getModalContext(): ModalContext {\n return {\n isOpen: this.isModalOpen,\n isOpenChangeHandler: (isOpen: boolean) => {\n if (!isOpen) {\n this.cancel.emit();\n }\n this.isModalOpen = isOpen;\n },\n content: this.formContent,\n };\n }\n\n async createPoll() {\n try {\n const maxVotesControl = this.formGroup.get('maximum_number_of_votes');\n const response = await this.chatService.chatClient.polls.createPoll({\n name: this.formGroup.get('name')!.value!,\n options: this.formGroup\n .get('options')!\n .value.filter((v) => !!v)\n .map((v) => ({ text: v! })),\n enforce_unique_vote: !this.formGroup.get('multiple_answers')?.value,\n max_votes_allowed: maxVotesControl?.value\n ? +maxVotesControl.value\n : undefined,\n voting_visibility: this.formGroup.get('is_anonymous')?.value\n ? VotingVisibility.anonymous\n : VotingVisibility.public,\n allow_user_suggested_options: !!this.formGroup.get(\n 'allow_user_suggested_options'\n )?.value,\n allow_answers: !!this.formGroup.get('allow_answers')?.value,\n });\n this.pollCompose.emit(response?.id);\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Failed to create poll'\n );\n throw error;\n }\n }\n}\n","<ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getModalContext()\n \"\n ></ng-container>\n</ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"str-chat-angular__create-poll-modal str-chat__create-poll-modal\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #formContent>\n <div\n class=\"str-chat__dialog str-chat__poll-creation-dialog\"\n data-testid=\"poll-creation-dialog\"\n >\n <div class=\"str-chat__modal-header\">\n <div class=\"str-chat__modal-header__title\">\n {{ \"streamChat.Create poll\" | translate }}\n </div>\n </div>\n <div class=\"str-chat__dialog__body\">\n <form [formGroup]=\"formGroup\" autocomplete=\"off\">\n <div\n class=\"str-chat__form__field str-chat__form__input-field str-chat__form__input-field--with-label\"\n [class.str-chat__form__input-field--has-error]=\"\n formGroup.get('name')?.errors && formGroup.get('name')?.touched\n \"\n >\n <label class=\"str-chat__form__field-label\" htmlFor=\"name\">\n {{ \"streamChat.Question\" | translate }}\n </label>\n <div class=\"str-chat__form__input-field__value\">\n <div\n class=\"str-chat__form-field-error str-chat__form__input-field__error\"\n >\n {{\n (formGroup.get(\"name\")?.errors?.required &&\n formGroup.get(\"name\")?.touched\n ? \"streamChat.Question is required\"\n : \"\"\n ) | translate\n }}\n </div>\n <input\n id=\"name\"\n type=\"text\"\n formControlName=\"name\"\n placeholder=\"{{ 'streamChat.Ask a question' | translate }}\"\n />\n </div>\n </div>\n <fieldset class=\"str-chat__form__field str-chat__form__input-fieldset\">\n <legend class=\"str-chat__form__field-label\">\n {{ \"streamChat.Options\" | translate }}\n </legend>\n <div\n class=\"str-chat__form-field-error str-chat__form__input-field__error\"\n >\n {{\n (formGroup.get(\"options\")?.errors?.atLeastOne &&\n formGroup.get(\"options\")?.touched\n ? \"streamChat.Provide at least one option\"\n : \"\"\n ) | translate\n }}\n </div>\n <ng-container formArrayName=\"options\">\n <div class=\"str-chat__form__input-fieldset__values\">\n <!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n <ng-container\n *ngFor=\"let option of options.controls; let i = index\"\n >\n <!-- eslint-enable @angular-eslint/template/use-track-by-function -->\n <div class=\"str-chat__drag-and-drop-container__item\">\n <div class=\"str-chat__form__input-field\">\n <div class=\"str-chat__form__input-field__value\">\n <input\n id=\"option{{ i }}\"\n name=\"option{{ i }}\"\n type=\"text\"\n [formControl]=\"option\"\n (input)=\"optionChanged(i)\"\n placeholder=\"{{\n 'streamChat.Add an option' | translate\n }}\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </fieldset>\n <ng-container\n *ngTemplateOutlet=\"\n switch;\n context: {\n name: 'multiple_answers',\n control: formGroup.get('multiple_answers'),\n label: 'streamChat.Multiple answers' | translate\n }\n \"\n ></ng-container>\n <div\n *ngIf=\"formGroup.get('multiple_answers')?.value\"\n class=\"str-chat__form__field str-chat__form__input-field str-chat__form__input-field--with-label\"\n [class.str-chat__form__input-field--has-error]=\"\n formGroup.get('maximum_number_of_votes')?.errors &&\n formGroup.get('maximum_number_of_votes')?.touched\n \"\n >\n <label class=\"str-chat__form__field-label\" htmlFor=\"name\">\n {{ \"streamChat.Maximum number of votes\" | translate }}\n </label>\n <div class=\"str-chat__form__input-field__value\">\n <div\n class=\"str-chat__form-field-error str-chat__form__input-field__error\"\n >\n {{\n (formGroup.get(\"maximum_number_of_votes\")?.errors &&\n formGroup.get(\"maximum_number_of_votes\")?.touched\n ? \"streamChat.Provide a value between {{ min }}\n and {{ max }}\" : \"\" ) | translate: { min: 2, max: 10 } }}\n </div>\n <input\n id=\"maximum_number_of_votes\"\n type=\"text\"\n formControlName=\"maximum_number_of_votes\"\n placeholder=\"{{ 'streamChat.Provide a value between ' \n + '{{ min }} and {{ max }}' | translate: { min: 2, max: 10 } }}\"\n />\n </div>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n switch;\n context: {\n name: 'is_anonymous',\n control: formGroup.get('is_anonymous'),\n label: 'streamChat.Anonymous poll' | translate\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n switch;\n context: {\n name: 'allow_user_suggested_options',\n control: formGroup.get('allow_user_suggested_options'),\n label: 'streamChat.Allow option suggestions' | translate\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n switch;\n context: {\n name: 'allow_answers',\n control: formGroup.get('allow_answers'),\n label: 'streamChat.Allow comments' | translate\n }\n \"\n ></ng-container>\n </form>\n </div>\n <stream-notification-list></stream-notification-list>\n <div class=\"str-chat__dialog__controls\">\n <button\n class=\"str-chat__dialog__controls-button str-chat__dialog__controls-button--cancel\"\n (click)=\"cancel.emit()\"\n type=\"button\"\n >\n {{ \"streamChat.Cancel\" | translate }}\n </button>\n <button\n class=\"str-chat__dialog__controls-button str-chat__dialog__controls-button--submit\"\n (click)=\"createPoll()\"\n [disabled]=\"formGroup.invalid\"\n type=\"submit\"\n >\n {{ \"streamChat.Create\" | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #switch let-control=\"control\" let-label=\"label\" let-name=\"name\">\n <div class=\"str-chat__form__field str-chat__form__switch-field\">\n <label>\n <div class=\"str-chat__form__field str-chat__form__switch-field-content\">\n <div class=\"str-chat__form__field str-chat__form__switch-field__text\">\n {{ label | translate }}\n </div>\n </div>\n <input\n type=\"checkbox\"\n [checked]=\"control.value\"\n id=\"{{ name }}\"\n name=\"{{ name }}\"\n />\n <div\n class=\"str-chat__form__switch-field__switch\"\n [class.str-chat__form__switch-field__switch--on]=\"control.value\"\n (click)=\"control.setValue(!control.value, { emitEvent: true })\"\n (keyup.enter)=\"control.setValue(!control.value, { emitEvent: true })\"\n >\n <div class=\"str-chat__form__switch-field__switch-handle\"></div>\n </div>\n </label>\n </div>\n</ng-template>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n} from '@angular/core';\nimport { ChatClientService } from '../chat-client.service';\nimport { Poll, User } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { Subscription } from 'rxjs';\nimport { CustomTemplatesService } from '../custom-templates.service';\nimport { NotificationService } from '../notification.service';\n\n/**\n * @internal\n */\n@Component({\n selector: 'stream-base-poll',\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport abstract class BasePollComponent\n implements OnChanges, AfterViewInit, OnDestroy\n{\n /**\n * The poll id to display\n */\n @Input() pollId: string | undefined;\n /**\n * The message id the poll is attached to\n */\n @Input() messageId: string | undefined;\n canVote = false;\n canQueryVotes = false;\n private pollStateUnsubscribe?: () => void;\n private isViewInited = false;\n private capabilitySubscription?: Subscription;\n protected dismissNotificationFn: (() => void) | undefined;\n\n constructor(\n public customTemplatesService: CustomTemplatesService,\n private chatClientService: ChatClientService,\n private cdRef: ChangeDetectorRef,\n private channelService: ChannelService,\n protected notificationService: NotificationService\n ) {\n this.capabilitySubscription = this.channelService.activeChannel$.subscribe(\n (channel) => {\n if (channel) {\n const capabilities = channel.data?.own_capabilities as string[];\n this.canVote = capabilities.indexOf('cast-poll-vote') !== -1;\n this.canQueryVotes = capabilities.indexOf('query-poll-votes') !== -1;\n }\n }\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['pollId']) {\n if (this.pollId) {\n this.setupStateStoreSelector();\n } else {\n this.pollStateUnsubscribe?.();\n }\n this.dismissNotificationFn?.();\n }\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n }\n\n ngOnDestroy(): void {\n this.pollStateUnsubscribe?.();\n this.dismissNotificationFn?.();\n this.capabilitySubscription?.unsubscribe();\n }\n\n protected get poll(): Poll | undefined {\n return this.chatClientService.chatClient.polls.fromState(this.pollId ?? '');\n }\n\n protected setupStateStoreSelector(): void {\n this.pollStateUnsubscribe?.();\n const poll = this.chatClientService.chatClient.polls.fromState(\n this.pollId ?? ''\n );\n if (poll) {\n this.pollStateUnsubscribe = this.stateStoreSelector(poll, () => {\n this.markForCheck();\n });\n }\n }\n\n protected addNotification(\n ...args: Parameters<\n typeof this.notificationService.addTemporaryNotification\n >\n ) {\n this.dismissNotificationFn?.();\n this.dismissNotificationFn =\n this.notificationService.addTemporaryNotification(...args);\n }\n\n protected abstract stateStoreSelector(\n poll: Poll,\n markForCheck: () => void\n ): () => void;\n\n protected get currentUser(): User | undefined {\n return this.chatClientService.chatClient.user;\n }\n\n protected markForCheck(): void {\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n }\n }\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { Poll, PollState } from 'stream-chat';\nimport { BasePollComponent } from '../base-poll.component';\n\ntype SelectionInstructions = {\n text: string;\n count: number | undefined;\n};\n\n/**\n *\n */\n@Component({\n selector: 'stream-poll-header',\n templateUrl: './poll-header.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PollHeaderComponent extends BasePollComponent {\n name = '';\n selectionInstructions: SelectionInstructions = {\n text: '',\n count: undefined,\n };\n\n protected stateStoreSelector(\n poll: Poll,\n markForCheck: () => void\n ): () => void {\n const unsubscribe = poll.state.subscribeWithSelector(\n (state) => ({\n name: state.name,\n is_closed: state.is_closed,\n enforce_unique_vote: state.enforce_unique_vote,\n max_votes_allowed: state.max_votes_allowed,\n options: state.options,\n }),\n (state) => {\n const name = state.name;\n const selectionInstructions = this.getSelectionInstructions(state);\n\n let changed = false;\n if (name !== this.name) {\n this.name = name;\n changed = true;\n }\n if (\n selectionInstructions.text !== this.selectionInstructions.text ||\n selectionInstructions.count !== this.selectionInstructions.count\n ) {\n this.selectionInstructions = selectionInstructions;\n changed = true;\n }\n\n if (changed) {\n markForCheck();\n }\n }\n );\n\n return unsubscribe;\n }\n\n getSelectionInstructions(\n state: Pick<\n PollState,\n 'is_closed' | 'enforce_unique_vote' | 'max_votes_allowed' | 'options'\n >\n ): SelectionInstructions {\n if (state.is_closed)\n return {\n text: 'streamChat.Vote ended',\n count: undefined,\n };\n if (state.enforce_unique_vote || state.options.length === 1) {\n return {\n text: 'streamChat.Select one',\n count: undefined,\n };\n }\n if (state.max_votes_allowed)\n return {\n text: 'streamChat.Select up to {{count}}',\n count:\n state.max_votes_allowed > state.options.length\n ? state.options.length\n : state.max_votes_allowed,\n };\n if (state.options.length > 1) {\n return {\n text: 'streamChat.Select one or more',\n count: undefined,\n };\n }\n return {\n text: '',\n count: undefined,\n };\n }\n}\n","<div class=\"str-chat__poll-header\">\n <div class=\"str-chat__poll-title\">{{ name }}</div>\n <div class=\"str-chat__poll-subtitle\">\n {{ selectionInstructions.text | translate : selectionInstructions }}\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { BasePollComponent } from '../base-poll.component';\nimport {\n isVoteAnswer,\n Poll,\n PollOption,\n PollVote,\n VotingVisibility,\n} from 'stream-chat';\n\n/**\n *\n */\n@Component({\n selector: 'stream-poll-option-selector',\n templateUrl: './poll-option-selector.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PollOptionSelectorComponent\n extends BasePollComponent\n implements OnChanges\n{\n @Input() option: PollOption | undefined;\n @Input() displayAvatarCount = 3;\n @Input() voteCountVerbose = false;\n isClosed = false;\n latestVotes: PollVote[] = [];\n isWinner = false;\n ownVote: PollVote | undefined;\n voteCount = 0;\n votingVisibility: VotingVisibility | undefined;\n winningOptionCount = 0;\n maxVoteAllowedCount = 0;\n ownVoteCount = 0;\n\n ngOnChanges(changes: SimpleChanges): void {\n super.ngOnChanges(changes);\n if (changes['option']) {\n this.setupStateStoreSelector();\n }\n }\n\n async toggleVote() {\n if (!this.canVote || !this.option?.id || !this.messageId || this.isClosed)\n return;\n const haveVotedForTheOption = !!this.ownVote;\n if (\n !haveVotedForTheOption &&\n this.maxVoteAllowedCount > 0 &&\n this.ownVoteCount >= this.maxVoteAllowedCount\n ) {\n this.addNotification(\n 'streamChat.You have reached the maximum number of votes allowed'\n );\n return;\n }\n try {\n await (haveVotedForTheOption\n ? this.poll?.removeVote(this.ownVote!.id, this.messageId)\n : this.poll?.castVote(this.option?.id, this.messageId));\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Failed to cast vote'\n );\n throw error;\n }\n }\n\n trackByVoteId(_: number, vote: PollVote) {\n return vote.id;\n }\n\n protected stateStoreSelector(\n poll: Poll,\n markForCheck: () => void\n ): () => void {\n const unsubscribe = poll.state.subscribeWithSelector(\n (nextValue) => {\n return {\n is_closed: nextValue.is_closed,\n latest_votes_by_option: nextValue.latest_votes_by_option,\n maxVotedOptionIds: nextValue.maxVotedOptionIds,\n ownVotesByOptionId: nextValue.ownVotesByOptionId,\n vote_counts_by_option: nextValue.vote_counts_by_option,\n voting_visibility: nextValue.voting_visibility,\n max_votes_allowed: nextValue.max_votes_allowed,\n };\n },\n (state) => {\n const isClosed = state.is_closed;\n const latestVotes =\n state.latest_votes_by_option[this.option?.id ?? '']?.filter(\n (vote) => !!vote.user && !isVoteAnswer(vote)\n ) ?? [];\n const isWinner =\n state.maxVotedOptionIds.includes(this.option?.id ?? '') &&\n state.maxVotedOptionIds.length === 1;\n const ownVote = state.ownVotesByOptionId[this.option?.id ?? ''];\n const voteCount = state.vote_counts_by_option[this.option?.id ?? ''];\n const votingVisibility = state.voting_visibility;\n const winningOptionCount =\n state.vote_counts_by_option[state.maxVotedOptionIds?.[0] ?? ''];\n const maxVoteAllowedCount = state.max_votes_allowed;\n const ownVoteCount = Object.keys(state.ownVotesByOptionId).length;\n\n let changed = false;\n if (isClosed !== this.isClosed) {\n this.isClosed = isClosed ?? false;\n changed = true;\n }\n if (latestVotes !== this.latestVotes) {\n this.latestVotes = latestVotes ?? [];\n changed = true;\n }\n if (isWinner !== this.isWinner) {\n this.isWinner = isWinner ?? false;\n changed = true;\n }\n if (ownVote !== this.ownVote) {\n this.ownVote = ownVote ?? undefined;\n changed = true;\n }\n if (voteCount !== this.voteCount) {\n this.voteCount = voteCount ?? 0;\n changed = true;\n }\n if (votingVisibility !== this.votingVisibility) {\n this.votingVisibility = votingVisibility ?? undefined;\n changed = true;\n }\n if (winningOptionCount !== this.winningOptionCount) {\n this.winningOptionCount = winningOptionCount ?? 0;\n changed = true;\n }\n if (maxVoteAllowedCount !== this.maxVoteAllowedCount) {\n this.maxVoteAllowedCount = maxVoteAllowedCount ?? 0;\n changed = true;\n }\n if (ownVoteCount !== this.ownVoteCount) {\n this.ownVoteCount = ownVoteCount ?? 0;\n changed = true;\n }\n\n if (\n this.dismissNotificationFn &&\n this.maxVoteAllowedCount > 0 &&\n this.ownVoteCount <= this.maxVoteAllowedCount\n ) {\n this.dismissNotificationFn();\n changed = true;\n }\n\n if (changed) {\n markForCheck();\n }\n }\n );\n\n return unsubscribe;\n }\n}\n","<div\n class=\"str-chat__poll-option\"\n [class.str-chat__poll-option--votable]=\"\n !isClosed &&\n canVote &&\n maxVoteAllowedCount &&\n ownVoteCount < maxVoteAllowedCount &&\n !ownVote\n \"\n (click)=\"toggleVote()\"\n (keyup.enter)=\"toggleVote()\"\n>\n <ng-container *ngIf=\"canVote\">\n <ng-container *ngTemplateOutlet=\"checkmark\"></ng-container>\n </ng-container>\n <div class=\"str-chat__poll-option-data\">\n <p class=\"str-chat__poll-option-text\">{{ option?.text }}</p>\n <ng-container *ngIf=\"displayAvatarCount && votingVisibility === 'public'\">\n <div\n *ngFor=\"let vote of latestVotes; trackBy: trackByVoteId\"\n class=\"str-chat__poll-option-voters\"\n >\n <stream-avatar-placeholder\n location=\"poll-voter\"\n [user]=\"vote.user\"\n [imageUrl]=\"vote.user?.image\"\n [name]=\"vote.user?.name\"\n type=\"user\"\n ></stream-avatar-placeholder>\n </div>\n </ng-container>\n <div class=\"str-chat__poll-option-vote-count\">\n <ng-container *ngIf=\"voteCountVerbose; else count\">\n {{ 'streamChat.{{ count }} votes' | translate:{count: voteCount} }}\n </ng-container>\n <ng-template #count>\n {{ voteCount }}\n </ng-template>\n </div>\n </div>\n <ng-container *ngTemplateOutlet=\"amountBar\"></ng-container>\n</div>\n\n<ng-template #checkmark>\n <div\n class=\"str-chat__checkmark\"\n [class.str-chat__checkmark--checked]=\"!!ownVote\"\n ></div>\n</ng-template>\n\n<ng-template #amountBar>\n <div\n class=\"str-chat__amount-bar str-chat__poll-option__votes-bar\"\n [class.str-chat__poll-option__votes-bar--winner]=\"isClosed && isWinner\"\n role=\"progressbar\"\n [ngStyle]=\"{\n '--str-chat__amount-bar-fulfillment':\n (winningOptionCount && voteCount / winningOptionCount) * 100 + '%'\n }\"\n ></div>\n</ng-template>\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { BasePollComponent } from '../base-poll.component';\nimport { Poll, PollOption } from 'stream-chat';\n\n/**\n *\n */\n@Component({\n selector: 'stream-poll-options-list',\n templateUrl: './poll-options-list.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PollOptionsListComponent extends BasePollComponent {\n /**\n * How many options should be displayed. If there are more options than this number, use the poll actions to display all options\n */\n @Input() maxOptionsDisplayed: number | undefined = 10;\n options: PollOption[] = [];\n\n protected stateStoreSelector(\n poll: Poll,\n markForCheck: () => void\n ): () => void {\n const unsubscribe = poll.state.subscribeWithSelector(\n (state) => ({\n options: state.options,\n }),\n (state) => {\n this.options = state.options;\n markForCheck();\n }\n );\n\n return unsubscribe;\n }\n\n trackByOptionId(_: number, option: PollOption) {\n return option.id;\n }\n}\n","<div\n class=\"str-chat__poll-option-list\"\n [class.str-chat__poll-option-list--full]=\"\n !maxOptionsDisplayed || maxOptionsDisplayed === options.length\n \"\n>\n <ng-container\n *ngFor=\"\n let option of options | slice : 0 : maxOptionsDisplayed;\n trackBy: trackByOptionId\n \"\n >\n <stream-poll-option-selector\n [option]=\"option\"\n [messageId]=\"messageId\"\n [pollId]=\"pollId\"\n ></stream-poll-option-selector>\n </ng-container>\n</div>\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { PollAnswer, PollVote } from 'stream-chat';\nimport { DateParserService } from '../../../../date-parser.service';\n\n/**\n *\n */\n@Component({\n selector: 'stream-poll-vote',\n templateUrl: './poll-vote.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PollVoteComponent {\n /**\n * The poll vote or answer to display\n */\n @Input() vote: PollVote | PollAnswer | undefined;\n anonymousTranslation = 'Anonymous';\n\n constructor(\n private translateService: TranslateService,\n private dateParser: DateParserService\n ) {\n this.translateService\n .get('streamChat.Anonymous')\n .subscribe((translation: string) => {\n this.anonymousTranslation = translation;\n });\n }\n\n parseDate(date: string) {\n return this.dateParser.parseDateTime(new Date(date));\n }\n}\n","<div class=\"str-chat__poll-vote\">\n <div class=\"str-chat__poll-vote__author\">\n <stream-avatar-placeholder\n location=\"poll-voter\"\n [user]=\"vote?.user\"\n [imageUrl]=\"vote?.user?.image\"\n [name]=\"vote?.user?.name ?? anonymousTranslation\"\n type=\"user\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__poll-vote__author__name\">\n {{ vote?.user?.name ?? anonymousTranslation }}\n </div>\n </div>\n <div *ngIf=\"vote?.created_at\" class=\"str-chat__poll-vote__timestamp\">\n {{ parseDate(vote!.created_at) }}\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { BasePollComponent } from '../../../base-poll.component';\nimport { Poll, PollOption, PollVote } from 'stream-chat';\n\n/**\n *\n */\n@Component({\n selector: 'stream-poll-vote-results-list',\n templateUrl: './poll-vote-results-list.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PollVoteResultsListComponent\n extends BasePollComponent\n implements OnChanges\n{\n /**\n * The poll option to display the votes for\n */\n @Input() option: PollOption | undefined;\n isWinner = false;\n voteCount = 0;\n isLoading = false;\n next?: string | undefined;\n votes: PollVote[] = [];\n\n ngOnChanges(changes: SimpleChanges): void {\n super.ngOnChanges(changes);\n if (changes['option']) {\n this.setupStateStoreSelector();\n this.next = undefined;\n this.votes = [];\n void this.loadVotes();\n }\n }\n\n async loadVotes() {\n if (!this.poll) {\n return;\n }\n try {\n this.isLoading = true;\n const response = await this.poll.queryOptionVotes({\n filter: {\n option_id: this.option?.id ?? '',\n },\n sort: { created_at: -1 },\n options: {\n next: this.next,\n },\n });\n\n this.next = response.next;\n this.votes = [...this.votes, ...response.votes];\n this.markForCheck();\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error loading votes'\n );\n throw error;\n this.markForCheck();\n } finally {\n this.isLoading = false;\n this.markForCheck();\n }\n }\n\n trackByVoteId = (_: number, vote: PollVote) => {\n return vote.id;\n };\n\n protected stateStoreSelector(\n poll: Poll,\n markForCheck: () => void\n ): () => void {\n const subscribe = poll.state.subscribeWithSelector(\n (state) => ({\n voteCount: state.vote_counts_by_option[this.option?.id ?? ''],\n maxVotedOptionIds: state.maxVotedOptionIds,\n }),\n (state) => {\n this.isWinner =\n state.maxVotedOptionIds?.includes(this.option?.id ?? '') &&\n state.maxVotedOptionIds.length === 1;\n this.voteCount = state.voteCount ?? 0;\n markForCheck();\n }\n );\n\n return subscribe;\n }\n}\n","<div class=\"str-chat__poll-option str-chat__poll-option--full-vote-list\">\n <div class=\"str-chat__poll-option__header\">\n <div class=\"str-chat__poll-option__option-text\">{{ option?.text }}</div>\n <div class=\"str-chat__poll-result-option-vote-counter\">\n <div\n *ngIf=\"isWinner\"\n class=\"str-chat__poll-result-winning-option-icon\"\n ></div>\n <span class=\"str-chat__poll-result-option-vote-count\">\n {{ 'streamChat.{{ count }} votes' | translate:{count: voteCount ?? 0} }}\n </span>\n </div>\n </div>\n <stream-paginated-list\n class=\"str-chat__poll-vote-listing\"\n [items]=\"votes\"\n [hasMore]=\"next !== undefined\"\n [isLoading]=\"isLoading\"\n [trackBy]=\"trackByVoteId\"\n (loadMore)=\"loadVotes()\"\n >\n <ng-template let-vote=\"item\">\n <stream-poll-vote [vote]=\"vote\"></stream-poll-vote>\n </ng-template>\n </stream-paginated-list>\n</div>\n","import { ChangeDetectionStrategy, Component, HostBinding } from '@angular/core';\nimport { BasePollComponent } from '../../../base-poll.component';\nimport { Poll, PollOption, PollVote } from 'stream-chat';\n\n/**\n *\n */\n@Component({\n selector: 'stream-poll-results-list',\n templateUrl: './poll-results-list.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PollResultsListComponent extends BasePollComponent {\n @HostBinding('class') class = 'str-chat__modal__poll-results';\n name = '';\n options: PollOption[] = [];\n optionToView: PollOption | undefined;\n votePreviewCount = 5;\n maxVotedOptionIds: string[] = [];\n voteCountsByOption: Record<string, number> = {};\n latestVotesByOption: Record<string, PollVote[]> = {};\n\n protected stateStoreSelector(\n poll: Poll,\n markForCheck: () => void\n ): () => void {\n const unsubscribe = poll.state.subscribeWithSelector(\n (state) => ({\n name: state.name,\n options: state.options,\n maxVotedOptionIds: state.maxVotedOptionIds,\n vote_counts_by_option: state.vote_counts_by_option,\n latest_votes_by_option: state.latest_votes_by_option,\n }),\n (state) => {\n this.name = state.name;\n this.options = [...state.options];\n this.options.sort((a, b) => {\n return (\n (state.vote_counts_by_option[b.id] ?? 0) -\n (state.vote_counts_by_option[a.id] ?? 0)\n );\n });\n this.maxVotedOptionIds = state.maxVotedOptionIds;\n this.voteCountsByOption = state.vote_counts_by_option;\n this.latestVotesByOption = state.latest_votes_by_option;\n markForCheck();\n }\n );\n\n return unsubscribe;\n }\n\n isWinner(optionId: string) {\n return (\n this.maxVotedOptionIds.length === 1 &&\n this.maxVotedOptionIds[0] === optionId\n );\n }\n\n trackByOptionId(_: number, option: PollOption) {\n return option.id;\n }\n\n trackByVoteId(_: number, vote: PollVote) {\n return vote.id;\n }\n}\n","<div\n class=\"str-chat__modal__poll-results\"\n [class.str-chat__modal__poll-results--option-detail]=\"optionToView\"\n>\n <div class=\"str-chat__modal-header\">\n <!-- eslint-disable-next-line @angular-eslint/template/accessibility-elements-content -->\n <button\n *ngIf=\"optionToView\"\n class=\"str-chat__modal-header__go-back-button\"\n (click)=\"optionToView = undefined\"\n ></button>\n <div class=\"str-chat__modal-header__title\" translate>\n streamChat.Poll results\n </div>\n </div>\n <ng-container *ngIf=\"optionToView; else allOptions\">\n <div class=\"str-chat__modal__poll-results__body\">\n <stream-poll-vote-results-list\n [option]=\"optionToView\"\n [messageId]=\"messageId\"\n [pollId]=\"pollId\"\n ></stream-poll-vote-results-list>\n </div>\n </ng-container>\n <ng-template #allOptions>\n <div class=\"str-chat__modal__poll-results__body\">\n <div class=\"str-chat__modal__poll-results__title\">{{ name }}</div>\n <div class=\"str-chat__modal__poll-results__option-list\">\n <div\n *ngFor=\"let option of options; trackBy: trackByOptionId\"\n class=\"str-chat__poll-option\"\n >\n <div class=\"str-chat__poll-option__header\">\n <div class=\"str-chat__poll-option__option-text\">\n {{ option.text }}\n </div>\n <div class=\"str-chat__poll-result-option-vote-counter\">\n <div\n *ngIf=\"isWinner(option.id)\"\n class=\"str-chat__poll-result-winning-option-icon\"\n ></div>\n <span class=\"str-chat__poll-result-option-vote-count\">\n {{ 'streamChat.{{ count }} votes' | translate:{count:\n voteCountsByOption[option.id] ?? 0} }}\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"latestVotesByOption[option?.id ?? '']\">\n <div class=\"str-chat__poll-vote-listing\">\n <ng-container\n *ngFor=\"\n let vote of latestVotesByOption[option?.id ?? '']\n | slice : 0 : votePreviewCount;\n trackBy: trackByVoteId\n \"\n >\n <stream-poll-vote [vote]=\"vote\"></stream-poll-vote>\n </ng-container>\n </div>\n </ng-container>\n <button\n *ngIf=\"\n voteCountsByOption[option?.id ?? ''] > votePreviewCount &&\n canQueryVotes\n \"\n class=\"str-chat__poll-option__show-all-votes-button\"\n translate\n (click)=\"optionToView = option\"\n >\n streamChat.Show all\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostBinding,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { BasePollComponent } from '../../base-poll.component';\nimport { Poll, PollAnswer } from 'stream-chat';\n\n/**\n *\n */\n@Component({\n selector: 'stream-poll-answers-list',\n templateUrl: './poll-answers-list.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PollAnswersListComponent\n extends BasePollComponent\n implements OnChanges\n{\n @HostBinding('class') class = 'str-chat__modal__poll-answer-list';\n /**\n * The even that's emitted when the update/add comment button is clicked\n */\n @Output() upsertOwnAnswer = new EventEmitter<void>();\n isLoading = false;\n next?: string | undefined;\n answers: PollAnswer[] = [];\n isClosed = false;\n ownAnswer: PollAnswer | undefined;\n\n ngOnChanges(changes: SimpleChanges): void {\n super.ngOnChanges(changes);\n if (changes['pollId']) {\n void this.queryAnswers();\n }\n }\n\n async queryAnswers() {\n if (!this.poll) {\n return;\n }\n try {\n this.isLoading = true;\n const response = await this.poll.queryAnswers({\n filter: {},\n sort: { created_at: -1 },\n options: {\n next: this.next,\n },\n });\n\n this.next = response.next;\n this.answers = [...this.answers, ...response.votes];\n this.markForCheck();\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error loading answers'\n );\n this.markForCheck();\n throw error;\n } finally {\n this.isLoading = false;\n this.markForCheck();\n }\n }\n\n trackByAnswerId(_: number, answer: PollAnswer) {\n return answer.id;\n }\n\n protected stateStoreSelector(\n poll: Poll,\n markForCheck: () => void\n ): () => void {\n const unsubscribe = poll.state.subscribeWithSelector(\n (state) => ({\n is_closed: state.is_closed,\n own_answer: state.ownAnswer,\n }),\n (state) => {\n this.isClosed = state.is_closed ?? false;\n this.ownAnswer = state.own_answer ?? undefined;\n markForCheck();\n }\n );\n\n return unsubscribe;\n }\n}\n","<div class=\"str-chat__modal__poll-answer-list\">\n <div class=\"str-chat__modal-header\">\n <div class=\"str-chat__modal-header__title\" translate>\n streamChat.Poll comments\n </div>\n </div>\n <div class=\"str-chat__modal__poll-answer-list__body\">\n <div class=\"str-chat__poll-answer-list\">\n <stream-paginated-list\n class=\"str-chat__poll-answer-list\"\n [items]=\"answers\"\n [hasMore]=\"next !== undefined\"\n [isLoading]=\"isLoading\"\n [trackBy]=\"trackByAnswerId\"\n (loadMore)=\"queryAnswers()\"\n >\n <ng-template let-answer=\"item\">\n <div class=\"str-chat__poll-answer\">\n <p *ngIf=\"answer.answer_text\" class=\"str-chat__poll-answer__text\">\n {{ answer.answer_text }}\n </p>\n <stream-poll-vote [vote]=\"answer\"></stream-poll-vote>\n </div>\n </ng-template>\n </stream-paginated-list>\n <button\n *ngIf=\"!isClosed\"\n class=\"str-chat__poll-action\"\n (click)=\"upsertOwnAnswer.emit()\"\n >\n {{\n (ownAnswer\n ? \"streamChat.Update your comment\"\n : \"streamChat.Add a comment\"\n ) | translate\n }}\n </button>\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { Poll, PollAnswer } from 'stream-chat';\nimport { BasePollComponent } from '../../base-poll.component';\n\n/**\n *\n */\n@Component({\n selector: 'stream-upsert-answer',\n templateUrl: './upsert-answer.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UpsertAnswerComponent\n extends BasePollComponent\n implements OnChanges\n{\n @HostBinding('class') class = 'str-chat__dialog';\n /**\n * The poll comment to edit, when in edit mode\n */\n @Input() answer: PollAnswer | undefined;\n /**\n * The callback to close the modal the component is displayed in\n */\n @Input() closeModal: () => void = () => {};\n formGroup = new FormGroup({\n comment: new FormControl('', [Validators.required]),\n });\n\n ngOnChanges(changes: SimpleChanges): void {\n super.ngOnChanges(changes);\n if (changes['answer']) {\n this.formGroup.get('comment')?.setValue(this.answer?.answer_text ?? '');\n }\n }\n\n async addComment() {\n if (this.formGroup.invalid || !this.messageId) {\n return;\n }\n try {\n await this.poll?.addAnswer(this.formGroup.value.comment!, this.messageId);\n this.closeModal();\n this.markForCheck();\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Failed to add comment'\n );\n this.markForCheck();\n throw error;\n }\n }\n\n protected stateStoreSelector(_: Poll, __: () => void): () => void {\n return () => {};\n }\n}\n","<div\n class=\"str-chat__dialog str-chat__dialog--form str-chat__prompt-dialog str-chat__modal__poll-add-comment\"\n>\n <div class=\"str-chat__dialog__body\">\n <div class=\"str-chat__dialog__title\">\n {{\n (answer ? \"streamChat.Update your comment\" : \"streamChat.Add a comment\")\n | translate\n }}\n </div>\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"addComment()\">\n <div class=\"str-chat__dialog__field\">\n <input formControlName=\"comment\" id=\"comment\" type=\"text\" />\n </div>\n <div class=\"str-chat__dialog__controls\">\n <button\n class=\"str-chat__dialog__controls-button str-chat__dialog__controls-button--cancel\"\n onClick=\"{close}\"\n type=\"button\"\n (click)=\"closeModal()\"\n >\n {{ \"streamChat.Cancel\" | translate }}\n </button>\n <button\n class=\"str-chat__dialog__controls-button str-chat__dialog__controls-button--submit\"\n type=\"submit\"\n [disabled]=\"formGroup.invalid\"\n >\n {{ \"streamChat.Send\" | translate }}\n </button>\n </div>\n </form>\n </div>\n</div>\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport function createUniqueValidator(\n isUnique: (v: string) => boolean\n): ValidatorFn {\n return (control: AbstractControl<string>): ValidationErrors | null => {\n const value = control.value;\n\n if (!value) {\n return null;\n }\n\n if (!isUnique(value)) {\n return { duplicate: true };\n }\n\n return null;\n };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n} from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { BasePollComponent } from '../../base-poll.component';\nimport { Poll, PollOption } from 'stream-chat';\nimport { createUniqueValidator } from '../../unique.validator';\n\n/**\n *\n */\n@Component({\n selector: 'stream-add-option',\n templateUrl: './add-option.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AddOptionComponent extends BasePollComponent {\n @HostBinding('class') class = 'str-chat__dialog';\n /**\n * The callback to close the modal the component is displayed in\n */\n @Input() closeModal: () => void = () => {};\n formGroup = new FormGroup({\n text: new FormControl('', [\n Validators.required,\n createUniqueValidator((value) => {\n return !this.options.some(\n (option) =>\n option.text.trim().toLowerCase() === value.trim().toLowerCase()\n );\n }),\n ]),\n });\n options: PollOption[] = [];\n\n async addOption() {\n if (this.formGroup.invalid || !this.messageId) {\n return;\n }\n try {\n await this.poll?.createOption({\n text: this.formGroup.value.text!,\n });\n this.closeModal();\n this.markForCheck();\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Failed to add option ({{ message }})',\n 'error',\n undefined,\n { message: error }\n );\n this.markForCheck();\n throw error;\n }\n }\n\n protected stateStoreSelector(\n poll: Poll,\n markForCheck: () => void\n ): () => void {\n const unsubscribe = poll.state.subscribeWithSelector(\n (state) => ({\n options: state.options,\n }),\n (state) => {\n this.options = state.options;\n markForCheck();\n }\n );\n\n return unsubscribe;\n }\n}\n","<div\n class=\"str-chat__dialog str-chat__dialog--form str-chat__prompt-dialog str-chat__modal__suggest-poll-option\"\n>\n <div class=\"str-chat__dialog__body\">\n <div class=\"str-chat__dialog__title\">\n {{ \"streamChat.Suggest an option\" | translate }}\n </div>\n <form [formGroup]=\"formGroup\">\n <div class=\"str-chat__dialog__field\">\n <input formControlName=\"text\" id=\"text\" type=\"text\" />\n <div class=\"str-chat__form-field-error\">\n {{\n formGroup.get(\"text\")?.errors?.duplicate\n ? (\"streamChat.Option already exists\" | translate)\n : \"\"\n }}\n </div>\n </div>\n <div class=\"str-chat__dialog__controls\">\n <button\n class=\"str-chat__dialog__controls-button str-chat__dialog__controls-button--cancel\"\n type=\"button\"\n (click)=\"closeModal()\"\n (keyup.enter)=\"closeModal()\"\n >\n {{ \"streamChat.Cancel\" | translate }}\n </button>\n <button\n class=\"str-chat__dialog__controls-button str-chat__dialog__controls-button--submit\"\n type=\"submit\"\n (click)=\"addOption()\"\n (keyup.enter)=\"addOption()\"\n [disabled]=\"formGroup.invalid\"\n >\n {{ \"streamChat.Send\" | translate }}\n </button>\n </div>\n </form>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { BasePollComponent } from '../base-poll.component';\nimport { Poll, PollAnswer, PollOption } from 'stream-chat';\nimport { ModalContext } from '../../types';\nimport { CustomTemplatesService } from '../../custom-templates.service';\nimport { ChatClientService } from '../../chat-client.service';\nimport { ChannelService } from '../../channel.service';\nimport { MessageActionsService } from '../../message-actions.service';\nimport { NotificationService } from '../../notification.service';\n\ntype Action =\n | 'allOptions'\n | 'suggestOption'\n | 'addAnswer'\n | 'viewComments'\n | 'viewResults'\n | 'endVote';\n\n/**\n *\n */\n@Component({\n selector: 'stream-poll-actions',\n templateUrl: './poll-actions.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PollActionsComponent extends BasePollComponent {\n /**\n * If there are more options than this number, the \"See all options\" button will be displayed\n */\n @Input() maxOptionsDisplayed: number | undefined = 10;\n /**\n * The maximum number of options allowed for the poll, this is defined by Stream API\n */\n @Input() maxPollOptions = 100;\n name = '';\n options: PollOption[] = [];\n isClosed = false;\n allowUserSuggestions = false;\n allowAnswers = false;\n answerCount = 0;\n isOwnPoll = false;\n ownAnwer: PollAnswer | undefined;\n selectedAction: Action | undefined = undefined;\n isModalOpen = false;\n @ViewChild('allOptions') allOptions!: TemplateRef<void>;\n @ViewChild('suggestOption') suggestOption!: TemplateRef<void>;\n @ViewChild('addAnswer') addAnswer!: TemplateRef<void>;\n @ViewChild('viewComments') viewComments!: TemplateRef<void>;\n @ViewChild('viewResults') viewResults!: TemplateRef<void>;\n @ViewChild('endVote') endVote!: TemplateRef<void>;\n\n constructor(\n customTemplatesService: CustomTemplatesService,\n chatClientService: ChatClientService,\n cdRef: ChangeDetectorRef,\n channelService: ChannelService,\n notificationService: NotificationService,\n private messageService: MessageActionsService\n ) {\n super(\n customTemplatesService,\n chatClientService,\n cdRef,\n channelService,\n notificationService\n );\n }\n\n protected stateStoreSelector(\n poll: Poll,\n markForCheck: () => void\n ): () => void {\n const unsubscribe = poll.state.subscribeWithSelector(\n (state) => ({\n options: state.options,\n is_closed: state.is_closed,\n allow_user_suggested_options: state.allow_user_suggested_options,\n allow_answers: state.allow_answers,\n answer_count: state.answers_count,\n created_by: state.created_by,\n name: state.name,\n own_answer: state.ownAnswer,\n max_votes_allowed: state.max_votes_allowed,\n own_votes_by_option_id: state.ownVotesByOptionId,\n }),\n (state) => {\n this.options = state.options;\n this.isClosed = state.is_closed ?? false;\n this.allowUserSuggestions = state.allow_user_suggested_options ?? false;\n this.allowAnswers = state.allow_answers ?? false;\n this.answerCount = state.answer_count ?? 0;\n this.isOwnPoll = state.created_by?.id === this.currentUser?.id;\n this.name = state.name;\n this.ownAnwer = state.own_answer ?? undefined;\n markForCheck();\n }\n );\n\n return unsubscribe;\n }\n\n modalOpened = (action: Action) => {\n this.selectedAction = action;\n if (!this.isModalOpen) {\n this.isModalOpen = true;\n this.messageService.modalOpenedForMessage.next(this.messageId);\n }\n };\n\n modalClosed = () => {\n this.selectedAction = undefined;\n if (this.isModalOpen) {\n this.isModalOpen = false;\n this.messageService.modalOpenedForMessage.next(undefined);\n this.markForCheck();\n }\n };\n\n async closePoll() {\n try {\n await this.poll?.close();\n this.modalClosed();\n this.markForCheck();\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Failed to end vote'\n );\n throw error;\n }\n }\n\n getModalContext(): ModalContext {\n return {\n isOpen: this.isModalOpen,\n isOpenChangeHandler: (isOpen: boolean) => {\n if (isOpen) {\n this.modalOpened(this.selectedAction!);\n } else {\n this.modalClosed();\n }\n },\n content: this[this.selectedAction!],\n };\n }\n}\n","<div class=\"str-chat__poll-actions\">\n <ng-container\n *ngIf=\"maxOptionsDisplayed && options.length > maxOptionsDisplayed\"\n >\n <button class=\"str-chat__poll-action\" (click)=\"modalOpened('allOptions')\">\n {{ \"streamChat.See all options ({{count}})\" | translate:{count:\n options.length} }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n allowUserSuggestions &&\n canVote &&\n !isClosed &&\n options.length < maxPollOptions\n \"\n >\n <button\n class=\"str-chat__poll-action\"\n (click)=\"modalOpened('suggestOption')\"\n >\n {{ \"streamChat.Suggest an option\" | translate }}\n </button>\n </ng-container>\n <ng-container *ngIf=\"allowAnswers && canVote && !isClosed\">\n <button\n class=\"str-chat__poll-action\"\n (click)=\"modalOpened('addAnswer')\"\n (keyup.enter)=\"modalOpened('addAnswer')\"\n >\n <ng-container *ngIf=\"ownAnwer; else newAnswer\">\n {{ \"streamChat.Update your comment\" | translate }}\n </ng-container>\n <ng-template #newAnswer>\n {{ \"streamChat.Add a comment\" | translate }}\n </ng-template>\n </button>\n </ng-container>\n <ng-container *ngIf=\"answerCount > 0 && canQueryVotes\">\n <button class=\"str-chat__poll-action\" (click)=\"modalOpened('viewComments')\">\n {{ (answerCount === 1 ? \"streamChat.View {{ count }} comment\" :\n \"streamChat.View {{ count }} comments\") | translate:{count: answerCount}\n }}\n </button>\n </ng-container>\n <ng-container *ngIf=\"canQueryVotes\">\n <button class=\"str-chat__poll-action\" (click)=\"modalOpened('viewResults')\">\n {{ \"streamChat.View results\" | translate }}\n </button>\n </ng-container>\n <ng-container *ngIf=\"isOwnPoll && !isClosed\">\n <button class=\"str-chat__poll-action\" (click)=\"modalOpened('endVote')\">\n {{ \"streamChat.End vote\" | translate }}\n </button>\n </ng-container>\n</div>\n\n<ng-container *ngIf=\"selectedAction\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getModalContext()\n \"\n ></ng-container>\n</ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"str-chat__poll-actions str-chat-angular__poll-actions\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #allOptions>\n <div class=\"str-chat__modal__poll-option-list str-chat-angular__poll-actions\">\n <div class=\"str-chat__modal-header\">\n <div class=\"str-chat__modal-header__title\">\n {{ \"streamChat.Poll options\" | translate }}\n </div>\n </div>\n <div class=\"str-chat__modal__poll-option-list__body\">\n <div class=\"str-chat__modal__poll-option-list__title\">{{ name }}</div>\n <stream-poll-options-list\n [pollId]=\"pollId\"\n [messageId]=\"messageId\"\n [maxOptionsDisplayed]=\"undefined\"\n ></stream-poll-options-list>\n <stream-notification-list></stream-notification-list>\n </div>\n </div>\n</ng-template>\n<ng-template #suggestOption>\n <stream-add-option\n [pollId]=\"pollId\"\n [messageId]=\"messageId\"\n [closeModal]=\"modalClosed\"\n ></stream-add-option>\n <stream-notification-list></stream-notification-list>\n</ng-template>\n<ng-template #addAnswer>\n <stream-upsert-answer\n [pollId]=\"pollId\"\n [messageId]=\"messageId\"\n [answer]=\"ownAnwer\"\n [closeModal]=\"modalClosed\"\n ></stream-upsert-answer>\n <stream-notification-list></stream-notification-list>\n</ng-template>\n<ng-template #viewComments>\n <stream-poll-answers-list\n (upsertOwnAnswer)=\"modalOpened('addAnswer')\"\n [pollId]=\"pollId\"\n [messageId]=\"messageId\"\n ></stream-poll-answers-list>\n <stream-notification-list></stream-notification-list>\n</ng-template>\n<ng-template #viewResults>\n <stream-poll-results-list\n [messageId]=\"messageId\"\n [pollId]=\"pollId\"\n ></stream-poll-results-list>\n <stream-notification-list></stream-notification-list>\n</ng-template>\n<ng-template #endVote>\n <div\n class=\"str-chat__dialog str-chat__dialog--prompt str-chat__modal__end-vote\"\n >\n <div class=\"str-chat__dialog__body\">\n <div class=\"str-chat__dialog__title\" translate>streamChat.End vote</div>\n <div class=\"str-chat__dialog__prompt\" translate>\n streamChat.After a poll is closed, no more votes can be cast\n </div>\n <stream-notification-list></stream-notification-list>\n <div class=\"str-chat__dialog__controls\">\n <button\n class=\"str-chat__dialog__controls-button\"\n (click)=\"modalClosed()\"\n >\n {{ \"streamChat.Cancel\" | translate }}\n </button>\n <button class=\"str-chat__dialog__controls-button\" (click)=\"closePoll()\">\n {{ \"streamChat.End vote\" | translate }}\n </button>\n </div>\n </div>\n </div>\n</ng-template>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { BasePollComponent } from '../base-poll.component';\nimport { Poll } from 'stream-chat';\n\n/**\n *\n */\n@Component({\n selector: 'stream-poll',\n templateUrl: './poll.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PollComponent extends BasePollComponent {\n isClosed = false;\n\n protected stateStoreSelector(\n poll: Poll,\n markForCheck: () => void\n ): () => void {\n const unsubscribe = poll.state.subscribeWithSelector(\n (state) => {\n return {\n is_closed: state.is_closed,\n };\n },\n (state) => {\n this.isClosed = state.is_closed ?? false;\n markForCheck();\n }\n );\n\n return unsubscribe;\n }\n}\n","<div class=\"str-chat__poll\" [class.str-chat__poll--closed]=\"isClosed\">\n <div #header><ng-content select=\"[poll-header]\"></ng-content></div>\n <ng-container *ngIf=\"!header.hasChildNodes()\">\n <stream-poll-header [pollId]=\"pollId\" [messageId]=\"messageId\">\n </stream-poll-header>\n </ng-container>\n <div #options><ng-content select=\"[poll-options-list]\"></ng-content></div>\n <ng-container *ngIf=\"!options.hasChildNodes()\">\n <stream-poll-options-list [pollId]=\"pollId\" [messageId]=\"messageId\">\n </stream-poll-options-list>\n </ng-container>\n <div #actions><ng-content select=\"[poll-actions]\"></ng-content></div>\n <ng-container *ngIf=\"!actions.hasChildNodes()\">\n <stream-poll-actions [pollId]=\"pollId\" [messageId]=\"messageId\">\n </stream-poll-actions>\n </ng-container>\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { BasePollComponent } from '../base-poll.component';\nimport { Poll } from 'stream-chat';\n\n/**\n *\n */\n@Component({\n selector: 'stream-poll-preview',\n templateUrl: './poll-preview.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PollPreviewComponent extends BasePollComponent {\n name = '';\n isClosed = false;\n\n protected stateStoreSelector(\n poll: Poll,\n markForCheck: () => void\n ): () => void {\n const unsubscribe = poll.state.subscribeWithSelector(\n (state) => ({\n name: state.name,\n is_closed: state.is_closed,\n }),\n (state) => {\n this.name = state.name;\n this.isClosed = state.is_closed ?? false;\n markForCheck();\n }\n );\n\n return unsubscribe;\n }\n}\n","<div\n class=\"str-chat__quoted-poll-preview\"\n [class.str-chat__quoted-poll-preview--closed]=\"isClosed\"\n>\n <div class=\"str-chat__quoted-poll-preview__icon\">📊</div>\n <div class=\"str-chat__quoted-poll-preview__name\">{{ name }}</div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PollComposerComponent } from './poll-composer/poll-composer.component';\nimport { PollComponent } from './poll/poll.component';\nimport { PollHeaderComponent } from './poll-header/poll-header.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { PollOptionsListComponent } from './poll-options-list/poll-options-list.component';\nimport { PollOptionSelectorComponent } from './poll-option-selector/poll-option-selector.component';\nimport { StreamAvatarModule } from '../stream-avatar.module';\nimport { PollActionsComponent } from './poll-actions/poll-actions.component';\nimport { StreamModalModule } from '../modal/stream-modal.module';\nimport { StreamNotificationModule } from '../notification-list/stream-notification.module';\nimport { StreamPaginatedListModule } from '../paginated-list/stream-paginated-list.module';\nimport { PollVoteComponent } from './poll-actions/poll-results/poll-vote/poll-vote.component';\nimport { PollAnswersListComponent } from './poll-actions/poll-answers-list/poll-answers-list.component';\nimport { PollVoteResultsListComponent } from './poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component';\nimport { PollResultsListComponent } from './poll-actions/poll-results/poll-results-list/poll-results-list.component';\nimport { UpsertAnswerComponent } from './poll-actions/upsert-answer/upsert-answer.component';\nimport { AddOptionComponent } from './poll-actions/add-option/add-option.component';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { PollPreviewComponent } from './poll-preview/poll-preview.component';\n\n@NgModule({\n declarations: [\n PollComposerComponent,\n PollComponent,\n PollHeaderComponent,\n PollOptionsListComponent,\n PollOptionSelectorComponent,\n PollActionsComponent,\n PollResultsListComponent,\n PollVoteResultsListComponent,\n PollVoteComponent,\n PollAnswersListComponent,\n UpsertAnswerComponent,\n AddOptionComponent,\n PollPreviewComponent,\n ],\n imports: [\n CommonModule,\n TranslateModule,\n StreamAvatarModule,\n StreamModalModule,\n StreamNotificationModule,\n StreamPaginatedListModule,\n ReactiveFormsModule,\n ],\n exports: [\n PollComposerComponent,\n PollComponent,\n PollHeaderComponent,\n PollOptionsListComponent,\n PollOptionSelectorComponent,\n PollActionsComponent,\n PollResultsListComponent,\n PollVoteResultsListComponent,\n PollVoteComponent,\n PollAnswersListComponent,\n UpsertAnswerComponent,\n AddOptionComponent,\n PollPreviewComponent,\n ],\n})\nexport class StreamPollsModule {}\n","/*\n * Public API Surface of stream-chat-angular\n */\n// eslint-disable-next-line @typescript-eslint/triple-slash-reference\n/// <reference path=\"stream-chat.ts\" />\nexport * from './lib/chat-client.service';\nexport * from './lib/channel.service';\nexport * from './lib/theme.service';\nexport * from './lib/attachment.service';\nexport * from './lib/attachment-configuration.service';\nexport * from './lib/stream-i18n.service';\nexport * from './lib/avatar/avatar.component';\nexport * from './lib/avatar-placeholder/avatar-placeholder.component';\nexport * from './lib/icon/icon.component';\nexport * from './lib/icon/icon-placeholder/icon-placeholder.component';\nexport * from './lib/icon/loading-indicator/loading-indicator.component';\nexport * from './lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component';\nexport * from './lib/message-actions-box/message-actions-box.component';\nexport * from './lib/channel/channel.component';\nexport * from './lib/channel-header/channel-header.component';\nexport * from './lib/channel-preview/channel-preview.component';\nexport * from './lib/channel-list/channel-list.component';\nexport * from './lib/message/message.component';\nexport * from './lib/message-blocked/message-blocked.component';\nexport * from './lib/parse-date';\nexport * from './lib/list-users';\nexport * from './lib/message-input/message-input.component';\nexport * from './lib/message-bounce-prompt/message-bounce-prompt.component';\nexport * from './lib/message-input/textarea/textarea.component';\nexport * from './lib/message-input/autocomplete-textarea/autocomplete-textarea.component';\nexport * from './lib/message-input/message-input-config.service';\nexport * from './lib/message-input/textarea.directive';\nexport * from './lib/message-input/textarea.interface';\nexport * from './lib/message-input/emoji-input.service';\nexport * from './lib/message-list/message-list.component';\nexport * from './lib/message-list/group-styles';\nexport * from './lib/attachment-list/attachment-list.component';\nexport * from './lib/attachment-preview-list/attachment-preview-list.component';\nexport * from './lib/message-reactions/message-reactions.component';\nexport * from './lib/notification/notification.component';\nexport * from './lib/notification-list/notification-list.component';\nexport * from './lib/thread/thread.component';\nexport * from './lib/modal/modal.component';\nexport * from './lib/read-by';\nexport * from './lib/get-message-translation';\nexport * from './lib/get-channel-display-text';\nexport * from './lib/is-image-attachment';\nexport * from './lib/file-utils';\nexport * from './lib/message-preview';\nexport * from './lib/notification.service';\nexport * from './lib/transliteration.service';\nexport * from './lib/stream-chat.module';\nexport * from './lib/stream-avatar.module';\nexport * from './lib/stream-autocomplete-textarea.module';\nexport * from './lib/stream-textarea.module';\nexport * from './lib/injection-tokens';\nexport * from './lib/custom-templates.service';\nexport * from './lib/message-reactions.service';\nexport * from './lib/date-parser.service';\nexport * from './lib/types';\nexport * from './lib/types-custom';\nexport * from './lib/message.service';\nexport * from './lib/message-actions.service';\nexport * from './lib/voice-recording/voice-recording.component';\nexport * from './lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component';\nexport * from './lib/is-on-separate-date';\nexport * from './lib/message-reactions-selector/message-reactions-selector.component';\nexport * from './lib/channel-query';\nexport * from './lib/virtualized-list.service';\nexport * from './lib/virtualized-message-list.service';\nexport * from './lib/user-list/user-list.component';\nexport * from './lib/paginated-list/paginated-list.component';\nexport * from './lib/is-safari';\nexport * from './lib/voice-recorder/voice-recorder.module';\nexport * from './lib/voice-recorder/amplitude-recorder.service';\nexport * from './lib/voice-recorder/audio-recorder.service';\nexport * from './lib/voice-recorder/media-recorder';\nexport * from './lib/voice-recorder/transcoder.service';\nexport * from './lib/voice-recorder/voice-recorder.component';\nexport * from './lib/voice-recording/voice-recording.module';\nexport * from './lib/icon/icon.module';\nexport * from './lib/voice-recorder//voice-recorder-wavebar/voice-recorder-wavebar.component';\nexport * from './lib/format-duration';\nexport * from './lib/message-input/voice-recorder.service';\nexport * from './lib/voice-recorder/mp3-transcoder';\nexport * from './lib/message-text/message-text.component';\nexport * from './lib/polls/stream-polls.module';\nexport * from './lib/polls/poll-composer/poll-composer.component';\nexport * from './lib/polls/poll/poll.component';\nexport * from './lib/polls/poll-header/poll-header.component';\nexport * from './lib/polls/poll-options-list/poll-options-list.component';\nexport * from './lib/polls/poll-option-selector/poll-option-selector.component';\nexport * from './lib/polls/poll-actions/poll-actions.component';\nexport * from './lib/modal/stream-modal.module';\nexport * from './lib/notification-list/stream-notification.module';\nexport * from './lib/polls/poll-actions/poll-results/poll-results-list/poll-results-list.component';\nexport * from './lib/polls/poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component';\nexport * from './lib/paginated-list/stream-paginated-list.module';\nexport * from './lib/polls/poll-actions/poll-results/poll-vote/poll-vote.component';\nexport * from './lib/polls/poll-actions/poll-answers-list/poll-answers-list.component';\nexport * from './lib/polls/poll-actions/upsert-answer/upsert-answer.component';\nexport * from './lib/polls/poll-actions/add-option/add-option.component';\nexport * from './lib/polls/poll-preview/poll-preview.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NotificationService","uuidv4","i1.ChatClientService","i2.NotificationService","map","shareReplay","take","i1.ChannelService","i3.ChatClientService","i4.MessageService","i1","i2","i1.CustomTemplatesService","i3.AvatarComponent","i3.IconComponent","i3.LoadingIndicatorComponent","i3.ChannelService","i2.MessageReactionsService","i3","i2.MessageActionsService","i4.MessageReactionsSelectorComponent","i5","i3.ThemeService","i4","i5.NotificationComponent","i2.IconPlaceholderComponent","i2.CustomTemplatesService","i3.MessageActionsService","i5.ModalComponent","i2.ThemeService","i3.CustomTemplatesService","i5.IconComponent","i6.NotificationListComponent","i7.MessageBouncePromptComponent","i8","i5.AvatarPlaceholderComponent","i2.ChatClientService","i3.MessageService","i4.CustomTemplatesService","i5.DateParserService","i6","i7.AvatarPlaceholderComponent","i8.IconPlaceholderComponent","i9","i2.LoadingIndicatorPlaceholderComponent","i6.PaginatedListComponent","i7.ChannelPreviewComponent","divMod","i3.VoiceRecordingWavebarComponent","i2.ChannelService","i3.AttachmentConfigurationService","i6.VoiceRecordingComponent","i7.IconPlaceholderComponent","i8.ModalComponent","i1.AvatarPlaceholderComponent","i2.PaginatedListComponent","i1.MessageReactionsService","i4.ModalComponent","i5.UserListComponent","i1.MessageService","i4.DateParserService","i5.MessageActionsService","i7","i9.AvatarPlaceholderComponent","i10.IconPlaceholderComponent","i11.LoadingIndicatorPlaceholderComponent","i12.MessageActionsBoxComponent","i13.AttachmentListComponent","i14.MessageReactionsComponent","i15.MessageTextComponent","i16.MessageBlockedComponent","i3.TranscoderService","i4.AmplitudeRecorderService","i2.AttachmentService","i4.IconPlaceholderComponent","i5.LoadingIndicatorPlaceholderComponent","i5.EmojiInputService","i6.CustomTemplatesService","i7.MessageActionsService","i8.VoiceRecorderService","i9.AudioRecorderService","i10","i11.AvatarPlaceholderComponent","i12.IconPlaceholderComponent","i14.AttachmentPreviewListComponent","i15.TextareaDirective","i16.MessageTextComponent","i17","i1.EmojiInputService","i3.TransliterationService","i4.EmojiInputService","i5.CustomTemplatesService","i6.MessageInputConfigService","distinctUntilChanged","filter","i6.IconComponent","i8.LoadingIndicatorPlaceholderComponent","i9.MessageComponent","i6.IconPlaceholderComponent","i1.AmplitudeRecorderService","i2.AudioRecorderService","i1.AudioRecorderService","i3.VoiceRecordingComponent","i5.LoadingIndicatorComponent","i6.VoiceRecorderWavebarComponent","i3.NotificationService","i4.NotificationService","i2.AvatarPlaceholderComponent","i2.PollOptionSelectorComponent","i2.DateParserService","i4.AvatarPlaceholderComponent","i3.PollVoteComponent","i3.PollVoteResultsListComponent","i4.PollVoteComponent","i3.PaginatedListComponent","i9.NotificationListComponent","i10.PollOptionsListComponent","i11.PollResultsListComponent","i12.PollAnswersListComponent","i13.UpsertAnswerComponent","i14.AddOptionComponent","i2.PollHeaderComponent","i3.PollOptionsListComponent","i4.PollActionsComponent"],"mappings":"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"}
|