stream-chat-angular 3.1.0 → 3.2.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.
@@ -17,7 +17,7 @@ import transliterate from '@stream-io/transliterate';
17
17
  import * as i7 from 'angular-mentions';
18
18
  import { MentionModule } from 'angular-mentions';
19
19
 
20
- const version = '3.1.0';
20
+ const version = '3.2.2';
21
21
 
22
22
  /**
23
23
  * The `NotificationService` can be used to add or remove notifications. By default the [`NotificationList`](../components/NotificationListComponent.mdx) component displays the currently active notifications.
@@ -327,7 +327,7 @@ class ChannelService {
327
327
  this.latestMessageDateByUserByChannelsSubject.asObservable();
328
328
  }
329
329
  /**
330
- * Sets the given `channel` as active.
330
+ * Sets the given `channel` as active and marks it as read.
331
331
  * @param channel
332
332
  */
333
333
  setAsActiveChannel(channel) {
@@ -427,7 +427,7 @@ class ChannelService {
427
427
  });
428
428
  }
429
429
  /**
430
- * Queries the channels with the given filters, sorts and options. More info about [channel querying](https://getstream.io/chat/docs/javascript/query_channels/?language=javascript) can be found in the platform documentation.
430
+ * Queries the channels with the given filters, sorts and options. More info about [channel querying](https://getstream.io/chat/docs/javascript/query_channels/?language=javascript) can be found in the platform documentation. By default the first channel in the list will be set as active channel and will be marked as read.
431
431
  * @param filters
432
432
  * @param sort
433
433
  * @param options
@@ -2529,6 +2529,10 @@ class MessageInputComponent {
2529
2529
  return !!this.message;
2530
2530
  }
2531
2531
  initTextarea() {
2532
+ // cleanup previously built textarea
2533
+ if (!this.canSendMessages) {
2534
+ this.textareaRef = undefined;
2535
+ }
2532
2536
  if (!this.canSendMessages || this.textareaRef || !this.textareaAnchor) {
2533
2537
  return;
2534
2538
  }
@@ -2906,6 +2910,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
2906
2910
  }]
2907
2911
  }], ctorParameters: function () { return [{ type: ChannelService }]; } });
2908
2912
 
2913
+ const listUsers = (users) => {
2914
+ let outStr = '';
2915
+ const slicedArr = users.map((item) => item.name || item.id).slice(0, 5);
2916
+ const restLength = users.length - slicedArr.length;
2917
+ const commaSeparatedUsers = slicedArr.join(', ');
2918
+ outStr = commaSeparatedUsers;
2919
+ if (restLength > 0) {
2920
+ outStr += ` +${restLength}`;
2921
+ }
2922
+ return outStr;
2923
+ };
2924
+
2925
+ const getChannelDisplayText = (channel, currentUser) => {
2926
+ var _a;
2927
+ if ((_a = channel.data) === null || _a === void 0 ? void 0 : _a.name) {
2928
+ return channel.data.name;
2929
+ }
2930
+ if (channel.state.members && Object.keys(channel.state.members).length > 0) {
2931
+ const members = Object.values(channel.state.members)
2932
+ .map((m) => m.user || { id: m.user_id })
2933
+ .filter((m) => m.id !== currentUser.id);
2934
+ return listUsers(members);
2935
+ }
2936
+ return channel.id;
2937
+ };
2938
+
2909
2939
  const getDeviceWidth = () => {
2910
2940
  const width = window.innerWidth;
2911
2941
  if (width < 768)
@@ -2990,11 +3020,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
2990
3020
  * The `ChannelHeader` component displays the avatar and name of the currently active channel along with member and watcher information. You can read about [the difference between members and watchers](https://getstream.io/chat/docs/javascript/watch_channel/?language=javascript#watchers-vs-members) in the platform documentation. Please note that number of watchers is only displayed if the user has [`connect-events` capability](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript)
2991
3021
  */
