stream-chat-angular 4.66.1 → 5.0.0-v5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/version.d.ts +1 -1
- package/{esm2015/assets/version.js → esm2020/assets/version.mjs} +2 -2
- package/esm2020/lib/attachment-configuration.service.mjs +185 -0
- package/esm2020/lib/attachment-list/attachment-list.component.mjs +205 -0
- package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +45 -0
- package/esm2020/lib/attachment.service.mjs +262 -0
- package/esm2020/lib/avatar/avatar.component.mjs +163 -0
- package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +74 -0
- package/esm2020/lib/channel/channel.component.mjs +46 -0
- package/esm2020/lib/channel-header/channel-header.component.mjs +79 -0
- package/esm2020/lib/channel-list/channel-list-toggle.service.mjs +72 -0
- package/esm2020/lib/channel-list/channel-list.component.mjs +60 -0
- package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
- package/esm2020/lib/channel.service.mjs +1460 -0
- package/esm2020/lib/chat-client.service.mjs +206 -0
- package/{esm2015/lib/custom-templates.service.js → esm2020/lib/custom-templates.service.mjs} +3 -3
- package/{esm2015/lib/date-parser.service.js → esm2020/lib/date-parser.service.mjs} +3 -3
- package/esm2020/lib/edit-message-form/edit-message-form.component.mjs +83 -0
- package/esm2020/lib/get-channel-display-text.mjs +14 -0
- package/esm2020/lib/get-message-translation.mjs +12 -0
- package/esm2020/lib/icon/icon.component.mjs +21 -0
- package/esm2020/lib/icon-placeholder/icon-placeholder.component.mjs +31 -0
- package/esm2020/lib/loading-indicator/loading-indicator.component.mjs +31 -0
- package/esm2020/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +38 -0
- package/esm2020/lib/message/message.component.mjs +418 -0
- package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +130 -0
- package/esm2020/lib/message-actions.service.mjs +119 -0
- package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
- package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +262 -0
- package/{esm2015/lib/message-input/emoji-input.service.js → esm2020/lib/message-input/emoji-input.service.mjs} +3 -3
- package/{esm2015/lib/message-input/message-input-config.service.js → esm2020/lib/message-input/message-input-config.service.mjs} +3 -3
- package/esm2020/lib/message-input/message-input.component.mjs +443 -0
- package/{esm2015/lib/message-input/textarea/textarea.component.js → esm2020/lib/message-input/textarea/textarea.component.mjs} +5 -9
- package/esm2020/lib/message-input/textarea.directive.mjs +89 -0
- package/esm2020/lib/message-list/group-styles.mjs +52 -0
- package/{esm2015/lib/message-list/image-load.service.js → esm2020/lib/message-list/image-load.service.mjs} +3 -3
- package/esm2020/lib/message-list/message-list.component.mjs +699 -0
- package/esm2020/lib/message-preview.mjs +21 -0
- package/esm2020/lib/message-reactions/message-reactions.component.mjs +252 -0
- package/{esm2015/lib/message-reactions.service.js → esm2020/lib/message-reactions.service.mjs} +3 -3
- package/{esm2015/lib/message.service.js → esm2020/lib/message.service.mjs} +4 -4
- package/esm2020/lib/modal/modal.component.mjs +69 -0
- package/esm2020/lib/notification/notification.component.mjs +20 -0
- package/esm2020/lib/notification-list/notification-list.component.mjs +37 -0
- package/esm2020/lib/notification.service.mjs +79 -0
- package/esm2020/lib/read-by.mjs +12 -0
- package/{esm2015/lib/stream-autocomplete-textarea.module.js → esm2020/lib/stream-autocomplete-textarea.module.mjs} +6 -6
- package/{esm2015/lib/stream-avatar.module.js → esm2020/lib/stream-avatar.module.mjs} +5 -5
- package/{esm2015/lib/stream-chat.module.js → esm2020/lib/stream-chat.module.mjs} +14 -16
- package/{esm2015/lib/stream-i18n.service.js → esm2020/lib/stream-i18n.service.mjs} +5 -5
- package/{esm2015/lib/stream-textarea.module.js → esm2020/lib/stream-textarea.module.mjs} +6 -6
- package/esm2020/lib/theme.service.mjs +123 -0
- package/esm2020/lib/thread/thread.component.mjs +51 -0
- package/{esm2015/lib/transliteration.service.js → esm2020/lib/transliteration.service.mjs} +3 -3
- package/esm2020/lib/types.mjs +2 -0
- package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +183 -0
- package/esm2020/lib/voice-recording/voice-recording.component.mjs +102 -0
- package/fesm2015/{stream-chat-angular.js → stream-chat-angular.mjs} +313 -426
- package/fesm2015/stream-chat-angular.mjs.map +1 -0
- package/fesm2020/stream-chat-angular.mjs +7123 -0
- package/fesm2020/stream-chat-angular.mjs.map +1 -0
- package/lib/attachment-list/attachment-list.component.d.ts +3 -3
- package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
- package/lib/attachment.service.d.ts +0 -1
- package/lib/avatar/avatar.component.d.ts +1 -1
- package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
- package/lib/channel/channel.component.d.ts +1 -1
- package/lib/channel-header/channel-header.component.d.ts +1 -1
- package/lib/channel-list/channel-list-toggle.service.d.ts +0 -1
- package/lib/channel-list/channel-list.component.d.ts +1 -1
- package/lib/channel-preview/channel-preview.component.d.ts +1 -1
- package/lib/channel.service.d.ts +7 -7
- package/lib/chat-client.service.d.ts +1 -1
- package/lib/edit-message-form/edit-message-form.component.d.ts +1 -1
- package/lib/get-message-translation.d.ts +1 -1
- package/lib/icon/icon.component.d.ts +1 -1
- package/lib/icon-placeholder/icon-placeholder.component.d.ts +1 -1
- package/lib/loading-indicator/loading-indicator.component.d.ts +1 -1
- package/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
- package/lib/message/message.component.d.ts +3 -7
- package/lib/message-actions-box/message-actions-box.component.d.ts +2 -4
- package/lib/message-actions.service.d.ts +0 -1
- package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
- package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -1
- package/lib/message-input/message-input.component.d.ts +2 -2
- package/lib/message-input/textarea/textarea.component.d.ts +1 -1
- package/lib/message-input/textarea.directive.d.ts +1 -1
- package/lib/message-list/group-styles.d.ts +1 -1
- package/lib/message-list/message-list.component.d.ts +4 -5
- package/lib/message-reactions/message-reactions.component.d.ts +1 -4
- package/lib/message.service.d.ts +0 -1
- package/lib/modal/modal.component.d.ts +1 -1
- package/lib/notification/notification.component.d.ts +1 -1
- package/lib/notification-list/notification-list.component.d.ts +2 -2
- package/lib/notification.service.d.ts +2 -5
- package/lib/stream-chat.module.d.ts +3 -3
- package/lib/theme.service.d.ts +1 -2
- package/lib/thread/thread.component.d.ts +1 -1
- package/lib/types.d.ts +18 -18
- package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +2 -2
- package/lib/voice-recording/voice-recording.component.d.ts +1 -1
- package/package.json +31 -17
- package/src/assets/styles/v2/css/index.css +1 -1
- package/src/assets/styles/v2/css/index.layout.css +1 -1
- package/src/assets/styles/v2/scss/_base.scss +2 -2
- package/src/assets/version.ts +1 -1
- package/bundles/stream-chat-angular.umd.js +0 -8445
- package/bundles/stream-chat-angular.umd.js.map +0 -1
- package/esm2015/lib/attachment-configuration.service.js +0 -186
- package/esm2015/lib/attachment-list/attachment-list.component.js +0 -209
- package/esm2015/lib/attachment-preview-list/attachment-preview-list.component.js +0 -49
- package/esm2015/lib/attachment.service.js +0 -276
- package/esm2015/lib/avatar/avatar.component.js +0 -172
- package/esm2015/lib/avatar-placeholder/avatar-placeholder.component.js +0 -78
- package/esm2015/lib/channel/channel.component.js +0 -50
- package/esm2015/lib/channel-header/channel-header.component.js +0 -86
- package/esm2015/lib/channel-list/channel-list-toggle.service.js +0 -73
- package/esm2015/lib/channel-list/channel-list.component.js +0 -67
- package/esm2015/lib/channel-preview/channel-preview.component.js +0 -167
- package/esm2015/lib/channel.service.js +0 -1487
- package/esm2015/lib/chat-client.service.js +0 -211
- package/esm2015/lib/edit-message-form/edit-message-form.component.js +0 -87
- package/esm2015/lib/get-channel-display-text.js +0 -15
- package/esm2015/lib/get-message-translation.js +0 -13
- package/esm2015/lib/icon/icon.component.js +0 -25
- package/esm2015/lib/icon-placeholder/icon-placeholder.component.js +0 -35
- package/esm2015/lib/loading-indicator/loading-indicator.component.js +0 -35
- package/esm2015/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.js +0 -42
- package/esm2015/lib/message/message.component.js +0 -436
- package/esm2015/lib/message-actions-box/message-actions-box.component.js +0 -137
- package/esm2015/lib/message-actions.service.js +0 -114
- package/esm2015/lib/message-bounce-prompt/message-bounce-prompt.component.js +0 -80
- package/esm2015/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.js +0 -262
- package/esm2015/lib/message-input/message-input.component.js +0 -455
- package/esm2015/lib/message-input/textarea.directive.js +0 -90
- package/esm2015/lib/message-list/group-styles.js +0 -53
- package/esm2015/lib/message-list/message-list.component.js +0 -726
- package/esm2015/lib/message-preview.js +0 -7
- package/esm2015/lib/message-reactions/message-reactions.component.js +0 -266
- package/esm2015/lib/modal/modal.component.js +0 -74
- package/esm2015/lib/notification/notification.component.js +0 -24
- package/esm2015/lib/notification-list/notification-list.component.js +0 -38
- package/esm2015/lib/notification.service.js +0 -79
- package/esm2015/lib/read-by.js +0 -13
- package/esm2015/lib/theme.service.js +0 -122
- package/esm2015/lib/thread/thread.component.js +0 -55
- package/esm2015/lib/types.js +0 -2
- package/esm2015/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.js +0 -192
- package/esm2015/lib/voice-recording/voice-recording.component.js +0 -115
- package/fesm2015/stream-chat-angular.js.map +0 -1
- /package/{esm2015/assets/i18n/en.js → esm2020/assets/i18n/en.mjs} +0 -0
- /package/{esm2015/lib/injection-tokens.js → esm2020/lib/injection-tokens.mjs} +0 -0
- /package/{esm2015/lib/is-image-attachment.js → esm2020/lib/is-image-attachment.mjs} +0 -0
- /package/{esm2015/lib/is-image-file.js → esm2020/lib/is-image-file.mjs} +0 -0
- /package/{esm2015/lib/is-on-separate-date.js → esm2020/lib/is-on-separate-date.mjs} +0 -0
- /package/{esm2015/lib/list-users.js → esm2020/lib/list-users.mjs} +0 -0
- /package/{esm2015/lib/message-input/textarea.interface.js → esm2020/lib/message-input/textarea.interface.mjs} +0 -0
- /package/{esm2015/lib/parse-date.js → esm2020/lib/parse-date.mjs} +0 -0
- /package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- /package/{esm2015/stream-chat-angular.js → esm2020/stream-chat-angular.mjs} +0 -0
- /package/{stream-chat-angular.d.ts → index.d.ts} +0 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
export const createMessagePreview = (user, text, attachments = [], mentionedUsers = [], parentId = undefined, quotedMessageId = undefined, customData) => {
|
|
3
|
+
const clientSideId = `${user.id}-${uuidv4()}`;
|
|
4
|
+
return {
|
|
5
|
+
__html: text,
|
|
6
|
+
created_at: new Date(),
|
|
7
|
+
html: text,
|
|
8
|
+
id: clientSideId,
|
|
9
|
+
reactions: [],
|
|
10
|
+
status: 'sending',
|
|
11
|
+
text,
|
|
12
|
+
type: 'regular',
|
|
13
|
+
user,
|
|
14
|
+
attachments,
|
|
15
|
+
mentioned_users: mentionedUsers,
|
|
16
|
+
parent_id: parentId,
|
|
17
|
+
quoted_message_id: quotedMessageId,
|
|
18
|
+
...customData,
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1wcmV2aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtcHJldmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwQyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUdsQyxJQUFrQixFQUNsQixJQUFZLEVBQ1osY0FBK0IsRUFBRSxFQUNqQyxpQkFBb0MsRUFBRSxFQUN0QyxXQUErQixTQUFTLEVBQ3hDLGtCQUFzQyxTQUFTLEVBQy9DLFVBQWlELEVBQ2pELEVBQUU7SUFDRixNQUFNLFlBQVksR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQztJQUU5QyxPQUFPO1FBQ0wsTUFBTSxFQUFFLElBQUk7UUFDWixVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUU7UUFDdEIsSUFBSSxFQUFFLElBQUk7UUFDVixFQUFFLEVBQUUsWUFBWTtRQUNoQixTQUFTLEVBQUUsRUFBRTtRQUNiLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLElBQUk7UUFDSixJQUFJLEVBQUUsU0FBUztRQUNmLElBQUk7UUFDSixXQUFXO1FBQ1gsZUFBZSxFQUFFLGNBQWM7UUFDL0IsU0FBUyxFQUFFLFFBQVE7UUFDbkIsaUJBQWlCLEVBQUUsZUFBZTtRQUNsQyxHQUFHLFVBQVU7S0FDbUIsQ0FBQztBQUNyQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdHRhY2htZW50LCBNZXNzYWdlUmVzcG9uc2UsIFVzZXJSZXNwb25zZSB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTWVzc2FnZVByZXZpZXcgPSA8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPihcbiAgdXNlcjogVXNlclJlc3BvbnNlLFxuICB0ZXh0OiBzdHJpbmcsXG4gIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50PFQ+W10gPSBbXSxcbiAgbWVudGlvbmVkVXNlcnM6IFVzZXJSZXNwb25zZTxUPltdID0gW10sXG4gIHBhcmVudElkOiB1bmRlZmluZWQgfCBzdHJpbmcgPSB1bmRlZmluZWQsXG4gIHF1b3RlZE1lc3NhZ2VJZDogdW5kZWZpbmVkIHwgc3RyaW5nID0gdW5kZWZpbmVkLFxuICBjdXN0b21EYXRhOiB1bmRlZmluZWQgfCBQYXJ0aWFsPFRbJ21lc3NhZ2VUeXBlJ10+XG4pID0+IHtcbiAgY29uc3QgY2xpZW50U2lkZUlkID0gYCR7dXNlci5pZH0tJHt1dWlkdjQoKX1gO1xuXG4gIHJldHVybiB7XG4gICAgX19odG1sOiB0ZXh0LFxuICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKCksXG4gICAgaHRtbDogdGV4dCxcbiAgICBpZDogY2xpZW50U2lkZUlkLFxuICAgIHJlYWN0aW9uczogW10sXG4gICAgc3RhdHVzOiAnc2VuZGluZycsXG4gICAgdGV4dCxcbiAgICB0eXBlOiAncmVndWxhcicsXG4gICAgdXNlcixcbiAgICBhdHRhY2htZW50cyxcbiAgICBtZW50aW9uZWRfdXNlcnM6IG1lbnRpb25lZFVzZXJzLFxuICAgIHBhcmVudF9pZDogcGFyZW50SWQsXG4gICAgcXVvdGVkX21lc3NhZ2VfaWQ6IHF1b3RlZE1lc3NhZ2VJZCxcbiAgICAuLi5jdXN0b21EYXRhLFxuICB9IGFzIHVua25vd24gYXMgTWVzc2FnZVJlc3BvbnNlPFQ+O1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import { ChannelService } from '../channel.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../channel.service";
|
|
5
|
+
import * as i2 from "../message-reactions.service";
|
|
6
|
+
import * as i3 from "../custom-templates.service";
|
|
7
|
+
import * as i4 from "../theme.service";
|
|
8
|
+
import * as i5 from "@angular/common";
|
|
9
|
+
import * as i6 from "../avatar-placeholder/avatar-placeholder.component";
|
|
10
|
+
import * as i7 from "../loading-indicator/loading-indicator.component";
|
|
11
|
+
import * as i8 from "../modal/modal.component";
|
|
12
|
+
/**
|
|
13
|
+
* The `MessageReactions` component displays the reactions of a message, the current user can add and remove reactions. You can read more about [message reactions](https://getstream.io/chat/docs/javascript/send_reaction/?language=javascript) in the platform documentation.
|
|
14
|
+
*/
|
|
15
|
+
export class MessageReactionsComponent {
|
|
16
|
+
constructor(cdRef, channelService, messageReactionsService, customTemplatesService, themeService) {
|
|
17
|
+
this.cdRef = cdRef;
|
|
18
|
+
this.channelService = channelService;
|
|
19
|
+
this.messageReactionsService = messageReactionsService;
|
|
20
|
+
this.customTemplatesService = customTemplatesService;
|
|
21
|
+
this.themeService = themeService;
|
|
22
|
+
/**
|
|
23
|
+
* The number of reactions grouped by [reaction types](https://github.com/GetStream/stream-chat-angular/tree/master/projects/stream-chat-angular/src/lib/message-reactions/message-reactions.component.ts)
|
|
24
|
+
*/
|
|
25
|
+
this.messageReactionCounts = {};
|
|
26
|
+
/**
|
|
27
|
+
* Indicates if the selector should be opened or closed. Adding a UI element to open and close the selector is the parent's component responsibility.
|
|
28
|
+
*/
|
|
29
|
+
this.isSelectorOpen = false;
|
|
30
|
+
/**
|
|
31
|
+
* List of reactions of a [message](../types/stream-message.mdx), used to display the users of a reaction type.
|
|
32
|
+
*/
|
|
33
|
+
this.latestReactions = [];
|
|
34
|
+
/**
|
|
35
|
+
* List of the user's own reactions of a [message](../types/stream-message.mdx), used to display the users of a reaction type.
|
|
36
|
+
*/
|
|
37
|
+
this.ownReactions = [];
|
|
38
|
+
/**
|
|
39
|
+
* Indicates if the selector should be opened or closed. Adding a UI element to open and close the selector is the parent's component responsibility.
|
|
40
|
+
*/
|
|
41
|
+
this.isSelectorOpenChange = new EventEmitter();
|
|
42
|
+
this.isLoading = true;
|
|
43
|
+
this.reactions = [];
|
|
44
|
+
this.shouldHandleReactionClick = true;
|
|
45
|
+
this.existingReactions = [];
|
|
46
|
+
this.reactionsCount = 0;
|
|
47
|
+
this.reactionOptions = [];
|
|
48
|
+
this.subscriptions = [];
|
|
49
|
+
this.isViewInited = false;
|
|
50
|
+
this.isOpenChange = (isOpen) => {
|
|
51
|
+
this.selectedReactionType = isOpen ? this.selectedReactionType : undefined;
|
|
52
|
+
};
|
|
53
|
+
this.eventHandler = (event) => {
|
|
54
|
+
if (!this.selectorContainer?.nativeElement.contains(event.target)) {
|
|
55
|
+
this.isSelectorOpenChange.emit(false);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
ngOnInit() {
|
|
60
|
+
this.subscriptions.push(this.messageReactionsService.reactions$.subscribe((reactions) => {
|
|
61
|
+
this.reactionOptions = Object.keys(reactions);
|
|
62
|
+
this.setExistingReactions();
|
|
63
|
+
if (this.isViewInited) {
|
|
64
|
+
this.cdRef.detectChanges();
|
|
65
|
+
}
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
ngOnChanges(changes) {
|
|
69
|
+
if (changes.isSelectorOpen) {
|
|
70
|
+
this.isSelectorOpen
|
|
71
|
+
? setTimeout(() => this.watchForOutsideClicks()) // setTimeout: wait for current click to bubble up, and only watch for clicks after that
|
|
72
|
+
: this.stopWatchForOutsideClicks();
|
|
73
|
+
}
|
|
74
|
+
if (changes.messageReactionCounts) {
|
|
75
|
+
this.setExistingReactions();
|
|
76
|
+
}
|
|
77
|
+
if (changes.messageReactionCounts && this.messageReactionCounts) {
|
|
78
|
+
const reactionsCount = Object.keys(this.messageReactionCounts).reduce((acc, key) => acc + (this.messageReactionCounts[key] || 0), 0);
|
|
79
|
+
this.shouldHandleReactionClick =
|
|
80
|
+
reactionsCount <= ChannelService.MAX_MESSAGE_REACTIONS_TO_FETCH ||
|
|
81
|
+
!!this.messageReactionsService.customReactionClickHandler;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
ngAfterViewInit() {
|
|
85
|
+
this.isViewInited = true;
|
|
86
|
+
}
|
|
87
|
+
ngAfterViewChecked() {
|
|
88
|
+
if (this.tooltipText && !this.tooltipPositions) {
|
|
89
|
+
this.setTooltipPosition();
|
|
90
|
+
this.cdRef.detectChanges();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
ngOnDestroy() {
|
|
94
|
+
this.subscriptions.forEach((s) => s.unsubscribe());
|
|
95
|
+
}
|
|
96
|
+
getLatestUserByReaction(reactionType) {
|
|
97
|
+
return this.latestReactions.find((r) => r.type === reactionType && r.user)
|
|
98
|
+
?.user;
|
|
99
|
+
}
|
|
100
|
+
getEmojiByReaction(reactionType) {
|
|
101
|
+
return this.messageReactionsService.reactions[reactionType];
|
|
102
|
+
}
|
|
103
|
+
reactionSelected(reactionType) {
|
|
104
|
+
if (!this.shouldHandleReactionClick) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (this.themeService.themeVersion === '1') {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (!this.messageId) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (this.messageReactionsService.customReactionClickHandler) {
|
|
114
|
+
this.messageReactionsService.customReactionClickHandler({
|
|
115
|
+
messageId: this.messageId,
|
|
116
|
+
reactionType: reactionType,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
this.selectedReactionType = reactionType;
|
|
121
|
+
void this.fetchAllReactions();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
getUsersByReaction(reactionType) {
|
|
125
|
+
return this.latestReactions
|
|
126
|
+
.filter((r) => r.type === reactionType)
|
|
127
|
+
.map((r) => r.user?.name || r.user?.id)
|
|
128
|
+
.filter((i) => !!i)
|
|
129
|
+
.join(', ');
|
|
130
|
+
}
|
|
131
|
+
getAllUsersByReaction(reactionType) {
|
|
132
|
+
if (!reactionType) {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
const users = this.reactions
|
|
136
|
+
.filter((r) => r.type === reactionType)
|
|
137
|
+
.map((r) => r.user)
|
|
138
|
+
.filter((i) => !!i);
|
|
139
|
+
users.sort((u1, u2) => {
|
|
140
|
+
const name1 = u1.name?.toLowerCase();
|
|
141
|
+
const name2 = u2.name?.toLowerCase();
|
|
142
|
+
if (!name1) {
|
|
143
|
+
return 1;
|
|
144
|
+
}
|
|
145
|
+
if (!name2) {
|
|
146
|
+
return -1;
|
|
147
|
+
}
|
|
148
|
+
if (name1 === name2) {
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
if (name1 < name2) {
|
|
152
|
+
return -1;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
return 1;
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
return users;
|
|
159
|
+
}
|
|
160
|
+
showTooltip(event, reactionType) {
|
|
161
|
+
this.currentTooltipTarget = event.target;
|
|
162
|
+
this.tooltipText = this.getUsersByReaction(reactionType);
|
|
163
|
+
}
|
|
164
|
+
hideTooltip() {
|
|
165
|
+
this.tooltipText = undefined;
|
|
166
|
+
this.currentTooltipTarget = undefined;
|
|
167
|
+
this.tooltipPositions = undefined;
|
|
168
|
+
}
|
|
169
|
+
trackByMessageReaction(index, item) {
|
|
170
|
+
return item;
|
|
171
|
+
}
|
|
172
|
+
trackByUserId(index, item) {
|
|
173
|
+
return item.id;
|
|
174
|
+
}
|
|
175
|
+
async react(type) {
|
|
176
|
+
this.ownReactions.find((r) => r.type === type)
|
|
177
|
+
? await this.channelService.removeReaction(this.messageId, type)
|
|
178
|
+
: await this.channelService.addReaction(this.messageId, type);
|
|
179
|
+
this.isSelectorOpenChange.emit(false);
|
|
180
|
+
}
|
|
181
|
+
isOwnReaction(reactionType) {
|
|
182
|
+
return !!this.ownReactions.find((r) => r.type === reactionType);
|
|
183
|
+
}
|
|
184
|
+
watchForOutsideClicks() {
|
|
185
|
+
window.addEventListener('click', this.eventHandler);
|
|
186
|
+
}
|
|
187
|
+
stopWatchForOutsideClicks() {
|
|
188
|
+
window.removeEventListener('click', this.eventHandler);
|
|
189
|
+
}
|
|
190
|
+
setTooltipPosition() {
|
|
191
|
+
const tooltip = this.selectorTooltip?.nativeElement.getBoundingClientRect();
|
|
192
|
+
const target = this.currentTooltipTarget?.getBoundingClientRect();
|
|
193
|
+
const container = this.selectorContainer?.nativeElement.getBoundingClientRect();
|
|
194
|
+
if (!tooltip || !target || !container)
|
|
195
|
+
return;
|
|
196
|
+
const tooltipPosition = tooltip.width === container.width || tooltip.x < container.x
|
|
197
|
+
? 0
|
|
198
|
+
: target.left + target.width / 2 - container.left - tooltip.width / 2;
|
|
199
|
+
const arrowPosition = target.x - tooltip.x + target.width / 2 - tooltipPosition;
|
|
200
|
+
this.tooltipPositions = {
|
|
201
|
+
tooltip: tooltipPosition,
|
|
202
|
+
arrow: arrowPosition,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
async fetchAllReactions() {
|
|
206
|
+
if (!this.messageId) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
this.isLoading = true;
|
|
210
|
+
try {
|
|
211
|
+
this.reactions = await this.channelService.getMessageReactions(this.messageId);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
this.selectedReactionType = undefined;
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
this.isLoading = false;
|
|
218
|
+
this.cdRef.detectChanges();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
setExistingReactions() {
|
|
222
|
+
this.existingReactions = Object.keys(this.messageReactionCounts)
|
|
223
|
+
.filter((k) => this.reactionOptions.indexOf(k) !== -1)
|
|
224
|
+
.filter((k) => this.messageReactionCounts[k] > 0);
|
|
225
|
+
this.reactionsCount = this.existingReactions.reduce((total, reaction) => total + this.messageReactionCounts[reaction], 0);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
MessageReactionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageReactionsComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ChannelService }, { token: i2.MessageReactionsService }, { token: i3.CustomTemplatesService }, { token: i4.ThemeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
229
|
+
MessageReactionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", 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, template: "<div\n *ngIf=\"existingReactions.length > 0\"\n data-testid=\"reaction-list\"\n class=\"str-chat__reaction-list str-chat__message-reactions-container\"\n [class.str-chat__reaction-list--reverse]=\"true\"\n [class.str-chat__reaction-list-hidden]=\"isSelectorOpen\"\n>\n <ul class=\"str-chat__message-reactions\">\n <li\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n class=\"str-chat__message-reaction\"\n data-testclass=\"emoji\"\n [ngStyle]=\"{ cursor: shouldHandleReactionClick ? 'pointer' : 'default' }\"\n [class.str-chat__message-reaction-own]=\"isOwnReaction(reactionType)\"\n (click)=\"reactionSelected(reactionType)\"\n (keyup.enter)=\"reactionSelected(reactionType)\"\n >\n <span class=\"emoji str-chat__message-reaction-emoji\">\n {{ getEmojiByReaction(reactionType) }} \n </span>\n <span\n data-testclass=\"reaction-list-reaction-count\"\n class=\"str-chat__message-reaction-count\"\n >\n {{ messageReactionCounts[reactionType] }}\n </span>\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 *ngIf=\"isSelectorOpen\"\n #selectorContainer\n data-testid=\"reaction-selector\"\n class=\"str-chat__reaction-selector str-chat__message-reaction-selector\"\n>\n <div\n *ngIf=\"tooltipText\"\n #selectorTooltip\n class=\"str-chat__reaction-selector-tooltip\"\n data-testid=\"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\n class=\"str-chat__message-reactions-list str-chat__message-reactions-options\"\n >\n <li\n *ngFor=\"\n let reactionType of reactionOptions;\n trackBy: trackByMessageReaction\n \"\n class=\"\n str-chat__message-reactions-option\n str-chat__message-reactions-list-item\n str-chat__emoji\n \"\n data-testclass=\"emoji-option\"\n [class.str-chat__message-reactions-option-selected]=\"\n isOwnReaction(reactionType)\n \"\n (click)=\"react(reactionType)\"\n (keyup.enter)=\"react(reactionType)\"\n >\n <div\n *ngIf=\"getLatestUserByReaction(reactionType) as user\"\n class=\"latest-user str-chat__message-reactions-last-user\"\n attr.data-testid=\"{{ reactionType }}-last-user\"\n (click)=\"hideTooltip()\"\n (keyup.enter)=\"hideTooltip()\"\n (mouseenter)=\"showTooltip($event, reactionType)\"\n (mouseleave)=\"hideTooltip()\"\n >\n <stream-avatar-placeholder\n location=\"reaction\"\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\n class=\"\n emoji\n str-chat__emoji-selector-emoji-angular\n str-chat__message-reaction-emoji\n \"\n >\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\n<ng-container *ngIf=\"selectedReactionType\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: {\n isOpen: !!selectedReactionType,\n messageId: messageId,\n reactionType: selectedReactionType,\n isOpenChangeHandler: isOpenChange,\n content: modalContent\n }\n \"\n ></ng-container>\n</ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-messageId=\"messageId\"\n let-reactionType=\"reactionType\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"str-chat__message-reactions-details-modal\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"str-chat__message-reactions-details\">\n <div class=\"str-chat__message-reactions-details-reaction-types\">\n <div\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n class=\"str-chat__message-reactions-details-reaction-type\"\n [ngStyle]=\"{\n cursor: shouldHandleReactionClick ? 'pointer' : 'default'\n }\"\n attr.data-testid=\"reaction-details-selector-{{ reactionType }}\"\n [class.str-chat__message-reactions-details-reaction-type--selected]=\"\n reactionType === selectedReactionType\n \"\n (click)=\"selectedReactionType = reactionType; allUsers.scrollTop = 0\"\n (keyup.enter)=\"\n selectedReactionType = reactionType; allUsers.scrollTop = 0\n \"\n >\n <span class=\"emoji str-chat__message-reaction-emoji\">\n {{ getEmojiByReaction(reactionType) }} \n </span>\n <span class=\"str-chat__message-reaction-count\">\n {{ messageReactionCounts[reactionType] }}\n </span>\n </div>\n </div>\n <div\n class=\"\n emoji\n str-chat__message-reaction-emoji str-chat__message-reaction-emoji-big\n \"\n >\n {{ getEmojiByReaction(selectedReactionType!) }}\n </div>\n <div\n #allUsers\n data-testid=\"all-reacting-users\"\n class=\"str-chat__message-reactions-details-reacting-users\"\n >\n <stream-loading-indicator\n *ngIf=\"isLoading; else reactions\"\n ></stream-loading-indicator>\n <ng-template #reactions>\n <div\n *ngFor=\"\n let user of getAllUsersByReaction(selectedReactionType);\n trackBy: trackByUserId\n \"\n class=\"str-chat__message-reactions-details-reacting-user\"\n >\n <stream-avatar-placeholder\n data-testclass=\"avatar\"\n class=\"str-chat__avatar str-chat__avatar--circle\"\n type=\"user\"\n location=\"reaction\"\n [size]=\"30\"\n [imageUrl]=\"user.image\"\n [name]=\"user.name\"\n [user]=\"user\"\n ></stream-avatar-placeholder>\n <span\n data-testclass=\"reaction-user-username\"\n class=\"str-chat__user-item--name\"\n >{{ user.name }}</span\n >\n </div>\n </ng-template>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i6.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size", "location", "channel", "user", "type", "initialsType", "showOnlineIndicator"] }, { kind: "component", type: i7.LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: ["size", "color"] }, { kind: "component", type: i8.ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] });
|
|
230
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageReactionsComponent, decorators: [{
|
|
231
|
+
type: Component,
|
|
232
|
+
args: [{ selector: 'stream-message-reactions', template: "<div\n *ngIf=\"existingReactions.length > 0\"\n data-testid=\"reaction-list\"\n class=\"str-chat__reaction-list str-chat__message-reactions-container\"\n [class.str-chat__reaction-list--reverse]=\"true\"\n [class.str-chat__reaction-list-hidden]=\"isSelectorOpen\"\n>\n <ul class=\"str-chat__message-reactions\">\n <li\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n class=\"str-chat__message-reaction\"\n data-testclass=\"emoji\"\n [ngStyle]=\"{ cursor: shouldHandleReactionClick ? 'pointer' : 'default' }\"\n [class.str-chat__message-reaction-own]=\"isOwnReaction(reactionType)\"\n (click)=\"reactionSelected(reactionType)\"\n (keyup.enter)=\"reactionSelected(reactionType)\"\n >\n <span class=\"emoji str-chat__message-reaction-emoji\">\n {{ getEmojiByReaction(reactionType) }} \n </span>\n <span\n data-testclass=\"reaction-list-reaction-count\"\n class=\"str-chat__message-reaction-count\"\n >\n {{ messageReactionCounts[reactionType] }}\n </span>\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 *ngIf=\"isSelectorOpen\"\n #selectorContainer\n data-testid=\"reaction-selector\"\n class=\"str-chat__reaction-selector str-chat__message-reaction-selector\"\n>\n <div\n *ngIf=\"tooltipText\"\n #selectorTooltip\n class=\"str-chat__reaction-selector-tooltip\"\n data-testid=\"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\n class=\"str-chat__message-reactions-list str-chat__message-reactions-options\"\n >\n <li\n *ngFor=\"\n let reactionType of reactionOptions;\n trackBy: trackByMessageReaction\n \"\n class=\"\n str-chat__message-reactions-option\n str-chat__message-reactions-list-item\n str-chat__emoji\n \"\n data-testclass=\"emoji-option\"\n [class.str-chat__message-reactions-option-selected]=\"\n isOwnReaction(reactionType)\n \"\n (click)=\"react(reactionType)\"\n (keyup.enter)=\"react(reactionType)\"\n >\n <div\n *ngIf=\"getLatestUserByReaction(reactionType) as user\"\n class=\"latest-user str-chat__message-reactions-last-user\"\n attr.data-testid=\"{{ reactionType }}-last-user\"\n (click)=\"hideTooltip()\"\n (keyup.enter)=\"hideTooltip()\"\n (mouseenter)=\"showTooltip($event, reactionType)\"\n (mouseleave)=\"hideTooltip()\"\n >\n <stream-avatar-placeholder\n location=\"reaction\"\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\n class=\"\n emoji\n str-chat__emoji-selector-emoji-angular\n str-chat__message-reaction-emoji\n \"\n >\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\n<ng-container *ngIf=\"selectedReactionType\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: {\n isOpen: !!selectedReactionType,\n messageId: messageId,\n reactionType: selectedReactionType,\n isOpenChangeHandler: isOpenChange,\n content: modalContent\n }\n \"\n ></ng-container>\n</ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-messageId=\"messageId\"\n let-reactionType=\"reactionType\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"str-chat__message-reactions-details-modal\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"str-chat__message-reactions-details\">\n <div class=\"str-chat__message-reactions-details-reaction-types\">\n <div\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n class=\"str-chat__message-reactions-details-reaction-type\"\n [ngStyle]=\"{\n cursor: shouldHandleReactionClick ? 'pointer' : 'default'\n }\"\n attr.data-testid=\"reaction-details-selector-{{ reactionType }}\"\n [class.str-chat__message-reactions-details-reaction-type--selected]=\"\n reactionType === selectedReactionType\n \"\n (click)=\"selectedReactionType = reactionType; allUsers.scrollTop = 0\"\n (keyup.enter)=\"\n selectedReactionType = reactionType; allUsers.scrollTop = 0\n \"\n >\n <span class=\"emoji str-chat__message-reaction-emoji\">\n {{ getEmojiByReaction(reactionType) }} \n </span>\n <span class=\"str-chat__message-reaction-count\">\n {{ messageReactionCounts[reactionType] }}\n </span>\n </div>\n </div>\n <div\n class=\"\n emoji\n str-chat__message-reaction-emoji str-chat__message-reaction-emoji-big\n \"\n >\n {{ getEmojiByReaction(selectedReactionType!) }}\n </div>\n <div\n #allUsers\n data-testid=\"all-reacting-users\"\n class=\"str-chat__message-reactions-details-reacting-users\"\n >\n <stream-loading-indicator\n *ngIf=\"isLoading; else reactions\"\n ></stream-loading-indicator>\n <ng-template #reactions>\n <div\n *ngFor=\"\n let user of getAllUsersByReaction(selectedReactionType);\n trackBy: trackByUserId\n \"\n class=\"str-chat__message-reactions-details-reacting-user\"\n >\n <stream-avatar-placeholder\n data-testclass=\"avatar\"\n class=\"str-chat__avatar str-chat__avatar--circle\"\n type=\"user\"\n location=\"reaction\"\n [size]=\"30\"\n [imageUrl]=\"user.image\"\n [name]=\"user.name\"\n [user]=\"user\"\n ></stream-avatar-placeholder>\n <span\n data-testclass=\"reaction-user-username\"\n class=\"str-chat__user-item--name\"\n >{{ user.name }}</span\n >\n </div>\n </ng-template>\n </div>\n </div>\n</ng-template>\n" }]
|
|
233
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.ChannelService }, { type: i2.MessageReactionsService }, { type: i3.CustomTemplatesService }, { type: i4.ThemeService }]; }, propDecorators: { messageId: [{
|
|
234
|
+
type: Input
|
|
235
|
+
}], messageReactionCounts: [{
|
|
236
|
+
type: Input
|
|
237
|
+
}], isSelectorOpen: [{
|
|
238
|
+
type: Input
|
|
239
|
+
}], latestReactions: [{
|
|
240
|
+
type: Input
|
|
241
|
+
}], ownReactions: [{
|
|
242
|
+
type: Input
|
|
243
|
+
}], isSelectorOpenChange: [{
|
|
244
|
+
type: Output
|
|
245
|
+
}], selectorContainer: [{
|
|
246
|
+
type: ViewChild,
|
|
247
|
+
args: ['selectorContainer']
|
|
248
|
+
}], selectorTooltip: [{
|
|
249
|
+
type: ViewChild,
|
|
250
|
+
args: ['selectorTooltip']
|
|
251
|
+
}] } });
|
|
252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1yZWFjdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtcmVhY3Rpb25zL21lc3NhZ2UtcmVhY3Rpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLXJlYWN0aW9ucy9tZXNzYWdlLXJlYWN0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7QUFPcEQ7O0dBRUc7QUFLSCxNQUFNLE9BQU8seUJBQXlCO0lBK0NwQyxZQUNVLEtBQXdCLEVBQ3hCLGNBQThCLEVBQzlCLHVCQUFnRCxFQUNqRCxzQkFBOEMsRUFDN0MsWUFBMEI7UUFKMUIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFDakQsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM3QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQTdDcEM7O1dBRUc7UUFDTSwwQkFBcUIsR0FDNUIsRUFBRSxDQUFDO1FBQ0w7O1dBRUc7UUFDTSxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUN6Qzs7V0FFRztRQUNNLG9CQUFlLEdBQWtELEVBQUUsQ0FBQztRQUM3RTs7V0FFRztRQUNNLGlCQUFZLEdBQWtELEVBQUUsQ0FBQztRQUMxRTs7V0FFRztRQUNnQix5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FB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R0FBekIseUJBQXlCLHFpQkM5QnRDLGlrT0FxT0E7MkZEdk1hLHlCQUF5QjtrQkFKckMsU0FBUzsrQkFDRSwwQkFBMEI7Mk9BUzNCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUtHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBSUcsZUFBZTtzQkFBdkIsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQUlhLG9CQUFvQjtzQkFBdEMsTUFBTTtnQkFHaUMsaUJBQWlCO3NCQUF4RCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFHUSxlQUFlO3NCQUFwRCxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlYWN0aW9uUmVzcG9uc2UsIFVzZXJSZXNwb25zZSB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IENoYW5uZWxTZXJ2aWNlIH0gZnJvbSAnLi4vY2hhbm5lbC5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2VSZWFjdGlvblR5cGUsIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBNZXNzYWdlUmVhY3Rpb25zU2VydmljZSB9IGZyb20gJy4uL21lc3NhZ2UtcmVhY3Rpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi90aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFRoZSBgTWVzc2FnZVJlYWN0aW9uc2AgY29tcG9uZW50IGRpc3BsYXlzIHRoZSByZWFjdGlvbnMgb2YgYSBtZXNzYWdlLCB0aGUgY3VycmVudCB1c2VyIGNhbiBhZGQgYW5kIHJlbW92ZSByZWFjdGlvbnMuIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0IFttZXNzYWdlIHJlYWN0aW9uc10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvc2VuZF9yZWFjdGlvbi8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkgaW4gdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLXJlYWN0aW9ucycsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLXJlYWN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VSZWFjdGlvbnNDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdGhlIHJlYWN0aW9ucyBiZWxvbmcgdG9cbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByZWFjdGlvbnMgZ3JvdXBlZCBieSBbcmVhY3Rpb24gdHlwZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9HZXRTdHJlYW0vc3RyZWFtLWNoYXQtYW5ndWxhci90cmVlL21hc3Rlci9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS1yZWFjdGlvbnMvbWVzc2FnZS1yZWFjdGlvbnMuY29tcG9uZW50LnRzKVxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZVJlYWN0aW9uQ291bnRzOiB7IFtrZXkgaW4gTWVzc2FnZVJlYWN0aW9uVHlwZV0/OiBudW1iZXIgfSA9XG4gICAge307XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHNlbGVjdG9yIHNob3VsZCBiZSBvcGVuZWQgb3IgY2xvc2VkLiBBZGRpbmcgYSBVSSBlbGVtZW50IHRvIG9wZW4gYW5kIGNsb3NlIHRoZSBzZWxlY3RvciBpcyB0aGUgcGFyZW50J3MgY29tcG9uZW50IHJlc3BvbnNpYmlsaXR5LlxuICAgKi9cbiAgQElucHV0KCkgaXNTZWxlY3Rvck9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgcmVhY3Rpb25zIG9mIGEgW21lc3NhZ2VdKC4uL3R5cGVzL3N0cmVhbS1tZXNzYWdlLm1keCksIHVzZWQgdG8gZGlzcGxheSB0aGUgdXNlcnMgb2YgYSByZWFjdGlvbiB0eXBlLlxuICAgKi9cbiAgQElucHV0KCkgbGF0ZXN0UmVhY3Rpb25zOiBSZWFjdGlvblJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W10gPSBbXTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgdGhlIHVzZXIncyBvd24gcmVhY3Rpb25zIG9mIGEgW21lc3NhZ2VdKC4uL3R5cGVzL3N0cmVhbS1tZXNzYWdlLm1keCksIHVzZWQgdG8gZGlzcGxheSB0aGUgdXNlcnMgb2YgYSByZWFjdGlvbiB0eXBlLlxuICAgKi9cbiAgQElucHV0KCkgb3duUmVhY3Rpb25zOiBSZWFjdGlvblJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W10gPSBbXTtcbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIG9wZW5lZCBvciBjbG9zZWQuIEFkZGluZyBhIFVJIGVsZW1lbnQgdG8gb3BlbiBhbmQgY2xvc2UgdGhlIHNlbGVjdG9yIGlzIHRoZSBwYXJlbnQncyBjb21wb25lbnQgcmVzcG9uc2liaWxpdHkuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgaXNTZWxlY3Rvck9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIHRvb2x0aXBQb3NpdGlvbnM6IHsgYXJyb3c6IG51bWJlcjsgdG9vbHRpcDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gIHRvb2x0aXBUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdG9yQ29udGFpbmVyJykgcHJpdmF0ZSBzZWxlY3RvckNvbnRhaW5lcjpcbiAgICB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICAgfCB1bmRlZmluZWQ7XG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdG9yVG9vbHRpcCcpIHByaXZhdGUgc2VsZWN0b3JUb29sdGlwOlxuICAgIHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgICB8IHVuZGVmaW5lZDtcbiAgY3VycmVudFRvb2x0aXBUYXJnZXQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICBzZWxlY3RlZFJlYWN0aW9uVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpc0xvYWRpbmcgPSB0cnVlO1xuICByZWFjdGlvbnM6IFJlYWN0aW9uUmVzcG9uc2VbXSA9IFtdO1xuICBzaG91bGRIYW5kbGVSZWFjdGlvbkNsaWNrID0gdHJ1ZTtcbiAgZXhpc3RpbmdSZWFjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIHJlYWN0aW9uc0NvdW50OiBudW1iZXIgPSAwO1xuICByZWFjdGlvbk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBpc1ZpZXdJbml0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VSZWFjdGlvbnNTZXJ2aWNlOiBNZXNzYWdlUmVhY3Rpb25zU2VydmljZSxcbiAgICBwdWJsaWMgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIHRoZW1lU2VydmljZTogVGhlbWVTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMubWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UucmVhY3Rpb25zJC5zdWJzY3JpYmUoKHJlYWN0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLnJlYWN0aW9uT3B0aW9ucyA9IE9iamVjdC5rZXlzKHJlYWN0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0RXhpc3RpbmdSZWFjdGlvbnMoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5pc1NlbGVjdG9yT3Blbikge1xuICAgICAgdGhpcy5pc1NlbGVjdG9yT3BlblxuICAgICAgICA/IHNldFRpbWVvdXQoKCkgPT4gdGhpcy53YXRjaEZvck91dHNpZGVDbGlja3MoKSkgLy8gc2V0VGltZW91dDogd2FpdCBmb3IgY3VycmVudCBjbGljayB0byBidWJibGUgdXAsIGFuZCBvbmx5IHdhdGNoIGZvciBjbGlja3MgYWZ0ZXIgdGhhdFxuICAgICAgICA6IHRoaXMuc3RvcFdhdGNoRm9yT3V0c2lkZUNsaWNrcygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlUmVhY3Rpb25Db3VudHMpIHtcbiAgICAgIHRoaXMuc2V0RXhpc3RpbmdSZWFjdGlvbnMoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubWVzc2FnZVJlYWN0aW9uQ291bnRzICYmIHRoaXMubWVzc2FnZVJlYWN0aW9uQ291bnRzKSB7XG4gICAgICBjb25zdCByZWFjdGlvbnNDb3VudCA9IE9iamVjdC5rZXlzKHRoaXMubWVzc2FnZVJlYWN0aW9uQ291bnRzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGtleSkgPT4gYWNjICsgKHRoaXMubWVzc2FnZVJlYWN0aW9uQ291bnRzW2tleV0gfHwgMCksXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICB0aGlzLnNob3VsZEhhbmRsZVJlYWN0aW9uQ2xpY2sgPVxuICAgICAgICByZWFjdGlvbnNDb3VudCA8PSBDaGFubmVsU2VydmljZS5NQVhfTUVTU0FHRV9SRUFDVElPTlNfVE9fRkVUQ0ggfHxcbiAgICAgICAgISF0aGlzLm1lc3NhZ2VSZWFjdGlvbnNTZXJ2aWNlLmN1c3RvbVJlYWN0aW9uQ2xpY2tIYW5kbGVyO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzVmlld0luaXRlZCA9IHRydWU7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRleHQgJiYgIXRoaXMudG9vbHRpcFBvc2l0aW9ucykge1xuICAgICAgdGhpcy5zZXRUb29sdGlwUG9zaXRpb24oKTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgZ2V0TGF0ZXN0VXNlckJ5UmVhY3Rpb24ocmVhY3Rpb25UeXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMubGF0ZXN0UmVhY3Rpb25zLmZpbmQoKHIpID0+IHIudHlwZSA9PT0gcmVhY3Rpb25UeXBlICYmIHIudXNlcilcbiAgICAgID8udXNlcjtcbiAgfVxuXG4gIGdldEVtb2ppQnlSZWFjdGlvbihyZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlUmVhY3Rpb25zU2VydmljZS5yZWFjdGlvbnNbcmVhY3Rpb25UeXBlXTtcbiAgfVxuXG4gIHJlYWN0aW9uU2VsZWN0ZWQocmVhY3Rpb25UeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSGFuZGxlUmVhY3Rpb25DbGljaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50aGVtZVNlcnZpY2UudGhlbWVWZXJzaW9uID09PSAnMScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tZXNzYWdlUmVhY3Rpb25zU2VydmljZS5jdXN0b21SZWFjdGlvbkNsaWNrSGFuZGxlcikge1xuICAgICAgdGhpcy5tZXNzYWdlUmVhY3Rpb25zU2VydmljZS5jdXN0b21SZWFjdGlvbkNsaWNrSGFuZGxlcih7XG4gICAgICAgIG1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlSWQsXG4gICAgICAgIHJlYWN0aW9uVHlwZTogcmVhY3Rpb25UeXBlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWFjdGlvblR5cGUgPSByZWFjdGlvblR5cGU7XG4gICAgICB2b2lkIHRoaXMuZmV0Y2hBbGxSZWFjdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICBnZXRVc2Vyc0J5UmVhY3Rpb24ocmVhY3Rpb25UeXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMubGF0ZXN0UmVhY3Rpb25zXG4gICAgICAuZmlsdGVyKChyKSA9PiByLnR5cGUgPT09IHJlYWN0aW9uVHlwZSlcbiAgICAgIC5tYXAoKHIpID0+IHIudXNlcj8ubmFtZSB8fCByLnVzZXI/LmlkKVxuICAgICAgLmZpbHRlcigoaSkgPT4gISFpKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cblxuICBnZXRBbGxVc2Vyc0J5UmVhY3Rpb24oXG4gICAgcmVhY3Rpb25UeXBlPzogTWVzc2FnZVJlYWN0aW9uVHlwZVxuICApOiBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXSB7XG4gICAgaWYgKCFyZWFjdGlvblR5cGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VycyA9IHRoaXMucmVhY3Rpb25zXG4gICAgICAuZmlsdGVyKChyKSA9PiByLnR5cGUgPT09IHJlYWN0aW9uVHlwZSlcbiAgICAgIC5tYXAoKHIpID0+IHIudXNlcilcbiAgICAgIC5maWx0ZXIoKGkpID0+ICEhaSkgYXMgVXNlclJlc3BvbnNlW107XG5cbiAgICB1c2Vycy5zb3J0KCh1MSwgdTIpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUxID0gdTEubmFtZT8udG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IG5hbWUyID0gdTIubmFtZT8udG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKCFuYW1lMSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFuYW1lMikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lMSA9PT0gbmFtZTIpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lMSA8IG5hbWUyKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgc2hvd1Rvb2x0aXAoZXZlbnQ6IEV2ZW50LCByZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICB0aGlzLmN1cnJlbnRUb29sdGlwVGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMudG9vbHRpcFRleHQgPSB0aGlzLmdldFVzZXJzQnlSZWFjdGlvbihyZWFjdGlvblR5cGUpO1xuICB9XG5cbiAgaGlkZVRvb2x0aXAoKSB7XG4gICAgdGhpcy50b29sdGlwVGV4dCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRUb29sdGlwVGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudG9vbHRpcFBvc2l0aW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyYWNrQnlNZXNzYWdlUmVhY3Rpb24oaW5kZXg6IG51bWJlciwgaXRlbTogTWVzc2FnZVJlYWN0aW9uVHlwZSkge1xuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbiAgdHJhY2tCeVVzZXJJZChpbmRleDogbnVtYmVyLCBpdGVtOiBVc2VyUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxuXG4gIGFzeW5jIHJlYWN0KHR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICB0aGlzLm93blJlYWN0aW9ucy5maW5kKChyKSA9PiByLnR5cGUgPT09IHR5cGUpXG4gICAgICA/IGF3YWl0IHRoaXMuY2hhbm5lbFNlcnZpY2UucmVtb3ZlUmVhY3Rpb24odGhpcy5tZXNzYWdlSWQhLCB0eXBlKVxuICAgICAgOiBhd2FpdCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmFkZFJlYWN0aW9uKHRoaXMubWVzc2FnZUlkISwgdHlwZSk7XG4gICAgdGhpcy5pc1NlbGVjdG9yT3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIGlzT3duUmVhY3Rpb24ocmVhY3Rpb25UeXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlKSB7XG4gICAgcmV0dXJuICEhdGhpcy5vd25SZWFjdGlvbnMuZmluZCgocikgPT4gci50eXBlID09PSByZWFjdGlvblR5cGUpO1xuICB9XG5cbiAgaXNPcGVuQ2hhbmdlID0gKGlzT3BlbjogYm9vbGVhbikgPT4ge1xuICAgIHRoaXMuc2VsZWN0ZWRSZWFjdGlvblR5cGUgPSBpc09wZW4gPyB0aGlzLnNlbGVjdGVkUmVhY3Rpb25UeXBlIDogdW5kZWZpbmVkO1xuICB9O1xuXG4gIHByaXZhdGUgZXZlbnRIYW5kbGVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIGlmICghdGhpcy5zZWxlY3RvckNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgIHRoaXMuaXNTZWxlY3Rvck9wZW5DaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgd2F0Y2hGb3JPdXRzaWRlQ2xpY2tzKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZXZlbnRIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFdhdGNoRm9yT3V0c2lkZUNsaWNrcygpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmV2ZW50SGFuZGxlcik7XG4gIH1cblxuICBwcml2YXRlIHNldFRvb2x0aXBQb3NpdGlvbigpIHtcbiAgICBjb25zdCB0b29sdGlwID0gdGhpcy5zZWxlY3RvclRvb2x0aXA/Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jdXJyZW50VG9vbHRpcFRhcmdldD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBjb250YWluZXIgPVxuICAgICAgdGhpcy5zZWxlY3RvckNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmICghdG9vbHRpcCB8fCAhdGFyZ2V0IHx8ICFjb250YWluZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHRvb2x0aXBQb3NpdGlvbiA9XG4gICAgICB0b29sdGlwLndpZHRoID09PSBjb250YWluZXIud2lkdGggfHwgdG9vbHRpcC54IDwgY29udGFpbmVyLnhcbiAgICAgICAgPyAwXG4gICAgICAgIDogdGFyZ2V0LmxlZnQgKyB0YXJnZXQud2lkdGggLyAyIC0gY29udGFpbmVyLmxlZnQgLSB0b29sdGlwLndpZHRoIC8gMjtcblxuICAgIGNvbnN0IGFycm93UG9zaXRpb24gPVxuICAgICAgdGFyZ2V0LnggLSB0b29sdGlwLnggKyB0YXJnZXQud2lkdGggLyAyIC0gdG9vbHRpcFBvc2l0aW9uO1xuXG4gICAgdGhpcy50b29sdGlwUG9zaXRpb25zID0ge1xuICAgICAgdG9vbHRpcDogdG9vbHRpcFBvc2l0aW9uLFxuICAgICAgYXJyb3c6IGFycm93UG9zaXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hBbGxSZWFjdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVhY3Rpb25zID0gYXdhaXQgdGhpcy5jaGFubmVsU2VydmljZS5nZXRNZXNzYWdlUmVhY3Rpb25zKFxuICAgICAgICB0aGlzLm1lc3NhZ2VJZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlYWN0aW9uVHlwZSA9IHVuZGVmaW5lZDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RXhpc3RpbmdSZWFjdGlvbnMoKSB7XG4gICAgdGhpcy5leGlzdGluZ1JlYWN0aW9ucyA9IE9iamVjdC5rZXlzKHRoaXMubWVzc2FnZVJlYWN0aW9uQ291bnRzKVxuICAgICAgLmZpbHRlcigoaykgPT4gdGhpcy5yZWFjdGlvbk9wdGlvbnMuaW5kZXhPZihrKSAhPT0gLTEpXG4gICAgICAuZmlsdGVyKChrKSA9PiB0aGlzLm1lc3NhZ2VSZWFjdGlvbkNvdW50c1trXSEgPiAwKTtcbiAgICB0aGlzLnJlYWN0aW9uc0NvdW50ID0gdGhpcy5leGlzdGluZ1JlYWN0aW9ucy5yZWR1Y2UoXG4gICAgICAodG90YWwsIHJlYWN0aW9uKSA9PiB0b3RhbCArIHRoaXMubWVzc2FnZVJlYWN0aW9uQ291bnRzW3JlYWN0aW9uXSEsXG4gICAgICAwXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdlxuICAqbmdJZj1cImV4aXN0aW5nUmVhY3Rpb25zLmxlbmd0aCA+IDBcIlxuICBkYXRhLXRlc3RpZD1cInJlYWN0aW9uLWxpc3RcIlxuICBjbGFzcz1cInN0ci1jaGF0X19yZWFjdGlvbi1saXN0IHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1jb250YWluZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX3JlYWN0aW9uLWxpc3QtLXJldmVyc2VdPVwidHJ1ZVwiXG4gIFtjbGFzcy5zdHItY2hhdF9fcmVhY3Rpb24tbGlzdC1oaWRkZW5dPVwiaXNTZWxlY3Rvck9wZW5cIlxuPlxuICA8dWwgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnNcIj5cbiAgICA8bGlcbiAgICAgICpuZ0Zvcj1cIlxuICAgICAgICBsZXQgcmVhY3Rpb25UeXBlIG9mIGV4aXN0aW5nUmVhY3Rpb25zO1xuICAgICAgICB0cmFja0J5OiB0cmFja0J5TWVzc2FnZVJlYWN0aW9uXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvblwiXG4gICAgICBkYXRhLXRlc3RjbGFzcz1cImVtb2ppXCJcbiAgICAgIFtuZ1N0eWxlXT1cInsgY3Vyc29yOiBzaG91bGRIYW5kbGVSZWFjdGlvbkNsaWNrID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnIH1cIlxuICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uLW93bl09XCJpc093blJlYWN0aW9uKHJlYWN0aW9uVHlwZSlcIlxuICAgICAgKGNsaWNrKT1cInJlYWN0aW9uU2VsZWN0ZWQocmVhY3Rpb25UeXBlKVwiXG4gICAgICAoa2V5dXAuZW50ZXIpPVwicmVhY3Rpb25TZWxlY3RlZChyZWFjdGlvblR5cGUpXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cImVtb2ppIHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uLWVtb2ppXCI+XG4gICAgICAgIHt7IGdldEVtb2ppQnlSZWFjdGlvbihyZWFjdGlvblR5cGUpIH19Jm5ic3A7XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhblxuICAgICAgICBkYXRhLXRlc3RjbGFzcz1cInJlYWN0aW9uLWxpc3QtcmVhY3Rpb24tY291bnRcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uLWNvdW50XCJcbiAgICAgID5cbiAgICAgICAge3sgbWVzc2FnZVJlYWN0aW9uQ291bnRzW3JlYWN0aW9uVHlwZV0gfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2xpPlxuICAgIDxsaT5cbiAgICAgIDxzcGFuXG4gICAgICAgIGRhdGEtdGVzdGlkPVwicmVhY3Rpb25zLWNvdW50XCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fcmVhY3Rpb24tbGlzdC0tY291bnRlclwiXG4gICAgICAgID57eyByZWFjdGlvbnNDb3VudCB9fTwvc3BhblxuICAgICAgPlxuICAgIDwvbGk+XG4gIDwvdWw+XG48L2Rpdj5cblxuPGRpdlxuICAqbmdJZj1cImlzU2VsZWN0b3JPcGVuXCJcbiAgI3NlbGVjdG9yQ29udGFpbmVyXG4gIGRhdGEtdGVzdGlkPVwicmVhY3Rpb24tc2VsZWN0b3JcIlxuICBjbGFzcz1cInN0ci1jaGF0X19yZWFjdGlvbi1zZWxlY3RvciBzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbi1zZWxlY3RvclwiXG4+XG4gIDxkaXZcbiAgICAqbmdJZj1cInRvb2x0aXBUZXh0XCJcbiAgICAjc2VsZWN0b3JUb29sdGlwXG4gICAgY2xhc3M9XCJzdHItY2hhdF9fcmVhY3Rpb24tc2VsZWN0b3ItdG9vbHRpcFwiXG4gICAgZGF0YS10ZXN0aWQ9XCJ0b29sdGlwXCJcbiAgICBbbmdTdHlsZV09XCJ7XG4gICAgICBsZWZ0OiB0b29sdGlwUG9zaXRpb25zPy50b29sdGlwICsgJ3B4JyxcbiAgICAgIHZpc2liaWxpdHk6IHRvb2x0aXBQb3NpdGlvbnMgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1xuICAgIH1cIlxuICA+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJhcnJvd1wiXG4gICAgICBbbmdTdHlsZV09XCJ7IGxlZnQ6IHRvb2x0aXBQb3NpdGlvbnM/LmFycm93ICsgJ3B4JyB9XCJcbiAgICA+PC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJsYXRlc3QtdXNlci11c2VybmFtZVwiPlxuICAgICAge3sgdG9vbHRpcFRleHQgfX1cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuICA8dWxcbiAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1saXN0IHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1vcHRpb25zXCJcbiAgPlxuICAgIDxsaVxuICAgICAgKm5nRm9yPVwiXG4gICAgICAgIGxldCByZWFjdGlvblR5cGUgb2YgcmVhY3Rpb25PcHRpb25zO1xuICAgICAgICB0cmFja0J5OiB0cmFja0J5TWVzc2FnZVJlYWN0aW9uXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJcbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLW9wdGlvblxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtbGlzdC1pdGVtXG4gICAgICAgIHN0ci1jaGF0X19lbW9qaVxuICAgICAgXCJcbiAgICAgIGRhdGEtdGVzdGNsYXNzPVwiZW1vamktb3B0aW9uXCJcbiAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtb3B0aW9uLXNlbGVjdGVkXT1cIlxuICAgICAgICBpc093blJlYWN0aW9uKHJlYWN0aW9uVHlwZSlcbiAgICAgIFwiXG4gICAgICAoY2xpY2spPVwicmVhY3QocmVhY3Rpb25UeXBlKVwiXG4gICAgICAoa2V5dXAuZW50ZXIpPVwicmVhY3QocmVhY3Rpb25UeXBlKVwiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImdldExhdGVzdFVzZXJCeVJlYWN0aW9uKHJlYWN0aW9uVHlwZSkgYXMgdXNlclwiXG4gICAgICAgIGNsYXNzPVwibGF0ZXN0LXVzZXIgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWxhc3QtdXNlclwiXG4gICAgICAgIGF0dHIuZGF0YS10ZXN0aWQ9XCJ7eyByZWFjdGlvblR5cGUgfX0tbGFzdC11c2VyXCJcbiAgICAgICAgKGNsaWNrKT1cImhpZGVUb29sdGlwKClcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwiaGlkZVRvb2x0aXAoKVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cInNob3dUb29sdGlwKCRldmVudCwgcmVhY3Rpb25UeXBlKVwiXG4gICAgICAgIChtb3VzZWxlYXZlKT1cImhpZGVUb29sdGlwKClcIlxuICAgICAgPlxuICAgICAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgICAgIGxvY2F0aW9uPVwicmVhY3Rpb25cIlxuICAgICAgICAgIGF0dHIuZGF0YS10ZXN0aWQ9XCJ7eyByZWFjdGlvblR5cGUgfX0tYXZhdGFyXCJcbiAgICAgICAgICBbaW1hZ2VVcmxdPVwidXNlci5pbWFnZVwiXG4gICAgICAgICAgW25hbWVdPVwidXNlci5uYW1lIHx8IHVzZXIuaWRcIlxuICAgICAgICAgIFtzaXplXT1cIjIwXCJcbiAgICAgICAgPjwvc3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICBlbW9qaVxuICAgICAgICAgIHN0ci1jaGF0X19lbW9qaS1zZWxlY3Rvci1lbW9qaS1hbmd1bGFyXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb24tZW1vamlcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgZ2V0RW1vamlCeVJlYWN0aW9uKHJlYWN0aW9uVHlwZSkgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgbWVzc2FnZVJlYWN0aW9uQ291bnRzW3JlYWN0aW9uVHlwZV0gJiZcbiAgICAgICAgICBtZXNzYWdlUmVhY3Rpb25Db3VudHNbcmVhY3Rpb25UeXBlXSEgPiAwXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWxpc3QtaXRlbV9fY291bnRcIlxuICAgICAgICBhdHRyLmRhdGEtdGVzdGlkPVwie3sgcmVhY3Rpb25UeXBlIH19LXJlYWN0aW9uLWNvdW50XCJcbiAgICAgID5cbiAgICAgICAge3sgbWVzc2FnZVJlYWN0aW9uQ291bnRzW3JlYWN0aW9uVHlwZV0gfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2xpPlxuICA8L3VsPlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFJlYWN0aW9uVHlwZVwiPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1vZGFsVGVtcGxhdGUkIHwgYXN5bmMpIHx8IGRlZmF1bHRNb2RhbDtcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgaXNPcGVuOiAhIXNlbGVjdGVkUmVhY3Rpb25UeXBlLFxuICAgICAgICBtZXNzYWdlSWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgcmVhY3Rpb25UeXBlOiBzZWxlY3RlZFJlYWN0aW9uVHlwZSxcbiAgICAgICAgaXNPcGVuQ2hhbmdlSGFuZGxlcjogaXNPcGVuQ2hhbmdlLFxuICAgICAgICBjb250ZW50OiBtb2RhbENvbnRlbnRcbiAgICAgIH1cbiAgICBcIlxuICA+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlXG4gICNkZWZhdWx0TW9kYWxcbiAgbGV0LWlzT3Blbj1cImlzT3BlblwiXG4gIGxldC1tZXNzYWdlSWQ9XCJtZXNzYWdlSWRcIlxuICBsZXQtcmVhY3Rpb25UeXBlPVwicmVhY3Rpb25UeXBlXCJcbiAgbGV0LWlzT3BlbkNoYW5nZUhhbmRsZXI9XCJpc09wZW5DaGFuZ2VIYW5kbGVyXCJcbiAgbGV0LWNvbnRlbnQ9XCJjb250ZW50XCJcbj5cbiAgPHN0cmVhbS1tb2RhbFxuICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWRldGFpbHMtbW9kYWxcIlxuICAgIFtpc09wZW5dPVwiaXNPcGVuXCJcbiAgICBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAoaXNPcGVuQ2hhbmdlKT1cImlzT3BlbkNoYW5nZUhhbmRsZXIoJGV2ZW50KVwiXG4gID5cbiAgPC9zdHJlYW0tbW9kYWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGFsQ29udGVudD5cbiAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1kZXRhaWxzXCI+XG4gICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1kZXRhaWxzLXJlYWN0aW9uLXR5cGVzXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgIGxldCByZWFjdGlvblR5cGUgb2YgZXhpc3RpbmdSZWFjdGlvbnM7XG4gICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU1lc3NhZ2VSZWFjdGlvblxuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1kZXRhaWxzLXJlYWN0aW9uLXR5cGVcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgY3Vyc29yOiBzaG91bGRIYW5kbGVSZWFjdGlvbkNsaWNrID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnXG4gICAgICAgIH1cIlxuICAgICAgICBhdHRyLmRhdGEtdGVzdGlkPVwicmVhY3Rpb24tZGV0YWlscy1zZWxlY3Rvci17eyByZWFjdGlvblR5cGUgfX1cIlxuICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWRldGFpbHMtcmVhY3Rpb24tdHlwZS0tc2VsZWN0ZWRdPVwiXG4gICAgICAgICAgcmVhY3Rpb25UeXBlID09PSBzZWxlY3RlZFJlYWN0aW9uVHlwZVxuICAgICAgICBcIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRSZWFjdGlvblR5cGUgPSByZWFjdGlvblR5cGU7IGFsbFVzZXJzLnNjcm9sbFRvcCA9IDBcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwiXG4gICAgICAgICAgc2VsZWN0ZWRSZWFjdGlvblR5cGUgPSByZWFjdGlvblR5cGU7IGFsbFVzZXJzLnNjcm9sbFRvcCA9IDBcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJlbW9qaSBzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbi1lbW9qaVwiPlxuICAgICAgICAgIHt7IGdldEVtb2ppQnlSZWFjdGlvbihyZWFjdGlvblR5cGUpIH19Jm5ic3A7XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbi1jb3VudFwiPlxuICAgICAgICAgIHt7IG1lc3NhZ2VSZWFjdGlvbkNvdW50c1tyZWFjdGlvblR5cGVdIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiXG4gICAgICAgIGVtb2ppXG4gICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uLWVtb2ppIHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uLWVtb2ppLWJpZ1xuICAgICAgXCJcbiAgICA+XG4gICAgICB7eyBnZXRFbW9qaUJ5UmVhY3Rpb24oc2VsZWN0ZWRSZWFjdGlvblR5cGUhKSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgICNhbGxVc2Vyc1xuICAgICAgZGF0YS10ZXN0aWQ9XCJhbGwtcmVhY3RpbmctdXNlcnNcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtZGV0YWlscy1yZWFjdGluZy11c2Vyc1wiXG4gICAgPlxuICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvclxuICAgICAgICAqbmdJZj1cImlzTG9hZGluZzsgZWxzZSByZWFjdGlvbnNcIlxuICAgICAgPjwvc3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yPlxuICAgICAgPG5nLXRlbXBsYXRlICNyZWFjdGlvbnM+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgIGxldCB1c2VyIG9mIGdldEFsbFVzZXJzQnlSZWFjdGlvbihzZWxlY3RlZFJlYWN0aW9uVHlwZSk7XG4gICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5VXNlcklkXG4gICAgICAgICAgXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1kZXRhaWxzLXJlYWN0aW5nLXVzZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiYXZhdGFyXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2F2YXRhciBzdHItY2hhdF9fYXZhdGFyLS1jaXJjbGVcIlxuICAgICAgICAgICAgdHlwZT1cInVzZXJcIlxuICAgICAgICAgICAgbG9jYXRpb249XCJyZWFjdGlvblwiXG4gICAgICAgICAgICBbc2l6ZV09XCIzMFwiXG4gICAgICAgICAgICBbaW1hZ2VVcmxdPVwidXNlci5pbWFnZVwiXG4gICAgICAgICAgICBbbmFtZV09XCJ1c2VyLm5hbWVcIlxuICAgICAgICAgICAgW3VzZXJdPVwidXNlclwiXG4gICAgICAgICAgPjwvc3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlcj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJyZWFjdGlvbi11c2VyLXVzZXJuYW1lXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3VzZXItaXRlbS0tbmFtZVwiXG4gICAgICAgICAgICA+e3sgdXNlci5uYW1lIH19PC9zcGFuXG4gICAgICAgICAgPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
package/{esm2015/lib/message-reactions.service.js → esm2020/lib/message-reactions.service.mjs}
RENAMED
|
@@ -34,9 +34,9 @@ export class MessageReactionsService {
|
|
|
34
34
|
return this.reactions$.getValue();
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
-
MessageReactionsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
38
|
-
MessageReactionsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
39
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
37
|
+
MessageReactionsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageReactionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
38
|
+
MessageReactionsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageReactionsService, providedIn: 'root' });
|
|
39
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageReactionsService, decorators: [{
|
|
40
40
|
type: Injectable,
|
|
41
41
|
args: [{
|
|
42
42
|
providedIn: 'root',
|
|
@@ -15,12 +15,12 @@ export class MessageService {
|
|
|
15
15
|
this.displayAs = 'text';
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
-
MessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
19
|
-
MessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
20
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
18
|
+
MessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
19
|
+
MessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageService, providedIn: 'root' });
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageService, decorators: [{
|
|
21
21
|
type: Injectable,
|
|
22
22
|
args: [{
|
|
23
23
|
providedIn: 'root',
|
|
24
24
|
}]
|
|
25
25
|
}], ctorParameters: function () { return []; } });
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUzQzs7R0FFRztBQUlILE1BQU0sT0FBTyxjQUFjO0lBaUJ6QjtRQWhCQTs7Ozs7O1dBTUc7UUFDSCxjQUFTLEdBQW9CLE1BQU0sQ0FBQztJQVNyQixDQUFDOzsyR0FqQkwsY0FBYzsrR0FBZCxjQUFjLGNBRmIsTUFBTTsyRkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBUaGUgbWVzc2FnZSBzZXJ2aWNlIGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGRpc3BsYXlpbmcgdGhlIG1lc3NhZ2UgY29udGVudFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZVNlcnZpY2Uge1xuICAvKipcbiAgICogRGVjaWRlcyBpZiB0aGUgbWVzc2FnZSBjb250ZW50IHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgdGV4dCBvciBIVE1MXG4gICAqXG4gICAqIElmIHlvdSBkaXNwbGF5IG1lc3NhZ2VzIGFzIHRleHQgdGhlIGZvbGxvd2luZyBwYXJ0cyBhcmUgc3RpbGwgYmUgZGlzcGxheWVkIGFzIEhUTUw6XG4gICAqIC0gdXNlciBtZW50aW9ucyAtPiB5b3UgY2FuIGN1c3RvbWl6ZSB0aGlzIHdpdGggeW91ciBvd24gdGVtcGxhdGUgdXNpbmcgdGhlIFtgY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZW50aW9uVGVtcGxhdGUkYF0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0N1c3RvbVRlbXBsYXRlc1NlcnZpY2UvI21lbnRpb250ZW1wbGF0ZSlcbiAgICogLSBsaW5rcyAtPiB5b3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGJ5IHByb3ZpZGluZyB5b3Ugb3duIFtgY3VzdG9tTGlua1JlbmRlcmVyYF0oI2N1c3RvbWxpbmtyZW5kZXJlcikgbWV0aG9kXG4gICAqL1xuICBkaXNwbGF5QXM6ICd0ZXh0JyB8ICdodG1sJyA9ICd0ZXh0JztcblxuICAvKipcbiAgICogWW91IGNhbiBwcm92aWRlIGEgY3VzdG9tIG1ldGhvZCB0byBkaXNwbGF5IGxpbmtzXG4gICAqIEBwYXJhbSB1cmwgdGhlIHVybCB0aGUgbGluayBzaG91bGQgcmVmZXIgdG9cbiAgICogQHJldHVybnMgdGhlIEhUTUwgbWFya3VwIGFzIGEgc3RyaW5nIGZvciB0aGUgbGlua1xuICAgKi9cbiAgY3VzdG9tTGlua1JlbmRlcmVyPzogKHVybDogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxufVxuIl19
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
import * as i2 from "../icon-placeholder/icon-placeholder.component";
|
|
5
|
+
/**
|
|
6
|
+
* 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.
|
|
7
|
+
*/
|
|
8
|
+
export class ModalComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
/**
|
|
11
|
+
* If `true` the modal will be displayed, if `false` the modal will be hidden
|
|
12
|
+
*/
|
|
13
|
+
this.isOpen = false;
|
|
14
|
+
/**
|
|
15
|
+
* Emits `true` if the modal becomes visible, and `false` if the modal is closed.
|
|
16
|
+
*/
|
|
17
|
+
this.isOpenChange = new EventEmitter();
|
|
18
|
+
this.watchForEscPress = (event) => {
|
|
19
|
+
if (event.key === 'Escape') {
|
|
20
|
+
this.close();
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
this.stopWatchForEscPress = () => {
|
|
24
|
+
window.removeEventListener('keyup', this.watchForEscPress);
|
|
25
|
+
};
|
|
26
|
+
this.watchForOutsideClicks = (event) => {
|
|
27
|
+
if (!this.innerContainer?.nativeElement.contains(event.target)) {
|
|
28
|
+
this.close();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
ngOnChanges(changes) {
|
|
33
|
+
if (changes.isOpen) {
|
|
34
|
+
if (this.isOpen) {
|
|
35
|
+
window.addEventListener('keyup', this.watchForEscPress);
|
|
36
|
+
setTimeout(() => window.addEventListener('click', this.watchForOutsideClicks), 0);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
this.stopWatchForOutsideClicks();
|
|
40
|
+
this.stopWatchForEscPress();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
close() {
|
|
45
|
+
this.isOpen = false;
|
|
46
|
+
this.isOpenChange.emit(false);
|
|
47
|
+
this.stopWatchForOutsideClicks();
|
|
48
|
+
this.stopWatchForEscPress();
|
|
49
|
+
}
|
|
50
|
+
stopWatchForOutsideClicks() {
|
|
51
|
+
window.removeEventListener('click', this.watchForOutsideClicks);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
ModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
55
|
+
ModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", 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, 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 >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </div>\n <div #modalInner class=\"str-chat__modal__inner\">\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", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }] });
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ModalComponent, decorators: [{
|
|
57
|
+
type: Component,
|
|
58
|
+
args: [{ selector: 'stream-modal', 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 >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </div>\n <div #modalInner class=\"str-chat__modal__inner\">\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" }]
|
|
59
|
+
}], ctorParameters: function () { return []; }, propDecorators: { isOpen: [{
|
|
60
|
+
type: Input
|
|
61
|
+
}], content: [{
|
|
62
|
+
type: Input
|
|
63
|
+
}], isOpenChange: [{
|
|
64
|
+
type: Output
|
|
65
|
+
}], innerContainer: [{
|
|
66
|
+
type: ViewChild,
|
|
67
|
+
args: ['modalInner']
|
|
68
|
+
}] } });
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21vZGFsL21vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tb2RhbC9tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUdOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQzs7OztBQUV2Qjs7R0FFRztBQU1ILE1BQU0sT0FBTyxjQUFjO0lBaUJ6QjtRQWhCQTs7V0FFRztRQUNNLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFLeEI7O1dBRUc7UUFDZ0IsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBNkJ0RCxxQkFBZ0IsR0FBRyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtZQUNsRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO2dCQUMxQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDZDtRQUNILENBQUMsQ0FBQztRQUVNLHlCQUFvQixHQUFHLEdBQUcsRUFBRTtZQUNsQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQztRQUVNLDBCQUFxQixHQUFHLENBQUMsS0FBWSxFQUFFLEVBQUU7WUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBYyxDQUFDLEVBQUU7Z0JBQ3RFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNkO1FBQ0gsQ0FBQyxDQUFDO0lBdENhLENBQUM7SUFFaEIsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNsQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDeEQsVUFBVSxDQUNSLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQ2xFLENBQUMsQ0FDRixDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQzdCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFrQk8seUJBQXlCO1FBQy9CLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDbEUsQ0FBQzs7MkdBM0RVLGNBQWM7K0ZBQWQsY0FBYyxvUkNwQjNCLDhuQkFxQkE7MkZERGEsY0FBYztrQkFMMUIsU0FBUzsrQkFDRSxjQUFjOzBFQVFmLE1BQU07c0JBQWQsS0FBSztnQkFJRyxPQUFPO3NCQUFmLEtBQUs7Z0JBSWEsWUFBWTtzQkFBOUIsTUFBTTtnQkFDMEIsY0FBYztzQkFBOUMsU0FBUzt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogVGhlIGBNb2RhbGAgY29tcG9uZW50IGRpc3BsYXlzIGl0cyBjb250ZW50IGluIGFuIG92ZXJsYXkuIFRoZSBtb2RhbCBjYW4gYmUgY2xvc2VkIHdpdGggYSBjbG9zZSBidXR0b24sIGlmIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBtb2RhbCBjb250ZW50LCBvciBpZiB0aGUgZXNjYXBlIGJ1dHRvbiBpcyBwcmVzc2VkLiBUaGUgbW9kYWwgY2FuIGFsc28gYmUgY2xvc2VkIGZyb20gb3V0c2lkZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogSWYgYHRydWVgIHRoZSBtb2RhbCB3aWxsIGJlIGRpc3BsYXllZCwgaWYgYGZhbHNlYCB0aGUgbW9kYWwgd2lsbCBiZSBoaWRkZW5cbiAgICovXG4gIEBJbnB1dCgpIGlzT3BlbiA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1vZGFsICAoY2FuIGFsc28gYmUgcHJvdmlkZWQgdXNpbmcgYG5nLWNvbnRlbnRgKVxuICAgKi9cbiAgQElucHV0KCkgY29udGVudDogVGVtcGxhdGVSZWY8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBFbWl0cyBgdHJ1ZWAgaWYgdGhlIG1vZGFsIGJlY29tZXMgdmlzaWJsZSwgYW5kIGBmYWxzZWAgaWYgdGhlIG1vZGFsIGlzIGNsb3NlZC5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBpc09wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBWaWV3Q2hpbGQoJ21vZGFsSW5uZXInKSBwcml2YXRlIGlubmVyQ29udGFpbmVyOlxuICAgIHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgICB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmlzT3Blbikge1xuICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMud2F0Y2hGb3JFc2NQcmVzcyk7XG4gICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgKCkgPT4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy53YXRjaEZvck91dHNpZGVDbGlja3MpLFxuICAgICAgICAgIDBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RvcFdhdGNoRm9yT3V0c2lkZUNsaWNrcygpO1xuICAgICAgICB0aGlzLnN0b3BXYXRjaEZvckVzY1ByZXNzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmlzT3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLnN0b3BXYXRjaEZvck91dHNpZGVDbGlja3MoKTtcbiAgICB0aGlzLnN0b3BXYXRjaEZvckVzY1ByZXNzKCk7XG4gIH1cblxuICBwcml2YXRlIHdhdGNoRm9yRXNjUHJlc3MgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0b3BXYXRjaEZvckVzY1ByZXNzID0gKCkgPT4ge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMud2F0Y2hGb3JFc2NQcmVzcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSB3YXRjaEZvck91dHNpZGVDbGlja3MgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgaWYgKCF0aGlzLmlubmVyQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0b3BXYXRjaEZvck91dHNpZGVDbGlja3MoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy53YXRjaEZvck91dHNpZGVDbGlja3MpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGRhdGEtdGVzdGlkPVwibW9kYWxcIlxuICBjbGFzcz1cInN0ci1jaGF0X19tb2RhbCBzdHItY2hhdF9fbW9kYWwtLXt7IGlzT3BlbiA/ICdvcGVuJyA6ICdjbG9zZScgfX1cIlxuPlxuICA8ZGl2XG4gICAgZGF0YS10ZXN0aWQ9XCJjbG9zZVwiXG4gICAgY2xhc3M9XCJzdHItY2hhdF9fbW9kYWxfX2Nsb3NlLWJ1dHRvblwiXG4gICAgKGNsaWNrKT1cImNsb3NlKClcIlxuICAgIChrZXl1cC5lbnRlcik9XCJjbG9zZSgpXCJcbiAgPlxuICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlciBpY29uPVwiY2xvc2VcIj48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICA8L2Rpdj5cbiAgPGRpdiAjbW9kYWxJbm5lciBjbGFzcz1cInN0ci1jaGF0X19tb2RhbF9faW5uZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudDsgZWxzZSBlbHNlQ29udGVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2Vsc2VDb250ZW50PlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
/**
|
|
5
|
+
* The `Notification` component displays a notification within the [`NotificationList`](./NotificationListComponent.mdx)
|
|
6
|
+
*/
|
|
7
|
+
export class NotificationComponent {
|
|
8
|
+
constructor() { }
|
|
9
|
+
}
|
|
10
|
+
NotificationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: NotificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
11
|
+
NotificationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: NotificationComponent, selector: "stream-notification", inputs: { type: "type", content: "content" }, ngImport: i0, template: "<div\n data-testid=\"custom-notification\"\n class=\"str-chat__custom-notification notification-{{\n type\n }} str-chat__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", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: NotificationComponent, decorators: [{
|
|
13
|
+
type: Component,
|
|
14
|
+
args: [{ selector: 'stream-notification', template: "<div\n data-testid=\"custom-notification\"\n class=\"str-chat__custom-notification notification-{{\n type\n }} str-chat__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" }]
|
|
15
|
+
}], ctorParameters: function () { return []; }, propDecorators: { type: [{
|
|
16
|
+
type: Input
|
|
17
|
+
}], content: [{
|
|
18
|
+
type: Input
|
|
19
|
+
}] } });
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFlLE1BQU0sZUFBZSxDQUFDOzs7QUFHOUQ7O0dBRUc7QUFNSCxNQUFNLE9BQU8scUJBQXFCO0lBVWhDLGdCQUFlLENBQUM7O2tIQVZMLHFCQUFxQjtzR0FBckIscUJBQXFCLHlHQ1hsQyxxWEFhQTsyRkRGYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UscUJBQXFCOzBFQVF0QixJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBOb3RpZmljYXRpb25gIGNvbXBvbmVudCBkaXNwbGF5cyBhIG5vdGlmaWNhdGlvbiB3aXRoaW4gdGhlIFtgTm90aWZpY2F0aW9uTGlzdGBdKC4vTm90aWZpY2F0aW9uTGlzdENvbXBvbmVudC5tZHgpXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1ub3RpZmljYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vbm90aWZpY2F0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBub3RpZmljYXRpb25cbiAgICovXG4gIEBJbnB1dCgpIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgbm90aWZpY2F0aW9uIChjYW4gYWxzbyBiZSBwcm92aWRlZCB1c2luZyBgbmctY29udGVudGApXG4gICAqL1xuICBASW5wdXQoKSBjb250ZW50OiBUZW1wbGF0ZVJlZjx2b2lkPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG59XG4iLCI8ZGl2XG4gIGRhdGEtdGVzdGlkPVwiY3VzdG9tLW5vdGlmaWNhdGlvblwiXG4gIGNsYXNzPVwic3RyLWNoYXRfX2N1c3RvbS1ub3RpZmljYXRpb24gbm90aWZpY2F0aW9uLXt7XG4gICAgdHlwZVxuICB9fSBzdHItY2hhdF9fbm90aWZpY2F0aW9uXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ7IGVsc2UgZWxzZUNvbnRlbnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNlbHNlQ29udGVudD5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../custom-templates.service";
|
|
4
|
+
import * as i2 from "../notification.service";
|
|
5
|
+
import * as i3 from "../theme.service";
|
|
6
|
+
import * as i4 from "@angular/common";
|
|
7
|
+
import * as i5 from "../notification/notification.component";
|
|
8
|
+
import * as i6 from "@ngx-translate/core";
|
|
9
|
+
/**
|
|
10
|
+
* The `NotificationList` component displays the list of active notifications.
|
|
11
|
+
*/
|
|
12
|
+
export class NotificationListComponent {
|
|
13
|
+
constructor(customTemplatesService, notificationService, themeService) {
|
|
14
|
+
this.customTemplatesService = customTemplatesService;
|
|
15
|
+
this.notificationService = notificationService;
|
|
16
|
+
this.themeService = themeService;
|
|
17
|
+
this.notifications$ = this.notificationService.notifications$;
|
|
18
|
+
this.theme$ = this.themeService.theme$;
|
|
19
|
+
this.themeVersion = this.themeService.themeVersion;
|
|
20
|
+
}
|
|
21
|
+
trackById(_, item) {
|
|
22
|
+
return item.id;
|
|
23
|
+
}
|
|
24
|
+
getNotificationContentContext(notification) {
|
|
25
|
+
return {
|
|
26
|
+
...notification.templateContext,
|
|
27
|
+
dismissFn: notification.dismissFn,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
NotificationListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: NotificationListComponent, deps: [{ token: i1.CustomTemplatesService }, { token: i2.NotificationService }, { token: i3.ThemeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
32
|
+
NotificationListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: NotificationListComponent, selector: "stream-notification-list", ngImport: i0, template: "<div\n data-testid=\"notification-list\"\n class=\"str-chat__theme-{{ theme$ | async }} str-chat__list-notifications\"\n [class.str-chat]=\"themeVersion === '2'\"\n>\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", dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.NotificationComponent, selector: "stream-notification", inputs: ["type", "content"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
|
|
33
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: NotificationListComponent, decorators: [{
|
|
34
|
+
type: Component,
|
|
35
|
+
args: [{ selector: 'stream-notification-list', template: "<div\n data-testid=\"notification-list\"\n class=\"str-chat__theme-{{ theme$ | async }} str-chat__list-notifications\"\n [class.str-chat]=\"themeVersion === '2'\"\n>\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" }]
|
|
36
|
+
}], ctorParameters: function () { return [{ type: i1.CustomTemplatesService }, { type: i2.NotificationService }, { type: i3.ThemeService }]; } });
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL25vdGlmaWNhdGlvbi1saXN0L25vdGlmaWNhdGlvbi1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9ub3RpZmljYXRpb24tbGlzdC9ub3RpZmljYXRpb24tbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQU8xQzs7R0FFRztBQU1ILE1BQU0sT0FBTyx5QkFBeUI7SUFLcEMsWUFDa0Isc0JBQThDLEVBQ3RELG1CQUF3QyxFQUN4QyxZQUEwQjtRQUZsQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQ3RELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFFbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDO1FBQzlELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztJQUNyRCxDQUFDO0lBRUQsU0FBUyxDQUFDLENBQVMsRUFBRSxJQUF5QjtRQUM1QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELDZCQUE2QixDQUFDLFlBQWlDO1FBQzdELE9BQU87WUFDTCxHQUFHLFlBQVksQ0FBQyxlQUFlO1lBQy9CLFNBQVMsRUFBRSxZQUFZLENBQUMsU0FBUztTQUNsQyxDQUFDO0lBQ0osQ0FBQzs7c0hBeEJVLHlCQUF5QjswR0FBekIseUJBQXlCLGdFQ2Z0Qyw2d0NBcUNBOzJGRHRCYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ub3RpZmljYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi90aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblBheWxvYWQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBOb3RpZmljYXRpb25MaXN0YCBjb21wb25lbnQgZGlzcGxheXMgdGhlIGxpc3Qgb2YgYWN0aXZlIG5vdGlmaWNhdGlvbnMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1ub3RpZmljYXRpb24tbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub3RpZmljYXRpb24tbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbkxpc3RDb21wb25lbnQge1xuICBub3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb25QYXlsb2FkW10+O1xuICB0aGVtZVZlcnNpb246ICcxJyB8ICcyJztcbiAgdGhlbWUkOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25zJCA9IHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5ub3RpZmljYXRpb25zJDtcbiAgICB0aGlzLnRoZW1lJCA9IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lJDtcbiAgICB0aGlzLnRoZW1lVmVyc2lvbiA9IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lVmVyc2lvbjtcbiAgfVxuXG4gIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IE5vdGlmaWNhdGlvblBheWxvYWQpIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxuXG4gIGdldE5vdGlmaWNhdGlvbkNvbnRlbnRDb250ZXh0KG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uUGF5bG9hZCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5ub3RpZmljYXRpb24udGVtcGxhdGVDb250ZXh0LFxuICAgICAgZGlzbWlzc0ZuOiBub3RpZmljYXRpb24uZGlzbWlzc0ZuLFxuICAgIH07XG4gIH1cbn1cbiIsIjxkaXZcbiAgZGF0YS10ZXN0aWQ9XCJub3RpZmljYXRpb24tbGlzdFwiXG4gIGNsYXNzPVwic3RyLWNoYXRfX3RoZW1lLXt7IHRoZW1lJCB8IGFzeW5jIH19IHN0ci1jaGF0X19saXN0LW5vdGlmaWNhdGlvbnNcIlxuICBbY2xhc3Muc3RyLWNoYXRdPVwidGhlbWVWZXJzaW9uID09PSAnMidcIlxuPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nRm9yPVwibGV0IG5vdGlmaWNhdGlvbiBvZiBub3RpZmljYXRpb25zJCB8IGFzeW5jOyB0cmFja0J5OiB0cmFja0J5SWRcIlxuICA+XG4gICAgPG5nLXRlbXBsYXRlICNub3RpZmljYXRpb25Db250ZW50PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIm5vdGlmaWNhdGlvbi50ZXh0ICE9PSB1bmRlZmluZWRcIlxuICAgICAgICBkYXRhLXRlc3RjbGFzcz1cIm5vdGlmaWNhdGlvbi1jb250ZW50XCJcbiAgICAgID5cbiAgICAgICAge3sgbm90aWZpY2F0aW9uLnRleHQgfCB0cmFuc2xhdGU6IG5vdGlmaWNhdGlvbi50cmFuc2xhdGVQYXJhbXMgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vdGlmaWNhdGlvbi50ZW1wbGF0ZSAhPT0gdW5kZWZpbmVkXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgbm90aWZpY2F0aW9uLnRlbXBsYXRlO1xuICAgICAgICAgICAgY29udGV4dDogZ2V0Tm90aWZpY2F0aW9uQ29udGVudENvbnRleHQobm90aWZpY2F0aW9uKVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2Uubm90aWZpY2F0aW9uVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgZGVmYXVsdE5vdGlmaWNhdGlvbjtcbiAgICAgICAgY29udGV4dDogeyB0eXBlOiBub3RpZmljYXRpb24udHlwZSwgY29udGVudDogbm90aWZpY2F0aW9uQ29udGVudCB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Tm90aWZpY2F0aW9uIGxldC10eXBlPVwidHlwZVwiIGxldC1jb250ZW50PVwiY29udGVudFwiPlxuICA8c3RyZWFtLW5vdGlmaWNhdGlvbiBbdHlwZV09XCJ0eXBlXCIgW2NvbnRlbnRdPVwiY29udGVudFwiPjwvc3RyZWFtLW5vdGlmaWNhdGlvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|