stream-chat-angular 6.0.0-beta.5 → 6.0.0-rc.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/README.md +2 -2
- package/assets/i18n/en.d.ts +0 -1
- package/assets/version.d.ts +1 -1
- package/{esm2022 → esm2020}/assets/i18n/en.mjs +1 -2
- package/{esm2022 → esm2020}/assets/version.mjs +2 -2
- package/esm2020/lib/attachment-configuration.service.mjs +182 -0
- package/esm2020/lib/attachment-list/attachment-list.component.mjs +232 -0
- package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
- package/esm2020/lib/attachment.service.mjs +481 -0
- package/esm2020/lib/avatar/avatar.component.mjs +160 -0
- package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +66 -0
- package/esm2020/lib/channel/channel.component.mjs +45 -0
- package/esm2020/lib/channel-header/channel-header.component.mjs +72 -0
- package/esm2020/lib/channel-list/channel-list.component.mjs +47 -0
- package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
- package/esm2020/lib/channel-query.mjs +77 -0
- package/esm2020/lib/channel.service.mjs +1561 -0
- package/esm2020/lib/chat-client.service.mjs +233 -0
- package/esm2020/lib/custom-templates.service.mjs +244 -0
- package/{esm2022 → esm2020}/lib/date-parser.service.mjs +5 -5
- package/esm2020/lib/file-utils.mjs +35 -0
- package/{esm2022 → esm2020}/lib/get-channel-display-text.mjs +1 -1
- package/esm2020/lib/get-message-translation.mjs +12 -0
- package/esm2020/lib/icon/icon-placeholder/icon-placeholder.component.mjs +28 -0
- package/{esm2022 → esm2020}/lib/icon/icon.component.mjs +5 -5
- package/{esm2022 → esm2020}/lib/icon/icon.module.mjs +11 -11
- package/{esm2022 → esm2020}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
- package/esm2020/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +20 -0
- package/{esm2022 → esm2020}/lib/list-users.mjs +1 -1
- package/esm2020/lib/message/message.component.mjs +486 -0
- package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +123 -0
- package/esm2020/lib/message-actions.service.mjs +187 -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 +333 -0
- package/{esm2022 → esm2020}/lib/message-input/emoji-input.service.mjs +7 -7
- package/esm2020/lib/message-input/message-input-config.service.mjs +50 -0
- package/esm2020/lib/message-input/message-input.component.mjs +507 -0
- package/{esm2022 → esm2020}/lib/message-input/textarea/textarea.component.mjs +6 -6
- package/{esm2022 → esm2020}/lib/message-input/textarea.directive.mjs +5 -5
- package/{esm2022 → esm2020}/lib/message-input/voice-recorder.service.mjs +5 -5
- package/{esm2022 → esm2020}/lib/message-list/group-styles.mjs +1 -1
- package/esm2020/lib/message-list/message-list.component.mjs +717 -0
- package/esm2020/lib/message-preview.mjs +21 -0
- package/esm2020/lib/message-reactions/message-reactions.component.mjs +168 -0
- package/esm2020/lib/message-reactions-selector/message-reactions-selector.component.mjs +61 -0
- package/{esm2022 → esm2020}/lib/message-reactions.service.mjs +6 -6
- package/esm2020/lib/message-text/message-text.component.mjs +143 -0
- package/esm2020/lib/message.service.mjs +43 -0
- package/{esm2022 → esm2020}/lib/modal/modal.component.mjs +6 -6
- package/esm2020/lib/notification/notification.component.mjs +20 -0
- package/esm2020/lib/notification-list/notification-list.component.mjs +36 -0
- package/{esm2022 → esm2020}/lib/notification.service.mjs +6 -6
- package/esm2020/lib/paginated-list/paginated-list.component.mjs +94 -0
- package/{esm2022 → esm2020}/lib/parse-date.mjs +1 -1
- package/esm2020/lib/read-by.mjs +12 -0
- package/esm2020/lib/stream-autocomplete-textarea.module.mjs +33 -0
- package/{esm2022 → esm2020}/lib/stream-avatar.module.mjs +5 -5
- package/{esm2022 → esm2020}/lib/stream-chat.module.mjs +59 -59
- package/{esm2022 → esm2020}/lib/stream-i18n.service.mjs +6 -6
- package/esm2020/lib/stream-textarea.module.mjs +31 -0
- package/{esm2022 → esm2020}/lib/theme.service.mjs +6 -6
- package/esm2020/lib/thread/thread.component.mjs +51 -0
- package/{esm2022 → esm2020}/lib/transliteration.service.mjs +5 -5
- package/esm2020/lib/types-custom.mjs +2 -0
- package/esm2020/lib/types.mjs +2 -0
- package/esm2020/lib/user-list/user-list.component.mjs +47 -0
- package/esm2020/lib/virtualized-list.service.mjs +271 -0
- package/{esm2022 → esm2020}/lib/virtualized-message-list.service.mjs +1 -1
- package/{esm2022 → esm2020}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
- package/{esm2022 → esm2020}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
- package/{esm2022 → esm2020}/lib/voice-recorder/media-recorder.mjs +1 -1
- package/esm2020/lib/voice-recorder/mp3-transcoder.mjs +61 -0
- package/esm2020/lib/voice-recorder/transcoder.service.mjs +121 -0
- package/esm2020/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +35 -0
- package/esm2020/lib/voice-recorder/voice-recorder.component.mjs +80 -0
- package/{esm2022 → esm2020}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
- package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +112 -0
- package/esm2020/lib/voice-recording/voice-recording.component.mjs +91 -0
- package/{esm2022 → esm2020}/lib/voice-recording/voice-recording.module.mjs +5 -5
- package/{esm2022 → esm2020}/lib/wave-form-sampler.mjs +1 -1
- package/esm2020/public-api.mjs +86 -0
- package/esm2020/stream-chat.mjs +2 -0
- package/fesm2015/stream-chat-angular.mjs +9171 -0
- package/fesm2015/stream-chat-angular.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/stream-chat-angular.mjs +1251 -961
- package/fesm2020/stream-chat-angular.mjs.map +1 -0
- package/lib/attachment-configuration.service.d.ts +12 -12
- package/lib/attachment-list/attachment-list.component.d.ts +15 -10
- package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
- package/lib/attachment.service.d.ts +12 -10
- package/lib/avatar/avatar.component.d.ts +7 -7
- package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +5 -5
- package/lib/channel/channel.component.d.ts +1 -1
- package/lib/channel-header/channel-header.component.d.ts +2 -2
- package/lib/channel-list/channel-list.component.d.ts +3 -4
- package/lib/channel-preview/channel-preview.component.d.ts +6 -6
- package/lib/channel-query.d.ts +26 -0
- package/lib/channel.service.d.ts +146 -154
- package/lib/chat-client.service.d.ts +17 -15
- package/lib/custom-templates.service.d.ts +50 -50
- package/lib/get-channel-display-text.d.ts +1 -2
- package/lib/get-message-translation.d.ts +3 -3
- package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +2 -2
- package/lib/icon/icon.component.d.ts +2 -2
- package/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
- package/lib/message/message.component.d.ts +6 -6
- package/lib/message-actions-box/message-actions-box.component.d.ts +5 -4
- package/lib/message-actions.service.d.ts +10 -10
- package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
- package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +5 -5
- package/lib/message-input/emoji-input.service.d.ts +2 -2
- package/lib/message-input/message-input-config.service.d.ts +3 -3
- package/lib/message-input/message-input.component.d.ts +10 -33
- package/lib/message-input/textarea/textarea.component.d.ts +3 -3
- 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 +3 -2
- package/lib/message-preview.d.ts +2 -3
- package/lib/message-reactions/message-reactions.component.d.ts +9 -8
- package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +6 -5
- package/lib/message-reactions.service.d.ts +4 -4
- package/lib/message-text/message-text.component.d.ts +5 -5
- package/lib/message.service.d.ts +6 -7
- package/lib/modal/modal.component.d.ts +1 -1
- package/lib/notification/notification.component.d.ts +2 -2
- package/lib/notification-list/notification-list.component.d.ts +1 -0
- package/lib/notification.service.d.ts +1 -1
- package/lib/paginated-list/paginated-list.component.d.ts +2 -5
- package/lib/read-by.d.ts +1 -2
- package/lib/stream-i18n.service.d.ts +1 -1
- package/lib/theme.service.d.ts +1 -1
- package/lib/thread/thread.component.d.ts +3 -3
- package/lib/types-custom.d.ts +15 -0
- package/lib/types.d.ts +116 -155
- package/lib/user-list/user-list.component.d.ts +2 -3
- package/lib/virtualized-message-list.service.d.ts +1 -1
- package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
- package/lib/voice-recorder/media-recorder.d.ts +2 -2
- package/lib/voice-recorder/transcoder.service.d.ts +4 -4
- package/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.d.ts +1 -0
- package/lib/voice-recorder/voice-recorder.component.d.ts +2 -2
- package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +3 -3
- package/lib/voice-recording/voice-recording.component.d.ts +2 -3
- package/package.json +21 -15
- package/public-api.d.ts +3 -0
- package/src/assets/i18n/en.ts +0 -1
- package/src/assets/version.ts +1 -1
- package/esm2022/lib/attachment-configuration.service.mjs +0 -185
- package/esm2022/lib/attachment-list/attachment-list.component.mjs +0 -212
- package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
- package/esm2022/lib/attachment.service.mjs +0 -479
- package/esm2022/lib/avatar/avatar.component.mjs +0 -157
- package/esm2022/lib/avatar-placeholder/avatar-placeholder.component.mjs +0 -66
- package/esm2022/lib/channel/channel.component.mjs +0 -45
- package/esm2022/lib/channel-header/channel-header.component.mjs +0 -72
- package/esm2022/lib/channel-list/channel-list.component.mjs +0 -50
- package/esm2022/lib/channel-preview/channel-preview.component.mjs +0 -150
- package/esm2022/lib/channel.service.mjs +0 -1393
- package/esm2022/lib/chat-client.service.mjs +0 -227
- package/esm2022/lib/custom-templates.service.mjs +0 -244
- package/esm2022/lib/file-utils.mjs +0 -35
- package/esm2022/lib/get-message-translation.mjs +0 -12
- package/esm2022/lib/icon/icon-placeholder/icon-placeholder.component.mjs +0 -28
- package/esm2022/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +0 -20
- package/esm2022/lib/message/message.component.mjs +0 -486
- package/esm2022/lib/message-actions-box/message-actions-box.component.mjs +0 -120
- package/esm2022/lib/message-actions.service.mjs +0 -187
- package/esm2022/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +0 -71
- package/esm2022/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +0 -333
- package/esm2022/lib/message-input/message-input-config.service.mjs +0 -50
- package/esm2022/lib/message-input/message-input.component.mjs +0 -507
- package/esm2022/lib/message-list/message-list.component.mjs +0 -715
- package/esm2022/lib/message-preview.mjs +0 -21
- package/esm2022/lib/message-reactions/message-reactions.component.mjs +0 -165
- package/esm2022/lib/message-reactions-selector/message-reactions-selector.component.mjs +0 -57
- package/esm2022/lib/message-text/message-text.component.mjs +0 -143
- package/esm2022/lib/message.service.mjs +0 -43
- package/esm2022/lib/notification/notification.component.mjs +0 -20
- package/esm2022/lib/notification-list/notification-list.component.mjs +0 -33
- package/esm2022/lib/paginated-list/paginated-list.component.mjs +0 -94
- package/esm2022/lib/read-by.mjs +0 -12
- package/esm2022/lib/stream-autocomplete-textarea.module.mjs +0 -33
- package/esm2022/lib/stream-textarea.module.mjs +0 -31
- package/esm2022/lib/thread/thread.component.mjs +0 -51
- package/esm2022/lib/types.mjs +0 -2
- package/esm2022/lib/user-list/user-list.component.mjs +0 -47
- package/esm2022/lib/virtualized-list.service.mjs +0 -273
- package/esm2022/lib/voice-recorder/mp3-transcoder.mjs +0 -61
- package/esm2022/lib/voice-recorder/transcoder.service.mjs +0 -121
- package/esm2022/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +0 -32
- package/esm2022/lib/voice-recorder/voice-recorder.component.mjs +0 -80
- package/esm2022/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +0 -112
- package/esm2022/lib/voice-recording/voice-recording.component.mjs +0 -91
- package/esm2022/public-api.mjs +0 -82
- package/fesm2022/stream-chat-angular.mjs.map +0 -1
- /package/{esm2022 → esm2020}/lib/format-duration.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/injection-tokens.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/is-image-attachment.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/is-on-separate-date.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/is-safari.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/message-input/textarea.interface.mjs +0 -0
- /package/{esm2022 → esm2020}/stream-chat-angular.mjs +0 -0
|
@@ -1,21 +0,0 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1wcmV2aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtcHJldmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwQyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUdsQyxJQUFrQixFQUNsQixJQUFZLEVBQ1osY0FBK0IsRUFBRSxFQUNqQyxpQkFBb0MsRUFBRSxFQUN0QyxXQUErQixTQUFTLEVBQ3hDLGtCQUFzQyxTQUFTLEVBQy9DLFVBQWlELEVBQ2pELEVBQUU7SUFDRixNQUFNLFlBQVksR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQztJQUU5QyxPQUFPO1FBQ0wsTUFBTSxFQUFFLElBQUk7UUFDWixVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUU7UUFDdEIsSUFBSSxFQUFFLElBQUk7UUFDVixFQUFFLEVBQUUsWUFBWTtRQUNoQixTQUFTLEVBQUUsRUFBRTtRQUNiLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLElBQUk7UUFDSixJQUFJLEVBQUUsU0FBUztRQUNmLElBQUk7UUFDSixXQUFXO1FBQ1gsZUFBZSxFQUFFLGNBQWM7UUFDL0IsU0FBUyxFQUFFLFFBQVE7UUFDbkIsaUJBQWlCLEVBQUUsZUFBZTtRQUNsQyxHQUFHLFVBQVU7S0FDbUIsQ0FBQztBQUNyQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdHRhY2htZW50LCBNZXNzYWdlUmVzcG9uc2UsIFVzZXJSZXNwb25zZSB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTWVzc2FnZVByZXZpZXcgPSA8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyxcbj4oXG4gIHVzZXI6IFVzZXJSZXNwb25zZSxcbiAgdGV4dDogc3RyaW5nLFxuICBhdHRhY2htZW50czogQXR0YWNobWVudDxUPltdID0gW10sXG4gIG1lbnRpb25lZFVzZXJzOiBVc2VyUmVzcG9uc2U8VD5bXSA9IFtdLFxuICBwYXJlbnRJZDogdW5kZWZpbmVkIHwgc3RyaW5nID0gdW5kZWZpbmVkLFxuICBxdW90ZWRNZXNzYWdlSWQ6IHVuZGVmaW5lZCB8IHN0cmluZyA9IHVuZGVmaW5lZCxcbiAgY3VzdG9tRGF0YTogdW5kZWZpbmVkIHwgUGFydGlhbDxUWydtZXNzYWdlVHlwZSddPixcbikgPT4ge1xuICBjb25zdCBjbGllbnRTaWRlSWQgPSBgJHt1c2VyLmlkfS0ke3V1aWR2NCgpfWA7XG5cbiAgcmV0dXJuIHtcbiAgICBfX2h0bWw6IHRleHQsXG4gICAgY3JlYXRlZF9hdDogbmV3IERhdGUoKSxcbiAgICBodG1sOiB0ZXh0LFxuICAgIGlkOiBjbGllbnRTaWRlSWQsXG4gICAgcmVhY3Rpb25zOiBbXSxcbiAgICBzdGF0dXM6ICdzZW5kaW5nJyxcbiAgICB0ZXh0LFxuICAgIHR5cGU6ICdyZWd1bGFyJyxcbiAgICB1c2VyLFxuICAgIGF0dGFjaG1lbnRzLFxuICAgIG1lbnRpb25lZF91c2VyczogbWVudGlvbmVkVXNlcnMsXG4gICAgcGFyZW50X2lkOiBwYXJlbnRJZCxcbiAgICBxdW90ZWRfbWVzc2FnZV9pZDogcXVvdGVkTWVzc2FnZUlkLFxuICAgIC4uLmN1c3RvbURhdGEsXG4gIH0gYXMgdW5rbm93biBhcyBNZXNzYWdlUmVzcG9uc2U8VD47XG59O1xuIl19
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { Component, Input, ViewChild, } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../message-reactions.service";
|
|
4
|
-
import * as i2 from "../custom-templates.service";
|
|
5
|
-
import * as i3 from "@angular/common";
|
|
6
|
-
import * as i4 from "../modal/modal.component";
|
|
7
|
-
import * as i5 from "../user-list/user-list.component";
|
|
8
|
-
/**
|
|
9
|
-
* The `MessageReactions` component displays the reactions of a message. You can read more about [message reactions](/chat/docs/javascript/send_reaction/) in the platform documentation.
|
|
10
|
-
*/
|
|
11
|
-
export class MessageReactionsComponent {
|
|
12
|
-
constructor(cdRef, messageReactionsService, customTemplatesService) {
|
|
13
|
-
this.cdRef = cdRef;
|
|
14
|
-
this.messageReactionsService = messageReactionsService;
|
|
15
|
-
this.customTemplatesService = customTemplatesService;
|
|
16
|
-
/**
|
|
17
|
-
* 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)
|
|
18
|
-
*/
|
|
19
|
-
this.messageReactionGroups = undefined;
|
|
20
|
-
/**
|
|
21
|
-
* 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)
|
|
22
|
-
* @deprecated use `messageReactionGroups`
|
|
23
|
-
*/
|
|
24
|
-
this.messageReactionCounts = {};
|
|
25
|
-
/**
|
|
26
|
-
* List of reactions of a [message](/chat/docs/sdk/angular/types/stream-message/), used to display the users of a reaction type.
|
|
27
|
-
* @deprecated you can fetch the reactions using [`messageReactionsService.queryReactions()`](/chat/docs/sdk/angular/services/MessageReactionsService/#queryreactions)
|
|
28
|
-
*/
|
|
29
|
-
this.latestReactions = [];
|
|
30
|
-
/**
|
|
31
|
-
* List of the user's own reactions of a [message](/chat/docs/sdk/angular/types/stream-message/), used to display the users of a reaction type.
|
|
32
|
-
*/
|
|
33
|
-
this.ownReactions = [];
|
|
34
|
-
this.isLoading = true;
|
|
35
|
-
this.reactions = [];
|
|
36
|
-
this.shouldHandleReactionClick = true;
|
|
37
|
-
this.existingReactions = [];
|
|
38
|
-
this.reactionOptions = [];
|
|
39
|
-
this.usersByReactions = {};
|
|
40
|
-
this.subscriptions = [];
|
|
41
|
-
this.isViewInited = false;
|
|
42
|
-
this.isOpenChange = (isOpen) => {
|
|
43
|
-
this.selectedReactionType = isOpen ? this.selectedReactionType : undefined;
|
|
44
|
-
if (!isOpen) {
|
|
45
|
-
this.usersByReactions = {};
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
ngOnChanges(changes) {
|
|
50
|
-
if (changes.messageReactionCounts || changes.messageReactionGroups) {
|
|
51
|
-
if (this.messageReactionCounts && !this.messageReactionGroups) {
|
|
52
|
-
this.messageReactionGroups = {};
|
|
53
|
-
Object.keys(this.messageReactionCounts).forEach((k) => {
|
|
54
|
-
this.messageReactionGroups[k] = {
|
|
55
|
-
count: this.messageReactionCounts?.[k] ?? 0,
|
|
56
|
-
sum_scores: this.messageReactionCounts?.[k] ?? 0,
|
|
57
|
-
first_reaction_at: undefined,
|
|
58
|
-
last_reaction_at: undefined,
|
|
59
|
-
};
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
this.setExistingReactions();
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
ngOnInit() {
|
|
66
|
-
this.subscriptions.push(this.messageReactionsService.reactions$.subscribe((reactions) => {
|
|
67
|
-
this.reactionOptions = Object.keys(reactions);
|
|
68
|
-
this.setExistingReactions();
|
|
69
|
-
if (this.isViewInited) {
|
|
70
|
-
this.cdRef.detectChanges();
|
|
71
|
-
}
|
|
72
|
-
}));
|
|
73
|
-
}
|
|
74
|
-
ngAfterViewInit() {
|
|
75
|
-
this.isViewInited = true;
|
|
76
|
-
}
|
|
77
|
-
ngOnDestroy() {
|
|
78
|
-
this.subscriptions.forEach((s) => s.unsubscribe());
|
|
79
|
-
}
|
|
80
|
-
getEmojiByReaction(reactionType) {
|
|
81
|
-
return this.messageReactionsService.reactions[reactionType];
|
|
82
|
-
}
|
|
83
|
-
async reactionSelected(reactionType) {
|
|
84
|
-
if (!this.messageId) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
if (this.messageReactionsService.customReactionClickHandler) {
|
|
88
|
-
this.messageReactionsService.customReactionClickHandler({
|
|
89
|
-
messageId: this.messageId,
|
|
90
|
-
reactionType: reactionType,
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
this.selectedReactionType = reactionType;
|
|
95
|
-
if (!this.usersByReactions[this.selectedReactionType]) {
|
|
96
|
-
this.usersByReactions[this.selectedReactionType] = {
|
|
97
|
-
users: [],
|
|
98
|
-
};
|
|
99
|
-
await this.loadNextPageOfReactions();
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
async loadNextPageOfReactions() {
|
|
104
|
-
if (!this.messageId || !this.selectedReactionType) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
this.isLoading = true;
|
|
108
|
-
try {
|
|
109
|
-
const response = await this.messageReactionsService.queryReactions(this.messageId, this.selectedReactionType, this.usersByReactions[this.selectedReactionType].next);
|
|
110
|
-
this.usersByReactions[this.selectedReactionType].users = [
|
|
111
|
-
...this.usersByReactions[this.selectedReactionType].users,
|
|
112
|
-
...response.reactions
|
|
113
|
-
.map((r) => r.user)
|
|
114
|
-
.filter((u) => !!u),
|
|
115
|
-
];
|
|
116
|
-
this.usersByReactions[this.selectedReactionType].next = response.next;
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
this.selectedReactionType = undefined;
|
|
120
|
-
}
|
|
121
|
-
finally {
|
|
122
|
-
this.isLoading = false;
|
|
123
|
-
}
|
|
124
|
-
if (this.isViewInited) {
|
|
125
|
-
this.cdRef.detectChanges();
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
isOwnReaction(reactionType) {
|
|
129
|
-
return !!this.ownReactions.find((r) => r.type === reactionType);
|
|
130
|
-
}
|
|
131
|
-
setExistingReactions() {
|
|
132
|
-
this.existingReactions = Object.keys(this.messageReactionGroups ?? {})
|
|
133
|
-
.filter((k) => this.reactionOptions.indexOf(k) !== -1)
|
|
134
|
-
.filter((k) => this.messageReactionGroups[k].count > 0)
|
|
135
|
-
.sort((r1, r2) => {
|
|
136
|
-
const date1 = this.messageReactionGroups[r1].first_reaction_at
|
|
137
|
-
? new Date(this.messageReactionGroups[r1].first_reaction_at)
|
|
138
|
-
: new Date();
|
|
139
|
-
const date2 = this.messageReactionGroups[r2].first_reaction_at
|
|
140
|
-
? new Date(this.messageReactionGroups[r2].first_reaction_at)
|
|
141
|
-
: new Date();
|
|
142
|
-
return date1.getTime() - date2.getTime();
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageReactionsComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.MessageReactionsService }, { token: i2.CustomTemplatesService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
146
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.0", type: MessageReactionsComponent, selector: "stream-message-reactions", inputs: { messageId: "messageId", messageReactionGroups: "messageReactionGroups", messageReactionCounts: "messageReactionCounts", latestReactions: "latestReactions", ownReactions: "ownReactions" }, viewQueries: [{ propertyName: "selectorContainer", first: true, predicate: ["selectorContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (existingReactions.length > 0) {\n <div\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 >\n <ul class=\"str-chat__message-reactions\">\n @for (reactionType of existingReactions; track reactionType) {\n <li\n class=\"str-chat__message-reaction\"\n data-testclass=\"emoji\"\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 {{ messageReactionGroups?.[reactionType]?.count ?? 0 }}\n </span>\n </li>\n }\n </ul>\n </div>\n}\n\n@if (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 />\n}\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</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 @for (reactionType of existingReactions; track reactionType) {\n <div\n class=\"str-chat__message-reactions-details-reaction-type\"\n attr.data-testid=\"reaction-details-selector-{{ reactionType }}\"\n [class.str-chat__message-reactions-details-reaction-type--selected]=\"\n reactionType === selectedReactionType\n \"\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 class=\"str-chat__message-reaction-count\">\n {{ messageReactionGroups?.[reactionType]?.count ?? 0 }}\n </span>\n </div>\n }\n </div>\n <div\n class=\"emoji str-chat__message-reaction-emoji str-chat__message-reaction-emoji-big\"\n >\n {{ getEmojiByReaction(selectedReactionType!) }}\n </div>\n <div\n data-testid=\"all-reacting-users\"\n class=\"str-chat__message-reactions-details-reacting-users\"\n >\n @for (reactionType of existingReactions; track reactionType) {\n <stream-user-list\n attr.data-testid=\"{{ reactionType }}-user-list\"\n [style.display]=\"\n selectedReactionType === reactionType ? 'block' : 'none'\n \"\n [users]=\"usersByReactions[reactionType]?.users || []\"\n [isLoading]=\"isLoading\"\n [hasMore]=\"!!usersByReactions[reactionType]?.next || false\"\n (loadMore)=\"loadNextPageOfReactions()\"\n />\n }\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }, { kind: "component", type: i5.UserListComponent, selector: "stream-user-list", inputs: ["users", "isLoading", "hasMore"], outputs: ["loadMore"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
|
|
147
|
-
}
|
|
148
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageReactionsComponent, decorators: [{
|
|
149
|
-
type: Component,
|
|
150
|
-
args: [{ selector: 'stream-message-reactions', template: "@if (existingReactions.length > 0) {\n <div\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 >\n <ul class=\"str-chat__message-reactions\">\n @for (reactionType of existingReactions; track reactionType) {\n <li\n class=\"str-chat__message-reaction\"\n data-testclass=\"emoji\"\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 {{ messageReactionGroups?.[reactionType]?.count ?? 0 }}\n </span>\n </li>\n }\n </ul>\n </div>\n}\n\n@if (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 />\n}\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</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 @for (reactionType of existingReactions; track reactionType) {\n <div\n class=\"str-chat__message-reactions-details-reaction-type\"\n attr.data-testid=\"reaction-details-selector-{{ reactionType }}\"\n [class.str-chat__message-reactions-details-reaction-type--selected]=\"\n reactionType === selectedReactionType\n \"\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 class=\"str-chat__message-reaction-count\">\n {{ messageReactionGroups?.[reactionType]?.count ?? 0 }}\n </span>\n </div>\n }\n </div>\n <div\n class=\"emoji str-chat__message-reaction-emoji str-chat__message-reaction-emoji-big\"\n >\n {{ getEmojiByReaction(selectedReactionType!) }}\n </div>\n <div\n data-testid=\"all-reacting-users\"\n class=\"str-chat__message-reactions-details-reacting-users\"\n >\n @for (reactionType of existingReactions; track reactionType) {\n <stream-user-list\n attr.data-testid=\"{{ reactionType }}-user-list\"\n [style.display]=\"\n selectedReactionType === reactionType ? 'block' : 'none'\n \"\n [users]=\"usersByReactions[reactionType]?.users || []\"\n [isLoading]=\"isLoading\"\n [hasMore]=\"!!usersByReactions[reactionType]?.next || false\"\n (loadMore)=\"loadNextPageOfReactions()\"\n />\n }\n </div>\n </div>\n</ng-template>\n" }]
|
|
151
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.MessageReactionsService }, { type: i2.CustomTemplatesService }], propDecorators: { messageId: [{
|
|
152
|
-
type: Input
|
|
153
|
-
}], messageReactionGroups: [{
|
|
154
|
-
type: Input
|
|
155
|
-
}], messageReactionCounts: [{
|
|
156
|
-
type: Input
|
|
157
|
-
}], latestReactions: [{
|
|
158
|
-
type: Input
|
|
159
|
-
}], ownReactions: [{
|
|
160
|
-
type: Input
|
|
161
|
-
}], selectorContainer: [{
|
|
162
|
-
type: ViewChild,
|
|
163
|
-
args: ['selectorContainer']
|
|
164
|
-
}] } });
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1yZWFjdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtcmVhY3Rpb25zL21lc3NhZ2UtcmVhY3Rpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLXJlYWN0aW9ucy9tZXNzYWdlLXJlYWN0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUVULEtBQUssRUFLTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7QUFXdkI7O0dBRUc7QUFLSCxNQUFNLE9BQU8seUJBQXlCO0lBMkNwQyxZQUNVLEtBQXdCLEVBQ3hCLHVCQUFnRCxFQUNqRCxzQkFBOEM7UUFGN0MsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNqRCwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBdkN2RDs7V0FFRztRQUNNLDBCQUFxQixHQUVkLFNBQVMsQ0FBQztRQUMxQjs7O1dBR0c7UUFDTSwwQkFBcUIsR0FDNUIsRUFBRSxDQUFDO1FBQ0w7OztXQUdHO1FBQ00sb0JBQWUsR0FBa0QsRUFBRSxDQUFDO1FBQzdFOztXQUVHO1FBQ00saUJBQVksR0FBa0QsRUFBRSxDQUFDO1FBSzFFLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsY0FBUyxHQUF1QixFQUFFLENBQUM7UUFDbkMsOEJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLHNCQUFpQixHQUFhLEVBQUUsQ0FBQztRQUNqQyxvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUMvQixxQkFBZ0IsR0FFWixFQUFFLENBQUM7UUFDQyxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFDbkMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFzRzdCLGlCQUFZLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMzRSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNYLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7YUFDNUI7UUFDSCxDQUFDLENBQUM7SUFyR0MsQ0FBQztJQUVKLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUU7WUFDbEUsSUFBSSxJQUFJLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7Z0JBQzdELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ3BELElBQUksQ0FBQyxxQkFBc0IsQ0FBQyxDQUFDLENBQUMsR0FBRzt3QkFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7d0JBQzNDLFVBQVUsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3dCQUNoRCxpQkFBaUIsRUFBRSxTQUFTO3dCQUM1QixnQkFBZ0IsRUFBRSxTQUFTO3FCQUM1QixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDOUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUM1QjtRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxZQUFpQztRQUNsRCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFvQjtRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQywwQkFBMEIsRUFBRTtZQUMzRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsMEJBQTBCLENBQUM7Z0JBQ3RELFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsWUFBWSxFQUFFLFlBQVk7YUFDM0IsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLENBQUM7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRTtnQkFDckQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHO29CQUNqRCxLQUFLLEVBQUUsRUFBRTtpQkFDVixDQUFDO2dCQUNGLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7YUFDdEM7U0FDRjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQ2pELE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUk7WUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQ2hFLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLG9CQUFvQixFQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUN0RCxDQUFDO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEtBQUssR0FBRztnQkFDdkQsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsS0FBSztnQkFDekQsR0FBSSxRQUFRLENBQUMsU0FBUztxQkFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3FCQUNsQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQW9CO2FBQ3pDLENBQUM7WUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDdkU7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7U0FDdkM7Z0JBQVM7WUFDUixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUN4QjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxZQUFpQztRQUM3QyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBU08sb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUM7YUFDbkUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZELElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUNmLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxpQkFBaUI7Z0JBQzdELENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXNCLENBQUMsRUFBRSxDQUFDLENBQUMsaUJBQWtCLENBQUM7Z0JBQzlELENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQjtnQkFDN0QsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxpQkFBa0IsQ0FBQztnQkFDOUQsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFFZixPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzhHQXBLVSx5QkFBeUI7a0dBQXpCLHlCQUF5QixtWkM3QnRDLG9vSEEyR0E7OzJGRDlFYSx5QkFBeUI7a0JBSnJDLFNBQVM7K0JBQ0UsMEJBQTBCO2lLQVMzQixTQUFTO3NCQUFqQixLQUFLO2dCQUlHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFPRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBTUcsZUFBZTtzQkFBdkIsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNrQyxpQkFBaUI7c0JBQXhELFNBQVM7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBSZWFjdGlvbkdyb3VwUmVzcG9uc2UsXG4gIFJlYWN0aW9uUmVzcG9uc2UsXG4gIFVzZXJSZXNwb25zZSxcbn0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgTWVzc2FnZVJlYWN0aW9uVHlwZSwgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE1lc3NhZ2VSZWFjdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vbWVzc2FnZS1yZWFjdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFRoZSBgTWVzc2FnZVJlYWN0aW9uc2AgY29tcG9uZW50IGRpc3BsYXlzIHRoZSByZWFjdGlvbnMgb2YgYSBtZXNzYWdlLiBZb3UgY2FuIHJlYWQgbW9yZSBhYm91dCBbbWVzc2FnZSByZWFjdGlvbnNdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC9zZW5kX3JlYWN0aW9uLykgaW4gdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLXJlYWN0aW9ucycsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLXJlYWN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VSZWFjdGlvbnNDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdGhlIHJlYWN0aW9ucyBiZWxvbmcgdG9cbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByZWFjdGlvbnMgZ3JvdXBlZCBieSBbcmVhY3Rpb24gdHlwZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9HZXRTdHJlYW0vc3RyZWFtLWNoYXQtYW5ndWxhci90cmVlL21hc3Rlci9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS1yZWFjdGlvbnMvbWVzc2FnZS1yZWFjdGlvbnMuY29tcG9uZW50LnRzKVxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZVJlYWN0aW9uR3JvdXBzOlxuICAgIHwgeyBba2V5OiBzdHJpbmddOiBSZWFjdGlvbkdyb3VwUmVzcG9uc2UgfVxuICAgIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByZWFjdGlvbnMgZ3JvdXBlZCBieSBbcmVhY3Rpb24gdHlwZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9HZXRTdHJlYW0vc3RyZWFtLWNoYXQtYW5ndWxhci90cmVlL21hc3Rlci9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS1yZWFjdGlvbnMvbWVzc2FnZS1yZWFjdGlvbnMuY29tcG9uZW50LnRzKVxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYG1lc3NhZ2VSZWFjdGlvbkdyb3Vwc2BcbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2VSZWFjdGlvbkNvdW50czogeyBba2V5IGluIE1lc3NhZ2VSZWFjdGlvblR5cGVdPzogbnVtYmVyIH0gPVxuICAgIHt9O1xuICAvKipcbiAgICogTGlzdCBvZiByZWFjdGlvbnMgb2YgYSBbbWVzc2FnZV0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci90eXBlcy9zdHJlYW0tbWVzc2FnZS8pLCB1c2VkIHRvIGRpc3BsYXkgdGhlIHVzZXJzIG9mIGEgcmVhY3Rpb24gdHlwZS5cbiAgICogQGRlcHJlY2F0ZWQgeW91IGNhbiBmZXRjaCB0aGUgcmVhY3Rpb25zIHVzaW5nIFtgbWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UucXVlcnlSZWFjdGlvbnMoKWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvTWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UvI3F1ZXJ5cmVhY3Rpb25zKVxuICAgKi9cbiAgQElucHV0KCkgbGF0ZXN0UmVhY3Rpb25zOiBSZWFjdGlvblJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W10gPSBbXTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgdGhlIHVzZXIncyBvd24gcmVhY3Rpb25zIG9mIGEgW21lc3NhZ2VdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvdHlwZXMvc3RyZWFtLW1lc3NhZ2UvKSwgdXNlZCB0byBkaXNwbGF5IHRoZSB1c2VycyBvZiBhIHJlYWN0aW9uIHR5cGUuXG4gICAqL1xuICBASW5wdXQoKSBvd25SZWFjdGlvbnM6IFJlYWN0aW9uUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXSA9IFtdO1xuICBAVmlld0NoaWxkKCdzZWxlY3RvckNvbnRhaW5lcicpIHByaXZhdGUgc2VsZWN0b3JDb250YWluZXI6XG4gICAgfCBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICAgIHwgdW5kZWZpbmVkO1xuICBzZWxlY3RlZFJlYWN0aW9uVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpc0xvYWRpbmcgPSB0cnVlO1xuICByZWFjdGlvbnM6IFJlYWN0aW9uUmVzcG9uc2VbXSA9IFtdO1xuICBzaG91bGRIYW5kbGVSZWFjdGlvbkNsaWNrID0gdHJ1ZTtcbiAgZXhpc3RpbmdSZWFjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIHJlYWN0aW9uT3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgdXNlcnNCeVJlYWN0aW9uczoge1xuICAgIFtrZXk6IHN0cmluZ106IHsgdXNlcnM6IFVzZXJSZXNwb25zZVtdOyBuZXh0Pzogc3RyaW5nIH07XG4gIH0gPSB7fTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGlzVmlld0luaXRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbWVzc2FnZVJlYWN0aW9uc1NlcnZpY2U6IE1lc3NhZ2VSZWFjdGlvbnNTZXJ2aWNlLFxuICAgIHB1YmxpYyBjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlOiBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLFxuICApIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLm1lc3NhZ2VSZWFjdGlvbkNvdW50cyB8fCBjaGFuZ2VzLm1lc3NhZ2VSZWFjdGlvbkdyb3Vwcykge1xuICAgICAgaWYgKHRoaXMubWVzc2FnZVJlYWN0aW9uQ291bnRzICYmICF0aGlzLm1lc3NhZ2VSZWFjdGlvbkdyb3Vwcykge1xuICAgICAgICB0aGlzLm1lc3NhZ2VSZWFjdGlvbkdyb3VwcyA9IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLm1lc3NhZ2VSZWFjdGlvbkNvdW50cykuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgIHRoaXMubWVzc2FnZVJlYWN0aW9uR3JvdXBzIVtrXSA9IHtcbiAgICAgICAgICAgIGNvdW50OiB0aGlzLm1lc3NhZ2VSZWFjdGlvbkNvdW50cz8uW2tdID8/IDAsXG4gICAgICAgICAgICBzdW1fc2NvcmVzOiB0aGlzLm1lc3NhZ2VSZWFjdGlvbkNvdW50cz8uW2tdID8/IDAsXG4gICAgICAgICAgICBmaXJzdF9yZWFjdGlvbl9hdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbGFzdF9yZWFjdGlvbl9hdDogdW5kZWZpbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRFeGlzdGluZ1JlYWN0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5tZXNzYWdlUmVhY3Rpb25zU2VydmljZS5yZWFjdGlvbnMkLnN1YnNjcmliZSgocmVhY3Rpb25zKSA9PiB7XG4gICAgICAgIHRoaXMucmVhY3Rpb25PcHRpb25zID0gT2JqZWN0LmtleXMocmVhY3Rpb25zKTtcbiAgICAgICAgdGhpcy5zZXRFeGlzdGluZ1JlYWN0aW9ucygpO1xuICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzVmlld0luaXRlZCA9IHRydWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIGdldEVtb2ppQnlSZWFjdGlvbihyZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlUmVhY3Rpb25zU2VydmljZS5yZWFjdGlvbnNbcmVhY3Rpb25UeXBlXTtcbiAgfVxuXG4gIGFzeW5jIHJlYWN0aW9uU2VsZWN0ZWQocmVhY3Rpb25UeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1lc3NhZ2VSZWFjdGlvbnNTZXJ2aWNlLmN1c3RvbVJlYWN0aW9uQ2xpY2tIYW5kbGVyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VSZWFjdGlvbnNTZXJ2aWNlLmN1c3RvbVJlYWN0aW9uQ2xpY2tIYW5kbGVyKHtcbiAgICAgICAgbWVzc2FnZUlkOiB0aGlzLm1lc3NhZ2VJZCxcbiAgICAgICAgcmVhY3Rpb25UeXBlOiByZWFjdGlvblR5cGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlYWN0aW9uVHlwZSA9IHJlYWN0aW9uVHlwZTtcbiAgICAgIGlmICghdGhpcy51c2Vyc0J5UmVhY3Rpb25zW3RoaXMuc2VsZWN0ZWRSZWFjdGlvblR5cGVdKSB7XG4gICAgICAgIHRoaXMudXNlcnNCeVJlYWN0aW9uc1t0aGlzLnNlbGVjdGVkUmVhY3Rpb25UeXBlXSA9IHtcbiAgICAgICAgICB1c2VyczogW10sXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZE5leHRQYWdlT2ZSZWFjdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkTmV4dFBhZ2VPZlJlYWN0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZUlkIHx8ICF0aGlzLnNlbGVjdGVkUmVhY3Rpb25UeXBlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UucXVlcnlSZWFjdGlvbnMoXG4gICAgICAgIHRoaXMubWVzc2FnZUlkLFxuICAgICAgICB0aGlzLnNlbGVjdGVkUmVhY3Rpb25UeXBlLFxuICAgICAgICB0aGlzLnVzZXJzQnlSZWFjdGlvbnNbdGhpcy5zZWxlY3RlZFJlYWN0aW9uVHlwZV0ubmV4dCxcbiAgICAgICk7XG4gICAgICB0aGlzLnVzZXJzQnlSZWFjdGlvbnNbdGhpcy5zZWxlY3RlZFJlYWN0aW9uVHlwZV0udXNlcnMgPSBbXG4gICAgICAgIC4uLnRoaXMudXNlcnNCeVJlYWN0aW9uc1t0aGlzLnNlbGVjdGVkUmVhY3Rpb25UeXBlXS51c2VycyxcbiAgICAgICAgLi4uKHJlc3BvbnNlLnJlYWN0aW9uc1xuICAgICAgICAgIC5tYXAoKHIpID0+IHIudXNlcilcbiAgICAgICAgICAuZmlsdGVyKCh1KSA9PiAhIXUpIGFzIFVzZXJSZXNwb25zZVtdKSxcbiAgICAgIF07XG4gICAgICB0aGlzLnVzZXJzQnlSZWFjdGlvbnNbdGhpcy5zZWxlY3RlZFJlYWN0aW9uVHlwZV0ubmV4dCA9IHJlc3BvbnNlLm5leHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWFjdGlvblR5cGUgPSB1bmRlZmluZWQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgaXNPd25SZWFjdGlvbihyZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICByZXR1cm4gISF0aGlzLm93blJlYWN0aW9ucy5maW5kKChyKSA9PiByLnR5cGUgPT09IHJlYWN0aW9uVHlwZSk7XG4gIH1cblxuICBpc09wZW5DaGFuZ2UgPSAoaXNPcGVuOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5zZWxlY3RlZFJlYWN0aW9uVHlwZSA9IGlzT3BlbiA/IHRoaXMuc2VsZWN0ZWRSZWFjdGlvblR5cGUgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFpc09wZW4pIHtcbiAgICAgIHRoaXMudXNlcnNCeVJlYWN0aW9ucyA9IHt9O1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHNldEV4aXN0aW5nUmVhY3Rpb25zKCkge1xuICAgIHRoaXMuZXhpc3RpbmdSZWFjdGlvbnMgPSBPYmplY3Qua2V5cyh0aGlzLm1lc3NhZ2VSZWFjdGlvbkdyb3VwcyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKGspID0+IHRoaXMucmVhY3Rpb25PcHRpb25zLmluZGV4T2YoaykgIT09IC0xKVxuICAgICAgLmZpbHRlcigoaykgPT4gdGhpcy5tZXNzYWdlUmVhY3Rpb25Hcm91cHMhW2tdLmNvdW50ID4gMClcbiAgICAgIC5zb3J0KChyMSwgcjIpID0+IHtcbiAgICAgICAgY29uc3QgZGF0ZTEgPSB0aGlzLm1lc3NhZ2VSZWFjdGlvbkdyb3VwcyFbcjFdLmZpcnN0X3JlYWN0aW9uX2F0XG4gICAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLm1lc3NhZ2VSZWFjdGlvbkdyb3VwcyFbcjFdLmZpcnN0X3JlYWN0aW9uX2F0ISlcbiAgICAgICAgICA6IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IGRhdGUyID0gdGhpcy5tZXNzYWdlUmVhY3Rpb25Hcm91cHMhW3IyXS5maXJzdF9yZWFjdGlvbl9hdFxuICAgICAgICAgID8gbmV3IERhdGUodGhpcy5tZXNzYWdlUmVhY3Rpb25Hcm91cHMhW3IyXS5maXJzdF9yZWFjdGlvbl9hdCEpXG4gICAgICAgICAgOiBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBkYXRlMS5nZXRUaW1lKCkgLSBkYXRlMi5nZXRUaW1lKCk7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiQGlmIChleGlzdGluZ1JlYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gIDxkaXZcbiAgICBkYXRhLXRlc3RpZD1cInJlYWN0aW9uLWxpc3RcIlxuICAgIGNsYXNzPVwic3RyLWNoYXRfX3JlYWN0aW9uLWxpc3Qgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWNvbnRhaW5lclwiXG4gICAgW2NsYXNzLnN0ci1jaGF0X19yZWFjdGlvbi1saXN0LS1yZXZlcnNlXT1cInRydWVcIlxuICA+XG4gICAgPHVsIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zXCI+XG4gICAgICBAZm9yIChyZWFjdGlvblR5cGUgb2YgZXhpc3RpbmdSZWFjdGlvbnM7IHRyYWNrIHJlYWN0aW9uVHlwZSkge1xuICAgICAgICA8bGlcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uXCJcbiAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImVtb2ppXCJcbiAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb24tb3duXT1cImlzT3duUmVhY3Rpb24ocmVhY3Rpb25UeXBlKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInJlYWN0aW9uU2VsZWN0ZWQocmVhY3Rpb25UeXBlKVwiXG4gICAgICAgICAgKGtleXVwLmVudGVyKT1cInJlYWN0aW9uU2VsZWN0ZWQocmVhY3Rpb25UeXBlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtb2ppIHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uLWVtb2ppXCI+XG4gICAgICAgICAgICB7eyBnZXRFbW9qaUJ5UmVhY3Rpb24ocmVhY3Rpb25UeXBlKSB9fSZuYnNwO1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJyZWFjdGlvbi1saXN0LXJlYWN0aW9uLWNvdW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb24tY291bnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IG1lc3NhZ2VSZWFjdGlvbkdyb3Vwcz8uW3JlYWN0aW9uVHlwZV0/LmNvdW50ID8/IDAgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICB9XG4gICAgPC91bD5cbiAgPC9kaXY+XG59XG5cbkBpZiAoc2VsZWN0ZWRSZWFjdGlvblR5cGUpIHtcbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tb2RhbFRlbXBsYXRlJCB8IGFzeW5jKSB8fCBkZWZhdWx0TW9kYWw7XG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIGlzT3BlbjogISFzZWxlY3RlZFJlYWN0aW9uVHlwZSxcbiAgICAgICAgbWVzc2FnZUlkOiBtZXNzYWdlSWQsXG4gICAgICAgIHJlYWN0aW9uVHlwZTogc2VsZWN0ZWRSZWFjdGlvblR5cGUsXG4gICAgICAgIGlzT3BlbkNoYW5nZUhhbmRsZXI6IGlzT3BlbkNoYW5nZSxcbiAgICAgICAgY29udGVudDogbW9kYWxDb250ZW50LFxuICAgICAgfVxuICAgIFwiXG4gIC8+XG59XG5cbjxuZy10ZW1wbGF0ZVxuICAjZGVmYXVsdE1vZGFsXG4gIGxldC1pc09wZW49XCJpc09wZW5cIlxuICBsZXQtbWVzc2FnZUlkPVwibWVzc2FnZUlkXCJcbiAgbGV0LXJlYWN0aW9uVHlwZT1cInJlYWN0aW9uVHlwZVwiXG4gIGxldC1pc09wZW5DaGFuZ2VIYW5kbGVyPVwiaXNPcGVuQ2hhbmdlSGFuZGxlclwiXG4gIGxldC1jb250ZW50PVwiY29udGVudFwiXG4+XG4gIDxzdHJlYW0tbW9kYWxcbiAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1kZXRhaWxzLW1vZGFsXCJcbiAgICBbaXNPcGVuXT1cImlzT3BlblwiXG4gICAgW2NvbnRlbnRdPVwiY29udGVudFwiXG4gICAgKGlzT3BlbkNoYW5nZSk9XCJpc09wZW5DaGFuZ2VIYW5kbGVyKCRldmVudClcIlxuICAvPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtb2RhbENvbnRlbnQ+XG4gIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtZGV0YWlsc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtZGV0YWlscy1yZWFjdGlvbi10eXBlc1wiPlxuICAgICAgQGZvciAocmVhY3Rpb25UeXBlIG9mIGV4aXN0aW5nUmVhY3Rpb25zOyB0cmFjayByZWFjdGlvblR5cGUpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWRldGFpbHMtcmVhY3Rpb24tdHlwZVwiXG4gICAgICAgICAgYXR0ci5kYXRhLXRlc3RpZD1cInJlYWN0aW9uLWRldGFpbHMtc2VsZWN0b3Ite3sgcmVhY3Rpb25UeXBlIH19XCJcbiAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWRldGFpbHMtcmVhY3Rpb24tdHlwZS0tc2VsZWN0ZWRdPVwiXG4gICAgICAgICAgICByZWFjdGlvblR5cGUgPT09IHNlbGVjdGVkUmVhY3Rpb25UeXBlXG4gICAgICAgICAgXCJcbiAgICAgICAgICAoY2xpY2spPVwicmVhY3Rpb25TZWxlY3RlZChyZWFjdGlvblR5cGUpXCJcbiAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwicmVhY3Rpb25TZWxlY3RlZChyZWFjdGlvblR5cGUpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1vamkgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb24tZW1vamlcIj5cbiAgICAgICAgICAgIHt7IGdldEVtb2ppQnlSZWFjdGlvbihyZWFjdGlvblR5cGUpIH19Jm5ic3A7XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb24tY291bnRcIj5cbiAgICAgICAgICAgIHt7IG1lc3NhZ2VSZWFjdGlvbkdyb3Vwcz8uW3JlYWN0aW9uVHlwZV0/LmNvdW50ID8/IDAgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZW1vamkgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb24tZW1vamkgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb24tZW1vamktYmlnXCJcbiAgICA+XG4gICAgICB7eyBnZXRFbW9qaUJ5UmVhY3Rpb24oc2VsZWN0ZWRSZWFjdGlvblR5cGUhKSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGRhdGEtdGVzdGlkPVwiYWxsLXJlYWN0aW5nLXVzZXJzXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWRldGFpbHMtcmVhY3RpbmctdXNlcnNcIlxuICAgID5cbiAgICAgIEBmb3IgKHJlYWN0aW9uVHlwZSBvZiBleGlzdGluZ1JlYWN0aW9uczsgdHJhY2sgcmVhY3Rpb25UeXBlKSB7XG4gICAgICAgIDxzdHJlYW0tdXNlci1saXN0XG4gICAgICAgICAgYXR0ci5kYXRhLXRlc3RpZD1cInt7IHJlYWN0aW9uVHlwZSB9fS11c2VyLWxpc3RcIlxuICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cIlxuICAgICAgICAgICAgc2VsZWN0ZWRSZWFjdGlvblR5cGUgPT09IHJlYWN0aW9uVHlwZSA/ICdibG9jaycgOiAnbm9uZSdcbiAgICAgICAgICBcIlxuICAgICAgICAgIFt1c2Vyc109XCJ1c2Vyc0J5UmVhY3Rpb25zW3JlYWN0aW9uVHlwZV0/LnVzZXJzIHx8IFtdXCJcbiAgICAgICAgICBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiXG4gICAgICAgICAgW2hhc01vcmVdPVwiISF1c2Vyc0J5UmVhY3Rpb25zW3JlYWN0aW9uVHlwZV0/Lm5leHQgfHwgZmFsc2VcIlxuICAgICAgICAgIChsb2FkTW9yZSk9XCJsb2FkTmV4dFBhZ2VPZlJlYWN0aW9ucygpXCJcbiAgICAgICAgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { Component, Input, } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../channel.service";
|
|
4
|
-
import * as i2 from "../message-reactions.service";
|
|
5
|
-
/**
|
|
6
|
-
* The `MessageReactionsSelectorComponent` makes it possible for users to react to a message, the reaction options can be set using the [`MessageReactionsService`](/chat/docs/sdk/angular/services/MessageReactionsService/). You can read more about [message reactions](/chat/docs/javascript/send_reaction/) in the platform documentation.
|
|
7
|
-
*/
|
|
8
|
-
export class MessageReactionsSelectorComponent {
|
|
9
|
-
constructor(channelService, messageReactionsService, cdRef) {
|
|
10
|
-
this.channelService = channelService;
|
|
11
|
-
this.messageReactionsService = messageReactionsService;
|
|
12
|
-
this.cdRef = cdRef;
|
|
13
|
-
/**
|
|
14
|
-
* List of the user's own reactions of a [message](/chat/docs/sdk/angular/types/stream-message/), used to display the users of a reaction type.
|
|
15
|
-
*/
|
|
16
|
-
this.ownReactions = [];
|
|
17
|
-
this.reactionOptions = [];
|
|
18
|
-
this.subscriptions = [];
|
|
19
|
-
this.isViewInited = false;
|
|
20
|
-
}
|
|
21
|
-
ngOnInit() {
|
|
22
|
-
this.subscriptions.push(this.messageReactionsService.reactions$.subscribe((reactions) => {
|
|
23
|
-
this.reactionOptions = Object.keys(reactions);
|
|
24
|
-
if (this.isViewInited) {
|
|
25
|
-
this.cdRef.detectChanges();
|
|
26
|
-
}
|
|
27
|
-
}));
|
|
28
|
-
}
|
|
29
|
-
ngAfterViewInit() {
|
|
30
|
-
this.isViewInited = true;
|
|
31
|
-
}
|
|
32
|
-
ngOnDestroy() {
|
|
33
|
-
this.subscriptions.forEach((s) => s.unsubscribe());
|
|
34
|
-
}
|
|
35
|
-
isOwnReaction(reactionType) {
|
|
36
|
-
return !!this.ownReactions.find((r) => r.type === reactionType);
|
|
37
|
-
}
|
|
38
|
-
getEmojiByReaction(reactionType) {
|
|
39
|
-
return this.messageReactionsService.reactions[reactionType];
|
|
40
|
-
}
|
|
41
|
-
async react(type) {
|
|
42
|
-
this.ownReactions.find((r) => r.type === type)
|
|
43
|
-
? await this.channelService.removeReaction(this.messageId, type)
|
|
44
|
-
: await this.channelService.addReaction(this.messageId, type);
|
|
45
|
-
}
|
|
46
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageReactionsSelectorComponent, deps: [{ token: i1.ChannelService }, { token: i2.MessageReactionsService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
47
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.0", type: MessageReactionsSelectorComponent, selector: "stream-message-reactions-selector", inputs: { ownReactions: "ownReactions", messageId: "messageId" }, ngImport: i0, template: "<div\n #selectorContainer\n data-testid=\"reaction-selector\"\n class=\"str-chat__reaction-selector str-chat-angular-v5__reaction-selector str-chat__message-reaction-selector\"\n>\n <ul\n class=\"str-chat__message-reactions-list str-chat__message-reactions-options\"\n >\n @for (reactionType of reactionOptions; track reactionType) {\n <li\n class=\"str-chat__message-reactions-option str-chat__message-reactions-list-item str-chat__emoji\"\n data-testclass=\"emoji-option\"\n [attr.data-testid]=\"reactionType\"\n [class.str-chat__message-reactions-option-selected]=\"\n isOwnReaction(reactionType)\n \"\n (click)=\"react(reactionType)\"\n (keyup.enter)=\"react(reactionType)\"\n >\n <span\n class=\"emoji str-chat__emoji-selector-emoji-angular str-chat__message-reaction-emoji\"\n >\n {{ getEmojiByReaction(reactionType) }}\n </span>\n </li>\n }\n </ul>\n</div>\n" }); }
|
|
48
|
-
}
|
|
49
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageReactionsSelectorComponent, decorators: [{
|
|
50
|
-
type: Component,
|
|
51
|
-
args: [{ selector: 'stream-message-reactions-selector', template: "<div\n #selectorContainer\n data-testid=\"reaction-selector\"\n class=\"str-chat__reaction-selector str-chat-angular-v5__reaction-selector str-chat__message-reaction-selector\"\n>\n <ul\n class=\"str-chat__message-reactions-list str-chat__message-reactions-options\"\n >\n @for (reactionType of reactionOptions; track reactionType) {\n <li\n class=\"str-chat__message-reactions-option str-chat__message-reactions-list-item str-chat__emoji\"\n data-testclass=\"emoji-option\"\n [attr.data-testid]=\"reactionType\"\n [class.str-chat__message-reactions-option-selected]=\"\n isOwnReaction(reactionType)\n \"\n (click)=\"react(reactionType)\"\n (keyup.enter)=\"react(reactionType)\"\n >\n <span\n class=\"emoji str-chat__emoji-selector-emoji-angular str-chat__message-reaction-emoji\"\n >\n {{ getEmojiByReaction(reactionType) }}\n </span>\n </li>\n }\n </ul>\n</div>\n" }]
|
|
52
|
-
}], ctorParameters: () => [{ type: i1.ChannelService }, { type: i2.MessageReactionsService }, { type: i0.ChangeDetectorRef }], propDecorators: { ownReactions: [{
|
|
53
|
-
type: Input
|
|
54
|
-
}], messageId: [{
|
|
55
|
-
type: Input
|
|
56
|
-
}] } });
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1yZWFjdGlvbnMtc2VsZWN0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtcmVhY3Rpb25zLXNlbGVjdG9yL21lc3NhZ2UtcmVhY3Rpb25zLXNlbGVjdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLXJlYWN0aW9ucy1zZWxlY3Rvci9tZXNzYWdlLXJlYWN0aW9ucy1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULEtBQUssR0FHTixNQUFNLGVBQWUsQ0FBQzs7OztBQU92Qjs7R0FFRztBQU1ILE1BQU0sT0FBTyxpQ0FBaUM7SUFlNUMsWUFDVSxjQUE4QixFQUM5Qix1QkFBZ0QsRUFDaEQsS0FBd0I7UUFGeEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFDaEQsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFmbEM7O1dBRUc7UUFDTSxpQkFBWSxHQUFrRCxFQUFFLENBQUM7UUFLMUUsb0JBQWUsR0FBYSxFQUFFLENBQUM7UUFDdkIsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBQ25DLGlCQUFZLEdBQUcsS0FBSyxDQUFDO0lBTTFCLENBQUM7SUFDSixRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDOUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUM1QjtRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxhQUFhLENBQUMsWUFBaUM7UUFDN0MsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELGtCQUFrQixDQUFDLFlBQWlDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUF5QjtRQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUM7WUFDNUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVUsRUFBRSxJQUFJLENBQUM7WUFDakUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRSxDQUFDOzhHQW5EVSxpQ0FBaUM7a0dBQWpDLGlDQUFpQywySUN0QjlDLGsrQkE0QkE7OzJGRE5hLGlDQUFpQztrQkFMN0MsU0FBUzsrQkFDRSxtQ0FBbUM7eUpBVXBDLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzLCBNZXNzYWdlUmVhY3Rpb25UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgUmVhY3Rpb25SZXNwb25zZSB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IENoYW5uZWxTZXJ2aWNlIH0gZnJvbSAnLi4vY2hhbm5lbC5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2VSZWFjdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vbWVzc2FnZS1yZWFjdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBUaGUgYE1lc3NhZ2VSZWFjdGlvbnNTZWxlY3RvckNvbXBvbmVudGAgbWFrZXMgaXQgcG9zc2libGUgZm9yIHVzZXJzIHRvIHJlYWN0IHRvIGEgbWVzc2FnZSwgdGhlIHJlYWN0aW9uIG9wdGlvbnMgY2FuIGJlIHNldCB1c2luZyB0aGUgW2BNZXNzYWdlUmVhY3Rpb25zU2VydmljZWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvTWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UvKS4gWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgW21lc3NhZ2UgcmVhY3Rpb25zXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvc2VuZF9yZWFjdGlvbi8pIGluIHRoZSBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdHJlYW0tbWVzc2FnZS1yZWFjdGlvbnMtc2VsZWN0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS1yZWFjdGlvbnMtc2VsZWN0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdlUmVhY3Rpb25zU2VsZWN0b3JDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdFxue1xuICAvKipcbiAgICogTGlzdCBvZiB0aGUgdXNlcidzIG93biByZWFjdGlvbnMgb2YgYSBbbWVzc2FnZV0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci90eXBlcy9zdHJlYW0tbWVzc2FnZS8pLCB1c2VkIHRvIGRpc3BsYXkgdGhlIHVzZXJzIG9mIGEgcmVhY3Rpb24gdHlwZS5cbiAgICovXG4gIEBJbnB1dCgpIG93blJlYWN0aW9uczogUmVhY3Rpb25SZXNwb25zZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPltdID0gW107XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdGhlIHJlYWN0aW9ucyBiZWxvbmcgdG9cbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFjdGlvbk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBpc1ZpZXdJbml0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VSZWFjdGlvbnNTZXJ2aWNlOiBNZXNzYWdlUmVhY3Rpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMubWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UucmVhY3Rpb25zJC5zdWJzY3JpYmUoKHJlYWN0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLnJlYWN0aW9uT3B0aW9ucyA9IE9iamVjdC5rZXlzKHJlYWN0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3SW5pdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgaXNPd25SZWFjdGlvbihyZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICByZXR1cm4gISF0aGlzLm93blJlYWN0aW9ucy5maW5kKChyKSA9PiByLnR5cGUgPT09IHJlYWN0aW9uVHlwZSk7XG4gIH1cblxuICBnZXRFbW9qaUJ5UmVhY3Rpb24ocmVhY3Rpb25UeXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UucmVhY3Rpb25zW3JlYWN0aW9uVHlwZV07XG4gIH1cblxuICBhc3luYyByZWFjdCh0eXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlKSB7XG4gICAgdGhpcy5vd25SZWFjdGlvbnMuZmluZCgocikgPT4gci50eXBlID09PSB0eXBlKVxuICAgICAgPyBhd2FpdCB0aGlzLmNoYW5uZWxTZXJ2aWNlLnJlbW92ZVJlYWN0aW9uKHRoaXMubWVzc2FnZUlkISwgdHlwZSlcbiAgICAgIDogYXdhaXQgdGhpcy5jaGFubmVsU2VydmljZS5hZGRSZWFjdGlvbih0aGlzLm1lc3NhZ2VJZCEsIHR5cGUpO1xuICB9XG59XG4iLCI8ZGl2XG4gICNzZWxlY3RvckNvbnRhaW5lclxuICBkYXRhLXRlc3RpZD1cInJlYWN0aW9uLXNlbGVjdG9yXCJcbiAgY2xhc3M9XCJzdHItY2hhdF9fcmVhY3Rpb24tc2VsZWN0b3Igc3RyLWNoYXQtYW5ndWxhci12NV9fcmVhY3Rpb24tc2VsZWN0b3Igc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb24tc2VsZWN0b3JcIlxuPlxuICA8dWxcbiAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1saXN0IHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1vcHRpb25zXCJcbiAgPlxuICAgIEBmb3IgKHJlYWN0aW9uVHlwZSBvZiByZWFjdGlvbk9wdGlvbnM7IHRyYWNrIHJlYWN0aW9uVHlwZSkge1xuICAgICAgPGxpXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLW9wdGlvbiBzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtbGlzdC1pdGVtIHN0ci1jaGF0X19lbW9qaVwiXG4gICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiZW1vamktb3B0aW9uXCJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwicmVhY3Rpb25UeXBlXCJcbiAgICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1vcHRpb24tc2VsZWN0ZWRdPVwiXG4gICAgICAgICAgaXNPd25SZWFjdGlvbihyZWFjdGlvblR5cGUpXG4gICAgICAgIFwiXG4gICAgICAgIChjbGljayk9XCJyZWFjdChyZWFjdGlvblR5cGUpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cInJlYWN0KHJlYWN0aW9uVHlwZSlcIlxuICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwiZW1vamkgc3RyLWNoYXRfX2Vtb2ppLXNlbGVjdG9yLWVtb2ppLWFuZ3VsYXIgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb24tZW1vamlcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0RW1vamlCeVJlYWN0aW9uKHJlYWN0aW9uVHlwZSkgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9saT5cbiAgICB9XG4gIDwvdWw+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
import emojiRegex from 'emoji-regex';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "../message.service";
|
|
5
|
-
import * as i2 from "../custom-templates.service";
|
|
6
|
-
import * as i3 from "@angular/common";
|
|
7
|
-
/**
|
|
8
|
-
* The `MessageTextComponent` displays the text content of a message.
|
|
9
|
-
*/
|
|
10
|
-
export class MessageTextComponent {
|
|
11
|
-
constructor(messageService, customTemplatesService) {
|
|
12
|
-
this.messageService = messageService;
|
|
13
|
-
this.customTemplatesService = customTemplatesService;
|
|
14
|
-
/**
|
|
15
|
-
* `true` if the component displayes a message quote
|
|
16
|
-
*/
|
|
17
|
-
this.isQuoted = false;
|
|
18
|
-
/**
|
|
19
|
-
* `true` if the
|
|
20
|
-
*/
|
|
21
|
-
this.shouldTranslate = false;
|
|
22
|
-
this.messageTextParts = [];
|
|
23
|
-
this.emojiRegexp = new RegExp(emojiRegex(), 'g');
|
|
24
|
-
this.displayAs = this.messageService.displayAs;
|
|
25
|
-
try {
|
|
26
|
-
this.urlRegexp = new RegExp('(?:(?:https?|ftp|file):\\/\\/|www\\.|ftp\\.|(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,})(?![^\\s]*@[^\\s]*)(?:[^\\s()<>]+|\\([\\w\\d]+\\))*(?<!@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})', 'gim');
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
this.urlRegexp =
|
|
30
|
-
/(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#/%=~_|$?!:,.]*\)|[A-Z0-9+&@#/%=~_|$])/gim;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
ngOnChanges(changes) {
|
|
34
|
-
if (changes.message || changes.shouldTranslate) {
|
|
35
|
-
this.createMessageParts();
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
getMentionContext(messagePart) {
|
|
39
|
-
return {
|
|
40
|
-
content: messagePart.content,
|
|
41
|
-
user: messagePart.user,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
createMessageParts() {
|
|
45
|
-
this.messageTextParts = undefined;
|
|
46
|
-
this.messageText = undefined;
|
|
47
|
-
let content = this.getMessageContent();
|
|
48
|
-
if ((!this.message.mentioned_users ||
|
|
49
|
-
this.message.mentioned_users.length === 0) &&
|
|
50
|
-
!content?.match(this.emojiRegexp) &&
|
|
51
|
-
!content?.match(this.urlRegexp)) {
|
|
52
|
-
this.messageTextParts = undefined;
|
|
53
|
-
this.messageText = content;
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
if (!content) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
if (!this.message.mentioned_users ||
|
|
60
|
-
this.message.mentioned_users.length === 0) {
|
|
61
|
-
content = this.fixEmojiDisplay(content);
|
|
62
|
-
content = this.wrapLinksWithAnchorTag(content);
|
|
63
|
-
this.messageTextParts = [{ content, type: 'text' }];
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
this.messageTextParts = [];
|
|
67
|
-
let text = content;
|
|
68
|
-
this.message.mentioned_users.forEach((user) => {
|
|
69
|
-
const mention = `@${user.name || user.id}`;
|
|
70
|
-
const precedingText = text.substring(0, text.indexOf(mention));
|
|
71
|
-
let formattedPrecedingText = this.fixEmojiDisplay(precedingText);
|
|
72
|
-
formattedPrecedingText = this.wrapLinksWithAnchorTag(formattedPrecedingText);
|
|
73
|
-
this.messageTextParts.push({
|
|
74
|
-
content: formattedPrecedingText,
|
|
75
|
-
type: 'text',
|
|
76
|
-
});
|
|
77
|
-
this.messageTextParts.push({
|
|
78
|
-
content: mention,
|
|
79
|
-
type: 'mention',
|
|
80
|
-
user,
|
|
81
|
-
});
|
|
82
|
-
text = text.replace(precedingText + mention, '');
|
|
83
|
-
});
|
|
84
|
-
if (text) {
|
|
85
|
-
text = this.fixEmojiDisplay(text);
|
|
86
|
-
text = this.wrapLinksWithAnchorTag(text);
|
|
87
|
-
this.messageTextParts.push({ content: text, type: 'text' });
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
getMessageContent() {
|
|
92
|
-
const originalContent = this.message?.text;
|
|
93
|
-
if (this.shouldTranslate) {
|
|
94
|
-
const translation = this.message?.translation;
|
|
95
|
-
return translation || originalContent;
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
return originalContent;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
fixEmojiDisplay(content) {
|
|
102
|
-
// Wrap emojis in span to display emojis correctly in Chrome https://bugs.chromium.org/p/chromium/issues/detail?id=596223
|
|
103
|
-
// Based on this: https://stackoverflow.com/questions/4565112/javascript-how-to-find-out-if-the-user-browser-is-chrome
|
|
104
|
-
/* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */
|
|
105
|
-
const isChrome = !!window.chrome && typeof window.opr === 'undefined';
|
|
106
|
-
/* eslint-enable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */
|
|
107
|
-
content = content.replace(this.emojiRegexp, (match) => `<span ${isChrome ? 'class="str-chat__emoji-display-fix"' : ''}>${match}</span>`);
|
|
108
|
-
return content;
|
|
109
|
-
}
|
|
110
|
-
wrapLinksWithAnchorTag(content) {
|
|
111
|
-
if (this.displayAs === 'html') {
|
|
112
|
-
return content;
|
|
113
|
-
}
|
|
114
|
-
content = content.replace(this.urlRegexp, (match) => {
|
|
115
|
-
if (this.messageService.customLinkRenderer) {
|
|
116
|
-
return this.messageService.customLinkRenderer(match);
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
let href = match;
|
|
120
|
-
if (!href.startsWith('http') &&
|
|
121
|
-
!href.startsWith('ftp') &&
|
|
122
|
-
!href.startsWith('file')) {
|
|
123
|
-
href = `https://${match}`;
|
|
124
|
-
}
|
|
125
|
-
return `<a href="${href}" target="_blank" rel="nofollow">${match}</a>`;
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
return content;
|
|
129
|
-
}
|
|
130
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageTextComponent, deps: [{ token: i1.MessageService }, { token: i2.CustomTemplatesService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
131
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.0", type: MessageTextComponent, selector: "stream-message-text", inputs: { message: "message", isQuoted: "isQuoted", shouldTranslate: "shouldTranslate" }, usesOnChanges: true, ngImport: i0, template: "@if (message?.text) {\n <p\n [class.str-chat__quoted-message-text-value]=\"isQuoted\"\n [class.str-chat__message-text-value]=\"!isQuoted\"\n data-testid=\"text\"\n >\n @if (messageTextParts) {\n @for (part of messageTextParts; track part.content) {\n @if (part.type === \"text\") {\n <span [innerHTML]=\"part.content\"></span>\n } @else {\n <ng-template #defaultMention let-content=\"content\">\n <span class=\"str-chat__message-mention\">{{ content }}</span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.mentionTemplate$ | async) ||\n defaultMention;\n context: getMentionContext(part)\n \"\n />\n }\n }\n } @else {\n @if (displayAs === \"text\") {\n {{ messageText || \"\" }}\n } @else {\n <span data-testid=\"html-content\" [innerHTML]=\"messageText\"></span>\n }\n }\n </p>\n}\n", dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
|
|
132
|
-
}
|
|
133
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageTextComponent, decorators: [{
|
|
134
|
-
type: Component,
|
|
135
|
-
args: [{ selector: 'stream-message-text', template: "@if (message?.text) {\n <p\n [class.str-chat__quoted-message-text-value]=\"isQuoted\"\n [class.str-chat__message-text-value]=\"!isQuoted\"\n data-testid=\"text\"\n >\n @if (messageTextParts) {\n @for (part of messageTextParts; track part.content) {\n @if (part.type === \"text\") {\n <span [innerHTML]=\"part.content\"></span>\n } @else {\n <ng-template #defaultMention let-content=\"content\">\n <span class=\"str-chat__message-mention\">{{ content }}</span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.mentionTemplate$ | async) ||\n defaultMention;\n context: getMentionContext(part)\n \"\n />\n }\n }\n } @else {\n @if (displayAs === \"text\") {\n {{ messageText || \"\" }}\n } @else {\n <span data-testid=\"html-content\" [innerHTML]=\"messageText\"></span>\n }\n }\n </p>\n}\n" }]
|
|
136
|
-
}], ctorParameters: () => [{ type: i1.MessageService }, { type: i2.CustomTemplatesService }], propDecorators: { message: [{
|
|
137
|
-
type: Input
|
|
138
|
-
}], isQuoted: [{
|
|
139
|
-
type: Input
|
|
140
|
-
}], shouldTranslate: [{
|
|
141
|
-
type: Input
|
|
142
|
-
}] } });
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS10ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLXRleHQvbWVzc2FnZS10ZXh0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLXRleHQvbWVzc2FnZS10ZXh0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQU8zRSxPQUFPLFVBQVUsTUFBTSxhQUFhLENBQUM7Ozs7O0FBVXJDOztHQUVHO0FBTUgsTUFBTSxPQUFPLG9CQUFvQjtJQXNCL0IsWUFDVSxjQUE4QixFQUM3QixzQkFBOEM7UUFEL0MsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzdCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFoQnpEOztXQUVHO1FBQ00sYUFBUSxHQUFZLEtBQUssQ0FBQztRQUNuQzs7V0FFRztRQUNNLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBQzFDLHFCQUFnQixHQUE4QixFQUFFLENBQUM7UUFJekMsZ0JBQVcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQU1sRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO1FBQy9DLElBQUk7WUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksTUFBTSxDQUN6QixzS0FBc0ssRUFDdEssS0FBSyxDQUNOLENBQUM7U0FDSDtRQUFDLE1BQU07WUFDTixJQUFJLENBQUMsU0FBUztnQkFDWixnS0FBZ0ssQ0FBQztTQUNwSztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFB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QWtCLEVBQUU7Z0JBQzFDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0RDtpQkFBTTtnQkFDTCxJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ2pCLElBQ0UsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztvQkFDeEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztvQkFDdkIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUN4QjtvQkFDQSxJQUFJLEdBQUcsV0FBVyxLQUFLLEVBQUUsQ0FBQztpQkFDM0I7Z0JBQ0QsT0FBTyxZQUFZLElBQUksb0NBQW9DLEtBQUssTUFBTSxDQUFDO2FBQ3hFO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOzhHQXpKVSxvQkFBb0I7a0dBQXBCLG9CQUFvQiwwS0N6QmpDLDYvQkFnQ0E7OzJGRFBhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxxQkFBcUI7d0hBUXRCLE9BQU87c0JBQWYsS0FBSztnQkFPRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG4gIE1lbnRpb25UZW1wbGF0ZUNvbnRleHQsXG4gIFN0cmVhbU1lc3NhZ2UsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE1lc3NhZ2VSZXNwb25zZUJhc2UsIFVzZXJSZXNwb25zZSB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCBlbW9qaVJlZ2V4IGZyb20gJ2Vtb2ppLXJlZ2V4JztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vbWVzc2FnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuLi9jdXN0b20tdGVtcGxhdGVzLnNlcnZpY2UnO1xuXG50eXBlIE1lc3NhZ2VQYXJ0ID0ge1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHR5cGU6ICd0ZXh0JyB8ICdtZW50aW9uJztcbiAgdXNlcj86IFVzZXJSZXNwb25zZTtcbn07XG5cbi8qKlxuICogVGhlIGBNZXNzYWdlVGV4dENvbXBvbmVudGAgZGlzcGxheXMgdGhlIHRleHQgY29udGVudCBvZiBhIG1lc3NhZ2UuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLXRleHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS10ZXh0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZVRleHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogVGhlIG1lc3NhZ2Ugd2hpY2ggdGV4dCBzaG91bGQgYmUgZGlzcGxheWVkXG4gICAqL1xuICBASW5wdXQoKSBtZXNzYWdlOlxuICAgIHwgU3RyZWFtTWVzc2FnZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPlxuICAgIHwgdW5kZWZpbmVkXG4gICAgfCBNZXNzYWdlUmVzcG9uc2VCYXNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+O1xuICAvKipcbiAgICogYHRydWVgIGlmIHRoZSBjb21wb25lbnQgZGlzcGxheWVzIGEgbWVzc2FnZSBxdW90ZVxuICAgKi9cbiAgQElucHV0KCkgaXNRdW90ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIGB0cnVlYCBpZiB0aGVcbiAgICovXG4gIEBJbnB1dCgpIHNob3VsZFRyYW5zbGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBtZXNzYWdlVGV4dFBhcnRzOiBNZXNzYWdlUGFydFtdIHwgdW5kZWZpbmVkID0gW107XG4gIG1lc3NhZ2VUZXh0Pzogc3RyaW5nO1xuICBkaXNwbGF5QXM6ICd0ZXh0JyB8ICdodG1sJztcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxSZWdleHA6IFJlZ0V4cDtcbiAgcHJpdmF0ZSBlbW9qaVJlZ2V4cCA9IG5ldyBSZWdFeHAoZW1vamlSZWdleCgpLCAnZycpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHJlYWRvbmx5IGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuZGlzcGxheUFzID0gdGhpcy5tZXNzYWdlU2VydmljZS5kaXNwbGF5QXM7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudXJsUmVnZXhwID0gbmV3IFJlZ0V4cChcbiAgICAgICAgJyg/Oig/Omh0dHBzP3xmdHB8ZmlsZSk6XFxcXC9cXFxcL3x3d3dcXFxcLnxmdHBcXFxcLnwoPzpbYS16QS1aMC05LV0rXFxcXC4pK1thLXpBLVpdezIsfSkoPyFbXlxcXFxzXSpAW15cXFxcc10qKSg/OlteXFxcXHMoKTw+XSt8XFxcXChbXFxcXHdcXFxcZF0rXFxcXCkpKig/PCFAW2EtekEtWjAtOS4tXStcXFxcLlthLXpBLVpdezIsfSknLFxuICAgICAgICAnZ2ltJyxcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnVybFJlZ2V4cCA9XG4gICAgICAgIC8oPzooPzpodHRwcz98ZnRwfGZpbGUpOlxcL1xcL3x3d3dcXC58ZnRwXFwuKSg/OlxcKFstQS1aMC05KyZAIy8lPX5ffCQ/ITosLl0qXFwpfFstQS1aMC05KyZAIy8lPX5ffCQ/ITosLl0pKig/OlxcKFstQS1aMC05KyZAIy8lPX5ffCQ/ITosLl0qXFwpfFtBLVowLTkrJkAjLyU9fl98JF0pL2dpbTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMubWVzc2FnZSB8fCBjaGFuZ2VzLnNob3VsZFRyYW5zbGF0ZSkge1xuICAgICAgdGhpcy5jcmVhdGVNZXNzYWdlUGFydHMoKTtcbiAgICB9XG4gIH1cblxuICBnZXRNZW50aW9uQ29udGV4dChtZXNzYWdlUGFydDogTWVzc2FnZVBhcnQpOiBNZW50aW9uVGVtcGxhdGVDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogbWVzc2FnZVBhcnQuY29udGVudCxcbiAgICAgIHVzZXI6IG1lc3NhZ2VQYXJ0LnVzZXIhLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1lc3NhZ2VQYXJ0cygpIHtcbiAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tZXNzYWdlVGV4dCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgY29udGVudCA9IHRoaXMuZ2V0TWVzc2FnZUNvbnRlbnQoKTtcbiAgICBpZiAoXG4gICAgICAoIXRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzIHx8XG4gICAgICAgIHRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzLmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgICFjb250ZW50Py5tYXRjaCh0aGlzLmVtb2ppUmVnZXhwKSAmJlxuICAgICAgIWNvbnRlbnQ/Lm1hdGNoKHRoaXMudXJsUmVnZXhwKVxuICAgICkge1xuICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5tZXNzYWdlVGV4dCA9IGNvbnRlbnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY29udGVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhdGhpcy5tZXNzYWdlIS5tZW50aW9uZWRfdXNlcnMgfHxcbiAgICAgIHRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgY29udGVudCA9IHRoaXMuZml4RW1vamlEaXNwbGF5KGNvbnRlbnQpO1xuICAgICAgY29udGVudCA9IHRoaXMud3JhcExpbmtzV2l0aEFuY2hvclRhZyhjb250ZW50KTtcbiAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyA9IFt7IGNvbnRlbnQsIHR5cGU6ICd0ZXh0JyB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gW107XG4gICAgICBsZXQgdGV4dCA9IGNvbnRlbnQ7XG4gICAgICB0aGlzLm1lc3NhZ2UhLm1lbnRpb25lZF91c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbnRpb24gPSBgQCR7dXNlci5uYW1lIHx8IHVzZXIuaWR9YDtcbiAgICAgICAgY29uc3QgcHJlY2VkaW5nVGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQuaW5kZXhPZihtZW50aW9uKSk7XG4gICAgICAgIGxldCBmb3JtYXR0ZWRQcmVjZWRpbmdUZXh0ID0gdGhpcy5maXhFbW9qaURpc3BsYXkocHJlY2VkaW5nVGV4dCk7XG4gICAgICAgIGZvcm1hdHRlZFByZWNlZGluZ1RleHQgPSB0aGlzLndyYXBMaW5rc1dpdGhBbmNob3JUYWcoXG4gICAgICAgICAgZm9ybWF0dGVkUHJlY2VkaW5nVGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzIS5wdXNoKHtcbiAgICAgICAgICBjb250ZW50OiBmb3JtYXR0ZWRQcmVjZWRpbmdUZXh0LFxuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyEucHVzaCh7XG4gICAgICAgICAgY29udGVudDogbWVudGlvbixcbiAgICAgICAgICB0eXBlOiAnbWVudGlvbicsXG4gICAgICAgICAgdXNlcixcbiAgICAgICAgfSk7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UocHJlY2VkaW5nVGV4dCArIG1lbnRpb24sICcnKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHRoaXMuZml4RW1vamlEaXNwbGF5KHRleHQpO1xuICAgICAgICB0ZXh0ID0gdGhpcy53cmFwTGlua3NXaXRoQW5jaG9yVGFnKHRleHQpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMucHVzaCh7IGNvbnRlbnQ6IHRleHQsIHR5cGU6ICd0ZXh0JyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE1lc3NhZ2VDb250ZW50KCkge1xuICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IHRoaXMubWVzc2FnZT8udGV4dDtcbiAgICBpZiAodGhpcy5zaG91bGRUcmFuc2xhdGUpIHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5tZXNzYWdlPy50cmFuc2xhdGlvbjtcbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbiB8fCBvcmlnaW5hbENvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcmlnaW5hbENvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaXhFbW9qaURpc3BsYXkoY29udGVudDogc3RyaW5nKSB7XG4gICAgLy8gV3JhcCBlbW9qaXMgaW4gc3BhbiB0byBkaXNwbGF5IGVtb2ppcyBjb3JyZWN0bHkgaW4gQ2hyb21lIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU5NjIyM1xuICAgIC8vIEJhc2VkIG9uIHRoaXM6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ1NjUxMTIvamF2YXNjcmlwdC1ob3ctdG8tZmluZC1vdXQtaWYtdGhlLXVzZXItYnJvd3Nlci1pcy1jaHJvbWVcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgICBjb25zdCBpc0Nocm9tZSA9XG4gICAgICAhISh3aW5kb3cgYXMgYW55KS5jaHJvbWUgJiYgdHlwZW9mICh3aW5kb3cgYXMgYW55KS5vcHIgPT09ICd1bmRlZmluZWQnO1xuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgIHRoaXMuZW1vamlSZWdleHAsXG4gICAgICAobWF0Y2gpID0+XG4gICAgICAgIGA8c3BhbiAke1xuICAgICAgICAgIGlzQ2hyb21lID8gJ2NsYXNzPVwic3RyLWNoYXRfX2Vtb2ppLWRpc3BsYXktZml4XCInIDogJydcbiAgICAgICAgfT4ke21hdGNofTwvc3Bhbj5gLFxuICAgICk7XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcExpbmtzV2l0aEFuY2hvclRhZyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5QXMgPT09ICdodG1sJykge1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UodGhpcy51cmxSZWdleHAsIChtYXRjaCkgPT4ge1xuICAgICAgaWYgKHRoaXMubWVzc2FnZVNlcnZpY2UuY3VzdG9tTGlua1JlbmRlcmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmN1c3RvbUxpbmtSZW5kZXJlcihtYXRjaCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgaHJlZiA9IG1hdGNoO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWhyZWYuc3RhcnRzV2l0aCgnaHR0cCcpICYmXG4gICAgICAgICAgIWhyZWYuc3RhcnRzV2l0aCgnZnRwJykgJiZcbiAgICAgICAgICAhaHJlZi5zdGFydHNXaXRoKCdmaWxlJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgaHJlZiA9IGBodHRwczovLyR7bWF0Y2h9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYDxhIGhyZWY9XCIke2hyZWZ9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9mb2xsb3dcIj4ke21hdGNofTwvYT5gO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbn1cbiIsIkBpZiAobWVzc2FnZT8udGV4dCkge1xuICA8cFxuICAgIFtjbGFzcy5zdHItY2hhdF9fcXVvdGVkLW1lc3NhZ2UtdGV4dC12YWx1ZV09XCJpc1F1b3RlZFwiXG4gICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXRleHQtdmFsdWVdPVwiIWlzUXVvdGVkXCJcbiAgICBkYXRhLXRlc3RpZD1cInRleHRcIlxuICA+XG4gICAgQGlmIChtZXNzYWdlVGV4dFBhcnRzKSB7XG4gICAgICBAZm9yIChwYXJ0IG9mIG1lc3NhZ2VUZXh0UGFydHM7IHRyYWNrIHBhcnQuY29udGVudCkge1xuICAgICAgICBAaWYgKHBhcnQudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cInBhcnQuY29udGVudFwiPjwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TWVudGlvbiBsZXQtY29udGVudD1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtbWVudGlvblwiPnt7IGNvbnRlbnQgfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZW50aW9uVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgICAgZGVmYXVsdE1lbnRpb247XG4gICAgICAgICAgICAgIGNvbnRleHQ6IGdldE1lbnRpb25Db250ZXh0KHBhcnQpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBpZiAoZGlzcGxheUFzID09PSBcInRleHRcIikge1xuICAgICAgICB7eyBtZXNzYWdlVGV4dCB8fCBcIlwiIH19XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJodG1sLWNvbnRlbnRcIiBbaW5uZXJIVE1MXT1cIm1lc3NhZ2VUZXh0XCI+PC9zcGFuPlxuICAgICAgfVxuICAgIH1cbiAgPC9wPlxufVxuIl19
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
/**
|
|
4
|
-
* The message service contains configuration options related to displaying the message content
|
|
5
|
-
*/
|
|
6
|
-
export class MessageService {
|
|
7
|
-
constructor() {
|
|
8
|
-
/**
|
|
9
|
-
* Decides if the message content should be formatted as text or HTML
|
|
10
|
-
*
|
|
11
|
-
* If you display messages as text the following parts are still be displayed as HTML:
|
|
12
|
-
* - user mentions -> you can customize this with your own template using the [`customTemplatesService.mentionTemplate$`](/chat/docs/sdk/angular/services/CustomTemplatesService/#mentiontemplate)
|
|
13
|
-
* - links -> you can customize this by providing you own [`customLinkRenderer`](#customlinkrenderer) method
|
|
14
|
-
*/
|
|
15
|
-
this.displayAs = 'text';
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Tells if an attachment is custom (you need to provide your own template to display them) or built-in (the SDK supports it out-of-the-box)
|
|
19
|
-
* @param attachment
|
|
20
|
-
* @returns `true` if the attachment is custom
|
|
21
|
-
*/
|
|
22
|
-
isCustomAttachment(attachment) {
|
|
23
|
-
if (this.filterCustomAttachment) {
|
|
24
|
-
return this.filterCustomAttachment(attachment);
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
return (attachment.type !== 'image' &&
|
|
28
|
-
attachment.type !== 'file' &&
|
|
29
|
-
attachment.type !== 'video' &&
|
|
30
|
-
attachment.type !== 'voiceRecording' &&
|
|
31
|
-
attachment.type !== 'giphy');
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
35
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageService, providedIn: 'root' }); }
|
|
36
|
-
}
|
|
37
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageService, decorators: [{
|
|
38
|
-
type: Injectable,
|
|
39
|
-
args: [{
|
|
40
|
-
providedIn: 'root',
|
|
41
|
-
}]
|
|
42
|
-
}], ctorParameters: () => [] });
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUkzQzs7R0FFRztBQUlILE1BQU0sT0FBTyxjQUFjO0lBMkJ6QjtRQXhCQTs7Ozs7O1dBTUc7UUFDSCxjQUFTLEdBQW9CLE1BQU0sQ0FBQztJQWlCckIsQ0FBQztJQUVoQjs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsVUFBeUI7UUFDMUMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDaEQ7YUFBTTtZQUNMLE9BQU8sQ0FDTCxVQUFVLENBQUMsSUFBSSxLQUFLLE9BQU87Z0JBQzNCLFVBQVUsQ0FBQyxJQUFJLEtBQUssTUFBTTtnQkFDMUIsVUFBVSxDQUFDLElBQUksS0FBSyxPQUFPO2dCQUMzQixVQUFVLENBQUMsSUFBSSxLQUFLLGdCQUFnQjtnQkFDcEMsVUFBVSxDQUFDLElBQUksS0FBSyxPQUFPLENBQzVCLENBQUM7U0FDSDtJQUNILENBQUM7OEdBOUNVLGNBQWM7a0hBQWQsY0FBYyxjQUZiLE1BQU07OzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgbWVzc2FnZSBzZXJ2aWNlIGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGRpc3BsYXlpbmcgdGhlIG1lc3NhZ2UgY29udGVudFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZVNlcnZpY2U8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyxcbj4ge1xuICAvKipcbiAgICogRGVjaWRlcyBpZiB0aGUgbWVzc2FnZSBjb250ZW50IHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgdGV4dCBvciBIVE1MXG4gICAqXG4gICAqIElmIHlvdSBkaXNwbGF5IG1lc3NhZ2VzIGFzIHRleHQgdGhlIGZvbGxvd2luZyBwYXJ0cyBhcmUgc3RpbGwgYmUgZGlzcGxheWVkIGFzIEhUTUw6XG4gICAqIC0gdXNlciBtZW50aW9ucyAtPiB5b3UgY2FuIGN1c3RvbWl6ZSB0aGlzIHdpdGggeW91ciBvd24gdGVtcGxhdGUgdXNpbmcgdGhlIFtgY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZW50aW9uVGVtcGxhdGUkYF0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9DdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLyNtZW50aW9udGVtcGxhdGUpXG4gICAqIC0gbGlua3MgLT4geW91IGNhbiBjdXN0b21pemUgdGhpcyBieSBwcm92aWRpbmcgeW91IG93biBbYGN1c3RvbUxpbmtSZW5kZXJlcmBdKCNjdXN0b21saW5rcmVuZGVyZXIpIG1ldGhvZFxuICAgKi9cbiAgZGlzcGxheUFzOiAndGV4dCcgfCAnaHRtbCcgPSAndGV4dCc7XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gcHJvdmlkZSBhIGN1c3RvbSBtZXRob2QgdG8gZGlzcGxheSBsaW5rc1xuICAgKiBAcGFyYW0gdXJsIHRoZSB1cmwgdGhlIGxpbmsgc2hvdWxkIHJlZmVyIHRvXG4gICAqIEByZXR1cm5zIHRoZSBIVE1MIG1hcmt1cCBhcyBhIHN0cmluZyBmb3IgdGhlIGxpbmtcbiAgICovXG4gIGN1c3RvbUxpbmtSZW5kZXJlcj86ICh1cmw6IHN0cmluZykgPT4gc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFNESyBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dGFjaG1lbnQgdHlwZXM6IGBpbWFnZWAsIGBmaWxlYCwgYGdpcGh5YCwgYHZpZGVvYCBhbmQgYHZvaWNlUmVjb3JkaW5nYCBhdHRhY2htZW50cy5cbiAgICpcbiAgICogQWxsIG90aGVyIHR5cGVzIGFyZSB0cmVhdGVkIGFzIGN1c3RvbSBhdHRhY2htZW50cywgaG93ZXZlciBpdCdzIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoaXMgbG9naWMsIGFuZCBwcm92aWRlIGEgY3VzdG9tIGZpbHRlcmluZyBtZXRob2Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdHJlYXQgc29tZSBidWlsdC1pbiBhdHRhY2htZW50cyBhcyBjdXN0b20uXG4gICAqXG4gICAqIFByb3ZpZGUgYSBtZXRob2Qgd2hpY2ggcmV0cnVucyBgdHJ1ZWAgaWYgYW4gYXR0YWNobWVudCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBjdXN0b20uXG4gICAqL1xuICBmaWx0ZXJDdXN0b21BdHRhY2htZW50PzogKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQ8VD4pID0+IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBUZWxscyBpZiBhbiBhdHRhY2htZW50IGlzIGN1c3RvbSAoeW91IG5lZWQgdG8gcHJvdmlkZSB5b3VyIG93biB0ZW1wbGF0ZSB0byBkaXNwbGF5IHRoZW0pIG9yIGJ1aWx0LWluICh0aGUgU0RLIHN1cHBvcnRzIGl0IG91dC1vZi10aGUtYm94KVxuICAgKiBAcGFyYW0gYXR0YWNobWVudFxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGF0dGFjaG1lbnQgaXMgY3VzdG9tXG4gICAqL1xuICBpc0N1c3RvbUF0dGFjaG1lbnQoYXR0YWNobWVudDogQXR0YWNobWVudDxUPikge1xuICAgIGlmICh0aGlzLmZpbHRlckN1c3RvbUF0dGFjaG1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlckN1c3RvbUF0dGFjaG1lbnQoYXR0YWNobWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGF0dGFjaG1lbnQudHlwZSAhPT0gJ2ltYWdlJyAmJlxuICAgICAgICBhdHRhY2htZW50LnR5cGUgIT09ICdmaWxlJyAmJlxuICAgICAgICBhdHRhY2htZW50LnR5cGUgIT09ICd2aWRlbycgJiZcbiAgICAgICAgYXR0YWNobWVudC50eXBlICE9PSAndm9pY2VSZWNvcmRpbmcnICYmXG4gICAgICAgIGF0dGFjaG1lbnQudHlwZSAhPT0gJ2dpcGh5J1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,20 +0,0 @@
|
|
|
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`](/chat/docs/sdk/angular/components/NotificationListComponent/)
|
|
6
|
-
*/
|
|
7
|
-
export class NotificationComponent {
|
|
8
|
-
constructor() { }
|
|
9
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NotificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
10
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.0", 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 @if (content) {\n <ng-container *ngTemplateOutlet=\"content\" />\n }\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
|
|
11
|
-
}
|
|
12
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", 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 @if (content) {\n <ng-container *ngTemplateOutlet=\"content\" />\n }\n</div>\n" }]
|
|
15
|
-
}], ctorParameters: () => [], propDecorators: { type: [{
|
|
16
|
-
type: Input
|
|
17
|
-
}], content: [{
|
|
18
|
-
type: Input
|
|
19
|
-
}] } });
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFlLE1BQU0sZUFBZSxDQUFDOzs7QUFHOUQ7O0dBRUc7QUFNSCxNQUFNLE9BQU8scUJBQXFCO0lBVWhDLGdCQUFlLENBQUM7OEdBVkwscUJBQXFCO2tHQUFyQixxQkFBcUIseUdDWGxDLHdPQVVBOzsyRkRDYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UscUJBQXFCO3dEQVF0QixJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBOb3RpZmljYXRpb25gIGNvbXBvbmVudCBkaXNwbGF5cyBhIG5vdGlmaWNhdGlvbiB3aXRoaW4gdGhlIFtgTm90aWZpY2F0aW9uTGlzdGBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29tcG9uZW50cy9Ob3RpZmljYXRpb25MaXN0Q29tcG9uZW50LylcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLW5vdGlmaWNhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub3RpZmljYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25Db21wb25lbnQge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgQElucHV0KCkgdHlwZTogTm90aWZpY2F0aW9uVHlwZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBub3RpZmljYXRpb24gKGNhbiBhbHNvIGJlIHByb3ZpZGVkIHVzaW5nIGBuZy1jb250ZW50YClcbiAgICovXG4gIEBJbnB1dCgpIGNvbnRlbnQ6IFRlbXBsYXRlUmVmPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cbn1cbiIsIjxkaXZcbiAgZGF0YS10ZXN0aWQ9XCJjdXN0b20tbm90aWZpY2F0aW9uXCJcbiAgY2xhc3M9XCJzdHItY2hhdF9fY3VzdG9tLW5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24te3tcbiAgICB0eXBlXG4gIH19IHN0ci1jaGF0X19ub3RpZmljYXRpb25cIlxuPlxuICBAaWYgKGNvbnRlbnQpIHtcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiIC8+XG4gIH1cbjwvZGl2PlxuIl19
|