stream-chat-angular 2.20.2 → 3.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -12
- package/assets/version.d.ts +1 -1
- package/bundles/stream-chat-angular.umd.js +780 -534
- package/bundles/stream-chat-angular.umd.js.map +1 -1
- package/esm2015/assets/version.js +2 -2
- package/esm2015/lib/attachment-list/attachment-list.component.js +27 -15
- package/esm2015/lib/attachment-preview-list/attachment-preview-list.component.js +28 -22
- package/esm2015/lib/attachment.service.js +11 -5
- package/esm2015/lib/avatar-placeholder/avatar-placeholder.component.js +41 -0
- package/esm2015/lib/channel-header/channel-header.component.js +26 -12
- package/esm2015/lib/channel-list/channel-list.component.js +23 -13
- package/esm2015/lib/channel-preview/channel-preview.component.js +3 -3
- package/esm2015/lib/channel.service.js +28 -35
- package/esm2015/lib/chat-client.service.js +5 -4
- package/esm2015/lib/custom-templates.service.js +139 -0
- package/esm2015/lib/icon-placeholder/icon-placeholder.component.js +34 -0
- package/esm2015/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.js +42 -0
- package/esm2015/lib/message/message.component.js +74 -29
- package/esm2015/lib/message-actions-box/message-actions-box.component.js +114 -99
- package/esm2015/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.js +13 -13
- package/esm2015/lib/message-input/message-input-config.service.js +1 -1
- package/esm2015/lib/message-input/message-input.component.js +56 -45
- package/esm2015/lib/message-input/textarea.directive.js +2 -18
- package/esm2015/lib/message-input/textarea.interface.js +1 -1
- package/esm2015/lib/message-list/message-list.component.js +32 -93
- package/esm2015/lib/message-preview.js +4 -17
- package/esm2015/lib/message-reactions/message-reactions.component.js +3 -3
- package/esm2015/lib/modal/modal.component.js +9 -6
- package/esm2015/lib/notification/notification.component.js +5 -2
- package/esm2015/lib/notification-list/notification-list.component.js +12 -10
- package/esm2015/lib/read-by.js +1 -1
- package/esm2015/lib/stream-avatar.module.js +5 -4
- package/esm2015/lib/stream-chat.module.js +13 -3
- package/esm2015/lib/thread/thread.component.js +19 -11
- package/esm2015/lib/types.js +1 -1
- package/esm2015/public-api.js +5 -1
- package/fesm2015/stream-chat-angular.js +723 -449
- package/fesm2015/stream-chat-angular.js.map +1 -1
- package/lib/attachment-list/attachment-list.component.d.ts +12 -8
- package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +17 -7
- package/lib/attachment.service.d.ts +1 -1
- package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +25 -0
- package/lib/channel-header/channel-header.component.d.ts +15 -12
- package/lib/channel-list/channel-list.component.d.ts +14 -11
- package/lib/channel-preview/channel-preview.component.d.ts +3 -2
- package/lib/channel.service.d.ts +32 -31
- package/lib/chat-client.service.d.ts +12 -11
- package/lib/custom-templates.service.d.ts +132 -0
- package/lib/icon-placeholder/icon-placeholder.component.d.ts +22 -0
- package/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +21 -0
- package/lib/message/message.component.d.ts +42 -30
- package/lib/message-actions-box/message-actions-box.component.d.ts +22 -26
- package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +7 -11
- package/lib/message-input/message-input-config.service.d.ts +0 -19
- package/lib/message-input/message-input.component.d.ts +40 -26
- package/lib/message-input/textarea.directive.d.ts +3 -6
- package/lib/message-input/textarea.interface.d.ts +1 -4
- package/lib/message-list/group-styles.d.ts +1 -1
- package/lib/message-list/message-list.component.d.ts +10 -34
- package/lib/message-preview.d.ts +2 -1
- package/lib/message-reactions/message-reactions.component.d.ts +4 -5
- package/lib/modal/modal.component.d.ts +7 -3
- package/lib/notification/notification.component.d.ts +6 -1
- package/lib/notification-list/notification-list.component.d.ts +4 -2
- package/lib/read-by.d.ts +2 -1
- package/lib/stream-avatar.module.d.ts +4 -3
- package/lib/stream-chat.module.d.ts +6 -4
- package/lib/thread/thread.component.d.ts +6 -3
- package/lib/types.d.ts +115 -9
- package/package.json +2 -3
- package/public-api.d.ts +4 -0
- package/src/assets/styles/assets/EmojiOneColor.woff2 +0 -0
- package/src/assets/styles/assets/NotoColorEmoji-flags.woff2 +0 -0
- package/src/assets/styles/assets/Poweredby_100px-White_VertText.png +0 -0
- package/src/assets/styles/assets/str-chat__reaction-list-sprite@1x.png +0 -0
- package/src/assets/styles/assets/str-chat__reaction-list-sprite@2x.png +0 -0
- package/src/assets/styles/assets/str-chat__reaction-list-sprite@3x.png +0 -0
- package/src/assets/styles/css/index.css +1 -0
- package/src/assets/styles/css/index.css.map +1 -0
- package/src/assets/styles/scss/ActionsBox.scss +56 -0
- package/src/assets/styles/scss/Attachment.scss +227 -0
- package/src/assets/styles/scss/AttachmentActions.scss +44 -0
- package/src/assets/styles/scss/Audio.scss +112 -0
- package/src/assets/styles/scss/Avatar.scss +79 -0
- package/src/assets/styles/scss/Card.scss +100 -0
- package/src/assets/styles/scss/ChannelHeader.scss +284 -0
- package/src/assets/styles/scss/ChannelList.scss +117 -0
- package/src/assets/styles/scss/ChannelListMessenger.scss +9 -0
- package/src/assets/styles/scss/ChannelPreview.scss +108 -0
- package/src/assets/styles/scss/ChannelSearch.scss +111 -0
- package/src/assets/styles/scss/ChatDown.scss +15 -0
- package/src/assets/styles/scss/DateSeparator.scss +51 -0
- package/src/assets/styles/scss/EditMessageForm.scss +112 -0
- package/src/assets/styles/scss/EventComponent.scss +48 -0
- package/src/assets/styles/scss/Gallery.scss +135 -0
- package/src/assets/styles/scss/InfiniteScrollPaginator.scss +6 -0
- package/src/assets/styles/scss/LoadMoreButton.scss +44 -0
- package/src/assets/styles/scss/LoadingChannels.scss +70 -0
- package/src/assets/styles/scss/LoadingIndicator.scss +38 -0
- package/src/assets/styles/scss/Message.scss +1261 -0
- package/src/assets/styles/scss/MessageActions.scss +112 -0
- package/src/assets/styles/scss/MessageCommerce.scss +564 -0
- package/src/assets/styles/scss/MessageInput.scss +385 -0
- package/src/assets/styles/scss/MessageInputFlat.scss +305 -0
- package/src/assets/styles/scss/MessageList.scss +203 -0
- package/src/assets/styles/scss/MessageLivestream.scss +325 -0
- package/src/assets/styles/scss/MessageNotification.scss +49 -0
- package/src/assets/styles/scss/MessageRepliesCountButton.scss +33 -0
- package/src/assets/styles/scss/MessageTeam.scss +617 -0
- package/src/assets/styles/scss/Modal.scss +77 -0
- package/src/assets/styles/scss/ReactionList.scss +183 -0
- package/src/assets/styles/scss/ReactionSelector.scss +212 -0
- package/src/assets/styles/scss/SendButton.scss +14 -0
- package/src/assets/styles/scss/SimpleReactionsList.scss +76 -0
- package/src/assets/styles/scss/SmallMessageInput.scss +172 -0
- package/src/assets/styles/scss/Thread.scss +306 -0
- package/src/assets/styles/scss/Tooltip.scss +38 -0
- package/src/assets/styles/scss/TypingIndicator.scss +75 -0
- package/src/assets/styles/scss/VirtualMessage.scss +291 -0
- package/src/assets/styles/scss/_base.scss +206 -0
- package/src/assets/styles/scss/_variables.scss +158 -0
- package/src/assets/styles/scss/index.scss +50 -0
- package/src/assets/styles/scss/vendor/emoji-mart.scss +495 -0
- package/src/assets/styles/scss/vendor/mml-react.scss +1749 -0
- package/src/assets/styles/scss/vendor/react-file-utils.scss +378 -0
- package/src/assets/styles/scss/vendor/react-image-gallery.scss +224 -0
- package/src/assets/version.ts +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
2
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs'), require('stream-chat'), require('rxjs/operators'), require('uuid'), require('@ngx-translate/core'), require('@angular/common'), require('pretty-bytes'), require('dayjs'), require('dayjs/plugin/calendar'), require('emoji-regex'), require('@stream-io/transliterate'), require('angular-mentions')) :
|
|
3
3
|
typeof define === 'function' && define.amd ? define('stream-chat-angular', ['exports', '@angular/core', 'rxjs', 'stream-chat', 'rxjs/operators', 'uuid', '@ngx-translate/core', '@angular/common', 'pretty-bytes', 'dayjs', 'dayjs/plugin/calendar', 'emoji-regex', '@stream-io/transliterate', 'angular-mentions'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['stream-chat-angular'] = {}, global.ng.core, global.rxjs, global.streamChat, global.rxjs.operators, global.uuid, global.i2, global.ng.common, global.prettybytes, global.Dayjs, global.calendar, global.emojiRegex, global.transliterate, global.
|
|
5
|
-
}(this, (function (exports, i0, rxjs, streamChat, operators, uuid, i2,
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['stream-chat-angular'] = {}, global.ng.core, global.rxjs, global.streamChat, global.rxjs.operators, global.uuid, global.i2, global.ng.common, global.prettybytes, global.Dayjs, global.calendar, global.emojiRegex, global.transliterate, global.i7));
|
|
5
|
+
}(this, (function (exports, i0, rxjs, streamChat, operators, uuid, i2, i3, prettybytes, Dayjs, calendar, emojiRegex, transliterate, i7) { 'use strict';
|
|
6
6
|
|
|
7
7
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
8
8
|
|
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
|
|
29
29
|
var i0__namespace = /*#__PURE__*/_interopNamespace(i0);
|
|
30
30
|
var i2__namespace = /*#__PURE__*/_interopNamespace(i2);
|
|
31
|
-
var
|
|
31
|
+
var i3__namespace = /*#__PURE__*/_interopNamespace(i3);
|
|
32
32
|
var prettybytes__default = /*#__PURE__*/_interopDefaultLegacy(prettybytes);
|
|
33
33
|
var Dayjs__default = /*#__PURE__*/_interopDefaultLegacy(Dayjs);
|
|
34
34
|
var calendar__default = /*#__PURE__*/_interopDefaultLegacy(calendar);
|
|
35
35
|
var emojiRegex__default = /*#__PURE__*/_interopDefaultLegacy(emojiRegex);
|
|
36
36
|
var transliterate__default = /*#__PURE__*/_interopDefaultLegacy(transliterate);
|
|
37
|
-
var
|
|
37
|
+
var i7__namespace = /*#__PURE__*/_interopNamespace(i7);
|
|
38
38
|
|
|
39
39
|
/*! *****************************************************************************
|
|
40
40
|
Copyright (c) Microsoft Corporation.
|
|
@@ -354,7 +354,7 @@
|
|
|
354
354
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
355
355
|
}
|
|
356
356
|
|
|
357
|
-
var version = '
|
|
357
|
+
var version = '3.0.0-beta.10';
|
|
358
358
|
|
|
359
359
|
/**
|
|
360
360
|
* The `NotificationService` can be used to add or remove notifications. By default the [`NotificationList`](../components/NotificationListComponent.mdx) component displays the currently active notifications.
|
|
@@ -449,7 +449,7 @@
|
|
|
449
449
|
this.connectionStateSubject = new rxjs.ReplaySubject(1);
|
|
450
450
|
this.appSettingsSubject = new rxjs.BehaviorSubject(undefined);
|
|
451
451
|
this.pendingInvitesSubject = new rxjs.BehaviorSubject([]);
|
|
452
|
-
this.
|
|
452
|
+
this.events$ = this.notificationSubject.asObservable();
|
|
453
453
|
this.connectionState$ = this.connectionStateSubject.asObservable();
|
|
454
454
|
this.appSettings$ = this.appSettingsSubject.asObservable();
|
|
455
455
|
this.pendingInvites$ = this.pendingInvitesSubject.asObservable();
|
|
@@ -486,7 +486,8 @@
|
|
|
486
486
|
}); })];
|
|
487
487
|
case 1:
|
|
488
488
|
_d.sent();
|
|
489
|
-
return [4 /*yield*/, this.chatClient.queryChannels({ invite: 'pending' },
|
|
489
|
+
return [4 /*yield*/, this.chatClient.queryChannels({ invite: 'pending' }, // TODO: find out why we need this typecast
|
|
490
|
+
{}, { user_id: (_a = this.chatClient.user) === null || _a === void 0 ? void 0 : _a.id })];
|
|
490
491
|
case 2:
|
|
491
492
|
channels = _d.sent();
|
|
492
493
|
this.pendingInvitesSubject.next(channels);
|
|
@@ -628,27 +629,13 @@
|
|
|
628
629
|
}]
|
|
629
630
|
}], ctorParameters: function () { return [{ type: i0__namespace.NgZone }, { type: NotificationService }]; } });
|
|
630
631
|
|
|
631
|
-
var createMessagePreview = function (user, text, attachments, mentionedUsers, parentId, quotedMessageId) {
|
|
632
|
+
var createMessagePreview = function (user, text, attachments, mentionedUsers, parentId, quotedMessageId, customData) {
|
|
632
633
|
if (attachments === void 0) { attachments = []; }
|
|
633
634
|
if (mentionedUsers === void 0) { mentionedUsers = []; }
|
|
634
635
|
if (parentId === void 0) { parentId = undefined; }
|
|
635
636
|
if (quotedMessageId === void 0) { quotedMessageId = undefined; }
|
|
636
637
|
var clientSideId = user.id + "-" + uuid.v4();
|
|
637
|
-
return {
|
|
638
|
-
__html: text,
|
|
639
|
-
created_at: new Date(),
|
|
640
|
-
html: text,
|
|
641
|
-
id: clientSideId,
|
|
642
|
-
reactions: [],
|
|
643
|
-
status: 'sending',
|
|
644
|
-
text: text,
|
|
645
|
-
type: 'regular',
|
|
646
|
-
user: user,
|
|
647
|
-
attachments: attachments,
|
|
648
|
-
mentioned_users: mentionedUsers,
|
|
649
|
-
parent_id: parentId,
|
|
650
|
-
quoted_message_id: quotedMessageId,
|
|
651
|
-
};
|
|
638
|
+
return Object.assign({ __html: text, created_at: new Date(), html: text, id: clientSideId, reactions: [], status: 'sending', text: text, type: 'regular', user: user, attachments: attachments, mentioned_users: mentionedUsers, parent_id: parentId, quoted_message_id: quotedMessageId }, customData);
|
|
652
639
|
};
|
|
653
640
|
|
|
654
641
|
var getReadBy = function (message, channel) {
|
|
@@ -875,7 +862,7 @@
|
|
|
875
862
|
return [4 /*yield*/, this.queryChannels()];
|
|
876
863
|
case 1:
|
|
877
864
|
_h.sent();
|
|
878
|
-
this.chatClientService.
|
|
865
|
+
this.chatClientService.events$.subscribe(function (notification) { return void _this.handleNotification(notification); });
|
|
879
866
|
return [2 /*return*/];
|
|
880
867
|
}
|
|
881
868
|
});
|
|
@@ -914,15 +901,14 @@
|
|
|
914
901
|
* Adds a reaction to a message.
|
|
915
902
|
* @param messageId The id of the message to add the reaction to
|
|
916
903
|
* @param reactionType The type of the reaction
|
|
904
|
+
* @param customData
|
|
917
905
|
*/
|
|
918
|
-
ChannelService.prototype.addReaction = function (messageId, reactionType) {
|
|
906
|
+
ChannelService.prototype.addReaction = function (messageId, reactionType, customData) {
|
|
919
907
|
var _a;
|
|
920
908
|
return __awaiter(this, void 0, void 0, function () {
|
|
921
909
|
return __generator(this, function (_h) {
|
|
922
910
|
switch (_h.label) {
|
|
923
|
-
case 0: return [4 /*yield*/, ((_a = this.activeChannelSubject.getValue()) === null || _a === void 0 ? void 0 : _a.sendReaction(messageId, {
|
|
924
|
-
type: reactionType,
|
|
925
|
-
}))];
|
|
911
|
+
case 0: return [4 /*yield*/, ((_a = this.activeChannelSubject.getValue()) === null || _a === void 0 ? void 0 : _a.sendReaction(messageId, Object.assign({ type: reactionType }, customData)))];
|
|
926
912
|
case 1:
|
|
927
913
|
_h.sent();
|
|
928
914
|
return [2 /*return*/];
|
|
@@ -956,22 +942,24 @@
|
|
|
956
942
|
* @param mentionedUsers Mentioned users
|
|
957
943
|
* @param parentId Id of the parent message (if sending a thread reply)
|
|
958
944
|
* @param quotedMessageId Id of the message to quote (if sending a quote reply)
|
|
945
|
+
* @param customData
|
|
959
946
|
*/
|
|
960
|
-
ChannelService.prototype.sendMessage = function (text, attachments, mentionedUsers, parentId, quotedMessageId) {
|
|
947
|
+
ChannelService.prototype.sendMessage = function (text, attachments, mentionedUsers, parentId, quotedMessageId, customData) {
|
|
961
948
|
if (attachments === void 0) { attachments = []; }
|
|
962
949
|
if (mentionedUsers === void 0) { mentionedUsers = []; }
|
|
963
950
|
if (parentId === void 0) { parentId = undefined; }
|
|
964
951
|
if (quotedMessageId === void 0) { quotedMessageId = undefined; }
|
|
952
|
+
if (customData === void 0) { customData = undefined; }
|
|
965
953
|
return __awaiter(this, void 0, void 0, function () {
|
|
966
954
|
var preview, channel;
|
|
967
955
|
return __generator(this, function (_h) {
|
|
968
956
|
switch (_h.label) {
|
|
969
957
|
case 0:
|
|
970
|
-
preview = createMessagePreview(this.chatClientService.chatClient.user, text, attachments, mentionedUsers, parentId, quotedMessageId);
|
|
958
|
+
preview = createMessagePreview(this.chatClientService.chatClient.user, text, attachments, mentionedUsers, parentId, quotedMessageId, customData);
|
|
971
959
|
channel = this.activeChannelSubject.getValue();
|
|
972
960
|
preview.readBy = [];
|
|
973
961
|
channel.state.addMessageSorted(preview, true);
|
|
974
|
-
return [4 /*yield*/, this.sendMessageRequest(preview)];
|
|
962
|
+
return [4 /*yield*/, this.sendMessageRequest(preview, customData)];
|
|
975
963
|
case 1:
|
|
976
964
|
_h.sent();
|
|
977
965
|
return [2 /*return*/];
|
|
@@ -1170,7 +1158,7 @@
|
|
|
1170
1158
|
ChannelService.prototype.selectMessageToQuote = function (message) {
|
|
1171
1159
|
this.messageToQuoteSubject.next(message);
|
|
1172
1160
|
};
|
|
1173
|
-
ChannelService.prototype.sendMessageRequest = function (preview) {
|
|
1161
|
+
ChannelService.prototype.sendMessageRequest = function (preview, customData) {
|
|
1174
1162
|
var _a;
|
|
1175
1163
|
return __awaiter(this, void 0, void 0, function () {
|
|
1176
1164
|
var channel, isThreadReply, response, error_1, stringError, parsedError;
|
|
@@ -1185,14 +1173,7 @@
|
|
|
1185
1173
|
_h.label = 1;
|
|
1186
1174
|
case 1:
|
|
1187
1175
|
_h.trys.push([1, 3, , 4]);
|
|
1188
|
-
return [4 /*yield*/, channel.sendMessage({
|
|
1189
|
-
text: preview.text,
|
|
1190
|
-
attachments: preview.attachments,
|
|
1191
|
-
mentioned_users: (_a = preview.mentioned_users) === null || _a === void 0 ? void 0 : _a.map(function (u) { return u.id; }),
|
|
1192
|
-
id: preview.id,
|
|
1193
|
-
parent_id: preview.parent_id,
|
|
1194
|
-
quoted_message_id: preview.quoted_message_id,
|
|
1195
|
-
})];
|
|
1176
|
+
return [4 /*yield*/, channel.sendMessage(Object.assign({ id: preview.id, text: preview.text, attachments: preview.attachments, mentioned_users: (_a = preview.mentioned_users) === null || _a === void 0 ? void 0 : _a.map(function (u) { return u.id; }), parent_id: preview.parent_id, quoted_message_id: preview.quoted_message_id }, customData))];
|
|
1196
1177
|
case 2:
|
|
1197
1178
|
response = _h.sent();
|
|
1198
1179
|
if (response === null || response === void 0 ? void 0 : response.message) {
|
|
@@ -1218,16 +1199,16 @@
|
|
|
1218
1199
|
});
|
|
1219
1200
|
});
|
|
1220
1201
|
};
|
|
1221
|
-
ChannelService.prototype.handleNotification = function (
|
|
1202
|
+
ChannelService.prototype.handleNotification = function (clientEvent) {
|
|
1222
1203
|
var _this = this;
|
|
1223
|
-
switch (
|
|
1204
|
+
switch (clientEvent.eventType) {
|
|
1224
1205
|
case 'notification.message_new': {
|
|
1225
1206
|
this.ngZone.run(function () {
|
|
1226
1207
|
if (_this.customNewMessageNotificationHandler) {
|
|
1227
|
-
_this.customNewMessageNotificationHandler(
|
|
1208
|
+
_this.customNewMessageNotificationHandler(clientEvent, _this.channelListSetter);
|
|
1228
1209
|
}
|
|
1229
1210
|
else {
|
|
1230
|
-
_this.handleNewMessageNotification(
|
|
1211
|
+
_this.handleNewMessageNotification(clientEvent);
|
|
1231
1212
|
}
|
|
1232
1213
|
});
|
|
1233
1214
|
break;
|
|
@@ -1235,10 +1216,10 @@
|
|
|
1235
1216
|
case 'notification.added_to_channel': {
|
|
1236
1217
|
this.ngZone.run(function () {
|
|
1237
1218
|
if (_this.customAddedToChannelNotificationHandler) {
|
|
1238
|
-
_this.customAddedToChannelNotificationHandler(
|
|
1219
|
+
_this.customAddedToChannelNotificationHandler(clientEvent, _this.channelListSetter);
|
|
1239
1220
|
}
|
|
1240
1221
|
else {
|
|
1241
|
-
_this.handleAddedToChannelNotification(
|
|
1222
|
+
_this.handleAddedToChannelNotification(clientEvent);
|
|
1242
1223
|
}
|
|
1243
1224
|
});
|
|
1244
1225
|
break;
|
|
@@ -1246,27 +1227,27 @@
|
|
|
1246
1227
|
case 'notification.removed_from_channel': {
|
|
1247
1228
|
this.ngZone.run(function () {
|
|
1248
1229
|
if (_this.customRemovedFromChannelNotificationHandler) {
|
|
1249
|
-
_this.customRemovedFromChannelNotificationHandler(
|
|
1230
|
+
_this.customRemovedFromChannelNotificationHandler(clientEvent, _this.channelListSetter);
|
|
1250
1231
|
}
|
|
1251
1232
|
else {
|
|
1252
|
-
_this.handleRemovedFromChannelNotification(
|
|
1233
|
+
_this.handleRemovedFromChannelNotification(clientEvent);
|
|
1253
1234
|
}
|
|
1254
1235
|
});
|
|
1255
1236
|
}
|
|
1256
1237
|
}
|
|
1257
1238
|
};
|
|
1258
|
-
ChannelService.prototype.handleRemovedFromChannelNotification = function (
|
|
1259
|
-
var channelIdToBeRemoved =
|
|
1239
|
+
ChannelService.prototype.handleRemovedFromChannelNotification = function (clientEvent) {
|
|
1240
|
+
var channelIdToBeRemoved = clientEvent.event.channel.cid;
|
|
1260
1241
|
this.removeChannelsFromChannelList([channelIdToBeRemoved]);
|
|
1261
1242
|
};
|
|
1262
|
-
ChannelService.prototype.handleNewMessageNotification = function (
|
|
1263
|
-
if (
|
|
1264
|
-
this.addChannelsFromNotification([
|
|
1243
|
+
ChannelService.prototype.handleNewMessageNotification = function (clientEvent) {
|
|
1244
|
+
if (clientEvent.event.channel) {
|
|
1245
|
+
this.addChannelsFromNotification([clientEvent.event.channel]);
|
|
1265
1246
|
}
|
|
1266
1247
|
};
|
|
1267
|
-
ChannelService.prototype.handleAddedToChannelNotification = function (
|
|
1268
|
-
if (
|
|
1269
|
-
this.addChannelsFromNotification([
|
|
1248
|
+
ChannelService.prototype.handleAddedToChannelNotification = function (clientEvent) {
|
|
1249
|
+
if (clientEvent.event.channel) {
|
|
1250
|
+
this.addChannelsFromNotification([clientEvent.event.channel]);
|
|
1270
1251
|
}
|
|
1271
1252
|
};
|
|
1272
1253
|
ChannelService.prototype.addChannelsFromNotification = function (channelResponses) {
|
|
@@ -1907,7 +1888,7 @@
|
|
|
1907
1888
|
*/
|
|
1908
1889
|
AttachmentService.prototype.deleteAttachment = function (upload) {
|
|
1909
1890
|
return __awaiter(this, void 0, void 0, function () {
|
|
1910
|
-
var attachmentUploads, error_1;
|
|
1891
|
+
var attachmentUploads, result, index, error_1, index;
|
|
1911
1892
|
return __generator(this, function (_d) {
|
|
1912
1893
|
switch (_d.label) {
|
|
1913
1894
|
case 0:
|
|
@@ -1919,18 +1900,23 @@
|
|
|
1919
1900
|
return [4 /*yield*/, this.channelService.deleteAttachment(upload)];
|
|
1920
1901
|
case 2:
|
|
1921
1902
|
_d.sent();
|
|
1922
|
-
|
|
1903
|
+
result = __spreadArray([], __read(attachmentUploads));
|
|
1904
|
+
index = attachmentUploads.indexOf(upload);
|
|
1905
|
+
result.splice(index, 1);
|
|
1923
1906
|
return [3 /*break*/, 4];
|
|
1924
1907
|
case 3:
|
|
1925
1908
|
error_1 = _d.sent();
|
|
1909
|
+
result = attachmentUploads;
|
|
1926
1910
|
this.notificationService.addTemporaryNotification('streamChat.Error deleting attachment');
|
|
1927
1911
|
return [3 /*break*/, 4];
|
|
1928
1912
|
case 4: return [3 /*break*/, 6];
|
|
1929
1913
|
case 5:
|
|
1930
|
-
|
|
1914
|
+
result = __spreadArray([], __read(attachmentUploads));
|
|
1915
|
+
index = attachmentUploads.indexOf(upload);
|
|
1916
|
+
result.splice(index, 1);
|
|
1931
1917
|
_d.label = 6;
|
|
1932
1918
|
case 6:
|
|
1933
|
-
this.attachmentUploadsSubject.next(__spreadArray([], __read(
|
|
1919
|
+
this.attachmentUploadsSubject.next(__spreadArray([], __read(result)));
|
|
1934
1920
|
return [2 /*return*/];
|
|
1935
1921
|
}
|
|
1936
1922
|
});
|
|
@@ -2013,16 +1999,16 @@
|
|
|
2013
1999
|
};
|
|
2014
2000
|
AttachmentService.prototype.uploadAttachments = function (uploads) {
|
|
2015
2001
|
return __awaiter(this, void 0, void 0, function () {
|
|
2016
|
-
var
|
|
2002
|
+
var result, attachmentUploads;
|
|
2017
2003
|
var _this = this;
|
|
2018
2004
|
return __generator(this, function (_d) {
|
|
2019
2005
|
switch (_d.label) {
|
|
2020
2006
|
case 0:
|
|
2021
|
-
attachmentUploads = this.attachmentUploadsSubject.getValue();
|
|
2022
2007
|
this.attachmentUploadInProgressCounterSubject.next(this.attachmentUploadInProgressCounterSubject.getValue() + 1);
|
|
2023
2008
|
return [4 /*yield*/, this.channelService.uploadAttachments(uploads)];
|
|
2024
2009
|
case 1:
|
|
2025
2010
|
result = _d.sent();
|
|
2011
|
+
attachmentUploads = this.attachmentUploadsSubject.getValue();
|
|
2026
2012
|
result.forEach(function (r) {
|
|
2027
2013
|
var upload = attachmentUploads.find(function (upload) { return upload.file === r.file; });
|
|
2028
2014
|
if (!upload) {
|
|
@@ -2197,7 +2183,7 @@
|
|
|
2197
2183
|
return AvatarComponent;
|
|
2198
2184
|
}());
|
|
2199
2185
|
AvatarComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AvatarComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
2200
|
-
AvatarComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AvatarComponent, selector: "stream-avatar", inputs: { name: "name", imageUrl: "imageUrl", size: "size" }, ngImport: i0__namespace, template: "<div\n class=\"str-chat__avatar str-chat__avatar--circle\"\n title=\"{{ name }}\"\n [style]=\"{\n flexBasis: size + 'px',\n fontSize: size / 2 + 'px',\n height: size + 'px',\n lineHeight: size + 'px',\n width: size + 'px'\n }\"\n>\n <img\n *ngIf=\"imageUrl && !isError; else fallback\"\n class=\"str-chat__avatar-image str-chat__avatar-image{{\n isLoaded ? ' str-chat__avatar-image--loaded' : ''\n }}\"\n src=\"{{ imageUrl }}\"\n alt=\"{{ initials }}\"\n data-testid=\"avatar-img\"\n (load)=\"isLoaded = true\"\n (error)=\"isError = true\"\n [style]=\"{\n flexBasis: size + 'px',\n height: size + 'px',\n objectFit: 'cover',\n width: size + 'px'\n }\"\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", styles: [""], directives: [{ type:
|
|
2186
|
+
AvatarComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AvatarComponent, selector: "stream-avatar", inputs: { name: "name", imageUrl: "imageUrl", size: "size" }, ngImport: i0__namespace, template: "<div\n class=\"str-chat__avatar str-chat__avatar--circle\"\n title=\"{{ name }}\"\n [style]=\"{\n flexBasis: size + 'px',\n fontSize: size / 2 + 'px',\n height: size + 'px',\n lineHeight: size + 'px',\n width: size + 'px'\n }\"\n>\n <img\n *ngIf=\"imageUrl && !isError; else fallback\"\n class=\"str-chat__avatar-image str-chat__avatar-image{{\n isLoaded ? ' str-chat__avatar-image--loaded' : ''\n }}\"\n src=\"{{ imageUrl }}\"\n alt=\"{{ initials }}\"\n data-testid=\"avatar-img\"\n (load)=\"isLoaded = true\"\n (error)=\"isError = true\"\n [style]=\"{\n flexBasis: size + 'px',\n height: size + 'px',\n objectFit: 'cover',\n width: size + 'px'\n }\"\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", styles: [""], directives: [{ type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
2201
2187
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AvatarComponent, decorators: [{
|
|
2202
2188
|
type: i0.Component,
|
|
2203
2189
|
args: [{
|
|
@@ -2213,6 +2199,180 @@
|
|
|
2213
2199
|
type: i0.Input
|
|
2214
2200
|
}] } });
|
|
2215
2201
|
|
|
2202
|
+
/**
|
|
2203
|
+
* A central location for registering your custom templates to override parts of the chat application.
|
|
2204
|
+
*
|
|
2205
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2206
|
+
*/
|
|
2207
|
+
var CustomTemplatesService = /** @class */ (function () {
|
|
2208
|
+
function CustomTemplatesService() {
|
|
2209
|
+
/**
|
|
2210
|
+
* The autocomplete list item template for mentioning users (used in the [`AutocompleteTextareaComponent`](../components/AutocompleteTextareaComponent.mdx))
|
|
2211
|
+
*/
|
|
2212
|
+
this.mentionAutocompleteItemTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2213
|
+
/**
|
|
2214
|
+
* The autocomplete list item template for commands (used in the [`AutocompleteTextareaComponent`](../components/AutocompleteTextareaComponent.mdx))
|
|
2215
|
+
*
|
|
2216
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2217
|
+
*/
|
|
2218
|
+
this.commandAutocompleteItemTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2219
|
+
/**
|
|
2220
|
+
* Template used to display an item in the [channel list](../components/ChannelListComponent.mdx) (instead of the default [channal list item](../components/ChannelPreviewComponent.mdx))
|
|
2221
|
+
*
|
|
2222
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2223
|
+
*/
|
|
2224
|
+
this.channelPreviewTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2225
|
+
/**
|
|
2226
|
+
* The message input template used when editing a message (instead of the [default message input](../components/MessageInputComponent.mdx))
|
|
2227
|
+
*
|
|
2228
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2229
|
+
*/
|
|
2230
|
+
this.messageInputTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2231
|
+
/**
|
|
2232
|
+
* The template used for displaying a [mention inside a message](../code-examples/mention-actions.mdx)
|
|
2233
|
+
*
|
|
2234
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2235
|
+
*/
|
|
2236
|
+
this.mentionTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2237
|
+
/**
|
|
2238
|
+
* The template for [emoji picker](../code-examples/emoji-picker.mdx)
|
|
2239
|
+
*
|
|
2240
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2241
|
+
*/
|
|
2242
|
+
this.emojiPickerTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2243
|
+
/**
|
|
2244
|
+
* The typing indicator template used in the [message list](../components/MessageListComponent.mdx)
|
|
2245
|
+
*
|
|
2246
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2247
|
+
*/
|
|
2248
|
+
this.typingIndicatorTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2249
|
+
/**
|
|
2250
|
+
* The template used to display a message in the [message list](../components/MessageListComponent.mdx) (instead of the [default message component](../components/MessageComponent.mdx))
|
|
2251
|
+
*
|
|
2252
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2253
|
+
*/
|
|
2254
|
+
this.messageTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2255
|
+
/**
|
|
2256
|
+
* The template for channel actions displayed in the [channel header](../components/ChannelHeaderComponent.mdx) (by default no channel action is displayed)
|
|
2257
|
+
*
|
|
2258
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2259
|
+
*/
|
|
2260
|
+
this.channelActionsTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2261
|
+
/**
|
|
2262
|
+
* The template used to display attachments of a [message](../components/MessageComponent.mdx) (instead of the [default attachment list](../components/AttachmentListComponent.mdx))
|
|
2263
|
+
*
|
|
2264
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2265
|
+
*/
|
|
2266
|
+
this.attachmentListTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2267
|
+
/**
|
|
2268
|
+
* The template used to display attachments in the [message input](../components/MessageInputComponent.mdx) component (instead of the [default attachment preview](../components/AttachmentPreviewListComponent.mdx))
|
|
2269
|
+
*
|
|
2270
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2271
|
+
*/
|
|
2272
|
+
this.attachmentPreviewListTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2273
|
+
/**
|
|
2274
|
+
* The template used to display avatars for channels and users (instead of the [default avatar](../components/AvatarComponent.mdx))
|
|
2275
|
+
*
|
|
2276
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2277
|
+
*/
|
|
2278
|
+
this.avatarTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2279
|
+
/**
|
|
2280
|
+
* Template for displaying icons (instead of the [default icon component](../components/IconComponent.mdx))
|
|
2281
|
+
*
|
|
2282
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2283
|
+
*/
|
|
2284
|
+
this.iconTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2285
|
+
/**
|
|
2286
|
+
* Template for displaying the loading indicator (instead of the [default loading indicator](../components/LoadingIndicatorComponent.mdx))
|
|
2287
|
+
*
|
|
2288
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2289
|
+
*/
|
|
2290
|
+
this.loadingIndicatorTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2291
|
+
/**
|
|
2292
|
+
* Template for displaying the message actions box (instead of the [default message actions box](../components/MessageActionsBoxComponent.mdx))
|
|
2293
|
+
*
|
|
2294
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2295
|
+
*/
|
|
2296
|
+
this.messageActionsBoxTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2297
|
+
/**
|
|
2298
|
+
* The template used for displaying an item in the [message actions box](../components/MessageActionsBoxComponent.mdx)
|
|
2299
|
+
*
|
|
2300
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2301
|
+
*/
|
|
2302
|
+
this.messageActionsBoxItemTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2303
|
+
/**
|
|
2304
|
+
* The template used to display the reactions of a [message](../components/MessageComponent.mdx), and the selector to add a reaction to a message (instead of the [default message reactions component](../components/MessageReactionsComponent.mdx))
|
|
2305
|
+
*
|
|
2306
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2307
|
+
*/
|
|
2308
|
+
this.messageReactionsTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2309
|
+
/**
|
|
2310
|
+
* The template used to display a modal window (instead of the [default modal](../components/ModalComponent.mdx))
|
|
2311
|
+
*
|
|
2312
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2313
|
+
*/
|
|
2314
|
+
this.modalTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2315
|
+
/**
|
|
2316
|
+
* The template used to override the [default notification component](../components/NotificationComponent.mdx)
|
|
2317
|
+
*
|
|
2318
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2319
|
+
*/
|
|
2320
|
+
this.notificationTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2321
|
+
/**
|
|
2322
|
+
* The template used for header of a [thread](../components/ThreadComponent.mdx)
|
|
2323
|
+
*
|
|
2324
|
+
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
|
|
2325
|
+
*/
|
|
2326
|
+
this.threadHeaderTemplate$ = new rxjs.BehaviorSubject(undefined);
|
|
2327
|
+
}
|
|
2328
|
+
return CustomTemplatesService;
|
|
2329
|
+
}());
|
|
2330
|
+
CustomTemplatesService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: CustomTemplatesService, deps: [], target: i0__namespace.ɵɵFactoryTarget.Injectable });
|
|
2331
|
+
CustomTemplatesService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: CustomTemplatesService, providedIn: 'root' });
|
|
2332
|
+
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: CustomTemplatesService, decorators: [{
|
|
2333
|
+
type: i0.Injectable,
|
|
2334
|
+
args: [{
|
|
2335
|
+
providedIn: 'root',
|
|
2336
|
+
}]
|
|
2337
|
+
}], ctorParameters: function () { return []; } });
|
|
2338
|
+
|
|
2339
|
+
/**
|
|
2340
|
+
* The `AvatarPlaceholder` component displays the [default avatar](./AvatarComponent.mdx) unless a [custom template](../services/CustomTemplatesService.mdx) is provided. This componet is used by the SDK internally, you likely won't need to use it.
|
|
2341
|
+
*/
|
|
2342
|
+
var AvatarPlaceholderComponent = /** @class */ (function () {
|
|
2343
|
+
function AvatarPlaceholderComponent(customTemplatesService) {
|
|
2344
|
+
this.customTemplatesService = customTemplatesService;
|
|
2345
|
+
/**
|
|
2346
|
+
* The size in pixels of the avatar image.
|
|
2347
|
+
*/
|
|
2348
|
+
this.size = 32;
|
|
2349
|
+
}
|
|
2350
|
+
AvatarPlaceholderComponent.prototype.getAvatarContext = function () {
|
|
2351
|
+
return {
|
|
2352
|
+
name: this.name,
|
|
2353
|
+
imageUrl: this.imageUrl,
|
|
2354
|
+
size: this.size,
|
|
2355
|
+
};
|
|
2356
|
+
};
|
|
2357
|
+
return AvatarPlaceholderComponent;
|
|
2358
|
+
}());
|
|
2359
|
+
AvatarPlaceholderComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AvatarPlaceholderComponent, deps: [{ token: CustomTemplatesService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
2360
|
+
AvatarPlaceholderComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: { name: "name", imageUrl: "imageUrl", size: "size" }, ngImport: i0__namespace, template: "<ng-template\n #defaultAvatar\n let-name=\"name\"\n let-imageUrl=\"imageUrl\"\n let-size=\"size\"\n>\n <stream-avatar\n [name]=\"name\"\n [imageUrl]=\"imageUrl\"\n [size]=\"size\"\n ></stream-avatar>\n</ng-template>\n<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.avatarTemplate$ | async) || defaultAvatar;\n context: getAvatarContext()\n \"\n></ng-container>\n", components: [{ type: AvatarComponent, selector: "stream-avatar", inputs: ["name", "imageUrl", "size"] }], directives: [{ type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i3__namespace.AsyncPipe } });
|
|
2361
|
+
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AvatarPlaceholderComponent, decorators: [{
|
|
2362
|
+
type: i0.Component,
|
|
2363
|
+
args: [{
|
|
2364
|
+
selector: 'stream-avatar-placeholder',
|
|
2365
|
+
templateUrl: './avatar-placeholder.component.html',
|
|
2366
|
+
styles: [],
|
|
2367
|
+
}]
|
|
2368
|
+
}], ctorParameters: function () { return [{ type: CustomTemplatesService }]; }, propDecorators: { name: [{
|
|
2369
|
+
type: i0.Input
|
|
2370
|
+
}], imageUrl: [{
|
|
2371
|
+
type: i0.Input
|
|
2372
|
+
}], size: [{
|
|
2373
|
+
type: i0.Input
|
|
2374
|
+
}] } });
|
|
2375
|
+
|
|
2216
2376
|
/**
|
|
2217
2377
|
* The `Icon` component can be used to display different icons (i. e. message delivered icon).
|
|
2218
2378
|
*/
|
|
@@ -2222,7 +2382,7 @@
|
|
|
2222
2382
|
return IconComponent;
|
|
2223
2383
|
}());
|
|
2224
2384
|
IconComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: IconComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
2225
|
-
IconComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: IconComponent, selector: "stream-icon", inputs: { icon: "icon", size: "size" }, ngImport: i0__namespace, template: "<svg\n data-testid=\"action-icon\"\n *ngIf=\"icon === 'action-icon'\"\n height=\"4\"\n viewBox=\"0 0 11 4\"\n width=\"11\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M1.5 3a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z\"\n fillRule=\"nonzero\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'delivered-icon'\"\n height=\"16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"delivered-icon\"\n>\n <path\n d=\"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0zm3.72 6.633a.955.955 0 1 0-1.352-1.352L6.986 8.663 5.633 7.31A.956.956 0 1 0 4.28 8.663l2.029 2.028a.956.956 0 0 0 1.353 0l4.058-4.058z\"\n fill=\"#006CFF\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'reaction-icon'\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n width=\"12\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"reaction-icon\"\n>\n <g clipRule=\"evenodd\" fillRule=\"evenodd\">\n <path\n d=\"M6 1.2C3.3 1.2 1.2 3.3 1.2 6c0 2.7 2.1 4.8 4.8 4.8 2.7 0 4.8-2.1 4.8-4.8 0-2.7-2.1-4.8-4.8-4.8zM0 6c0-3.3 2.7-6 6-6s6 2.7 6 6-2.7 6-6 6-6-2.7-6-6z\"\n ></path>\n <path\n d=\"M5.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM8.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM3.3 6.7c.3-.2.6-.1.8.1.3.4.8.9 1.5 1 .6.2 1.4.1 2.4-1 .2-.2.6-.3.8 0 .2.2.3.6 0 .8-1.1 1.3-2.4 1.7-3.5 1.5-1-.2-1.8-.9-2.2-1.5-.2-.3-.1-.7.2-.9z\"\n ></path>\n </g>\n</svg>\n<svg\n data-testid=\"connection-error\"\n *ngIf=\"icon === 'connection-error'\"\n width=\"78px\"\n height=\"78px\"\n viewBox=\"0 0 78 78\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n>\n <!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->\n <title>Combined Shape</title>\n <desc>Created with Sketch.</desc>\n <g\n id=\"Interactions\"\n stroke=\"none\"\n stroke-width=\"1\"\n fill=\"none\"\n fill-rule=\"evenodd\"\n >\n <g\n id=\"Connection-Error-_-Connectivity\"\n transform=\"translate(-270.000000, -30.000000)\"\n fill=\"#CF1F25\"\n >\n <g\n id=\"109-network-connection\"\n transform=\"translate(270.000000, 30.000000)\"\n >\n <path\n d=\"M66.4609744,11.414231 C81.6225232,26.5757798 81.6225232,51.157545 66.4609744,66.3188467 C51.2994256,81.4803954 26.7176604,81.4803954 11.5563587,66.3188467 C-3.60519004,51.1572979 -3.60519004,26.5755327 11.5563587,11.414231 C26.7179075,-3.74731776 51.2996727,-3.74731776 66.4609744,11.414231 Z M54.7853215,45.8823776 L54.7853215,40.5882574 C54.7853215,39.613638 53.9952341,38.8235506 53.0206147,38.8235506 L44.9576695,38.8235506 L41.428256,42.3529641 L51.255555,42.3529641 L51.255555,45.8823776 L54.7853215,45.8823776 Z M40.6659027,43.1153174 L37.8988425,45.8823776 L40.6659027,45.8823776 L40.6659027,43.1153174 Z M51.1764962,56.4702653 L58.2353232,56.4702653 C59.2099355,56.4702653 60.00003,55.6801708 60.00003,54.7055585 L60.00003,51.176145 C60.00003,50.2015327 59.2099355,49.4114382 58.2353232,49.4114382 L51.1764962,49.4114382 C50.2018839,49.4114382 49.4117894,50.2015327 49.4117894,51.176145 L49.4117894,54.7055585 C49.4117894,55.6801708 50.2018839,56.4702653 51.1764962,56.4702653 Z M35.2941353,56.4702653 L42.3529624,56.4702653 C43.3275746,56.4702653 44.1176691,55.6801708 44.1176691,54.7055585 L44.1176691,51.176145 C44.1176691,50.2015327 43.3275746,49.4114382 42.3529624,49.4114382 L35.2941353,49.4114382 C34.319523,49.4114382 33.5294285,50.2015327 33.5294285,51.176145 L33.5294285,54.7055585 C33.5294285,55.6801708 34.319523,56.4702653 35.2941353,56.4702653 Z M56.6964989,19.0874231 C56.007381,18.3985134 54.8903216,18.3985134 54.2012036,19.087423 L45.882376,27.4062507 L45.882376,19.4117761 C45.882376,18.4371568 45.0922885,17.6470693 44.1176692,17.6470693 L33.5294286,17.6470693 C32.5548092,17.6470694 31.7647218,18.4371568 31.7647218,19.4117761 L31.7647218,30.0000167 C31.7647219,30.9746363 32.5548092,31.7647237 33.5294285,31.7647237 L41.5239031,31.7647237 L34.4650761,38.8235508 L24.7058947,38.8235508 C23.7312753,38.8235508 22.9411879,39.6136382 22.9411879,40.5882575 L22.9411879,45.8823778 L26.4706014,45.8823778 L26.4706014,42.3529643 L30.9356624,42.3529643 L23.8768354,49.4117914 L19.4117743,49.4117914 C18.4371549,49.4117914 17.6470675,50.2018788 17.6470675,51.1764981 L17.6470675,54.7059117 C17.6504049,54.9674302 17.7129076,55.2248042 17.8298886,55.4587302 L16.4456526,56.8429662 C15.7446193,57.5200453 15.7252005,58.6372282 16.4022825,59.3382615 C17.0793616,60.0392948 18.1965445,60.0587136 18.8975778,59.3816316 C18.9122847,59.3674273 18.9267436,59.3529684 18.940948,59.3382615 L56.6964963,21.5830662 C57.3856425,20.8939094 57.3856425,19.7765747 56.6964963,19.0874179 Z\"\n id=\"Combined-Shape\"\n ></path>\n </g>\n </g>\n </g>\n</svg>\n<svg\n *ngIf=\"icon === 'send'\"\n data-testid=\"send\"\n height=\"17\"\n viewBox=\"0 0 18 17\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <title translate>streamChat.Send</title>\n <path\n d=\"M0 17.015l17.333-8.508L0 0v6.617l12.417 1.89L0 10.397z\"\n fill=\"#006cff\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'file-upload'\"\n data-testid=\"file-upload\"\n height=\"14\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <title translate>streamChat.Attach files</title>\n <path\n d=\"M1.667.333h10.666c.737 0 1.334.597 1.334 1.334v10.666c0 .737-.597 1.334-1.334 1.334H1.667a1.333 1.333 0 0 1-1.334-1.334V1.667C.333.93.93.333 1.667.333zm2 1.334a1.667 1.667 0 1 0 0 3.333 1.667 1.667 0 0 0 0-3.333zm-2 9.333v1.333h10.666v-4l-2-2-4 4-2-2L1.667 11z\"\n fillRule=\"nonzero\"\n />\n</svg>\n<svg\n data-testid=\"retry\"\n *ngIf=\"icon === 'retry'\"\n width=\"22\"\n height=\"20\"\n viewBox=\"0 0 22 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M20 5.535V2a1 1 0 0 1 2 0v6a1 1 0 0 1-1 1h-6a1 1 0 0 1 0-2h3.638l-2.975-2.653a8 8 0 1 0 1.884 8.32 1 1 0 1 1 1.886.666A10 10 0 1 1 5.175 1.245c3.901-2.15 8.754-1.462 11.88 1.667L20 5.535z\"\n fill=\"#FFF\"\n fill-rule=\"nonzero\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'close'\"\n data-testid=\"close\"\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 28 28\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n>\n <defs>\n <path\n d=\"M465 5c5.53 0 10 4.47 10 10s-4.47 10-10 10-10-4.47-10-10 4.47-10 10-10zm3.59 5L465 13.59 461.41 10 460 11.41l3.59 3.59-3.59 3.59 1.41 1.41 3.59-3.59 3.59 3.59 1.41-1.41-3.59-3.59 3.59-3.59-1.41-1.41z\"\n id=\"b\"\n />\n <filter\n x=\"-30%\"\n y=\"-30%\"\n width=\"160%\"\n height=\"160%\"\n filterUnits=\"objectBoundingBox\"\n id=\"a\"\n >\n <feOffset in=\"SourceAlpha\" result=\"shadowOffsetOuter1\" />\n <feGaussianBlur\n stdDeviation=\"2\"\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n />\n <feColorMatrix\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0\"\n in=\"shadowBlurOuter1\"\n />\n </filter>\n </defs>\n <g transform=\"translate(-451 -1)\" fill-rule=\"nonzero\" fill=\"none\">\n <use fill=\"#000\" filter=\"url(#a)\" xlink:href=\"#b\" />\n <use fill=\"#FFF\" fill-rule=\"evenodd\" xlink:href=\"#b\" />\n </g>\n</svg>\n<svg\n *ngIf=\"icon === 'file'\"\n data-testid=\"file\"\n className=\"rfu-file-icon--small fa-file-fallback\"\n [attr.height]=\"size || 20\"\n [attr.width]=\"size || 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 384 512\"\n>\n <path\n d=\"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z\"\n fill=\"#414D54\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'reply'\"\n data-testid=\"reply\"\n height=\"15\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M.56 10.946H.06l-.002-.498L.025.92a.5.5 0 1 1 1-.004l.032 9.029H9.06v-4l9 4.5-9 4.5v-4H.56z\"\n fillRule=\"nonzero\"\n />\n</svg>\n<svg\n height=\"10\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"close-no-outline\"\n *ngIf=\"icon === 'close-no-outline'\"\n>\n <path\n d=\"M9.916 1.027L8.973.084 5 4.058 1.027.084l-.943.943L4.058 5 .084 8.973l.943.943L5 5.942l3.973 3.974.943-.943L5.942 5z\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n height=\"10\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"reply-in-thread\"\n *ngIf=\"icon === 'reply-in-thread'\"\n>\n <path\n d=\"M8.516 3c4.78 0 4.972 6.5 4.972 6.5-1.6-2.906-2.847-3.184-4.972-3.184v2.872L3.772 4.994 8.516.5V3zM.484 5l4.5-4.237v1.78L2.416 5l2.568 2.125v1.828L.484 5z\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'arrow-left'\"\n data-testid=\"arrow-left\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M15.7049 7.41L14.2949 6L8.29492 12L14.2949 18L15.7049 16.59L11.1249 12L15.7049 7.41Z\"\n fill=\"var(--black)\"\n />\n</svg>\n\n<svg\n *ngIf=\"icon === 'arrow-right'\"\n data-testid=\"arrow-right\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M9.70492 6L8.29492 7.41L12.8749 12L8.29492 16.59L9.70492 18L15.7049 12L9.70492 6Z\"\n fill=\"var(--black)\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'menu'\"\n data-testid=\"menu\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3 8V6H21V8H3ZM3 13H21V11H3V13ZM3 18H21V16H3V18Z\"\n fill=\"black\"\n />\n</svg>\n", directives: [{ type: i6__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2__namespace.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] });
|
|
2385
|
+
IconComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: IconComponent, selector: "stream-icon", inputs: { icon: "icon", size: "size" }, ngImport: i0__namespace, template: "<svg\n data-testid=\"action-icon\"\n *ngIf=\"icon === 'action-icon'\"\n height=\"4\"\n viewBox=\"0 0 11 4\"\n width=\"11\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M1.5 3a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z\"\n fillRule=\"nonzero\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'delivered-icon'\"\n height=\"16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"delivered-icon\"\n>\n <path\n d=\"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0zm3.72 6.633a.955.955 0 1 0-1.352-1.352L6.986 8.663 5.633 7.31A.956.956 0 1 0 4.28 8.663l2.029 2.028a.956.956 0 0 0 1.353 0l4.058-4.058z\"\n fill=\"#006CFF\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'reaction-icon'\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n width=\"12\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"reaction-icon\"\n>\n <g clipRule=\"evenodd\" fillRule=\"evenodd\">\n <path\n d=\"M6 1.2C3.3 1.2 1.2 3.3 1.2 6c0 2.7 2.1 4.8 4.8 4.8 2.7 0 4.8-2.1 4.8-4.8 0-2.7-2.1-4.8-4.8-4.8zM0 6c0-3.3 2.7-6 6-6s6 2.7 6 6-2.7 6-6 6-6-2.7-6-6z\"\n ></path>\n <path\n d=\"M5.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM8.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM3.3 6.7c.3-.2.6-.1.8.1.3.4.8.9 1.5 1 .6.2 1.4.1 2.4-1 .2-.2.6-.3.8 0 .2.2.3.6 0 .8-1.1 1.3-2.4 1.7-3.5 1.5-1-.2-1.8-.9-2.2-1.5-.2-.3-.1-.7.2-.9z\"\n ></path>\n </g>\n</svg>\n<svg\n data-testid=\"connection-error\"\n *ngIf=\"icon === 'connection-error'\"\n width=\"78px\"\n height=\"78px\"\n viewBox=\"0 0 78 78\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n>\n <!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->\n <title>Combined Shape</title>\n <desc>Created with Sketch.</desc>\n <g\n id=\"Interactions\"\n stroke=\"none\"\n stroke-width=\"1\"\n fill=\"none\"\n fill-rule=\"evenodd\"\n >\n <g\n id=\"Connection-Error-_-Connectivity\"\n transform=\"translate(-270.000000, -30.000000)\"\n fill=\"#CF1F25\"\n >\n <g\n id=\"109-network-connection\"\n transform=\"translate(270.000000, 30.000000)\"\n >\n <path\n d=\"M66.4609744,11.414231 C81.6225232,26.5757798 81.6225232,51.157545 66.4609744,66.3188467 C51.2994256,81.4803954 26.7176604,81.4803954 11.5563587,66.3188467 C-3.60519004,51.1572979 -3.60519004,26.5755327 11.5563587,11.414231 C26.7179075,-3.74731776 51.2996727,-3.74731776 66.4609744,11.414231 Z M54.7853215,45.8823776 L54.7853215,40.5882574 C54.7853215,39.613638 53.9952341,38.8235506 53.0206147,38.8235506 L44.9576695,38.8235506 L41.428256,42.3529641 L51.255555,42.3529641 L51.255555,45.8823776 L54.7853215,45.8823776 Z M40.6659027,43.1153174 L37.8988425,45.8823776 L40.6659027,45.8823776 L40.6659027,43.1153174 Z M51.1764962,56.4702653 L58.2353232,56.4702653 C59.2099355,56.4702653 60.00003,55.6801708 60.00003,54.7055585 L60.00003,51.176145 C60.00003,50.2015327 59.2099355,49.4114382 58.2353232,49.4114382 L51.1764962,49.4114382 C50.2018839,49.4114382 49.4117894,50.2015327 49.4117894,51.176145 L49.4117894,54.7055585 C49.4117894,55.6801708 50.2018839,56.4702653 51.1764962,56.4702653 Z M35.2941353,56.4702653 L42.3529624,56.4702653 C43.3275746,56.4702653 44.1176691,55.6801708 44.1176691,54.7055585 L44.1176691,51.176145 C44.1176691,50.2015327 43.3275746,49.4114382 42.3529624,49.4114382 L35.2941353,49.4114382 C34.319523,49.4114382 33.5294285,50.2015327 33.5294285,51.176145 L33.5294285,54.7055585 C33.5294285,55.6801708 34.319523,56.4702653 35.2941353,56.4702653 Z M56.6964989,19.0874231 C56.007381,18.3985134 54.8903216,18.3985134 54.2012036,19.087423 L45.882376,27.4062507 L45.882376,19.4117761 C45.882376,18.4371568 45.0922885,17.6470693 44.1176692,17.6470693 L33.5294286,17.6470693 C32.5548092,17.6470694 31.7647218,18.4371568 31.7647218,19.4117761 L31.7647218,30.0000167 C31.7647219,30.9746363 32.5548092,31.7647237 33.5294285,31.7647237 L41.5239031,31.7647237 L34.4650761,38.8235508 L24.7058947,38.8235508 C23.7312753,38.8235508 22.9411879,39.6136382 22.9411879,40.5882575 L22.9411879,45.8823778 L26.4706014,45.8823778 L26.4706014,42.3529643 L30.9356624,42.3529643 L23.8768354,49.4117914 L19.4117743,49.4117914 C18.4371549,49.4117914 17.6470675,50.2018788 17.6470675,51.1764981 L17.6470675,54.7059117 C17.6504049,54.9674302 17.7129076,55.2248042 17.8298886,55.4587302 L16.4456526,56.8429662 C15.7446193,57.5200453 15.7252005,58.6372282 16.4022825,59.3382615 C17.0793616,60.0392948 18.1965445,60.0587136 18.8975778,59.3816316 C18.9122847,59.3674273 18.9267436,59.3529684 18.940948,59.3382615 L56.6964963,21.5830662 C57.3856425,20.8939094 57.3856425,19.7765747 56.6964963,19.0874179 Z\"\n id=\"Combined-Shape\"\n ></path>\n </g>\n </g>\n </g>\n</svg>\n<svg\n *ngIf=\"icon === 'send'\"\n data-testid=\"send\"\n height=\"17\"\n viewBox=\"0 0 18 17\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <title translate>streamChat.Send</title>\n <path\n d=\"M0 17.015l17.333-8.508L0 0v6.617l12.417 1.89L0 10.397z\"\n fill=\"#006cff\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'file-upload'\"\n data-testid=\"file-upload\"\n height=\"14\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <title translate>streamChat.Attach files</title>\n <path\n d=\"M1.667.333h10.666c.737 0 1.334.597 1.334 1.334v10.666c0 .737-.597 1.334-1.334 1.334H1.667a1.333 1.333 0 0 1-1.334-1.334V1.667C.333.93.93.333 1.667.333zm2 1.334a1.667 1.667 0 1 0 0 3.333 1.667 1.667 0 0 0 0-3.333zm-2 9.333v1.333h10.666v-4l-2-2-4 4-2-2L1.667 11z\"\n fillRule=\"nonzero\"\n />\n</svg>\n<svg\n data-testid=\"retry\"\n *ngIf=\"icon === 'retry'\"\n width=\"22\"\n height=\"20\"\n viewBox=\"0 0 22 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M20 5.535V2a1 1 0 0 1 2 0v6a1 1 0 0 1-1 1h-6a1 1 0 0 1 0-2h3.638l-2.975-2.653a8 8 0 1 0 1.884 8.32 1 1 0 1 1 1.886.666A10 10 0 1 1 5.175 1.245c3.901-2.15 8.754-1.462 11.88 1.667L20 5.535z\"\n fill=\"#FFF\"\n fill-rule=\"nonzero\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'close'\"\n data-testid=\"close\"\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 28 28\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n>\n <defs>\n <path\n d=\"M465 5c5.53 0 10 4.47 10 10s-4.47 10-10 10-10-4.47-10-10 4.47-10 10-10zm3.59 5L465 13.59 461.41 10 460 11.41l3.59 3.59-3.59 3.59 1.41 1.41 3.59-3.59 3.59 3.59 1.41-1.41-3.59-3.59 3.59-3.59-1.41-1.41z\"\n id=\"b\"\n />\n <filter\n x=\"-30%\"\n y=\"-30%\"\n width=\"160%\"\n height=\"160%\"\n filterUnits=\"objectBoundingBox\"\n id=\"a\"\n >\n <feOffset in=\"SourceAlpha\" result=\"shadowOffsetOuter1\" />\n <feGaussianBlur\n stdDeviation=\"2\"\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n />\n <feColorMatrix\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0\"\n in=\"shadowBlurOuter1\"\n />\n </filter>\n </defs>\n <g transform=\"translate(-451 -1)\" fill-rule=\"nonzero\" fill=\"none\">\n <use fill=\"#000\" filter=\"url(#a)\" xlink:href=\"#b\" />\n <use fill=\"#FFF\" fill-rule=\"evenodd\" xlink:href=\"#b\" />\n </g>\n</svg>\n<svg\n *ngIf=\"icon === 'file'\"\n data-testid=\"file\"\n className=\"rfu-file-icon--small fa-file-fallback\"\n [attr.height]=\"size || 20\"\n [attr.width]=\"size || 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 384 512\"\n>\n <path\n d=\"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z\"\n fill=\"#414D54\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'reply'\"\n data-testid=\"reply\"\n height=\"15\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M.56 10.946H.06l-.002-.498L.025.92a.5.5 0 1 1 1-.004l.032 9.029H9.06v-4l9 4.5-9 4.5v-4H.56z\"\n fillRule=\"nonzero\"\n />\n</svg>\n<svg\n height=\"10\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"close-no-outline\"\n *ngIf=\"icon === 'close-no-outline'\"\n>\n <path\n d=\"M9.916 1.027L8.973.084 5 4.058 1.027.084l-.943.943L4.058 5 .084 8.973l.943.943L5 5.942l3.973 3.974.943-.943L5.942 5z\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n height=\"10\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"reply-in-thread\"\n *ngIf=\"icon === 'reply-in-thread'\"\n>\n <path\n d=\"M8.516 3c4.78 0 4.972 6.5 4.972 6.5-1.6-2.906-2.847-3.184-4.972-3.184v2.872L3.772 4.994 8.516.5V3zM.484 5l4.5-4.237v1.78L2.416 5l2.568 2.125v1.828L.484 5z\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'arrow-left'\"\n data-testid=\"arrow-left\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M15.7049 7.41L14.2949 6L8.29492 12L14.2949 18L15.7049 16.59L11.1249 12L15.7049 7.41Z\"\n fill=\"var(--black)\"\n />\n</svg>\n\n<svg\n *ngIf=\"icon === 'arrow-right'\"\n data-testid=\"arrow-right\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M9.70492 6L8.29492 7.41L12.8749 12L8.29492 16.59L9.70492 18L15.7049 12L9.70492 6Z\"\n fill=\"var(--black)\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'menu'\"\n data-testid=\"menu\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3 8V6H21V8H3ZM3 13H21V11H3V13ZM3 18H21V16H3V18Z\"\n fill=\"black\"\n />\n</svg>\n", directives: [{ type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2__namespace.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] });
|
|
2226
2386
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: IconComponent, decorators: [{
|
|
2227
2387
|
type: i0.Component,
|
|
2228
2388
|
args: [{
|
|
@@ -2236,6 +2396,36 @@
|
|
|
2236
2396
|
type: i0.Input
|
|
2237
2397
|
}] } });
|
|
2238
2398
|
|
|
2399
|
+
/**
|
|
2400
|
+
* The `IconPlaceholder` component displays the [default icons](./IconComponent.mdx) unless a [custom template](../services/CustomTemplatesService.mdx) is provided. This componet is used by the SDK internally, you likely won't need to use it.
|
|
2401
|
+
*/
|
|
2402
|
+
var IconPlaceholderComponent = /** @class */ (function () {
|
|
2403
|
+
function IconPlaceholderComponent(customTemplatesService) {
|
|
2404
|
+
this.customTemplatesService = customTemplatesService;
|
|
2405
|
+
}
|
|
2406
|
+
IconPlaceholderComponent.prototype.getIconContext = function () {
|
|
2407
|
+
return {
|
|
2408
|
+
icon: this.icon,
|
|
2409
|
+
size: this.size,
|
|
2410
|
+
};
|
|
2411
|
+
};
|
|
2412
|
+
return IconPlaceholderComponent;
|
|
2413
|
+
}());
|
|
2414
|
+
IconPlaceholderComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: IconPlaceholderComponent, deps: [{ token: CustomTemplatesService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
2415
|
+
IconPlaceholderComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: { icon: "icon", size: "size" }, ngImport: i0__namespace, template: "<ng-template #defaultIcon let-icon=\"icon\" let-size=\"size\">\n <stream-icon [icon]=\"icon\" [size]=\"size\"></stream-icon>\n</ng-template>\n<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.iconTemplate$ | async) || defaultIcon;\n context: getIconContext()\n \"\n></ng-container>\n", components: [{ type: IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }], directives: [{ type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i3__namespace.AsyncPipe } });
|
|
2416
|
+
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: IconPlaceholderComponent, decorators: [{
|
|
2417
|
+
type: i0.Component,
|
|
2418
|
+
args: [{
|
|
2419
|
+
selector: 'stream-icon-placeholder',
|
|
2420
|
+
templateUrl: './icon-placeholder.component.html',
|
|
2421
|
+
styles: [],
|
|
2422
|
+
}]
|
|
2423
|
+
}], ctorParameters: function () { return [{ type: CustomTemplatesService }]; }, propDecorators: { icon: [{
|
|
2424
|
+
type: i0.Input
|
|
2425
|
+
}], size: [{
|
|
2426
|
+
type: i0.Input
|
|
2427
|
+
}] } });
|
|
2428
|
+
|
|
2239
2429
|
/**
|
|
2240
2430
|
* The `LoadingIndicator` component displays a spinner to indicate that an action is in progress.
|
|
2241
2431
|
*/
|
|
@@ -2253,7 +2443,7 @@
|
|
|
2253
2443
|
return LoadingIndicatorComponent;
|
|
2254
2444
|
}());
|
|
2255
2445
|
LoadingIndicatorComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: LoadingIndicatorComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
2256
|
-
LoadingIndicatorComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: { size: "size", color: "color" }, ngImport: i0__namespace, template: "<div class=\"str-chat__loading-indicator\">\n <svg\n [attr.height]=\"size\"\n viewBox=\"0 0 30 30\"\n [attr.width]=\"size\"\n data-testid=\"loading-indicator\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <linearGradient id=\"a\" x1=\"50%\" x2=\"50%\" y1=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#FFF\" stop-opacity=\"0\" />\n <stop\n data-testid=\"stop-color\"\n offset=\"100%\"\n [attr.stop-color]=\"color\"\n stop-opacity=\"1\"\n [ngStyle]=\"{ stopColor: color }\"\n />\n </linearGradient>\n </defs>\n <path\n d=\"M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z\"\n fill=\"url(#a)\"\n fillRule=\"evenodd\"\n />\n </svg>\n</div>\n", directives: [{ type:
|
|
2446
|
+
LoadingIndicatorComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: { size: "size", color: "color" }, ngImport: i0__namespace, template: "<div class=\"str-chat__loading-indicator\">\n <svg\n [attr.height]=\"size\"\n viewBox=\"0 0 30 30\"\n [attr.width]=\"size\"\n data-testid=\"loading-indicator\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <linearGradient id=\"a\" x1=\"50%\" x2=\"50%\" y1=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#FFF\" stop-opacity=\"0\" />\n <stop\n data-testid=\"stop-color\"\n offset=\"100%\"\n [attr.stop-color]=\"color\"\n stop-opacity=\"1\"\n [ngStyle]=\"{ stopColor: color }\"\n />\n </linearGradient>\n </defs>\n <path\n d=\"M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z\"\n fill=\"url(#a)\"\n fillRule=\"evenodd\"\n />\n </svg>\n</div>\n", directives: [{ type: i3__namespace.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
2257
2447
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: LoadingIndicatorComponent, decorators: [{
|
|
2258
2448
|
type: i0.Component,
|
|
2259
2449
|
args: [{
|
|
@@ -2267,6 +2457,117 @@
|
|
|
2267
2457
|
type: i0.Input
|
|
2268
2458
|
}] } });
|
|
2269
2459
|
|
|
2460
|
+
/**
|
|
2461
|
+
* The `LoadingInficatorPlaceholder` component displays the [default loading indicator](./LoadingIndicatorComponent.mdx) unless a [custom template](../services/CustomTemplatesService.mdx) is provided. This componet is used by the SDK internally, you likely won't need to use it.
|
|
2462
|
+
*/
|
|
2463
|
+
var LoadingIndicatorPlaceholderComponent = /** @class */ (function () {
|
|
2464
|
+
function LoadingIndicatorPlaceholderComponent(customTemplatesService) {
|
|
2465
|
+
this.customTemplatesService = customTemplatesService;
|
|
2466
|
+
/**
|
|
2467
|
+
* The size of the indicator (in pixels)
|
|
2468
|
+
*/
|
|
2469
|
+
this.size = 15;
|
|
2470
|
+
/**
|
|
2471
|
+
* The color of the indicator
|
|
2472
|
+
*/
|
|
2473
|
+
this.color = '#006CFF';
|
|
2474
|
+
}
|
|
2475
|
+
LoadingIndicatorPlaceholderComponent.prototype.getLoadingIndicatorContext = function () {
|
|
2476
|
+
return {
|
|
2477
|
+
size: this.size,
|
|
2478
|
+
color: this.color,
|
|
2479
|
+
};
|
|
2480
|
+
};
|
|
2481
|
+
return LoadingIndicatorPlaceholderComponent;
|
|
2482
|
+
}());
|
|
2483
|
+
LoadingIndicatorPlaceholderComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: LoadingIndicatorPlaceholderComponent, deps: [{ token: CustomTemplatesService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
2484
|
+
LoadingIndicatorPlaceholderComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: LoadingIndicatorPlaceholderComponent, selector: "stream-loading-indicator-placeholder", inputs: { size: "size", color: "color" }, ngImport: i0__namespace, template: "<ng-template #defaultLoadingIndicator let-size=\"size\" let-color=\"color\">\n <stream-loading-indicator\n [size]=\"size\"\n [color]=\"color\"\n ></stream-loading-indicator>\n</ng-template>\n<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.loadingIndicatorTemplate$ | async) ||\n defaultLoadingIndicator;\n context: getLoadingIndicatorContext()\n \"\n></ng-container>\n", components: [{ type: LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: ["size", "color"] }], directives: [{ type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i3__namespace.AsyncPipe } });
|
|
2485
|
+
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: LoadingIndicatorPlaceholderComponent, decorators: [{
|
|
2486
|
+
type: i0.Component,
|
|
2487
|
+
args: [{
|
|
2488
|
+
selector: 'stream-loading-indicator-placeholder',
|
|
2489
|
+
templateUrl: './loading-indicator-placeholder.component.html',
|
|
2490
|
+
styles: [],
|
|
2491
|
+
}]
|
|
2492
|
+
}], ctorParameters: function () { return [{ type: CustomTemplatesService }]; }, propDecorators: { size: [{
|
|
2493
|
+
type: i0.Input
|
|
2494
|
+
}], color: [{
|
|
2495
|
+
type: i0.Input
|
|
2496
|
+
}] } });
|
|
2497
|
+
|
|
2498
|
+
/**
|
|
2499
|
+
* The `Modal` component displays its content in an overlay. The modal can be closed with a close button, if the user clicks outside of the modal content, or if the escape button is pressed. The modal can also be closed from outside.
|
|
2500
|
+
*/
|
|
2501
|
+
var ModalComponent = /** @class */ (function () {
|
|
2502
|
+
function ModalComponent() {
|
|
2503
|
+
var _this = this;
|
|
2504
|
+
/**
|
|
2505
|
+
* If `true` the modal will be displayed, if `false` the modal will be hidden
|
|
2506
|
+
*/
|
|
2507
|
+
this.isOpen = false;
|
|
2508
|
+
/**
|
|
2509
|
+
* Emits `true` if the modal becomes visible, and `false` if the modal is closed.
|
|
2510
|
+
*/
|
|
2511
|
+
this.isOpenChange = new i0.EventEmitter();
|
|
2512
|
+
this.watchForEscPress = function (event) {
|
|
2513
|
+
if (event.key === 'Escape') {
|
|
2514
|
+
_this.close();
|
|
2515
|
+
}
|
|
2516
|
+
};
|
|
2517
|
+
this.stopWatchForEscPress = function () {
|
|
2518
|
+
window.removeEventListener('keyup', _this.watchForEscPress);
|
|
2519
|
+
};
|
|
2520
|
+
this.watchForOutsideClicks = function (event) {
|
|
2521
|
+
var _a;
|
|
2522
|
+
if (!((_a = _this.innerContainer) === null || _a === void 0 ? void 0 : _a.nativeElement.contains(event.target))) {
|
|
2523
|
+
_this.close();
|
|
2524
|
+
}
|
|
2525
|
+
};
|
|
2526
|
+
}
|
|
2527
|
+
ModalComponent.prototype.ngOnChanges = function (changes) {
|
|
2528
|
+
var _this = this;
|
|
2529
|
+
if (changes.isOpen) {
|
|
2530
|
+
if (this.isOpen) {
|
|
2531
|
+
window.addEventListener('keyup', this.watchForEscPress);
|
|
2532
|
+
setTimeout(function () { return window.addEventListener('click', _this.watchForOutsideClicks); }, 0);
|
|
2533
|
+
}
|
|
2534
|
+
else {
|
|
2535
|
+
this.stopWatchForOutsideClicks();
|
|
2536
|
+
this.stopWatchForEscPress();
|
|
2537
|
+
}
|
|
2538
|
+
}
|
|
2539
|
+
};
|
|
2540
|
+
ModalComponent.prototype.close = function () {
|
|
2541
|
+
this.isOpen = false;
|
|
2542
|
+
this.isOpenChange.emit(false);
|
|
2543
|
+
this.stopWatchForOutsideClicks();
|
|
2544
|
+
this.stopWatchForEscPress();
|
|
2545
|
+
};
|
|
2546
|
+
ModalComponent.prototype.stopWatchForOutsideClicks = function () {
|
|
2547
|
+
window.removeEventListener('click', this.watchForOutsideClicks);
|
|
2548
|
+
};
|
|
2549
|
+
return ModalComponent;
|
|
2550
|
+
}());
|
|
2551
|
+
ModalComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ModalComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
2552
|
+
ModalComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ModalComponent, selector: "stream-modal", inputs: { isOpen: "isOpen", content: "content" }, outputs: { isOpenChange: "isOpenChange" }, viewQueries: [{ propertyName: "innerContainer", first: true, predicate: ["modalInner"], descendants: true }], usesOnChanges: true, ngImport: i0__namespace, template: "<div\n data-testid=\"modal\"\n class=\"str-chat__modal str-chat__modal--{{ isOpen ? 'open' : 'close' }}\"\n>\n <div\n data-testid=\"close\"\n class=\"str-chat__modal__close-button\"\n (click)=\"close()\"\n (keyup.enter)=\"close()\"\n translate\n >\n streamChat.Close\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </div>\n <div class=\"str-chat__modal__inner\" #modalInner>\n <ng-container *ngIf=\"content; else elseContent\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n <ng-template #elseContent>\n <ng-content></ng-content>\n </ng-template>\n </div>\n</div>\n", components: [{ type: IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }], directives: [{ type: i2__namespace.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
|
2553
|
+
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ModalComponent, decorators: [{
|
|
2554
|
+
type: i0.Component,
|
|
2555
|
+
args: [{
|
|
2556
|
+
selector: 'stream-modal',
|
|
2557
|
+
templateUrl: './modal.component.html',
|
|
2558
|
+
styles: [],
|
|
2559
|
+
}]
|
|
2560
|
+
}], ctorParameters: function () { return []; }, propDecorators: { isOpen: [{
|
|
2561
|
+
type: i0.Input
|
|
2562
|
+
}], content: [{
|
|
2563
|
+
type: i0.Input
|
|
2564
|
+
}], isOpenChange: [{
|
|
2565
|
+
type: i0.Output
|
|
2566
|
+
}], innerContainer: [{
|
|
2567
|
+
type: i0.ViewChild,
|
|
2568
|
+
args: ['modalInner']
|
|
2569
|
+
}] } });
|
|
2570
|
+
|
|
2270
2571
|
var textareaInjectionToken = new i0.InjectionToken('textareaInjectionToken');
|
|
2271
2572
|
|
|
2272
2573
|
var TextareaDirective = /** @class */ (function () {
|
|
@@ -2294,10 +2595,6 @@
|
|
|
2294
2595
|
this.subscriptions.push(this.componentRef.instance.userMentions.subscribe(function (value) { return _this.userMentions.next(value); }));
|
|
2295
2596
|
}
|
|
2296
2597
|
this.componentRef.instance.areMentionsEnabled = this.areMentionsEnabled;
|
|
2297
|
-
this.componentRef.instance.mentionAutocompleteItemTemplate =
|
|
2298
|
-
this.mentionAutocompleteItemTemplate;
|
|
2299
|
-
this.componentRef.instance.commandAutocompleteItemTemplate =
|
|
2300
|
-
this.commandAutocompleteItemTemplate;
|
|
2301
2598
|
this.componentRef.instance.mentionScope = this.mentionScope;
|
|
2302
2599
|
this.componentRef.instance.value = this.value;
|
|
2303
2600
|
}
|
|
@@ -2305,14 +2602,6 @@
|
|
|
2305
2602
|
if (changes.areMentionsEnabled) {
|
|
2306
2603
|
this.componentRef.instance.areMentionsEnabled = this.areMentionsEnabled;
|
|
2307
2604
|
}
|
|
2308
|
-
if (changes.mentionAutocompleteItemTemplate) {
|
|
2309
|
-
this.componentRef.instance.mentionAutocompleteItemTemplate =
|
|
2310
|
-
this.mentionAutocompleteItemTemplate;
|
|
2311
|
-
}
|
|
2312
|
-
if (changes.commandAutocompleteItemTemplate) {
|
|
2313
|
-
this.componentRef.instance.commandAutocompleteItemTemplate =
|
|
2314
|
-
this.commandAutocompleteItemTemplate;
|
|
2315
|
-
}
|
|
2316
2605
|
if (changes.mentionScope) {
|
|
2317
2606
|
this.componentRef.instance.mentionScope = this.mentionScope;
|
|
2318
2607
|
}
|
|
@@ -2329,7 +2618,7 @@
|
|
|
2329
2618
|
return TextareaDirective;
|
|
2330
2619
|
}());
|
|
2331
2620
|
TextareaDirective.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: TextareaDirective, deps: [{ token: i0__namespace.ViewContainerRef }], target: i0__namespace.ɵɵFactoryTarget.Directive });
|
|
2332
|
-
TextareaDirective.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.5", type: TextareaDirective, selector: "[streamTextarea]", inputs: { componentRef: "componentRef", areMentionsEnabled: "areMentionsEnabled",
|
|
2621
|
+
TextareaDirective.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.5", type: TextareaDirective, selector: "[streamTextarea]", inputs: { componentRef: "componentRef", areMentionsEnabled: "areMentionsEnabled", mentionScope: "mentionScope", value: "value" }, outputs: { valueChange: "valueChange", send: "send", userMentions: "userMentions" }, usesOnChanges: true, ngImport: i0__namespace });
|
|
2333
2622
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: TextareaDirective, decorators: [{
|
|
2334
2623
|
type: i0.Directive,
|
|
2335
2624
|
args: [{
|
|
@@ -2339,12 +2628,8 @@
|
|
|
2339
2628
|
type: i0.Input
|
|
2340
2629
|
}], areMentionsEnabled: [{
|
|
2341
2630
|
type: i0.Input
|
|
2342
|
-
}], mentionAutocompleteItemTemplate: [{
|
|
2343
|
-
type: i0.Input
|
|
2344
2631
|
}], mentionScope: [{
|
|
2345
2632
|
type: i0.Input
|
|
2346
|
-
}], commandAutocompleteItemTemplate: [{
|
|
2347
|
-
type: i0.Input
|
|
2348
2633
|
}], value: [{
|
|
2349
2634
|
type: i0.Input
|
|
2350
2635
|
}], valueChange: [{
|
|
@@ -2430,82 +2715,12 @@
|
|
|
2430
2715
|
}]
|
|
2431
2716
|
}], ctorParameters: function () { return []; } });
|
|
2432
2717
|
|
|
2433
|
-
/**
|
|
2434
|
-
* The `Modal` component displays its content in an overlay. The modal can be closed with a close button, if the user clicks outside of the modal content, or if the escape button is pressed. The modal can also be closed from outside.
|
|
2435
|
-
*/
|
|
2436
|
-
var ModalComponent = /** @class */ (function () {
|
|
2437
|
-
function ModalComponent() {
|
|
2438
|
-
var _this = this;
|
|
2439
|
-
/**
|
|
2440
|
-
* If `true` the modal will be displayed, if `false` the modal will be hidden
|
|
2441
|
-
*/
|
|
2442
|
-
this.isOpen = false;
|
|
2443
|
-
/**
|
|
2444
|
-
* Emits `true` if the modal becomes visible, and `false` if the modal is closed.
|
|
2445
|
-
*/
|
|
2446
|
-
this.isOpenChange = new i0.EventEmitter();
|
|
2447
|
-
this.watchForEscPress = function (event) {
|
|
2448
|
-
if (event.key === 'Escape') {
|
|
2449
|
-
_this.close();
|
|
2450
|
-
}
|
|
2451
|
-
};
|
|
2452
|
-
this.stopWatchForEscPress = function () {
|
|
2453
|
-
window.removeEventListener('keyup', _this.watchForEscPress);
|
|
2454
|
-
};
|
|
2455
|
-
this.watchForOutsideClicks = function (event) {
|
|
2456
|
-
var _a;
|
|
2457
|
-
if (!((_a = _this.content) === null || _a === void 0 ? void 0 : _a.nativeElement.contains(event.target))) {
|
|
2458
|
-
_this.close();
|
|
2459
|
-
}
|
|
2460
|
-
};
|
|
2461
|
-
}
|
|
2462
|
-
ModalComponent.prototype.ngOnChanges = function (changes) {
|
|
2463
|
-
var _this = this;
|
|
2464
|
-
if (changes.isOpen) {
|
|
2465
|
-
if (this.isOpen) {
|
|
2466
|
-
window.addEventListener('keyup', this.watchForEscPress);
|
|
2467
|
-
setTimeout(function () { return window.addEventListener('click', _this.watchForOutsideClicks); }, 0);
|
|
2468
|
-
}
|
|
2469
|
-
else {
|
|
2470
|
-
this.stopWatchForOutsideClicks();
|
|
2471
|
-
this.stopWatchForEscPress();
|
|
2472
|
-
}
|
|
2473
|
-
}
|
|
2474
|
-
};
|
|
2475
|
-
ModalComponent.prototype.close = function () {
|
|
2476
|
-
this.isOpen = false;
|
|
2477
|
-
this.isOpenChange.emit(false);
|
|
2478
|
-
this.stopWatchForOutsideClicks();
|
|
2479
|
-
this.stopWatchForEscPress();
|
|
2480
|
-
};
|
|
2481
|
-
ModalComponent.prototype.stopWatchForOutsideClicks = function () {
|
|
2482
|
-
window.removeEventListener('click', this.watchForOutsideClicks);
|
|
2483
|
-
};
|
|
2484
|
-
return ModalComponent;
|
|
2485
|
-
}());
|
|
2486
|
-
ModalComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ModalComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
2487
|
-
ModalComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ModalComponent, selector: "stream-modal", inputs: { isOpen: "isOpen" }, outputs: { isOpenChange: "isOpenChange" }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], usesOnChanges: true, ngImport: i0__namespace, template: "<div\n data-testid=\"modal\"\n class=\"str-chat__modal str-chat__modal--{{ isOpen ? 'open' : 'close' }}\"\n>\n <div\n data-testid=\"close\"\n class=\"str-chat__modal__close-button\"\n (click)=\"close()\"\n (keyup.enter)=\"close()\"\n translate\n >\n streamChat.Close\n <stream-icon icon=\"close\"></stream-icon>\n </div>\n <div class=\"str-chat__modal__inner\" #content>\n <ng-content></ng-content>\n </div>\n</div>\n", components: [{ type: IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }], directives: [{ type: i2__namespace.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] });
|
|
2488
|
-
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ModalComponent, decorators: [{
|
|
2489
|
-
type: i0.Component,
|
|
2490
|
-
args: [{
|
|
2491
|
-
selector: 'stream-modal',
|
|
2492
|
-
templateUrl: './modal.component.html',
|
|
2493
|
-
styles: [],
|
|
2494
|
-
}]
|
|
2495
|
-
}], ctorParameters: function () { return []; }, propDecorators: { isOpen: [{
|
|
2496
|
-
type: i0.Input
|
|
2497
|
-
}], isOpenChange: [{
|
|
2498
|
-
type: i0.Output
|
|
2499
|
-
}], content: [{
|
|
2500
|
-
type: i0.ViewChild,
|
|
2501
|
-
args: ['content']
|
|
2502
|
-
}] } });
|
|
2503
|
-
|
|
2504
2718
|
/**
|
|
2505
2719
|
* The `AttachmentList` compontent displays the attachments of a message
|
|
2506
2720
|
*/
|
|
2507
2721
|
var AttachmentListComponent = /** @class */ (function () {
|
|
2508
|
-
function AttachmentListComponent(imageLoadService, channelService) {
|
|
2722
|
+
function AttachmentListComponent(customTemplatesService, imageLoadService, channelService) {
|
|
2723
|
+
this.customTemplatesService = customTemplatesService;
|
|
2509
2724
|
this.imageLoadService = imageLoadService;
|
|
2510
2725
|
this.channelService = channelService;
|
|
2511
2726
|
/**
|
|
@@ -2548,6 +2763,14 @@
|
|
|
2548
2763
|
AttachmentListComponent.prototype.getFileSize = function (attachment) {
|
|
2549
2764
|
return prettybytes__default['default'](Number(attachment.file_size));
|
|
2550
2765
|
};
|
|
2766
|
+
AttachmentListComponent.prototype.getModalContext = function () {
|
|
2767
|
+
var _this = this;
|
|
2768
|
+
return {
|
|
2769
|
+
isOpen: this.imagesToView && this.imagesToView.length > 0,
|
|
2770
|
+
isOpenChangeHandler: function (isOpen) { return (isOpen ? null : _this.closeImageModal()); },
|
|
2771
|
+
content: this.modalContent,
|
|
2772
|
+
};
|
|
2773
|
+
};
|
|
2551
2774
|
AttachmentListComponent.prototype.trimUrl = function (url) {
|
|
2552
2775
|
if (url !== undefined && url !== null) {
|
|
2553
2776
|
var _a = __read(url
|
|
@@ -2571,9 +2794,6 @@
|
|
|
2571
2794
|
this.imagesToView = attachments;
|
|
2572
2795
|
this.imagesToViewCurrentIndex = selectedIndex;
|
|
2573
2796
|
};
|
|
2574
|
-
AttachmentListComponent.prototype.closeImageModal = function () {
|
|
2575
|
-
this.imagesToView = [];
|
|
2576
|
-
};
|
|
2577
2797
|
AttachmentListComponent.prototype.stepImages = function (dir) {
|
|
2578
2798
|
this.imagesToViewCurrentIndex += dir * 1;
|
|
2579
2799
|
};
|
|
@@ -2602,10 +2822,13 @@
|
|
|
2602
2822
|
},
|
|
2603
2823
|
];
|
|
2604
2824
|
};
|
|
2825
|
+
AttachmentListComponent.prototype.closeImageModal = function () {
|
|
2826
|
+
this.imagesToView = [];
|
|
2827
|
+
};
|
|
2605
2828
|
return AttachmentListComponent;
|
|
2606
2829
|
}());
|
|
2607
|
-
AttachmentListComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AttachmentListComponent, deps: [{ token: ImageLoadService }, { token: ChannelService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
2608
|
-
AttachmentListComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AttachmentListComponent, selector: "stream-attachment-list", inputs: { messageId: "messageId", attachments: "attachments" }, usesOnChanges: true, ngImport: i0__namespace, template: "<ng-container *ngFor=\"let attachment of orderedAttachments; trackBy: trackById\">\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }}\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n >\n <img\n *ngIf=\"isImage(attachment)\"\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"attachment.img_url || attachment.thumb_url || attachment.image_url\"\n [alt]=\"attachment?.fallback\"\n (load)=\"imageLoaded()\"\n (click)=\"openImageModal([attachment])\"\n (keyup.enter)=\"openImageModal([attachment])\"\n />\n <div\n class=\"str-chat__gallery\"\n data-testid=\"image-gallery\"\n *ngIf=\"isGallery(attachment)\"\n [class.str-chat__gallery--square]=\"(attachment?.images)!.length > 3\"\n >\n <ng-container\n *ngFor=\"\n let galleryImage of attachment.images;\n let index = index;\n let isLast = last;\n trackBy: trackByImageUrl\n \"\n >\n <button\n *ngIf=\"index < 3 || (index === 3 && isLast)\"\n class=\"str-chat__gallery-image\"\n data-testclass=\"gallery-image\"\n (click)=\"openImageModal(attachment.images!, index)\"\n (keyup.enter)=\"openImageModal(attachment.images!, index)\"\n >\n <img\n [src]=\"\n galleryImage.img_url ||\n galleryImage.thumb_url ||\n galleryImage.image_url\n \"\n [alt]=\"galleryImage.fallback\"\n (load)=\"imageLoaded()\"\n />\n </button>\n <button\n *ngIf=\"index === 3 && !isLast\"\n class=\"str-chat__gallery-placeholder\"\n data-testclass=\"gallery-image\"\n (click)=\"openImageModal(attachment.images!, index)\"\n (keyup.enter)=\"openImageModal(attachment.images!, index)\"\n [ngStyle]=\"{\n 'background-image':\n 'url(' +\n (galleryImage.img_url ||\n galleryImage.thumb_url ||\n galleryImage.image_url) +\n ')'\n }\"\n >\n <p\n [innerHTML]=\"\n 'streamChat.{{ imageCount }} more'\n | translate: { imageCount: attachment!.images!.length - 4 }\n \"\n ></p>\n </button>\n </ng-container>\n </div>\n <div\n *ngIf=\"isFile(attachment)\"\n class=\"\n str-chat__message-attachment-file--item\n str-chat-angular__message-attachment-file-single\n \"\n >\n <stream-icon
|
|
2830
|
+
AttachmentListComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AttachmentListComponent, deps: [{ token: CustomTemplatesService }, { token: ImageLoadService }, { token: ChannelService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
2831
|
+
AttachmentListComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AttachmentListComponent, selector: "stream-attachment-list", inputs: { messageId: "messageId", attachments: "attachments" }, viewQueries: [{ propertyName: "modalContent", first: true, predicate: ["modalContent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0__namespace, template: "<ng-container *ngFor=\"let attachment of orderedAttachments; trackBy: trackById\">\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }}\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n >\n <img\n *ngIf=\"isImage(attachment)\"\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"attachment.img_url || attachment.thumb_url || attachment.image_url\"\n [alt]=\"attachment?.fallback\"\n (load)=\"imageLoaded()\"\n (click)=\"openImageModal([attachment])\"\n (keyup.enter)=\"openImageModal([attachment])\"\n />\n <div\n class=\"str-chat__gallery\"\n data-testid=\"image-gallery\"\n *ngIf=\"isGallery(attachment)\"\n [class.str-chat__gallery--square]=\"(attachment?.images)!.length > 3\"\n >\n <ng-container\n *ngFor=\"\n let galleryImage of attachment.images;\n let index = index;\n let isLast = last;\n trackBy: trackByImageUrl\n \"\n >\n <button\n *ngIf=\"index < 3 || (index === 3 && isLast)\"\n class=\"str-chat__gallery-image\"\n data-testclass=\"gallery-image\"\n (click)=\"openImageModal(attachment.images!, index)\"\n (keyup.enter)=\"openImageModal(attachment.images!, index)\"\n >\n <img\n [src]=\"\n galleryImage.img_url ||\n galleryImage.thumb_url ||\n galleryImage.image_url\n \"\n [alt]=\"galleryImage.fallback\"\n (load)=\"imageLoaded()\"\n />\n </button>\n <button\n *ngIf=\"index === 3 && !isLast\"\n class=\"str-chat__gallery-placeholder\"\n data-testclass=\"gallery-image\"\n (click)=\"openImageModal(attachment.images!, index)\"\n (keyup.enter)=\"openImageModal(attachment.images!, index)\"\n [ngStyle]=\"{\n 'background-image':\n 'url(' +\n (galleryImage.img_url ||\n galleryImage.thumb_url ||\n galleryImage.image_url) +\n ')'\n }\"\n >\n <p\n [innerHTML]=\"\n 'streamChat.{{ imageCount }} more'\n | translate: { imageCount: attachment!.images!.length - 4 }\n \"\n ></p>\n </button>\n </ng-container>\n </div>\n <div\n *ngIf=\"isFile(attachment)\"\n class=\"\n str-chat__message-attachment-file--item\n str-chat-angular__message-attachment-file-single\n \"\n >\n <stream-icon-placeholder\n icon=\"file\"\n [size]=\"30\"\n ></stream-icon-placeholder>\n <div class=\"str-chat__message-attachment-file--item-text\">\n <a\n data-testclass=\"file-link\"\n download\n href=\"{{ attachment.asset_url }}\"\n target=\"_blank\"\n >\n {{ attachment.title }}\n </a>\n <span data-testclass=\"size\" *ngIf=\"hasFileSize(attachment)\">{{\n getFileSize(attachment)\n }}</span>\n </div>\n </div>\n <div\n *ngIf=\"isCard(attachment)\"\n class=\"str-chat__message-attachment-card str-chat__message-attachment-card--{{\n attachment.type\n }}\"\n >\n <div\n *ngIf=\"attachment.image_url || attachment.thumb_url\"\n class=\"str-chat__message-attachment-card--header\"\n >\n <img\n data-testclass=\"card-img\"\n alt=\"{{ attachment.image_url || attachment.thumb_url }}\"\n src=\"{{ attachment.image_url || attachment.thumb_url }}\"\n />\n </div>\n <div class=\"str-chat__message-attachment-card--content\">\n <div class=\"str-chat__message-attachment-card--flex\">\n <div\n *ngIf=\"attachment.title\"\n data-testclass=\"card-title\"\n class=\"str-chat__message-attachment-card--title\"\n >\n {{ attachment.title }}\n </div>\n <div\n *ngIf=\"attachment.text\"\n class=\"str-chat__message-attachment-card--text\"\n data-testclass=\"card-text\"\n >\n {{ attachment.text }}\n </div>\n <a\n class=\"str-chat__message-attachment-card--url\"\n *ngIf=\"attachment.title_link || attachment.og_scrape_url\"\n data-testclass=\"url-link\"\n noopener\n noreferrer\n href=\"{{ attachment.title_link || attachment.og_scrape_url }}\"\n target=\"_blank\"\n >\n {{ trimUrl(attachment.title_link || attachment.og_scrape_url) }}\n </a>\n </div>\n </div>\n </div>\n <div\n class=\"str-chat__message-attachment-actions\"\n *ngIf=\"attachment.actions && attachment.actions.length > 0\"\n >\n <div class=\"str-chat__message-attachment-actions-form\">\n <button\n *ngFor=\"let action of attachment.actions; trackBy: trackByActionValue\"\n class=\"str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--{{\n action.style\n }}\"\n data-testclass=\"attachment-action\"\n (click)=\"sendAction(action)\"\n (keyup.enter)=\"sendAction(action)\"\n >\n {{ action.text }}\n </button>\n </div>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"imagesToView && imagesToView.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getModalContext()\n \"\n ></ng-container>\n</ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n [isOpen]=\"isOpen\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n [content]=\"content\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"stream-chat-angular__image-modal\">\n <button\n class=\"stream-chat-angular__image-modal-stepper\"\n [ngStyle]=\"{\n visibility: isImageModalPrevButtonVisible ? 'visible' : 'hidden'\n }\"\n data-testid=\"image-modal-prev\"\n type=\"button\"\n (click)=\"stepImages(-1)\"\n (keyup.enter)=\"stepImages(-1)\"\n >\n <stream-icon-placeholder icon=\"arrow-left\"></stream-icon-placeholder>\n </button>\n <img\n class=\"stream-chat-angular__image-modal-image\"\n data-testid=\"modal-image\"\n [src]=\"\n imagesToView[imagesToViewCurrentIndex].img_url ||\n imagesToView[imagesToViewCurrentIndex].thumb_url ||\n imagesToView[imagesToViewCurrentIndex].image_url\n \"\n [alt]=\"imagesToView[imagesToViewCurrentIndex].fallback\"\n />\n <button\n class=\"stream-chat-angular__image-modal-stepper\"\n type=\"button\"\n [ngStyle]=\"{\n visibility: isImageModalNextButtonVisible ? 'visible' : 'hidden'\n }\"\n data-testid=\"image-modal-next\"\n (click)=\"stepImages(1)\"\n (keyup.enter)=\"stepImages(1)\"\n >\n <stream-icon-placeholder icon=\"arrow-right\"></stream-icon-placeholder>\n </button>\n </div>\n</ng-template>\n", components: [{ type: IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }], directives: [{ type: i3__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "translate": i2__namespace.TranslatePipe, "async": i3__namespace.AsyncPipe } });
|
|
2609
2832
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AttachmentListComponent, decorators: [{
|
|
2610
2833
|
type: i0.Component,
|
|
2611
2834
|
args: [{
|
|
@@ -2613,51 +2836,42 @@
|
|
|
2613
2836
|
templateUrl: './attachment-list.component.html',
|
|
2614
2837
|
styles: [],
|
|
2615
2838
|
}]
|
|
2616
|
-
}], ctorParameters: function () { return [{ type: ImageLoadService }, { type: ChannelService }]; }, propDecorators: { messageId: [{
|
|
2839
|
+
}], ctorParameters: function () { return [{ type: CustomTemplatesService }, { type: ImageLoadService }, { type: ChannelService }]; }, propDecorators: { messageId: [{
|
|
2617
2840
|
type: i0.Input
|
|
2618
2841
|
}], attachments: [{
|
|
2619
2842
|
type: i0.Input
|
|
2843
|
+
}], modalContent: [{
|
|
2844
|
+
type: i0.ViewChild,
|
|
2845
|
+
args: ['modalContent', { static: true }]
|
|
2620
2846
|
}] } });
|
|
2621
2847
|
|
|
2622
2848
|
/**
|
|
2623
2849
|
* The `AttachmentPreviewList` compontent displays a preview of the attachments uploaded to a message. Users can delete attachments using the preview component, or retry upload if it failed previously.
|
|
2624
2850
|
*/
|
|
2625
2851
|
var AttachmentPreviewListComponent = /** @class */ (function () {
|
|
2626
|
-
function AttachmentPreviewListComponent(
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
}
|
|
2639
|
-
});
|
|
2640
|
-
});
|
|
2852
|
+
function AttachmentPreviewListComponent() {
|
|
2853
|
+
/**
|
|
2854
|
+
* An output to notify the parent component if the user tries to retry a failed upload
|
|
2855
|
+
*/
|
|
2856
|
+
this.retryAttachmentUpload = new i0.EventEmitter();
|
|
2857
|
+
/**
|
|
2858
|
+
* An output to notify the parent component if the user wants to delete a file
|
|
2859
|
+
*/
|
|
2860
|
+
this.deleteAttachment = new i0.EventEmitter();
|
|
2861
|
+
}
|
|
2862
|
+
AttachmentPreviewListComponent.prototype.attachmentUploadRetried = function (file) {
|
|
2863
|
+
this.retryAttachmentUpload.emit(file);
|
|
2641
2864
|
};
|
|
2642
|
-
AttachmentPreviewListComponent.prototype.
|
|
2643
|
-
|
|
2644
|
-
return __generator(this, function (_a) {
|
|
2645
|
-
switch (_a.label) {
|
|
2646
|
-
case 0: return [4 /*yield*/, this.attachmentService.deleteAttachment(upload)];
|
|
2647
|
-
case 1:
|
|
2648
|
-
_a.sent();
|
|
2649
|
-
return [2 /*return*/];
|
|
2650
|
-
}
|
|
2651
|
-
});
|
|
2652
|
-
});
|
|
2865
|
+
AttachmentPreviewListComponent.prototype.attachmentDeleted = function (upload) {
|
|
2866
|
+
this.deleteAttachment.emit(upload);
|
|
2653
2867
|
};
|
|
2654
2868
|
AttachmentPreviewListComponent.prototype.trackByFile = function (_, item) {
|
|
2655
2869
|
return item.file;
|
|
2656
2870
|
};
|
|
2657
2871
|
return AttachmentPreviewListComponent;
|
|
2658
2872
|
}());
|
|
2659
|
-
AttachmentPreviewListComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AttachmentPreviewListComponent, deps: [
|
|
2660
|
-
AttachmentPreviewListComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AttachmentPreviewListComponent, selector: "stream-attachment-preview-list", ngImport: i0__namespace, template: "<div class=\"rfu-image-previewer\" *ngIf=\"(attachmentUploads$ | async)?.length\">\n <ng-container\n *ngFor=\"\n let attachmentUpload of attachmentUploads$ | async;\n trackBy: trackByFile\n \"\n >\n <div\n *ngIf=\"attachmentUpload.type === 'image'\"\n class=\"rfu-image-previewer__image\"\n [class.rfu-image-previewer__image--loaded]=\"\n attachmentUpload.state === 'success'\n \"\n data-testclass=\"attachment-image-preview\"\n >\n <div\n *ngIf=\"attachmentUpload.state === 'error'\"\n class=\"rfu-image-previewer__retry\"\n (click)=\"
|
|
2873
|
+
AttachmentPreviewListComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AttachmentPreviewListComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
2874
|
+
AttachmentPreviewListComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AttachmentPreviewListComponent, selector: "stream-attachment-preview-list", inputs: { attachmentUploads$: "attachmentUploads$" }, outputs: { retryAttachmentUpload: "retryAttachmentUpload", deleteAttachment: "deleteAttachment" }, ngImport: i0__namespace, template: "<div class=\"rfu-image-previewer\" *ngIf=\"(attachmentUploads$ | async)?.length\">\n <ng-container\n *ngFor=\"\n let attachmentUpload of attachmentUploads$ | async;\n trackBy: trackByFile\n \"\n >\n <div\n *ngIf=\"attachmentUpload.type === 'image'\"\n class=\"rfu-image-previewer__image\"\n [class.rfu-image-previewer__image--loaded]=\"\n attachmentUpload.state === 'success'\n \"\n data-testclass=\"attachment-image-preview\"\n >\n <div\n *ngIf=\"attachmentUpload.state === 'error'\"\n class=\"rfu-image-previewer__retry\"\n (click)=\"attachmentUploadRetried(attachmentUpload.file)\"\n (keyup.enter)=\"attachmentUploadRetried(attachmentUpload.file)\"\n data-testclass=\"upload-error\"\n >\n <stream-icon-placeholder icon=\"retry\"></stream-icon-placeholder>\n </div>\n <div class=\"rfu-thumbnail__wrapper\" style=\"width: 100; height: 100\">\n <div class=\"rfu-thumbnail__overlay\">\n <div\n class=\"rfu-icon-button\"\n data-testclass=\"delete-attachment\"\n role=\"button\"\n (click)=\"attachmentDeleted(attachmentUpload)\"\n (keyup.enter)=\"attachmentDeleted(attachmentUpload)\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </div>\n </div>\n <img\n *ngIf=\"attachmentUpload.url || attachmentUpload.previewUri\"\n src=\"{{\n attachmentUpload.url\n ? attachmentUpload.url\n : attachmentUpload.previewUri\n }}\"\n alt=\"attachmentUpload.file.name\"\n class=\"rfu-thumbnail__image\"\n data-testclass=\"attachment-image\"\n />\n </div>\n <stream-loading-indicator-placeholder\n data-testclass=\"loading-indicator\"\n color=\"rgba(255,255,255,0.7)\"\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n ></stream-loading-indicator-placeholder>\n </div>\n <div\n class=\"rfu-file-previewer\"\n *ngIf=\"attachmentUpload.type === 'file'\"\n data-testclass=\"attachment-file-preview\"\n >\n <ol>\n <li\n class=\"rfu-file-previewer__file\"\n [class.rfu-file-previewer__file--uploading]=\"\n attachmentUpload.state === 'uploading'\n \"\n [class.rfu-file-previewer__file--failed]=\"\n attachmentUpload.state === 'error'\n \"\n >\n <stream-icon-placeholder icon=\"file\"></stream-icon-placeholder>\n\n <a\n data-testclass=\"file-download-link\"\n href=\"{{ attachmentUpload.url }}\"\n (click)=\"attachmentUpload.url ? null : $event.preventDefault()\"\n (keyup.enter)=\"\n attachmentUpload.url ? null : $event.preventDefault()\n \"\n download\n >\n {{ attachmentUpload.file.name }}\n <ng-container *ngIf=\"attachmentUpload.state === 'error'\">\n <div\n data-testclass=\"file-upload-retry\"\n class=\"rfu-file-previewer__failed\"\n (click)=\"attachmentUploadRetried(attachmentUpload.file)\"\n (keyup.enter)=\"attachmentUploadRetried(attachmentUpload.file)\"\n translate\n >\n streamChat.failed\n </div>\n <div\n class=\"rfu-file-previewer__retry\"\n (click)=\"attachmentUploadRetried(attachmentUpload.file)\"\n (keyup.enter)=\"attachmentUploadRetried(attachmentUpload.file)\"\n translate\n >\n streamChat.retry\n </div>\n </ng-container>\n </a>\n\n <span\n data-testclass=\"file-delete\"\n class=\"rfu-file-previewer__close-button\"\n (click)=\"attachmentDeleted(attachmentUpload)\"\n (keyup.enter)=\"attachmentDeleted(attachmentUpload)\"\n >\n \u2718\n </span>\n <div\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n class=\"rfu-file-previewer__loading-indicator\"\n >\n <stream-loading-indicator-placeholder></stream-loading-indicator-placeholder>\n </div>\n </li>\n </ol>\n </div>\n </ng-container>\n</div>\n", components: [{ type: IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: LoadingIndicatorPlaceholderComponent, selector: "stream-loading-indicator-placeholder", inputs: ["size", "color"] }], directives: [{ type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2__namespace.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "async": i3__namespace.AsyncPipe } });
|
|
2661
2875
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AttachmentPreviewListComponent, decorators: [{
|
|
2662
2876
|
type: i0.Component,
|
|
2663
2877
|
args: [{
|
|
@@ -2665,13 +2879,19 @@
|
|
|
2665
2879
|
templateUrl: './attachment-preview-list.component.html',
|
|
2666
2880
|
styles: [],
|
|
2667
2881
|
}]
|
|
2668
|
-
}], ctorParameters: function () { return [
|
|
2882
|
+
}], ctorParameters: function () { return []; }, propDecorators: { attachmentUploads$: [{
|
|
2883
|
+
type: i0.Input
|
|
2884
|
+
}], retryAttachmentUpload: [{
|
|
2885
|
+
type: i0.Output
|
|
2886
|
+
}], deleteAttachment: [{
|
|
2887
|
+
type: i0.Output
|
|
2888
|
+
}] } });
|
|
2669
2889
|
|
|
2670
2890
|
/**
|
|
2671
2891
|
* The `MessageInput` component displays an input where users can type their messages and upload files, and sends the message to the active channel. The component can be used to compose new messages or update existing ones. To send messages, the chat user needs to have the necessary [channel capability](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript).
|
|
2672
2892
|
*/
|
|
2673
2893
|
var MessageInputComponent = /** @class */ (function () {
|
|
2674
|
-
function MessageInputComponent(channelService, notificationService, attachmentService, configService, textareaType, componentFactoryResolver, cdRef, chatClient, emojiInputService) {
|
|
2894
|
+
function MessageInputComponent(channelService, notificationService, attachmentService, configService, textareaType, componentFactoryResolver, cdRef, chatClient, emojiInputService, customTemplatesService) {
|
|
2675
2895
|
var _this = this;
|
|
2676
2896
|
this.channelService = channelService;
|
|
2677
2897
|
this.notificationService = notificationService;
|
|
@@ -2682,6 +2902,7 @@
|
|
|
2682
2902
|
this.cdRef = cdRef;
|
|
2683
2903
|
this.chatClient = chatClient;
|
|
2684
2904
|
this.emojiInputService = emojiInputService;
|
|
2905
|
+
this.customTemplatesService = customTemplatesService;
|
|
2685
2906
|
/**
|
|
2686
2907
|
* Determines if the message is being dispalyed in a channel or in a [thread](https://getstream.io/chat/docs/javascript/threads/?language=javascript).
|
|
2687
2908
|
*/
|
|
@@ -2726,16 +2947,10 @@
|
|
|
2726
2947
|
}));
|
|
2727
2948
|
this.attachmentUploads$ = this.attachmentService.attachmentUploads$;
|
|
2728
2949
|
this.isFileUploadEnabled = this.configService.isFileUploadEnabled;
|
|
2729
|
-
this.acceptedFileTypes = this.configService.acceptedFileTypes;
|
|
2730
2950
|
this.isMultipleFileUploadEnabled =
|
|
2731
2951
|
this.configService.isMultipleFileUploadEnabled;
|
|
2732
2952
|
this.areMentionsEnabled = this.configService.areMentionsEnabled;
|
|
2733
|
-
this.mentionAutocompleteItemTemplate =
|
|
2734
|
-
this.configService.mentionAutocompleteItemTemplate;
|
|
2735
2953
|
this.mentionScope = this.configService.mentionScope;
|
|
2736
|
-
this.commandAutocompleteItemTemplate =
|
|
2737
|
-
this.configService.commandAutocompleteItemTemplate;
|
|
2738
|
-
this.emojiPickerTemplate = this.configService.emojiPickerTemplate;
|
|
2739
2954
|
this.subscriptions.push(this.typingStart$.subscribe(function () { return void _this.channelService.typingStarted(_this.parentMessageId); }));
|
|
2740
2955
|
this.subscriptions.push(rxjs.combineLatest([
|
|
2741
2956
|
this.channelService.latestMessageDateByUserByChannels$,
|
|
@@ -2762,11 +2977,23 @@
|
|
|
2762
2977
|
}
|
|
2763
2978
|
}));
|
|
2764
2979
|
}
|
|
2980
|
+
MessageInputComponent.prototype.ngOnInit = function () {
|
|
2981
|
+
var _this = this;
|
|
2982
|
+
this.subscriptions.push(this.customTemplatesService.emojiPickerTemplate$.subscribe(function (template) {
|
|
2983
|
+
_this.emojiPickerTemplate = template;
|
|
2984
|
+
_this.cdRef.detectChanges();
|
|
2985
|
+
}));
|
|
2986
|
+
this.subscriptions.push(this.customTemplatesService.attachmentPreviewListTemplate$.subscribe(function (template) {
|
|
2987
|
+
_this.attachmentPreviewListTemplate = template;
|
|
2988
|
+
_this.cdRef.detectChanges();
|
|
2989
|
+
}));
|
|
2990
|
+
};
|
|
2765
2991
|
MessageInputComponent.prototype.ngAfterViewInit = function () {
|
|
2766
2992
|
this.isViewInited = true;
|
|
2767
2993
|
this.initTextarea();
|
|
2768
2994
|
};
|
|
2769
2995
|
MessageInputComponent.prototype.ngOnChanges = function (changes) {
|
|
2996
|
+
var _this = this;
|
|
2770
2997
|
if (changes.message) {
|
|
2771
2998
|
this.attachmentService.resetAttachmentUploads();
|
|
2772
2999
|
if (this.isUpdate) {
|
|
@@ -2777,9 +3004,6 @@
|
|
|
2777
3004
|
if (changes.isFileUploadEnabled) {
|
|
2778
3005
|
this.configService.isFileUploadEnabled = this.isFileUploadEnabled;
|
|
2779
3006
|
}
|
|
2780
|
-
if (changes.acceptedFileTypes) {
|
|
2781
|
-
this.configService.acceptedFileTypes = this.acceptedFileTypes;
|
|
2782
|
-
}
|
|
2783
3007
|
if (changes.isMultipleFileUploadEnabled) {
|
|
2784
3008
|
this.configService.isMultipleFileUploadEnabled =
|
|
2785
3009
|
this.isMultipleFileUploadEnabled;
|
|
@@ -2787,25 +3011,25 @@
|
|
|
2787
3011
|
if (changes.areMentionsEnabled) {
|
|
2788
3012
|
this.configService.areMentionsEnabled = this.areMentionsEnabled;
|
|
2789
3013
|
}
|
|
2790
|
-
if (changes.mentionAutocompleteItemTemplate) {
|
|
2791
|
-
this.configService.mentionAutocompleteItemTemplate =
|
|
2792
|
-
this.mentionAutocompleteItemTemplate;
|
|
2793
|
-
}
|
|
2794
|
-
if (changes.commandAutocompleteItemTemplate) {
|
|
2795
|
-
this.configService.commandAutocompleteItemTemplate =
|
|
2796
|
-
this.commandAutocompleteItemTemplate;
|
|
2797
|
-
}
|
|
2798
3014
|
if (changes.mentionScope) {
|
|
2799
3015
|
this.configService.mentionScope = this.mentionScope;
|
|
2800
3016
|
}
|
|
2801
|
-
if (changes.emojiPickerTemplate) {
|
|
2802
|
-
this.configService.emojiPickerTemplate = this.emojiPickerTemplate;
|
|
2803
|
-
}
|
|
2804
3017
|
if (changes.mode) {
|
|
2805
3018
|
this.setCanSendMessages();
|
|
2806
3019
|
}
|
|
3020
|
+
if (changes.sendMessage$) {
|
|
3021
|
+
if (this.sendMessageSubcription) {
|
|
3022
|
+
this.sendMessageSubcription.unsubscribe();
|
|
3023
|
+
}
|
|
3024
|
+
if (this.sendMessage$) {
|
|
3025
|
+
this.sendMessageSubcription = this.sendMessage$.subscribe(function () { return void _this.messageSent(); });
|
|
3026
|
+
}
|
|
3027
|
+
}
|
|
2807
3028
|
};
|
|
2808
3029
|
MessageInputComponent.prototype.ngOnDestroy = function () {
|
|
3030
|
+
if (this.sendMessageSubcription) {
|
|
3031
|
+
this.sendMessageSubcription.unsubscribe();
|
|
3032
|
+
}
|
|
2809
3033
|
this.subscriptions.forEach(function (s) { return s.unsubscribe(); });
|
|
2810
3034
|
};
|
|
2811
3035
|
MessageInputComponent.prototype.messageSent = function () {
|
|
@@ -2873,14 +3097,6 @@
|
|
|
2873
3097
|
enumerable: false,
|
|
2874
3098
|
configurable: true
|
|
2875
3099
|
});
|
|
2876
|
-
Object.defineProperty(MessageInputComponent.prototype, "accept", {
|
|
2877
|
-
get: function () {
|
|
2878
|
-
var _a;
|
|
2879
|
-
return this.acceptedFileTypes ? (_a = this.acceptedFileTypes) === null || _a === void 0 ? void 0 : _a.join(',') : '';
|
|
2880
|
-
},
|
|
2881
|
-
enumerable: false,
|
|
2882
|
-
configurable: true
|
|
2883
|
-
});
|
|
2884
3100
|
Object.defineProperty(MessageInputComponent.prototype, "quotedMessageAttachments", {
|
|
2885
3101
|
get: function () {
|
|
2886
3102
|
var _a;
|
|
@@ -2928,6 +3144,24 @@
|
|
|
2928
3144
|
MessageInputComponent.prototype.deselectMessageToQuote = function () {
|
|
2929
3145
|
this.channelService.selectMessageToQuote(undefined);
|
|
2930
3146
|
};
|
|
3147
|
+
MessageInputComponent.prototype.getEmojiPickerContext = function () {
|
|
3148
|
+
return {
|
|
3149
|
+
emojiInput$: this.emojiInputService.emojiInput$,
|
|
3150
|
+
};
|
|
3151
|
+
};
|
|
3152
|
+
MessageInputComponent.prototype.getAttachmentPreviewListContext = function () {
|
|
3153
|
+
return {
|
|
3154
|
+
attachmentUploads$: this.attachmentService.attachmentUploads$,
|
|
3155
|
+
deleteUploadHandler: this.deleteUpload.bind(this),
|
|
3156
|
+
retryUploadHandler: this.retryUpload.bind(this),
|
|
3157
|
+
};
|
|
3158
|
+
};
|
|
3159
|
+
MessageInputComponent.prototype.deleteUpload = function (upload) {
|
|
3160
|
+
void this.attachmentService.deleteAttachment(upload);
|
|
3161
|
+
};
|
|
3162
|
+
MessageInputComponent.prototype.retryUpload = function (file) {
|
|
3163
|
+
void this.attachmentService.retryAttachmentUpload(file);
|
|
3164
|
+
};
|
|
2931
3165
|
MessageInputComponent.prototype.clearFileInput = function () {
|
|
2932
3166
|
this.fileInput.nativeElement.value = '';
|
|
2933
3167
|
};
|
|
@@ -2954,7 +3188,7 @@
|
|
|
2954
3188
|
return __generator(this, function (_12) {
|
|
2955
3189
|
switch (_12.label) {
|
|
2956
3190
|
case 0:
|
|
2957
|
-
if (!fileList
|
|
3191
|
+
if (!fileList) {
|
|
2958
3192
|
return [2 /*return*/, true];
|
|
2959
3193
|
}
|
|
2960
3194
|
if (!!this.appSettings) return [3 /*break*/, 2];
|
|
@@ -3055,8 +3289,8 @@
|
|
|
3055
3289
|
};
|
|
3056
3290
|
return MessageInputComponent;
|
|
3057
3291
|
}());
|
|
3058
|
-
MessageInputComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageInputComponent, deps: [{ token: ChannelService }, { token: NotificationService }, { token: AttachmentService }, { token: MessageInputConfigService }, { token: textareaInjectionToken }, { token: i0__namespace.ComponentFactoryResolver }, { token: i0__namespace.ChangeDetectorRef }, { token: ChatClientService }, { token: EmojiInputService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3059
|
-
MessageInputComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageInputComponent, selector: "stream-message-input", inputs: { isFileUploadEnabled: "isFileUploadEnabled", areMentionsEnabled: "areMentionsEnabled", mentionScope: "mentionScope",
|
|
3292
|
+
MessageInputComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageInputComponent, deps: [{ token: ChannelService }, { token: NotificationService }, { token: AttachmentService }, { token: MessageInputConfigService }, { token: textareaInjectionToken }, { token: i0__namespace.ComponentFactoryResolver }, { token: i0__namespace.ChangeDetectorRef }, { token: ChatClientService }, { token: EmojiInputService }, { token: CustomTemplatesService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3293
|
+
MessageInputComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageInputComponent, selector: "stream-message-input", inputs: { isFileUploadEnabled: "isFileUploadEnabled", areMentionsEnabled: "areMentionsEnabled", mentionScope: "mentionScope", mode: "mode", isMultipleFileUploadEnabled: "isMultipleFileUploadEnabled", message: "message", sendMessage$: "sendMessage$" }, outputs: { messageUpdate: "messageUpdate" }, providers: [AttachmentService, EmojiInputService], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "textareaAnchor", first: true, predicate: TextareaDirective, descendants: true }], usesOnChanges: true, ngImport: i0__namespace, template: "<div\n class=\"{{\n mode === 'main' ? 'str-chat__input-flat' : 'str-chat__small-message-input'\n }}\"\n [class.str-chat__input-flat-has-attachments]=\"\n (attachmentUploads$ | async)!.length > 0\n \"\n [class.str-chat__input-flat-quoted]=\"!!quotedMessage\"\n>\n <div\n data-testid=\"quoted-message-container\"\n class=\"quoted-message-preview\"\n *ngIf=\"quotedMessage\"\n >\n <div class=\"quoted-message-preview-header\">\n <div>{{ \"streamChat.Reply to Message\" | translate }}</div>\n <button\n class=\"str-chat__square-button\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToQuote()\"\n (keyup.enter)=\"deselectMessageToQuote()\"\n >\n <stream-icon-placeholder\n icon=\"close-no-outline\"\n style=\"font-size: 10px; line-height: 10px\"\n ></stream-icon-placeholder>\n </button>\n </div>\n <div class=\"quoted-message-preview-content\">\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host\"\n [imageUrl]=\"quotedMessage?.user?.image\"\n [name]=\"quotedMessage?.user?.name || quotedMessage?.user?.id\"\n [size]=\"20\"\n ></stream-avatar-placeholder>\n <div class=\"quoted-message-preview-content-inner\">\n <stream-attachment-list\n *ngIf=\"\n quotedMessage?.attachments && quotedMessage?.attachments?.length\n \"\n [attachments]=\"quotedMessageAttachments\"\n [messageId]=\"quotedMessage?.id\"\n ></stream-attachment-list>\n <div\n data-testid=\"quoted-message-text\"\n [innerHTML]=\"quotedMessage?.html || quotedMessage?.text\"\n ></div>\n </div>\n </div>\n </div>\n <div class=\"str-chat__input-flat-wrapper\" style=\"width: 100%\">\n <div\n class=\"{{\n mode === 'main'\n ? 'str-chat__input-flat--textarea-wrapper'\n : 'str-chat__small-message-input--textarea-wrapper'\n }}\"\n >\n <ng-template\n #defaultAttachmentsPreview\n let-attachmentUploads$=\"attachmentUploads$\"\n let-retryUploadHandler=\"retryUploadHandler\"\n let-deleteUploadHandler=\"deleteUploadHandler\"\n >\n <stream-attachment-preview-list\n [attachmentUploads$]=\"attachmentUploads$\"\n (retryAttachmentUpload)=\"retryUploadHandler($event)\"\n (deleteAttachment)=\"deleteUploadHandler($event)\"\n class=\"rfu-image-previewer-angular-host\"\n ></stream-attachment-preview-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n attachmentPreviewListTemplate || defaultAttachmentsPreview;\n context: getAttachmentPreviewListContext()\n \"\n ></ng-container>\n <div class=\"rta str-chat__textarea str-chat-angular__textarea\">\n <ng-container\n *ngIf=\"emojiPickerTemplate && !isCooldownInProgress\"\n data-testid=\"emoji-picker\"\n >\n <div\n class=\"\n str-chat__input-flat-emojiselect\n str-chat-angular__emojiselect\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n emojiPickerTemplate;\n context: getEmojiPickerContext()\n \"\n ></ng-container>\n </div>\n </ng-container>\n <div\n class=\"str-chat__input-flat-cooldown str-chat-angular__cooldown\"\n *ngIf=\"isCooldownInProgress\"\n data-testid=\"cooldown-timer\"\n >\n {{ cooldown$ | async }}\n </div>\n <ng-template\n *ngIf=\"canSendMessages && !isCooldownInProgress; else notAllowed\"\n streamTextarea\n [(value)]=\"textareaValue\"\n (valueChange)=\"typingStart$.next()\"\n (send)=\"messageSent()\"\n [componentRef]=\"textareaRef\"\n (userMentions)=\"mentionedUsers = $event\"\n [areMentionsEnabled]=\"areMentionsEnabled\"\n [mentionScope]=\"mentionScope\"\n ></ng-template>\n <ng-template #notAllowed>\n <textarea\n disabled\n rows=\"1\"\n [value]=\"disabledTextareaText | translate\"\n class=\"rta__textarea str-chat__textarea__textarea\"\n data-testid=\"disabled-textarea\"\n ></textarea>\n </ng-template>\n </div>\n <div\n *ngIf=\"\n isFileUploadEnabled &&\n isFileUploadAuthorized &&\n canSendMessages &&\n !isCooldownInProgress\n \"\n class=\"str-chat__fileupload-wrapper\"\n data-testid=\"file-upload-button\"\n >\n <div class=\"str-chat__tooltip\">\n {{ \"streamChat.Attach files\" | translate }}\n </div>\n <div class=\"rfu-file-upload-button\">\n <label>\n <input\n #fileInput\n type=\"file\"\n class=\"rfu-file-input\"\n data-testid=\"file-input\"\n [multiple]=\"isMultipleFileUploadEnabled\"\n (change)=\"filesSelected(fileInput.files)\"\n />\n <span class=\"str-chat__input-flat-fileupload\">\n <stream-icon-placeholder\n icon=\"file-upload\"\n ></stream-icon-placeholder>\n </span>\n </label>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"canSendMessages\"\n data-testid=\"send-button\"\n class=\"str-chat__send-button\"\n (click)=\"messageSent()\"\n (keyup.enter)=\"messageSent()\"\n >\n <stream-icon-placeholder icon=\"send\"></stream-icon-placeholder>\n </button>\n </div>\n</div>\n", components: [{ type: IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size"] }, { type: AttachmentListComponent, selector: "stream-attachment-list", inputs: ["messageId", "attachments"] }, { type: AttachmentPreviewListComponent, selector: "stream-attachment-preview-list", inputs: ["attachmentUploads$"], outputs: ["retryAttachmentUpload", "deleteAttachment"] }], directives: [{ type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: TextareaDirective, selector: "[streamTextarea]", inputs: ["componentRef", "areMentionsEnabled", "mentionScope", "value"], outputs: ["valueChange", "send", "userMentions"] }], pipes: { "async": i3__namespace.AsyncPipe, "translate": i2__namespace.TranslatePipe } });
|
|
3060
3294
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageInputComponent, decorators: [{
|
|
3061
3295
|
type: i0.Component,
|
|
3062
3296
|
args: [{
|
|
@@ -3069,27 +3303,21 @@
|
|
|
3069
3303
|
return [{ type: ChannelService }, { type: NotificationService }, { type: AttachmentService }, { type: MessageInputConfigService }, { type: i0__namespace.Type, decorators: [{
|
|
3070
3304
|
type: i0.Inject,
|
|
3071
3305
|
args: [textareaInjectionToken]
|
|
3072
|
-
}] }, { type: i0__namespace.ComponentFactoryResolver }, { type: i0__namespace.ChangeDetectorRef }, { type: ChatClientService }, { type: EmojiInputService }];
|
|
3306
|
+
}] }, { type: i0__namespace.ComponentFactoryResolver }, { type: i0__namespace.ChangeDetectorRef }, { type: ChatClientService }, { type: EmojiInputService }, { type: CustomTemplatesService }];
|
|
3073
3307
|
}, propDecorators: { isFileUploadEnabled: [{
|
|
3074
3308
|
type: i0.Input
|
|
3075
3309
|
}], areMentionsEnabled: [{
|
|
3076
3310
|
type: i0.Input
|
|
3077
3311
|
}], mentionScope: [{
|
|
3078
3312
|
type: i0.Input
|
|
3079
|
-
}], mentionAutocompleteItemTemplate: [{
|
|
3080
|
-
type: i0.Input
|
|
3081
|
-
}], commandAutocompleteItemTemplate: [{
|
|
3082
|
-
type: i0.Input
|
|
3083
|
-
}], emojiPickerTemplate: [{
|
|
3084
|
-
type: i0.Input
|
|
3085
3313
|
}], mode: [{
|
|
3086
3314
|
type: i0.Input
|
|
3087
|
-
}], acceptedFileTypes: [{
|
|
3088
|
-
type: i0.Input
|
|
3089
3315
|
}], isMultipleFileUploadEnabled: [{
|
|
3090
3316
|
type: i0.Input
|
|
3091
3317
|
}], message: [{
|
|
3092
3318
|
type: i0.Input
|
|
3319
|
+
}], sendMessage$: [{
|
|
3320
|
+
type: i0.Input
|
|
3093
3321
|
}], messageUpdate: [{
|
|
3094
3322
|
type: i0.Output
|
|
3095
3323
|
}], fileInput: [{
|
|
@@ -3109,7 +3337,7 @@
|
|
|
3109
3337
|
return NotificationComponent;
|
|
3110
3338
|
}());
|
|
3111
3339
|
NotificationComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: NotificationComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3112
|
-
NotificationComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: NotificationComponent, selector: "stream-notification", inputs: { type: "type" }, ngImport: i0__namespace, template: "<div\n class=\"str-chat__custom-notification notification-{{ type }}\"\n data-testid=\"custom-notification\"\n>\n <ng-content></ng-content>\n</div>\n" });
|
|
3340
|
+
NotificationComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: NotificationComponent, selector: "stream-notification", inputs: { type: "type", content: "content" }, ngImport: i0__namespace, template: "<div\n class=\"str-chat__custom-notification notification-{{ type }}\"\n data-testid=\"custom-notification\"\n>\n <ng-container *ngIf=\"content; else elseContent\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n <ng-template #elseContent>\n <ng-content></ng-content>\n </ng-template>\n</div>\n", directives: [{ type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
|
3113
3341
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: NotificationComponent, decorators: [{
|
|
3114
3342
|
type: i0.Component,
|
|
3115
3343
|
args: [{
|
|
@@ -3119,26 +3347,29 @@
|
|
|
3119
3347
|
}]
|
|
3120
3348
|
}], ctorParameters: function () { return []; }, propDecorators: { type: [{
|
|
3121
3349
|
type: i0.Input
|
|
3350
|
+
}], content: [{
|
|
3351
|
+
type: i0.Input
|
|
3122
3352
|
}] } });
|
|
3123
3353
|
|
|
3124
3354
|
/**
|
|
3125
3355
|
* The `NotificationList` component displays the list of active notifications.
|
|
3126
3356
|
*/
|
|
3127
3357
|
var NotificationListComponent = /** @class */ (function () {
|
|
3128
|
-
function NotificationListComponent(notificationService) {
|
|
3358
|
+
function NotificationListComponent(customTemplatesService, notificationService) {
|
|
3359
|
+
this.customTemplatesService = customTemplatesService;
|
|
3129
3360
|
this.notificationService = notificationService;
|
|
3130
3361
|
this.notifications$ = this.notificationService.notifications$;
|
|
3131
3362
|
}
|
|
3132
3363
|
NotificationListComponent.prototype.trackById = function (_, item) {
|
|
3133
3364
|
return item.id;
|
|
3134
3365
|
};
|
|
3135
|
-
NotificationListComponent.prototype.
|
|
3366
|
+
NotificationListComponent.prototype.getNotificationContentContext = function (notification) {
|
|
3136
3367
|
return Object.assign(Object.assign({}, notification.templateContext), { dismissFn: notification.dismissFn });
|
|
3137
3368
|
};
|
|
3138
3369
|
return NotificationListComponent;
|
|
3139
3370
|
}());
|
|
3140
|
-
NotificationListComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: NotificationListComponent, deps: [{ token: NotificationService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3141
|
-
NotificationListComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: NotificationListComponent, selector: "stream-notification-list", ngImport: i0__namespace, template: "<div class=\"str-chat__list-notifications\">\n <
|
|
3371
|
+
NotificationListComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: NotificationListComponent, deps: [{ token: CustomTemplatesService }, { token: NotificationService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3372
|
+
NotificationListComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: NotificationListComponent, selector: "stream-notification-list", ngImport: i0__namespace, template: "<div class=\"str-chat__list-notifications\">\n <ng-container\n *ngFor=\"let notification of notifications$ | async; trackBy: trackById\"\n >\n <ng-template #notificationContent>\n <div\n *ngIf=\"notification.text !== undefined\"\n data-testclass=\"notification-content\"\n >\n {{ notification.text | translate: notification.translateParams }}\n </div>\n <ng-container *ngIf=\"notification.template !== undefined\">\n <ng-container\n *ngTemplateOutlet=\"\n notification.template;\n context: getNotificationContentContext(notification)\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.notificationTemplate$ | async) ||\n defaultNotification;\n context: { type: notification.type, content: notificationContent }\n \"\n ></ng-container>\n </ng-container>\n</div>\n\n<ng-template #defaultNotification let-type=\"type\" let-content=\"content\">\n <stream-notification [type]=\"type\" [content]=\"content\"></stream-notification>\n</ng-template>\n", components: [{ type: NotificationComponent, selector: "stream-notification", inputs: ["type", "content"] }], directives: [{ type: i3__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i3__namespace.AsyncPipe, "translate": i2__namespace.TranslatePipe } });
|
|
3142
3373
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: NotificationListComponent, decorators: [{
|
|
3143
3374
|
type: i0.Component,
|
|
3144
3375
|
args: [{
|
|
@@ -3146,17 +3377,18 @@
|
|
|
3146
3377
|
templateUrl: './notification-list.component.html',
|
|
3147
3378
|
styles: [],
|
|
3148
3379
|
}]
|
|
3149
|
-
}], ctorParameters: function () { return [{ type: NotificationService }]; } });
|
|
3380
|
+
}], ctorParameters: function () { return [{ type: CustomTemplatesService }, { type: NotificationService }]; } });
|
|
3150
3381
|
|
|
3151
3382
|
/**
|
|
3152
3383
|
* The `MessageActionsBox` component displays a list of message actions (i.e edit), that can be opened or closed. You can find the [list of the supported actions](../concepts/message-interactions.mdx) in the message interaction guide.
|
|
3153
3384
|
*/
|
|
3154
3385
|
var MessageActionsBoxComponent = /** @class */ (function () {
|
|
3155
|
-
function MessageActionsBoxComponent(chatClientService, notificationService, channelService) {
|
|
3386
|
+
function MessageActionsBoxComponent(chatClientService, notificationService, channelService, customTemplatesService) {
|
|
3156
3387
|
var _this = this;
|
|
3157
3388
|
this.chatClientService = chatClientService;
|
|
3158
3389
|
this.notificationService = notificationService;
|
|
3159
3390
|
this.channelService = channelService;
|
|
3391
|
+
this.customTemplatesService = customTemplatesService;
|
|
3160
3392
|
/**
|
|
3161
3393
|
* Indicates if the list should be opened or closed. Adding a UI element to open and close the list is the parent's component responsibility.
|
|
3162
3394
|
*/
|
|
@@ -3178,152 +3410,145 @@
|
|
|
3178
3410
|
*/
|
|
3179
3411
|
this.isEditing = new i0.EventEmitter();
|
|
3180
3412
|
this.isEditModalOpen = false;
|
|
3413
|
+
this.subscriptions = [];
|
|
3414
|
+
this.visibleMessageActionItems = [];
|
|
3415
|
+
this.sendMessageSubject = new rxjs.Subject();
|
|
3181
3416
|
this.modalClosed = function () {
|
|
3182
3417
|
_this.isEditModalOpen = false;
|
|
3183
3418
|
_this.isEditing.emit(false);
|
|
3184
3419
|
};
|
|
3420
|
+
this.subscriptions.push(this.customTemplatesService.messageInputTemplate$.subscribe(function (template) { return (_this.messageInputTemplate = template); }));
|
|
3421
|
+
this.subscriptions.push(this.customTemplatesService.messageActionsBoxItemTemplate$.subscribe(function (template) { return (_this.messageActionItemTemplate = template); }));
|
|
3422
|
+
this.subscriptions.push(this.customTemplatesService.modalTemplate$.subscribe(function (template) { return (_this.modalTemplate = template); }));
|
|
3423
|
+
this.messageActionItems = [
|
|
3424
|
+
{
|
|
3425
|
+
actionName: 'quote',
|
|
3426
|
+
actionLabelOrTranslationKey: 'streamChat.Reply',
|
|
3427
|
+
actionHandler: function (message) { return _this.channelService.selectMessageToQuote(message); },
|
|
3428
|
+
isVisible: function (enabledActions, isMine, message) { return enabledActions.indexOf('quote-message') !== -1 &&
|
|
3429
|
+
!(message === null || message === void 0 ? void 0 : message.quoted_message); },
|
|
3430
|
+
},
|
|
3431
|
+
{
|
|
3432
|
+
actionName: 'pin',
|
|
3433
|
+
actionLabelOrTranslationKey: function () { var _a; return ((_a = _this.message) === null || _a === void 0 ? void 0 : _a.pinned) ? 'streamChat.Unpin' : 'streamChat.Pin'; },
|
|
3434
|
+
actionHandler: function () { return alert('Feature not yet implemented'); },
|
|
3435
|
+
isVisible: function () { return false; },
|
|
3436
|
+
},
|
|
3437
|
+
{
|
|
3438
|
+
actionName: 'flag',
|
|
3439
|
+
actionLabelOrTranslationKey: 'streamChat.Flag',
|
|
3440
|
+
actionHandler: function (message) { return __awaiter(_this, void 0, void 0, function () {
|
|
3441
|
+
var err_1;
|
|
3442
|
+
return __generator(this, function (_b) {
|
|
3443
|
+
switch (_b.label) {
|
|
3444
|
+
case 0:
|
|
3445
|
+
_b.trys.push([0, 2, , 3]);
|
|
3446
|
+
return [4 /*yield*/, this.chatClientService.flagMessage(message.id)];
|
|
3447
|
+
case 1:
|
|
3448
|
+
_b.sent();
|
|
3449
|
+
this.notificationService.addTemporaryNotification('streamChat.Message has been successfully flagged', 'success');
|
|
3450
|
+
return [3 /*break*/, 3];
|
|
3451
|
+
case 2:
|
|
3452
|
+
err_1 = _b.sent();
|
|
3453
|
+
this.notificationService.addTemporaryNotification('streamChat.Error adding flag');
|
|
3454
|
+
return [3 /*break*/, 3];
|
|
3455
|
+
case 3: return [2 /*return*/];
|
|
3456
|
+
}
|
|
3457
|
+
});
|
|
3458
|
+
}); },
|
|
3459
|
+
isVisible: function (enabledActions, isMine) { return enabledActions.indexOf('flag-message') !== -1 && !isMine; },
|
|
3460
|
+
},
|
|
3461
|
+
{
|
|
3462
|
+
actionName: 'edit',
|
|
3463
|
+
actionLabelOrTranslationKey: 'streamChat.Edit Message',
|
|
3464
|
+
actionHandler: function () {
|
|
3465
|
+
_this.isEditing.emit(true);
|
|
3466
|
+
_this.isEditModalOpen = true;
|
|
3467
|
+
},
|
|
3468
|
+
isVisible: function (enabledActions, isMine) { return (enabledActions.indexOf('update-own-message') !== -1 && isMine) ||
|
|
3469
|
+
enabledActions.indexOf('update-any-message') !== -1; },
|
|
3470
|
+
},
|
|
3471
|
+
{
|
|
3472
|
+
actionName: 'delete',
|
|
3473
|
+
actionLabelOrTranslationKey: 'streamChat.Delete',
|
|
3474
|
+
actionHandler: function (message) { return __awaiter(_this, void 0, void 0, function () {
|
|
3475
|
+
var error_1;
|
|
3476
|
+
return __generator(this, function (_b) {
|
|
3477
|
+
switch (_b.label) {
|
|
3478
|
+
case 0:
|
|
3479
|
+
_b.trys.push([0, 2, , 3]);
|
|
3480
|
+
return [4 /*yield*/, this.channelService.deleteMessage(message)];
|
|
3481
|
+
case 1:
|
|
3482
|
+
_b.sent();
|
|
3483
|
+
return [3 /*break*/, 3];
|
|
3484
|
+
case 2:
|
|
3485
|
+
error_1 = _b.sent();
|
|
3486
|
+
this.notificationService.addTemporaryNotification('streamChat.Error deleting message');
|
|
3487
|
+
return [3 /*break*/, 3];
|
|
3488
|
+
case 3: return [2 /*return*/];
|
|
3489
|
+
}
|
|
3490
|
+
});
|
|
3491
|
+
}); },
|
|
3492
|
+
isVisible: function (enabledActions, isMine) { return ((enabledActions.indexOf('delete') !== -1 ||
|
|
3493
|
+
enabledActions.indexOf('delete-own-message') !== -1) &&
|
|
3494
|
+
isMine) ||
|
|
3495
|
+
enabledActions.indexOf('delete-any') !== -1 ||
|
|
3496
|
+
enabledActions.indexOf('delete-any-message') !== -1; },
|
|
3497
|
+
},
|
|
3498
|
+
];
|
|
3499
|
+
this.sendMessage$ = this.sendMessageSubject.asObservable();
|
|
3185
3500
|
}
|
|
3186
3501
|
MessageActionsBoxComponent.prototype.ngOnChanges = function (changes) {
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
|
|
3190
|
-
|
|
3191
|
-
|
|
3192
|
-
if (this.isEditVisible) {
|
|
3193
|
-
displayedActionsCount++;
|
|
3194
|
-
}
|
|
3195
|
-
if (this.isDeleteVisible) {
|
|
3196
|
-
displayedActionsCount++;
|
|
3197
|
-
}
|
|
3198
|
-
if (this.isMuteVisible) {
|
|
3199
|
-
displayedActionsCount++;
|
|
3200
|
-
}
|
|
3201
|
-
if (this.isFlagVisible) {
|
|
3202
|
-
displayedActionsCount++;
|
|
3203
|
-
}
|
|
3204
|
-
if (this.isPinVisible) {
|
|
3205
|
-
displayedActionsCount++;
|
|
3206
|
-
}
|
|
3207
|
-
this.displayedActionsCount.next(displayedActionsCount);
|
|
3502
|
+
var _this = this;
|
|
3503
|
+
if (changes.isMine || changes.enabledActions || changes.message) {
|
|
3504
|
+
this.messageActionItems.forEach(function (i) { return (i.actionHandler = i.actionHandler.bind(_this, _this.message, _this.isMine)); });
|
|
3505
|
+
this.visibleMessageActionItems = this.messageActionItems.filter(function (item) { return item.isVisible(_this.enabledActions, _this.isMine, _this.message); });
|
|
3506
|
+
this.displayedActionsCount.emit(this.visibleMessageActionItems.length);
|
|
3208
3507
|
}
|
|
3209
3508
|
};
|
|
3210
|
-
|
|
3211
|
-
|
|
3212
|
-
var _a;
|
|
3213
|
-
return ((this.enabledActions.indexOf('quote') !== -1 ||
|
|
3214
|
-
this.enabledActions.indexOf('quote-message') !== -1) &&
|
|
3215
|
-
!((_a = this.message) === null || _a === void 0 ? void 0 : _a.quoted_message));
|
|
3216
|
-
},
|
|
3217
|
-
enumerable: false,
|
|
3218
|
-
configurable: true
|
|
3219
|
-
});
|
|
3220
|
-
Object.defineProperty(MessageActionsBoxComponent.prototype, "isEditVisible", {
|
|
3221
|
-
get: function () {
|
|
3222
|
-
return (((this.enabledActions.indexOf('edit') !== -1 ||
|
|
3223
|
-
this.enabledActions.indexOf('update-own-message') !== -1) &&
|
|
3224
|
-
this.isMine) ||
|
|
3225
|
-
this.enabledActions.indexOf('edit-any') !== -1 ||
|
|
3226
|
-
this.enabledActions.indexOf('update-any-message') !== -1);
|
|
3227
|
-
},
|
|
3228
|
-
enumerable: false,
|
|
3229
|
-
configurable: true
|
|
3230
|
-
});
|
|
3231
|
-
Object.defineProperty(MessageActionsBoxComponent.prototype, "isDeleteVisible", {
|
|
3232
|
-
get: function () {
|
|
3233
|
-
return (((this.enabledActions.indexOf('delete') !== -1 ||
|
|
3234
|
-
this.enabledActions.indexOf('delete-own-message') !== -1) &&
|
|
3235
|
-
this.isMine) ||
|
|
3236
|
-
this.enabledActions.indexOf('delete-any') !== -1 ||
|
|
3237
|
-
this.enabledActions.indexOf('delete-any-message') !== -1);
|
|
3238
|
-
},
|
|
3239
|
-
enumerable: false,
|
|
3240
|
-
configurable: true
|
|
3241
|
-
});
|
|
3242
|
-
Object.defineProperty(MessageActionsBoxComponent.prototype, "isMuteVisible", {
|
|
3243
|
-
get: function () {
|
|
3244
|
-
return this.enabledActions.indexOf('mute') !== -1;
|
|
3245
|
-
},
|
|
3246
|
-
enumerable: false,
|
|
3247
|
-
configurable: true
|
|
3248
|
-
});
|
|
3249
|
-
Object.defineProperty(MessageActionsBoxComponent.prototype, "isFlagVisible", {
|
|
3250
|
-
get: function () {
|
|
3251
|
-
return ((this.enabledActions.indexOf('flag') !== -1 ||
|
|
3252
|
-
this.enabledActions.indexOf('flag-message') !== -1) &&
|
|
3253
|
-
!this.isMine);
|
|
3254
|
-
},
|
|
3255
|
-
enumerable: false,
|
|
3256
|
-
configurable: true
|
|
3257
|
-
});
|
|
3258
|
-
Object.defineProperty(MessageActionsBoxComponent.prototype, "isPinVisible", {
|
|
3259
|
-
get: function () {
|
|
3260
|
-
return this.enabledActions.indexOf('pin') !== -1;
|
|
3261
|
-
},
|
|
3262
|
-
enumerable: false,
|
|
3263
|
-
configurable: true
|
|
3264
|
-
});
|
|
3265
|
-
MessageActionsBoxComponent.prototype.pinClicked = function () {
|
|
3266
|
-
alert('Feature not yet implemented');
|
|
3267
|
-
};
|
|
3268
|
-
MessageActionsBoxComponent.prototype.flagClicked = function () {
|
|
3269
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
3270
|
-
var err_1;
|
|
3271
|
-
return __generator(this, function (_b) {
|
|
3272
|
-
switch (_b.label) {
|
|
3273
|
-
case 0:
|
|
3274
|
-
_b.trys.push([0, 2, , 3]);
|
|
3275
|
-
return [4 /*yield*/, this.chatClientService.flagMessage(this.message.id)];
|
|
3276
|
-
case 1:
|
|
3277
|
-
_b.sent();
|
|
3278
|
-
this.notificationService.addTemporaryNotification('streamChat.Message has been successfully flagged', 'success');
|
|
3279
|
-
return [3 /*break*/, 3];
|
|
3280
|
-
case 2:
|
|
3281
|
-
err_1 = _b.sent();
|
|
3282
|
-
this.notificationService.addTemporaryNotification('streamChat.Error adding flag');
|
|
3283
|
-
return [3 /*break*/, 3];
|
|
3284
|
-
case 3: return [2 /*return*/];
|
|
3285
|
-
}
|
|
3286
|
-
});
|
|
3287
|
-
});
|
|
3288
|
-
};
|
|
3289
|
-
MessageActionsBoxComponent.prototype.muteClicked = function () {
|
|
3290
|
-
alert('Feature not yet implemented');
|
|
3291
|
-
};
|
|
3292
|
-
MessageActionsBoxComponent.prototype.quoteClicked = function () {
|
|
3293
|
-
this.channelService.selectMessageToQuote(this.message);
|
|
3509
|
+
MessageActionsBoxComponent.prototype.ngOnDestroy = function () {
|
|
3510
|
+
this.subscriptions.forEach(function (s) { return s.unsubscribe(); });
|
|
3294
3511
|
};
|
|
3295
|
-
MessageActionsBoxComponent.prototype.
|
|
3296
|
-
|
|
3297
|
-
|
|
3512
|
+
MessageActionsBoxComponent.prototype.getActionLabel = function (actionLabelOrTranslationKey) {
|
|
3513
|
+
return typeof actionLabelOrTranslationKey === 'string'
|
|
3514
|
+
? actionLabelOrTranslationKey
|
|
3515
|
+
: actionLabelOrTranslationKey();
|
|
3298
3516
|
};
|
|
3299
3517
|
MessageActionsBoxComponent.prototype.sendClicked = function () {
|
|
3300
|
-
|
|
3301
|
-
(_a = this.messageInput) === null || _a === void 0 ? void 0 : _a.messageSent();
|
|
3518
|
+
this.sendMessageSubject.next();
|
|
3302
3519
|
};
|
|
3303
|
-
MessageActionsBoxComponent.prototype.
|
|
3304
|
-
return
|
|
3305
|
-
|
|
3306
|
-
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
3317
|
-
|
|
3318
|
-
|
|
3520
|
+
MessageActionsBoxComponent.prototype.getMessageInputContext = function () {
|
|
3521
|
+
return {
|
|
3522
|
+
message: this.message,
|
|
3523
|
+
messageUpdateHandler: this.modalClosed,
|
|
3524
|
+
isFileUploadEnabled: undefined,
|
|
3525
|
+
areMentionsEnabled: undefined,
|
|
3526
|
+
isMultipleFileUploadEnabled: undefined,
|
|
3527
|
+
mentionScope: undefined,
|
|
3528
|
+
mode: undefined,
|
|
3529
|
+
sendMessage$: this.sendMessage$,
|
|
3530
|
+
};
|
|
3531
|
+
};
|
|
3532
|
+
MessageActionsBoxComponent.prototype.getEditModalContext = function () {
|
|
3533
|
+
var _this = this;
|
|
3534
|
+
return {
|
|
3535
|
+
isOpen: this.isEditModalOpen,
|
|
3536
|
+
isOpenChangeHandler: function (isOpen) {
|
|
3537
|
+
_this.isEditModalOpen = isOpen;
|
|
3538
|
+
if (!_this.isEditModalOpen) {
|
|
3539
|
+
_this.modalClosed();
|
|
3319
3540
|
}
|
|
3320
|
-
}
|
|
3321
|
-
|
|
3541
|
+
},
|
|
3542
|
+
content: this.modalContent,
|
|
3543
|
+
};
|
|
3544
|
+
};
|
|
3545
|
+
MessageActionsBoxComponent.prototype.trackByActionName = function (_, item) {
|
|
3546
|
+
return item.actionName;
|
|
3322
3547
|
};
|
|
3323
3548
|
return MessageActionsBoxComponent;
|
|
3324
3549
|
}());
|
|
3325
|
-
MessageActionsBoxComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageActionsBoxComponent, deps: [{ token: ChatClientService }, { token: NotificationService }, { token: ChannelService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3326
|
-
MessageActionsBoxComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageActionsBoxComponent, selector: "stream-message-actions-box", inputs: {
|
|
3550
|
+
MessageActionsBoxComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageActionsBoxComponent, deps: [{ token: ChatClientService }, { token: NotificationService }, { token: ChannelService }, { token: CustomTemplatesService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3551
|
+
MessageActionsBoxComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageActionsBoxComponent, selector: "stream-message-actions-box", inputs: { isOpen: "isOpen", isMine: "isMine", message: "message", enabledActions: "enabledActions" }, outputs: { displayedActionsCount: "displayedActionsCount", isEditing: "isEditing" }, viewQueries: [{ propertyName: "modalContent", first: true, predicate: ["modalContent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0__namespace, template: "<div\n data-testid=\"action-box\"\n class=\"str-chat__message-actions-box\"\n [class.str-chat__message-actions-box--open]=\"isOpen\"\n [class.str-chat__message-actions-box--mine]=\"isMine\"\n>\n <ul class=\"str-chat__message-actions-list\">\n <ng-container\n *ngFor=\"let item of visibleMessageActionItems; trackBy: trackByActionName\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageActionItemTemplate || defaultMessageActionItem;\n context: item\n \"\n ></ng-container>\n </ng-container>\n </ul>\n</div>\n\n<ng-template\n #defaultMessageActionItem\n let-actionName=\"actionName\"\n let-actionHandler=\"actionHandler\"\n let-actionLabelOrTranslationKey=\"actionLabelOrTranslationKey\"\n>\n <button [attr.data-testid]=\"actionName + '-action'\" (click)=\"actionHandler()\">\n <li class=\"str-chat__message-actions-list-item\">\n {{ getActionLabel(actionLabelOrTranslationKey) | translate }}\n </li>\n </button>\n</ng-template>\n\n<ng-container\n *ngTemplateOutlet=\"\n modalTemplate || defaultModal;\n context: getEditModalContext()\n \"\n></ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n [isOpen]=\"isOpen\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n [content]=\"content\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"str-chat__edit-message-form\" *ngIf=\"isEditModalOpen\">\n <ng-template\n #defaultInput\n let-messageInput=\"message\"\n let-messageUpdateHandler=\"messageUpdateHandler\"\n let-sendMessage$Input=\"sendMessage$\"\n >\n <stream-message-input\n [message]=\"messageInput\"\n (messageUpdate)=\"messageUpdateHandler()\"\n [sendMessage$]=\"sendMessage$Input\"\n ></stream-message-input>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageInputTemplate || defaultInput;\n context: getMessageInputContext()\n \"\n >\n </ng-container>\n\n <stream-notification-list></stream-notification-list>\n <div\n class=\"\n str-chat__message-team-form-footer\n str-chat__message-team-form-footer-angular\n \"\n >\n <div class=\"str-chat__edit-message-form-options\">\n <button translate data-testid=\"cancel-button\" (click)=\"modalClosed()\">\n streamChat.Cancel\n </button>\n <button\n type=\"submit\"\n translate\n data-testid=\"send-button\"\n (click)=\"sendClicked()\"\n (keyup.enter)=\"sendClicked()\"\n >\n streamChat.Send\n </button>\n </div>\n </div>\n </div>\n</ng-template>\n", components: [{ type: ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }, { type: MessageInputComponent, selector: "stream-message-input", inputs: ["isFileUploadEnabled", "areMentionsEnabled", "mentionScope", "mode", "isMultipleFileUploadEnabled", "message", "sendMessage$"], outputs: ["messageUpdate"] }, { type: NotificationListComponent, selector: "stream-notification-list" }], directives: [{ type: i3__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2__namespace.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "translate": i2__namespace.TranslatePipe } });
|
|
3327
3552
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageActionsBoxComponent, decorators: [{
|
|
3328
3553
|
type: i0.Component,
|
|
3329
3554
|
args: [{
|
|
@@ -3331,9 +3556,7 @@
|
|
|
3331
3556
|
templateUrl: './message-actions-box.component.html',
|
|
3332
3557
|
styles: [],
|
|
3333
3558
|
}]
|
|
3334
|
-
}], ctorParameters: function () { return [{ type: ChatClientService }, { type: NotificationService }, { type: ChannelService }]; }, propDecorators: {
|
|
3335
|
-
type: i0.Input
|
|
3336
|
-
}], isOpen: [{
|
|
3559
|
+
}], ctorParameters: function () { return [{ type: ChatClientService }, { type: NotificationService }, { type: ChannelService }, { type: CustomTemplatesService }]; }, propDecorators: { isOpen: [{
|
|
3337
3560
|
type: i0.Input
|
|
3338
3561
|
}], isMine: [{
|
|
3339
3562
|
type: i0.Input
|
|
@@ -3345,9 +3568,9 @@
|
|
|
3345
3568
|
type: i0.Output
|
|
3346
3569
|
}], isEditing: [{
|
|
3347
3570
|
type: i0.Output
|
|
3348
|
-
}],
|
|
3571
|
+
}], modalContent: [{
|
|
3349
3572
|
type: i0.ViewChild,
|
|
3350
|
-
args: [
|
|
3573
|
+
args: ['modalContent', { static: true }]
|
|
3351
3574
|
}] } });
|
|
3352
3575
|
|
|
3353
3576
|
/**
|
|
@@ -3364,7 +3587,7 @@
|
|
|
3364
3587
|
return ChannelComponent;
|
|
3365
3588
|
}());
|
|
3366
3589
|
ChannelComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ChannelComponent, deps: [{ token: ChannelService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3367
|
-
ChannelComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelComponent, selector: "stream-channel", ngImport: i0__namespace, template: "<div\n *ngIf=\"(isError$ | async) === false && (isInitializing$ | async) === false\"\n class=\"str-chat str-chat-channel messaging\"\n>\n <div class=\"str-chat__container\">\n <div class=\"str-chat__main-panel\">\n <ng-content></ng-content>\n </div>\n <ng-content\n *ngIf=\"isActiveThread$ | async\"\n select='[name=\"thread\"]'\n ></ng-content>\n </div>\n</div>\n", directives: [{ type:
|
|
3590
|
+
ChannelComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelComponent, selector: "stream-channel", ngImport: i0__namespace, template: "<div\n *ngIf=\"(isError$ | async) === false && (isInitializing$ | async) === false\"\n class=\"str-chat str-chat-channel messaging\"\n>\n <div class=\"str-chat__container\">\n <div class=\"str-chat__main-panel\">\n <ng-content></ng-content>\n </div>\n <ng-content\n *ngIf=\"isActiveThread$ | async\"\n select='[name=\"thread\"]'\n ></ng-content>\n </div>\n</div>\n", directives: [{ type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i3__namespace.AsyncPipe } });
|
|
3368
3591
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ChannelComponent, decorators: [{
|
|
3369
3592
|
type: i0.Component,
|
|
3370
3593
|
args: [{
|
|
@@ -3461,10 +3684,13 @@
|
|
|
3461
3684
|
* 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)
|
|
3462
3685
|
*/
|
|
3463
3686
|
var ChannelHeaderComponent = /** @class */ (function () {
|
|
3464
|
-
function ChannelHeaderComponent(channelService, channelListToggleService) {
|
|
3687
|
+
function ChannelHeaderComponent(channelService, channelListToggleService, customTemplatesService, cdRef) {
|
|
3465
3688
|
var _this = this;
|
|
3466
3689
|
this.channelService = channelService;
|
|
3467
3690
|
this.channelListToggleService = channelListToggleService;
|
|
3691
|
+
this.customTemplatesService = customTemplatesService;
|
|
3692
|
+
this.cdRef = cdRef;
|
|
3693
|
+
this.subscriptions = [];
|
|
3468
3694
|
this.channelService.activeChannel$.subscribe(function (c) {
|
|
3469
3695
|
var _a, _b;
|
|
3470
3696
|
_this.activeChannel = c;
|
|
@@ -3476,10 +3702,23 @@
|
|
|
3476
3702
|
capabilities.indexOf('connect-events') !== -1;
|
|
3477
3703
|
});
|
|
3478
3704
|
}
|
|
3705
|
+
ChannelHeaderComponent.prototype.ngOnInit = function () {
|
|
3706
|
+
var _this = this;
|
|
3707
|
+
this.subscriptions.push(this.customTemplatesService.channelActionsTemplate$.subscribe(function (template) {
|
|
3708
|
+
_this.channelActionsTemplate = template;
|
|
3709
|
+
_this.cdRef.detectChanges();
|
|
3710
|
+
}));
|
|
3711
|
+
};
|
|
3712
|
+
ChannelHeaderComponent.prototype.ngOnDestroy = function () {
|
|
3713
|
+
this.subscriptions.forEach(function (s) { return s.unsubscribe(); });
|
|
3714
|
+
};
|
|
3479
3715
|
ChannelHeaderComponent.prototype.toggleMenu = function (event) {
|
|
3480
3716
|
event.stopPropagation();
|
|
3481
3717
|
this.channelListToggleService.toggle();
|
|
3482
3718
|
};
|
|
3719
|
+
ChannelHeaderComponent.prototype.getChannelActionsContext = function () {
|
|
3720
|
+
return { channel: this.activeChannel };
|
|
3721
|
+
};
|
|
3483
3722
|
Object.defineProperty(ChannelHeaderComponent.prototype, "memberCountParam", {
|
|
3484
3723
|
get: function () {
|
|
3485
3724
|
var _a, _b;
|
|
@@ -3498,8 +3737,8 @@
|
|
|
3498
3737
|
});
|
|
3499
3738
|
return ChannelHeaderComponent;
|
|
3500
3739
|
}());
|
|
3501
|
-
ChannelHeaderComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ChannelHeaderComponent, deps: [{ token: ChannelService }, { token: ChannelListToggleService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3502
|
-
ChannelHeaderComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelHeaderComponent, selector: "stream-channel-header",
|
|
3740
|
+
ChannelHeaderComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ChannelHeaderComponent, deps: [{ token: ChannelService }, { token: ChannelListToggleService }, { token: CustomTemplatesService }, { token: i0__namespace.ChangeDetectorRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3741
|
+
ChannelHeaderComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelHeaderComponent, selector: "stream-channel-header", ngImport: i0__namespace, 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__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "translate": i2__namespace.TranslatePipe } });
|
|
3503
3742
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ChannelHeaderComponent, decorators: [{
|
|
3504
3743
|
type: i0.Component,
|
|
3505
3744
|
args: [{
|
|
@@ -3507,9 +3746,7 @@
|
|
|
3507
3746
|
templateUrl: './channel-header.component.html',
|
|
3508
3747
|
styles: [],
|
|
3509
3748
|
}]
|
|
3510
|
-
}], ctorParameters: function () { return [{ type: ChannelService }, { type: ChannelListToggleService }
|
|
3511
|
-
type: i0.Input
|
|
3512
|
-
}] } });
|
|
3749
|
+
}], ctorParameters: function () { return [{ type: ChannelService }, { type: ChannelListToggleService }, { type: CustomTemplatesService }, { type: i0__namespace.ChangeDetectorRef }]; } });
|
|
3513
3750
|
|
|
3514
3751
|
/**
|
|
3515
3752
|
* The `ChannelPreview` component displays a channel preview in the channel list, it consists of the image, name and latest message of the channel.
|
|
@@ -3604,7 +3841,7 @@
|
|
|
3604
3841
|
return ChannelPreviewComponent;
|
|
3605
3842
|
}());
|
|
3606
3843
|
ChannelPreviewComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ChannelPreviewComponent, deps: [{ token: ChannelService }, { token: i0__namespace.NgZone }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3607
|
-
ChannelPreviewComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelPreviewComponent, selector: "stream-channel-preview", inputs: { channel: "channel" }, ngImport: i0__namespace, 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\n imageUrl=\"{{ avatarImage }}\"\n name=\"{{ avatarName }}\"\n [size]=\"40\"\n ></stream-avatar>\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:
|
|
3844
|
+
ChannelPreviewComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelPreviewComponent, selector: "stream-channel-preview", inputs: { channel: "channel" }, ngImport: i0__namespace, 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": i2__namespace.TranslatePipe } });
|
|
3608
3845
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ChannelPreviewComponent, decorators: [{
|
|
3609
3846
|
type: i0.Component,
|
|
3610
3847
|
args: [{
|
|
@@ -3620,19 +3857,26 @@
|
|
|
3620
3857
|
* The `ChannelList` component renders the list of channels.
|
|
3621
3858
|
*/
|
|
3622
3859
|
var ChannelListComponent = /** @class */ (function () {
|
|
3623
|
-
function ChannelListComponent(channelService, channelListToggleService) {
|
|
3860
|
+
function ChannelListComponent(channelService, channelListToggleService, customTemplatesService) {
|
|
3861
|
+
var _this = this;
|
|
3624
3862
|
this.channelService = channelService;
|
|
3625
3863
|
this.channelListToggleService = channelListToggleService;
|
|
3864
|
+
this.customTemplatesService = customTemplatesService;
|
|
3626
3865
|
this.isLoadingMoreChannels = false;
|
|
3866
|
+
this.subscriptions = [];
|
|
3627
3867
|
this.isOpen$ = this.channelListToggleService.isOpen$;
|
|
3628
3868
|
this.channels$ = this.channelService.channels$;
|
|
3629
3869
|
this.hasMoreChannels$ = this.channelService.hasMoreChannels$;
|
|
3630
3870
|
this.isError$ = this.channels$.pipe(operators.map(function () { return false; }), operators.catchError(function () { return rxjs.of(true); }), operators.startWith(false));
|
|
3631
3871
|
this.isInitializing$ = this.channels$.pipe(operators.map(function (channels) { return !channels; }), operators.catchError(function () { return rxjs.of(false); }));
|
|
3872
|
+
this.subscriptions.push(this.customTemplatesService.channelPreviewTemplate$.subscribe(function (template) { return (_this.customChannelPreviewTemplate = template); }));
|
|
3632
3873
|
}
|
|
3633
3874
|
ChannelListComponent.prototype.ngAfterViewInit = function () {
|
|
3634
3875
|
this.channelListToggleService.setMenuElement(this.container.nativeElement);
|
|
3635
3876
|
};
|
|
3877
|
+
ChannelListComponent.prototype.ngOnDestroy = function () {
|
|
3878
|
+
this.subscriptions.forEach(function (s) { return s.unsubscribe(); });
|
|
3879
|
+
};
|
|
3636
3880
|
ChannelListComponent.prototype.loadMoreChannels = function () {
|
|
3637
3881
|
return __awaiter(this, void 0, void 0, function () {
|
|
3638
3882
|
return __generator(this, function (_a) {
|
|
@@ -3654,10 +3898,15 @@
|
|
|
3654
3898
|
ChannelListComponent.prototype.channelSelected = function () {
|
|
3655
3899
|
this.channelListToggleService.channelSelected();
|
|
3656
3900
|
};
|
|
3901
|
+
ChannelListComponent.prototype.getChannelPreviewContext = function (channel) {
|
|
3902
|
+
return {
|
|
3903
|
+
channel: channel,
|
|
3904
|
+
};
|
|
3905
|
+
};
|
|
3657
3906
|
return ChannelListComponent;
|
|
3658
3907
|
}());
|
|
3659
|
-
ChannelListComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ChannelListComponent, deps: [{ token: ChannelService }, { token: ChannelListToggleService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3660
|
-
ChannelListComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelListComponent, selector: "stream-channel-list",
|
|
3908
|
+
ChannelListComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ChannelListComponent, deps: [{ token: ChannelService }, { token: ChannelListToggleService }, { token: CustomTemplatesService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3909
|
+
ChannelListComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelListComponent, selector: "stream-channel-list", viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0__namespace, template: "<div\n #container\n data-testid=\"channel-list-container\"\n class=\"str-chat str-chat-channel-list messaging\"\n [class.str-chat-channel-list--open]=\"(isOpen$ | async) === true\"\n>\n <div\n *ngIf=\"\n (isError$ | async) === false && (isInitializing$ | async) === false;\n else statusIndicator\n \"\n class=\"str-chat__channel-list-messenger\"\n >\n <div class=\"str-chat__channel-list-messenger__main\">\n <p\n data-testid=\"empty-channel-list-indicator\"\n *ngIf=\"!(channels$ | async)?.length\"\n >\n {{ \"streamChat.You have no channels currently\" | translate }}\n </p>\n <ng-container\n *ngFor=\"let channel of channels$ | async; trackBy: trackByChannelId\"\n >\n <ng-template #defaultTemplate let-channelInput=\"channel\">\n <stream-channel-preview\n data-testclass=\"channel-preview\"\n [channel]=\"channelInput\"\n ></stream-channel-preview>\n </ng-template>\n <div (click)=\"channelSelected()\" (keyup.enter)=\"channelSelected()\">\n <ng-container\n *ngTemplateOutlet=\"\n customChannelPreviewTemplate || defaultTemplate;\n context: getChannelPreviewContext(channel)\n \"\n ></ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"hasMoreChannels$ | async\"\n class=\"str-chat__load-more-button\"\n (click)=\"loadMoreChannels()\"\n (keyup.enter)=\"loadMoreChannels()\"\n data-testid=\"load-more\"\n >\n <button\n class=\"str-chat__load-more-button__button\"\n data-testid=\"load-more-button\"\n [disabled]=\"isLoadingMoreChannels\"\n >\n <span *ngIf=\"!isLoadingMoreChannels; else loadingIndicator\">{{\n \"Load more\" | translate\n }}</span>\n <ng-template #loadingIndicator\n ><stream-loading-indicator-placeholder></stream-loading-indicator-placeholder\n ></ng-template>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #statusIndicator>\n <ng-container *ngIf=\"isError$ | async\">\n <ng-container *ngTemplateOutlet=\"chatDown\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"isInitializing$ | async\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\"></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #chatDown>\n <div data-testid=\"chatdown-container\" class=\"str-chat__down\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\"></ng-container>\n <div class=\"str-chat__down-main\">\n <stream-icon-placeholder\n icon=\"connection-error\"\n ></stream-icon-placeholder>\n <h1>{{ \"streamChat.Connection error\" | translate }}</h1>\n <h3>\n {{\n \"streamChat.Error connecting to chat, refresh the page to try again.\"\n | translate\n }}\n </h3>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loadingChannels>\n <div data-testid=\"loading-indicator\" class=\"str-chat__loading-channels\">\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #loadingChannel>\n <div class=\"str-chat__loading-channels-item\">\n <div class=\"str-chat__loading-channels-avatar\"></div>\n <div class=\"str-chat__loading-channels-meta\">\n <div class=\"str-chat__loading-channels-username\"></div>\n <div class=\"str-chat__loading-channels-status\"></div>\n </div>\n </div>\n</ng-template>\n", components: [{ type: ChannelPreviewComponent, selector: "stream-channel-preview", inputs: ["channel"] }, { type: LoadingIndicatorPlaceholderComponent, selector: "stream-loading-indicator-placeholder", inputs: ["size", "color"] }, { type: IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }], directives: [{ type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i3__namespace.AsyncPipe, "translate": i2__namespace.TranslatePipe } });
|
|
3661
3910
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ChannelListComponent, decorators: [{
|
|
3662
3911
|
type: i0.Component,
|
|
3663
3912
|
args: [{
|
|
@@ -3665,9 +3914,7 @@
|
|
|
3665
3914
|
templateUrl: './channel-list.component.html',
|
|
3666
3915
|
styles: [],
|
|
3667
3916
|
}]
|
|
3668
|
-
}], ctorParameters: function () { return [{ type: ChannelService }, { type: ChannelListToggleService }]; }, propDecorators: {
|
|
3669
|
-
type: i0.Input
|
|
3670
|
-
}], container: [{
|
|
3917
|
+
}], ctorParameters: function () { return [{ type: ChannelService }, { type: ChannelListToggleService }, { type: CustomTemplatesService }]; }, propDecorators: { container: [{
|
|
3671
3918
|
type: i0.ViewChild,
|
|
3672
3919
|
args: ['container']
|
|
3673
3920
|
}] } });
|
|
@@ -3842,7 +4089,7 @@
|
|
|
3842
4089
|
return MessageReactionsComponent;
|
|
3843
4090
|
}());
|
|
3844
4091
|
MessageReactionsComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageReactionsComponent, deps: [{ token: i0__namespace.ChangeDetectorRef }, { token: ChannelService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
3845
|
-
MessageReactionsComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageReactionsComponent, selector: "stream-message-reactions", inputs: { messageId: "messageId", messageReactionCounts: "messageReactionCounts", isSelectorOpen: "isSelectorOpen", latestReactions: "latestReactions", ownReactions: "ownReactions" }, outputs: { isSelectorOpenChange: "isSelectorOpenChange" }, viewQueries: [{ propertyName: "selectorContainer", first: true, predicate: ["selectorContainer"], descendants: true }, { propertyName: "selectorTooltip", first: true, predicate: ["selectorTooltip"], descendants: true }], usesOnChanges: true, ngImport: i0__namespace, template: "<div\n *ngIf=\"existingReactions.length > 0 && !isSelectorOpen\"\n class=\"str-chat__reaction-list\"\n [class.str-chat__reaction-list--reverse]=\"true\"\n data-testid=\"reaction-list\"\n>\n <ul>\n <li\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n data-testclass=\"emoji\"\n >\n <span class=\"emoji\">\n {{ getEmojiByReaction(reactionType) }}\n </span>\n \n </li>\n <li>\n <span\n data-testid=\"reactions-count\"\n class=\"str-chat__reaction-list--counter\"\n >{{ reactionsCount }}</span\n >\n </li>\n </ul>\n</div>\n\n<div\n #selectorContainer\n class=\"str-chat__reaction-selector\"\n *ngIf=\"isSelectorOpen\"\n data-testid=\"reaction-selector\"\n>\n <div\n *ngIf=\"tooltipText\"\n data-testid=\"tooltip\"\n #selectorTooltip\n class=\"str-chat__reaction-selector-tooltip\"\n [ngStyle]=\"{\n left: tooltipPositions?.tooltip + 'px',\n visibility: tooltipPositions ? 'visible' : 'hidden'\n }\"\n >\n <div\n class=\"arrow\"\n [ngStyle]=\"{ left: tooltipPositions?.arrow + 'px' }\"\n ></div>\n <span class=\"latest-user-username\">\n {{ tooltipText }}\n </span>\n </div>\n <ul class=\"str-chat__message-reactions-list\">\n <li\n class=\"str-chat__message-reactions-list-item str-chat__emoji\"\n *ngFor=\"\n let reactionType of reactionOptions;\n trackBy: trackByMessageReaction\n \"\n data-testclass=\"emoji-option\"\n (click)=\"react(reactionType)\"\n (keyup.enter)=\"react(reactionType)\"\n >\n <div\n *ngIf=\"getLatestUserByReaction(reactionType) as user\"\n class=\"latest-user\"\n (click)=\"hideTooltip()\"\n (keyup.enter)=\"hideTooltip()\"\n (mouseenter)=\"showTooltip($event, reactionType)\"\n (mouseleave)=\"hideTooltip()\"\n attr.data-testid=\"{{ reactionType }}-last-user\"\n >\n <stream-avatar\n attr.data-testid=\"{{ reactionType }}-avatar\"\n [imageUrl]=\"user.image\"\n [name]=\"user.name || user.id\"\n [size]=\"20\"\n ></stream-avatar>\n </div>\n <span class=\"emoji\" style=\"width: 20px; height: 20px; top: 10px\">\n {{ getEmojiByReaction(reactionType) }}\n </span>\n <span\n *ngIf=\"\n messageReactionCounts[reactionType] &&\n messageReactionCounts[reactionType]! > 0\n \"\n class=\"str-chat__message-reactions-list-item__count\"\n attr.data-testid=\"{{ reactionType }}-reaction-count\"\n >\n {{ messageReactionCounts[reactionType] }}\n </span>\n </li>\n </ul>\n</div>\n", styles: [".emoji {position: relative; display: inline-block; }"], components: [{ type:
|
|
4092
|
+
MessageReactionsComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageReactionsComponent, selector: "stream-message-reactions", inputs: { messageId: "messageId", messageReactionCounts: "messageReactionCounts", isSelectorOpen: "isSelectorOpen", latestReactions: "latestReactions", ownReactions: "ownReactions" }, outputs: { isSelectorOpenChange: "isSelectorOpenChange" }, viewQueries: [{ propertyName: "selectorContainer", first: true, predicate: ["selectorContainer"], descendants: true }, { propertyName: "selectorTooltip", first: true, predicate: ["selectorTooltip"], descendants: true }], usesOnChanges: true, ngImport: i0__namespace, template: "<div\n *ngIf=\"existingReactions.length > 0 && !isSelectorOpen\"\n class=\"str-chat__reaction-list\"\n [class.str-chat__reaction-list--reverse]=\"true\"\n data-testid=\"reaction-list\"\n>\n <ul>\n <li\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n data-testclass=\"emoji\"\n >\n <span class=\"emoji\">\n {{ getEmojiByReaction(reactionType) }}\n </span>\n \n </li>\n <li>\n <span\n data-testid=\"reactions-count\"\n class=\"str-chat__reaction-list--counter\"\n >{{ reactionsCount }}</span\n >\n </li>\n </ul>\n</div>\n\n<div\n #selectorContainer\n class=\"str-chat__reaction-selector\"\n *ngIf=\"isSelectorOpen\"\n data-testid=\"reaction-selector\"\n>\n <div\n *ngIf=\"tooltipText\"\n data-testid=\"tooltip\"\n #selectorTooltip\n class=\"str-chat__reaction-selector-tooltip\"\n [ngStyle]=\"{\n left: tooltipPositions?.tooltip + 'px',\n visibility: tooltipPositions ? 'visible' : 'hidden'\n }\"\n >\n <div\n class=\"arrow\"\n [ngStyle]=\"{ left: tooltipPositions?.arrow + 'px' }\"\n ></div>\n <span class=\"latest-user-username\">\n {{ tooltipText }}\n </span>\n </div>\n <ul class=\"str-chat__message-reactions-list\">\n <li\n class=\"str-chat__message-reactions-list-item str-chat__emoji\"\n *ngFor=\"\n let reactionType of reactionOptions;\n trackBy: trackByMessageReaction\n \"\n data-testclass=\"emoji-option\"\n (click)=\"react(reactionType)\"\n (keyup.enter)=\"react(reactionType)\"\n >\n <div\n *ngIf=\"getLatestUserByReaction(reactionType) as user\"\n class=\"latest-user\"\n (click)=\"hideTooltip()\"\n (keyup.enter)=\"hideTooltip()\"\n (mouseenter)=\"showTooltip($event, reactionType)\"\n (mouseleave)=\"hideTooltip()\"\n attr.data-testid=\"{{ reactionType }}-last-user\"\n >\n <stream-avatar-placeholder\n attr.data-testid=\"{{ reactionType }}-avatar\"\n [imageUrl]=\"user.image\"\n [name]=\"user.name || user.id\"\n [size]=\"20\"\n ></stream-avatar-placeholder>\n </div>\n <span class=\"emoji\" style=\"width: 20px; height: 20px; top: 10px\">\n {{ getEmojiByReaction(reactionType) }}\n </span>\n <span\n *ngIf=\"\n messageReactionCounts[reactionType] &&\n messageReactionCounts[reactionType]! > 0\n \"\n class=\"str-chat__message-reactions-list-item__count\"\n attr.data-testid=\"{{ reactionType }}-reaction-count\"\n >\n {{ messageReactionCounts[reactionType] }}\n </span>\n </li>\n </ul>\n</div>\n", styles: [".emoji {position: relative; display: inline-block; }"], components: [{ type: AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size"] }], directives: [{ type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3__namespace.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
3846
4093
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageReactionsComponent, decorators: [{
|
|
3847
4094
|
type: i0.Component,
|
|
3848
4095
|
args: [{
|
|
@@ -3874,9 +4121,11 @@
|
|
|
3874
4121
|
* The `Message` component displays a message with additional information such as sender and date, and enables [interaction with the message (i.e. edit or react)](../concepts/message-interactions.mdx).
|
|
3875
4122
|
*/
|
|
3876
4123
|
var MessageComponent = /** @class */ (function () {
|
|
3877
|
-
function MessageComponent(chatClientService, channelService) {
|
|
4124
|
+
function MessageComponent(chatClientService, channelService, customTemplatesService, cdRef) {
|
|
3878
4125
|
this.chatClientService = chatClientService;
|
|
3879
4126
|
this.channelService = channelService;
|
|
4127
|
+
this.customTemplatesService = customTemplatesService;
|
|
4128
|
+
this.cdRef = cdRef;
|
|
3880
4129
|
/**
|
|
3881
4130
|
* The list of [channel capabilities](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript) that are enabled for the current user, the list of [supported interactions](../concepts/message-interactions.mdx) can be found in our message interaction guide. Unathorized actions won't be displayed on the UI. The [`MessageList`](./MessageListComponent.mdx) component automatically sets this based on [channel capabilities](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript).
|
|
3882
4131
|
*/
|
|
@@ -3890,12 +4139,29 @@
|
|
|
3890
4139
|
this.isPressedOnMobile = false;
|
|
3891
4140
|
this.visibleMessageActionsCount = 0;
|
|
3892
4141
|
this.messageTextParts = [];
|
|
4142
|
+
this.subscriptions = [];
|
|
3893
4143
|
this.user = this.chatClientService.chatClient.user;
|
|
3894
4144
|
}
|
|
4145
|
+
MessageComponent.prototype.ngOnInit = function () {
|
|
4146
|
+
var _this = this;
|
|
4147
|
+
this.subscriptions.push(this.customTemplatesService.mentionTemplate$.subscribe(function (template) { return (_this.mentionTemplate = template); }));
|
|
4148
|
+
this.subscriptions.push(this.customTemplatesService.attachmentListTemplate$.subscribe(function (template) { return (_this.attachmentListTemplate = template); }));
|
|
4149
|
+
this.subscriptions.push(this.customTemplatesService.messageActionsBoxTemplate$.subscribe(function (template) { return (_this.messageActionsBoxTemplate = template); }));
|
|
4150
|
+
this.subscriptions.push(this.customTemplatesService.messageReactionsTemplate$.subscribe(function (template) { return (_this.messageReactionsTemplate = template); }));
|
|
4151
|
+
};
|
|
3895
4152
|
MessageComponent.prototype.ngOnChanges = function (changes) {
|
|
3896
4153
|
if (changes.message) {
|
|
3897
4154
|
this.createMessageParts();
|
|
3898
4155
|
}
|
|
4156
|
+
if (changes.enabledMessageActions) {
|
|
4157
|
+
this.canReactToMessage =
|
|
4158
|
+
this.enabledMessageActions.indexOf('send-reaction') !== -1;
|
|
4159
|
+
this.canReceiveReadEvents =
|
|
4160
|
+
this.enabledMessageActions.indexOf('read-events') !== -1;
|
|
4161
|
+
}
|
|
4162
|
+
};
|
|
4163
|
+
MessageComponent.prototype.ngOnDestroy = function () {
|
|
4164
|
+
this.subscriptions.forEach(function (s) { return s.unsubscribe(); });
|
|
3899
4165
|
};
|
|
3900
4166
|
Object.defineProperty(MessageComponent.prototype, "isSentByCurrentUser", {
|
|
3901
4167
|
get: function () {
|
|
@@ -4016,6 +4282,25 @@
|
|
|
4016
4282
|
enumerable: false,
|
|
4017
4283
|
configurable: true
|
|
4018
4284
|
});
|
|
4285
|
+
MessageComponent.prototype.getAttachmentListContext = function () {
|
|
4286
|
+
var _a, _b;
|
|
4287
|
+
return {
|
|
4288
|
+
messageId: ((_a = this.message) === null || _a === void 0 ? void 0 : _a.id) || '',
|
|
4289
|
+
attachments: ((_b = this.message) === null || _b === void 0 ? void 0 : _b.attachments) || [],
|
|
4290
|
+
};
|
|
4291
|
+
};
|
|
4292
|
+
MessageComponent.prototype.getMessageReactionsContext = function () {
|
|
4293
|
+
var _this = this;
|
|
4294
|
+
var _a, _b, _c, _d;
|
|
4295
|
+
return {
|
|
4296
|
+
messageReactionCounts: ((_a = this.message) === null || _a === void 0 ? void 0 : _a.reaction_counts) || {},
|
|
4297
|
+
latestReactions: ((_b = this.message) === null || _b === void 0 ? void 0 : _b.latest_reactions) || [],
|
|
4298
|
+
isSelectorOpen: this.isReactionSelectorOpen,
|
|
4299
|
+
isSelectorOpenChangeHandler: function (isOpen) { return (_this.isReactionSelectorOpen = isOpen); },
|
|
4300
|
+
messageId: (_c = this.message) === null || _c === void 0 ? void 0 : _c.id,
|
|
4301
|
+
ownReactions: ((_d = this.message) === null || _d === void 0 ? void 0 : _d.own_reactions) || [],
|
|
4302
|
+
};
|
|
4303
|
+
};
|
|
4019
4304
|
MessageComponent.prototype.resendMessage = function () {
|
|
4020
4305
|
void this.channelService.resendMessage(this.message);
|
|
4021
4306
|
};
|
|
@@ -4041,6 +4326,30 @@
|
|
|
4041
4326
|
MessageComponent.prototype.setAsActiveParentMessage = function () {
|
|
4042
4327
|
void this.channelService.setAsActiveParentMessage(this.message);
|
|
4043
4328
|
};
|
|
4329
|
+
MessageComponent.prototype.getMentionContext = function (messagePart) {
|
|
4330
|
+
return {
|
|
4331
|
+
content: messagePart.content,
|
|
4332
|
+
user: messagePart.user,
|
|
4333
|
+
};
|
|
4334
|
+
};
|
|
4335
|
+
MessageComponent.prototype.getMessageActionsBoxContext = function () {
|
|
4336
|
+
var _this = this;
|
|
4337
|
+
return {
|
|
4338
|
+
isOpen: this.isActionBoxOpen,
|
|
4339
|
+
isMine: this.isSentByCurrentUser,
|
|
4340
|
+
enabledActions: this.enabledMessageActions,
|
|
4341
|
+
message: this.message,
|
|
4342
|
+
displayedActionsCountChaneHanler: function (count) {
|
|
4343
|
+
_this.visibleMessageActionsCount = count;
|
|
4344
|
+
// message action box changes UI bindings in parent, so we'll have to rerun change detection
|
|
4345
|
+
_this.cdRef.detectChanges();
|
|
4346
|
+
},
|
|
4347
|
+
isEditingChangeHandler: function (isEditing) {
|
|
4348
|
+
_this.isEditing = isEditing;
|
|
4349
|
+
_this.isActionBoxOpen = !_this.isEditing;
|
|
4350
|
+
},
|
|
4351
|
+
};
|
|
4352
|
+
};
|
|
4044
4353
|
MessageComponent.prototype.createMessageParts = function () {
|
|
4045
4354
|
var _this = this;
|
|
4046
4355
|
var _a, _b;
|
|
@@ -4060,12 +4369,7 @@
|
|
|
4060
4369
|
this.message.mentioned_users.length === 0) {
|
|
4061
4370
|
// Wrap emojis in span to display emojis correctly in Chrome https://bugs.chromium.org/p/chromium/issues/detail?id=596223
|
|
4062
4371
|
var regex = new RegExp(emojiRegex__default['default'](), 'g');
|
|
4063
|
-
|
|
4064
|
-
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
4065
|
-
var isChrome_1 = !!window.chrome &&
|
|
4066
|
-
typeof window.opr === 'undefined';
|
|
4067
|
-
/* eslint-enable @typescript-eslint/no-unsafe-member-access */
|
|
4068
|
-
content = content.replace(regex, function (match) { return "<span " + (isChrome_1 ? 'class="str-chat__emoji-display-fix"' : '') + ">" + match + "</span>"; });
|
|
4372
|
+
content = content.replace(regex, function (match) { return "<span class=\"str-chat__emoji-display-fix\">" + match + "</span>"; });
|
|
4069
4373
|
this.messageTextParts = [{ content: content, type: 'text' }];
|
|
4070
4374
|
}
|
|
4071
4375
|
else {
|
|
@@ -4093,8 +4397,8 @@
|
|
|
4093
4397
|
};
|
|
4094
4398
|
return MessageComponent;
|
|
4095
4399
|
}());
|
|
4096
|
-
MessageComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageComponent, deps: [{ token: ChatClientService }, { token: ChannelService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
4097
|
-
MessageComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageComponent, selector: "stream-message", inputs: { messageInputTemplate: "messageInputTemplate", mentionTemplate: "mentionTemplate", message: "message", enabledMessageActions: "enabledMessageActions", areReactionsEnabled: "areReactionsEnabled", canReactToMessage: "canReactToMessage", isLastSentMessage: "isLastSentMessage", canReceiveReadEvents: "canReceiveReadEvents", mode: "mode" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0__namespace, template: "<div\n #container\n class=\"str-chat__message-simple str-chat__message str-chat__message--{{\n message?.type\n }} str-chat__message--{{ message?.status }} {{\n message?.text ? 'str-chat__message--has-text' : 'has-no-text'\n }}\"\n [class.str-chat__message--me]=\"isSentByCurrentUser\"\n [class.str-chat__message-simple--me]=\"isSentByCurrentUser\"\n [class.mobile-press]=\"isPressedOnMobile\"\n [class.str-chat__message--has-attachment]=\"hasAttachment\"\n [class.str-chat__message--with-reactions]=\"\n areReactionsEnabled !== false && hasReactions\n \"\n data-testid=\"message-container\"\n (mouseleave)=\"isActionBoxOpen = false\"\n>\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <ng-container\n *ngIf=\"\n isSentByCurrentUser &&\n ((isLastSentMessage && message?.status === 'received') ||\n message?.status === 'sending')\n \"\n >\n <ng-container *ngIf=\"message?.status === 'sending'; else sentStatus\">\n <ng-container *ngTemplateOutlet=\"sendingStatus\"></ng-container>\n </ng-container>\n <ng-template #sentStatus>\n <ng-container\n *ngIf=\"\n mode === 'main' &&\n isMessageDeliveredAndRead &&\n canDisplayReadStatus;\n else deliveredStatus\n \"\n >\n <ng-container *ngTemplateOutlet=\"readStatus\"></ng-container>\n </ng-container>\n </ng-template>\n </ng-container>\n <stream-avatar\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n ></stream-avatar>\n <div class=\"str-chat__message-inner\">\n <div\n class=\"str-chat__message-simple__actions\"\n data-testid=\"message-options\"\n *ngIf=\"areOptionsVisible\"\n >\n <div\n data-testid=\"message-actions-container\"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--options\n \"\n [class.str-chat-angular__message-simple__actions__action--options--editing]=\"\n isEditing\n \"\n >\n <stream-message-actions-box\n [isOpen]=\"isActionBoxOpen\"\n [isMine]=\"isSentByCurrentUser\"\n [enabledActions]=\"enabledMessageActions\"\n [message]=\"message\"\n (displayedActionsCount)=\"visibleMessageActionsCount = $event\"\n (isEditing)=\"isEditing = $event; isActionBoxOpen = !isEditing\"\n [messageInputTemplate]=\"messageInputTemplate\"\n ></stream-message-actions-box>\n <stream-icon\n *ngIf=\"visibleMessageActionsCount > 0\"\n data-testid=\"action-icon\"\n icon=\"action-icon\"\n (keyup.enter)=\"isActionBoxOpen = !isActionBoxOpen\"\n (click)=\"isActionBoxOpen = !isActionBoxOpen\"\n ></stream-icon>\n </div>\n <!-- eslint-disable @angular-eslint/template/conditional-complexity -->\n <div\n *ngIf=\"\n enabledMessageActions.indexOf('send-reply') !== -1 &&\n mode === 'main'\n \"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--thread\n \"\n data-testid=\"reply-in-thread\"\n (click)=\"setAsActiveParentMessage()\"\n (keyup.enter)=\"setAsActiveParentMessage()\"\n >\n <stream-icon icon=\"reply-in-thread\"></stream-icon>\n </div>\n <div\n *ngIf=\"\n areReactionsEnabled !== false &&\n canReactToMessage !== false &&\n enabledMessageActions.indexOf('send-reaction') !== -1\n \"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--reactions\n \"\n data-testid=\"reaction-icon\"\n (click)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n (keyup.enter)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n >\n <stream-icon icon=\"reaction-icon\"></stream-icon>\n </div>\n </div>\n <!-- eslint-enable @angular-eslint/template/conditional-complexity -->\n <stream-message-reactions\n *ngIf=\"areReactionsEnabled !== false\"\n [messageReactionCounts]=\"message?.reaction_counts || {}\"\n [latestReactions]=\"message?.latest_reactions || []\"\n [(isSelectorOpen)]=\"isReactionSelectorOpen\"\n [messageId]=\"message?.id\"\n [ownReactions]=\"message?.own_reactions || []\"\n ></stream-message-reactions>\n <stream-attachment-list\n *ngIf=\"hasAttachment && !message?.quoted_message\"\n [attachments]=\"message!.attachments!\"\n [messageId]=\"message!.id\"\n ></stream-attachment-list>\n <div class=\"str-chat__message-text\" *ngIf=\"message?.text\">\n <div\n data-testid=\"inner-message\"\n class=\"\n str-chat__message-text-inner str-chat__message-simple-text-inner\n \"\n [class.str-chat__message-light-text-inner--has-attachment]=\"\n hasAttachment\n \"\n (click)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\n \"\n (keyup.enter)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\n \"\n >\n <ng-container *ngTemplateOutlet=\"quotedMessage\"></ng-container>\n <stream-attachment-list\n *ngIf=\"hasAttachment && message?.quoted_message\"\n [attachments]=\"message!.attachments!\"\n [messageId]=\"message!.id\"\n ></stream-attachment-list>\n <div\n data-testid=\"client-error-message\"\n *ngIf=\"message?.type === 'error'\"\n class=\"str-chat__simple-message--error-message\"\n >\n {{ \"streamChat.Error \u00B7 Unsent\" | translate }}\n </div>\n <div\n data-testid=\"error-message\"\n *ngIf=\"message?.status === 'failed'\"\n class=\"str-chat__simple-message--error-message\"\n >\n {{\n (message?.errorStatusCode === 403\n ? \"streamChat.Message Failed \u00B7 Unauthorized\"\n : \"streamChat.Message Failed \u00B7 Click to try again\"\n ) | translate\n }}\n </div>\n <div\n (click)=\"textClicked()\"\n (keyup.enter)=\"textClicked()\"\n data-testid=\"text\"\n >\n <p>\n <!-- eslint-disable-next-line @angular-eslint/template/use-track-by-function -->\n <ng-container *ngFor=\"let part of messageTextParts\">\n <span\n *ngIf=\"part.type === 'text'; else mention\"\n [innerHTML]=\"part.content\"\n ></span>\n <ng-template #mention>\n <ng-container *ngIf=\"mentionTemplate; else defaultMention\">\n <ng-container\n *ngTemplateOutlet=\"\n mentionTemplate;\n context: { user: part.user! }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultMention>\n <b>{{ part.content }}</b>\n </ng-template>\n </ng-template>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"str-chat__message-simple-reply-button\">\n <button\n *ngIf=\"\n !!message?.reply_count &&\n mode !== 'thread' &&\n enabledMessageActions.indexOf('send-reply') !== -1\n \"\n class=\"str-chat__message-replies-count-button\"\n data-testid=\"reply-count-button\"\n (click)=\"setAsActiveParentMessage()\"\n >\n <stream-icon icon=\"reply\"></stream-icon>\n {{message?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </button>\n </div>\n <div class=\"str-chat__message-data str-chat__message-simple-data\">\n <span\n data-testid=\"sender\"\n *ngIf=\"!isSentByCurrentUser\"\n class=\"str-chat__message-simple-name\"\n >\n {{ message?.user?.name ? message?.user?.name : message?.user?.id }}\n </span>\n <span data-testid=\"date\" class=\"str-chat__message-simple-timestamp\">\n {{ parsedDate }}\n </span>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #sendingStatus>\n <span\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"sending-indicator\"\n >\n <div class=\"str-chat__tooltip\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n <stream-loading-indicator\n data-testid=\"loading-indicator\"\n ></stream-loading-indicator>\n </span>\n</ng-template>\n<ng-template #readStatus>\n <span\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"read-indicator\"\n >\n <div class=\"str-chat__tooltip\" data-testid=\"read-by-tooltip\">\n {{ readByText }}\n </div>\n <stream-avatar\n class=\"str-chat-angular__avatar-host\"\n data-test-id=\"last-read-user-avatar\"\n [size]=\"15\"\n [imageUrl]=\"lastReadUser?.image\"\n [name]=\"lastReadUser?.name || lastReadUser?.id\"\n ></stream-avatar>\n <span\n data-test-id=\"read-by-length\"\n *ngIf=\"isReadByMultipleUsers\"\n class=\"str-chat__message-simple-status-number\"\n >\n {{ (message?.readBy)!.length }}\n </span>\n </span>\n</ng-template>\n<ng-template #deliveredStatus>\n <span\n *ngIf=\"mode === 'main'\"\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"delivered-indicator\"\n >\n <div class=\"str-chat__tooltip\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n <stream-icon\n data-testid=\"delivered-icon\"\n icon=\"delivered-icon\"\n ></stream-icon>\n </span>\n</ng-template>\n\n<ng-template #deletedMessage>\n <div data-testid=\"message-deleted-component\">\n <div class=\"str-chat__message--deleted-inner\" translate>\n streamChat.This message was deleted...\n </div>\n </div>\n</ng-template>\n\n<ng-template #systemMessage>\n <div data-testid=\"system-message\" class=\"str-chat__message--system\">\n <div class=\"str-chat__message--system__text\">\n <div class=\"str-chat__message--system__line\"></div>\n <p>{{ message?.text }}</p>\n <div class=\"str-chat__message--system__line\"></div>\n </div>\n <div class=\"str-chat__message--system__date\">\n {{ parsedDate }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #quotedMessage>\n <div\n *ngIf=\"message?.quoted_message\"\n class=\"quoted-message\"\n data-testid=\"quoted-message-container\"\n [class.mine]=\"isSentByCurrentUser\"\n >\n <stream-avatar\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host\"\n [imageUrl]=\"message?.quoted_message?.user?.image\"\n [name]=\"\n message?.quoted_message?.user?.name || message?.quoted_message?.user?.id\n \"\n [size]=\"20\"\n ></stream-avatar>\n <div class=\"quoted-message-inner\">\n <stream-attachment-list\n *ngIf=\"\n message?.quoted_message?.attachments &&\n message?.quoted_message?.attachments?.length\n \"\n [attachments]=\"quotedMessageAttachments\"\n [messageId]=\"message?.quoted_message?.id\"\n ></stream-attachment-list>\n <div\n data-testid=\"quoted-message-text\"\n [innerHTML]=\"\n message?.quoted_message?.html || message?.quoted_message?.text\n \"\n ></div>\n </div>\n </div>\n</ng-template>\n", components: [{ type: AvatarComponent, selector: "stream-avatar", inputs: ["name", "imageUrl", "size"] }, { type: MessageActionsBoxComponent, selector: "stream-message-actions-box", inputs: ["messageInputTemplate", "isOpen", "isMine", "message", "enabledActions"], outputs: ["displayedActionsCount", "isEditing"] }, { type: IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }, { type: MessageReactionsComponent, selector: "stream-message-reactions", inputs: ["messageId", "messageReactionCounts", "isSelectorOpen", "latestReactions", "ownReactions"], outputs: ["isSelectorOpenChange"] }, { type: AttachmentListComponent, selector: "stream-attachment-list", inputs: ["messageId", "attachments"] }, { type: LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: ["size", "color"] }], directives: [{ type: i6__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2__namespace.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "translate": i2__namespace.TranslatePipe } });
|
|
4400
|
+
MessageComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageComponent, deps: [{ token: ChatClientService }, { token: ChannelService }, { token: CustomTemplatesService }, { token: i0__namespace.ChangeDetectorRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
4401
|
+
MessageComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageComponent, selector: "stream-message", inputs: { message: "message", enabledMessageActions: "enabledMessageActions", isLastSentMessage: "isLastSentMessage", mode: "mode" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0__namespace, template: "<div\n #container\n class=\"str-chat__message-simple str-chat__message str-chat__message--{{\n message?.type\n }} str-chat__message--{{ message?.status }} {{\n message?.text ? 'str-chat__message--has-text' : 'has-no-text'\n }}\"\n [class.str-chat__message--me]=\"isSentByCurrentUser\"\n [class.str-chat__message-simple--me]=\"isSentByCurrentUser\"\n [class.mobile-press]=\"isPressedOnMobile\"\n [class.str-chat__message--has-attachment]=\"hasAttachment\"\n [class.str-chat__message--with-reactions]=\"hasReactions\"\n data-testid=\"message-container\"\n (mouseleave)=\"isActionBoxOpen = false\"\n>\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <ng-container\n *ngIf=\"\n isSentByCurrentUser &&\n ((isLastSentMessage && message?.status === 'received') ||\n message?.status === 'sending')\n \"\n >\n <ng-container *ngIf=\"message?.status === 'sending'; else sentStatus\">\n <ng-container *ngTemplateOutlet=\"sendingStatus\"></ng-container>\n </ng-container>\n <ng-template #sentStatus>\n <ng-container\n *ngIf=\"\n mode === 'main' &&\n isMessageDeliveredAndRead &&\n canDisplayReadStatus;\n else deliveredStatus\n \"\n >\n <ng-container *ngTemplateOutlet=\"readStatus\"></ng-container>\n </ng-container>\n </ng-template>\n </ng-container>\n <stream-avatar-placeholder\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__message-inner\">\n <div\n class=\"str-chat__message-simple__actions\"\n data-testid=\"message-options\"\n *ngIf=\"areOptionsVisible\"\n >\n <div\n data-testid=\"message-actions-container\"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--options\n \"\n [class.str-chat-angular__message-simple__actions__action--options--editing]=\"\n isEditing\n \"\n >\n <ng-template\n #defaultMessageActionsBox\n let-isOpen=\"isOpen\"\n let-isMine=\"isMine\"\n let-enabledActions=\"enabledActions\"\n let-messageInput=\"message\"\n let-displayedActionsCountChaneHanler=\"displayedActionsCountChaneHanler\"\n let-isEditingChangeHandler=\"isEditingChangeHandler\"\n >\n <stream-message-actions-box\n [isOpen]=\"isOpen\"\n [isMine]=\"isMine\"\n [enabledActions]=\"enabledActions\"\n [message]=\"messageInput\"\n (displayedActionsCount)=\"\n displayedActionsCountChaneHanler($event)\n \"\n (isEditing)=\"isEditingChangeHandler($event)\"\n ></stream-message-actions-box>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageActionsBoxTemplate || defaultMessageActionsBox;\n context: getMessageActionsBoxContext()\n \"\n ></ng-container>\n <stream-icon-placeholder\n *ngIf=\"visibleMessageActionsCount > 0\"\n data-testid=\"action-icon\"\n icon=\"action-icon\"\n (keyup.enter)=\"isActionBoxOpen = !isActionBoxOpen\"\n (click)=\"isActionBoxOpen = !isActionBoxOpen\"\n ></stream-icon-placeholder>\n </div>\n <!-- eslint-disable @angular-eslint/template/conditional-complexity -->\n <div\n *ngIf=\"\n enabledMessageActions.indexOf('send-reply') !== -1 &&\n mode === 'main'\n \"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--thread\n \"\n data-testid=\"reply-in-thread\"\n (click)=\"setAsActiveParentMessage()\"\n (keyup.enter)=\"setAsActiveParentMessage()\"\n >\n <stream-icon-placeholder\n icon=\"reply-in-thread\"\n ></stream-icon-placeholder>\n </div>\n <div\n *ngIf=\"canReactToMessage\"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--reactions\n \"\n data-testid=\"reaction-icon\"\n (click)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n (keyup.enter)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n >\n <stream-icon-placeholder\n icon=\"reaction-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <!-- eslint-enable @angular-eslint/template/conditional-complexity -->\n <ng-template\n #defaultMessageReactions\n let-messageReactionCounts=\"messageReactionCounts\"\n let-latestReactions=\"latestReactions\"\n let-isSelectorOpen=\"isSelectorOpen\"\n let-isSelectorOpenChangeHandler=\"isSelectorOpenChangeHandler\"\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n >\n <stream-message-reactions\n [messageReactionCounts]=\"messageReactionCounts\"\n [latestReactions]=\"latestReactions\"\n [isSelectorOpen]=\"isSelectorOpen\"\n (isSelectorOpenChange)=\"isSelectorOpenChangeHandler($event)\"\n [messageId]=\"messageId\"\n [ownReactions]=\"ownReactions\"\n ></stream-message-reactions>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageReactionsTemplate || defaultMessageReactions;\n context: getMessageReactionsContext()\n \"\n ></ng-container>\n <ng-container *ngIf=\"hasAttachment && !message?.quoted_message\">\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n attachmentListTemplate || defaultAttachments;\n context: getAttachmentListContext()\n \"\n ></ng-container>\n </ng-container>\n <div class=\"str-chat__message-text\" *ngIf=\"message?.text\">\n <div\n data-testid=\"inner-message\"\n class=\"\n str-chat__message-text-inner str-chat__message-simple-text-inner\n \"\n [class.str-chat__message-light-text-inner--has-attachment]=\"\n hasAttachment\n \"\n (click)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\n \"\n (keyup.enter)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\n \"\n >\n <ng-container *ngTemplateOutlet=\"quotedMessage\"></ng-container>\n <stream-attachment-list\n *ngIf=\"hasAttachment && message?.quoted_message\"\n [attachments]=\"message!.attachments!\"\n [messageId]=\"message!.id\"\n ></stream-attachment-list>\n <div\n data-testid=\"client-error-message\"\n *ngIf=\"message?.type === 'error'\"\n class=\"str-chat__simple-message--error-message\"\n >\n {{ \"streamChat.Error \u00B7 Unsent\" | translate }}\n </div>\n <div\n data-testid=\"error-message\"\n *ngIf=\"message?.status === 'failed'\"\n class=\"str-chat__simple-message--error-message\"\n >\n {{\n (message?.errorStatusCode === 403\n ? \"streamChat.Message Failed \u00B7 Unauthorized\"\n : \"streamChat.Message Failed \u00B7 Click to try again\"\n ) | translate\n }}\n </div>\n <div\n (click)=\"textClicked()\"\n (keyup.enter)=\"textClicked()\"\n data-testid=\"text\"\n >\n <p>\n <!-- eslint-disable-next-line @angular-eslint/template/use-track-by-function -->\n <ng-container *ngFor=\"let part of messageTextParts\">\n <span\n *ngIf=\"part.type === 'text'; else mention\"\n [innerHTML]=\"part.content\"\n ></span>\n <ng-template #mention>\n <ng-template #defaultMention let-content=\"content\">\n <b>{{ content }}</b>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n mentionTemplate || defaultMention;\n context: getMentionContext(part)\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"str-chat__message-simple-reply-button\">\n <button\n *ngIf=\"\n !!message?.reply_count &&\n mode !== 'thread' &&\n enabledMessageActions.indexOf('send-reply') !== -1\n \"\n class=\"str-chat__message-replies-count-button\"\n data-testid=\"reply-count-button\"\n (click)=\"setAsActiveParentMessage()\"\n >\n <stream-icon-placeholder icon=\"reply\"></stream-icon-placeholder>\n {{message?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </button>\n </div>\n <div class=\"str-chat__message-data str-chat__message-simple-data\">\n <span\n data-testid=\"sender\"\n *ngIf=\"!isSentByCurrentUser\"\n class=\"str-chat__message-simple-name\"\n >\n {{ message?.user?.name ? message?.user?.name : message?.user?.id }}\n </span>\n <span data-testid=\"date\" class=\"str-chat__message-simple-timestamp\">\n {{ parsedDate }}\n </span>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #sendingStatus>\n <span\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"sending-indicator\"\n >\n <div class=\"str-chat__tooltip\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n <stream-loading-indicator-placeholder\n data-testid=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </span>\n</ng-template>\n<ng-template #readStatus>\n <span\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"read-indicator\"\n >\n <div class=\"str-chat__tooltip\" data-testid=\"read-by-tooltip\">\n {{ readByText }}\n </div>\n <stream-avatar-placeholder\n class=\"str-chat-angular__avatar-host\"\n data-test-id=\"last-read-user-avatar\"\n [size]=\"15\"\n [imageUrl]=\"lastReadUser?.image\"\n [name]=\"lastReadUser?.name || lastReadUser?.id\"\n ></stream-avatar-placeholder>\n <span\n data-test-id=\"read-by-length\"\n *ngIf=\"isReadByMultipleUsers\"\n class=\"str-chat__message-simple-status-number\"\n >\n {{ (message?.readBy)!.length }}\n </span>\n </span>\n</ng-template>\n<ng-template #deliveredStatus>\n <span\n *ngIf=\"mode === 'main'\"\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"delivered-indicator\"\n >\n <div class=\"str-chat__tooltip\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n <stream-icon-placeholder\n data-testid=\"delivered-icon\"\n icon=\"delivered-icon\"\n ></stream-icon-placeholder>\n </span>\n</ng-template>\n\n<ng-template #deletedMessage>\n <div data-testid=\"message-deleted-component\">\n <div class=\"str-chat__message--deleted-inner\" translate>\n streamChat.This message was deleted...\n </div>\n </div>\n</ng-template>\n\n<ng-template #systemMessage>\n <div data-testid=\"system-message\" class=\"str-chat__message--system\">\n <div class=\"str-chat__message--system__text\">\n <div class=\"str-chat__message--system__line\"></div>\n <p>{{ message?.text }}</p>\n <div class=\"str-chat__message--system__line\"></div>\n </div>\n <div class=\"str-chat__message--system__date\">\n {{ parsedDate }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #quotedMessage>\n <div\n *ngIf=\"message?.quoted_message\"\n class=\"quoted-message\"\n data-testid=\"quoted-message-container\"\n [class.mine]=\"isSentByCurrentUser\"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host\"\n [imageUrl]=\"message?.quoted_message?.user?.image\"\n [name]=\"\n message?.quoted_message?.user?.name || message?.quoted_message?.user?.id\n \"\n [size]=\"20\"\n ></stream-avatar-placeholder>\n <div class=\"quoted-message-inner\">\n <stream-attachment-list\n *ngIf=\"\n message?.quoted_message?.attachments &&\n message?.quoted_message?.attachments?.length\n \"\n [attachments]=\"quotedMessageAttachments\"\n [messageId]=\"message?.quoted_message?.id\"\n ></stream-attachment-list>\n <div\n data-testid=\"quoted-message-text\"\n [innerHTML]=\"\n message?.quoted_message?.html || message?.quoted_message?.text\n \"\n ></div>\n </div>\n </div>\n</ng-template>\n", components: [{ type: AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size"] }, { type: MessageActionsBoxComponent, selector: "stream-message-actions-box", inputs: ["isOpen", "isMine", "message", "enabledActions"], outputs: ["displayedActionsCount", "isEditing"] }, { type: IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: MessageReactionsComponent, selector: "stream-message-reactions", inputs: ["messageId", "messageReactionCounts", "isSelectorOpen", "latestReactions", "ownReactions"], outputs: ["isSelectorOpenChange"] }, { type: AttachmentListComponent, selector: "stream-attachment-list", inputs: ["messageId", "attachments"] }, { type: LoadingIndicatorPlaceholderComponent, selector: "stream-loading-indicator-placeholder", inputs: ["size", "color"] }], directives: [{ type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2__namespace.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "translate": i2__namespace.TranslatePipe } });
|
|
4098
4402
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageComponent, decorators: [{
|
|
4099
4403
|
type: i0.Component,
|
|
4100
4404
|
args: [{
|
|
@@ -4102,22 +4406,12 @@
|
|
|
4102
4406
|
templateUrl: './message.component.html',
|
|
4103
4407
|
styles: [],
|
|
4104
4408
|
}]
|
|
4105
|
-
}], ctorParameters: function () { return [{ type: ChatClientService }, { type: ChannelService }]; }, propDecorators: {
|
|
4106
|
-
type: i0.Input
|
|
4107
|
-
}], mentionTemplate: [{
|
|
4108
|
-
type: i0.Input
|
|
4109
|
-
}], message: [{
|
|
4409
|
+
}], ctorParameters: function () { return [{ type: ChatClientService }, { type: ChannelService }, { type: CustomTemplatesService }, { type: i0__namespace.ChangeDetectorRef }]; }, propDecorators: { message: [{
|
|
4110
4410
|
type: i0.Input
|
|
4111
4411
|
}], enabledMessageActions: [{
|
|
4112
4412
|
type: i0.Input
|
|
4113
|
-
}], areReactionsEnabled: [{
|
|
4114
|
-
type: i0.Input
|
|
4115
|
-
}], canReactToMessage: [{
|
|
4116
|
-
type: i0.Input
|
|
4117
4413
|
}], isLastSentMessage: [{
|
|
4118
4414
|
type: i0.Input
|
|
4119
|
-
}], canReceiveReadEvents: [{
|
|
4120
|
-
type: i0.Input
|
|
4121
4415
|
}], mode: [{
|
|
4122
4416
|
type: i0.Input
|
|
4123
4417
|
}], container: [{
|
|
@@ -4220,12 +4514,13 @@
|
|
|
4220
4514
|
* The `AutocompleteTextarea` component is used by the [`MessageInput`](./MessageInputComponent.mdx) component to display the input HTML element where users can type their message.
|
|
4221
4515
|
*/
|
|
4222
4516
|
var AutocompleteTextareaComponent = /** @class */ (function () {
|
|
4223
|
-
function AutocompleteTextareaComponent(channelService, chatClientService, transliterationService, emojiInputService) {
|
|
4517
|
+
function AutocompleteTextareaComponent(channelService, chatClientService, transliterationService, emojiInputService, customTemplatesService) {
|
|
4224
4518
|
var _this = this;
|
|
4225
4519
|
this.channelService = channelService;
|
|
4226
4520
|
this.chatClientService = chatClientService;
|
|
4227
4521
|
this.transliterationService = transliterationService;
|
|
4228
4522
|
this.emojiInputService = emojiInputService;
|
|
4523
|
+
this.customTemplatesService = customTemplatesService;
|
|
4229
4524
|
this.class = 'str-chat__textarea';
|
|
4230
4525
|
/**
|
|
4231
4526
|
* The value of the input HTML element.
|
|
@@ -4304,6 +4599,8 @@
|
|
|
4304
4599
|
selectionStart + emoji.length;
|
|
4305
4600
|
_this.inputChanged();
|
|
4306
4601
|
}));
|
|
4602
|
+
this.subscriptions.push(this.customTemplatesService.mentionAutocompleteItemTemplate$.subscribe(function (template) { return (_this.mentionAutocompleteItemTemplate = template); }));
|
|
4603
|
+
this.subscriptions.push(this.customTemplatesService.commandAutocompleteItemTemplate$.subscribe(function (template) { return (_this.commandAutocompleteItemTemplate = template); }));
|
|
4307
4604
|
this.autocompleteConfig.mentions = [
|
|
4308
4605
|
this.userMentionConfig,
|
|
4309
4606
|
this.slashCommandConfig,
|
|
@@ -4416,8 +4713,8 @@
|
|
|
4416
4713
|
};
|
|
4417
4714
|
return AutocompleteTextareaComponent;
|
|
4418
4715
|
}());
|
|
4419
|
-
AutocompleteTextareaComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AutocompleteTextareaComponent, deps: [{ token: ChannelService }, { token: ChatClientService }, { token: TransliterationService }, { token: EmojiInputService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
4420
|
-
AutocompleteTextareaComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AutocompleteTextareaComponent, selector: "stream-autocomplete-textarea", inputs: { value: "value", areMentionsEnabled: "areMentionsEnabled",
|
|
4716
|
+
AutocompleteTextareaComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AutocompleteTextareaComponent, deps: [{ token: ChannelService }, { token: ChatClientService }, { token: TransliterationService }, { token: EmojiInputService }, { token: CustomTemplatesService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
4717
|
+
AutocompleteTextareaComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AutocompleteTextareaComponent, selector: "stream-autocomplete-textarea", inputs: { value: "value", areMentionsEnabled: "areMentionsEnabled", mentionScope: "mentionScope" }, outputs: { valueChange: "valueChange", send: "send", userMentions: "userMentions" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "messageInput", first: true, predicate: ["input"], descendants: true }], usesOnChanges: true, ngImport: i0__namespace, template: "<textarea\n [value]=\"value || ''\"\n autofocus\n data-testid=\"textarea\"\n #input\n placeholder=\"{{ 'streamChat.Type your message' | translate }}\"\n class=\"rta__textarea str-chat__textarea__textarea str-chat__angular-textarea\"\n rows=\"1\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"sent($event)\"\n [mentionConfig]=\"autocompleteConfig\"\n (searchTerm)=\"autcompleteSearchTermChanged($event)\"\n [mentionListTemplate]=\"autocompleteItem\"\n (blur)=\"inputLeft()\"\n></textarea>\n<ng-template #autocompleteItem let-item=\"item\">\n <div class=\"rta rta__item str-chat__emojisearch__item\" [ngSwitch]=\"item.type\">\n <div class=\"rta__entity\" *ngSwitchCase=\"'mention'\">\n <ng-container\n *ngTemplateOutlet=\"\n mentionAutocompleteItemTemplate || defaultMentionTemplate;\n context: { item: item }\n \"\n ></ng-container>\n </div>\n <div class=\"rta__entity\" *ngSwitchCase=\"'command'\">\n <ng-container\n *ngTemplateOutlet=\"\n commandAutocompleteItemTemplate || defaultCommandTemplate;\n context: { item: item }\n \"\n ></ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #defaultCommandTemplate let-item=\"item\">\n <div class=\"str-chat__slash-command\">\n <span class=\"str-chat__slash-command-header\">\n <strong data-testclass=\"command-name\">{{ item.name }}</strong>\n {{ item.args }}\n </span>\n <br />\n <span class=\"str-chat__slash-command-description\">{{\n item.description\n }}</span>\n </div>\n</ng-template>\n\n<ng-template #defaultMentionTemplate let-item=\"item\">\n <div class=\"str-chat__user-item\">\n <stream-avatar-placeholder\n data-testclass=\"avatar\"\n class=\"str-chat__avatar str-chat__avatar--circle\"\n style=\"height: 20px\"\n [size]=\"20\"\n [imageUrl]=\"item.image || item.user?.image\"\n [name]=\"item.autocompleteLabel\"\n ></stream-avatar-placeholder>\n <span data-testclass=\"username\" class=\"str-chat__user-item--name\">{{\n item.autocompleteLabel\n }}</span>\n </div>\n</ng-template>\n", components: [{ type: AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size"] }], directives: [{ type: i7__namespace.MentionDirective, selector: "[mention], [mentionConfig]", inputs: ["mentionConfig", "mention", "mentionListTemplate"], outputs: ["searchTerm", "itemSelected", "opened", "closed"] }, { type: i3__namespace.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i3__namespace.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "translate": i2__namespace.TranslatePipe } });
|
|
4421
4718
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AutocompleteTextareaComponent, decorators: [{
|
|
4422
4719
|
type: i0.Component,
|
|
4423
4720
|
args: [{
|
|
@@ -4425,16 +4722,12 @@
|
|
|
4425
4722
|
templateUrl: './autocomplete-textarea.component.html',
|
|
4426
4723
|
styles: [],
|
|
4427
4724
|
}]
|
|
4428
|
-
}], ctorParameters: function () { return [{ type: ChannelService }, { type: ChatClientService }, { type: TransliterationService }, { type: EmojiInputService }]; }, propDecorators: { class: [{
|
|
4725
|
+
}], ctorParameters: function () { return [{ type: ChannelService }, { type: ChatClientService }, { type: TransliterationService }, { type: EmojiInputService }, { type: CustomTemplatesService }]; }, propDecorators: { class: [{
|
|
4429
4726
|
type: i0.HostBinding
|
|
4430
4727
|
}], value: [{
|
|
4431
4728
|
type: i0.Input
|
|
4432
4729
|
}], areMentionsEnabled: [{
|
|
4433
4730
|
type: i0.Input
|
|
4434
|
-
}], mentionAutocompleteItemTemplate: [{
|
|
4435
|
-
type: i0.Input
|
|
4436
|
-
}], commandAutocompleteItemTemplate: [{
|
|
4437
|
-
type: i0.Input
|
|
4438
4731
|
}], mentionScope: [{
|
|
4439
4732
|
type: i0.Input
|
|
4440
4733
|
}], valueChange: [{
|
|
@@ -4493,20 +4786,12 @@
|
|
|
4493
4786
|
* The `MessageList` component renders a scrollable list of messages.
|
|
4494
4787
|
*/
|
|
4495
4788
|
var MessageListComponent = /** @class */ (function () {
|
|
4496
|
-
function MessageListComponent(channelService, chatClientService, imageLoadService) {
|
|
4789
|
+
function MessageListComponent(channelService, chatClientService, imageLoadService, customTemplatesService) {
|
|
4497
4790
|
var _this = this;
|
|
4498
4791
|
this.channelService = channelService;
|
|
4499
4792
|
this.chatClientService = chatClientService;
|
|
4500
4793
|
this.imageLoadService = imageLoadService;
|
|
4501
|
-
|
|
4502
|
-
* @deprecated use [channel capabilities](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript) instead. If true, the message reactions are displayed. Users can also react to messages if they have the necessary [channel capability](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript).
|
|
4503
|
-
*/
|
|
4504
|
-
this.areReactionsEnabled = undefined;
|
|
4505
|
-
/**
|
|
4506
|
-
* @deprecated use [channel capabilities](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript) instead. The list of [actions that are enabled](./MessageActionsBoxComponent.mdx), please note that the user also has to have the necessary [channel capabilities](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript) for actions to work. Unathorized actions won't be displayed on the UI. The `MessgaeList` component makes the necessary checks before passing the actions to the `Message` component.
|
|
4507
|
-
*/
|
|
4508
|
-
/* eslint-disable-next-line @angular-eslint/no-input-rename */
|
|
4509
|
-
this.enabledMessageActionsInput = undefined;
|
|
4794
|
+
this.customTemplatesService = customTemplatesService;
|
|
4510
4795
|
/**
|
|
4511
4796
|
* Determines if the message list should display channel messages or [thread messages](https://getstream.io/chat/docs/javascript/threads/?language=javascript).
|
|
4512
4797
|
*/
|
|
@@ -4515,7 +4800,6 @@
|
|
|
4515
4800
|
this.class = 'str-chat-angular__main-panel-inner str-chat-angular__message-list-host';
|
|
4516
4801
|
this.unreadMessageCount = 0;
|
|
4517
4802
|
this.groupStyles = [];
|
|
4518
|
-
this.authorizedMessageActions = ['flag'];
|
|
4519
4803
|
this.isUserScrolledUpThreshold = 300;
|
|
4520
4804
|
this.subscriptions = [];
|
|
4521
4805
|
this.subscriptions.push(this.channelService.activeChannel$.subscribe(function (channel) {
|
|
@@ -4523,39 +4807,7 @@
|
|
|
4523
4807
|
_this.resetScrollState();
|
|
4524
4808
|
var capabilites = (_a = channel === null || channel === void 0 ? void 0 : channel.data) === null || _a === void 0 ? void 0 : _a.own_capabilities;
|
|
4525
4809
|
if (capabilites) {
|
|
4526
|
-
_this.
|
|
4527
|
-
_this.canReceiveReadEvents = capabilites.indexOf('read-events') !== -1;
|
|
4528
|
-
_this.authorizedMessageActions = [];
|
|
4529
|
-
if (_this.canReactToMessage) {
|
|
4530
|
-
_this.authorizedMessageActions.push('send-reaction');
|
|
4531
|
-
}
|
|
4532
|
-
if (_this.canReceiveReadEvents) {
|
|
4533
|
-
_this.authorizedMessageActions.push('read-events');
|
|
4534
|
-
}
|
|
4535
|
-
if (capabilites.indexOf('flag-message') !== -1) {
|
|
4536
|
-
_this.authorizedMessageActions.push('flag');
|
|
4537
|
-
}
|
|
4538
|
-
if (capabilites.indexOf('update-own-message') !== -1) {
|
|
4539
|
-
_this.authorizedMessageActions.push('edit');
|
|
4540
|
-
}
|
|
4541
|
-
if (capabilites.indexOf('update-any-message') !== -1) {
|
|
4542
|
-
_this.authorizedMessageActions.push('edit');
|
|
4543
|
-
_this.authorizedMessageActions.push('edit-any');
|
|
4544
|
-
}
|
|
4545
|
-
if (capabilites.indexOf('delete-own-message') !== -1) {
|
|
4546
|
-
_this.authorizedMessageActions.push('delete');
|
|
4547
|
-
}
|
|
4548
|
-
if (capabilites.indexOf('delete-any-message') !== -1) {
|
|
4549
|
-
_this.authorizedMessageActions.push('delete');
|
|
4550
|
-
_this.authorizedMessageActions.push('delete-any');
|
|
4551
|
-
}
|
|
4552
|
-
if (capabilites.indexOf('send-reply') !== -1) {
|
|
4553
|
-
_this.authorizedMessageActions.push('send-reply');
|
|
4554
|
-
}
|
|
4555
|
-
if (capabilites.indexOf('quote-message') !== -1) {
|
|
4556
|
-
_this.authorizedMessageActions.push('quote-message');
|
|
4557
|
-
}
|
|
4558
|
-
_this.setEnabledActions();
|
|
4810
|
+
_this.enabledMessageActions = capabilites;
|
|
4559
4811
|
}
|
|
4560
4812
|
}));
|
|
4561
4813
|
this.subscriptions.push(this.imageLoadService.imageLoad$.subscribe(function () {
|
|
@@ -4576,6 +4828,8 @@
|
|
|
4576
4828
|
}
|
|
4577
4829
|
_this.parentMessage = message;
|
|
4578
4830
|
}));
|
|
4831
|
+
this.subscriptions.push(this.customTemplatesService.messageTemplate$.subscribe(function (template) { return (_this.messageTemplate = template); }));
|
|
4832
|
+
this.subscriptions.push(this.customTemplatesService.typingIndicatorTemplate$.subscribe(function (template) { return (_this.typingIndicatorTemplate = template); }));
|
|
4579
4833
|
this.usersTypingInChannel$ = this.channelService.usersTypingInChannel$;
|
|
4580
4834
|
this.usersTypingInThread$ = this.channelService.usersTypingInThread$;
|
|
4581
4835
|
}
|
|
@@ -4583,9 +4837,6 @@
|
|
|
4583
4837
|
this.setMessages$();
|
|
4584
4838
|
};
|
|
4585
4839
|
MessageListComponent.prototype.ngOnChanges = function (changes) {
|
|
4586
|
-
if (changes.enabledMessageActionsInput) {
|
|
4587
|
-
this.setEnabledActions();
|
|
4588
|
-
}
|
|
4589
4840
|
if (changes.mode) {
|
|
4590
4841
|
this.setMessages$();
|
|
4591
4842
|
}
|
|
@@ -4618,15 +4869,6 @@
|
|
|
4618
4869
|
MessageListComponent.prototype.ngOnDestroy = function () {
|
|
4619
4870
|
this.subscriptions.forEach(function (s) { return s.unsubscribe(); });
|
|
4620
4871
|
};
|
|
4621
|
-
Object.defineProperty(MessageListComponent.prototype, "usersTyping$", {
|
|
4622
|
-
get: function () {
|
|
4623
|
-
return this.mode === 'thread'
|
|
4624
|
-
? this.usersTypingInThread$
|
|
4625
|
-
: this.usersTypingInChannel$;
|
|
4626
|
-
},
|
|
4627
|
-
enumerable: false,
|
|
4628
|
-
configurable: true
|
|
4629
|
-
});
|
|
4630
4872
|
MessageListComponent.prototype.trackByMessageId = function (index, item) {
|
|
4631
4873
|
return item.id;
|
|
4632
4874
|
};
|
|
@@ -4659,31 +4901,24 @@
|
|
|
4659
4901
|
}
|
|
4660
4902
|
this.prevScrollTop = this.scrollContainer.nativeElement.scrollTop;
|
|
4661
4903
|
};
|
|
4904
|
+
MessageListComponent.prototype.getTypingIndicatorContext = function () {
|
|
4905
|
+
return {
|
|
4906
|
+
usersTyping$: this.usersTyping$,
|
|
4907
|
+
};
|
|
4908
|
+
};
|
|
4909
|
+
MessageListComponent.prototype.getMessageContext = function (message) {
|
|
4910
|
+
return {
|
|
4911
|
+
message: message,
|
|
4912
|
+
isLastSentMessage: !!(this.lastSentMessageId && (message === null || message === void 0 ? void 0 : message.id) === this.lastSentMessageId),
|
|
4913
|
+
enabledMessageActions: this.enabledMessageActions,
|
|
4914
|
+
mode: this.mode,
|
|
4915
|
+
};
|
|
4916
|
+
};
|
|
4662
4917
|
MessageListComponent.prototype.preserveScrollbarPosition = function () {
|
|
4663
4918
|
this.scrollContainer.nativeElement.scrollTop =
|
|
4664
4919
|
(this.prevScrollTop || 0) +
|
|
4665
4920
|
(this.scrollContainer.nativeElement.scrollHeight - this.containerHeight);
|
|
4666
4921
|
};
|
|
4667
|
-
MessageListComponent.prototype.setEnabledActions = function () {
|
|
4668
|
-
var _this = this;
|
|
4669
|
-
this.enabledMessageActions = [];
|
|
4670
|
-
if (!this.enabledMessageActionsInput) {
|
|
4671
|
-
this.enabledMessageActions = this.authorizedMessageActions;
|
|
4672
|
-
return;
|
|
4673
|
-
}
|
|
4674
|
-
this.enabledMessageActionsInput = __spreadArray(__spreadArray([], __read(this.enabledMessageActionsInput)), [
|
|
4675
|
-
'send-reaction',
|
|
4676
|
-
'read-events',
|
|
4677
|
-
'send-reply',
|
|
4678
|
-
'quote-message',
|
|
4679
|
-
]);
|
|
4680
|
-
this.enabledMessageActionsInput.forEach(function (action) {
|
|
4681
|
-
var isAuthorized = _this.authorizedMessageActions.indexOf(action) !== -1;
|
|
4682
|
-
if (isAuthorized) {
|
|
4683
|
-
_this.enabledMessageActions.push(action);
|
|
4684
|
-
}
|
|
4685
|
-
});
|
|
4686
|
-
};
|
|
4687
4922
|
MessageListComponent.prototype.setMessages$ = function () {
|
|
4688
4923
|
var _this = this;
|
|
4689
4924
|
this.messages$ = (this.mode === 'main'
|
|
@@ -4736,10 +4971,19 @@
|
|
|
4736
4971
|
this.prevScrollTop = undefined;
|
|
4737
4972
|
this.isNewMessageSentByUser = undefined;
|
|
4738
4973
|
};
|
|
4974
|
+
Object.defineProperty(MessageListComponent.prototype, "usersTyping$", {
|
|
4975
|
+
get: function () {
|
|
4976
|
+
return this.mode === 'thread'
|
|
4977
|
+
? this.usersTypingInThread$
|
|
4978
|
+
: this.usersTypingInChannel$;
|
|
4979
|
+
},
|
|
4980
|
+
enumerable: false,
|
|
4981
|
+
configurable: true
|
|
4982
|
+
});
|
|
4739
4983
|
return MessageListComponent;
|
|
4740
4984
|
}());
|
|
4741
|
-
MessageListComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageListComponent, deps: [{ token: ChannelService }, { token: ChatClientService }, { token: ImageLoadService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
4742
|
-
MessageListComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageListComponent, selector: "stream-message-list", inputs: {
|
|
4985
|
+
MessageListComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageListComponent, deps: [{ token: ChannelService }, { token: ChatClientService }, { token: ImageLoadService }, { token: CustomTemplatesService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
4986
|
+
MessageListComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageListComponent, selector: "stream-message-list", inputs: { mode: "mode" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "parentMessageElement", first: true, predicate: ["parentMessageElement"], descendants: true }], usesOnChanges: true, ngImport: i0__namespace, template: "<div\n #scrollContainer\n data-testid=\"scroll-container\"\n class=\"str-chat__list\"\n (scroll)=\"scrolled()\"\n>\n <div class=\"str-chat__reverse-infinite-scroll\">\n <ul class=\"str-chat__ul\">\n <li\n #parentMessageElement\n *ngIf=\"mode === 'thread'\"\n data-testid=\"parent-message\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: parentMessage }\n \"\n ></ng-container>\n <div class=\"str-chat__thread-start\" translate>\n streamChat.Start of a new thread\n </div>\n </li>\n <li\n data-testclass=\"message\"\n *ngFor=\"\n let message of messages$ | async;\n let i = index;\n trackBy: trackByMessageId\n \"\n class=\"str-chat__li str-chat__li--{{ groupStyles[i] }}\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: message }\n \"\n ></ng-container>\n </li>\n </ul>\n <ng-template #defaultTypingIndicator let-usersTyping$=\"usersTyping$\">\n <div\n *ngIf=\"$any(usersTyping$ | async)?.length\"\n data-testid=\"typing-indicator\"\n class=\"str-chat__typing-indicator str-chat__typing-indicator--typing\"\n >\n <stream-avatar-placeholder\n *ngFor=\"let user of usersTyping$ | async; trackBy: trackByUserId\"\n [name]=\"user.name || user.id\"\n [imageUrl]=\"user.image\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__typing-indicator__dots\">\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n </div>\n </div>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n typingIndicatorTemplate || defaultTypingIndicator;\n context: getTypingIndicatorContext()\n \"\n ></ng-container>\n </div>\n</div>\n<div class=\"str-chat__list-notifications\">\n <button\n data-testid=\"scroll-to-bottom\"\n *ngIf=\"isUserScrolledUp\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-right\n str-chat__message-notification-scroll-down\n \"\n (keyup.enter)=\"scrollToBottom()\"\n (click)=\"scrollToBottom()\"\n >\n <div\n *ngIf=\"unreadMessageCount > 0\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-scroll-down-unread-count\n \"\n >\n {{ unreadMessageCount }}\n </div>\n </button>\n</div>\n\n<ng-template #messageTemplateContainer let-message=\"message\">\n <ng-template\n #defaultMessageTemplate\n let-messageInput=\"message\"\n let-isLastSentMessage=\"isLastSentMessage\"\n let-enabledMessageActions=\"enabledMessageActions\"\n let-mode=\"mode\"\n >\n <stream-message\n [message]=\"messageInput\"\n [isLastSentMessage]=\"isLastSentMessage\"\n [enabledMessageActions]=\"enabledMessageActions\"\n [mode]=\"mode\"\n ></stream-message>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplate || defaultMessageTemplate;\n context: getMessageContext(message)\n \"\n ></ng-container>\n</ng-template>\n", components: [{ type: AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size"] }, { type: MessageComponent, selector: "stream-message", inputs: ["message", "enabledMessageActions", "isLastSentMessage", "mode"] }], directives: [{ type: i3__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2__namespace.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i3__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i3__namespace.AsyncPipe } });
|
|
4743
4987
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageListComponent, decorators: [{
|
|
4744
4988
|
type: i0.Component,
|
|
4745
4989
|
args: [{
|
|
@@ -4747,20 +4991,7 @@
|
|
|
4747
4991
|
templateUrl: './message-list.component.html',
|
|
4748
4992
|
styles: [],
|
|
4749
4993
|
}]
|
|
4750
|
-
}], ctorParameters: function () { return [{ type: ChannelService }, { type: ChatClientService }, { type: ImageLoadService }]; }, propDecorators: {
|
|
4751
|
-
type: i0.Input
|
|
4752
|
-
}], messageInputTemplate: [{
|
|
4753
|
-
type: i0.Input
|
|
4754
|
-
}], mentionTemplate: [{
|
|
4755
|
-
type: i0.Input
|
|
4756
|
-
}], typingIndicatorTemplate: [{
|
|
4757
|
-
type: i0.Input
|
|
4758
|
-
}], areReactionsEnabled: [{
|
|
4759
|
-
type: i0.Input
|
|
4760
|
-
}], enabledMessageActionsInput: [{
|
|
4761
|
-
type: i0.Input,
|
|
4762
|
-
args: ['enabledMessageActions']
|
|
4763
|
-
}], mode: [{
|
|
4994
|
+
}], ctorParameters: function () { return [{ type: ChannelService }, { type: ChatClientService }, { type: ImageLoadService }, { type: CustomTemplatesService }]; }, propDecorators: { mode: [{
|
|
4764
4995
|
type: i0.Input
|
|
4765
4996
|
}], class: [{
|
|
4766
4997
|
type: i0.HostBinding,
|
|
@@ -4777,8 +5008,9 @@
|
|
|
4777
5008
|
* The `Thread` component represents a [message thread](https://getstream.io/chat/docs/javascript/threads/?language=javascript), it is a container component that displays a thread with a header, [`MessageList`](./MessageListComponent.mdx) and [`MessageInput`](./MessageInputComponent.mdx) components.
|
|
4778
5009
|
*/
|
|
4779
5010
|
var ThreadComponent = /** @class */ (function () {
|
|
4780
|
-
function ThreadComponent(channelService) {
|
|
5011
|
+
function ThreadComponent(customTemplatesService, channelService) {
|
|
4781
5012
|
var _this = this;
|
|
5013
|
+
this.customTemplatesService = customTemplatesService;
|
|
4782
5014
|
this.channelService = channelService;
|
|
4783
5015
|
this.class = 'str-chat__thread';
|
|
4784
5016
|
this.subscriptions = [];
|
|
@@ -4787,21 +5019,23 @@
|
|
|
4787
5019
|
ThreadComponent.prototype.ngOnDestroy = function () {
|
|
4788
5020
|
this.subscriptions.forEach(function (s) { return s.unsubscribe(); });
|
|
4789
5021
|
};
|
|
4790
|
-
|
|
4791
|
-
|
|
4792
|
-
|
|
4793
|
-
|
|
4794
|
-
|
|
4795
|
-
|
|
4796
|
-
|
|
4797
|
-
|
|
5022
|
+
ThreadComponent.prototype.getThreadHeaderContext = function () {
|
|
5023
|
+
var _this = this;
|
|
5024
|
+
return {
|
|
5025
|
+
parentMessage: this.parentMessage,
|
|
5026
|
+
closeThreadHandler: function () { return _this.closeThread(); },
|
|
5027
|
+
};
|
|
5028
|
+
};
|
|
5029
|
+
ThreadComponent.prototype.getReplyCountParam = function (parentMessage) {
|
|
5030
|
+
return { replyCount: parentMessage === null || parentMessage === void 0 ? void 0 : parentMessage.reply_count };
|
|
5031
|
+
};
|
|
4798
5032
|
ThreadComponent.prototype.closeThread = function () {
|
|
4799
5033
|
void this.channelService.setAsActiveParentMessage(undefined);
|
|
4800
5034
|
};
|
|
4801
5035
|
return ThreadComponent;
|
|
4802
5036
|
}());
|
|
4803
|
-
ThreadComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ThreadComponent, deps: [{ token: ChannelService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
4804
|
-
ThreadComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ThreadComponent, selector: "stream-thread", host: { properties: { "class": "this.class" } }, ngImport: i0__namespace, template: "<div class=\"str-chat__thread-header\">\n
|
|
5037
|
+
ThreadComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ThreadComponent, deps: [{ token: CustomTemplatesService }, { token: ChannelService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
|
5038
|
+
ThreadComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ThreadComponent, selector: "stream-thread", host: { properties: { "class": "this.class" } }, ngImport: i0__namespace, template: "<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.threadHeaderTemplate$ | async) ||\n defaultThreadHeader;\n context: getThreadHeaderContext()\n \"\n></ng-container>\n<ng-content select='[name=\"thread-message-list\"]'></ng-content>\n<div class=\"str-chat__small-message-input__wrapper\">\n <ng-content select='[name=\"thread-message-input\"]'></ng-content>\n</div>\n\n<ng-template\n #defaultThreadHeader\n let-parentMessage=\"parentMessage\"\n let-closeThreadHandler=\"closeThreadHandler\"\n>\n <div class=\"str-chat__thread-header\">\n <div class=\"str-chat__thread-header-details\">\n <strong translate>streamChat.Thread</strong>\n <small data-testid=\"reply-count\">\n {{parentMessage?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:getReplyCountParam(parentMessage))}}\n </small>\n </div>\n <button\n class=\"str-chat__square-button\"\n data-testid=\"close-button\"\n (click)=\"closeThreadHandler()\"\n >\n <stream-icon-placeholder\n icon=\"close-no-outline\"\n ></stream-icon-placeholder>\n </button>\n </div>\n</ng-template>\n", components: [{ type: IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }], directives: [{ type: i3__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2__namespace.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "async": i3__namespace.AsyncPipe, "translate": i2__namespace.TranslatePipe } });
|
|
4805
5039
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ThreadComponent, decorators: [{
|
|
4806
5040
|
type: i0.Component,
|
|
4807
5041
|
args: [{
|
|
@@ -4809,7 +5043,7 @@
|
|
|
4809
5043
|
templateUrl: './thread.component.html',
|
|
4810
5044
|
styles: [],
|
|
4811
5045
|
}]
|
|
4812
|
-
}], ctorParameters: function () { return [{ type: ChannelService }]; }, propDecorators: { class: [{
|
|
5046
|
+
}], ctorParameters: function () { return [{ type: CustomTemplatesService }, { type: ChannelService }]; }, propDecorators: { class: [{
|
|
4813
5047
|
type: i0.HostBinding,
|
|
4814
5048
|
args: ['class']
|
|
4815
5049
|
}] } });
|
|
@@ -4820,14 +5054,14 @@
|
|
|
4820
5054
|
return StreamAvatarModule;
|
|
4821
5055
|
}());
|
|
4822
5056
|
StreamAvatarModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamAvatarModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule });
|
|
4823
|
-
StreamAvatarModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamAvatarModule, declarations: [AvatarComponent], imports: [
|
|
4824
|
-
StreamAvatarModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamAvatarModule, imports: [[
|
|
5057
|
+
StreamAvatarModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamAvatarModule, declarations: [AvatarComponent, AvatarPlaceholderComponent], imports: [i3.CommonModule, i2.TranslateModule], exports: [AvatarComponent, AvatarPlaceholderComponent] });
|
|
5058
|
+
StreamAvatarModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamAvatarModule, imports: [[i3.CommonModule, i2.TranslateModule]] });
|
|
4825
5059
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamAvatarModule, decorators: [{
|
|
4826
5060
|
type: i0.NgModule,
|
|
4827
5061
|
args: [{
|
|
4828
|
-
declarations: [AvatarComponent],
|
|
4829
|
-
imports: [
|
|
4830
|
-
exports: [AvatarComponent],
|
|
5062
|
+
declarations: [AvatarComponent, AvatarPlaceholderComponent],
|
|
5063
|
+
imports: [i3.CommonModule, i2.TranslateModule],
|
|
5064
|
+
exports: [AvatarComponent, AvatarPlaceholderComponent],
|
|
4831
5065
|
}]
|
|
4832
5066
|
}] });
|
|
4833
5067
|
|
|
@@ -4854,7 +5088,9 @@
|
|
|
4854
5088
|
AttachmentPreviewListComponent,
|
|
4855
5089
|
ModalComponent,
|
|
4856
5090
|
TextareaDirective,
|
|
4857
|
-
ThreadComponent
|
|
5091
|
+
ThreadComponent,
|
|
5092
|
+
IconPlaceholderComponent,
|
|
5093
|
+
LoadingIndicatorPlaceholderComponent], imports: [i3.CommonModule, i2.TranslateModule, StreamAvatarModule], exports: [ChannelComponent,
|
|
4858
5094
|
ChannelHeaderComponent,
|
|
4859
5095
|
ChannelListComponent,
|
|
4860
5096
|
ChannelPreviewComponent,
|
|
@@ -4871,8 +5107,10 @@
|
|
|
4871
5107
|
AttachmentPreviewListComponent,
|
|
4872
5108
|
ModalComponent,
|
|
4873
5109
|
StreamAvatarModule,
|
|
4874
|
-
ThreadComponent
|
|
4875
|
-
|
|
5110
|
+
ThreadComponent,
|
|
5111
|
+
IconPlaceholderComponent,
|
|
5112
|
+
LoadingIndicatorPlaceholderComponent] });
|
|
5113
|
+
StreamChatModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamChatModule, imports: [[i3.CommonModule, i2.TranslateModule, StreamAvatarModule], StreamAvatarModule] });
|
|
4876
5114
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamChatModule, decorators: [{
|
|
4877
5115
|
type: i0.NgModule,
|
|
4878
5116
|
args: [{
|
|
@@ -4895,8 +5133,10 @@
|
|
|
4895
5133
|
ModalComponent,
|
|
4896
5134
|
TextareaDirective,
|
|
4897
5135
|
ThreadComponent,
|
|
5136
|
+
IconPlaceholderComponent,
|
|
5137
|
+
LoadingIndicatorPlaceholderComponent,
|
|
4898
5138
|
],
|
|
4899
|
-
imports: [
|
|
5139
|
+
imports: [i3.CommonModule, i2.TranslateModule, StreamAvatarModule],
|
|
4900
5140
|
exports: [
|
|
4901
5141
|
ChannelComponent,
|
|
4902
5142
|
ChannelHeaderComponent,
|
|
@@ -4916,6 +5156,8 @@
|
|
|
4916
5156
|
ModalComponent,
|
|
4917
5157
|
StreamAvatarModule,
|
|
4918
5158
|
ThreadComponent,
|
|
5159
|
+
IconPlaceholderComponent,
|
|
5160
|
+
LoadingIndicatorPlaceholderComponent,
|
|
4919
5161
|
],
|
|
4920
5162
|
}]
|
|
4921
5163
|
}] });
|
|
@@ -4926,18 +5168,18 @@
|
|
|
4926
5168
|
return StreamAutocompleteTextareaModule;
|
|
4927
5169
|
}());
|
|
4928
5170
|
StreamAutocompleteTextareaModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamAutocompleteTextareaModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule });
|
|
4929
|
-
StreamAutocompleteTextareaModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamAutocompleteTextareaModule, declarations: [AutocompleteTextareaComponent], imports: [
|
|
5171
|
+
StreamAutocompleteTextareaModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamAutocompleteTextareaModule, declarations: [AutocompleteTextareaComponent], imports: [i3.CommonModule, i2.TranslateModule, i7.MentionModule, StreamAvatarModule], exports: [AutocompleteTextareaComponent] });
|
|
4930
5172
|
StreamAutocompleteTextareaModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamAutocompleteTextareaModule, providers: [
|
|
4931
5173
|
{
|
|
4932
5174
|
provide: textareaInjectionToken,
|
|
4933
5175
|
useValue: AutocompleteTextareaComponent,
|
|
4934
5176
|
},
|
|
4935
|
-
], imports: [[
|
|
5177
|
+
], imports: [[i3.CommonModule, i2.TranslateModule, i7.MentionModule, StreamAvatarModule]] });
|
|
4936
5178
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamAutocompleteTextareaModule, decorators: [{
|
|
4937
5179
|
type: i0.NgModule,
|
|
4938
5180
|
args: [{
|
|
4939
5181
|
declarations: [AutocompleteTextareaComponent],
|
|
4940
|
-
imports: [
|
|
5182
|
+
imports: [i3.CommonModule, i2.TranslateModule, i7.MentionModule, StreamAvatarModule],
|
|
4941
5183
|
exports: [AutocompleteTextareaComponent],
|
|
4942
5184
|
providers: [
|
|
4943
5185
|
{
|
|
@@ -4954,18 +5196,18 @@
|
|
|
4954
5196
|
return StreamTextareaModule;
|
|
4955
5197
|
}());
|
|
4956
5198
|
StreamTextareaModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamTextareaModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule });
|
|
4957
|
-
StreamTextareaModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamTextareaModule, declarations: [TextareaComponent], imports: [
|
|
5199
|
+
StreamTextareaModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamTextareaModule, declarations: [TextareaComponent], imports: [i3.CommonModule, i2.TranslateModule], exports: [TextareaComponent] });
|
|
4958
5200
|
StreamTextareaModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamTextareaModule, providers: [
|
|
4959
5201
|
{
|
|
4960
5202
|
provide: textareaInjectionToken,
|
|
4961
5203
|
useValue: TextareaComponent,
|
|
4962
5204
|
},
|
|
4963
|
-
], imports: [[
|
|
5205
|
+
], imports: [[i3.CommonModule, i2.TranslateModule]] });
|
|
4964
5206
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StreamTextareaModule, decorators: [{
|
|
4965
5207
|
type: i0.NgModule,
|
|
4966
5208
|
args: [{
|
|
4967
5209
|
declarations: [TextareaComponent],
|
|
4968
|
-
imports: [
|
|
5210
|
+
imports: [i3.CommonModule, i2.TranslateModule],
|
|
4969
5211
|
exports: [TextareaComponent],
|
|
4970
5212
|
providers: [
|
|
4971
5213
|
{
|
|
@@ -4989,6 +5231,7 @@
|
|
|
4989
5231
|
exports.AttachmentService = AttachmentService;
|
|
4990
5232
|
exports.AutocompleteTextareaComponent = AutocompleteTextareaComponent;
|
|
4991
5233
|
exports.AvatarComponent = AvatarComponent;
|
|
5234
|
+
exports.AvatarPlaceholderComponent = AvatarPlaceholderComponent;
|
|
4992
5235
|
exports.ChannelComponent = ChannelComponent;
|
|
4993
5236
|
exports.ChannelHeaderComponent = ChannelHeaderComponent;
|
|
4994
5237
|
exports.ChannelListComponent = ChannelListComponent;
|
|
@@ -4996,10 +5239,13 @@
|
|
|
4996
5239
|
exports.ChannelPreviewComponent = ChannelPreviewComponent;
|
|
4997
5240
|
exports.ChannelService = ChannelService;
|
|
4998
5241
|
exports.ChatClientService = ChatClientService;
|
|
5242
|
+
exports.CustomTemplatesService = CustomTemplatesService;
|
|
4999
5243
|
exports.EmojiInputService = EmojiInputService;
|
|
5000
5244
|
exports.IconComponent = IconComponent;
|
|
5245
|
+
exports.IconPlaceholderComponent = IconPlaceholderComponent;
|
|
5001
5246
|
exports.ImageLoadService = ImageLoadService;
|
|
5002
5247
|
exports.LoadingIndicatorComponent = LoadingIndicatorComponent;
|
|
5248
|
+
exports.LoadingIndicatorPlaceholderComponent = LoadingIndicatorPlaceholderComponent;
|
|
5003
5249
|
exports.MessageActionsBoxComponent = MessageActionsBoxComponent;
|
|
5004
5250
|
exports.MessageComponent = MessageComponent;
|
|
5005
5251
|
exports.MessageInputComponent = MessageInputComponent;
|