stream-chat-angular 6.0.0-beta.5 → 6.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +2 -2
  2. package/assets/i18n/en.d.ts +0 -1
  3. package/assets/version.d.ts +1 -1
  4. package/{esm2022 → esm2020}/assets/i18n/en.mjs +1 -2
  5. package/{esm2022 → esm2020}/assets/version.mjs +2 -2
  6. package/esm2020/lib/attachment-configuration.service.mjs +182 -0
  7. package/esm2020/lib/attachment-list/attachment-list.component.mjs +232 -0
  8. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
  9. package/esm2020/lib/attachment.service.mjs +481 -0
  10. package/esm2020/lib/avatar/avatar.component.mjs +160 -0
  11. package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +66 -0
  12. package/esm2020/lib/channel/channel.component.mjs +45 -0
  13. package/esm2020/lib/channel-header/channel-header.component.mjs +72 -0
  14. package/esm2020/lib/channel-list/channel-list.component.mjs +47 -0
  15. package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
  16. package/esm2020/lib/channel-query.mjs +77 -0
  17. package/esm2020/lib/channel.service.mjs +1561 -0
  18. package/esm2020/lib/chat-client.service.mjs +233 -0
  19. package/esm2020/lib/custom-templates.service.mjs +244 -0
  20. package/{esm2022 → esm2020}/lib/date-parser.service.mjs +5 -5
  21. package/esm2020/lib/file-utils.mjs +35 -0
  22. package/{esm2022 → esm2020}/lib/get-channel-display-text.mjs +1 -1
  23. package/esm2020/lib/get-message-translation.mjs +12 -0
  24. package/esm2020/lib/icon/icon-placeholder/icon-placeholder.component.mjs +28 -0
  25. package/{esm2022 → esm2020}/lib/icon/icon.component.mjs +5 -5
  26. package/{esm2022 → esm2020}/lib/icon/icon.module.mjs +11 -11
  27. package/{esm2022 → esm2020}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
  28. package/esm2020/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +20 -0
  29. package/{esm2022 → esm2020}/lib/list-users.mjs +1 -1
  30. package/esm2020/lib/message/message.component.mjs +486 -0
  31. package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +123 -0
  32. package/esm2020/lib/message-actions.service.mjs +187 -0
  33. package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
  34. package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +333 -0
  35. package/{esm2022 → esm2020}/lib/message-input/emoji-input.service.mjs +7 -7
  36. package/esm2020/lib/message-input/message-input-config.service.mjs +50 -0
  37. package/esm2020/lib/message-input/message-input.component.mjs +507 -0
  38. package/{esm2022 → esm2020}/lib/message-input/textarea/textarea.component.mjs +6 -6
  39. package/{esm2022 → esm2020}/lib/message-input/textarea.directive.mjs +5 -5
  40. package/{esm2022 → esm2020}/lib/message-input/voice-recorder.service.mjs +5 -5
  41. package/{esm2022 → esm2020}/lib/message-list/group-styles.mjs +1 -1
  42. package/esm2020/lib/message-list/message-list.component.mjs +717 -0
  43. package/esm2020/lib/message-preview.mjs +21 -0
  44. package/esm2020/lib/message-reactions/message-reactions.component.mjs +168 -0
  45. package/esm2020/lib/message-reactions-selector/message-reactions-selector.component.mjs +61 -0
  46. package/{esm2022 → esm2020}/lib/message-reactions.service.mjs +6 -6
  47. package/esm2020/lib/message-text/message-text.component.mjs +143 -0
  48. package/esm2020/lib/message.service.mjs +43 -0
  49. package/{esm2022 → esm2020}/lib/modal/modal.component.mjs +6 -6
  50. package/esm2020/lib/notification/notification.component.mjs +20 -0
  51. package/esm2020/lib/notification-list/notification-list.component.mjs +36 -0
  52. package/{esm2022 → esm2020}/lib/notification.service.mjs +6 -6
  53. package/esm2020/lib/paginated-list/paginated-list.component.mjs +94 -0
  54. package/{esm2022 → esm2020}/lib/parse-date.mjs +1 -1
  55. package/esm2020/lib/read-by.mjs +12 -0
  56. package/esm2020/lib/stream-autocomplete-textarea.module.mjs +33 -0
  57. package/{esm2022 → esm2020}/lib/stream-avatar.module.mjs +5 -5
  58. package/{esm2022 → esm2020}/lib/stream-chat.module.mjs +59 -59
  59. package/{esm2022 → esm2020}/lib/stream-i18n.service.mjs +6 -6
  60. package/esm2020/lib/stream-textarea.module.mjs +31 -0
  61. package/{esm2022 → esm2020}/lib/theme.service.mjs +6 -6
  62. package/esm2020/lib/thread/thread.component.mjs +51 -0
  63. package/{esm2022 → esm2020}/lib/transliteration.service.mjs +5 -5
  64. package/esm2020/lib/types-custom.mjs +2 -0
  65. package/esm2020/lib/types.mjs +2 -0
  66. package/esm2020/lib/user-list/user-list.component.mjs +47 -0
  67. package/esm2020/lib/virtualized-list.service.mjs +271 -0
  68. package/{esm2022 → esm2020}/lib/virtualized-message-list.service.mjs +1 -1
  69. package/{esm2022 → esm2020}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
  70. package/{esm2022 → esm2020}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
  71. package/{esm2022 → esm2020}/lib/voice-recorder/media-recorder.mjs +1 -1
  72. package/esm2020/lib/voice-recorder/mp3-transcoder.mjs +61 -0
  73. package/esm2020/lib/voice-recorder/transcoder.service.mjs +121 -0
  74. package/esm2020/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +35 -0
  75. package/esm2020/lib/voice-recorder/voice-recorder.component.mjs +80 -0
  76. package/{esm2022 → esm2020}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
  77. package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +112 -0
  78. package/esm2020/lib/voice-recording/voice-recording.component.mjs +91 -0
  79. package/{esm2022 → esm2020}/lib/voice-recording/voice-recording.module.mjs +5 -5
  80. package/{esm2022 → esm2020}/lib/wave-form-sampler.mjs +1 -1
  81. package/esm2020/public-api.mjs +86 -0
  82. package/esm2020/stream-chat.mjs +2 -0
  83. package/fesm2015/stream-chat-angular.mjs +9171 -0
  84. package/fesm2015/stream-chat-angular.mjs.map +1 -0
  85. package/{fesm2022 → fesm2020}/stream-chat-angular.mjs +1251 -961
  86. package/fesm2020/stream-chat-angular.mjs.map +1 -0
  87. package/lib/attachment-configuration.service.d.ts +12 -12
  88. package/lib/attachment-list/attachment-list.component.d.ts +15 -10
  89. package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
  90. package/lib/attachment.service.d.ts +12 -10
  91. package/lib/avatar/avatar.component.d.ts +7 -7
  92. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +5 -5
  93. package/lib/channel/channel.component.d.ts +1 -1
  94. package/lib/channel-header/channel-header.component.d.ts +2 -2
  95. package/lib/channel-list/channel-list.component.d.ts +3 -4
  96. package/lib/channel-preview/channel-preview.component.d.ts +6 -6
  97. package/lib/channel-query.d.ts +26 -0
  98. package/lib/channel.service.d.ts +146 -154
  99. package/lib/chat-client.service.d.ts +17 -15
  100. package/lib/custom-templates.service.d.ts +50 -50
  101. package/lib/get-channel-display-text.d.ts +1 -2
  102. package/lib/get-message-translation.d.ts +3 -3
  103. package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +2 -2
  104. package/lib/icon/icon.component.d.ts +2 -2
  105. package/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
  106. package/lib/message/message.component.d.ts +6 -6
  107. package/lib/message-actions-box/message-actions-box.component.d.ts +5 -4
  108. package/lib/message-actions.service.d.ts +10 -10
  109. package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
  110. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +5 -5
  111. package/lib/message-input/emoji-input.service.d.ts +2 -2
  112. package/lib/message-input/message-input-config.service.d.ts +3 -3
  113. package/lib/message-input/message-input.component.d.ts +10 -33
  114. package/lib/message-input/textarea/textarea.component.d.ts +3 -3
  115. package/lib/message-input/textarea.directive.d.ts +1 -1
  116. package/lib/message-list/group-styles.d.ts +1 -1
  117. package/lib/message-list/message-list.component.d.ts +3 -2
  118. package/lib/message-preview.d.ts +2 -3
  119. package/lib/message-reactions/message-reactions.component.d.ts +9 -8
  120. package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +6 -5
  121. package/lib/message-reactions.service.d.ts +4 -4
  122. package/lib/message-text/message-text.component.d.ts +5 -5
  123. package/lib/message.service.d.ts +6 -7
  124. package/lib/modal/modal.component.d.ts +1 -1
  125. package/lib/notification/notification.component.d.ts +2 -2
  126. package/lib/notification-list/notification-list.component.d.ts +1 -0
  127. package/lib/notification.service.d.ts +1 -1
  128. package/lib/paginated-list/paginated-list.component.d.ts +2 -5
  129. package/lib/read-by.d.ts +1 -2
  130. package/lib/stream-i18n.service.d.ts +1 -1
  131. package/lib/theme.service.d.ts +1 -1
  132. package/lib/thread/thread.component.d.ts +3 -3
  133. package/lib/types-custom.d.ts +15 -0
  134. package/lib/types.d.ts +116 -155
  135. package/lib/user-list/user-list.component.d.ts +2 -3
  136. package/lib/virtualized-message-list.service.d.ts +1 -1
  137. package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
  138. package/lib/voice-recorder/media-recorder.d.ts +2 -2
  139. package/lib/voice-recorder/transcoder.service.d.ts +4 -4
  140. package/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.d.ts +1 -0
  141. package/lib/voice-recorder/voice-recorder.component.d.ts +2 -2
  142. package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +3 -3
  143. package/lib/voice-recording/voice-recording.component.d.ts +2 -3
  144. package/package.json +21 -15
  145. package/public-api.d.ts +3 -0
  146. package/src/assets/i18n/en.ts +0 -1
  147. package/src/assets/version.ts +1 -1
  148. package/esm2022/lib/attachment-configuration.service.mjs +0 -185
  149. package/esm2022/lib/attachment-list/attachment-list.component.mjs +0 -212
  150. package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
  151. package/esm2022/lib/attachment.service.mjs +0 -479
  152. package/esm2022/lib/avatar/avatar.component.mjs +0 -157
  153. package/esm2022/lib/avatar-placeholder/avatar-placeholder.component.mjs +0 -66
  154. package/esm2022/lib/channel/channel.component.mjs +0 -45
  155. package/esm2022/lib/channel-header/channel-header.component.mjs +0 -72
  156. package/esm2022/lib/channel-list/channel-list.component.mjs +0 -50
  157. package/esm2022/lib/channel-preview/channel-preview.component.mjs +0 -150
  158. package/esm2022/lib/channel.service.mjs +0 -1393
  159. package/esm2022/lib/chat-client.service.mjs +0 -227
  160. package/esm2022/lib/custom-templates.service.mjs +0 -244
  161. package/esm2022/lib/file-utils.mjs +0 -35
  162. package/esm2022/lib/get-message-translation.mjs +0 -12
  163. package/esm2022/lib/icon/icon-placeholder/icon-placeholder.component.mjs +0 -28
  164. package/esm2022/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +0 -20
  165. package/esm2022/lib/message/message.component.mjs +0 -486
  166. package/esm2022/lib/message-actions-box/message-actions-box.component.mjs +0 -120
  167. package/esm2022/lib/message-actions.service.mjs +0 -187
  168. package/esm2022/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +0 -71
  169. package/esm2022/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +0 -333
  170. package/esm2022/lib/message-input/message-input-config.service.mjs +0 -50
  171. package/esm2022/lib/message-input/message-input.component.mjs +0 -507
  172. package/esm2022/lib/message-list/message-list.component.mjs +0 -715
  173. package/esm2022/lib/message-preview.mjs +0 -21
  174. package/esm2022/lib/message-reactions/message-reactions.component.mjs +0 -165
  175. package/esm2022/lib/message-reactions-selector/message-reactions-selector.component.mjs +0 -57
  176. package/esm2022/lib/message-text/message-text.component.mjs +0 -143
  177. package/esm2022/lib/message.service.mjs +0 -43
  178. package/esm2022/lib/notification/notification.component.mjs +0 -20
  179. package/esm2022/lib/notification-list/notification-list.component.mjs +0 -33
  180. package/esm2022/lib/paginated-list/paginated-list.component.mjs +0 -94
  181. package/esm2022/lib/read-by.mjs +0 -12
  182. package/esm2022/lib/stream-autocomplete-textarea.module.mjs +0 -33
  183. package/esm2022/lib/stream-textarea.module.mjs +0 -31
  184. package/esm2022/lib/thread/thread.component.mjs +0 -51
  185. package/esm2022/lib/types.mjs +0 -2
  186. package/esm2022/lib/user-list/user-list.component.mjs +0 -47
  187. package/esm2022/lib/virtualized-list.service.mjs +0 -273
  188. package/esm2022/lib/voice-recorder/mp3-transcoder.mjs +0 -61
  189. package/esm2022/lib/voice-recorder/transcoder.service.mjs +0 -121
  190. package/esm2022/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +0 -32
  191. package/esm2022/lib/voice-recorder/voice-recorder.component.mjs +0 -80
  192. package/esm2022/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +0 -112
  193. package/esm2022/lib/voice-recording/voice-recording.component.mjs +0 -91
  194. package/esm2022/public-api.mjs +0 -82
  195. package/fesm2022/stream-chat-angular.mjs.map +0 -1
  196. /package/{esm2022 → esm2020}/lib/format-duration.mjs +0 -0
  197. /package/{esm2022 → esm2020}/lib/injection-tokens.mjs +0 -0
  198. /package/{esm2022 → esm2020}/lib/is-image-attachment.mjs +0 -0
  199. /package/{esm2022 → esm2020}/lib/is-on-separate-date.mjs +0 -0
  200. /package/{esm2022 → esm2020}/lib/is-safari.mjs +0 -0
  201. /package/{esm2022 → esm2020}/lib/message-input/textarea.interface.mjs +0 -0
  202. /package/{esm2022 → esm2020}/stream-chat-angular.mjs +0 -0