2992
3022
  class ChannelHeaderComponent {
2993
- constructor(channelService, channelListToggleService, customTemplatesService, cdRef) {
3023
+ constructor(channelService, channelListToggleService, customTemplatesService, cdRef, chatClientService) {
2994
3024
  this.channelService = channelService;
2995
3025
  this.channelListToggleService = channelListToggleService;
2996
3026
  this.customTemplatesService = customTemplatesService;
2997
3027
  this.cdRef = cdRef;
3028
+ this.chatClientService = chatClientService;
2998
3029
  this.subscriptions = [];
2999
3030
  this.channelService.activeChannel$.subscribe((c) => {
3000
3031
  var _a, _b;
@@ -3031,9 +3062,26 @@ class ChannelHeaderComponent {
3031
3062
  var _a, _b;
3032
3063
  return { watcherCount: ((_b = (_a = this.activeChannel) === null || _a === void 0 ? void 0 : _a.state) === null || _b === void 0 ? void 0 : _b.watcher_count) || 0 };
3033
3064
  }
3065
+ get displayText() {
3066
+ if (!this.activeChannel) {
3067
+ return '';
3068
+ }
3069
+ return getChannelDisplayText(this.activeChannel, this.chatClientService.chatClient.user);
3070
+ }
3071
+ get avatarName() {
3072
+ var _a, _b, _c, _d, _e, _f, _g;
3073
+ if ((_b = (_a = this.activeChannel) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.name) {
3074
+ return (_d = (_c = this.activeChannel) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.name;
3075
+ }
3076
+ const otherMembers = Object.values(((_e = this.activeChannel) === null || _e === void 0 ? void 0 : _e.state.members) || {}).filter((m) => m.user_id !== this.chatClientService.chatClient.user.id);
3077
+ if (otherMembers.length === 1) {
3078
+ return ((_f = otherMembers[0].user) === null || _f === void 0 ? void 0 : _f.name) || ((_g = otherMembers[0].user) === null || _g === void 0 ? void 0 : _g.name);
3079
+ }
3080
+ return '#';
3081
+ }
3034
3082
  }
3035
- ChannelHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChannelHeaderComponent, deps: [{ token: ChannelService }, { token: ChannelListToggleService }, { token: CustomTemplatesService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
3036
- ChannelHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelHeaderComponent, selector: "stream-channel-header", ngImport: i0, template: "<div class=\"str-chat__header-livestream\">\n <div\n class=\"str-chat__header-hamburger\"\n (click)=\"toggleMenu($event)\"\n (keyup.enter)=\"toggleMenu($event)\"\n >\n <stream-icon-placeholder icon=\"menu\"></stream-icon-placeholder>\n </div>\n <stream-avatar-placeholder\n imageUrl=\"{{ activeChannel?.data?.image }}\"\n name=\"{{ activeChannel?.data?.name }}\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__header-livestream-left\">\n <p data-testid=\"name\" class=\"str-chat__header-livestream-left--title\">\n {{ activeChannel?.data?.name }}\n </p>\n <p data-testid=\"info\" class=\"str-chat__header-livestream-left--members\">\n {{'streamChat.{{ memberCount }} members' | translate:memberCountParam}}\n {{canReceiveConnectEvents ? ('streamChat.{{ watcherCount }} online' |\n translate:watcherCountParam) : ''}}\n </p>\n </div>\n <ng-container *ngIf=\"channelActionsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n channelActionsTemplate;\n context: getChannelActionsContext()\n \"\n ></ng-container>\n </ng-container>\n</div>\n", components: [{ type: IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "translate": i9.TranslatePipe } });
3083
+ ChannelHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChannelHeaderComponent, deps: [{ token: ChannelService }, { token: ChannelListToggleService }, { token: CustomTemplatesService }, { token: i0.ChangeDetectorRef }, { token: ChatClientService }], target: i0.ɵɵFactoryTarget.Component });
3084
+ ChannelHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelHeaderComponent, selector: "stream-channel-header", ngImport: i0, template: "<div class=\"str-chat__header-livestream\">\n <div\n class=\"str-chat__header-hamburger\"\n (click)=\"toggleMenu($event)\"\n (keyup.enter)=\"toggleMenu($event)\"\n >\n <stream-icon-placeholder icon=\"menu\"></stream-icon-placeholder>\n </div>\n <stream-avatar-placeholder\n imageUrl=\"{{ activeChannel?.data?.image }}\"\n name=\"{{ avatarName }}\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__header-livestream-left\">\n <p data-testid=\"name\" class=\"str-chat__header-livestream-left--title\">\n {{ displayText }}\n </p>\n <p data-testid=\"info\" class=\"str-chat__header-livestream-left--members\">\n {{'streamChat.{{ memberCount }} members' | translate:memberCountParam}}\n {{canReceiveConnectEvents ? ('streamChat.{{ watcherCount }} online' |\n translate:watcherCountParam) : ''}}\n </p>\n </div>\n <ng-container *ngIf=\"channelActionsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n channelActionsTemplate;\n context: getChannelActionsContext()\n \"\n ></ng-container>\n </ng-container>\n</div>\n", components: [{ type: IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "translate": i9.TranslatePipe } });
3037
3085
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChannelHeaderComponent, decorators: [{
3038
3086
  type: Component,
3039
3087
  args: [{
@@ -3041,18 +3089,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
3041
3089
  templateUrl: './channel-header.component.html',
3042
3090
  styles: [],
3043
3091
  }]
3044
- }], ctorParameters: function () { return [{ type: ChannelService }, { type: ChannelListToggleService }, { type: CustomTemplatesService }, { type: i0.ChangeDetectorRef }]; } });
3092
+ }], ctorParameters: function () { return [{ type: ChannelService }, { type: ChannelListToggleService }, { type: CustomTemplatesService }, { type: i0.ChangeDetectorRef }, { type: ChatClientService }]; } });
3045
3093
 
