stream-chat-angular 2.17.0 → 2.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/version.d.ts +1 -1
- package/bundles/stream-chat-angular.umd.js +282 -230
- 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 +40 -4
- package/esm2015/lib/channel-header/channel-header.component.js +10 -6
- package/esm2015/lib/channel.service.js +71 -59
- package/esm2015/lib/chat-client.service.js +26 -2
- package/esm2015/lib/icon/icon.component.js +2 -2
- package/esm2015/lib/notification/notification.component.js +1 -1
- package/esm2015/lib/notification-list/notification-list.component.js +7 -4
- package/esm2015/lib/notification.service.js +34 -18
- package/esm2015/lib/types.js +1 -1
- package/fesm2015/stream-chat-angular.js +245 -154
- package/fesm2015/stream-chat-angular.js.map +1 -1
- package/lib/attachment-list/attachment-list.component.d.ts +10 -0
- package/lib/channel-header/channel-header.component.d.ts +8 -1
- package/lib/channel.service.d.ts +13 -13
- package/lib/chat-client.service.d.ts +7 -1
- package/lib/icon/icon.component.d.ts +1 -1
- package/lib/notification/notification.component.d.ts +1 -1
- package/lib/notification-list/notification-list.component.d.ts +6 -2
- package/lib/notification.service.d.ts +14 -13
- package/lib/types.d.ts +13 -5
- package/package.json +2 -2
- package/src/assets/version.ts +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __awaiter } from 'tslib';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { Injectable, Component, Input, InjectionToken, EventEmitter, Directive, Output,
|
|
3
|
+
import { Injectable, Component, Input, InjectionToken, EventEmitter, Directive, Output, ViewChild, Inject, HostBinding, NgModule } from '@angular/core';
|
|
4
4
|
import { BehaviorSubject, ReplaySubject, combineLatest, Subject, timer, of } from 'rxjs';
|
|
5
5
|
import { StreamChat } from 'stream-chat';
|
|
6
6
|
import { map, shareReplay, filter, first, take, tap, catchError, startWith, distinctUntilChanged, debounceTime } from 'rxjs/operators';
|
|
@@ -17,7 +17,7 @@ import transliterate from '@stream-io/transliterate';
|
|
|
17
17
|
import * as i6$1 from 'angular-mentions';
|
|
18
18
|
import { MentionModule } from 'angular-mentions';
|
|
19
19
|
|
|
20
|
-
const version = '2.
|
|
20
|
+
const version = '2.20.0';
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* The `NotificationService` can be used to add or remove notifications. By default the [`NotificationList`](../components/NotificationListComponent.mdx) component displays the currently active notifications.
|
|
@@ -29,40 +29,56 @@ class NotificationService {
|
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Displays a notification for the given amount of time.
|
|
32
|
-
* @param
|
|
32
|
+
* @param content The text of the notification or the HTML template for the notification
|
|
33
33
|
* @param type The type of the notification
|
|
34
34
|
* @param timeout The number of milliseconds while the notification should be visible
|
|
35
|
-
* @param translateParams Translation parameters for the `text
|
|
35
|
+
* @param translateParams Translation parameters for the `content` (for text notifications)
|
|
36
|
+
* @param templateContext The input of the notification template (for HTML notifications)
|
|
36
37
|
* @returns A method to clear the notification (before the timeout).
|
|
37
38
|
*/
|
|
38
|
-
addTemporaryNotification(
|
|
39
|
-
this.
|
|
40
|
-
const id = setTimeout(() => this.removeNotification(
|
|
41
|
-
|
|
39
|
+
addTemporaryNotification(content, type = 'error', timeout = 5000, translateParams, templateContext) {
|
|
40
|
+
const notification = this.createNotification(content, type, translateParams, templateContext);
|
|
41
|
+
const id = setTimeout(() => this.removeNotification(notification.id), timeout);
|
|
42
|
+
notification.dismissFn = () => {
|
|
42
43
|
clearTimeout(id);
|
|
43
|
-
this.removeNotification(
|
|
44
|
+
this.removeNotification(notification.id);
|
|
44
45
|
};
|
|
46
|
+
this.notificationsSubject.next([
|
|
47
|
+
...this.notificationsSubject.getValue(),
|
|
48
|
+
notification,
|
|
49
|
+
]);
|
|
50
|
+
return notification.dismissFn;
|
|
45
51
|
}
|
|
46
52
|
/**
|
|
47
53
|
* Displays a notification, that will be visible until it's removed.
|
|
48
|
-
* @param
|
|
54
|
+
* @param content The text of the notification or the HTML template for the notification
|
|
49
55
|
* @param type The type of the notification
|
|
50
|
-
* @param translateParams Translation parameters for the `text
|
|
56
|
+
* @param translateParams Translation parameters for the `content` (for text notifications)
|
|
57
|
+
* @param templateContext The input of the notification template (for HTML notifications)
|
|
51
58
|
* @returns A method to clear the notification.
|
|
52
59
|
*/
|
|
53
|
-
addPermanentNotification(
|
|
54
|
-
this.
|
|
55
|
-
return () => this.removeNotification(text);
|
|
56
|
-
}
|
|
57
|
-
addNotification(text, type, translateParams) {
|
|
60
|
+
addPermanentNotification(content, type = 'error', translateParams, templateContext) {
|
|
61
|
+
const notification = this.createNotification(content, type, translateParams, templateContext);
|
|
58
62
|
this.notificationsSubject.next([
|
|
59
63
|
...this.notificationsSubject.getValue(),
|
|
60
|
-
|
|
64
|
+
notification,
|
|
61
65
|
]);
|
|
66
|
+
return notification.dismissFn;
|
|
67
|
+
}
|
|
68
|
+
createNotification(content, type, translateParams, templateContext) {
|
|
69
|
+
const id = new Date().getTime().toString() + Math.random().toString();
|
|
70
|
+
return {
|
|
71
|
+
id,
|
|
72
|
+
[typeof content === 'string' ? 'text' : 'template']: content,
|
|
73
|
+
type,
|
|
74
|
+
translateParams,
|
|
75
|
+
templateContext,
|
|
76
|
+
dismissFn: () => this.removeNotification(id),
|
|
77
|
+
};
|
|
62
78
|
}
|
|
63
|
-
removeNotification(
|
|
79
|
+
removeNotification(id) {
|
|
64
80
|
const notifications = this.notificationsSubject.getValue();
|
|
65
|
-
const index = notifications.findIndex((n) => n.
|
|
81
|
+
const index = notifications.findIndex((n) => n.id === id);
|
|
66
82
|
if (index === -1) {
|
|
67
83
|
return;
|
|
68
84
|
}
|
|
@@ -89,9 +105,11 @@ class ChatClientService {
|
|
|
89
105
|
this.notificationSubject = new ReplaySubject(1);
|
|
90
106
|
this.connectionStateSubject = new ReplaySubject(1);
|
|
91
107
|
this.appSettingsSubject = new BehaviorSubject(undefined);
|
|
108
|
+
this.pendingInvitesSubject = new BehaviorSubject([]);
|
|
92
109
|
this.notification$ = this.notificationSubject.asObservable();
|
|
93
110
|
this.connectionState$ = this.connectionStateSubject.asObservable();
|
|
94
111
|
this.appSettings$ = this.appSettingsSubject.asObservable();
|
|
112
|
+
this.pendingInvites$ = this.pendingInvitesSubject.asObservable();
|
|
95
113
|
}
|
|
96
114
|
/**
|
|
97
115
|
* Creates a [`StreamChat`](https://github.com/GetStream/stream-chat-js/blob/668b3e5521339f4e14fc657834531b4c8bf8176b/src/client.ts#L124) instance using the provided `apiKey`, and connects a user with the given meta data and token. More info about [connecting users](https://getstream.io/chat/docs/javascript/init_and_users/?language=javascript) can be found in the platform documentation.
|
|
@@ -100,16 +118,20 @@ class ChatClientService {
|
|
|
100
118
|
* @param userTokenOrProvider
|
|
101
119
|
*/
|
|
102
120
|
init(apiKey, userOrId, userTokenOrProvider) {
|
|
121
|
+
var _a;
|
|
103
122
|
return __awaiter(this, void 0, void 0, function* () {
|
|
104
123
|
this.chatClient = StreamChat.getInstance(apiKey);
|
|
124
|
+
this.chatClient.devToken;
|
|
105
125
|
yield this.ngZone.runOutsideAngular(() => __awaiter(this, void 0, void 0, function* () {
|
|
106
126
|
const user = typeof userOrId === 'string' ? { id: userOrId } : userOrId;
|
|
107
127
|
yield this.chatClient.connectUser(user, userTokenOrProvider);
|
|
108
128
|
this.chatClient.setUserAgent(`stream-chat-angular-${version}-${this.chatClient.getUserAgent()}`);
|
|
109
|
-
this.chatClient.getAppSettings;
|
|
110
129
|
}));
|
|
130
|
+
const channels = yield this.chatClient.queryChannels({ invite: 'pending' }, {}, { user_id: (_a = this.chatClient.user) === null || _a === void 0 ? void 0 : _a.id });
|
|
131
|
+
this.pendingInvitesSubject.next(channels);
|
|
111
132
|
this.appSettingsSubject.next(undefined);
|
|
112
133
|
this.chatClient.on((e) => {
|
|
134
|
+
this.updatePendingInvites(e);
|
|
113
135
|
this.notificationSubject.next({
|
|
114
136
|
eventType: e.type,
|
|
115
137
|
event: e,
|
|
@@ -138,6 +160,7 @@ class ChatClientService {
|
|
|
138
160
|
*/
|
|
139
161
|
disconnectUser() {
|
|
140
162
|
return __awaiter(this, void 0, void 0, function* () {
|
|
163
|
+
this.pendingInvitesSubject.next([]);
|
|
141
164
|
yield this.chatClient.disconnectUser();
|
|
142
165
|
});
|
|
143
166
|
}
|
|
@@ -182,6 +205,23 @@ class ChatClientService {
|
|
|
182
205
|
return result.users;
|
|
183
206
|
});
|
|
184
207
|
}
|
|
208
|
+
updatePendingInvites(e) {
|
|
209
|
+
var _a, _b, _c;
|
|
210
|
+
if (((_b = (_a = e.member) === null || _a === void 0 ? void 0 : _a.user) === null || _b === void 0 ? void 0 : _b.id) === ((_c = this.chatClient.user) === null || _c === void 0 ? void 0 : _c.id) && e.channel) {
|
|
211
|
+
const pendingInvites = this.pendingInvitesSubject.getValue();
|
|
212
|
+
if (e.type === 'notification.invited') {
|
|
213
|
+
this.pendingInvitesSubject.next([...pendingInvites, e.channel]);
|
|
214
|
+
}
|
|
215
|
+
else if (e.type === 'notification.invite_accepted' ||
|
|
216
|
+
e.type === 'notification.invite_rejected') {
|
|
217
|
+
const index = pendingInvites.findIndex((i) => { var _a; return (i === null || i === void 0 ? void 0 : i.cid) === ((_a = e.channel) === null || _a === void 0 ? void 0 : _a.cid); });
|
|
218
|
+
if (index !== -1) {
|
|
219
|
+
pendingInvites.splice(index, 1);
|
|
220
|
+
this.pendingInvitesSubject.next([...pendingInvites]);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
185
225
|
}
|
|
186
226
|
ChatClientService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChatClientService, deps: [{ token: i0.NgZone }, { token: NotificationService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
187
227
|
ChatClientService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChatClientService, providedIn: 'root' });
|
|
@@ -244,7 +284,14 @@ class ChannelService {
|
|
|
244
284
|
this.usersTypingInChannelSubject = new BehaviorSubject([]);
|
|
245
285
|
this.usersTypingInThreadSubject = new BehaviorSubject([]);
|
|
246
286
|
this.channelListSetter = (channels) => {
|
|
247
|
-
this.channelsSubject.
|
|
287
|
+
const currentChannels = this.channelsSubject.getValue() || [];
|
|
288
|
+
const newChannels = channels.filter((c) => !currentChannels.find((channel) => channel.cid === c.cid));
|
|
289
|
+
const deletedChannels = currentChannels.filter((c) => !(channels === null || channels === void 0 ? void 0 : channels.find((channel) => channel.cid === c.cid)));
|
|
290
|
+
this.addChannelsFromNotification(newChannels);
|
|
291
|
+
this.removeChannelsFromChannelList(deletedChannels.map((c) => c.cid));
|
|
292
|
+
if (!newChannels.length && !deletedChannels.length) {
|
|
293
|
+
this.channelsSubject.next(channels);
|
|
294
|
+
}
|
|
248
295
|
};
|
|
249
296
|
this.messageListSetter = (messages) => {
|
|
250
297
|
this.activeChannelMessagesSubject.next(messages);
|
|
@@ -641,75 +688,80 @@ class ChannelService {
|
|
|
641
688
|
});
|
|
642
689
|
}
|
|
643
690
|
handleNotification(notification) {
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
break;
|
|
656
|
-
}
|
|
657
|
-
case 'notification.added_to_channel': {
|
|
658
|
-
yield this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
|
|
659
|
-
if (this.customAddedToChannelNotificationHandler) {
|
|
660
|
-
this.customAddedToChannelNotificationHandler(notification, this.channelListSetter);
|
|
661
|
-
}
|
|
662
|
-
else {
|
|
663
|
-
yield this.handleAddedToChannelNotification(notification);
|
|
664
|
-
}
|
|
665
|
-
}));
|
|
666
|
-
break;
|
|
667
|
-
}
|
|
668
|
-
case 'notification.removed_from_channel': {
|
|
669
|
-
this.ngZone.run(() => {
|
|
670
|
-
if (this.customRemovedFromChannelNotificationHandler) {
|
|
671
|
-
this.customRemovedFromChannelNotificationHandler(notification, this.channelListSetter);
|
|
672
|
-
}
|
|
673
|
-
else {
|
|
674
|
-
this.handleRemovedFromChannelNotification(notification);
|
|
675
|
-
}
|
|
676
|
-
});
|
|
677
|
-
}
|
|
691
|
+
switch (notification.eventType) {
|
|
692
|
+
case 'notification.message_new': {
|
|
693
|
+
this.ngZone.run(() => {
|
|
694
|
+
if (this.customNewMessageNotificationHandler) {
|
|
695
|
+
this.customNewMessageNotificationHandler(notification, this.channelListSetter);
|
|
696
|
+
}
|
|
697
|
+
else {
|
|
698
|
+
this.handleNewMessageNotification(notification);
|
|
699
|
+
}
|
|
700
|
+
});
|
|
701
|
+
break;
|
|
678
702
|
}
|
|
679
|
-
|
|
703
|
+
case 'notification.added_to_channel': {
|
|
704
|
+
this.ngZone.run(() => {
|
|
705
|
+
if (this.customAddedToChannelNotificationHandler) {
|
|
706
|
+
this.customAddedToChannelNotificationHandler(notification, this.channelListSetter);
|
|
707
|
+
}
|
|
708
|
+
else {
|
|
709
|
+
this.handleAddedToChannelNotification(notification);
|
|
710
|
+
}
|
|
711
|
+
});
|
|
712
|
+
break;
|
|
713
|
+
}
|
|
714
|
+
case 'notification.removed_from_channel': {
|
|
715
|
+
this.ngZone.run(() => {
|
|
716
|
+
if (this.customRemovedFromChannelNotificationHandler) {
|
|
717
|
+
this.customRemovedFromChannelNotificationHandler(notification, this.channelListSetter);
|
|
718
|
+
}
|
|
719
|
+
else {
|
|
720
|
+
this.handleRemovedFromChannelNotification(notification);
|
|
721
|
+
}
|
|
722
|
+
});
|
|
723
|
+
}
|
|
724
|
+
}
|
|
680
725
|
}
|
|
681
726
|
handleRemovedFromChannelNotification(notification) {
|
|
682
727
|
const channelIdToBeRemoved = notification.event.channel.cid;
|
|
683
|
-
this.
|
|
728
|
+
this.removeChannelsFromChannelList([channelIdToBeRemoved]);
|
|
684
729
|
}
|
|
685
730
|
handleNewMessageNotification(notification) {
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
}
|
|
731
|
+
if (notification.event.channel) {
|
|
732
|
+
this.addChannelsFromNotification([notification.event.channel]);
|
|
733
|
+
}
|
|
689
734
|
}
|
|
690
735
|
handleAddedToChannelNotification(notification) {
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
}
|
|
736
|
+
if (notification.event.channel) {
|
|
737
|
+
this.addChannelsFromNotification([notification.event.channel]);
|
|
738
|
+
}
|
|
694
739
|
}
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
const channel = this.chatClientService.chatClient.channel(
|
|
699
|
-
|
|
740
|
+
addChannelsFromNotification(channelResponses) {
|
|
741
|
+
const newChannels = [];
|
|
742
|
+
channelResponses.forEach((channelResponse) => {
|
|
743
|
+
const channel = this.chatClientService.chatClient.channel(channelResponse.type, channelResponse.id);
|
|
744
|
+
void channel.watch();
|
|
700
745
|
this.watchForChannelEvents(channel);
|
|
701
|
-
|
|
702
|
-
channel,
|
|
703
|
-
...(this.channelsSubject.getValue() || []),
|
|
704
|
-
]);
|
|
746
|
+
newChannels.push(channel);
|
|
705
747
|
});
|
|
748
|
+
this.channelsSubject.next([
|
|
749
|
+
...newChannels,
|
|
750
|
+
...(this.channelsSubject.getValue() || []),
|
|
751
|
+
]);
|
|
706
752
|
}
|
|
707
|
-
|
|
708
|
-
|
|
753
|
+
removeChannelsFromChannelList(cids) {
|
|
754
|
+
var _a;
|
|
755
|
+
const channels = this.channels.filter((c) => !cids.includes(c.cid || ''));
|
|
709
756
|
if (channels.length < this.channels.length) {
|
|
710
757
|
this.channelsSubject.next(channels);
|
|
711
|
-
if (this.activeChannelSubject.getValue()
|
|
712
|
-
|
|
758
|
+
if (cids.includes(((_a = this.activeChannelSubject.getValue()) === null || _a === void 0 ? void 0 : _a.cid) || '')) {
|
|
759
|
+
if (channels.length > 0) {
|
|
760
|
+
this.setAsActiveChannel(channels[0]);
|
|
761
|
+
}
|
|
762
|
+
else {
|
|
763
|
+
this.activeChannelSubject.next(undefined);
|
|
764
|
+
}
|
|
713
765
|
}
|
|
714
766
|
}
|
|
715
767
|
}
|
|
@@ -927,10 +979,10 @@ class ChannelService {
|
|
|
927
979
|
this.channelsSubject.next([channel, ...this.channels]);
|
|
928
980
|
}
|
|
929
981
|
handleChannelHidden(event) {
|
|
930
|
-
this.
|
|
982
|
+
this.removeChannelsFromChannelList([event.channel.cid]);
|
|
931
983
|
}
|
|
932
984
|
handleChannelDeleted(event) {
|
|
933
|
-
this.
|
|
985
|
+
this.removeChannelsFromChannelList([event.channel.cid]);
|
|
934
986
|
}
|
|
935
987
|
handleChannelVisible(event, channel) {
|
|
936
988
|
if (!this.channels.find((c) => c.cid === event.cid)) {
|
|
@@ -1546,7 +1598,7 @@ class IconComponent {
|
|
|
1546
1598
|
constructor() { }
|
|
1547
1599
|
}
|
|
1548
1600
|
IconComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1549
|
-
IconComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: IconComponent, selector: "stream-icon", inputs: { icon: "icon", size: "size" }, ngImport: i0, 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", directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] });
|
|
1601
|
+
IconComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: IconComponent, selector: "stream-icon", inputs: { icon: "icon", size: "size" }, ngImport: i0, 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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] });
|
|
1550
1602
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: IconComponent, decorators: [{
|
|
1551
1603
|
type: Component,
|
|
1552
1604
|
args: [{
|
|
@@ -1748,6 +1800,74 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
|
|
|
1748
1800
|
}]
|
|
1749
1801
|
}], ctorParameters: function () { return []; } });
|
|
1750
1802
|
|
|
1803
|
+
/**
|
|
1804
|
+
* 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.
|
|
1805
|
+
*/
|
|
1806
|
+
class ModalComponent {
|
|
1807
|
+
constructor() {
|
|
1808
|
+
/**
|
|
1809
|
+
* If `true` the modal will be displayed, if `false` the modal will be hidden
|
|
1810
|
+
*/
|
|
1811
|
+
this.isOpen = false;
|
|
1812
|
+
/**
|
|
1813
|
+
* Emits `true` if the modal becomes visible, and `false` if the modal is closed.
|
|
1814
|
+
*/
|
|
1815
|
+
this.isOpenChange = new EventEmitter();
|
|
1816
|
+
this.watchForEscPress = (event) => {
|
|
1817
|
+
if (event.key === 'Escape') {
|
|
1818
|
+
this.close();
|
|
1819
|
+
}
|
|
1820
|
+
};
|
|
1821
|
+
this.stopWatchForEscPress = () => {
|
|
1822
|
+
window.removeEventListener('keyup', this.watchForEscPress);
|
|
1823
|
+
};
|
|
1824
|
+
this.watchForOutsideClicks = (event) => {
|
|
1825
|
+
var _a;
|
|
1826
|
+
if (!((_a = this.content) === null || _a === void 0 ? void 0 : _a.nativeElement.contains(event.target))) {
|
|
1827
|
+
this.close();
|
|
1828
|
+
}
|
|
1829
|
+
};
|
|
1830
|
+
}
|
|
1831
|
+
ngOnChanges(changes) {
|
|
1832
|
+
if (changes.isOpen) {
|
|
1833
|
+
if (this.isOpen) {
|
|
1834
|
+
window.addEventListener('keyup', this.watchForEscPress);
|
|
1835
|
+
setTimeout(() => window.addEventListener('click', this.watchForOutsideClicks), 0);
|
|
1836
|
+
}
|
|
1837
|
+
else {
|
|
1838
|
+
this.stopWatchForOutsideClicks();
|
|
1839
|
+
this.stopWatchForEscPress();
|
|
1840
|
+
}
|
|
1841
|
+
}
|
|
1842
|
+
}
|
|
1843
|
+
close() {
|
|
1844
|
+
this.isOpen = false;
|
|
1845
|
+
this.isOpenChange.emit(false);
|
|
1846
|
+
this.stopWatchForOutsideClicks();
|
|
1847
|
+
this.stopWatchForEscPress();
|
|
1848
|
+
}
|
|
1849
|
+
stopWatchForOutsideClicks() {
|
|
1850
|
+
window.removeEventListener('click', this.watchForOutsideClicks);
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1853
|
+
ModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1854
|
+
ModalComponent.ɵcmp = i0.ɵɵ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, 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.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] });
|
|
1855
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ModalComponent, decorators: [{
|
|
1856
|
+
type: Component,
|
|
1857
|
+
args: [{
|
|
1858
|
+
selector: 'stream-modal',
|
|
1859
|
+
templateUrl: './modal.component.html',
|
|
1860
|
+
styles: [],
|
|
1861
|
+
}]
|
|
1862
|
+
}], ctorParameters: function () { return []; }, propDecorators: { isOpen: [{
|
|
1863
|
+
type: Input
|
|
1864
|
+
}], isOpenChange: [{
|
|
1865
|
+
type: Output
|
|
1866
|
+
}], content: [{
|
|
1867
|
+
type: ViewChild,
|
|
1868
|
+
args: ['content']
|
|
1869
|
+
}] } });
|
|
1870
|
+
|
|
1751
1871
|
/**
|
|
1752
1872
|
* The `AttachmentList` compontent displays the attachments of a message
|
|
1753
1873
|
*/
|
|
@@ -1760,10 +1880,14 @@ class AttachmentListComponent {
|
|
|
1760
1880
|
*/
|
|
1761
1881
|
this.attachments = [];
|
|
1762
1882
|
this.orderedAttachments = [];
|
|
1883
|
+
this.imagesToView = [];
|
|
1884
|
+
this.imagesToViewCurrentIndex = 0;
|
|
1763
1885
|
}
|
|
1764
1886
|
ngOnChanges() {
|
|
1887
|
+
const images = this.attachments.filter(this.isImage);
|
|
1888
|
+
const containsGallery = images.length >= 2;
|
|
1765
1889
|
this.orderedAttachments = [
|
|
1766
|
-
...
|
|
1890
|
+
...(containsGallery ? this.createGallery(images) : images),
|
|
1767
1891
|
...this.attachments.filter((a) => this.isFile(a)),
|
|
1768
1892
|
...this.attachments.filter((a) => this.isCard(a)),
|
|
1769
1893
|
];
|
|
@@ -1777,6 +1901,9 @@ class AttachmentListComponent {
|
|
|
1777
1901
|
isFile(attachment) {
|
|
1778
1902
|
return attachment.type === 'file';
|
|
1779
1903
|
}
|
|
1904
|
+
isGallery(attachment) {
|
|
1905
|
+
return attachment.type === 'gallery';
|
|
1906
|
+
}
|
|
1780
1907
|
isCard(attachment) {
|
|
1781
1908
|
return (!attachment.type ||
|
|
1782
1909
|
(attachment.type === 'image' && !this.isImage(attachment)) ||
|
|
@@ -1808,9 +1935,36 @@ class AttachmentListComponent {
|
|
|
1808
1935
|
trackByActionValue(_, item) {
|
|
1809
1936
|
return item.value;
|
|
1810
1937
|
}
|
|
1938
|
+
openImageModal(attachments, selectedIndex = 0) {
|
|
1939
|
+
this.imagesToView = attachments;
|
|
1940
|
+
this.imagesToViewCurrentIndex = selectedIndex;
|
|
1941
|
+
}
|
|
1942
|
+
closeImageModal() {
|
|
1943
|
+
this.imagesToView = [];
|
|
1944
|
+
}
|
|
1945
|
+
stepImages(dir) {
|
|
1946
|
+
this.imagesToViewCurrentIndex += dir * 1;
|
|
1947
|
+
}
|
|
1948
|
+
trackByImageUrl(_, item) {
|
|
1949
|
+
return item.image_url || item.img_url || item.thumb_url;
|
|
1950
|
+
}
|
|
1951
|
+
get isImageModalPrevButtonVisible() {
|
|
1952
|
+
return this.imagesToViewCurrentIndex !== 0;
|
|
1953
|
+
}
|
|
1954
|
+
get isImageModalNextButtonVisible() {
|
|
1955
|
+
return this.imagesToViewCurrentIndex !== this.imagesToView.length - 1;
|
|
1956
|
+
}
|
|
1957
|
+
createGallery(images) {
|
|
1958
|
+
return [
|
|
1959
|
+
{
|
|
1960
|
+
type: 'gallery',
|
|
1961
|
+
images,
|
|
1962
|
+
},
|
|
1963
|
+
];
|
|
1964
|
+
}
|
|
1811
1965
|
}
|
|
1812
1966
|
AttachmentListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: AttachmentListComponent, deps: [{ token: ImageLoadService }, { token: ChannelService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1813
|
-
AttachmentListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AttachmentListComponent, selector: "stream-attachment-list", inputs: { messageId: "messageId", attachments: "attachments" }, usesOnChanges: true, ngImport: i0, 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 />\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 icon=\"file\" [size]=\"30\"></stream-icon>\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", components: [{ type: IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }], directives: [{ type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
1967
|
+
AttachmentListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AttachmentListComponent, selector: "stream-attachment-list", inputs: { messageId: "messageId", attachments: "attachments" }, usesOnChanges: true, ngImport: i0, 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 icon=\"file\" [size]=\"30\"></stream-icon>\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<stream-modal\n *ngIf=\"imagesToView && imagesToView.length > 0\"\n [isOpen]=\"imagesToView && imagesToView.length > 0\"\n (isOpenChange)=\"$event ? null : closeImageModal()\"\n>\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 icon=\"arrow-left\"></stream-icon>\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 icon=\"arrow-right\"></stream-icon>\n </button>\n </div>\n</stream-modal>\n", components: [{ type: IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }, { type: ModalComponent, selector: "stream-modal", inputs: ["isOpen"], outputs: ["isOpenChange"] }], directives: [{ type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], pipes: { "translate": i2.TranslatePipe } });
|
|
1814
1968
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: AttachmentListComponent, decorators: [{
|
|
1815
1969
|
type: Component,
|
|
1816
1970
|
args: [{
|
|
@@ -2225,74 +2379,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
|
|
|
2225
2379
|
args: [TextareaDirective, { static: false }]
|
|
2226
2380
|
}] } });
|
|
2227
2381
|
|
|
2228
|
-
/**
|
|
2229
|
-
* 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.
|
|
2230
|
-
*/
|
|
2231
|
-
class ModalComponent {
|
|
2232
|
-
constructor() {
|
|
2233
|
-
/**
|
|
2234
|
-
* If `true` the modal will be displayed, if `false` the modal will be hidden
|
|
2235
|
-
*/
|
|
2236
|
-
this.isOpen = false;
|
|
2237
|
-
/**
|
|
2238
|
-
* Emits `true` if the modal becomes visible, and `false` if the modal is closed.
|
|
2239
|
-
*/
|
|
2240
|
-
this.isOpenChange = new EventEmitter();
|
|
2241
|
-
this.watchForEscPress = (event) => {
|
|
2242
|
-
if (event.key === 'Escape') {
|
|
2243
|
-
this.close();
|
|
2244
|
-
}
|
|
2245
|
-
};
|
|
2246
|
-
this.stopWatchForEscPress = () => {
|
|
2247
|
-
window.removeEventListener('keyup', this.watchForEscPress);
|
|
2248
|
-
};
|
|
2249
|
-
this.watchForOutsideClicks = (event) => {
|
|
2250
|
-
var _a;
|
|
2251
|
-
if (!((_a = this.content) === null || _a === void 0 ? void 0 : _a.nativeElement.contains(event.target))) {
|
|
2252
|
-
this.close();
|
|
2253
|
-
}
|
|
2254
|
-
};
|
|
2255
|
-
}
|
|
2256
|
-
ngOnChanges(changes) {
|
|
2257
|
-
if (changes.isOpen) {
|
|
2258
|
-
if (this.isOpen) {
|
|
2259
|
-
window.addEventListener('keyup', this.watchForEscPress);
|
|
2260
|
-
setTimeout(() => window.addEventListener('click', this.watchForOutsideClicks), 0);
|
|
2261
|
-
}
|
|
2262
|
-
else {
|
|
2263
|
-
this.stopWatchForOutsideClicks();
|
|
2264
|
-
this.stopWatchForEscPress();
|
|
2265
|
-
}
|
|
2266
|
-
}
|
|
2267
|
-
}
|
|
2268
|
-
close() {
|
|
2269
|
-
this.isOpen = false;
|
|
2270
|
-
this.isOpenChange.emit(false);
|
|
2271
|
-
this.stopWatchForOutsideClicks();
|
|
2272
|
-
this.stopWatchForEscPress();
|
|
2273
|
-
}
|
|
2274
|
-
stopWatchForOutsideClicks() {
|
|
2275
|
-
window.removeEventListener('click', this.watchForOutsideClicks);
|
|
2276
|
-
}
|
|
2277
|
-
}
|
|
2278
|
-
ModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2279
|
-
ModalComponent.ɵcmp = i0.ɵɵ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, 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.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] });
|
|
2280
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ModalComponent, decorators: [{
|
|
2281
|
-
type: Component,
|
|
2282
|
-
args: [{
|
|
2283
|
-
selector: 'stream-modal',
|
|
2284
|
-
templateUrl: './modal.component.html',
|
|
2285
|
-
styles: [],
|
|
2286
|
-
}]
|
|
2287
|
-
}], ctorParameters: function () { return []; }, propDecorators: { isOpen: [{
|
|
2288
|
-
type: Input
|
|
2289
|
-
}], isOpenChange: [{
|
|
2290
|
-
type: Output
|
|
2291
|
-
}], content: [{
|
|
2292
|
-
type: ViewChild,
|
|
2293
|
-
args: ['content']
|
|
2294
|
-
}] } });
|
|
2295
|
-
|
|
2296
2382
|
/**
|
|
2297
2383
|
* The `Notification` component displays a notification within the [`NotificationList`](./NotificationListComponent.mdx)
|
|
2298
2384
|
*/
|
|
@@ -2320,12 +2406,15 @@ class NotificationListComponent {
|
|
|
2320
2406
|
this.notificationService = notificationService;
|
|
2321
2407
|
this.notifications$ = this.notificationService.notifications$;
|
|
2322
2408
|
}
|
|
2323
|
-
|
|
2324
|
-
return item;
|
|
2409
|
+
trackById(_, item) {
|
|
2410
|
+
return item.id;
|
|
2411
|
+
}
|
|
2412
|
+
getTemplateContext(notification) {
|
|
2413
|
+
return Object.assign(Object.assign({}, notification.templateContext), { dismissFn: notification.dismissFn });
|
|
2325
2414
|
}
|
|
2326
2415
|
}
|
|
2327
2416
|
NotificationListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: NotificationListComponent, deps: [{ token: NotificationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2328
|
-
NotificationListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: NotificationListComponent, selector: "stream-notification-list", ngImport: i0, template: "<div class=\"str-chat__list-notifications\">\n <stream-notification\n *ngFor=\"let notification of notifications$ | async; trackBy:
|
|
2417
|
+
NotificationListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: NotificationListComponent, selector: "stream-notification-list", ngImport: i0, template: "<div class=\"str-chat__list-notifications\">\n <stream-notification\n *ngFor=\"let notification of notifications$ | async; trackBy: trackById\"\n [type]=\"notification.type\"\n >\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: getTemplateContext(notification)\n \"\n ></ng-container>\n </ng-container>\n </stream-notification>\n</div>\n", components: [{ type: NotificationComponent, selector: "stream-notification", inputs: ["type"] }], directives: [{ type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i6.AsyncPipe, "translate": i2.TranslatePipe } });
|
|
2329
2418
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: NotificationListComponent, decorators: [{
|
|
2330
2419
|
type: Component,
|
|
2331
2420
|
args: [{
|
|
@@ -2626,7 +2715,7 @@ class ChannelHeaderComponent {
|
|
|
2626
2715
|
}
|
|
2627
2716
|
}
|
|
2628
2717
|
ChannelHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChannelHeaderComponent, deps: [{ token: ChannelService }, { token: ChannelListToggleService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2629
|
-
ChannelHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelHeaderComponent, selector: "stream-channel-header", ngImport: i0, template: "<div class=\"str-chat__header-livestream\">\n <div\n class=\"str-chat__header-hamburger\"\n (click)=\"toggleMenu($event)\"\n (keyup.enter)=\"toggleMenu($event)\"\n >\n <
|
|
2718
|
+
ChannelHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelHeaderComponent, selector: "stream-channel-header", inputs: { channelActionsTemplate: "channelActionsTemplate" }, ngImport: i0, template: "<div class=\"str-chat__header-livestream\">\n <div\n class=\"str-chat__header-hamburger\"\n (click)=\"toggleMenu($event)\"\n (keyup.enter)=\"toggleMenu($event)\"\n >\n <stream-icon icon=\"menu\"></stream-icon>\n </div>\n <stream-avatar\n imageUrl=\"{{ activeChannel?.data?.image }}\"\n name=\"{{ activeChannel?.data?.name }}\"\n ></stream-avatar>\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: { channel: activeChannel }\n \"\n ></ng-container>\n </ng-container>\n</div>\n", components: [{ type: IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }, { type: AvatarComponent, selector: "stream-avatar", inputs: ["name", "imageUrl", "size"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "translate": i2.TranslatePipe } });
|
|
2630
2719
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChannelHeaderComponent, decorators: [{
|
|
2631
2720
|
type: Component,
|
|
2632
2721
|
args: [{
|
|
@@ -2634,7 +2723,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
|
|
|
2634
2723
|
templateUrl: './channel-header.component.html',
|
|
2635
2724
|
styles: [],
|
|
2636
2725
|
}]
|
|
2637
|
-
}], ctorParameters: function () { return [{ type: ChannelService }, { type: ChannelListToggleService }]; }
|
|
2726
|
+
}], ctorParameters: function () { return [{ type: ChannelService }, { type: ChannelListToggleService }]; }, propDecorators: { channelActionsTemplate: [{
|
|
2727
|
+
type: Input
|
|
2728
|
+
}] } });
|
|
2638
2729
|
|
|
2639
2730
|
/**
|
|
2640
2731
|
* The `ChannelPreview` component displays a channel preview in the channel list, it consists of the image, name and latest message of the channel.
|