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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stream-chat-angular",
|
|
3
|
-
"version": "6.0.0-
|
|
3
|
+
"version": "6.0.0-rc.2",
|
|
4
4
|
"description": "Angular components to create chat conversations or livestream style chat",
|
|
5
5
|
"author": "GetStream",
|
|
6
6
|
"homepage": "https://getstream.io/chat/",
|
|
@@ -20,18 +20,20 @@
|
|
|
20
20
|
},
|
|
21
21
|
".": {
|
|
22
22
|
"types": "./index.d.ts",
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
23
|
+
"esm2020": "./esm2020/stream-chat-angular.mjs",
|
|
24
|
+
"es2020": "./fesm2020/stream-chat-angular.mjs",
|
|
25
|
+
"es2015": "./fesm2015/stream-chat-angular.mjs",
|
|
26
|
+
"node": "./fesm2015/stream-chat-angular.mjs",
|
|
27
|
+
"default": "./fesm2020/stream-chat-angular.mjs"
|
|
26
28
|
}
|
|
27
29
|
},
|
|
28
30
|
"peerDependencies": {
|
|
29
|
-
"@angular/common": "^17.0.0 || ^18.0.0 || ^19.0.0",
|
|
30
|
-
"@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0",
|
|
31
|
+
"@angular/common": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
|
|
32
|
+
"@angular/core": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
|
|
31
33
|
"@breezystack/lamejs": "^1.2.7",
|
|
32
|
-
"@ngx-translate/core": "^16.0.0",
|
|
34
|
+
"@ngx-translate/core": "^14.0.0 || ^15.0.0 || ^16.0.0",
|
|
33
35
|
"rxjs": "^7.4.0",
|
|
34
|
-
"stream-chat": "
|
|
36
|
+
"stream-chat": "9.0.0-rc.6"
|
|
35
37
|
},
|
|
36
38
|
"peerDependenciesMeta": {
|
|
37
39
|
"@breezystack/lamejs": {
|
|
@@ -39,18 +41,22 @@
|
|
|
39
41
|
}
|
|
40
42
|
},
|
|
41
43
|
"dependencies": {
|
|
42
|
-
"@floating-ui/dom": "^1.
|
|
44
|
+
"@floating-ui/dom": "^1.6.3",
|
|
43
45
|
"@stream-io/transliterate": "^1.5.2",
|
|
44
|
-
"angular-mentions": "^1.
|
|
45
|
-
"dayjs": "^1.11.
|
|
46
|
-
"emoji-regex": "^10.
|
|
46
|
+
"angular-mentions": "^1.4.0",
|
|
47
|
+
"dayjs": "^1.11.10",
|
|
48
|
+
"emoji-regex": "^10.3.0",
|
|
47
49
|
"fix-webm-duration": "^1.0.6",
|
|
48
|
-
"ngx-float-ui": "^17.0.0 || ^18.0.0 || ^19.0.0",
|
|
50
|
+
"ngx-float-ui": "^15.0.0|| ^16.0.0 || ^17.0.0 || ^18.0.0 || ^18.0.1-rc.0 || ^19.0.0",
|
|
49
51
|
"pretty-bytes": "^6.1.1",
|
|
50
52
|
"tslib": "^2.3.0",
|
|
51
|
-
"uuid": "^
|
|
53
|
+
"uuid": "^9.0.1"
|
|
52
54
|
},
|
|
53
|
-
"module": "
|
|
55
|
+
"module": "fesm2015/stream-chat-angular.mjs",
|
|
56
|
+
"es2020": "fesm2020/stream-chat-angular.mjs",
|
|
57
|
+
"esm2020": "esm2020/stream-chat-angular.mjs",
|
|
58
|
+
"fesm2020": "fesm2020/stream-chat-angular.mjs",
|
|
59
|
+
"fesm2015": "fesm2015/stream-chat-angular.mjs",
|
|
54
60
|
"typings": "index.d.ts",
|
|
55
61
|
"sideEffects": false
|
|
56
62
|
}
|
package/public-api.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
export * from './lib/chat-client.service';
|
|
2
3
|
export * from './lib/channel.service';
|
|
3
4
|
export * from './lib/theme.service';
|
|
@@ -52,12 +53,14 @@ export * from './lib/custom-templates.service';
|
|
|
52
53
|
export * from './lib/message-reactions.service';
|
|
53
54
|
export * from './lib/date-parser.service';
|
|
54
55
|
export * from './lib/types';
|
|
56
|
+
export * from './lib/types-custom';
|
|
55
57
|
export * from './lib/message.service';
|
|
56
58
|
export * from './lib/message-actions.service';
|
|
57
59
|
export * from './lib/voice-recording/voice-recording.component';
|
|
58
60
|
export * from './lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component';
|
|
59
61
|
export * from './lib/is-on-separate-date';
|
|
60
62
|
export * from './lib/message-reactions-selector/message-reactions-selector.component';
|
|
63
|
+
export * from './lib/channel-query';
|
|
61
64
|
export * from './lib/virtualized-list.service';
|
|
62
65
|
export * from './lib/virtualized-message-list.service';
|
|
63
66
|
export * from './lib/user-list/user-list.component';
|
package/src/assets/i18n/en.ts
CHANGED
package/src/assets/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '6.0.0-
|
|
1
|
+
export const version = '6.0.0-rc.2';
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
/**
|
|
4
|
-
* The `AttachmentConfigurationService` provides customization for certain attributes of attachments displayed inside the message component. If you're using your own CDN, you can integrate resizing features of it by providing your own handlers.
|
|
5
|
-
*/
|
|
6
|
-
export class AttachmentConfigurationService {
|
|
7
|
-
constructor() {
|
|
8
|
-
/**
|
|
9
|
-
* You can turn on/off thumbnail generation for video attachments
|
|
10
|
-
*/
|
|
11
|
-
this.shouldGenerateVideoThumbnail = true;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Handles the configuration for image attachments, it's possible to provide your own function to override the default logic
|
|
15
|
-
* @param attachment The attachment to configure
|
|
16
|
-
* @param location Specifies where the image is being displayed
|
|
17
|
-
* @param element The default resizing logics reads the height/max-height and max-width propperties of this element and reduces file size based on the given values. File size reduction is done by Stream's CDN.
|
|
18
|
-
*/
|
|
19
|
-
getImageAttachmentConfiguration(attachment, location, element) {
|
|
20
|
-
if (this.customImageAttachmentConfigurationHandler) {
|
|
21
|
-
return this.customImageAttachmentConfigurationHandler(attachment, location, element);
|
|
22
|
-
}
|
|
23
|
-
const defaultOriginalDimension = 1000000;
|
|
24
|
-
const urlString = (attachment.img_url ||
|
|
25
|
-
attachment.thumb_url ||
|
|
26
|
-
attachment.image_url ||
|
|
27
|
-
'');
|
|
28
|
-
let url;
|
|
29
|
-
try {
|
|
30
|
-
url = new URL(urlString);
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
return {
|
|
34
|
-
url: urlString,
|
|
35
|
-
width: '',
|
|
36
|
-
height: '',
|
|
37
|
-
originalHeight: defaultOriginalDimension,
|
|
38
|
-
originalWidth: defaultOriginalDimension,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
const originalHeight = Number(url.searchParams.get('oh')) > 1
|
|
42
|
-
? Number(url.searchParams.get('oh'))
|
|
43
|
-
: defaultOriginalDimension;
|
|
44
|
-
const originalWidth = Number(url.searchParams.get('ow')) > 1
|
|
45
|
-
? Number(url.searchParams.get('ow'))
|
|
46
|
-
: defaultOriginalDimension;
|
|
47
|
-
const displayWarning = location === 'gallery' || location === 'single';
|
|
48
|
-
const sizeRestriction = this.getSizingRestrictions(url, element, displayWarning);
|
|
49
|
-
if (sizeRestriction) {
|
|
50
|
-
// Apply 2x for retina displays
|
|
51
|
-
sizeRestriction.height *= 2;
|
|
52
|
-
sizeRestriction.width *= 2;
|
|
53
|
-
this.addResizingParamsToUrl(sizeRestriction, url);
|
|
54
|
-
}
|
|
55
|
-
return {
|
|
56
|
-
url: url.href,
|
|
57
|
-
width: '',
|
|
58
|
-
height: '',
|
|
59
|
-
originalHeight,
|
|
60
|
-
originalWidth,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Handles the configuration for video attachments, it's possible to provide your own function to override the default logic
|
|
65
|
-
* @param attachment The attachment to configure
|
|
66
|
-
* @param element The default resizing logics reads the height/max-height and max-width propperties of this element and reduces file size based on the given values. File size reduction is done by Stream's CDN.
|
|
67
|
-
*/
|
|
68
|
-
getVideoAttachmentConfiguration(attachment, element) {
|
|
69
|
-
if (this.customVideoAttachmentConfigurationHandler) {
|
|
70
|
-
return this.customVideoAttachmentConfigurationHandler(attachment, element);
|
|
71
|
-
}
|
|
72
|
-
let thumbUrl = undefined;
|
|
73
|
-
let originalHeight = 1000000;
|
|
74
|
-
let originalWidth = 1000000;
|
|
75
|
-
if (attachment.thumb_url && this.shouldGenerateVideoThumbnail) {
|
|
76
|
-
let url;
|
|
77
|
-
try {
|
|
78
|
-
url = new URL(attachment.thumb_url);
|
|
79
|
-
originalHeight =
|
|
80
|
-
Number(url.searchParams.get('oh')) > 1
|
|
81
|
-
? Number(url.searchParams.get('oh'))
|
|
82
|
-
: originalHeight;
|
|
83
|
-
originalWidth =
|
|
84
|
-
Number(url.searchParams.get('ow')) > 1
|
|
85
|
-
? Number(url.searchParams.get('ow'))
|
|
86
|
-
: originalWidth;
|
|
87
|
-
const displayWarning = true;
|
|
88
|
-
const sizeRestriction = this.getSizingRestrictions(url, element, displayWarning);
|
|
89
|
-
if (sizeRestriction) {
|
|
90
|
-
sizeRestriction.height *= 2;
|
|
91
|
-
sizeRestriction.width *= 2;
|
|
92
|
-
this.addResizingParamsToUrl(sizeRestriction, url);
|
|
93
|
-
}
|
|
94
|
-
thumbUrl = url.href;
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
thumbUrl = attachment.thumb_url;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return {
|
|
101
|
-
url: attachment.asset_url || '',
|
|
102
|
-
width: '',
|
|
103
|
-
height: '',
|
|
104
|
-
thumbUrl: thumbUrl,
|
|
105
|
-
originalHeight,
|
|
106
|
-
originalWidth,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Handles the configuration for giphy attachments, it's possible to provide your own function to override the default logic
|
|
111
|
-
* @param attachment The attachment to configure
|
|
112
|
-
*/
|
|
113
|
-
getGiphyAttachmentConfiguration(attachment) {
|
|
114
|
-
if (this.customGiphyAttachmentConfigurationHandler) {
|
|
115
|
-
return this.customGiphyAttachmentConfigurationHandler(attachment);
|
|
116
|
-
}
|
|
117
|
-
const giphy = attachment.giphy?.fixed_height_downsampled;
|
|
118
|
-
return {
|
|
119
|
-
url: giphy?.url || attachment.image_url || attachment.thumb_url || '',
|
|
120
|
-
height: giphy?.height ? `${giphy?.height}px` : '300px',
|
|
121
|
-
width: giphy?.width ? `${giphy?.width}px` : '',
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Handles the configuration for scraped image attachments, it's possible to provide your own function to override the default logic
|
|
126
|
-
* @param attachment The attachment to configure
|
|
127
|
-
*/
|
|
128
|
-
getScrapedImageAttachmentConfiguration(attachment) {
|
|
129
|
-
if (this.customScrapedImageAttachmentConfigurationHandler) {
|
|
130
|
-
return this.customScrapedImageAttachmentConfigurationHandler(attachment);
|
|
131
|
-
}
|
|
132
|
-
return {
|
|
133
|
-
url: attachment.image_url || attachment.thumb_url || '',
|
|
134
|
-
width: '',
|
|
135
|
-
height: '', // Set from CSS
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
addResizingParamsToUrl(sizeRestriction, url) {
|
|
139
|
-
url.searchParams.set('h', sizeRestriction.height.toString());
|
|
140
|
-
url.searchParams.set('w', sizeRestriction.width.toString());
|
|
141
|
-
}
|
|
142
|
-
getSizingRestrictions(url, htmlElement, displayWarning = false) {
|
|
143
|
-
const urlParams = url.searchParams;
|
|
144
|
-
const originalHeight = Number(urlParams.get('oh')) || 1;
|
|
145
|
-
const originalWidth = Number(urlParams.get('ow')) || 1;
|
|
146
|
-
const cssSizeRestriction = this.getCSSSizeRestriction(htmlElement);
|
|
147
|
-
let sizeRestriction;
|
|
148
|
-
if ((cssSizeRestriction.maxHeight || cssSizeRestriction.height) &&
|
|
149
|
-
cssSizeRestriction.maxWidth) {
|
|
150
|
-
sizeRestriction = this.getSizeRestrictions(originalHeight, originalWidth, (cssSizeRestriction.maxHeight || cssSizeRestriction.height), cssSizeRestriction.maxWidth);
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
sizeRestriction = undefined;
|
|
154
|
-
if (displayWarning) {
|
|
155
|
-
console.warn(`Invalid value set for height/max-height and/or max-width for HTML element, this can cause scrolling issues inside the message list, more info https://getstream.io/chat/docs/sdk/angular/components/AttachmentListComponent/#image-and-video-sizing, attachment URL: ${url.toString()}`);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return sizeRestriction;
|
|
159
|
-
}
|
|
160
|
-
getSizeRestrictions(originalHeight, originalWidth, maxHeight, maxWidth) {
|
|
161
|
-
return {
|
|
162
|
-
height: Math.round(Math.max(maxHeight, (maxWidth / originalWidth) * originalHeight)),
|
|
163
|
-
width: Math.round(Math.max(maxHeight, (maxWidth / originalHeight) * originalWidth)),
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
getCSSSizeRestriction(htmlElement) {
|
|
167
|
-
const computedStylesheet = getComputedStyle(htmlElement);
|
|
168
|
-
const height = this.getValueRepresentationOfCSSProperty(computedStylesheet.getPropertyValue('height'));
|
|
169
|
-
const maxHeight = this.getValueRepresentationOfCSSProperty(computedStylesheet.getPropertyValue('max-height'));
|
|
170
|
-
const maxWidth = this.getValueRepresentationOfCSSProperty(computedStylesheet.getPropertyValue('max-width'));
|
|
171
|
-
return { height, maxHeight, maxWidth };
|
|
172
|
-
}
|
|
173
|
-
getValueRepresentationOfCSSProperty(property) {
|
|
174
|
-
return Number(property.replace('px', '')) || undefined;
|
|
175
|
-
}
|
|
176
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: AttachmentConfigurationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
177
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: AttachmentConfigurationService, providedIn: 'root' }); }
|
|
178
|
-
}
|
|
179
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: AttachmentConfigurationService, decorators: [{
|
|
180
|
-
type: Injectable,
|
|
181
|
-
args: [{
|
|
182
|
-
providedIn: 'root',
|
|
183
|
-
}]
|
|
184
|
-
}] });
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1jb25maWd1cmF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvYXR0YWNobWVudC1jb25maWd1cmF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFTM0M7O0dBRUc7QUFJSCxNQUFNLE9BQU8sOEJBQThCO0lBSDNDO1FBaUNFOztXQUVHO1FBQ0gsaUNBQTRCLEdBQUcsSUFBSSxDQUFDO0tBZ1ByQztJQTlPQzs7Ozs7T0FLRztJQUNILCtCQUErQixDQUM3QixVQUF5QixFQUN6QixRQUEyQyxFQUMzQyxPQUFvQjtRQUVwQixJQUFJLElBQUksQ0FBQyx5Q0FBeUMsRUFBRTtZQUNsRCxPQUFPLElBQUksQ0FBQyx5Q0FBeUMsQ0FDbkQsVUFBVSxFQUNWLFFBQVEsRUFDUixPQUFPLENBQ1IsQ0FBQztTQUNIO1FBRUQsTUFBTSx3QkFBd0IsR0FBRyxPQUFPLENBQUM7UUFDekMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTztZQUNuQyxVQUFVLENBQUMsU0FBUztZQUNwQixVQUFVLENBQUMsU0FBUztZQUNwQixFQUFFLENBQVcsQ0FBQztRQUNoQixJQUFJLEdBQVEsQ0FBQztRQUNiLElBQUk7WUFDRixHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDMUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU87Z0JBQ0wsR0FBRyxFQUFFLFNBQVM7Z0JBQ2QsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsY0FBYyxFQUFFLHdCQUF3QjtnQkFDeEMsYUFBYSxFQUFFLHdCQUF3QjthQUN4QyxDQUFDO1NBQ0g7UUFDRCxNQUFNLGNBQWMsR0FDbEIsTUFBTSxDQUFDLEdB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QUFFLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQztJQUN6RCxDQUFDOzhHQWhSVSw4QkFBOEI7a0hBQTlCLDhCQUE4QixjQUY3QixNQUFNOzsyRkFFUCw4QkFBOEI7a0JBSDFDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRDb25maWdyYXRpb24sXG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG4gIEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24sXG4gIFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24sXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFRoZSBgQXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlYCBwcm92aWRlcyBjdXN0b21pemF0aW9uIGZvciBjZXJ0YWluIGF0dHJpYnV0ZXMgb2YgYXR0YWNobWVudHMgZGlzcGxheWVkIGluc2lkZSB0aGUgbWVzc2FnZSBjb21wb25lbnQuIElmIHlvdSdyZSB1c2luZyB5b3VyIG93biBDRE4sIHlvdSBjYW4gaW50ZWdyYXRlIHJlc2l6aW5nIGZlYXR1cmVzIG9mIGl0IGJ5IHByb3ZpZGluZyB5b3VyIG93biBoYW5kbGVycy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRDb25maWd1cmF0aW9uU2VydmljZTxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzLFxuPiB7XG4gIC8qKlxuICAgKiBBIGN1c3RvbSBoYW5kbGVyIGNhbiBiZSBwcm92aWRlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbWFnZSBhdHRhY2htZW50IChpbWFnZXMgdXBsb2FkZWQgZnJvbSBmaWxlcykgY29uZmlndXJhdGlvbi4gQnkgZGVmYXVsdCB0aGUgU0RLIHVzZXMgZml4ZWQgaW1hZ2UgaGVpZ2h0IChhIHNpemUgdGhhdCdzIGtub3duIGJlZm9yZSBpbWFnZSBpcyBsb2FkZWQpLCBpZiB5b3Ugb3ZlcnJpZGUgdGhhdCB3aXRoIGR5bmFtaWMgaW1hZ2UgaGVpZ2h0IChmb3IgZXhhbXBsZTogaGVpZ2h0OiAxMDAlKSB0aGUgc2Nyb2xsaW5nIGxvZ2ljIGluc2lkZSB0aGUgbWVzc2FnZSBsaXN0IGNhbiBicmVhay5cbiAgICovXG4gIGN1c3RvbUltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyPzogKFxuICAgIGE6IEF0dGFjaG1lbnQ8VD4sXG4gICAgdHlwZTogJ2dhbGxlcnknIHwgJ3NpbmdsZScgfCAnY2Fyb3VzZWwnLFxuICAgIGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICApID0+IEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBBIGN1c3RvbSBoYW5kbGVyIGNhbiBiZSBwcm92aWRlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2aWRlbyBhdHRhY2htZW50ICh2aWRlb3MgdXBsb2FkZWQgZnJvbSBmaWxlcykgY29uZmlndXJhdGlvbi4gQnkgZGVmYXVsdCB0aGUgU0RLIHVzZXMgZml4ZWQgaGVpZ2h0IChhIHNpemUgdGhhdCdzIGtub3duIGJlZm9yZSB2aWRlbyBpcyBsb2FkZWQpLCBpZiB5b3Ugb3ZlcnJpZGUgdGhhdCB3aXRoIGR5bmFtaWMgaGVpZ2h0IChmb3IgZXhhbXBsZTogaGVpZ2h0OiAxMDAlKSB0aGUgc2Nyb2xsaW5nIGxvZ2ljIGluc2lkZSB0aGUgbWVzc2FnZSBsaXN0IGNhbiBicmVhay5cbiAgICovXG4gIGN1c3RvbVZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyPzogKFxuICAgIGE6IEF0dGFjaG1lbnQ8VD4sXG4gICAgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICkgPT4gVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIEEgY3VzdG9tIGhhbmRsZXIgY2FuIGJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGdpcGh5IGF0dGFjaG1lbnQgKEdJRnMgc2VudCB3aXRoIHRoZSAvZ2lwaHkgY29tbWFuZCkgY29uZmlndXJhdGlvbi4gQnkgZGVmYXVsdCB0aGUgU0RLIHVzZXMgZml4ZWQgaGVpZ2h0IChhIHNpemUgdGhhdCdzIGtub3duIGJlZm9yZSB0aGUgR0lGIGlzIGxvYWRlZCksIGlmIHlvdSBvdmVycmlkZSB0aGF0IHdpdGggZHluYW1pYyBoZWlnaHQgKGZvciBleGFtcGxlOiBoZWlnaHQ6IDEwMCUpIHRoZSBzY3JvbGxpbmcgbG9naWMgaW5zaWRlIHRoZSBtZXNzYWdlIGxpc3QgY2FuIGJyZWFrLlxuICAgKi9cbiAgY3VzdG9tR2lwaHlBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXI/OiAoXG4gICAgYTogQXR0YWNobWVudDxUPixcbiAgKSA9PiBBdHRhY2htZW50Q29uZmlncmF0aW9uO1xuICAvKipcbiAgICogQSBjdXN0b20gaGFuZGxlciBjYW4gYmUgcHJvdmlkZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2NyYXBlZCBpbWFnZSBhdHRhY2htZW50IChpbWFnZXMgZm91bmQgaW4gbGlua3MgaW5zaWRlIG1lc3NhZ2VzKSBjb25maWd1cmF0aW9uLiBCeSBkZWZhdWx0IHRoZSBTREsgdXNlcyBmaXhlZCBoZWlnaHQgKGEgc2l6ZSB0aGF0J3Mga25vd24gYmVmb3JlIGltYWdlIGlzIGxvYWRlZCksIGlmIHlvdSBvdmVycmlkZSB0aGF0IHdpdGggZHluYW1pYyBoZWlnaHQgKGZvciBleGFtcGxlOiBoZWlnaHQ6IDEwMCUpIHRoZSBzY3JvbGxpbmcgbG9naWMgaW5zaWRlIHRoZSBtZXNzYWdlIGxpc3QgY2FuIGJyZWFrLlxuICAgKi9cbiAgY3VzdG9tU2NyYXBlZEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyPzogKFxuICAgIGE6IEF0dGFjaG1lbnQ8VD4sXG4gICkgPT4gQXR0YWNobWVudENvbmZpZ3JhdGlvbjtcbiAgLyoqXG4gICAqIFlvdSBjYW4gdHVybiBvbi9vZmYgdGh1bWJuYWlsIGdlbmVyYXRpb24gZm9yIHZpZGVvIGF0dGFjaG1lbnRzXG4gICAqL1xuICBzaG91bGRHZW5lcmF0ZVZpZGVvVGh1bWJuYWlsID0gdHJ1ZTtcblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgaW1hZ2UgYXR0YWNobWVudHMsIGl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSB5b3VyIG93biBmdW5jdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBsb2dpY1xuICAgKiBAcGFyYW0gYXR0YWNobWVudCBUaGUgYXR0YWNobWVudCB0byBjb25maWd1cmVcbiAgICogQHBhcmFtIGxvY2F0aW9uIFNwZWNpZmllcyB3aGVyZSB0aGUgaW1hZ2UgaXMgYmVpbmcgZGlzcGxheWVkXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBkZWZhdWx0IHJlc2l6aW5nIGxvZ2ljcyByZWFkcyB0aGUgaGVpZ2h0L21heC1oZWlnaHQgYW5kIG1heC13aWR0aCBwcm9wcGVydGllcyBvZiB0aGlzIGVsZW1lbnQgYW5kIHJlZHVjZXMgZmlsZSBzaXplIGJhc2VkIG9uIHRoZSBnaXZlbiB2YWx1ZXMuIEZpbGUgc2l6ZSByZWR1Y3Rpb24gaXMgZG9uZSBieSBTdHJlYW0ncyBDRE4uXG4gICAqL1xuICBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQ8VD4sXG4gICAgbG9jYXRpb246ICdnYWxsZXJ5JyB8ICdzaW5nbGUnIHwgJ2Nhcm91c2VsJyxcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgKTogSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbiB7XG4gICAgaWYgKHRoaXMuY3VzdG9tSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1c3RvbUltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyKFxuICAgICAgICBhdHRhY2htZW50LFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdE9yaWdpbmFsRGltZW5zaW9uID0gMTAwMDAwMDtcbiAgICBjb25zdCB1cmxTdHJpbmcgPSAoYXR0YWNobWVudC5pbWdfdXJsIHx8XG4gICAgICBhdHRhY2htZW50LnRodW1iX3VybCB8fFxuICAgICAgYXR0YWNobWVudC5pbWFnZV91cmwgfHxcbiAgICAgICcnKSBhcyBzdHJpbmc7XG4gICAgbGV0IHVybDogVVJMO1xuICAgIHRyeSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVybDogdXJsU3RyaW5nLFxuICAgICAgICB3aWR0aDogJycsIC8vIE5vdCBzZXQgdG8gcmVzcGVjdCByZXNwb25zaXZlIHdpZHRoXG4gICAgICAgIGhlaWdodDogJycsIC8vIFNldCBmcm9tIENTU1xuICAgICAgICBvcmlnaW5hbEhlaWdodDogZGVmYXVsdE9yaWdpbmFsRGltZW5zaW9uLFxuICAgICAgICBvcmlnaW5hbFdpZHRoOiBkZWZhdWx0T3JpZ2luYWxEaW1lbnNpb24sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbEhlaWdodCA9XG4gICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ29oJykpID4gMVxuICAgICAgICA/IE51bWJlcih1cmwuc2VhcmNoUGFyYW1zLmdldCgnb2gnKSlcbiAgICAgICAgOiBkZWZhdWx0T3JpZ2luYWxEaW1lbnNpb247XG4gICAgY29uc3Qgb3JpZ2luYWxXaWR0aCA9XG4gICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ293JykpID4gMVxuICAgICAgICA/IE51bWJlcih1cmwuc2VhcmNoUGFyYW1zLmdldCgnb3cnKSlcbiAgICAgICAgOiBkZWZhdWx0T3JpZ2luYWxEaW1lbnNpb247XG4gICAgY29uc3QgZGlzcGxheVdhcm5pbmcgPSBsb2NhdGlvbiA9PT0gJ2dhbGxlcnknIHx8IGxvY2F0aW9uID09PSAnc2luZ2xlJztcbiAgICBjb25zdCBzaXplUmVzdHJpY3Rpb24gPSB0aGlzLmdldFNpemluZ1Jlc3RyaWN0aW9ucyhcbiAgICAgIHVybCxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBkaXNwbGF5V2FybmluZyxcbiAgICApO1xuXG4gICAgaWYgKHNpemVSZXN0cmljdGlvbikge1xuICAgICAgLy8gQXBwbHkgMnggZm9yIHJldGluYSBkaXNwbGF5c1xuICAgICAgc2l6ZVJlc3RyaWN0aW9uLmhlaWdodCAqPSAyO1xuICAgICAgc2l6ZVJlc3RyaWN0aW9uLndpZHRoICo9IDI7XG4gICAgICB0aGlzLmFkZFJlc2l6aW5nUGFyYW1zVG9Vcmwoc2l6ZVJlc3RyaWN0aW9uLCB1cmwpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB1cmw6IHVybC5ocmVmLFxuICAgICAgd2lkdGg6ICcnLCAvLyBOb3Qgc2V0IHRvIHJlc3BlY3QgcmVzcG9uc2l2ZSB3aWR0aFxuICAgICAgaGVpZ2h0OiAnJywgLy8gU2V0IGZyb20gQ1NTXG4gICAgICBvcmlnaW5hbEhlaWdodCxcbiAgICAgIG9yaWdpbmFsV2lkdGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjb25maWd1cmF0aW9uIGZvciB2aWRlbyBhdHRhY2htZW50cywgaXQncyBwb3NzaWJsZSB0byBwcm92aWRlIHlvdXIgb3duIGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGxvZ2ljXG4gICAqIEBwYXJhbSBhdHRhY2htZW50IFRoZSBhdHRhY2htZW50IHRvIGNvbmZpZ3VyZVxuICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZGVmYXVsdCByZXNpemluZyBsb2dpY3MgcmVhZHMgdGhlIGhlaWdodC9tYXgtaGVpZ2h0IGFuZCBtYXgtd2lkdGggcHJvcHBlcnRpZXMgb2YgdGhpcyBlbGVtZW50IGFuZCByZWR1Y2VzIGZpbGUgc2l6ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gdmFsdWVzLiBGaWxlIHNpemUgcmVkdWN0aW9uIGlzIGRvbmUgYnkgU3RyZWFtJ3MgQ0ROLlxuICAgKi9cbiAgZ2V0VmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICBhdHRhY2htZW50OiBBdHRhY2htZW50PFQ+LFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICApOiBWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uIHtcbiAgICBpZiAodGhpcy5jdXN0b21WaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXIoXG4gICAgICAgIGF0dGFjaG1lbnQsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCB0aHVtYlVybDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBvcmlnaW5hbEhlaWdodCA9IDEwMDAwMDA7XG4gICAgbGV0IG9yaWdpbmFsV2lkdGggPSAxMDAwMDAwO1xuICAgIGlmIChhdHRhY2htZW50LnRodW1iX3VybCAmJiB0aGlzLnNob3VsZEdlbmVyYXRlVmlkZW9UaHVtYm5haWwpIHtcbiAgICAgIGxldCB1cmw6IFVSTDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHVybCA9IG5ldyBVUkwoYXR0YWNobWVudC50aHVtYl91cmwpO1xuXG4gICAgICAgIG9yaWdpbmFsSGVpZ2h0ID1cbiAgICAgICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ29oJykpID4gMVxuICAgICAgICAgICAgPyBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ29oJykpXG4gICAgICAgICAgICA6IG9yaWdpbmFsSGVpZ2h0O1xuICAgICAgICBvcmlnaW5hbFdpZHRoID1cbiAgICAgICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ293JykpID4gMVxuICAgICAgICAgICAgPyBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ293JykpXG4gICAgICAgICAgICA6IG9yaWdpbmFsV2lkdGg7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlXYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc2l6ZVJlc3RyaWN0aW9uID0gdGhpcy5nZXRTaXppbmdSZXN0cmljdGlvbnMoXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgZGlzcGxheVdhcm5pbmcsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzaXplUmVzdHJpY3Rpb24pIHtcbiAgICAgICAgICBzaXplUmVzdHJpY3Rpb24uaGVpZ2h0ICo9IDI7XG4gICAgICAgICAgc2l6ZVJlc3RyaWN0aW9uLndpZHRoICo9IDI7XG4gICAgICAgICAgdGhpcy5hZGRSZXNpemluZ1BhcmFtc1RvVXJsKHNpemVSZXN0cmljdGlvbiwgdXJsKTtcbiAgICAgICAgfVxuICAgICAgICB0aHVtYlVybCA9IHVybC5ocmVmO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRodW1iVXJsID0gYXR0YWNobWVudC50aHVtYl91cmw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1cmw6IGF0dGFjaG1lbnQuYXNzZXRfdXJsIHx8ICcnLFxuICAgICAgd2lkdGg6ICcnLCAvLyBOb3Qgc2V0IHRvIHJlc3BlY3QgcmVzcG9uc2l2ZSB3aWR0aFxuICAgICAgaGVpZ2h0OiAnJywgLy8gU2V0IGZyb20gQ1NTXG4gICAgICB0aHVtYlVybDogdGh1bWJVcmwsXG4gICAgICBvcmlnaW5hbEhlaWdodCxcbiAgICAgIG9yaWdpbmFsV2lkdGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjb25maWd1cmF0aW9uIGZvciBnaXBoeSBhdHRhY2htZW50cywgaXQncyBwb3NzaWJsZSB0byBwcm92aWRlIHlvdXIgb3duIGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGxvZ2ljXG4gICAqIEBwYXJhbSBhdHRhY2htZW50IFRoZSBhdHRhY2htZW50IHRvIGNvbmZpZ3VyZVxuICAgKi9cbiAgZ2V0R2lwaHlBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICBhdHRhY2htZW50OiBBdHRhY2htZW50PFQ+LFxuICApOiBBdHRhY2htZW50Q29uZmlncmF0aW9uIHtcbiAgICBpZiAodGhpcy5jdXN0b21HaXBoeUF0dGFjaG1lbnRDb25maWd1cmF0aW9uSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tR2lwaHlBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXIoYXR0YWNobWVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2lwaHkgPSBhdHRhY2htZW50LmdpcGh5Py5maXhlZF9oZWlnaHRfZG93bnNhbXBsZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdXJsOiBnaXBoeT8udXJsIHx8IGF0dGFjaG1lbnQuaW1hZ2VfdXJsIHx8IGF0dGFjaG1lbnQudGh1bWJfdXJsIHx8ICcnLFxuICAgICAgaGVpZ2h0OiBnaXBoeT8uaGVpZ2h0ID8gYCR7Z2lwaHk/LmhlaWdodH1weGAgOiAnMzAwcHgnLFxuICAgICAgd2lkdGg6IGdpcGh5Py53aWR0aCA/IGAke2dpcGh5Py53aWR0aH1weGAgOiAnJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHNjcmFwZWQgaW1hZ2UgYXR0YWNobWVudHMsIGl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSB5b3VyIG93biBmdW5jdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBsb2dpY1xuICAgKiBAcGFyYW0gYXR0YWNobWVudCBUaGUgYXR0YWNobWVudCB0byBjb25maWd1cmVcbiAgICovXG4gIGdldFNjcmFwZWRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQ8VD4sXG4gICk6IEF0dGFjaG1lbnRDb25maWdyYXRpb24ge1xuICAgIGlmICh0aGlzLmN1c3RvbVNjcmFwZWRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tU2NyYXBlZEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyKGF0dGFjaG1lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB1cmw6IGF0dGFjaG1lbnQuaW1hZ2VfdXJsIHx8IGF0dGFjaG1lbnQudGh1bWJfdXJsIHx8ICcnLFxuICAgICAgd2lkdGg6ICcnLFxuICAgICAgaGVpZ2h0OiAnJywgLy8gU2V0IGZyb20gQ1NTXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVzaXppbmdQYXJhbXNUb1VybChcbiAgICBzaXplUmVzdHJpY3Rpb246IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICB1cmw6IFVSTCxcbiAgKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2gnLCBzaXplUmVzdHJpY3Rpb24uaGVpZ2h0LnRvU3RyaW5nKCkpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCd3Jywgc2l6ZVJlc3RyaWN0aW9uLndpZHRoLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTaXppbmdSZXN0cmljdGlvbnMoXG4gICAgdXJsOiBVUkwsXG4gICAgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIGRpc3BsYXlXYXJuaW5nID0gZmFsc2UsXG4gICkge1xuICAgIGNvbnN0IHVybFBhcmFtcyA9IHVybC5zZWFyY2hQYXJhbXM7XG4gICAgY29uc3Qgb3JpZ2luYWxIZWlnaHQgPSBOdW1iZXIodXJsUGFyYW1zLmdldCgnb2gnKSkgfHwgMTtcbiAgICBjb25zdCBvcmlnaW5hbFdpZHRoID0gTnVtYmVyKHVybFBhcmFtcy5nZXQoJ293JykpIHx8IDE7XG4gICAgY29uc3QgY3NzU2l6ZVJlc3RyaWN0aW9uID0gdGhpcy5nZXRDU1NTaXplUmVzdHJpY3Rpb24oaHRtbEVsZW1lbnQpO1xuICAgIGxldCBzaXplUmVzdHJpY3Rpb246IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChcbiAgICAgIChjc3NTaXplUmVzdHJpY3Rpb24ubWF4SGVpZ2h0IHx8IGNzc1NpemVSZXN0cmljdGlvbi5oZWlnaHQpICYmXG4gICAgICBjc3NTaXplUmVzdHJpY3Rpb24ubWF4V2lkdGhcbiAgICApIHtcbiAgICAgIHNpemVSZXN0cmljdGlvbiA9IHRoaXMuZ2V0U2l6ZVJlc3RyaWN0aW9ucyhcbiAgICAgICAgb3JpZ2luYWxIZWlnaHQsXG4gICAgICAgIG9yaWdpbmFsV2lkdGgsXG4gICAgICAgIChjc3NTaXplUmVzdHJpY3Rpb24ubWF4SGVpZ2h0IHx8IGNzc1NpemVSZXN0cmljdGlvbi5oZWlnaHQpISxcbiAgICAgICAgY3NzU2l6ZVJlc3RyaWN0aW9uLm1heFdpZHRoLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2l6ZVJlc3RyaWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKGRpc3BsYXlXYXJuaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgSW52YWxpZCB2YWx1ZSBzZXQgZm9yIGhlaWdodC9tYXgtaGVpZ2h0IGFuZC9vciBtYXgtd2lkdGggZm9yIEhUTUwgZWxlbWVudCwgdGhpcyBjYW4gY2F1c2Ugc2Nyb2xsaW5nIGlzc3VlcyBpbnNpZGUgdGhlIG1lc3NhZ2UgbGlzdCwgbW9yZSBpbmZvIGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9jb21wb25lbnRzL0F0dGFjaG1lbnRMaXN0Q29tcG9uZW50LyNpbWFnZS1hbmQtdmlkZW8tc2l6aW5nLCBhdHRhY2htZW50IFVSTDogJHt1cmwudG9TdHJpbmcoKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaXplUmVzdHJpY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGdldFNpemVSZXN0cmljdGlvbnMoXG4gICAgb3JpZ2luYWxIZWlnaHQ6IG51bWJlcixcbiAgICBvcmlnaW5hbFdpZHRoOiBudW1iZXIsXG4gICAgbWF4SGVpZ2h0OiBudW1iZXIsXG4gICAgbWF4V2lkdGg6IG51bWJlcixcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodDogTWF0aC5yb3VuZChcbiAgICAgICAgTWF0aC5tYXgobWF4SGVpZ2h0LCAobWF4V2lkdGggLyBvcmlnaW5hbFdpZHRoKSAqIG9yaWdpbmFsSGVpZ2h0KSxcbiAgICAgICksXG4gICAgICB3aWR0aDogTWF0aC5yb3VuZChcbiAgICAgICAgTWF0aC5tYXgobWF4SGVpZ2h0LCAobWF4V2lkdGggLyBvcmlnaW5hbEhlaWdodCkgKiBvcmlnaW5hbFdpZHRoKSxcbiAgICAgICksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q1NTU2l6ZVJlc3RyaWN0aW9uKGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGVzaGVldCA9IGdldENvbXB1dGVkU3R5bGUoaHRtbEVsZW1lbnQpO1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuZ2V0VmFsdWVSZXByZXNlbnRhdGlvbk9mQ1NTUHJvcGVydHkoXG4gICAgICBjb21wdXRlZFN0eWxlc2hlZXQuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JyksXG4gICAgKTtcbiAgICBjb25zdCBtYXhIZWlnaHQgPSB0aGlzLmdldFZhbHVlUmVwcmVzZW50YXRpb25PZkNTU1Byb3BlcnR5KFxuICAgICAgY29tcHV0ZWRTdHlsZXNoZWV0LmdldFByb3BlcnR5VmFsdWUoJ21heC1oZWlnaHQnKSxcbiAgICApO1xuICAgIGNvbnN0IG1heFdpZHRoID0gdGhpcy5nZXRWYWx1ZVJlcHJlc2VudGF0aW9uT2ZDU1NQcm9wZXJ0eShcbiAgICAgIGNvbXB1dGVkU3R5bGVzaGVldC5nZXRQcm9wZXJ0eVZhbHVlKCdtYXgtd2lkdGgnKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgaGVpZ2h0LCBtYXhIZWlnaHQsIG1heFdpZHRoIH07XG4gIH1cblxuICBwcml2YXRlIGdldFZhbHVlUmVwcmVzZW50YXRpb25PZkNTU1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gTnVtYmVyKHByb3BlcnR5LnJlcGxhY2UoJ3B4JywgJycpKSB8fCB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|