3046
3094
  /**
3047
3095
  * The `ChannelPreview` component displays a channel preview in the channel list, it consists of the image, name and latest message of the channel.
3048
3096
  */
3049
3097
  class ChannelPreviewComponent {
3050
- constructor(channelService, ngZone) {
3098
+ constructor(channelService, ngZone, chatClientService) {
3051
3099
  this.channelService = channelService;
3052
3100
  this.ngZone = ngZone;
3101
+ this.chatClientService = chatClientService;
3053
3102
  this.isActive = false;
3054
3103
  this.isUnread = false;
3055
- this.latestMessage = 'Nothing yet...';
3104
+ this.latestMessage = 'streamChat.Nothing yet...';
3056
3105
  this.subscriptions = [];
3057
3106
  this.canSendReadEvents = true;
3058
3107
  }
@@ -3083,12 +3132,21 @@ class ChannelPreviewComponent {
3083
3132
  return (_b = (_a = this.channel) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.image;
3084
3133
  }
3085
3134
  get avatarName() {
3086
- var _a, _b;
3087
- return (_b = (_a = this.channel) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.name;
3135
+ var _a, _b, _c, _d, _e, _f, _g;
3136
+ if ((_b = (_a = this.channel) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.name) {
3137
+ return (_d = (_c = this.channel) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.name;
3138
+ }
3139
+ const otherMembers = Object.values(((_e = this.channel) === null || _e === void 0 ? void 0 : _e.state.members) || {}).filter((m) => m.user_id !== this.chatClientService.chatClient.user.id);
3140
+ if (otherMembers.length === 1) {
3141
+ return ((_f = otherMembers[0].user) === null || _f === void 0 ? void 0 : _f.name) || ((_g = otherMembers[0].user) === null || _g === void 0 ? void 0 : _g.name);
3142
+ }
3143
+ return '#';
3088
3144
  }
3089
3145
  get title() {
3090
- var _a, _b;
3091
- return (_b = (_a = this.channel) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.name;
3146
+ if (!this.channel) {
3147
+ return '';
3148
+ }
3149
+ return getChannelDisplayText(this.channel, this.chatClientService.chatClient.user);
3092
3150
  }
3093
3151
  setAsActiveChannel() {
3094
3152
  void this.channelService.setAsActiveChannel(this.channel);
@@ -3097,7 +3155,7 @@ class ChannelPreviewComponent {
3097
3155
  this.ngZone.run(() => {
3098
3156
  var _a, _b, _c;
3099
3157
  if (((_a = this.channel) === null || _a === void 0 ? void 0 : _a.state.messages.length) === 0) {
3100
- this.latestMessage = 'Nothing yet...';
3158
+ this.latestMessage = 'streamChat.Nothing yet...';
3101
3159
  return;
3102
3160
  }
3103
3161
  if (!event.message ||
@@ -3120,8 +3178,8 @@ class ChannelPreviewComponent {
3120
3178
  }
3121
3179
  }
3122
3180
  }
3123
- ChannelPreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChannelPreviewComponent, deps: [{ token: ChannelService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
3124
- ChannelPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelPreviewComponent, selector: "stream-channel-preview", inputs: { channel: "channel" }, ngImport: i0, template: "<button\n class=\"str-chat__channel-preview-messenger\"\n [class.str-chat__channel-preview-messenger--active]=\"isActive\"\n [class.str-chat__channel-preview-messenger--unread]=\"isUnread\"\n (click)=\"setAsActiveChannel()\"\n data-testid=\"channel-preview-container\"\n>\n <div class=\"str-chat__channel-preview-messenger--left\">\n <stream-avatar-placeholder\n imageUrl=\"{{ avatarImage }}\"\n name=\"{{ avatarName }}\"\n [size]=\"40\"\n ></stream-avatar-placeholder>\n </div>\n <div class=\"str-chat__channel-preview-messenger--right\">\n <div class=\"str-chat__channel-preview-messenger--name\">\n <span data-testid=\"channel-preview-title\">{{ title }}</span>\n </div>\n <div\n data-testid=\"latest-message\"\n class=\"str-chat__channel-preview-messenger--last-message\"\n >\n {{ latestMessage | translate }}\n </div>\n </div>\n</button>\n", components: [{ type: AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size"] }], pipes: { "translate": i9.TranslatePipe } });
3181
+ ChannelPreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChannelPreviewComponent, deps: [{ token: ChannelService }, { token: i0.NgZone }, { token: ChatClientService }], target: i0.ɵɵFactoryTarget.Component });
3182
+ ChannelPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelPreviewComponent, selector: "stream-channel-preview", inputs: { channel: "channel" }, ngImport: i0, template: "<button\n class=\"str-chat__channel-preview-messenger\"\n [class.str-chat__channel-preview-messenger--active]=\"isActive\"\n [class.str-chat__channel-preview-messenger--unread]=\"isUnread\"\n (click)=\"setAsActiveChannel()\"\n data-testid=\"channel-preview-container\"\n>\n <div class=\"str-chat__channel-preview-messenger--left\">\n <stream-avatar-placeholder\n imageUrl=\"{{ avatarImage }}\"\n name=\"{{ avatarName }}\"\n [size]=\"40\"\n ></stream-avatar-placeholder>\n </div>\n <div class=\"str-chat__channel-preview-messenger--right\">\n <div\n style=\"position: relative\"\n class=\"str-chat__channel-preview-messenger--name\"\n >\n <span data-testid=\"channel-preview-title\">{{ title }}</span>\n </div>\n <div\n data-testid=\"latest-message\"\n class=\"str-chat__channel-preview-messenger--last-message\"\n >\n {{ latestMessage | translate }}\n </div>\n </div>\n</button>\n", components: [{ type: AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size"] }], pipes: { "translate": i9.TranslatePipe } });
3125
3183
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChannelPreviewComponent, decorators: [{
3126
3184
  type: Component,
3127
3185
  args: [{
@@ -3129,7 +3187,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
3129
3187
  templateUrl: './channel-preview.component.html',
3130
3188
  styles: [],
3131
3189
  }]
3132
- }], ctorParameters: function () { return [{ type: ChannelService }, { type: i0.NgZone }]; }, propDecorators: { channel: [{
3190
+ }], ctorParameters: function () { return [{ type: ChannelService }, { type: i0.NgZone }, { type: ChatClientService }]; }, propDecorators: { channel: [{
3133
3191
  type: Input
3134
3192
  }] } });
3135
3193
 
@@ -3195,35 +3253,6 @@ const parseDate = (date) => {
3195
3253
  return parsedTime.calendar();
3196
3254
  };
3197
3255
 
3198
- const getReadByText = (users) => {
3199
- let outStr = '';
3200
- const slicedArr = users.map((item) => item.name || item.id).slice(0, 5);
3201
- const restLength = users.length - slicedArr.length;
3202
- if (slicedArr.length === 1) {
3203
- outStr = `${slicedArr[0]} `;
3204
- }
3205
- else if (slicedArr.length === 2) {
3206
- // joins all with "and" but =no commas
3207
- // example: "bob and sam"
3208
- outStr = `${slicedArr[0]} and ${slicedArr[1]}`;
3209
- }
3210
- else if (slicedArr.length > 2) {
3211
- // joins all with commas, but last one gets ", and" (oxford comma!)
3212
- // example: "bob, joe, sam and 4 more"
3213
- if (restLength === 0) {
3214
- // mutate slicedArr to remove last user to display it separately
3215
- const lastUser = slicedArr.splice(slicedArr.length - 2, 1)[0];
3216
- const commaSeparatedUsers = slicedArr.join(', ');
3217
- outStr = `${commaSeparatedUsers}, and ${lastUser}`;
3218
- }
3219
- else {
3220
- const commaSeparatedUsers = slicedArr.join(', ');
3221
- outStr = `${commaSeparatedUsers} and ${restLength} more`;
3222
- }
3223
- }
3224
- return outStr;
3225
- };
3226
-
3227
3256
  const emojiReactionsMapping = {
3228
3257
  like: '👍',
3229
3258
  angry: '😠',
@@ -3421,7 +3450,7 @@ class MessageComponent {
3421
3450
  return ((_b = (_a = this.message) === null || _a === void 0 ? void 0 : _a.user) === null || _b === void 0 ? void 0 : _b.id) === ((_c = this.user) === null || _c === void 0 ? void 0 : _c.id);
3422
3451
  }
3423
3452
  get readByText() {
3424
- return getReadByText(this.message.readBy);
3453
+ return listUsers(this.message.readBy);
3425
3454
  }
3426
3455
  get lastReadUser() {
3427
3456
  var _a;
@@ -4424,5 +4453,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
4424
4453
  * Generated bundle index. Do not edit.
4425
4454
  */
4426
4455
 
4427
- export { AttachmentListComponent, AttachmentPreviewListComponent, AttachmentService, AutocompleteTextareaComponent, AvatarComponent, AvatarPlaceholderComponent, ChannelComponent, ChannelHeaderComponent, ChannelListComponent, ChannelListToggleService, ChannelPreviewComponent, ChannelService, ChatClientService, CustomTemplatesService, EmojiInputService, IconComponent, IconPlaceholderComponent, ImageLoadService, LoadingIndicatorComponent, LoadingIndicatorPlaceholderComponent, MessageActionsBoxComponent, MessageComponent, MessageInputComponent, MessageInputConfigService, MessageListComponent, MessageReactionsComponent, ModalComponent, NotificationComponent, NotificationListComponent, NotificationService, StreamAutocompleteTextareaModule, StreamAvatarModule, StreamChatModule, StreamI18nService, StreamTextareaModule, TextareaComponent, TextareaDirective, ThemeService, ThreadComponent, TransliterationService, createMessagePreview, getDeviceWidth, getGroupStyles, getReadBy, getReadByText, isImageAttachment, isImageFile, parseDate, textareaInjectionToken };
4456
+ export { AttachmentListComponent, AttachmentPreviewListComponent, AttachmentService, AutocompleteTextareaComponent, AvatarComponent, AvatarPlaceholderComponent, ChannelComponent, ChannelHeaderComponent, ChannelListComponent, ChannelListToggleService, ChannelPreviewComponent, ChannelService, ChatClientService, CustomTemplatesService, EmojiInputService, IconComponent, IconPlaceholderComponent, ImageLoadService, LoadingIndicatorComponent, LoadingIndicatorPlaceholderComponent, MessageActionsBoxComponent, MessageComponent, MessageInputComponent, MessageInputConfigService, MessageListComponent, MessageReactionsComponent, ModalComponent, NotificationComponent, NotificationListComponent, NotificationService, StreamAutocompleteTextareaModule, StreamAvatarModule, StreamChatModule, StreamI18nService, StreamTextareaModule, TextareaComponent, TextareaDirective, ThemeService, ThreadComponent, TransliterationService, createMessagePreview, getDeviceWidth, getGroupStyles, getReadBy, isImageAttachment, isImageFile, listUsers, parseDate, textareaInjectionToken };
4428
4457
  //# sourceMappingURL=stream-chat-angular.js.map