@@ -0,0 +1,155 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { filter } from 'rxjs/operators';
3
+ import { getChannelDisplayText } from '../get-channel-display-text';
4
+ import { getMessageTranslation } from '../get-message-translation';
5
+ import { getReadBy } from '../read-by';
6
+ import { isOnSeparateDate } from '../is-on-separate-date';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../channel.service";
9
+ import * as i2 from "../chat-client.service";
10
+ import * as i3 from "../message.service";
11
+ import * as i4 from "../custom-templates.service";
12
+ import * as i5 from "../date-parser.service";
13
+ import * as i6 from "@angular/common";
14
+ import * as i7 from "../avatar-placeholder/avatar-placeholder.component";
15
+ import * as i8 from "../icon/icon-placeholder/icon-placeholder.component";
16
+ import * as i9 from "@ngx-translate/core";
17
+ /**
18
+ * The `ChannelPreview` component displays a channel preview in the channel list, it consists of the image, name and latest message of the channel.
19
+ */
20
+ export class ChannelPreviewComponent {
21
+ constructor(channelService, ngZone, chatClientService, messageService, customTemplatesService, dateParser) {
22
+ this.channelService = channelService;
23
+ this.ngZone = ngZone;
24
+ this.chatClientService = chatClientService;
25
+ this.customTemplatesService = customTemplatesService;
26
+ this.dateParser = dateParser;
27
+ this.isActive = false;
28
+ this.isUnreadMessageWasCalled = false;
29
+ this.isUnread = false;
30
+ this.latestMessageText = 'streamChat.Nothing yet...';
31
+ this.subscriptions = [];
32
+ this.canSendReadEvents = true;
33
+ this.displayAs = messageService.displayAs;
34
+ }
35
+ ngOnInit() {
36
+ this.subscriptions.push(this.chatClientService.user$.subscribe((user) => {
37
+ if (user?.id !== this.userId) {
38
+ this.userId = user?.id;
39
+ }
40
+ }));
41
+ this.subscriptions.push(this.channelService.activeChannel$.subscribe((activeChannel) => (this.isActive = activeChannel?.id === this.channel?.id)));
42
+ const messages = this.channel?.state?.latestMessages;
43
+ if (messages && messages.length > 0) {
44
+ this.setLatestMessage(messages[messages.length - 1]);
45
+ }
46
+ this.updateUnreadState();
47
+ const capabilities = this.channel?.data?.own_capabilities || [];
48
+ this.canSendReadEvents = capabilities.indexOf('read-events') !== -1;
49
+ this.subscriptions.push(this.channel.on('message.new', this.handleMessageEvent.bind(this)));
50
+ this.subscriptions.push(this.channel.on('message.updated', this.handleMessageEvent.bind(this)));
51
+ this.subscriptions.push(this.channel.on('message.deleted', this.handleMessageEvent.bind(this)));
52
+ this.subscriptions.push(this.channel.on('channel.truncated', this.handleMessageEvent.bind(this)));
53
+ this.subscriptions.push(this.channel.on('message.read', () => this.ngZone.run(() => {
54
+ this.isUnreadMessageWasCalled = false;
55
+ this.updateUnreadState();
56
+ })));
57
+ this.subscriptions.push(this.chatClientService.events$
58
+ .pipe(filter((e) => e.eventType === 'notification.mark_unread' &&
59
+ this.channel.id === e.event?.channel_id))
60
+ .subscribe(() => {
61
+ this.ngZone.run(() => {
62
+ this.isUnreadMessageWasCalled = true;
63
+ this.updateUnreadState();
64
+ });
65
+ }));
66
+ }
67
+ ngOnDestroy() {
68
+ this.subscriptions.forEach((s) => s.unsubscribe());
69
+ }
70
+ get avatarImage() {
71
+ return this.channel?.data?.image;
72
+ }
73
+ get avatarName() {
74
+ return this.channel?.data?.name;
75
+ }
76
+ get title() {
77
+ if (!this.channel) {
78
+ return '';
79
+ }
80
+ return getChannelDisplayText(this.channel, this.chatClientService.chatClient.user);
81
+ }
82
+ setAsActiveChannel() {
83
+ void this.channelService.setAsActiveChannel(this.channel);
84
+ }
85
+ handleMessageEvent(event) {
86
+ this.ngZone.run(() => {
87
+ if (this.channel?.state.latestMessages.length === 0) {
88
+ this.latestMessage = undefined;
89
+ this.latestMessageStatus = undefined;
90
+ this.latestMessageText = 'streamChat.Nothing yet...';
91
+ this.latestMessageTime = undefined;
92
+ return;
93
+ }
94
+ const latestMessage = this.channel?.state.latestMessages[this.channel?.state.latestMessages.length - 1];
95
+ if (!event.message || latestMessage?.id !== event.message.id) {
96
+ return;
97
+ }
98
+ this.setLatestMessage(latestMessage);
99
+ this.updateUnreadState();
100
+ });
101
+ }
102
+ setLatestMessage(message) {
103
+ this.latestMessage = message;
104
+ if (message?.deleted_at) {
105
+ this.latestMessageText = 'streamChat.Message deleted';
106
+ }
107
+ else if (message?.text) {
108
+ this.latestMessageText =
109
+ getMessageTranslation(message, this.channel, this.chatClientService.chatClient.user) || message.text;
110
+ }
111
+ else if (message?.attachments && message.attachments.length) {
112
+ this.latestMessageText = 'streamChat.🏙 Attachment...';
113
+ }
114
+ if (this.latestMessage && this.latestMessage.type === 'regular') {
115
+ this.latestMessageTime = isOnSeparateDate(new Date(), this.latestMessage.created_at)
116
+ ? this.dateParser.parseDate(this.latestMessage.created_at)
117
+ : this.dateParser.parseTime(this.latestMessage.created_at);
118
+ }
119
+ else {
120
+ this.latestMessageTime = undefined;
121
+ }
122
+ }
123
+ updateUnreadState() {
124
+ if (this.channel &&
125
+ this.latestMessage &&
126
+ this.latestMessage.user?.id === this.userId &&
127
+ this.latestMessage.status === 'received' &&
128
+ this.latestMessage.type === 'regular') {
129
+ this.latestMessageStatus =
130
+ getReadBy(this.latestMessage, this.channel).length > 0
131
+ ? 'read'
132
+ : 'delivered';
133
+ }
134
+ else {
135
+ this.latestMessageStatus = undefined;
136
+ }
137
+ if ((this.isActive && !this.isUnreadMessageWasCalled) ||
138
+ !this.canSendReadEvents) {
139
+ this.unreadCount = 0;
140
+ this.isUnread = false;
141
+ return;
142
+ }
143
+ this.unreadCount = this.channel.countUnread();
144
+ this.isUnread = !!this.unreadCount;
145
+ }
146
+ }
147
+ ChannelPreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ChannelPreviewComponent, deps: [{ token: i1.ChannelService }, { token: i0.NgZone }, { token: i2.ChatClientService }, { token: i3.MessageService }, { token: i4.CustomTemplatesService }, { token: i5.DateParserService }], target: i0.ɵɵFactoryTarget.Component });
148
+ ChannelPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: ChannelPreviewComponent, selector: "stream-channel-preview", inputs: { channel: "channel" }, ngImport: i0, template: "<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", dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i7.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "location", "channel", "user", "type", "initialsType", "showOnlineIndicator"] }, { kind: "component", type: i8.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }] });
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ChannelPreviewComponent, decorators: [{
150
+ type: Component,
151
+ args: [{ selector: 'stream-channel-preview', template: "<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" }]
152
+ }], ctorParameters: function () { return [{ type: i1.ChannelService }, { type: i0.NgZone }, { type: i2.ChatClientService }, { type: i3.MessageService }, { type: i4.CustomTemplatesService }, { type: i5.DateParserService }]; }, propDecorators: { channel: [{
153
+ type: Input
154
+ }] } });
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC1wcmV2aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9jaGFubmVsLXByZXZpZXcvY2hhbm5lbC1wcmV2aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9jaGFubmVsLXByZXZpZXcvY2hhbm5lbC1wcmV2aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUE2QixNQUFNLGVBQWUsQ0FBQztBQUU1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFHMUQ7O0dBRUc7QUFNSCxNQUFNLE9BQU8sdUJBQXVCO0lBa0JsQyxZQUNVLGNBQThCLEVBQzlCLE1BQWMsRUFDZCxpQkFBb0MsRUFDNUMsY0FBOEIsRUFDdkIsc0JBQThDLEVBQzdDLFVBQTZCO1FBTDdCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Qsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUVyQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzdDLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBbkJ2QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUNqQyxh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QjthQUFNO1lBQ0wsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztTQUN0QztRQUNELElBQ0UsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQ2pELENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUN2QjtZQUNBLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3JDLENBQUM7O29IQTNMVSx1QkFBdUI7d0dBQXZCLHVCQUF1Qiw4RkN0QnBDLG94R0E4RkE7MkZEeEVhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSx3QkFBd0I7NFBBUXpCLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE5nWm9uZSwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2hhbm5lbCwgRXZlbnQsIEZvcm1hdE1lc3NhZ2VSZXNwb25zZSB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IENoYW5uZWxTZXJ2aWNlIH0gZnJvbSAnLi4vY2hhbm5lbC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldENoYW5uZWxEaXNwbGF5VGV4dCB9IGZyb20gJy4uL2dldC1jaGFubmVsLWRpc3BsYXktdGV4dCc7XG5pbXBvcnQgeyBDaGF0Q2xpZW50U2VydmljZSB9IGZyb20gJy4uL2NoYXQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vZ2V0LW1lc3NhZ2UtdHJhbnNsYXRpb24nO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi9tZXNzYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRSZWFkQnkgfSBmcm9tICcuLi9yZWFkLWJ5JztcbmltcG9ydCB7IGlzT25TZXBhcmF0ZURhdGUgfSBmcm9tICcuLi9pcy1vbi1zZXBhcmF0ZS1kYXRlJztcbmltcG9ydCB7IERhdGVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0ZS1wYXJzZXIuc2VydmljZSc7XG5cbi8qKlxuICogVGhlIGBDaGFubmVsUHJldmlld2AgY29tcG9uZW50IGRpc3BsYXlzIGEgY2hhbm5lbCBwcmV2aWV3IGluIHRoZSBjaGFubmVsIGxpc3QsIGl0IGNvbnNpc3RzIG9mIHRoZSBpbWFnZSwgbmFtZSBhbmQgbGF0ZXN0IG1lc3NhZ2Ugb2YgdGhlIGNoYW5uZWwuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1jaGFubmVsLXByZXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhbm5lbC1wcmV2aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFByZXZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBUaGUgY2hhbm5lbCB0byBiZSBkaXNwbGF5ZWRcbiAgICovXG4gIEBJbnB1dCgpIGNoYW5uZWw6IENoYW5uZWwgfCB1bmRlZmluZWQ7XG4gIGlzQWN0aXZlID0gZmFsc2U7XG4gIGlzVW5yZWFkTWVzc2FnZVdhc0NhbGxlZCA9IGZhbHNlO1xuICBpc1VucmVhZCA9IGZhbHNlO1xuICB1bnJlYWRDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsYXRlc3RNZXNzYWdlVGV4dDogc3RyaW5nID0gJ3N0cmVhbUNoYXQuTm90aGluZyB5ZXQuLi4nO1xuICBsYXRlc3RNZXNzYWdlU3RhdHVzPzogJ2RlbGl2ZXJlZCcgfCAncmVhZCc7XG4gIGxhdGVzdE1lc3NhZ2VUaW1lPzogc3RyaW5nO1xuICBsYXRlc3RNZXNzYWdlPzogRm9ybWF0TWVzc2FnZVJlc3BvbnNlO1xuICBkaXNwbGF5QXM6ICd0ZXh0JyB8ICdodG1sJztcbiAgdXNlcklkPzogc3RyaW5nO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IChTdWJzY3JpcHRpb24gfCB7IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkIH0pW10gPSBbXTtcbiAgcHJpdmF0ZSBjYW5TZW5kUmVhZEV2ZW50cyA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGNoYXRDbGllbnRTZXJ2aWNlOiBDaGF0Q2xpZW50U2VydmljZSxcbiAgICBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHVibGljIGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlUGFyc2VyOiBEYXRlUGFyc2VyU2VydmljZVxuICApIHtcbiAgICB0aGlzLmRpc3BsYXlBcyA9IG1lc3NhZ2VTZXJ2aWNlLmRpc3BsYXlBcztcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS51c2VyJC5zdWJzY3JpYmUoKHVzZXIpID0+IHtcbiAgICAgICAgaWYgKHVzZXI/LmlkICE9PSB0aGlzLnVzZXJJZCkge1xuICAgICAgICAgIHRoaXMudXNlcklkID0gdXNlcj8uaWQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbCQuc3Vic2NyaWJlKFxuICAgICAgICAoYWN0aXZlQ2hhbm5lbCkgPT5cbiAgICAgICAgICAodGhpcy5pc0FjdGl2ZSA9IGFjdGl2ZUNoYW5uZWw/LmlkID09PSB0aGlzLmNoYW5uZWw/LmlkKVxuICAgICAgKVxuICAgICk7XG4gICAgY29uc3QgbWVzc2FnZXMgPSB0aGlzLmNoYW5uZWw/LnN0YXRlPy5sYXRlc3RNZXNzYWdlcztcbiAgICBpZiAobWVzc2FnZXMgJiYgbWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZXRMYXRlc3RNZXNzYWdlKG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVVbnJlYWRTdGF0ZSgpO1xuICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9XG4gICAgICAodGhpcy5jaGFubmVsPy5kYXRhPy5vd25fY2FwYWJpbGl0aWVzIGFzIHN0cmluZ1tdKSB8fCBbXTtcbiAgICB0aGlzLmNhblNlbmRSZWFkRXZlbnRzID0gY2FwYWJpbGl0aWVzLmluZGV4T2YoJ3JlYWQtZXZlbnRzJykgIT09IC0xO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsIS5vbignbWVzc2FnZS5uZXcnLCB0aGlzLmhhbmRsZU1lc3NhZ2VFdmVudC5iaW5kKHRoaXMpKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWwhLm9uKCdtZXNzYWdlLnVwZGF0ZWQnLCB0aGlzLmhhbmRsZU1lc3NhZ2VFdmVudC5iaW5kKHRoaXMpKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWwhLm9uKCdtZXNzYWdlLmRlbGV0ZWQnLCB0aGlzLmhhbmRsZU1lc3NhZ2VFdmVudC5iaW5kKHRoaXMpKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWwhLm9uKCdjaGFubmVsLnRydW5jYXRlZCcsIHRoaXMuaGFuZGxlTWVzc2FnZUV2ZW50LmJpbmQodGhpcykpXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbCEub24oJ21lc3NhZ2UucmVhZCcsICgpID0+XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1VucmVhZE1lc3NhZ2VXYXNDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVVucmVhZFN0YXRlKCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuZXZlbnRzJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdub3RpZmljYXRpb24ubWFya191bnJlYWQnICYmXG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbCEuaWQgPT09IGUuZXZlbnQ/LmNoYW5uZWxfaWRcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNVbnJlYWRNZXNzYWdlV2FzQ2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVW5yZWFkU3RhdGUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBnZXQgYXZhdGFySW1hZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbD8uZGF0YT8uaW1hZ2U7XG4gIH1cblxuICBnZXQgYXZhdGFyTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsPy5kYXRhPy5uYW1lO1xuICB9XG5cbiAgZ2V0IHRpdGxlKCkge1xuICAgIGlmICghdGhpcy5jaGFubmVsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBnZXRDaGFubmVsRGlzcGxheVRleHQoXG4gICAgICB0aGlzLmNoYW5uZWwsXG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlciFcbiAgICApO1xuICB9XG5cbiAgc2V0QXNBY3RpdmVDaGFubmVsKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5zZXRBc0FjdGl2ZUNoYW5uZWwodGhpcy5jaGFubmVsISk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1lc3NhZ2VFdmVudChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2hhbm5lbD8uc3RhdGUubGF0ZXN0TWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlU3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VUZXh0ID0gJ3N0cmVhbUNoYXQuTm90aGluZyB5ZXQuLi4nO1xuICAgICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VUaW1lID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBsYXRlc3RNZXNzYWdlID1cbiAgICAgICAgdGhpcy5jaGFubmVsPy5zdGF0ZS5sYXRlc3RNZXNzYWdlc1tcbiAgICAgICAgICB0aGlzLmNoYW5uZWw/LnN0YXRlLmxhdGVzdE1lc3NhZ2VzLmxlbmd0aCAtIDFcbiAgICAgICAgXTtcbiAgICAgIGlmICghZXZlbnQubWVzc2FnZSB8fCBsYXRlc3RNZXNzYWdlPy5pZCAhPT0gZXZlbnQubWVzc2FnZS5pZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNldExhdGVzdE1lc3NhZ2UobGF0ZXN0TWVzc2FnZSk7XG4gICAgICB0aGlzLnVwZGF0ZVVucmVhZFN0YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldExhdGVzdE1lc3NhZ2UobWVzc2FnZT86IEZvcm1hdE1lc3NhZ2VSZXNwb25zZSkge1xuICAgIHRoaXMubGF0ZXN0TWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgaWYgKG1lc3NhZ2U/LmRlbGV0ZWRfYXQpIHtcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZVRleHQgPSAnc3RyZWFtQ2hhdC5NZXNzYWdlIGRlbGV0ZWQnO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZT8udGV4dCkge1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlVGV4dCA9XG4gICAgICAgIGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIHRoaXMuY2hhbm5lbCxcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlclxuICAgICAgICApIHx8IG1lc3NhZ2UudGV4dDtcbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2U/LmF0dGFjaG1lbnRzICYmIG1lc3NhZ2UuYXR0YWNobWVudHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VUZXh0ID0gJ3N0cmVhbUNoYXQu8J+PmSBBdHRhY2htZW50Li4uJztcbiAgICB9XG4gICAgaWYgKHRoaXMubGF0ZXN0TWVzc2FnZSAmJiB0aGlzLmxhdGVzdE1lc3NhZ2UudHlwZSA9PT0gJ3JlZ3VsYXInKSB7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VUaW1lID0gaXNPblNlcGFyYXRlRGF0ZShcbiAgICAgICAgbmV3IERhdGUoKSxcbiAgICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlLmNyZWF0ZWRfYXRcbiAgICAgIClcbiAgICAgICAgPyB0aGlzLmRhdGVQYXJzZXIucGFyc2VEYXRlKHRoaXMubGF0ZXN0TWVzc2FnZS5jcmVhdGVkX2F0KVxuICAgICAgICA6IHRoaXMuZGF0ZVBhcnNlci5wYXJzZVRpbWUodGhpcy5sYXRlc3RNZXNzYWdlLmNyZWF0ZWRfYXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VUaW1lID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVW5yZWFkU3RhdGUoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGFubmVsICYmXG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UgJiZcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZS51c2VyPy5pZCA9PT0gdGhpcy51c2VySWQgJiZcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZS5zdGF0dXMgPT09ICdyZWNlaXZlZCcgJiZcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZS50eXBlID09PSAncmVndWxhcidcbiAgICApIHtcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZVN0YXR1cyA9XG4gICAgICAgIGdldFJlYWRCeSh0aGlzLmxhdGVzdE1lc3NhZ2UsIHRoaXMuY2hhbm5lbCkubGVuZ3RoID4gMFxuICAgICAgICAgID8gJ3JlYWQnXG4gICAgICAgICAgOiAnZGVsaXZlcmVkJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlU3RhdHVzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAodGhpcy5pc0FjdGl2ZSAmJiAhdGhpcy5pc1VucmVhZE1lc3NhZ2VXYXNDYWxsZWQpIHx8XG4gICAgICAhdGhpcy5jYW5TZW5kUmVhZEV2ZW50c1xuICAgICkge1xuICAgICAgdGhpcy51bnJlYWRDb3VudCA9IDA7XG4gICAgICB0aGlzLmlzVW5yZWFkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudW5yZWFkQ291bnQgPSB0aGlzLmNoYW5uZWwhLmNvdW50VW5yZWFkKCk7XG4gICAgdGhpcy5pc1VucmVhZCA9ICEhdGhpcy51bnJlYWRDb3VudDtcbiAgfVxufVxuIiwiPGJ1dHRvblxuICBjbGFzcz1cInN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctbWVzc2VuZ2VyIHN0ci1jaGF0X19jaGFubmVsLXByZXZpZXdcIlxuICBkYXRhLXRlc3RpZD1cImNoYW5uZWwtcHJldmlldy1jb250YWluZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1tZXNzZW5nZXItLWFjdGl2ZV09XCJpc0FjdGl2ZVwiXG4gIFtjbGFzcy5zdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LS1hY3RpdmVdPVwiaXNBY3RpdmVcIlxuICBbY2xhc3Muc3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1tZXNzZW5nZXItLXVucmVhZF09XCJpc1VucmVhZFwiXG4gIChjbGljayk9XCJzZXRBc0FjdGl2ZUNoYW5uZWwoKVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LW1lc3Nlbmdlci0tbGVmdFwiPlxuICAgIDxzdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyXG4gICAgICB0eXBlPVwiY2hhbm5lbFwiXG4gICAgICBsb2NhdGlvbj1cImNoYW5uZWwtcHJldmlld1wiXG4gICAgICBuYW1lPVwie3sgYXZhdGFyTmFtZSB9fVwiXG4gICAgICBpbWFnZVVybD1cInt7IGF2YXRhckltYWdlIH19XCJcbiAgICAgIFtjaGFubmVsXT1cImNoYW5uZWxcIlxuICAgID48L3N0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXI+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LW1lc3Nlbmdlci0tcmlnaHQgc3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1lbmRcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuY2hhbm5lbFByZXZpZXdJbmZvVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgZGVmYXVsdENoYW5uZWxJbmZvO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgY2hhbm5lbERpc3BsYXlUaXRsZTogdGl0bGUsXG4gICAgICAgICAgY2hhbm5lbDogY2hhbm5lbCxcbiAgICAgICAgICB1bnJlYWRDb3VudDogdW5yZWFkQ291bnQsXG4gICAgICAgICAgbGF0ZXN0TWVzc2FnZVRleHQ6IGxhdGVzdE1lc3NhZ2VUZXh0LFxuICAgICAgICAgIGxhdGVzdE1lc3NhZ2VTdGF0dXM6IGxhdGVzdE1lc3NhZ2VTdGF0dXMsXG4gICAgICAgICAgbGF0ZXN0TWVzc2FnZVRpbWU6IGxhdGVzdE1lc3NhZ2VUaW1lLFxuICAgICAgICAgIGxhdGVzdE1lc3NhZ2U6IGxhdGVzdE1lc3NhZ2VcbiAgICAgICAgfVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICAjZGVmYXVsdENoYW5uZWxJbmZvXG4gICAgICBsZXQtY2hhbm5lbERpc3BsYXlUaXRsZT1cImNoYW5uZWxEaXNwbGF5VGl0bGVcIlxuICAgICAgbGV0LXVucmVhZENvdW50PVwidW5yZWFkQ291bnRcIlxuICAgICAgbGV0LWxhdGVzdE1lc3NhZ2VUZXh0PVwibGF0ZXN0TWVzc2FnZVRleHRcIlxuICAgICAgbGV0LWxhdGVzdE1lc3NhZ2VTdGF0dXM9XCJsYXRlc3RNZXNzYWdlU3RhdHVzXCJcbiAgICAgIGxldC1sYXRlc3RNZXNzYWdlVGltZT1cImxhdGVzdE1lc3NhZ2VUaW1lXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1lbmQtZmlyc3Qtcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LW1lc3Nlbmdlci0tbmFtZVwiPlxuICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiY2hhbm5lbC1wcmV2aWV3LXRpdGxlXCI+e3tcbiAgICAgICAgICAgIGNoYW5uZWxEaXNwbGF5VGl0bGVcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInVucmVhZENvdW50XCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cInVucmVhZC1iYWRnZVwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LXVucmVhZC1iYWRnZVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB1bnJlYWRDb3VudCB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctZW5kLXNlY29uZC1yb3dcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibGF0ZXN0LW1lc3NhZ2VcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1tZXNzZW5nZXItLWxhc3QtbWVzc2FnZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheUFzID09PSAndGV4dCc7IGVsc2UgYXNIVE1MXCI+XG4gICAgICAgICAgICB7eyBsYXRlc3RNZXNzYWdlVGV4dCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYXNIVE1MPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJodG1sLWNvbnRlbnRcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImxhdGVzdE1lc3NhZ2VUZXh0IHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cImxhdGVzdE1lc3NhZ2VTdGF0dXNcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibGF0ZXN0LW1lc3NhZ2Utc3RhdHVzXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctbWVzc2VuZ2VyLS1zdGF0dXMgc3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1tZXNzZW5nZXItLXN0YXR1cy17e1xuICAgICAgICAgICAgbGF0ZXN0TWVzc2FnZVN0YXR1c1xuICAgICAgICAgIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgW2ljb25dPVwibGF0ZXN0TWVzc2FnZVN0YXR1cyA9PT0gJ2RlbGl2ZXJlZCcgPyAnZGVsaXZlcmVkJyA6ICdyZWFkJ1wiXG4gICAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJsYXRlc3RNZXNzYWdlVGltZVwiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJsYXRlc3QtbWVzc2FnZS10aW1lXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctbWVzc2VuZ2VyLS10aW1lXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGxhdGVzdE1lc3NhZ2VUaW1lIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L2J1dHRvbj5cbiJdfQ==
@@ -0,0 +1,77 @@
1
+ /**
2
+ * This class allows you to make paginated channel query requests.
3
+ */
4
+ export class ChannelQuery {
5
+ constructor(chatService, channelService, filters, sort = { last_message_at: -1 }, options = {
6
+ limit: 25,
7
+ state: true,
8
+ presence: true,
9
+ watch: true,
10
+ }) {
11
+ this.chatService = chatService;
12
+ this.channelService = channelService;
13
+ this.filters = filters;
14
+ this.sort = sort;
15
+ this.options = options;
16
+ }
17
+ async query(queryType) {
18
+ if (queryType === 'first-page' || queryType === 'recover-state') {
19
+ this.nextPageConfiguration = undefined;
20
+ }
21
+ const prevChannels = queryType === 'recover-state' ? [] : this.channelService.channels;
22
+ let filters;
23
+ let options;
24
+ if (this.nextPageConfiguration) {
25
+ if (this.nextPageConfiguration.type === 'filter') {
26
+ filters = {
27
+ ...this.filters,
28
+ ...this.nextPageConfiguration.paginationFilter,
29
+ };
30
+ options = this.options;
31
+ }
32
+ else {
33
+ options = {
34
+ ...this.options,
35
+ offset: this.nextPageConfiguration.offset,
36
+ };
37
+ filters = this.filters;
38
+ }
39
+ }
40
+ else {
41
+ filters = this.filters;
42
+ options = this.options;
43
+ }
44
+ const channels = await this.chatService.chatClient.queryChannels(filters, this.sort || {}, options);
45
+ this.setNextPageConfiguration(channels);
46
+ const currentActiveChannel = this.channelService.activeChannel;
47
+ if (queryType === 'recover-state' &&
48
+ currentActiveChannel &&
49
+ !channels.find((c) => c.cid === currentActiveChannel?.cid)) {
50
+ try {
51
+ await currentActiveChannel.watch();
52
+ channels.unshift(currentActiveChannel);
53
+ }
54
+ catch (error) {
55
+ this.chatService.chatClient.logger('warn', 'Unable to refetch active channel after state recover', error);
56
+ }
57
+ }
58
+ return {
59
+ channels: [...prevChannels, ...channels],
60
+ hasMorePage: channels.length >= this.options.limit,
61
+ };
62
+ }
63
+ setNextPageConfiguration(channelQueryResult) {
64
+ if (this.customPaginator) {
65
+ this.nextPageConfiguration = this.customPaginator(channelQueryResult);
66
+ }
67
+ else {
68
+ this.nextPageConfiguration = {
69
+ type: 'offset',
70
+ offset: (this.nextPageConfiguration?.type === 'offset'
71
+ ? this.nextPageConfiguration.offset
72
+ : 0) + channelQueryResult.length,
73
+ };
74
+ }
75
+ }
76
+ }
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC1xdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9jaGFubmVsLXF1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWNBOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFXdkIsWUFDVSxXQUE4QixFQUM5QixjQUE4QixFQUM5QixPQUF1QixFQUN2QixPQUFvQixFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUMzQyxVQUEwQjtRQUNoQyxLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxJQUFJO1FBQ1gsUUFBUSxFQUFFLElBQUk7UUFDZCxLQUFLLEVBQUUsSUFBSTtLQUNaO1FBVE8sZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBQzlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixTQUFJLEdBQUosSUFBSSxDQUF1QztRQUMzQyxZQUFPLEdBQVAsT0FBTyxDQUtkO0lBQ0EsQ0FBQztJQUVKLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBMkI7UUFDckMsSUFBSSxTQUFTLEtBQUssWUFBWSxJQUFJLFNBQVMsS0FBSyxlQUFlLEVBQUU7WUFDL0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztTQUN4QztRQUNELE1BQU0sWUFBWSxHQUNoQixTQUFTLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO1FBQ3BFLElBQUksT0FBdUIsQ0FBQztRQUM1QixJQUFJLE9BQXVCLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDOUIsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDaEQsT0FBTyxHQUFHO29CQUNSLEdBQUcsSUFBSSxDQUFDLE9BQU87b0JBQ2YsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCO2lCQUMvQyxDQUFDO2dCQUNGLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLE9BQU8sR0FBRztvQkFDUixHQUFHLElBQUksQ0FBQyxPQUFPO29CQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTTtpQkFDMUMsQ0FBQztnQkFDRixPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUN4QjtTQUNGO2FBQU07WUFDTCxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN2QixPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUN4QjtRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUM5RCxPQUFPLEVBQ1AsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQ2YsT0FBTyxDQUNSLENBQUM7UUFDRixJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFeEMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQztRQUMvRCxJQUNFLFNBQVMsS0FBSyxlQUFlO1lBQzdCLG9CQUFvQjtZQUNwQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssb0JBQW9CLEVBQUUsR0FBRyxDQUFDLEVBQzFEO1lBQ0EsSUFBSTtnQkFDRixNQUFNLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQyxRQUFRLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDeEM7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQ2hDLE1BQU0sRUFDTixzREFBc0QsRUFDdEQsS0FBZ0MsQ0FDakMsQ0FBQzthQUNIO1NBQ0Y7UUFFRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLENBQUMsR0FBRyxZQUFZLEVBQUUsR0FBRyxRQUFRLENBQUM7WUFDeEMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFNO1NBQ3BELENBQUM7SUFDSixDQUFDO0lBRUQsd0JBQXdCLENBQUMsa0JBQTZCO1FBQ3BELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3ZFO2FBQU07WUFDTCxJQUFJLENBQUMscUJBQXFCLEdBQUc7Z0JBQzNCLElBQUksRUFBRSxRQUFRO2dCQUNkLE1BQU0sRUFDSixDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLEtBQUssUUFBUTtvQkFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNO29CQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTTthQUNyQyxDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFubmVsLFxuICBDaGFubmVsRmlsdGVycyxcbiAgQ2hhbm5lbE9wdGlvbnMsXG4gIENoYW5uZWxTb3J0LFxufSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBDaGFubmVsU2VydmljZSB9IGZyb20gJy4vY2hhbm5lbC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENoYW5uZWxRdWVyeVJlc3VsdCxcbiAgQ2hhbm5lbFF1ZXJ5VHlwZSxcbiAgTmV4dFBhZ2VDb25maWd1cmF0aW9uLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IENoYXRDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGFsbG93cyB5b3UgdG8gbWFrZSBwYWdpbmF0ZWQgY2hhbm5lbCBxdWVyeSByZXF1ZXN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYW5uZWxRdWVyeSB7XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBTREsgdXNlcyBhbiBvZmZzZXQgYmFzZWQgcGFnaW5hdGlvbiwgeW91IGNhbiBjaGFuZ2UvZXh0ZW5kIHRoaXMgYnkgcHJvdmlkaW5nIHlvdXIgb3duIGN1c3RvbSBwYWdpbmF0b3IgbWV0aG9kLlxuICAgKlxuICAgKiBUaGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgbGF0ZXN0IGNoYW5uZWwgcXVlcnkuXG4gICAqXG4gICAqIFlvdSBjYW4gcmV0dXJuIGVpdGhlciBhbiBvZmZzZXQsIG9yIGEgZmlsdGVyIHVzaW5nIHRoZSBbYCRsdGVgL2AkZ3RlYCBvcGVyYXRvcl0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X3N5bnRheF9vcGVyYXRvcnMvKS4gSWYgeW91IHJldHVybiBhIGZpbHRlciwgaXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGUgZmlsdGVyIHByb3ZpZGVkIGZvciB0aGUgYGluaXRgIG1ldGhvZC5cbiAgICovXG4gIGN1c3RvbVBhZ2luYXRvcj86IChjaGFubmVsUXVlcnlSZXN1bHQ6IENoYW5uZWxbXSkgPT4gTmV4dFBhZ2VDb25maWd1cmF0aW9uO1xuICBwcml2YXRlIG5leHRQYWdlQ29uZmlndXJhdGlvbj86IE5leHRQYWdlQ29uZmlndXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYXRTZXJ2aWNlOiBDaGF0Q2xpZW50U2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIGZpbHRlcnM6IENoYW5uZWxGaWx0ZXJzLFxuICAgIHByaXZhdGUgc29ydDogQ2hhbm5lbFNvcnQgPSB7IGxhc3RfbWVzc2FnZV9hdDogLTEgfSxcbiAgICBwcml2YXRlIG9wdGlvbnM6IENoYW5uZWxPcHRpb25zID0ge1xuICAgICAgbGltaXQ6IDI1LFxuICAgICAgc3RhdGU6IHRydWUsXG4gICAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICAgIHdhdGNoOiB0cnVlLFxuICAgIH1cbiAgKSB7fVxuXG4gIGFzeW5jIHF1ZXJ5KHF1ZXJ5VHlwZTogQ2hhbm5lbFF1ZXJ5VHlwZSk6IFByb21pc2U8Q2hhbm5lbFF1ZXJ5UmVzdWx0PiB7XG4gICAgaWYgKHF1ZXJ5VHlwZSA9PT0gJ2ZpcnN0LXBhZ2UnIHx8IHF1ZXJ5VHlwZSA9PT0gJ3JlY292ZXItc3RhdGUnKSB7XG4gICAgICB0aGlzLm5leHRQYWdlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcHJldkNoYW5uZWxzID1cbiAgICAgIHF1ZXJ5VHlwZSA9PT0gJ3JlY292ZXItc3RhdGUnID8gW10gOiB0aGlzLmNoYW5uZWxTZXJ2aWNlLmNoYW5uZWxzO1xuICAgIGxldCBmaWx0ZXJzOiBDaGFubmVsRmlsdGVycztcbiAgICBsZXQgb3B0aW9uczogQ2hhbm5lbE9wdGlvbnM7XG4gICAgaWYgKHRoaXMubmV4dFBhZ2VDb25maWd1cmF0aW9uKSB7XG4gICAgICBpZiAodGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24udHlwZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgZmlsdGVycyA9IHtcbiAgICAgICAgICAuLi50aGlzLmZpbHRlcnMsXG4gICAgICAgICAgLi4udGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24ucGFnaW5hdGlvbkZpbHRlcixcbiAgICAgICAgfTtcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgICAgIG9mZnNldDogdGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24ub2Zmc2V0LFxuICAgICAgICB9O1xuICAgICAgICBmaWx0ZXJzID0gdGhpcy5maWx0ZXJzO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmaWx0ZXJzID0gdGhpcy5maWx0ZXJzO1xuICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICB9XG4gICAgY29uc3QgY2hhbm5lbHMgPSBhd2FpdCB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRDbGllbnQucXVlcnlDaGFubmVscyhcbiAgICAgIGZpbHRlcnMsXG4gICAgICB0aGlzLnNvcnQgfHwge30sXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgICB0aGlzLnNldE5leHRQYWdlQ29uZmlndXJhdGlvbihjaGFubmVscyk7XG5cbiAgICBjb25zdCBjdXJyZW50QWN0aXZlQ2hhbm5lbCA9IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbDtcbiAgICBpZiAoXG4gICAgICBxdWVyeVR5cGUgPT09ICdyZWNvdmVyLXN0YXRlJyAmJlxuICAgICAgY3VycmVudEFjdGl2ZUNoYW5uZWwgJiZcbiAgICAgICFjaGFubmVscy5maW5kKChjKSA9PiBjLmNpZCA9PT0gY3VycmVudEFjdGl2ZUNoYW5uZWw/LmNpZClcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGN1cnJlbnRBY3RpdmVDaGFubmVsLndhdGNoKCk7XG4gICAgICAgIGNoYW5uZWxzLnVuc2hpZnQoY3VycmVudEFjdGl2ZUNoYW5uZWwpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5jaGF0Q2xpZW50LmxvZ2dlcihcbiAgICAgICAgICAnd2FybicsXG4gICAgICAgICAgJ1VuYWJsZSB0byByZWZldGNoIGFjdGl2ZSBjaGFubmVsIGFmdGVyIHN0YXRlIHJlY292ZXInLFxuICAgICAgICAgIGVycm9yIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5uZWxzOiBbLi4ucHJldkNoYW5uZWxzLCAuLi5jaGFubmVsc10sXG4gICAgICBoYXNNb3JlUGFnZTogY2hhbm5lbHMubGVuZ3RoID49IHRoaXMub3B0aW9ucy5saW1pdCEsXG4gICAgfTtcbiAgfVxuXG4gIHNldE5leHRQYWdlQ29uZmlndXJhdGlvbihjaGFubmVsUXVlcnlSZXN1bHQ6IENoYW5uZWxbXSkge1xuICAgIGlmICh0aGlzLmN1c3RvbVBhZ2luYXRvcikge1xuICAgICAgdGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmN1c3RvbVBhZ2luYXRvcihjaGFubmVsUXVlcnlSZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5leHRQYWdlQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgdHlwZTogJ29mZnNldCcsXG4gICAgICAgIG9mZnNldDpcbiAgICAgICAgICAodGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24/LnR5cGUgPT09ICdvZmZzZXQnXG4gICAgICAgICAgICA/IHRoaXMubmV4dFBhZ2VDb25maWd1cmF0aW9uLm9mZnNldFxuICAgICAgICAgICAgOiAwKSArIGNoYW5uZWxRdWVyeVJlc3VsdC5sZW5ndGgsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuIl19