stream-chat-angular 4.66.0 → 5.0.0-v5.1

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 (157) hide show
  1. package/assets/version.d.ts +1 -1
  2. package/{esm2015/assets/version.js → esm2020/assets/version.mjs} +2 -2
  3. package/esm2020/lib/attachment-configuration.service.mjs +185 -0
  4. package/esm2020/lib/attachment-list/attachment-list.component.mjs +205 -0
  5. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +45 -0
  6. package/esm2020/lib/attachment.service.mjs +262 -0
  7. package/esm2020/lib/avatar/avatar.component.mjs +163 -0
  8. package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +74 -0
  9. package/esm2020/lib/channel/channel.component.mjs +46 -0
  10. package/esm2020/lib/channel-header/channel-header.component.mjs +79 -0
  11. package/esm2020/lib/channel-list/channel-list-toggle.service.mjs +72 -0
  12. package/esm2020/lib/channel-list/channel-list.component.mjs +60 -0
  13. package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
  14. package/esm2020/lib/channel.service.mjs +1460 -0
  15. package/esm2020/lib/chat-client.service.mjs +206 -0
  16. package/{esm2015/lib/custom-templates.service.js → esm2020/lib/custom-templates.service.mjs} +3 -3
  17. package/{esm2015/lib/date-parser.service.js → esm2020/lib/date-parser.service.mjs} +3 -3
  18. package/esm2020/lib/edit-message-form/edit-message-form.component.mjs +83 -0
  19. package/esm2020/lib/get-channel-display-text.mjs +14 -0
  20. package/esm2020/lib/get-message-translation.mjs +12 -0
  21. package/esm2020/lib/icon/icon.component.mjs +21 -0
  22. package/esm2020/lib/icon-placeholder/icon-placeholder.component.mjs +31 -0
  23. package/esm2020/lib/loading-indicator/loading-indicator.component.mjs +31 -0
  24. package/esm2020/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +38 -0
  25. package/esm2020/lib/message/message.component.mjs +422 -0
  26. package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +130 -0
  27. package/esm2020/lib/message-actions.service.mjs +119 -0
  28. package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
  29. package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +262 -0
  30. package/{esm2015/lib/message-input/emoji-input.service.js → esm2020/lib/message-input/emoji-input.service.mjs} +3 -3
  31. package/{esm2015/lib/message-input/message-input-config.service.js → esm2020/lib/message-input/message-input-config.service.mjs} +3 -3
  32. package/esm2020/lib/message-input/message-input.component.mjs +443 -0
  33. package/{esm2015/lib/message-input/textarea/textarea.component.js → esm2020/lib/message-input/textarea/textarea.component.mjs} +5 -9
  34. package/esm2020/lib/message-input/textarea.directive.mjs +89 -0
  35. package/esm2020/lib/message-list/group-styles.mjs +52 -0
  36. package/{esm2015/lib/message-list/image-load.service.js → esm2020/lib/message-list/image-load.service.mjs} +3 -3
  37. package/esm2020/lib/message-list/message-list.component.mjs +699 -0
  38. package/esm2020/lib/message-preview.mjs +21 -0
  39. package/esm2020/lib/message-reactions/message-reactions.component.mjs +255 -0
  40. package/{esm2015/lib/message-reactions.service.js → esm2020/lib/message-reactions.service.mjs} +3 -3
  41. package/{esm2015/lib/message.service.js → esm2020/lib/message.service.mjs} +4 -4
  42. package/esm2020/lib/modal/modal.component.mjs +69 -0
  43. package/esm2020/lib/notification/notification.component.mjs +20 -0
  44. package/esm2020/lib/notification-list/notification-list.component.mjs +37 -0
  45. package/esm2020/lib/notification.service.mjs +79 -0
  46. package/esm2020/lib/read-by.mjs +12 -0
  47. package/{esm2015/lib/stream-autocomplete-textarea.module.js → esm2020/lib/stream-autocomplete-textarea.module.mjs} +6 -6
  48. package/{esm2015/lib/stream-avatar.module.js → esm2020/lib/stream-avatar.module.mjs} +5 -5
  49. package/{esm2015/lib/stream-chat.module.js → esm2020/lib/stream-chat.module.mjs} +8 -10
  50. package/{esm2015/lib/stream-i18n.service.js → esm2020/lib/stream-i18n.service.mjs} +5 -5
  51. package/{esm2015/lib/stream-textarea.module.js → esm2020/lib/stream-textarea.module.mjs} +6 -6
  52. package/esm2020/lib/theme.service.mjs +123 -0
  53. package/esm2020/lib/thread/thread.component.mjs +51 -0
  54. package/{esm2015/lib/transliteration.service.js → esm2020/lib/transliteration.service.mjs} +3 -3
  55. package/esm2020/lib/types.mjs +2 -0
  56. package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +183 -0
  57. package/esm2020/lib/voice-recording/voice-recording.component.mjs +102 -0
  58. package/fesm2015/{stream-chat-angular.js → stream-chat-angular.mjs} +345 -433
  59. package/fesm2015/stream-chat-angular.mjs.map +1 -0
  60. package/fesm2020/stream-chat-angular.mjs +7128 -0
  61. package/fesm2020/stream-chat-angular.mjs.map +1 -0
  62. package/lib/attachment-list/attachment-list.component.d.ts +3 -3
  63. package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
  64. package/lib/attachment.service.d.ts +0 -1
  65. package/lib/avatar/avatar.component.d.ts +1 -1
  66. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
  67. package/lib/channel/channel.component.d.ts +1 -1
  68. package/lib/channel-header/channel-header.component.d.ts +1 -1
  69. package/lib/channel-list/channel-list-toggle.service.d.ts +0 -1
  70. package/lib/channel-list/channel-list.component.d.ts +1 -1
  71. package/lib/channel-preview/channel-preview.component.d.ts +1 -1
  72. package/lib/channel.service.d.ts +7 -7
  73. package/lib/chat-client.service.d.ts +1 -1
  74. package/lib/edit-message-form/edit-message-form.component.d.ts +1 -1
  75. package/lib/get-message-translation.d.ts +1 -1
  76. package/lib/icon/icon.component.d.ts +1 -1
  77. package/lib/icon-placeholder/icon-placeholder.component.d.ts +1 -1
  78. package/lib/loading-indicator/loading-indicator.component.d.ts +1 -1
  79. package/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
  80. package/lib/message/message.component.d.ts +1 -2
  81. package/lib/message-actions-box/message-actions-box.component.d.ts +2 -4
  82. package/lib/message-actions.service.d.ts +0 -1
  83. package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
  84. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -1
  85. package/lib/message-input/message-input.component.d.ts +2 -2
  86. package/lib/message-input/textarea/textarea.component.d.ts +1 -1
  87. package/lib/message-input/textarea.directive.d.ts +1 -1
  88. package/lib/message-list/group-styles.d.ts +1 -1
  89. package/lib/message-list/message-list.component.d.ts +4 -5
  90. package/lib/message-reactions/message-reactions.component.d.ts +1 -1
  91. package/lib/message.service.d.ts +0 -1
  92. package/lib/modal/modal.component.d.ts +1 -1
  93. package/lib/notification/notification.component.d.ts +1 -1
  94. package/lib/notification-list/notification-list.component.d.ts +2 -2
  95. package/lib/notification.service.d.ts +2 -5
  96. package/lib/theme.service.d.ts +1 -2
  97. package/lib/thread/thread.component.d.ts +1 -1
  98. package/lib/types.d.ts +18 -18
  99. package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +2 -2
  100. package/lib/voice-recording/voice-recording.component.d.ts +1 -1
  101. package/package.json +28 -15
  102. package/src/assets/version.ts +1 -1
  103. package/bundles/stream-chat-angular.umd.js +0 -8425
  104. package/bundles/stream-chat-angular.umd.js.map +0 -1
  105. package/esm2015/lib/attachment-configuration.service.js +0 -166
  106. package/esm2015/lib/attachment-list/attachment-list.component.js +0 -209
  107. package/esm2015/lib/attachment-preview-list/attachment-preview-list.component.js +0 -49
  108. package/esm2015/lib/attachment.service.js +0 -276
  109. package/esm2015/lib/avatar/avatar.component.js +0 -172
  110. package/esm2015/lib/avatar-placeholder/avatar-placeholder.component.js +0 -78
  111. package/esm2015/lib/channel/channel.component.js +0 -50
  112. package/esm2015/lib/channel-header/channel-header.component.js +0 -86
  113. package/esm2015/lib/channel-list/channel-list-toggle.service.js +0 -73
  114. package/esm2015/lib/channel-list/channel-list.component.js +0 -67
  115. package/esm2015/lib/channel-preview/channel-preview.component.js +0 -167
  116. package/esm2015/lib/channel.service.js +0 -1487
  117. package/esm2015/lib/chat-client.service.js +0 -211
  118. package/esm2015/lib/edit-message-form/edit-message-form.component.js +0 -87
  119. package/esm2015/lib/get-channel-display-text.js +0 -15
  120. package/esm2015/lib/get-message-translation.js +0 -13
  121. package/esm2015/lib/icon/icon.component.js +0 -25
  122. package/esm2015/lib/icon-placeholder/icon-placeholder.component.js +0 -35
  123. package/esm2015/lib/loading-indicator/loading-indicator.component.js +0 -35
  124. package/esm2015/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.js +0 -42
  125. package/esm2015/lib/message/message.component.js +0 -436
  126. package/esm2015/lib/message-actions-box/message-actions-box.component.js +0 -137
  127. package/esm2015/lib/message-actions.service.js +0 -114
  128. package/esm2015/lib/message-bounce-prompt/message-bounce-prompt.component.js +0 -80
  129. package/esm2015/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.js +0 -262
  130. package/esm2015/lib/message-input/message-input.component.js +0 -455
  131. package/esm2015/lib/message-input/textarea.directive.js +0 -90
  132. package/esm2015/lib/message-list/group-styles.js +0 -53
  133. package/esm2015/lib/message-list/message-list.component.js +0 -726
  134. package/esm2015/lib/message-preview.js +0 -7
  135. package/esm2015/lib/message-reactions/message-reactions.component.js +0 -266
  136. package/esm2015/lib/modal/modal.component.js +0 -74
  137. package/esm2015/lib/notification/notification.component.js +0 -24
  138. package/esm2015/lib/notification-list/notification-list.component.js +0 -38
  139. package/esm2015/lib/notification.service.js +0 -79
  140. package/esm2015/lib/read-by.js +0 -13
  141. package/esm2015/lib/theme.service.js +0 -122
  142. package/esm2015/lib/thread/thread.component.js +0 -55
  143. package/esm2015/lib/types.js +0 -2
  144. package/esm2015/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.js +0 -192
  145. package/esm2015/lib/voice-recording/voice-recording.component.js +0 -115
  146. package/fesm2015/stream-chat-angular.js.map +0 -1
  147. /package/{esm2015/assets/i18n/en.js → esm2020/assets/i18n/en.mjs} +0 -0
  148. /package/{esm2015/lib/injection-tokens.js → esm2020/lib/injection-tokens.mjs} +0 -0
  149. /package/{esm2015/lib/is-image-attachment.js → esm2020/lib/is-image-attachment.mjs} +0 -0
  150. /package/{esm2015/lib/is-image-file.js → esm2020/lib/is-image-file.mjs} +0 -0
  151. /package/{esm2015/lib/is-on-separate-date.js → esm2020/lib/is-on-separate-date.mjs} +0 -0
  152. /package/{esm2015/lib/list-users.js → esm2020/lib/list-users.mjs} +0 -0
  153. /package/{esm2015/lib/message-input/textarea.interface.js → esm2020/lib/message-input/textarea.interface.mjs} +0 -0
  154. /package/{esm2015/lib/parse-date.js → esm2020/lib/parse-date.mjs} +0 -0
  155. /package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  156. /package/{esm2015/stream-chat-angular.js → esm2020/stream-chat-angular.mjs} +0 -0
  157. /package/{stream-chat-angular.d.ts → index.d.ts} +0 -0
@@ -0,0 +1,262 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { isImageFile } from './is-image-file';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { isImageAttachment } from './is-image-attachment';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "./channel.service";
7
+ import * as i2 from "./notification.service";
8
+ /**
9
+ * The `AttachmentService` manages the uploads of a message input.
10
+ */
11
+ export class AttachmentService {
12
+ constructor(channelService, notificationService) {
13
+ this.channelService = channelService;
14
+ this.notificationService = notificationService;
15
+ this.attachmentUploadInProgressCounterSubject = new BehaviorSubject(0);
16
+ this.attachmentUploadsSubject = new BehaviorSubject([]);
17
+ this.attachmentUploadInProgressCounter$ =
18
+ this.attachmentUploadInProgressCounterSubject.asObservable();
19
+ this.attachmentUploads$ = this.attachmentUploadsSubject.asObservable();
20
+ }
21
+ /**
22
+ * Resets the attachments uploads (for example after the message with the attachments sent successfully)
23
+ */
24
+ resetAttachmentUploads() {
25
+ this.attachmentUploadsSubject.next([]);
26
+ }
27
+ /**
28
+ * Uploads the selected files, and creates preview for image files. The result is propagated throught the `attachmentUploads$` stream.
29
+ * @param fileList The files selected by the user
30
+ * @returns A promise with the result
31
+ */
32
+ async filesSelected(fileList) {
33
+ if (!fileList) {
34
+ return;
35
+ }
36
+ const imageFiles = [];
37
+ const dataFiles = [];
38
+ const videoFiles = [];
39
+ Array.from(fileList).forEach((file) => {
40
+ if (isImageFile(file)) {
41
+ imageFiles.push(file);
42
+ }
43
+ else if (file.type.startsWith('video/')) {
44
+ videoFiles.push(file);
45
+ }
46
+ else {
47
+ dataFiles.push(file);
48
+ }
49
+ });
50
+ imageFiles.forEach((f) => this.createPreview(f));
51
+ const newUploads = [
52
+ ...imageFiles.map((file) => ({
53
+ file,
54
+ state: 'uploading',
55
+ type: 'image',
56
+ })),
57
+ ...videoFiles.map((file) => ({
58
+ file,
59
+ state: 'uploading',
60
+ type: 'video',
61
+ })),
62
+ ...dataFiles.map((file) => ({
63
+ file,
64
+ state: 'uploading',
65
+ type: 'file',
66
+ })),
67
+ ];
68
+ this.attachmentUploadsSubject.next([
69
+ ...this.attachmentUploadsSubject.getValue(),
70
+ ...newUploads,
71
+ ]);
72
+ await this.uploadAttachments(newUploads);
73
+ }
74
+ /**
75
+ * You can add custom `image`, `video` and `file` attachments using this method.
76
+ *
77
+ * 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`](./ChannelService.mdx)
78
+ * @param attachment
79
+ */
80
+ addAttachment(attachment) {
81
+ attachment.isCustomAttachment = true;
82
+ this.createFromAttachments([attachment]);
83
+ }
84
+ /**
85
+ * Retries to upload an attachment.
86
+ * @param file
87
+ * @returns A promise with the result
88
+ */
89
+ async retryAttachmentUpload(file) {
90
+ const attachmentUploads = this.attachmentUploadsSubject.getValue();
91
+ const upload = attachmentUploads.find((u) => u.file === file);
92
+ if (!upload) {
93
+ return;
94
+ }
95
+ upload.state = 'uploading';
96
+ this.attachmentUploadsSubject.next([...attachmentUploads]);
97
+ await this.uploadAttachments([upload]);
98
+ }
99
+ /**
100
+ * Deletes an attachment, the attachment can have any state (`error`, `uploading` or `success`).
101
+ * @param upload
102
+ */
103
+ async deleteAttachment(upload) {
104
+ const attachmentUploads = this.attachmentUploadsSubject.getValue();
105
+ let result;
106
+ if (upload.state === 'success' &&
107
+ !upload.fromAttachment?.isCustomAttachment) {
108
+ try {
109
+ await this.channelService.deleteAttachment(upload);
110
+ result = [...attachmentUploads];
111
+ const index = attachmentUploads.indexOf(upload);
112
+ result.splice(index, 1);
113
+ }
114
+ catch (error) {
115
+ result = attachmentUploads;
116
+ this.notificationService.addTemporaryNotification('streamChat.Error deleting attachment');
117
+ }
118
+ }
119
+ else {
120
+ result = [...attachmentUploads];
121
+ const index = attachmentUploads.indexOf(upload);
122
+ result.splice(index, 1);
123
+ }
124
+ this.attachmentUploadsSubject.next([...result]);
125
+ }
126
+ /**
127
+ * Maps the current uploads to a format that can be sent along with the message to the Stream API.
128
+ * @returns the attachments
129
+ */
130
+ mapToAttachments() {
131
+ const attachmentUploads = this.attachmentUploadsSubject.getValue();
132
+ return attachmentUploads
133
+ .filter((r) => r.state === 'success')
134
+ .map((r) => {
135
+ const attachment = {
136
+ type: r.type,
137
+ };
138
+ if (r.fromAttachment) {
139
+ return r.fromAttachment;
140
+ }
141
+ else {
142
+ attachment.mime_type = r.file?.type;
143
+ if (r.type === 'image') {
144
+ attachment.fallback = r.file?.name;
145
+ attachment.image_url = r.url;
146
+ }
147
+ else {
148
+ attachment.asset_url = r.url;
149
+ attachment.title = r.file?.name;
150
+ attachment.file_size = r.file?.size;
151
+ attachment.thumb_url = r.thumb_url;
152
+ }
153
+ }
154
+ return attachment;
155
+ });
156
+ }
157
+ /**
158
+ * Maps attachments received from the Stream API to uploads. This is useful when editing a message.
159
+ * @param attachments Attachemnts received with the message
160
+ */
161
+ createFromAttachments(attachments) {
162
+ const attachmentUploads = [];
163
+ attachments.forEach((attachment) => {
164
+ if (isImageAttachment(attachment)) {
165
+ attachmentUploads.push({
166
+ url: (attachment.img_url ||
167
+ attachment.thumb_url ||
168
+ attachment.image_url),
169
+ state: 'success',
170
+ type: 'image',
171
+ file: {
172
+ name: attachment.fallback,
173
+ type: attachment.mime_type,
174
+ },
175
+ fromAttachment: attachment,
176
+ });
177
+ }
178
+ else if (attachment.type === 'file' || attachment.type === 'video') {
179
+ attachmentUploads.push({
180
+ url: attachment.asset_url,
181
+ state: 'success',
182
+ file: {
183
+ name: attachment.title,
184
+ size: attachment.file_size,
185
+ type: attachment.mime_type,
186
+ },
187
+ type: attachment.type,
188
+ thumb_url: attachment.thumb_url,
189
+ fromAttachment: attachment,
190
+ });
191
+ }
192
+ });
193
+ if (attachmentUploads.length > 0) {
194
+ this.attachmentUploadsSubject.next([
195
+ ...this.attachmentUploadsSubject.getValue(),
196
+ ...attachmentUploads,
197
+ ]);
198
+ }
199
+ }
200
+ createPreview(file) {
201
+ const reader = new FileReader();
202
+ reader.onload = (event) => {
203
+ const attachmentUploads = this.attachmentUploadsSubject.getValue();
204
+ const upload = attachmentUploads.find((upload) => upload.file === file);
205
+ if (!upload) {
206
+ return;
207
+ }
208
+ upload.previewUri = event.target?.result || undefined;
209
+ this.attachmentUploadsSubject.next([...attachmentUploads]);
210
+ };
211
+ reader.readAsDataURL(file);
212
+ }
213
+ async uploadAttachments(uploads) {
214
+ this.attachmentUploadInProgressCounterSubject.next(this.attachmentUploadInProgressCounterSubject.getValue() + 1);
215
+ const result = await this.channelService.uploadAttachments(uploads);
216
+ const attachmentUploads = this.attachmentUploadsSubject.getValue();
217
+ result.forEach((r) => {
218
+ const upload = attachmentUploads.find((upload) => upload.file === r.file);
219
+ if (!upload) {
220
+ if (r.url) {
221
+ void this.channelService.deleteAttachment(r);
222
+ }
223
+ return;
224
+ }
225
+ upload.state = r.state;
226
+ upload.url = r.url;
227
+ upload.thumb_url = r.thumb_url;
228
+ if (upload.state === 'error') {
229
+ upload.errorReason = r.errorReason;
230
+ upload.errorExtraInfo = r.errorExtraInfo;
231
+ let errorKey;
232
+ const translateParams = { name: upload.file.name };
233
+ switch (upload.errorReason) {
234
+ case 'file-extension':
235
+ errorKey =
236
+ 'streamChat.Error uploading file, extension not supported';
237
+ translateParams.ext = upload.errorExtraInfo?.[0]?.param;
238
+ break;
239
+ case 'file-size':
240
+ errorKey =
241
+ 'streamChat.Error uploading file, maximum file size exceeded';
242
+ translateParams.limit = upload.errorExtraInfo?.[0]?.param;
243
+ break;
244
+ default:
245
+ errorKey = 'streamChat.Error uploading file';
246
+ }
247
+ this.notificationService.addTemporaryNotification(errorKey, 'error', undefined, translateParams);
248
+ }
249
+ });
250
+ this.attachmentUploadInProgressCounterSubject.next(this.attachmentUploadInProgressCounterSubject.getValue() - 1);
251
+ this.attachmentUploadsSubject.next([...attachmentUploads]);
252
+ }
253
+ }
254
+ AttachmentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AttachmentService, deps: [{ token: i1.ChannelService }, { token: i2.NotificationService }], target: i0.ɵɵFactoryTarget.Injectable });
255
+ AttachmentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AttachmentService, providedIn: 'root' });
256
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AttachmentService, decorators: [{
257
+ type: Injectable,
258
+ args: [{
259
+ providedIn: 'root',
260
+ }]
261
+ }], ctorParameters: function () { return [{ type: i1.ChannelService }, { type: i2.NotificationService }]; } });
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2F0dGFjaG1lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBR25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7O0FBSTFEOztHQUVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQWlCNUIsWUFDVSxjQUE4QixFQUM5QixtQkFBd0M7UUFEeEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFSMUMsNkNBQXdDLEdBQzlDLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLDZCQUF3QixHQUFHLElBQUksZUFBZSxDQUNwRCxFQUFFLENBQ0gsQ0FBQztRQU1BLElBQUksQ0FBQyxrQ0FBa0M7WUFDckMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQy9ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQXlCO1FBQzNDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixPQUFPO1NBQ1I7UUFDRCxNQUFNLFVBQVUsR0FBVyxFQUFF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LENBQUMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDOzs4R0FuUlUsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FGaEIsTUFBTTsyRkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNJbWFnZUZpbGUgfSBmcm9tICcuL2lzLWltYWdlLWZpbGUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuL2NoYW5uZWwuc2VydmljZSc7XG5pbXBvcnQgeyBpc0ltYWdlQXR0YWNobWVudCB9IGZyb20gJy4vaXMtaW1hZ2UtYXR0YWNobWVudCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9ub3RpZmljYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50VXBsb2FkLCBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBBdHRhY2htZW50U2VydmljZWAgbWFuYWdlcyB0aGUgdXBsb2FkcyBvZiBhIG1lc3NhZ2UgaW5wdXQuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50U2VydmljZTxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+IHtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBudW1iZXIgb2YgdXBsb2FkcyBpbiBwcm9ncmVzcy5cbiAgICovXG4gIGF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlciQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBzdGF0ZSBvZiB0aGUgdXBsb2FkcyAoW2BBdHRhY2htZW50VXBsb2FkW11gXShodHRwczovL2dpdGh1Yi5jb20vR2V0U3RyZWFtL3N0cmVhbS1jaGF0LWFuZ3VsYXIvYmxvYi9tYXN0ZXIvcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL3R5cGVzLnRzKSksIGl0IGFkZHMgYSBzdGF0ZSAoYHN1Y2Nlc3NgLCBgZXJyb3JgIG9yIGB1cGxvYWRpbmdgKSB0byBlYWNoIGZpbGUgdGhlIHVzZXIgc2VsZWN0cyBmb3IgdXBsb2FkLiBJdCBpcyB1c2VkIGJ5IHRoZSBbYEF0dGFjaG1lbnRQcmV2aWV3TGlzdGBdKC4uL2NvbXBvbmVudHMvQXR0YWNobWVudFByZXZpZXdMaXN0Q29tcG9uZW50Lm1keCkgdG8gZGlzcGxheSB0aGUgYXR0YWNobWVudCBwcmV2aWV3cy5cbiAgICovXG4gIGF0dGFjaG1lbnRVcGxvYWRzJDogT2JzZXJ2YWJsZTxBdHRhY2htZW50VXBsb2FkW10+O1xuICBwcml2YXRlIGF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlclN1YmplY3QgPVxuICAgIG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSBhdHRhY2htZW50VXBsb2Fkc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dGFjaG1lbnRVcGxvYWRbXT4oXG4gICAgW11cbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5hdHRhY2htZW50VXBsb2FkSW5Qcm9ncmVzc0NvdW50ZXIkID1cbiAgICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmF0dGFjaG1lbnRVcGxvYWRzJCA9IHRoaXMuYXR0YWNobWVudFVwbG9hZHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYXR0YWNobWVudHMgdXBsb2FkcyAoZm9yIGV4YW1wbGUgYWZ0ZXIgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgYXR0YWNobWVudHMgc2VudCBzdWNjZXNzZnVsbHkpXG4gICAqL1xuICByZXNldEF0dGFjaG1lbnRVcGxvYWRzKCkge1xuICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZHNTdWJqZWN0Lm5leHQoW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgdGhlIHNlbGVjdGVkIGZpbGVzLCBhbmQgY3JlYXRlcyBwcmV2aWV3IGZvciBpbWFnZSBmaWxlcy4gVGhlIHJlc3VsdCBpcyBwcm9wYWdhdGVkIHRocm91Z2h0IHRoZSBgYXR0YWNobWVudFVwbG9hZHMkYCBzdHJlYW0uXG4gICAqIEBwYXJhbSBmaWxlTGlzdCBUaGUgZmlsZXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXJcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggdGhlIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgZmlsZXNTZWxlY3RlZChmaWxlTGlzdDogRmlsZUxpc3QgfCBudWxsKSB7XG4gICAgaWYgKCFmaWxlTGlzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbWFnZUZpbGVzOiBGaWxlW10gPSBbXTtcbiAgICBjb25zdCBkYXRhRmlsZXM6IEZpbGVbXSA9IFtdO1xuICAgIGNvbnN0IHZpZGVvRmlsZXM6IEZpbGVbXSA9IFtdO1xuXG4gICAgQXJyYXkuZnJvbShmaWxlTGlzdCkuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgaWYgKGlzSW1hZ2VGaWxlKGZpbGUpKSB7XG4gICAgICAgIGltYWdlRmlsZXMucHVzaChmaWxlKTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvLycpKSB7XG4gICAgICAgIHZpZGVvRmlsZXMucHVzaChmaWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGltYWdlRmlsZXMuZm9yRWFjaCgoZikgPT4gdGhpcy5jcmVhdGVQcmV2aWV3KGYpKTtcbiAgICBjb25zdCBuZXdVcGxvYWRzID0gW1xuICAgICAgLi4uaW1hZ2VGaWxlcy5tYXAoKGZpbGUpID0+ICh7XG4gICAgICAgIGZpbGUsXG4gICAgICAgIHN0YXRlOiAndXBsb2FkaW5nJyBhcyBjb25zdCxcbiAgICAgICAgdHlwZTogJ2ltYWdlJyBhcyBjb25zdCxcbiAgICAgIH0pKSxcbiAgICAgIC4uLnZpZGVvRmlsZXMubWFwKChmaWxlKSA9PiAoe1xuICAgICAgICBmaWxlLFxuICAgICAgICBzdGF0ZTogJ3VwbG9hZGluZycgYXMgY29uc3QsXG4gICAgICAgIHR5cGU6ICd2aWRlbycgYXMgY29uc3QsXG4gICAgICB9KSksXG4gICAgICAuLi5kYXRhRmlsZXMubWFwKChmaWxlKSA9PiAoe1xuICAgICAgICBmaWxlLFxuICAgICAgICBzdGF0ZTogJ3VwbG9hZGluZycgYXMgY29uc3QsXG4gICAgICAgIHR5cGU6ICdmaWxlJyBhcyBjb25zdCxcbiAgICAgIH0pKSxcbiAgICBdO1xuICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZHNTdWJqZWN0Lm5leHQoW1xuICAgICAgLi4udGhpcy5hdHRhY2htZW50VXBsb2Fkc1N1YmplY3QuZ2V0VmFsdWUoKSxcbiAgICAgIC4uLm5ld1VwbG9hZHMsXG4gICAgXSk7XG4gICAgYXdhaXQgdGhpcy51cGxvYWRBdHRhY2htZW50cyhuZXdVcGxvYWRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIGFkZCBjdXN0b20gYGltYWdlYCwgYHZpZGVvYCBhbmQgYGZpbGVgIGF0dGFjaG1lbnRzIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBOb3RlOiBJZiB5b3UganVzdCB3YW50IHRvIHVzZSB5b3VyIG93biBDRE4gZm9yIGZpbGUgdXBsb2FkcywgeW91IGRvbid0IG5lY2Vzc2FyeSBuZWVkIHRoaXMgbWV0aG9kLCB5b3UgY2FuIGp1c3Qgc3BlY2lmeSB5b3Ugb3duIHVwbG9hZCBmdW5jdGlvbiBpbiB0aGUgW2BDaGFubmVsU2VydmljZWBdKC4vQ2hhbm5lbFNlcnZpY2UubWR4KVxuICAgKiBAcGFyYW0gYXR0YWNobWVudFxuICAgKi9cbiAgYWRkQXR0YWNobWVudChhdHRhY2htZW50OiBBdHRhY2htZW50PFQ+KSB7XG4gICAgYXR0YWNobWVudC5pc0N1c3RvbUF0dGFjaG1lbnQgPSB0cnVlO1xuICAgIHRoaXMuY3JlYXRlRnJvbUF0dGFjaG1lbnRzKFthdHRhY2htZW50XSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmllcyB0byB1cGxvYWQgYW4gYXR0YWNobWVudC5cbiAgICogQHBhcmFtIGZpbGVcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggdGhlIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgcmV0cnlBdHRhY2htZW50VXBsb2FkKGZpbGU6IEZpbGUpIHtcbiAgICBjb25zdCBhdHRhY2htZW50VXBsb2FkcyA9IHRoaXMuYXR0YWNobWVudFVwbG9hZHNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgdXBsb2FkID0gYXR0YWNobWVudFVwbG9hZHMuZmluZCgodSkgPT4gdS5maWxlID09PSBmaWxlKTtcbiAgICBpZiAoIXVwbG9hZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1cGxvYWQuc3RhdGUgPSAndXBsb2FkaW5nJztcbiAgICB0aGlzLmF0dGFjaG1lbnRVcGxvYWRzU3ViamVjdC5uZXh0KFsuLi5hdHRhY2htZW50VXBsb2Fkc10pO1xuICAgIGF3YWl0IHRoaXMudXBsb2FkQXR0YWNobWVudHMoW3VwbG9hZF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gYXR0YWNobWVudCwgdGhlIGF0dGFjaG1lbnQgY2FuIGhhdmUgYW55IHN0YXRlIChgZXJyb3JgLCBgdXBsb2FkaW5nYCBvciBgc3VjY2Vzc2ApLlxuICAgKiBAcGFyYW0gdXBsb2FkXG4gICAqL1xuICBhc3luYyBkZWxldGVBdHRhY2htZW50KHVwbG9hZDogQXR0YWNobWVudFVwbG9hZCkge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRVcGxvYWRzID0gdGhpcy5hdHRhY2htZW50VXBsb2Fkc1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBsZXQgcmVzdWx0ITogQXR0YWNobWVudFVwbG9hZFtdO1xuICAgIGlmIChcbiAgICAgIHVwbG9hZC5zdGF0ZSA9PT0gJ3N1Y2Nlc3MnICYmXG4gICAgICAhdXBsb2FkLmZyb21BdHRhY2htZW50Py5pc0N1c3RvbUF0dGFjaG1lbnRcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hhbm5lbFNlcnZpY2UuZGVsZXRlQXR0YWNobWVudCh1cGxvYWQpO1xuICAgICAgICByZXN1bHQgPSBbLi4uYXR0YWNobWVudFVwbG9hZHNdO1xuICAgICAgICBjb25zdCBpbmRleCA9IGF0dGFjaG1lbnRVcGxvYWRzLmluZGV4T2YodXBsb2FkKTtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXN1bHQgPSBhdHRhY2htZW50VXBsb2FkcztcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAnc3RyZWFtQ2hhdC5FcnJvciBkZWxldGluZyBhdHRhY2htZW50J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBbLi4uYXR0YWNobWVudFVwbG9hZHNdO1xuICAgICAgY29uc3QgaW5kZXggPSBhdHRhY2htZW50VXBsb2Fkcy5pbmRleE9mKHVwbG9hZCk7XG4gICAgICByZXN1bHQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgdGhpcy5hdHRhY2htZW50VXBsb2Fkc1N1YmplY3QubmV4dChbLi4ucmVzdWx0XSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwcyB0aGUgY3VycmVudCB1cGxvYWRzIHRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNlbnQgYWxvbmcgd2l0aCB0aGUgbWVzc2FnZSB0byB0aGUgU3RyZWFtIEFQSS5cbiAgICogQHJldHVybnMgdGhlIGF0dGFjaG1lbnRzXG4gICAqL1xuICBtYXBUb0F0dGFjaG1lbnRzKCkge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRVcGxvYWRzID0gdGhpcy5hdHRhY2htZW50VXBsb2Fkc1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICByZXR1cm4gYXR0YWNobWVudFVwbG9hZHNcbiAgICAgIC5maWx0ZXIoKHIpID0+IHIuc3RhdGUgPT09ICdzdWNjZXNzJylcbiAgICAgIC5tYXAoKHIpID0+IHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudDogQXR0YWNobWVudCA9IHtcbiAgICAgICAgICB0eXBlOiByLnR5cGUsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChyLmZyb21BdHRhY2htZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHIuZnJvbUF0dGFjaG1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXR0YWNobWVudC5taW1lX3R5cGUgPSByLmZpbGU/LnR5cGU7XG4gICAgICAgICAgaWYgKHIudHlwZSA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgYXR0YWNobWVudC5mYWxsYmFjayA9IHIuZmlsZT8ubmFtZTtcbiAgICAgICAgICAgIGF0dGFjaG1lbnQuaW1hZ2VfdXJsID0gci51cmw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF0dGFjaG1lbnQuYXNzZXRfdXJsID0gci51cmw7XG4gICAgICAgICAgICBhdHRhY2htZW50LnRpdGxlID0gci5maWxlPy5uYW1lO1xuICAgICAgICAgICAgYXR0YWNobWVudC5maWxlX3NpemUgPSByLmZpbGU/LnNpemU7XG4gICAgICAgICAgICBhdHRhY2htZW50LnRodW1iX3VybCA9IHIudGh1bWJfdXJsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhdHRhY2htZW50O1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhdHRhY2htZW50cyByZWNlaXZlZCBmcm9tIHRoZSBTdHJlYW0gQVBJIHRvIHVwbG9hZHMuIFRoaXMgaXMgdXNlZnVsIHdoZW4gZWRpdGluZyBhIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBhdHRhY2htZW50cyBBdHRhY2hlbW50cyByZWNlaXZlZCB3aXRoIHRoZSBtZXNzYWdlXG4gICAqL1xuICBjcmVhdGVGcm9tQXR0YWNobWVudHMoYXR0YWNobWVudHM6IEF0dGFjaG1lbnQ8VD5bXSkge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRVcGxvYWRzOiBBdHRhY2htZW50VXBsb2FkW10gPSBbXTtcbiAgICBhdHRhY2htZW50cy5mb3JFYWNoKChhdHRhY2htZW50KSA9PiB7XG4gICAgICBpZiAoaXNJbWFnZUF0dGFjaG1lbnQoYXR0YWNobWVudCkpIHtcbiAgICAgICAgYXR0YWNobWVudFVwbG9hZHMucHVzaCh7XG4gICAgICAgICAgdXJsOiAoYXR0YWNobWVudC5pbWdfdXJsIHx8XG4gICAgICAgICAgICBhdHRhY2htZW50LnRodW1iX3VybCB8fFxuICAgICAgICAgICAgYXR0YWNobWVudC5pbWFnZV91cmwpIGFzIHN0cmluZyxcbiAgICAgICAgICBzdGF0ZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgICAgZmlsZToge1xuICAgICAgICAgICAgbmFtZTogYXR0YWNobWVudC5mYWxsYmFjayxcbiAgICAgICAgICAgIHR5cGU6IGF0dGFjaG1lbnQubWltZV90eXBlLFxuICAgICAgICAgIH0gYXMgRmlsZSxcbiAgICAgICAgICBmcm9tQXR0YWNobWVudDogYXR0YWNobWVudCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnQudHlwZSA9PT0gJ2ZpbGUnIHx8IGF0dGFjaG1lbnQudHlwZSA9PT0gJ3ZpZGVvJykge1xuICAgICAgICBhdHRhY2htZW50VXBsb2Fkcy5wdXNoKHtcbiAgICAgICAgICB1cmw6IGF0dGFjaG1lbnQuYXNzZXRfdXJsLFxuICAgICAgICAgIHN0YXRlOiAnc3VjY2VzcycsXG4gICAgICAgICAgZmlsZToge1xuICAgICAgICAgICAgbmFtZTogYXR0YWNobWVudC50aXRsZSxcbiAgICAgICAgICAgIHNpemU6IGF0dGFjaG1lbnQuZmlsZV9zaXplLFxuICAgICAgICAgICAgdHlwZTogYXR0YWNobWVudC5taW1lX3R5cGUsXG4gICAgICAgICAgfSBhcyBGaWxlLFxuICAgICAgICAgIHR5cGU6IGF0dGFjaG1lbnQudHlwZSxcbiAgICAgICAgICB0aHVtYl91cmw6IGF0dGFjaG1lbnQudGh1bWJfdXJsLFxuICAgICAgICAgIGZyb21BdHRhY2htZW50OiBhdHRhY2htZW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhdHRhY2htZW50VXBsb2Fkcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmF0dGFjaG1lbnRVcGxvYWRzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgLi4udGhpcy5hdHRhY2htZW50VXBsb2Fkc1N1YmplY3QuZ2V0VmFsdWUoKSxcbiAgICAgICAgLi4uYXR0YWNobWVudFVwbG9hZHMsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVByZXZpZXcoZmlsZTogRmlsZSkge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xuICAgICAgY29uc3QgYXR0YWNobWVudFVwbG9hZHMgPSB0aGlzLmF0dGFjaG1lbnRVcGxvYWRzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgY29uc3QgdXBsb2FkID0gYXR0YWNobWVudFVwbG9hZHMuZmluZCgodXBsb2FkKSA9PiB1cGxvYWQuZmlsZSA9PT0gZmlsZSk7XG4gICAgICBpZiAoIXVwbG9hZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1cGxvYWQucHJldmlld1VyaSA9IGV2ZW50LnRhcmdldD8ucmVzdWx0IHx8IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZHNTdWJqZWN0Lm5leHQoWy4uLmF0dGFjaG1lbnRVcGxvYWRzXSk7XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlIGFzIEJsb2IpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGxvYWRBdHRhY2htZW50cyh1cGxvYWRzOiBBdHRhY2htZW50VXBsb2FkW10pIHtcbiAgICB0aGlzLmF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlclN1YmplY3QubmV4dChcbiAgICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyU3ViamVjdC5nZXRWYWx1ZSgpICsgMVxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jaGFubmVsU2VydmljZS51cGxvYWRBdHRhY2htZW50cyh1cGxvYWRzKTtcbiAgICBjb25zdCBhdHRhY2htZW50VXBsb2FkcyA9IHRoaXMuYXR0YWNobWVudFVwbG9hZHNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgcmVzdWx0LmZvckVhY2goKHIpID0+IHtcbiAgICAgIGNvbnN0IHVwbG9hZCA9IGF0dGFjaG1lbnRVcGxvYWRzLmZpbmQoKHVwbG9hZCkgPT4gdXBsb2FkLmZpbGUgPT09IHIuZmlsZSk7XG4gICAgICBpZiAoIXVwbG9hZCkge1xuICAgICAgICBpZiAoci51cmwpIHtcbiAgICAgICAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UuZGVsZXRlQXR0YWNobWVudChyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1cGxvYWQuc3RhdGUgPSByLnN0YXRlO1xuICAgICAgdXBsb2FkLnVybCA9IHIudXJsO1xuICAgICAgdXBsb2FkLnRodW1iX3VybCA9IHIudGh1bWJfdXJsO1xuICAgICAgaWYgKHVwbG9hZC5zdGF0ZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICB1cGxvYWQuZXJyb3JSZWFzb24gPSByLmVycm9yUmVhc29uO1xuICAgICAgICB1cGxvYWQuZXJyb3JFeHRyYUluZm8gPSByLmVycm9yRXh0cmFJbmZvO1xuICAgICAgICBsZXQgZXJyb3JLZXk7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZVBhcmFtczogeyBuYW1lOiBzdHJpbmc7IGV4dD86IHN0cmluZzsgbGltaXQ/OiBzdHJpbmcgfSA9XG4gICAgICAgICAgeyBuYW1lOiB1cGxvYWQuZmlsZS5uYW1lIH07XG4gICAgICAgIHN3aXRjaCAodXBsb2FkLmVycm9yUmVhc29uKSB7XG4gICAgICAgICAgY2FzZSAnZmlsZS1leHRlbnNpb24nOlxuICAgICAgICAgICAgZXJyb3JLZXkgPVxuICAgICAgICAgICAgICAnc3RyZWFtQ2hhdC5FcnJvciB1cGxvYWRpbmcgZmlsZSwgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQnO1xuICAgICAgICAgICAgdHJhbnNsYXRlUGFyYW1zLmV4dCA9IHVwbG9hZC5lcnJvckV4dHJhSW5mbz8uWzBdPy5wYXJhbTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2ZpbGUtc2l6ZSc6XG4gICAgICAgICAgICBlcnJvcktleSA9XG4gICAgICAgICAgICAgICdzdHJlYW1DaGF0LkVycm9yIHVwbG9hZGluZyBmaWxlLCBtYXhpbXVtIGZpbGUgc2l6ZSBleGNlZWRlZCc7XG4gICAgICAgICAgICB0cmFuc2xhdGVQYXJhbXMubGltaXQgPSB1cGxvYWQuZXJyb3JFeHRyYUluZm8/LlswXT8ucGFyYW07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXJyb3JLZXkgPSAnc3RyZWFtQ2hhdC5FcnJvciB1cGxvYWRpbmcgZmlsZSc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgICBlcnJvcktleSxcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICB0cmFuc2xhdGVQYXJhbXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlclN1YmplY3QubmV4dChcbiAgICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyU3ViamVjdC5nZXRWYWx1ZSgpIC0gMVxuICAgICk7XG4gICAgdGhpcy5hdHRhY2htZW50VXBsb2Fkc1N1YmplY3QubmV4dChbLi4uYXR0YWNobWVudFVwbG9hZHNdKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,163 @@
1
+ import { Component, Input, } from '@angular/core';
2
+ import { filter } from 'rxjs/operators';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../chat-client.service";
5
+ import * as i2 from "@angular/common";
6
+ /**
7
+ * The `Avatar` component displays the provided image, with fallback to the first letter of the optional name input.
8
+ */
9
+ export class AvatarComponent {
10
+ constructor(chatClientService, ngZone, cdRef) {
11
+ this.chatClientService = chatClientService;
12
+ this.ngZone = ngZone;
13
+ this.cdRef = cdRef;
14
+ /**
15
+ * The size in pixels of the avatar image.
16
+ */
17
+ this.size = 32;
18
+ /**
19
+ * 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.
20
+ */
21
+ this.showOnlineIndicator = true;
22
+ /**
23
+ * 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
24
+ */
25
+ this.initialsType = 'first-letter-of-first-word';
26
+ this.isError = false;
27
+ this.isOnline = false;
28
+ this.initials = '';
29
+ this.isViewInited = false;
30
+ this.subscriptions = [];
31
+ }
32
+ ngOnInit() {
33
+ this.subscriptions.push(this.chatClientService.user$.subscribe((u) => {
34
+ if (u?.id !== this.userId) {
35
+ this.userId = u?.id;
36
+ if (this.type || this.channel || this.name) {
37
+ this.setInitials();
38
+ this.setFallbackChannelImage();
39
+ this.updateIsOnlineSubscription();
40
+ }
41
+ if (this.isViewInited) {
42
+ this.cdRef.detectChanges();
43
+ }
44
+ }
45
+ }));
46
+ }
47
+ ngOnChanges(changes) {
48
+ if (changes['channel']) {
49
+ this.updateIsOnlineSubscription();
50
+ }
51
+ if (changes.type || changes.name || changes.channel) {
52
+ this.setInitials();
53
+ }
54
+ if (changes.type || changes.channel) {
55
+ this.setFallbackChannelImage();
56
+ }
57
+ }
58
+ setFallbackChannelImage() {
59
+ if (this.type !== 'channel') {
60
+ this.fallbackChannelImage = undefined;
61
+ }
62
+ else {
63
+ const otherMember = this.getOtherMemberIfOneToOneChannel();
64
+ if (otherMember) {
65
+ this.fallbackChannelImage = otherMember.image;
66
+ }
67
+ else {
68
+ this.fallbackChannelImage = undefined;
69
+ }
70
+ }
71
+ }
72
+ setInitials() {
73
+ let result = '';
74
+ if (this.type === 'user') {
75
+ result = this.name?.toString() || '';
76
+ }
77
+ else if (this.type === 'channel') {
78
+ if (this.channel?.data?.name) {
79
+ result = this.channel?.data?.name;
80
+ }
81
+ else {
82
+ const otherMember = this.getOtherMemberIfOneToOneChannel();
83
+ if (otherMember) {
84
+ result = otherMember.name || otherMember.id || '';
85
+ }
86
+ else {
87
+ result = '#';
88
+ }
89
+ }
90
+ }
91
+ const words = result.split(' ');
92
+ let initials;
93
+ if (this.initialsType === 'first-letter-of-each-word') {
94
+ initials = words.map((w) => w.charAt(0) || '').join('');
95
+ }
96
+ else {
97
+ initials = words[0].charAt(0) || '';
98
+ }
99
+ this.initials = initials;
100
+ }
101
+ updateIsOnlineSubscription() {
102
+ if (this.channel) {
103
+ const otherMember = this.getOtherMemberIfOneToOneChannel();
104
+ if (otherMember) {
105
+ this.isOnline = otherMember.online || false;
106
+ this.isOnlineSubscription = this.chatClientService.events$
107
+ .pipe(filter((e) => e.eventType === 'user.presence.changed'))
108
+ .subscribe((event) => {
109
+ if (event.event.user?.id === otherMember.id) {
110
+ this.ngZone.run(() => {
111
+ this.isOnline = event.event.user?.online || false;
112
+ });
113
+ }
114
+ });
115
+ }
116
+ else {
117
+ this.isOnline = false;
118
+ this.isOnlineSubscription?.unsubscribe();
119
+ }
120
+ }
121
+ else {
122
+ this.isOnline = false;
123
+ this.isOnlineSubscription?.unsubscribe();
124
+ }
125
+ }
126
+ ngAfterViewInit() {
127
+ this.isViewInited = true;
128
+ }
129
+ getOtherMemberIfOneToOneChannel() {
130
+ const otherMembers = Object.values(this.channel?.state?.members || {}).filter((m) => m.user_id !== this.userId);
131
+ if (otherMembers.length === 1) {
132
+ return otherMembers[0].user;
133
+ }
134
+ else {
135
+ return undefined;
136
+ }
137
+ }
138
+ }
139
+ AvatarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AvatarComponent, deps: [{ token: i1.ChatClientService }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
140
+ AvatarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: AvatarComponent, selector: "stream-avatar", inputs: { name: "name", imageUrl: "imageUrl", size: "size", location: "location", channel: "channel", user: "user", type: "type", showOnlineIndicator: "showOnlineIndicator", initialsType: "initialsType" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"str-chat__avatar str-chat__avatar--circle stream-chat__avatar--{{\n location\n }}\"\n title=\"{{ name }}\"\n [ngStyle]=\"{\n flexBasis: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n fontSize:\n initialsType === 'first-letter-of-first-word'\n ? 'calc(var(--str-chat__spacing-px, 1px) * ' + size / 2 + ')'\n : 'calc(var(--str-chat__spacing-px, 1px) * ' + size / 3 + ')',\n height: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n lineHeight: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n width: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')'\n }\"\n>\n <img\n *ngIf=\"(imageUrl || fallbackChannelImage) && !isError; else fallback\"\n class=\"str-chat__avatar-image str-chat__avatar-image\"\n data-testid=\"avatar-img\"\n fetchpriority=\"high\"\n src=\"{{ imageUrl || fallbackChannelImage }}\"\n alt=\"{{ initials }}\"\n [ngStyle]=\"{\n flexBasis: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n height: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n objectFit: 'cover',\n width: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')'\n }\"\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", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
141
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AvatarComponent, decorators: [{
142
+ type: Component,
143
+ args: [{ selector: 'stream-avatar', template: "<div\n class=\"str-chat__avatar str-chat__avatar--circle stream-chat__avatar--{{\n location\n }}\"\n title=\"{{ name }}\"\n [ngStyle]=\"{\n flexBasis: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n fontSize:\n initialsType === 'first-letter-of-first-word'\n ? 'calc(var(--str-chat__spacing-px, 1px) * ' + size / 2 + ')'\n : 'calc(var(--str-chat__spacing-px, 1px) * ' + size / 3 + ')',\n height: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n lineHeight: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n width: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')'\n }\"\n>\n <img\n *ngIf=\"(imageUrl || fallbackChannelImage) && !isError; else fallback\"\n class=\"str-chat__avatar-image str-chat__avatar-image\"\n data-testid=\"avatar-img\"\n fetchpriority=\"high\"\n src=\"{{ imageUrl || fallbackChannelImage }}\"\n alt=\"{{ initials }}\"\n [ngStyle]=\"{\n flexBasis: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n height: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',\n objectFit: 'cover',\n width: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')'\n }\"\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" }]
144
+ }], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { name: [{
145
+ type: Input
146
+ }], imageUrl: [{
147
+ type: Input
148
+ }], size: [{
149
+ type: Input
150
+ }], location: [{
151
+ type: Input
152
+ }], channel: [{
153
+ type: Input
154
+ }], user: [{
155
+ type: Input
156
+ }], type: [{
157
+ type: Input
158
+ }], showOnlineIndicator: [{
159
+ type: Input
160
+ }], initialsType: [{
161
+ type: Input
162
+ }] } });
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdmF0YXIvYXZhdGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdmF0YXIvYXZhdGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsS0FBSyxHQUtOLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQVN4Qzs7R0FFRztBQU1ILE1BQU0sT0FBTyxlQUFlO0lBa0QxQixZQUNVLGlCQUFvQyxFQUNwQyxNQUFjLEVBQ2QsS0FBd0I7UUFGeEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUExQ2xDOztXQUVHO1FBQ00sU0FBSSxHQUFHLEVBQUUsQ0FBQztRQWlCbkI7O1dBRUc7UUFDTSx3QkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDcEM7O1dBRUc7UUFDTSxpQkFBWSxHQUVhLDRCQUE0QixDQUFDO1FBQy9ELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQixhQUFRLEdBQVcsRUFBRSxDQUFDO1FBR2QsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO0lBTXhDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLEVBQUUs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QztJQUMzQixDQUFDO0lBRU8sK0JBQStCO1FBQ3JDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ2hDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQ25DLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUM3QjthQUFNO1lBQ0wsT0FBTyxTQUFTLENBQUM7U0FDbEI7SUFDSCxDQUFDOzs0R0FwS1UsZUFBZTtnR0FBZixlQUFlLHdSQzVCNUIsK2hEQTBDQTsyRkRkYSxlQUFlO2tCQUwzQixTQUFTOytCQUNFLGVBQWU7NkpBVWhCLElBQUk7c0JBQVosS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLElBQUk7c0JBQVosS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLE9BQU87c0JBQWYsS0FBSztnQkFJRyxJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsSUFBSTtzQkFBWixLQUFLO2dCQUlHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDaGFubmVsLCBVc2VyIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ2hhdENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEF2YXRhckxvY2F0aW9uLFxuICBBdmF0YXJUeXBlLFxuICBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBBdmF0YXJgIGNvbXBvbmVudCBkaXNwbGF5cyB0aGUgcHJvdmlkZWQgaW1hZ2UsIHdpdGggZmFsbGJhY2sgdG8gdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgb3B0aW9uYWwgbmFtZSBpbnB1dC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLWF2YXRhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdmF0YXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdmF0YXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQXZhdGFyQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdFxue1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgaW1hZ2UsIHVzZWQgZm9yIGZhbGxiYWNrIGltYWdlIG9yIGltYWdlIHRpdGxlIChpZiBgaW1hZ2VVcmxgIGlzIHByb3ZpZGVkKVxuICAgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgaW1hZ2UgdG8gYmUgZGlzcGxheWVkLiBJZiB0aGUgaW1hZ2UgY2FuJ3QgYmUgZGlzcGxheWVkIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIG5hbWUgaW5wdXQgaXMgZGlzcGxheWVkLlxuICAgKi9cbiAgQElucHV0KCkgaW1hZ2VVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBzaXplIGluIHBpeGVscyBvZiB0aGUgYXZhdGFyIGltYWdlLlxuICAgKi9cbiAgQElucHV0KCkgc2l6ZSA9IDMyO1xuICAvKipcbiAgICogVGhlIGxvY2F0aW9uIHRoZSBhdmF0YXIgd2lsbCBiZSBkaXNwbGF5ZWQgaW5cbiAgICovXG4gIEBJbnB1dCgpIGxvY2F0aW9uOiBBdmF0YXJMb2NhdGlvbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIHRoZSBhdmF0YXIgYmVsb25ncyB0byAoaWYgYXZhdGFyIG9mIGEgY2hhbm5lbCBpcyBkaXNwbGF5ZWQpXG4gICAqL1xuICBASW5wdXQoKSBjaGFubmVsPzogQ2hhbm5lbDxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPjtcbiAgLyoqXG4gICAqIFRoZSB1c2VyIHRoZSBhdmF0YXIgYmVsb25ncyB0byAoaWYgYXZhdGFyIG9mIGEgdXNlciBpcyBkaXNwbGF5ZWQpXG4gICAqL1xuICBASW5wdXQoKSB1c2VyPzogVXNlcjxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPjtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBhdmF0YXI6IGNoYW5uZWwgaWYgY2hhbm5lbCBhdmF0YXIgaXMgZGlzcGxheWVkLCB1c2VyIGlmIHVzZXIgYXZhdGFyIGlzIGRpc3BsYXllZFxuICAgKi9cbiAgQElucHV0KCkgdHlwZTogQXZhdGFyVHlwZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIElmIGEgY2hhbm5lbCBhdmF0YXIgaXMgZGlzcGxheWVkLCBhbmQgaWYgdGhlIGNoYW5uZWwgaGFzIGV4YWN0bHkgdHdvIG1lbWJlcnMgYSBncmVlbiBkb3QgaXMgZGlzcGxheWVkIGlmIHRoZSBvdGhlciBtZW1iZXIgaXMgb25saW5lLiBTZXQgdGhpcyBmbGFnIHRvIGBmYWxzZWAgdG8gdHVybiBvZmYgdGhpcyBiZWhhdmlvci5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dPbmxpbmVJbmRpY2F0b3IgPSB0cnVlO1xuICAvKipcbiAgICogSWYgY2hhbm5lbC91c2VyIGltYWdlIGlzbid0IHByb3ZpZGVkIHRoZSBpbml0aWFscyBvZiB0aGUgbmFtZSBvZiB0aGUgY2hhbm5lbC91c2VyIGlzIHNob3duIGluc3RlYWQsIHlvdSBjYW4gY2hvb3NlIGhvdyB0aGUgaW5pdGFscyBzaG91bGQgYmUgY29tcHV0ZWRcbiAgICovXG4gIEBJbnB1dCgpIGluaXRpYWxzVHlwZTpcbiAgICB8ICdmaXJzdC1sZXR0ZXItb2YtZmlyc3Qtd29yZCdcbiAgICB8ICdmaXJzdC1sZXR0ZXItb2YtZWFjaC13b3JkJyA9ICdmaXJzdC1sZXR0ZXItb2YtZmlyc3Qtd29yZCc7XG4gIGlzRXJyb3IgPSBmYWxzZTtcbiAgaXNPbmxpbmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc09ubGluZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgaW5pdGlhbHM6IHN0cmluZyA9ICcnO1xuICBmYWxsYmFja0NoYW5uZWxJbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHVzZXJJZD86IHN0cmluZztcbiAgcHJpdmF0ZSBpc1ZpZXdJbml0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS51c2VyJC5zdWJzY3JpYmUoKHUpID0+IHtcbiAgICAgICAgaWYgKHU/LmlkICE9PSB0aGlzLnVzZXJJZCkge1xuICAgICAgICAgIHRoaXMudXNlcklkID0gdT8uaWQ7XG4gICAgICAgICAgaWYgKHRoaXMudHlwZSB8fCB0aGlzLmNoYW5uZWwgfHwgdGhpcy5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxzKCk7XG4gICAgICAgICAgICB0aGlzLnNldEZhbGxiYWNrQ2hhbm5lbEltYWdlKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUlzT25saW5lU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ2NoYW5uZWwnXSkge1xuICAgICAgdGhpcy51cGRhdGVJc09ubGluZVN1YnNjcmlwdGlvbigpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy50eXBlIHx8IGNoYW5nZXMubmFtZSB8fCBjaGFuZ2VzLmNoYW5uZWwpIHtcbiAgICAgIHRoaXMuc2V0SW5pdGlhbHMoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy50eXBlIHx8IGNoYW5nZXMuY2hhbm5lbCkge1xuICAgICAgdGhpcy5zZXRGYWxsYmFja0NoYW5uZWxJbWFnZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RmFsbGJhY2tDaGFubmVsSW1hZ2UoKSB7XG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ2NoYW5uZWwnKSB7XG4gICAgICB0aGlzLmZhbGxiYWNrQ2hhbm5lbEltYWdlID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvdGhlck1lbWJlciA9IHRoaXMuZ2V0T3RoZXJNZW1iZXJJZk9uZVRvT25lQ2hhbm5lbCgpO1xuICAgICAgaWYgKG90aGVyTWVtYmVyKSB7XG4gICAgICAgIHRoaXMuZmFsbGJhY2tDaGFubmVsSW1hZ2UgPSBvdGhlck1lbWJlci5pbWFnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmFsbGJhY2tDaGFubmVsSW1hZ2UgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbml0aWFscygpIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSAnJztcbiAgICBpZiAodGhpcy50eXBlID09PSAndXNlcicpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMubmFtZT8udG9TdHJpbmcoKSB8fCAnJztcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ2NoYW5uZWwnKSB7XG4gICAgICBpZiAodGhpcy5jaGFubmVsPy5kYXRhPy5uYW1lKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuY2hhbm5lbD8uZGF0YT8ubmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG90aGVyTWVtYmVyID0gdGhpcy5nZXRPdGhlck1lbWJlcklmT25lVG9PbmVDaGFubmVsKCk7XG4gICAgICAgIGlmIChvdGhlck1lbWJlcikge1xuICAgICAgICAgIHJlc3VsdCA9IG90aGVyTWVtYmVyLm5hbWUgfHwgb3RoZXJNZW1iZXIuaWQgfHwgJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gJyMnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd29yZHMgPSByZXN1bHQuc3BsaXQoJyAnKTtcbiAgICBsZXQgaW5pdGlhbHM6IHN0cmluZztcbiAgICBpZiAodGhpcy5pbml0aWFsc1R5cGUgPT09ICdmaXJzdC1sZXR0ZXItb2YtZWFjaC13b3JkJykge1xuICAgICAgaW5pdGlhbHMgPSB3b3Jkcy5tYXAoKHcpID0+IHcuY2hhckF0KDApIHx8ICcnKS5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdGlhbHMgPSB3b3Jkc1swXS5jaGFyQXQoMCkgfHwgJyc7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbHMgPSBpbml0aWFscztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSXNPbmxpbmVTdWJzY3JpcHRpb24oKSB7XG4gICAgaWYgKHRoaXMuY2hhbm5lbCkge1xuICAgICAgY29uc3Qgb3RoZXJNZW1iZXIgPSB0aGlzLmdldE90aGVyTWVtYmVySWZPbmVUb09uZUNoYW5uZWwoKTtcbiAgICAgIGlmIChvdGhlck1lbWJlcikge1xuICAgICAgICB0aGlzLmlzT25saW5lID0gb3RoZXJNZW1iZXIub25saW5lIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmlzT25saW5lU3Vic2NyaXB0aW9uID0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5ldmVudHMkXG4gICAgICAgICAgLnBpcGUoZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3VzZXIucHJlc2VuY2UuY2hhbmdlZCcpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZXZlbnQudXNlcj8uaWQgPT09IG90aGVyTWVtYmVyLmlkKSB7XG4gICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09ubGluZSA9IGV2ZW50LmV2ZW50LnVzZXI/Lm9ubGluZSB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzT25saW5lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNPbmxpbmVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNPbmxpbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNPbmxpbmVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3SW5pdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3RoZXJNZW1iZXJJZk9uZVRvT25lQ2hhbm5lbCgpIHtcbiAgICBjb25zdCBvdGhlck1lbWJlcnMgPSBPYmplY3QudmFsdWVzKFxuICAgICAgdGhpcy5jaGFubmVsPy5zdGF0ZT8ubWVtYmVycyB8fCB7fVxuICAgICkuZmlsdGVyKChtKSA9PiBtLnVzZXJfaWQgIT09IHRoaXMudXNlcklkKTtcbiAgICBpZiAob3RoZXJNZW1iZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG90aGVyTWVtYmVyc1swXS51c2VyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInN0ci1jaGF0X19hdmF0YXIgc3RyLWNoYXRfX2F2YXRhci0tY2lyY2xlIHN0cmVhbS1jaGF0X19hdmF0YXItLXt7XG4gICAgbG9jYXRpb25cbiAgfX1cIlxuICB0aXRsZT1cInt7IG5hbWUgfX1cIlxuICBbbmdTdHlsZV09XCJ7XG4gICAgZmxleEJhc2lzOiAnY2FsYyh2YXIoLS1zdHItY2hhdF9fc3BhY2luZy1weCwgMXB4KSAqICcgKyBzaXplICsgJyknLFxuICAgIGZvbnRTaXplOlxuICAgICAgaW5pdGlhbHNUeXBlID09PSAnZmlyc3QtbGV0dGVyLW9mLWZpcnN0LXdvcmQnXG4gICAgICAgID8gJ2NhbGModmFyKC0tc3RyLWNoYXRfX3NwYWNpbmctcHgsIDFweCkgKiAnICsgc2l6ZSAvIDIgKyAnKSdcbiAgICAgICAgOiAnY2FsYyh2YXIoLS1zdHItY2hhdF9fc3BhY2luZy1weCwgMXB4KSAqICcgKyBzaXplIC8gMyArICcpJyxcbiAgICBoZWlnaHQ6ICdjYWxjKHZhcigtLXN0ci1jaGF0X19zcGFjaW5nLXB4LCAxcHgpICogJyArIHNpemUgKyAnKScsXG4gICAgbGluZUhlaWdodDogJ2NhbGModmFyKC0tc3RyLWNoYXRfX3NwYWNpbmctcHgsIDFweCkgKiAnICsgc2l6ZSArICcpJyxcbiAgICB3aWR0aDogJ2NhbGModmFyKC0tc3RyLWNoYXRfX3NwYWNpbmctcHgsIDFweCkgKiAnICsgc2l6ZSArICcpJ1xuICB9XCJcbj5cbiAgPGltZ1xuICAgICpuZ0lmPVwiKGltYWdlVXJsIHx8IGZhbGxiYWNrQ2hhbm5lbEltYWdlKSAmJiAhaXNFcnJvcjsgZWxzZSBmYWxsYmFja1wiXG4gICAgY2xhc3M9XCJzdHItY2hhdF9fYXZhdGFyLWltYWdlIHN0ci1jaGF0X19hdmF0YXItaW1hZ2VcIlxuICAgIGRhdGEtdGVzdGlkPVwiYXZhdGFyLWltZ1wiXG4gICAgZmV0Y2hwcmlvcml0eT1cImhpZ2hcIlxuICAgIHNyYz1cInt7IGltYWdlVXJsIHx8IGZhbGxiYWNrQ2hhbm5lbEltYWdlIH19XCJcbiAgICBhbHQ9XCJ7eyBpbml0aWFscyB9fVwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgZmxleEJhc2lzOiAnY2FsYyh2YXIoLS1zdHItY2hhdF9fc3BhY2luZy1weCwgMXB4KSAqICcgKyBzaXplICsgJyknLFxuICAgICAgaGVpZ2h0OiAnY2FsYyh2YXIoLS1zdHItY2hhdF9fc3BhY2luZy1weCwgMXB4KSAqICcgKyBzaXplICsgJyknLFxuICAgICAgb2JqZWN0Rml0OiAnY292ZXInLFxuICAgICAgd2lkdGg6ICdjYWxjKHZhcigtLXN0ci1jaGF0X19zcGFjaW5nLXB4LCAxcHgpICogJyArIHNpemUgKyAnKSdcbiAgICB9XCJcbiAgICAoZXJyb3IpPVwiaXNFcnJvciA9IHRydWVcIlxuICAvPlxuICA8bmctdGVtcGxhdGUgI2ZhbGxiYWNrPlxuICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJmYWxsYmFjay1pbWdcIiBjbGFzcz1cInN0ci1jaGF0X19hdmF0YXItZmFsbGJhY2tcIj5cbiAgICAgIHt7IGluaXRpYWxzIH19XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxkaXZcbiAgICAqbmdJZj1cImlzT25saW5lICYmIHNob3dPbmxpbmVJbmRpY2F0b3JcIlxuICAgIGRhdGEtdGVzdGlkPVwib25saW5lLWluZGljYXRvclwiXG4gICAgY2xhc3M9XCJzdHItY2hhdF9fYXZhdGFyLS1vbmxpbmUtaW5kaWNhdG9yXCJcbiAgPjwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,74 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../custom-templates.service";
4
+ import * as i2 from "@angular/common";
5
+ import * as i3 from "../avatar/avatar.component";
6
+ /**
7
+ * The `AvatarPlaceholder` component displays the [default avatar](./AvatarComponent.mdx) unless a [custom template](../services/CustomTemplatesService.mdx) is provided. This component is used by the SDK internally, you likely won't need to use it.
8
+ */
9
+ export class AvatarPlaceholderComponent {
10
+ constructor(customTemplatesService) {
11
+ this.customTemplatesService = customTemplatesService;
12
+ /**
13
+ * The size in pixels of the avatar image.
14
+ */
15
+ this.size = 32;
16
+ /**
17
+ * 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
18
+ */
19
+ this.initialsType = 'first-letter-of-first-word';
20
+ /**
21
+ * 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.
22
+ */
23
+ this.showOnlineIndicator = true;
24
+ this.context = {
25
+ name: undefined,
26
+ imageUrl: undefined,
27
+ size: undefined,
28
+ location: undefined,
29
+ channel: undefined,
30
+ user: undefined,
31
+ type: undefined,
32
+ initialsType: undefined,
33
+ showOnlineIndicator: undefined,
34
+ };
35
+ }
36
+ ngOnChanges() {
37
+ this.context = {
38
+ name: this.name,
39
+ imageUrl: this.imageUrl,
40
+ size: this.size,
41
+ location: this.location,
42
+ type: this.type,
43
+ user: this.user,
44
+ channel: this.channel,
45
+ initialsType: this.initialsType,
46
+ showOnlineIndicator: this.showOnlineIndicator,
47
+ };
48
+ }
49
+ }
50
+ AvatarPlaceholderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AvatarPlaceholderComponent, deps: [{ token: i1.CustomTemplatesService }], target: i0.ɵɵFactoryTarget.Component });
51
+ AvatarPlaceholderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: { name: "name", imageUrl: "imageUrl", size: "size", location: "location", channel: "channel", user: "user", type: "type", initialsType: "initialsType", showOnlineIndicator: "showOnlineIndicator" }, usesOnChanges: true, ngImport: i0, template: "<ng-template\n #defaultAvatar\n let-name=\"name\"\n let-imageUrl=\"imageUrl\"\n let-size=\"size\"\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 [size]=\"size\"\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", dependencies: [{ kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.AvatarComponent, selector: "stream-avatar", inputs: ["name", "imageUrl", "size", "location", "channel", "user", "type", "showOnlineIndicator", "initialsType"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] });
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AvatarPlaceholderComponent, decorators: [{
53
+ type: Component,
54
+ args: [{ selector: 'stream-avatar-placeholder', template: "<ng-template\n #defaultAvatar\n let-name=\"name\"\n let-imageUrl=\"imageUrl\"\n let-size=\"size\"\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 [size]=\"size\"\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" }]
55
+ }], ctorParameters: function () { return [{ type: i1.CustomTemplatesService }]; }, propDecorators: { name: [{
56
+ type: Input
57
+ }], imageUrl: [{
58
+ type: Input
59
+ }], size: [{
60
+ type: Input
61
+ }], location: [{
62
+ type: Input
63
+ }], channel: [{
64
+ type: Input
65
+ }], user: [{
66
+ type: Input
67
+ }], type: [{
68
+ type: Input
69
+ }], initialsType: [{
70
+ type: Input
71
+ }], showOnlineIndicator: [{
72
+ type: Input
73
+ }] } });
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLXBsYWNlaG9sZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdmF0YXItcGxhY2Vob2xkZXIvYXZhdGFyLXBsYWNlaG9sZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdmF0YXItcGxhY2Vob2xkZXIvYXZhdGFyLXBsYWNlaG9sZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDOzs7OztBQVU1RDs7R0FFRztBQU1ILE1BQU0sT0FBTywwQkFBMEI7SUFrRHJDLFlBQW1CLHNCQUE4QztRQUE5QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBekNqRTs7V0FFRztRQUNNLFNBQUksR0FBRyxFQUFFLENBQUM7UUFpQm5COztXQUVHO1FBQ00saUJBQVksR0FFYSw0QkFBNEIsQ0FBQztRQUMvRDs7V0FFRztRQUNNLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUNwQyxZQUFPLEdBQWtCO1lBQ3ZCLElBQUksRUFBRSxTQUFTO1lBQ2YsUUFBUSxFQUFFLFNBQVM7WUFDbkIsSUFBSSxFQUFFLFNBQVM7WUFDZixRQUFRLEVBQUUsU0FBUztZQUNuQixPQUFPLEVBQUUsU0FBUztZQUNsQixJQUFJLEVBQUUsU0FBUztZQUNmLElBQUksRUFBRSxTQUFTO1lBQ2YsWUFBWSxFQUFFLFNBQVM7WUFDdkIsbUJBQW1CLEVBQUUsU0FBUztTQUMvQixDQUFDO0lBQ2tFLENBQUM7SUFFckUsV0FBVztRQUNULElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtTQUM5QyxDQUFDO0lBQ0osQ0FBQzs7dUhBaEVVLDBCQUEwQjsyR0FBMUIsMEJBQTBCLG9TQ2xCdkMsMnZCQThCQTsyRkRaYSwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UsMkJBQTJCOzZHQVE1QixJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxPQUFPO3NCQUFmLEtBQUs7Z0JBSUcsSUFBSTtzQkFBWixLQUFLO2dCQUlHLElBQUk7c0JBQVosS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQU1HLG1CQUFtQjtzQkFBM0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhbm5lbCwgVXNlciB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuLi9jdXN0b20tdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQXZhdGFyQ29udGV4dCxcbiAgQXZhdGFyTG9jYXRpb24sXG4gIEF2YXRhclR5cGUsXG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG59IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgYEF2YXRhclBsYWNlaG9sZGVyYCBjb21wb25lbnQgZGlzcGxheXMgdGhlIFtkZWZhdWx0IGF2YXRhcl0oLi9BdmF0YXJDb21wb25lbnQubWR4KSB1bmxlc3MgYSBbY3VzdG9tIHRlbXBsYXRlXSguLi9zZXJ2aWNlcy9DdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1keCkgaXMgcHJvdmlkZWQuIFRoaXMgY29tcG9uZW50IGlzIHVzZWQgYnkgdGhlIFNESyBpbnRlcm5hbGx5LCB5b3UgbGlrZWx5IHdvbid0IG5lZWQgdG8gdXNlIGl0LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F2YXRhci1wbGFjZWhvbGRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIEF2YXRhclBsYWNlaG9sZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGltYWdlLCB1c2VkIGZvciBmYWxsYmFjayBpbWFnZSBvciBpbWFnZSB0aXRsZSAoaWYgYGltYWdlVXJsYCBpcyBwcm92aWRlZClcbiAgICovXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhlIGltYWdlIHRvIGJlIGRpc3BsYXllZC4gSWYgdGhlIGltYWdlIGNhbid0IGJlIGRpc3BsYXllZCB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBuYW1lIGlucHV0IGlzIGRpc3BsYXllZC5cbiAgICovXG4gIEBJbnB1dCgpIGltYWdlVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBpbiBwaXhlbHMgb2YgdGhlIGF2YXRhciBpbWFnZS5cbiAgICovXG4gIEBJbnB1dCgpIHNpemUgPSAzMjtcbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiB0aGUgYXZhdGFyIHdpbGwgYmUgZGlzcGxheWVkIGluXG4gICAqL1xuICBASW5wdXQoKSBsb2NhdGlvbjogQXZhdGFyTG9jYXRpb24gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgY2hhbm5lbCB0aGUgYXZhdGFyIGJlbG9uZ3MgdG8gKGlmIGF2YXRhciBvZiBhIGNoYW5uZWwgaXMgZGlzcGxheWVkKVxuICAgKi9cbiAgQElucHV0KCkgY2hhbm5lbD86IENoYW5uZWw8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz47XG4gIC8qKlxuICAgKiBUaGUgdXNlciB0aGUgYXZhdGFyIGJlbG9uZ3MgdG8gKGlmIGF2YXRhciBvZiBhIHVzZXIgaXMgZGlzcGxheWVkKVxuICAgKi9cbiAgQElucHV0KCkgdXNlcj86IFVzZXI8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz47XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgYXZhdGFyOiBjaGFubmVsIGlmIGNoYW5uZWwgYXZhdGFyIGlzIGRpc3BsYXllZCwgdXNlciBpZiB1c2VyIGF2YXRhciBpcyBkaXNwbGF5ZWRcbiAgICovXG4gIEBJbnB1dCgpIHR5cGU6IEF2YXRhclR5cGUgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBJZiBjaGFubmVsL3VzZXIgaW1hZ2UgaXNuJ3QgcHJvdmlkZWQgdGhlIGluaXRpYWxzIG9mIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsL3VzZXIgaXMgc2hvd24gaW5zdGVhZCwgeW91IGNhbiBjaG9vc2UgaG93IHRoZSBpbml0YWxzIHNob3VsZCBiZSBjb21wdXRlZFxuICAgKi9cbiAgQElucHV0KCkgaW5pdGlhbHNUeXBlOlxuICAgIHwgJ2ZpcnN0LWxldHRlci1vZi1maXJzdC13b3JkJ1xuICAgIHwgJ2ZpcnN0LWxldHRlci1vZi1lYWNoLXdvcmQnID0gJ2ZpcnN0LWxldHRlci1vZi1maXJzdC13b3JkJztcbiAgLyoqXG4gICAqIElmIGEgY2hhbm5lbCBhdmF0YXIgaXMgZGlzcGxheWVkLCBhbmQgaWYgdGhlIGNoYW5uZWwgaGFzIGV4YWN0bHkgdHdvIG1lbWJlcnMgYSBncmVlbiBkb3QgaXMgZGlzcGxheWVkIGlmIHRoZSBvdGhlciBtZW1iZXIgaXMgb25saW5lLiBTZXQgdGhpcyBmbGFnIHRvIGBmYWxzZWAgdG8gdHVybiBvZmYgdGhpcyBiZWhhdmlvci5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dPbmxpbmVJbmRpY2F0b3IgPSB0cnVlO1xuICBjb250ZXh0OiBBdmF0YXJDb250ZXh0ID0ge1xuICAgIG5hbWU6IHVuZGVmaW5lZCxcbiAgICBpbWFnZVVybDogdW5kZWZpbmVkLFxuICAgIHNpemU6IHVuZGVmaW5lZCxcbiAgICBsb2NhdGlvbjogdW5kZWZpbmVkLFxuICAgIGNoYW5uZWw6IHVuZGVmaW5lZCxcbiAgICB1c2VyOiB1bmRlZmluZWQsXG4gICAgdHlwZTogdW5kZWZpbmVkLFxuICAgIGluaXRpYWxzVHlwZTogdW5kZWZpbmVkLFxuICAgIHNob3dPbmxpbmVJbmRpY2F0b3I6IHVuZGVmaW5lZCxcbiAgfTtcbiAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UpIHt9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0ID0ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgaW1hZ2VVcmw6IHRoaXMuaW1hZ2VVcmwsXG4gICAgICBzaXplOiB0aGlzLnNpemUsXG4gICAgICBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbixcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHVzZXI6IHRoaXMudXNlcixcbiAgICAgIGNoYW5uZWw6IHRoaXMuY2hhbm5lbCxcbiAgICAgIGluaXRpYWxzVHlwZTogdGhpcy5pbml0aWFsc1R5cGUsXG4gICAgICBzaG93T25saW5lSW5kaWNhdG9yOiB0aGlzLnNob3dPbmxpbmVJbmRpY2F0b3IsXG4gICAgfTtcbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlXG4gICNkZWZhdWx0QXZhdGFyXG4gIGxldC1uYW1lPVwibmFtZVwiXG4gIGxldC1pbWFnZVVybD1cImltYWdlVXJsXCJcbiAgbGV0LXNpemU9XCJzaXplXCJcbiAgbGV0LXR5cGU9XCJ0eXBlXCJcbiAgbGV0LWNoYW5uZWw9XCJjaGFubmVsXCJcbiAgbGV0LXVzZXI9XCJ1c2VyXCJcbiAgbGV0LWxvY2F0aW9uPVwibG9jYXRpb25cIlxuICBsZXQtaW5pdGlhbHNUeXBlPVwiaW5pdGlhbHNUeXBlXCJcbiAgbGV0LXNob3dPbmxpbmVJbmRpY2F0b3I9XCJzaG93T25saW5lSW5kaWNhdG9yXCJcbj5cbiAgPHN0cmVhbS1hdmF0YXJcbiAgICBbbmFtZV09XCJuYW1lXCJcbiAgICBbaW1hZ2VVcmxdPVwiaW1hZ2VVcmxcIlxuICAgIFtzaXplXT1cInNpemVcIlxuICAgIFt0eXBlXT1cInR5cGVcIlxuICAgIFtjaGFubmVsXT1cImNoYW5uZWxcIlxuICAgIFt1c2VyXT1cInVzZXJcIlxuICAgIFtsb2NhdGlvbl09XCJsb2NhdGlvblwiXG4gICAgW2luaXRpYWxzVHlwZV09XCJpbml0aWFsc1R5cGVcIlxuICAgIFtzaG93T25saW5lSW5kaWNhdG9yXT1cInNob3dPbmxpbmVJbmRpY2F0b3JcIlxuICA+PC9zdHJlYW0tYXZhdGFyPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy1jb250YWluZXJcbiAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5hdmF0YXJUZW1wbGF0ZSQgfCBhc3luYykgfHwgZGVmYXVsdEF2YXRhcjtcbiAgICBjb250ZXh0OiBjb250ZXh0XG4gIFwiXG4+PC9uZy1jb250YWluZXI+XG4iXX0=