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.
Files changed (202) hide show
  1. package/README.md +2 -2
  2. package/assets/i18n/en.d.ts +0 -1
  3. package/assets/version.d.ts +1 -1
  4. package/{esm2022 → esm2020}/assets/i18n/en.mjs +1 -2
  5. package/{esm2022 → esm2020}/assets/version.mjs +2 -2
  6. package/esm2020/lib/attachment-configuration.service.mjs +182 -0
  7. package/esm2020/lib/attachment-list/attachment-list.component.mjs +232 -0
  8. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
  9. package/esm2020/lib/attachment.service.mjs +481 -0
  10. package/esm2020/lib/avatar/avatar.component.mjs +160 -0
  11. package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +66 -0
  12. package/esm2020/lib/channel/channel.component.mjs +45 -0
  13. package/esm2020/lib/channel-header/channel-header.component.mjs +72 -0
  14. package/esm2020/lib/channel-list/channel-list.component.mjs +47 -0
  15. package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
  16. package/esm2020/lib/channel-query.mjs +77 -0
  17. package/esm2020/lib/channel.service.mjs +1561 -0
  18. package/esm2020/lib/chat-client.service.mjs +233 -0
  19. package/esm2020/lib/custom-templates.service.mjs +244 -0
  20. package/{esm2022 → esm2020}/lib/date-parser.service.mjs +5 -5
  21. package/esm2020/lib/file-utils.mjs +35 -0
  22. package/{esm2022 → esm2020}/lib/get-channel-display-text.mjs +1 -1
  23. package/esm2020/lib/get-message-translation.mjs +12 -0
  24. package/esm2020/lib/icon/icon-placeholder/icon-placeholder.component.mjs +28 -0
  25. package/{esm2022 → esm2020}/lib/icon/icon.component.mjs +5 -5
  26. package/{esm2022 → esm2020}/lib/icon/icon.module.mjs +11 -11
  27. package/{esm2022 → esm2020}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
  28. package/esm2020/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +20 -0
  29. package/{esm2022 → esm2020}/lib/list-users.mjs +1 -1
  30. package/esm2020/lib/message/message.component.mjs +486 -0
  31. package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +123 -0
  32. package/esm2020/lib/message-actions.service.mjs +187 -0
  33. package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
  34. package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +333 -0
  35. package/{esm2022 → esm2020}/lib/message-input/emoji-input.service.mjs +7 -7
  36. package/esm2020/lib/message-input/message-input-config.service.mjs +50 -0
  37. package/esm2020/lib/message-input/message-input.component.mjs +507 -0
  38. package/{esm2022 → esm2020}/lib/message-input/textarea/textarea.component.mjs +6 -6
  39. package/{esm2022 → esm2020}/lib/message-input/textarea.directive.mjs +5 -5
  40. package/{esm2022 → esm2020}/lib/message-input/voice-recorder.service.mjs +5 -5
  41. package/{esm2022 → esm2020}/lib/message-list/group-styles.mjs +1 -1
  42. package/esm2020/lib/message-list/message-list.component.mjs +717 -0
  43. package/esm2020/lib/message-preview.mjs +21 -0
  44. package/esm2020/lib/message-reactions/message-reactions.component.mjs +168 -0
  45. package/esm2020/lib/message-reactions-selector/message-reactions-selector.component.mjs +61 -0
  46. package/{esm2022 → esm2020}/lib/message-reactions.service.mjs +6 -6
  47. package/esm2020/lib/message-text/message-text.component.mjs +143 -0
  48. package/esm2020/lib/message.service.mjs +43 -0
  49. package/{esm2022 → esm2020}/lib/modal/modal.component.mjs +6 -6
  50. package/esm2020/lib/notification/notification.component.mjs +20 -0
  51. package/esm2020/lib/notification-list/notification-list.component.mjs +36 -0
  52. package/{esm2022 → esm2020}/lib/notification.service.mjs +6 -6
  53. package/esm2020/lib/paginated-list/paginated-list.component.mjs +94 -0
  54. package/{esm2022 → esm2020}/lib/parse-date.mjs +1 -1
  55. package/esm2020/lib/read-by.mjs +12 -0
  56. package/esm2020/lib/stream-autocomplete-textarea.module.mjs +33 -0
  57. package/{esm2022 → esm2020}/lib/stream-avatar.module.mjs +5 -5
  58. package/{esm2022 → esm2020}/lib/stream-chat.module.mjs +59 -59
  59. package/{esm2022 → esm2020}/lib/stream-i18n.service.mjs +6 -6
  60. package/esm2020/lib/stream-textarea.module.mjs +31 -0
  61. package/{esm2022 → esm2020}/lib/theme.service.mjs +6 -6
  62. package/esm2020/lib/thread/thread.component.mjs +51 -0
  63. package/{esm2022 → esm2020}/lib/transliteration.service.mjs +5 -5
  64. package/esm2020/lib/types-custom.mjs +2 -0
  65. package/esm2020/lib/types.mjs +2 -0
  66. package/esm2020/lib/user-list/user-list.component.mjs +47 -0
  67. package/esm2020/lib/virtualized-list.service.mjs +271 -0
  68. package/{esm2022 → esm2020}/lib/virtualized-message-list.service.mjs +1 -1
  69. package/{esm2022 → esm2020}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
  70. package/{esm2022 → esm2020}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
  71. package/{esm2022 → esm2020}/lib/voice-recorder/media-recorder.mjs +1 -1
  72. package/esm2020/lib/voice-recorder/mp3-transcoder.mjs +61 -0
  73. package/esm2020/lib/voice-recorder/transcoder.service.mjs +121 -0
  74. package/esm2020/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +35 -0
  75. package/esm2020/lib/voice-recorder/voice-recorder.component.mjs +80 -0
  76. package/{esm2022 → esm2020}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
  77. package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +112 -0
  78. package/esm2020/lib/voice-recording/voice-recording.component.mjs +91 -0
  79. package/{esm2022 → esm2020}/lib/voice-recording/voice-recording.module.mjs +5 -5
  80. package/{esm2022 → esm2020}/lib/wave-form-sampler.mjs +1 -1
  81. package/esm2020/public-api.mjs +86 -0
  82. package/esm2020/stream-chat.mjs +2 -0
  83. package/fesm2015/stream-chat-angular.mjs +9171 -0
  84. package/fesm2015/stream-chat-angular.mjs.map +1 -0
  85. package/{fesm2022 → fesm2020}/stream-chat-angular.mjs +1251 -961
  86. package/fesm2020/stream-chat-angular.mjs.map +1 -0
  87. package/lib/attachment-configuration.service.d.ts +12 -12
  88. package/lib/attachment-list/attachment-list.component.d.ts +15 -10
  89. package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
  90. package/lib/attachment.service.d.ts +12 -10
  91. package/lib/avatar/avatar.component.d.ts +7 -7
  92. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +5 -5
  93. package/lib/channel/channel.component.d.ts +1 -1
  94. package/lib/channel-header/channel-header.component.d.ts +2 -2
  95. package/lib/channel-list/channel-list.component.d.ts +3 -4
  96. package/lib/channel-preview/channel-preview.component.d.ts +6 -6
  97. package/lib/channel-query.d.ts +26 -0
  98. package/lib/channel.service.d.ts +146 -154
  99. package/lib/chat-client.service.d.ts +17 -15
  100. package/lib/custom-templates.service.d.ts +50 -50
  101. package/lib/get-channel-display-text.d.ts +1 -2
  102. package/lib/get-message-translation.d.ts +3 -3
  103. package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +2 -2
  104. package/lib/icon/icon.component.d.ts +2 -2
  105. package/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
  106. package/lib/message/message.component.d.ts +6 -6
  107. package/lib/message-actions-box/message-actions-box.component.d.ts +5 -4
  108. package/lib/message-actions.service.d.ts +10 -10
  109. package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
  110. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +5 -5
  111. package/lib/message-input/emoji-input.service.d.ts +2 -2
  112. package/lib/message-input/message-input-config.service.d.ts +3 -3
  113. package/lib/message-input/message-input.component.d.ts +10 -33
  114. package/lib/message-input/textarea/textarea.component.d.ts +3 -3
  115. package/lib/message-input/textarea.directive.d.ts +1 -1
  116. package/lib/message-list/group-styles.d.ts +1 -1
  117. package/lib/message-list/message-list.component.d.ts +3 -2
  118. package/lib/message-preview.d.ts +2 -3
  119. package/lib/message-reactions/message-reactions.component.d.ts +9 -8
  120. package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +6 -5
  121. package/lib/message-reactions.service.d.ts +4 -4
  122. package/lib/message-text/message-text.component.d.ts +5 -5
  123. package/lib/message.service.d.ts +6 -7
  124. package/lib/modal/modal.component.d.ts +1 -1
  125. package/lib/notification/notification.component.d.ts +2 -2
  126. package/lib/notification-list/notification-list.component.d.ts +1 -0
  127. package/lib/notification.service.d.ts +1 -1
  128. package/lib/paginated-list/paginated-list.component.d.ts +2 -5
  129. package/lib/read-by.d.ts +1 -2
  130. package/lib/stream-i18n.service.d.ts +1 -1
  131. package/lib/theme.service.d.ts +1 -1
  132. package/lib/thread/thread.component.d.ts +3 -3
  133. package/lib/types-custom.d.ts +15 -0
  134. package/lib/types.d.ts +116 -155
  135. package/lib/user-list/user-list.component.d.ts +2 -3
  136. package/lib/virtualized-message-list.service.d.ts +1 -1
  137. package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
  138. package/lib/voice-recorder/media-recorder.d.ts +2 -2
  139. package/lib/voice-recorder/transcoder.service.d.ts +4 -4
  140. package/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.d.ts +1 -0
  141. package/lib/voice-recorder/voice-recorder.component.d.ts +2 -2
  142. package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +3 -3
  143. package/lib/voice-recording/voice-recording.component.d.ts +2 -3
  144. package/package.json +21 -15
  145. package/public-api.d.ts +3 -0
  146. package/src/assets/i18n/en.ts +0 -1
  147. package/src/assets/version.ts +1 -1
  148. package/esm2022/lib/attachment-configuration.service.mjs +0 -185
  149. package/esm2022/lib/attachment-list/attachment-list.component.mjs +0 -212
  150. package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
  151. package/esm2022/lib/attachment.service.mjs +0 -479
  152. package/esm2022/lib/avatar/avatar.component.mjs +0 -157
  153. package/esm2022/lib/avatar-placeholder/avatar-placeholder.component.mjs +0 -66
  154. package/esm2022/lib/channel/channel.component.mjs +0 -45
  155. package/esm2022/lib/channel-header/channel-header.component.mjs +0 -72
  156. package/esm2022/lib/channel-list/channel-list.component.mjs +0 -50
  157. package/esm2022/lib/channel-preview/channel-preview.component.mjs +0 -150
  158. package/esm2022/lib/channel.service.mjs +0 -1393
  159. package/esm2022/lib/chat-client.service.mjs +0 -227
  160. package/esm2022/lib/custom-templates.service.mjs +0 -244
  161. package/esm2022/lib/file-utils.mjs +0 -35
  162. package/esm2022/lib/get-message-translation.mjs +0 -12
  163. package/esm2022/lib/icon/icon-placeholder/icon-placeholder.component.mjs +0 -28
  164. package/esm2022/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +0 -20
  165. package/esm2022/lib/message/message.component.mjs +0 -486
  166. package/esm2022/lib/message-actions-box/message-actions-box.component.mjs +0 -120
  167. package/esm2022/lib/message-actions.service.mjs +0 -187
  168. package/esm2022/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +0 -71
  169. package/esm2022/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +0 -333
  170. package/esm2022/lib/message-input/message-input-config.service.mjs +0 -50
  171. package/esm2022/lib/message-input/message-input.component.mjs +0 -507
  172. package/esm2022/lib/message-list/message-list.component.mjs +0 -715
  173. package/esm2022/lib/message-preview.mjs +0 -21
  174. package/esm2022/lib/message-reactions/message-reactions.component.mjs +0 -165
  175. package/esm2022/lib/message-reactions-selector/message-reactions-selector.component.mjs +0 -57
  176. package/esm2022/lib/message-text/message-text.component.mjs +0 -143
  177. package/esm2022/lib/message.service.mjs +0 -43
  178. package/esm2022/lib/notification/notification.component.mjs +0 -20
  179. package/esm2022/lib/notification-list/notification-list.component.mjs +0 -33
  180. package/esm2022/lib/paginated-list/paginated-list.component.mjs +0 -94
  181. package/esm2022/lib/read-by.mjs +0 -12
  182. package/esm2022/lib/stream-autocomplete-textarea.module.mjs +0 -33
  183. package/esm2022/lib/stream-textarea.module.mjs +0 -31
  184. package/esm2022/lib/thread/thread.component.mjs +0 -51
  185. package/esm2022/lib/types.mjs +0 -2
  186. package/esm2022/lib/user-list/user-list.component.mjs +0 -47
  187. package/esm2022/lib/virtualized-list.service.mjs +0 -273
  188. package/esm2022/lib/voice-recorder/mp3-transcoder.mjs +0 -61
  189. package/esm2022/lib/voice-recorder/transcoder.service.mjs +0 -121
  190. package/esm2022/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +0 -32
  191. package/esm2022/lib/voice-recorder/voice-recorder.component.mjs +0 -80
  192. package/esm2022/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +0 -112
  193. package/esm2022/lib/voice-recording/voice-recording.component.mjs +0 -91
  194. package/esm2022/public-api.mjs +0 -82
  195. package/fesm2022/stream-chat-angular.mjs.map +0 -1
  196. /package/{esm2022 → esm2020}/lib/format-duration.mjs +0 -0
  197. /package/{esm2022 → esm2020}/lib/injection-tokens.mjs +0 -0
  198. /package/{esm2022 → esm2020}/lib/is-image-attachment.mjs +0 -0
  199. /package/{esm2022 → esm2020}/lib/is-on-separate-date.mjs +0 -0
  200. /package/{esm2022 → esm2020}/lib/is-safari.mjs +0 -0
  201. /package/{esm2022 → esm2020}/lib/message-input/textarea.interface.mjs +0 -0
  202. /package/{esm2022 → esm2020}/stream-chat-angular.mjs +0 -0
@@ -0,0 +1,123 @@
1
+ import { Component, Input, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../custom-templates.service";
4
+ import * as i2 from "../message-actions.service";
5
+ import * as i3 from "@angular/common";
6
+ import * as i4 from "../message-reactions-selector/message-reactions-selector.component";
7
+ import * as i5 from "@ngx-translate/core";
8
+ /**
9
+ * The `MessageActionsBox` component displays a list of message actions (i.e edit), that can be opened or closed. You can find the [list of the supported actions](/chat/docs/sdk/angular/v6-rc/concepts/message-interactions/) in the message interaction guide.
10
+ */
11
+ export class MessageActionsBoxComponent {
12
+ constructor(customTemplatesService, messageActionsService, cdRef) {
13
+ this.customTemplatesService = customTemplatesService;
14
+ this.messageActionsService = messageActionsService;
15
+ this.cdRef = cdRef;
16
+ /**
17
+ * Indicates if the message actions are belonging to a message that was sent by the current user or not.
18
+ */
19
+ this.isMine = false;
20
+ /**
21
+ * The list of [channel capabilities](/chat/docs/javascript/channel_capabilities/) that are enabled for the current user, the list of [supported interactions](/chat/docs/sdk/angular/v6-rc/concepts/message-interactions) can be found in our message interaction guide. Unathorized actions won't be displayed on the UI.
22
+ */
23
+ this.enabledActions = [];
24
+ this.visibleMessageActionItems = [];
25
+ this.isEditModalOpen = false;
26
+ this.customActions = [];
27
+ this.subscriptions = [];
28
+ this.isViewInited = false;
29
+ this.messageActionItems = this.messageActionsService.defaultActions;
30
+ }
31
+ ngOnInit() {
32
+ this.subscriptions.push(this.messageActionsService.customActions$.subscribe((actions) => {
33
+ this.customActions = actions;
34
+ this.setVisibleActions();
35
+ if (this.isViewInited) {
36
+ this.cdRef.detectChanges();
37
+ }
38
+ }));
39
+ this.subscriptions.push(this.messageActionsService.messageToEdit$.subscribe((m) => {
40
+ let isEditModalOpen = false;
41
+ if (m && m.id === this.message?.id) {
42
+ isEditModalOpen = true;
43
+ }
44
+ if (isEditModalOpen !== this.isEditModalOpen) {
45
+ this.isEditModalOpen = isEditModalOpen;
46
+ if (this.isViewInited) {
47
+ this.cdRef.detectChanges();
48
+ }
49
+ }
50
+ }));
51
+ }
52
+ ngOnChanges(changes) {
53
+ if (changes.isMine || changes.enabledActions || changes.message) {
54
+ this.setVisibleActions();
55
+ }
56
+ }
57
+ ngAfterViewInit() {
58
+ this.isViewInited = true;
59
+ }
60
+ ngOnDestroy() {
61
+ this.subscriptions.forEach((s) => s.unsubscribe());
62
+ }
63
+ getActionLabel(actionLabelOrTranslationKey) {
64
+ return typeof actionLabelOrTranslationKey === 'string'
65
+ ? actionLabelOrTranslationKey
66
+ : actionLabelOrTranslationKey(this.message);
67
+ }
68
+ getReactionSelectorTemplateContext() {
69
+ return {
70
+ messageId: this.message?.id,
71
+ ownReactions: this.message?.own_reactions || [],
72
+ };
73
+ }
74
+ getMessageActionTemplateContext(item) {
75
+ if (this.isReactAction(item)) {
76
+ return {};
77
+ }
78
+ else {
79
+ return {
80
+ actionHandler: item.actionHandler,
81
+ actionHandlerExtraParams: {
82
+ isMine: this.isMine,
83
+ messageTextHtmlElement: this.messageTextHtmlElement,
84
+ },
85
+ actionName: item.actionName,
86
+ message: this.message,
87
+ actionLabelOrTranslationKey: item.actionLabelOrTranslationKey,
88
+ };
89
+ }
90
+ }
91
+ trackByActionName(_, item) {
92
+ return item.actionName;
93
+ }
94
+ isReactAction(item) {
95
+ return item.actionName === 'react';
96
+ }
97
+ setVisibleActions() {
98
+ if (!this.message) {
99
+ this.visibleMessageActionItems = [];
100
+ }
101
+ else {
102
+ this.visibleMessageActionItems = [
103
+ ...this.messageActionItems,
104
+ ...this.customActions,
105
+ ].filter((item) => item.isVisible(this.enabledActions, this.isMine, this.message));
106
+ }
107
+ }
108
+ }
109
+ MessageActionsBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageActionsBoxComponent, deps: [{ token: i1.CustomTemplatesService }, { token: i2.MessageActionsService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
110
+ MessageActionsBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: MessageActionsBoxComponent, selector: "stream-message-actions-box", inputs: { isMine: "isMine", message: "message", messageTextHtmlElement: "messageTextHtmlElement", enabledActions: "enabledActions" }, usesOnChanges: true, ngImport: i0, template: "<div\n #actionBox\n data-testid=\"action-box\"\n class=\"str-chat__message-actions-box str-chat__message-actions-box-angular str-chat__message-actions-box--open\"\n>\n <ul class=\"str-chat__message-actions-list\">\n <ng-container\n *ngFor=\"let item of visibleMessageActionItems; trackBy: trackByActionName\"\n >\n <ng-container [ngSwitch]=\"item.actionName\">\n <ng-container *ngSwitchCase=\"'react'\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageReactionsSelectorTemplate$\n | async) || defaultReactionSelector;\n context: getReactionSelectorTemplateContext()\n \"\n ></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageActionsBoxItemTemplate$ | async) ||\n defaultMessageActionItem;\n context: getMessageActionTemplateContext(item)\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </ul>\n</div>\n\n<ng-template\n #defaultMessageActionItem\n let-actionName=\"actionName\"\n let-actionHandler=\"actionHandler\"\n let-actionLabelOrTranslationKey=\"actionLabelOrTranslationKey\"\n let-actionHandlerExtraParams=\"actionHandlerExtraParams\"\n>\n <button\n class=\"str-chat__message-actions-list-item-button\"\n [attr.data-testid]=\"actionName + '-action'\"\n (click)=\"actionHandler(message, actionHandlerExtraParams)\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ getActionLabel(actionLabelOrTranslationKey) | translate }}\n </li>\n </button>\n</ng-template>\n\n<ng-template\n #defaultReactionSelector\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n>\n <stream-message-reactions-selector\n [messageId]=\"message?.id\"\n [ownReactions]=\"message?.own_reactions || []\"\n ></stream-message-reactions-selector>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i4.MessageReactionsSelectorComponent, selector: "stream-message-reactions-selector", inputs: ["ownReactions", "messageId"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] });
111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageActionsBoxComponent, decorators: [{
112
+ type: Component,
113
+ args: [{ selector: 'stream-message-actions-box', template: "<div\n #actionBox\n data-testid=\"action-box\"\n class=\"str-chat__message-actions-box str-chat__message-actions-box-angular str-chat__message-actions-box--open\"\n>\n <ul class=\"str-chat__message-actions-list\">\n <ng-container\n *ngFor=\"let item of visibleMessageActionItems; trackBy: trackByActionName\"\n >\n <ng-container [ngSwitch]=\"item.actionName\">\n <ng-container *ngSwitchCase=\"'react'\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageReactionsSelectorTemplate$\n | async) || defaultReactionSelector;\n context: getReactionSelectorTemplateContext()\n \"\n ></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageActionsBoxItemTemplate$ | async) ||\n defaultMessageActionItem;\n context: getMessageActionTemplateContext(item)\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </ul>\n</div>\n\n<ng-template\n #defaultMessageActionItem\n let-actionName=\"actionName\"\n let-actionHandler=\"actionHandler\"\n let-actionLabelOrTranslationKey=\"actionLabelOrTranslationKey\"\n let-actionHandlerExtraParams=\"actionHandlerExtraParams\"\n>\n <button\n class=\"str-chat__message-actions-list-item-button\"\n [attr.data-testid]=\"actionName + '-action'\"\n (click)=\"actionHandler(message, actionHandlerExtraParams)\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ getActionLabel(actionLabelOrTranslationKey) | translate }}\n </li>\n </button>\n</ng-template>\n\n<ng-template\n #defaultReactionSelector\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n>\n <stream-message-reactions-selector\n [messageId]=\"message?.id\"\n [ownReactions]=\"message?.own_reactions || []\"\n ></stream-message-reactions-selector>\n</ng-template>\n" }]
114
+ }], ctorParameters: function () { return [{ type: i1.CustomTemplatesService }, { type: i2.MessageActionsService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { isMine: [{
115
+ type: Input
116
+ }], message: [{
117
+ type: Input
118
+ }], messageTextHtmlElement: [{
119
+ type: Input
120
+ }], enabledActions: [{
121
+ type: Input
122
+ }] } });
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1hY3Rpb25zLWJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS1hY3Rpb25zLWJveC9tZXNzYWdlLWFjdGlvbnMtYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWFjdGlvbnMtYm94L21lc3NhZ2UtYWN0aW9ucy1ib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFDVCxLQUFLLEdBTU4sTUFBTSxlQUFlLENBQUM7Ozs7Ozs7QUFZdkI7O0dBRUc7QUFNSCxNQUFNLE9BQU8sMEJBQTBCO0lBbUNyQyxZQUNrQixzQkFBOEMsRUFDdEQscUJBQTRDLEVBQzVDLEtBQXdCO1FBRmhCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDdEQsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQW5DbEM7O1dBRUc7UUFDTSxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBU3hCOztXQUVHO1FBQ00sbUJBQWMsR0FBYSxFQUFFLENBQUM7UUFJdkMsOEJBQXlCLEdBSW5CLEVBQUUsQ0FBQztRQUNULG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGtCQUFhLEdBQThCLEVBQUUsQ0FBQztRQUt0QyxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFDbkMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFNM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUM7SUFDdEUsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLHFCQUFxQixDQUFD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LENBQUMseUJBQXlCLEdBQUcsRUFBRSxDQUFDO1NBQ3JDO2FBQU07WUFDTCxJQUFJLENBQUMseUJBQXlCLEdBQUc7Z0JBQy9CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQjtnQkFDMUIsR0FBRyxJQUFJLENBQUMsYUFBYTthQUN0QixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFRLENBQUMsQ0FDaEUsQ0FBQztTQUNIO0lBQ0gsQ0FBQzs7dUhBdEpVLDBCQUEwQjsyR0FBMUIsMEJBQTBCLDZOQzlCdkMsbWhFQTZEQTsyRkQvQmEsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLDRCQUE0QjtpTEFVN0IsTUFBTTtzQkFBZCxLQUFLO2dCQUlHLE9BQU87c0JBQWYsS0FBSztnQkFJRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBSUcsY0FBYztzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuLi9jdXN0b20tdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW0sXG4gIE1lc3NhZ2VBY3Rpb25Cb3hJdGVtQ29udGV4dCxcbiAgTWVzc2FnZUFjdGlvbkl0ZW0sXG4gIE1lc3NhZ2VSZWFjdGlvbkFjdGlvbkl0ZW0sXG4gIE1lc3NhZ2VSZWFjdGlvbnNTZWxlY3RvckNvbnRleHQsXG4gIFN0cmVhbU1lc3NhZ2UsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE1lc3NhZ2VBY3Rpb25zU2VydmljZSB9IGZyb20gJy4uL21lc3NhZ2UtYWN0aW9ucy5zZXJ2aWNlJztcbi8qKlxuICogVGhlIGBNZXNzYWdlQWN0aW9uc0JveGAgY29tcG9uZW50IGRpc3BsYXlzIGEgbGlzdCBvZiBtZXNzYWdlIGFjdGlvbnMgKGkuZSBlZGl0KSwgdGhhdCBjYW4gYmUgb3BlbmVkIG9yIGNsb3NlZC4gWW91IGNhbiBmaW5kIHRoZSBbbGlzdCBvZiB0aGUgc3VwcG9ydGVkIGFjdGlvbnNdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvdjYtcmMvY29uY2VwdHMvbWVzc2FnZS1pbnRlcmFjdGlvbnMvKSBpbiB0aGUgbWVzc2FnZSBpbnRlcmFjdGlvbiBndWlkZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLW1lc3NhZ2UtYWN0aW9ucy1ib3gnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS1hY3Rpb25zLWJveC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VBY3Rpb25zQm94Q29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdFxue1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlIGFjdGlvbnMgYXJlIGJlbG9uZ2luZyB0byBhIG1lc3NhZ2UgdGhhdCB3YXMgc2VudCBieSB0aGUgY3VycmVudCB1c2VyIG9yIG5vdC5cbiAgICovXG4gIEBJbnB1dCgpIGlzTWluZSA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgdGhlIGFjdGlvbnMgd2lsbCBiZSBleGVjdXRlZCBvblxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBIVE1MIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIG1lc3NhZ2UgdGV4dCwgaXQncyB1c2VkIGZvciB0aGUgXCJjb3B5IG1lc3NhZ2UgdGV4dFwiIGFjdGlvblxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZVRleHRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBbY2hhbm5lbCBjYXBhYmlsaXRpZXNdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC9jaGFubmVsX2NhcGFiaWxpdGllcy8pIHRoYXQgYXJlIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IHVzZXIsIHRoZSBsaXN0IG9mIFtzdXBwb3J0ZWQgaW50ZXJhY3Rpb25zXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3Y2LXJjL2NvbmNlcHRzL21lc3NhZ2UtaW50ZXJhY3Rpb25zKSBjYW4gYmUgZm91bmQgaW4gb3VyIG1lc3NhZ2UgaW50ZXJhY3Rpb24gZ3VpZGUuIFVuYXRob3JpemVkIGFjdGlvbnMgd29uJ3QgYmUgZGlzcGxheWVkIG9uIHRoZSBVSS5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZWRBY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBtZXNzYWdlQWN0aW9uSXRlbVRlbXBsYXRlOlxuICAgIHwgVGVtcGxhdGVSZWY8TWVzc2FnZUFjdGlvbkJveEl0ZW1Db250ZXh0PlxuICAgIHwgdW5kZWZpbmVkO1xuICB2aXNpYmxlTWVzc2FnZUFjdGlvbkl0ZW1zOiAoXG4gICAgfCBNZXNzYWdlQWN0aW9uSXRlbVxuICAgIHwgQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW1cbiAgICB8IE1lc3NhZ2VSZWFjdGlvbkFjdGlvbkl0ZW1cbiAgKVtdID0gW107XG4gIGlzRWRpdE1vZGFsT3BlbiA9IGZhbHNlO1xuICBjdXN0b21BY3Rpb25zOiBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZUFjdGlvbkl0ZW1zOiAoXG4gICAgfCBNZXNzYWdlQWN0aW9uSXRlbVxuICAgIHwgTWVzc2FnZVJlYWN0aW9uQWN0aW9uSXRlbVxuICApW107XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBpc1ZpZXdJbml0ZWQgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlQWN0aW9uc1NlcnZpY2U6IE1lc3NhZ2VBY3Rpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLm1lc3NhZ2VBY3Rpb25JdGVtcyA9IHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmRlZmF1bHRBY3Rpb25zO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25zJC5zdWJzY3JpYmUoKGFjdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5jdXN0b21BY3Rpb25zID0gYWN0aW9ucztcbiAgICAgICAgdGhpcy5zZXRWaXNpYmxlQWN0aW9ucygpO1xuICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UubWVzc2FnZVRvRWRpdCQuc3Vic2NyaWJlKChtKSA9PiB7XG4gICAgICAgIGxldCBpc0VkaXRNb2RhbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKG0gJiYgbS5pZCA9PT0gdGhpcy5tZXNzYWdlPy5pZCkge1xuICAgICAgICAgIGlzRWRpdE1vZGFsT3BlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRWRpdE1vZGFsT3BlbiAhPT0gdGhpcy5pc0VkaXRNb2RhbE9wZW4pIHtcbiAgICAgICAgICB0aGlzLmlzRWRpdE1vZGFsT3BlbiA9IGlzRWRpdE1vZGFsT3BlbjtcbiAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmlzTWluZSB8fCBjaGFuZ2VzLmVuYWJsZWRBY3Rpb25zIHx8IGNoYW5nZXMubWVzc2FnZSkge1xuICAgICAgdGhpcy5zZXRWaXNpYmxlQWN0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzVmlld0luaXRlZCA9IHRydWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIGdldEFjdGlvbkxhYmVsKFxuICAgIGFjdGlvbkxhYmVsT3JUcmFuc2xhdGlvbktleTogKChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlKSA9PiBzdHJpbmcpIHwgc3RyaW5nXG4gICkge1xuICAgIHJldHVybiB0eXBlb2YgYWN0aW9uTGFiZWxPclRyYW5zbGF0aW9uS2V5ID09PSAnc3RyaW5nJ1xuICAgICAgPyBhY3Rpb25MYWJlbE9yVHJhbnNsYXRpb25LZXlcbiAgICAgIDogYWN0aW9uTGFiZWxPclRyYW5zbGF0aW9uS2V5KHRoaXMubWVzc2FnZSEpO1xuICB9XG5cbiAgZ2V0UmVhY3Rpb25TZWxlY3RvclRlbXBsYXRlQ29udGV4dCgpOiBNZXNzYWdlUmVhY3Rpb25zU2VsZWN0b3JDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZUlkOiB0aGlzLm1lc3NhZ2U/LmlkLFxuICAgICAgb3duUmVhY3Rpb25zOiB0aGlzLm1lc3NhZ2U/Lm93bl9yZWFjdGlvbnMgfHwgW10sXG4gICAgfTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VBY3Rpb25UZW1wbGF0ZUNvbnRleHQoXG4gICAgaXRlbTpcbiAgICAgIHwgTWVzc2FnZUFjdGlvbkl0ZW1cbiAgICAgIHwgQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW1cbiAgICAgIHwgTWVzc2FnZVJlYWN0aW9uQWN0aW9uSXRlbVxuICApOiBNZXNzYWdlQWN0aW9uQm94SXRlbUNvbnRleHQge1xuICAgIGlmICh0aGlzLmlzUmVhY3RBY3Rpb24oaXRlbSkpIHtcbiAgICAgIHJldHVybiB7fSBhcyBNZXNzYWdlQWN0aW9uQm94SXRlbUNvbnRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdGlvbkhhbmRsZXI6IGl0ZW0uYWN0aW9uSGFuZGxlcixcbiAgICAgICAgYWN0aW9uSGFuZGxlckV4dHJhUGFyYW1zOiB7XG4gICAgICAgICAgaXNNaW5lOiB0aGlzLmlzTWluZSxcbiAgICAgICAgICBtZXNzYWdlVGV4dEh0bWxFbGVtZW50OiB0aGlzLm1lc3NhZ2VUZXh0SHRtbEVsZW1lbnQsXG4gICAgICAgIH0sXG4gICAgICAgIGFjdGlvbk5hbWU6IGl0ZW0uYWN0aW9uTmFtZSxcbiAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlISxcbiAgICAgICAgYWN0aW9uTGFiZWxPclRyYW5zbGF0aW9uS2V5OiBpdGVtLmFjdGlvbkxhYmVsT3JUcmFuc2xhdGlvbktleSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeUFjdGlvbk5hbWUoXG4gICAgXzogbnVtYmVyLFxuICAgIGl0ZW06XG4gICAgICB8IE1lc3NhZ2VBY3Rpb25JdGVtXG4gICAgICB8IEN1c3RvbU1lc3NhZ2VBY3Rpb25JdGVtXG4gICAgICB8IE1lc3NhZ2VSZWFjdGlvbkFjdGlvbkl0ZW1cbiAgKSB7XG4gICAgcmV0dXJuIGl0ZW0uYWN0aW9uTmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNSZWFjdEFjdGlvbihcbiAgICBpdGVtOlxuICAgICAgfCBNZXNzYWdlQWN0aW9uSXRlbVxuICAgICAgfCBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbVxuICAgICAgfCBNZXNzYWdlUmVhY3Rpb25BY3Rpb25JdGVtXG4gICk6IGl0ZW0gaXMgTWVzc2FnZVJlYWN0aW9uQWN0aW9uSXRlbSB7XG4gICAgcmV0dXJuIGl0ZW0uYWN0aW9uTmFtZSA9PT0gJ3JlYWN0JztcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmlzaWJsZUFjdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMudmlzaWJsZU1lc3NhZ2VBY3Rpb25JdGVtcyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZpc2libGVNZXNzYWdlQWN0aW9uSXRlbXMgPSBbXG4gICAgICAgIC4uLnRoaXMubWVzc2FnZUFjdGlvbkl0ZW1zLFxuICAgICAgICAuLi50aGlzLmN1c3RvbUFjdGlvbnMsXG4gICAgICBdLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICAgaXRlbS5pc1Zpc2libGUodGhpcy5lbmFibGVkQWN0aW9ucywgdGhpcy5pc01pbmUsIHRoaXMubWVzc2FnZSEpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICAjYWN0aW9uQm94XG4gIGRhdGEtdGVzdGlkPVwiYWN0aW9uLWJveFwiXG4gIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9ucy1ib3ggc3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9ucy1ib3gtYW5ndWxhciBzdHItY2hhdF9fbWVzc2FnZS1hY3Rpb25zLWJveC0tb3BlblwiXG4+XG4gIDx1bCBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbnMtbGlzdFwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHZpc2libGVNZXNzYWdlQWN0aW9uSXRlbXM7IHRyYWNrQnk6IHRyYWNrQnlBY3Rpb25OYW1lXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJpdGVtLmFjdGlvbk5hbWVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3JlYWN0J1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VSZWFjdGlvbnNTZWxlY3RvclRlbXBsYXRlJFxuICAgICAgICAgICAgICAgIHwgYXN5bmMpIHx8IGRlZmF1bHRSZWFjdGlvblNlbGVjdG9yO1xuICAgICAgICAgICAgICBjb250ZXh0OiBnZXRSZWFjdGlvblNlbGVjdG9yVGVtcGxhdGVDb250ZXh0KClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VBY3Rpb25zQm94SXRlbVRlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlQWN0aW9uSXRlbTtcbiAgICAgICAgICAgICAgY29udGV4dDogZ2V0TWVzc2FnZUFjdGlvblRlbXBsYXRlQ29udGV4dChpdGVtKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdWw+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICNkZWZhdWx0TWVzc2FnZUFjdGlvbkl0ZW1cbiAgbGV0LWFjdGlvbk5hbWU9XCJhY3Rpb25OYW1lXCJcbiAgbGV0LWFjdGlvbkhhbmRsZXI9XCJhY3Rpb25IYW5kbGVyXCJcbiAgbGV0LWFjdGlvbkxhYmVsT3JUcmFuc2xhdGlvbktleT1cImFjdGlvbkxhYmVsT3JUcmFuc2xhdGlvbktleVwiXG4gIGxldC1hY3Rpb25IYW5kbGVyRXh0cmFQYXJhbXM9XCJhY3Rpb25IYW5kbGVyRXh0cmFQYXJhbXNcIlxuPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hY3Rpb25zLWxpc3QtaXRlbS1idXR0b25cIlxuICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cImFjdGlvbk5hbWUgKyAnLWFjdGlvbidcIlxuICAgIChjbGljayk9XCJhY3Rpb25IYW5kbGVyKG1lc3NhZ2UsIGFjdGlvbkhhbmRsZXJFeHRyYVBhcmFtcylcIlxuICA+XG4gICAgPGxpIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9ucy1saXN0LWl0ZW1cIj5cbiAgICAgIHt7IGdldEFjdGlvbkxhYmVsKGFjdGlvbkxhYmVsT3JUcmFuc2xhdGlvbktleSkgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2xpPlxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjZGVmYXVsdFJlYWN0aW9uU2VsZWN0b3JcbiAgbGV0LW1lc3NhZ2VJZD1cIm1lc3NhZ2VJZFwiXG4gIGxldC1vd25SZWFjdGlvbnM9XCJvd25SZWFjdGlvbnNcIlxuPlxuICA8c3RyZWFtLW1lc3NhZ2UtcmVhY3Rpb25zLXNlbGVjdG9yXG4gICAgW21lc3NhZ2VJZF09XCJtZXNzYWdlPy5pZFwiXG4gICAgW293blJlYWN0aW9uc109XCJtZXNzYWdlPy5vd25fcmVhY3Rpb25zIHx8IFtdXCJcbiAgPjwvc3RyZWFtLW1lc3NhZ2UtcmVhY3Rpb25zLXNlbGVjdG9yPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -0,0 +1,187 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject, combineLatest } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./chat-client.service";
5
+ import * as i2 from "./notification.service";
6
+ import * as i3 from "./channel.service";
7
+ /**
8
+ * The message actions service provides customization options for the [message actions](/chat/docs/sdk/angular/v6-rc/components/MessageActionsBoxComponent)
9
+ */
10
+ export class MessageActionsService {
11
+ constructor(chatClientService, notificationService, channelService) {
12
+ this.chatClientService = chatClientService;
13
+ this.notificationService = notificationService;
14
+ this.channelService = channelService;
15
+ /**
16
+ * Default actions - these are the actions that are handled by the built-in component
17
+ */
18
+ this.defaultActions = [
19
+ {
20
+ actionName: 'react',
21
+ isVisible: (enabledActions) => {
22
+ return enabledActions.indexOf('send-reaction') !== -1;
23
+ },
24
+ },
25
+ {
26
+ actionName: 'mark-unread',
27
+ actionLabelOrTranslationKey: 'streamChat.Mark as unread',
28
+ actionHandler: (message) => {
29
+ void this.channelService.markMessageUnread(message.id);
30
+ },
31
+ isVisible: (enabledActions, _, message) => enabledActions.indexOf('read-events') !== -1 && !message.parent_id,
32
+ },
33
+ {
34
+ actionName: 'quote',
35
+ actionLabelOrTranslationKey: 'streamChat.Reply',
36
+ actionHandler: (message) => {
37
+ this.channelService.selectMessageToQuote(message);
38
+ },
39
+ isVisible: (enabledActions) => enabledActions.indexOf('quote-message') !== -1,
40
+ },
41
+ {
42
+ actionName: 'thread-reply',
43
+ actionLabelOrTranslationKey: 'streamChat.Thread',
44
+ actionHandler: (message) => {
45
+ void this.channelService.setAsActiveParentMessage(message);
46
+ },
47
+ isVisible: (enabledActions, _, message) => enabledActions.indexOf('send-reply') !== -1 && !message.parent_id,
48
+ },
49
+ {
50
+ actionName: 'pin',
51
+ actionLabelOrTranslationKey: (message) => message.pinned ? 'streamChat.Unpin' : 'streamChat.Pin',
52
+ actionHandler: (message) => {
53
+ message.pinned
54
+ ? void this.channelService.unpinMessage(message)
55
+ : void this.channelService.pinMessage(message);
56
+ },
57
+ isVisible: (enabledActions) => enabledActions.indexOf('pin-message') !== -1,
58
+ },
59
+ {
60
+ actionName: 'flag',
61
+ actionLabelOrTranslationKey: 'streamChat.Flag',
62
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
63
+ actionHandler: async (message) => {
64
+ try {
65
+ await this.chatClientService.flagMessage(message.id);
66
+ this.notificationService.addTemporaryNotification('streamChat.Message has been successfully flagged', 'success');
67
+ }
68
+ catch (error) {
69
+ this.notificationService.addTemporaryNotification('streamChat.Error adding flag');
70
+ }
71
+ },
72
+ isVisible: (enabledActions, isMine) => enabledActions.indexOf('flag-message') !== -1 && !isMine,
73
+ },
74
+ {
75
+ actionName: 'edit',
76
+ actionLabelOrTranslationKey: 'streamChat.Edit Message',
77
+ actionHandler: (message) => {
78
+ this.messageToEdit$.next(message);
79
+ },
80
+ isVisible: (enabledActions, isMine) => (enabledActions.indexOf('update-own-message') !== -1 && isMine) ||
81
+ enabledActions.indexOf('update-any-message') !== -1,
82
+ },
83
+ {
84
+ actionName: 'delete',
85
+ actionLabelOrTranslationKey: 'streamChat.Delete',
86
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
87
+ actionHandler: async (message) => {
88
+ try {
89
+ await this.channelService.deleteMessage(message);
90
+ }
91
+ catch (error) {
92
+ this.notificationService.addTemporaryNotification('streamChat.Error deleting message');
93
+ }
94
+ },
95
+ isVisible: (enabledActions, isMine) => ((enabledActions.indexOf('delete') !== -1 ||
96
+ enabledActions.indexOf('delete-own-message') !== -1) &&
97
+ isMine) ||
98
+ enabledActions.indexOf('delete-any') !== -1 ||
99
+ enabledActions.indexOf('delete-any-message') !== -1,
100
+ },
101
+ {
102
+ actionName: 'copy-message-text',
103
+ actionLabelOrTranslationKey: 'streamChat.Copy text',
104
+ isVisible: (_, __, message) => {
105
+ const isClipboardSupported = navigator?.clipboard?.write !== undefined;
106
+ if (!isClipboardSupported && !this.hasDisplayedClipboardWarning) {
107
+ console.warn(`[Stream Chat] Copy action is disabled because clipboard API isn't available, please check security and browser requirements: https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/write#security_considerations`);
108
+ this.hasDisplayedClipboardWarning = true;
109
+ }
110
+ return (!!message.text &&
111
+ (message.type === 'regular' || message.type === 'reply') &&
112
+ isClipboardSupported);
113
+ },
114
+ actionHandler: (message, extraParams) => {
115
+ const fallbackContent = message.text || '';
116
+ // Android Chrome can only copy plain text: https://issues.chromium.org/issues/40851502
117
+ void navigator.clipboard.write([
118
+ new ClipboardItem({
119
+ 'text/plain': new Blob([
120
+ extraParams.messageTextHtmlElement?.innerText ||
121
+ fallbackContent,
122
+ ], { type: 'text/plain' }),
123
+ 'text/html': new Blob([
124
+ extraParams.messageTextHtmlElement?.innerHTML ||
125
+ fallbackContent,
126
+ ], { type: 'text/html' }),
127
+ }),
128
+ ]);
129
+ },
130
+ },
131
+ ];
132
+ /**
133
+ * The built-in components will handle changes to this observable.
134
+ */
135
+ this.messageToEdit$ = new BehaviorSubject(undefined);
136
+ /**
137
+ * You can pass your own custom actions that will be displayed inside the built-in message actions component
138
+ */
139
+ this.customActions$ = new BehaviorSubject([]);
140
+ /**
141
+ * @internal
142
+ */
143
+ this.messageMenuOpenedFor$ = new BehaviorSubject(undefined);
144
+ this.hasDisplayedClipboardWarning = false;
145
+ combineLatest([
146
+ this.messageToEdit$,
147
+ this.channelService.activeChannel$,
148
+ ]).subscribe(([messageToEdit, activeChannel]) => {
149
+ if (messageToEdit &&
150
+ (!activeChannel || activeChannel?.cid !== messageToEdit.cid)) {
151
+ this.messageToEdit$.next(undefined);
152
+ }
153
+ });
154
+ combineLatest([
155
+ this.messageToEdit$,
156
+ this.channelService.activeParentMessageId$,
157
+ ]).subscribe(([messageToEdit, parentMessageId]) => {
158
+ if (messageToEdit &&
159
+ messageToEdit.parent_id &&
160
+ messageToEdit.parent_id !== parentMessageId) {
161
+ this.messageToEdit$.next(undefined);
162
+ }
163
+ });
164
+ }
165
+ /**
166
+ * This method returns how many authorized actions are available to the given message
167
+ * @param message
168
+ * @param enabledActions
169
+ * @returns the count
170
+ */
171
+ getAuthorizedMessageActionsCount(message, enabledActions) {
172
+ const customActions = this.customActions$.getValue() || [];
173
+ const allActions = [...this.defaultActions, ...customActions];
174
+ const currentUserId = this.chatClientService.chatClient.user?.id;
175
+ const isMine = message.user_id === currentUserId;
176
+ return allActions.filter((item) => item.isVisible(enabledActions, isMine, message)).length;
177
+ }
178
+ }
179
+ MessageActionsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageActionsService, deps: [{ token: i1.ChatClientService }, { token: i2.NotificationService }, { token: i3.ChannelService }], target: i0.ɵɵFactoryTarget.Injectable });
180
+ MessageActionsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageActionsService, providedIn: 'root' });
181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageActionsService, decorators: [{
182
+ type: Injectable,
183
+ args: [{
184
+ providedIn: 'root',
185
+ }]
186
+ }], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i2.NotificationService }, { type: i3.ChannelService }]; } });
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1hY3Rpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS1hY3Rpb25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFhdEQ7O0dBRUc7QUFJSCxNQUFNLE9BQU8scUJBQXFCO0lBd0toQyxZQUNVLGlCQUFvQyxFQUNwQyxtQkFBd0MsRUFDeEMsY0FBOEI7UUFGOUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQTFLeEM7O1dBRUc7UUFDTSxtQkFBYyxHQUFzRDtZQUMzRTtnQkFDRSxVQUFVLEVBQUUsT0FBTztnQkFDbkIsU0FBUyxFQUFFLENBQUMsY0FBd0IsRUFBRSxFQUFFO29CQUN0QyxPQUFPLGNBQWMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELENBQUM7YUFDRjtZQUNEO2dCQUNFLFVBQVUsRUFBRSxhQUFhO2dCQUN6QiwyQkFBMkIsRUFBRSwyQkFBMkI7Z0JBQ3hELGFBQWEsRUFBRSxDQUFDLE9BQXNCLEVBQUUsRUFBRTtvQkFDeEMsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekQsQ0FBQztnQkFDRCxTQUFTLEVBQUUsQ0FDVCxjQUF3QixFQUN4QixDQUFVLEVBQ1YsT0FBc0IsRUFDdEIsRUFBRSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLElB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LENBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FDaEQsQ0FBQyxNQUFNLENBQUM7SUFDWCxDQUFDOztrSEF4TlUscUJBQXFCO3NIQUFyQixxQkFBcUIsY0FGcEIsTUFBTTsyRkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbSxcbiAgTWVzc2FnZUFjdGlvbkhhbmRsZXJFeHRyYVBhcmFtcyxcbiAgTWVzc2FnZUFjdGlvbkl0ZW0sXG4gIE1lc3NhZ2VBY3Rpb25zQ2xpY2tEZXRhaWxzLFxuICBNZXNzYWdlUmVhY3Rpb25BY3Rpb25JdGVtLFxuICBTdHJlYW1NZXNzYWdlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IENoYXRDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5uZWxTZXJ2aWNlIH0gZnJvbSAnLi9jaGFubmVsLnNlcnZpY2UnO1xuXG4vKipcbiAqIFRoZSBtZXNzYWdlIGFjdGlvbnMgc2VydmljZSBwcm92aWRlcyBjdXN0b21pemF0aW9uIG9wdGlvbnMgZm9yIHRoZSBbbWVzc2FnZSBhY3Rpb25zXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3Y2LXJjL2NvbXBvbmVudHMvTWVzc2FnZUFjdGlvbnNCb3hDb21wb25lbnQpXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdlQWN0aW9uc1NlcnZpY2Uge1xuICAvKipcbiAgICogRGVmYXVsdCBhY3Rpb25zIC0gdGhlc2UgYXJlIHRoZSBhY3Rpb25zIHRoYXQgYXJlIGhhbmRsZWQgYnkgdGhlIGJ1aWx0LWluIGNvbXBvbmVudFxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEFjdGlvbnM6IChNZXNzYWdlQWN0aW9uSXRlbSB8IE1lc3NhZ2VSZWFjdGlvbkFjdGlvbkl0ZW0pW10gPSBbXG4gICAge1xuICAgICAgYWN0aW9uTmFtZTogJ3JlYWN0JyxcbiAgICAgIGlzVmlzaWJsZTogKGVuYWJsZWRBY3Rpb25zOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICByZXR1cm4gZW5hYmxlZEFjdGlvbnMuaW5kZXhPZignc2VuZC1yZWFjdGlvbicpICE9PSAtMTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBhY3Rpb25OYW1lOiAnbWFyay11bnJlYWQnLFxuICAgICAgYWN0aW9uTGFiZWxPclRyYW5zbGF0aW9uS2V5OiAnc3RyZWFtQ2hhdC5NYXJrIGFzIHVucmVhZCcsXG4gICAgICBhY3Rpb25IYW5kbGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSkgPT4ge1xuICAgICAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UubWFya01lc3NhZ2VVbnJlYWQobWVzc2FnZS5pZCk7XG4gICAgICB9LFxuICAgICAgaXNWaXNpYmxlOiAoXG4gICAgICAgIGVuYWJsZWRBY3Rpb25zOiBzdHJpbmdbXSxcbiAgICAgICAgXzogYm9vbGVhbixcbiAgICAgICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZVxuICAgICAgKSA9PiBlbmFibGVkQWN0aW9ucy5pbmRleE9mKCdyZWFkLWV2ZW50cycpICE9PSAtMSAmJiAhbWVzc2FnZS5wYXJlbnRfaWQsXG4gICAgfSxcbiAgICB7XG4gICAgICBhY3Rpb25OYW1lOiAncXVvdGUnLFxuICAgICAgYWN0aW9uTGFiZWxPclRyYW5zbGF0aW9uS2V5OiAnc3RyZWFtQ2hhdC5SZXBseScsXG4gICAgICBhY3Rpb25IYW5kbGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSkgPT4ge1xuICAgICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLnNlbGVjdE1lc3NhZ2VUb1F1b3RlKG1lc3NhZ2UpO1xuICAgICAgfSxcbiAgICAgIGlzVmlzaWJsZTogKGVuYWJsZWRBY3Rpb25zOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgZW5hYmxlZEFjdGlvbnMuaW5kZXhPZigncXVvdGUtbWVzc2FnZScpICE9PSAtMSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFjdGlvbk5hbWU6ICd0aHJlYWQtcmVwbHknLFxuICAgICAgYWN0aW9uTGFiZWxPclRyYW5zbGF0aW9uS2V5OiAnc3RyZWFtQ2hhdC5UaHJlYWQnLFxuICAgICAgYWN0aW9uSGFuZGxlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpID0+IHtcbiAgICAgICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLnNldEFzQWN0aXZlUGFyZW50TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgIH0sXG4gICAgICBpc1Zpc2libGU6IChcbiAgICAgICAgZW5hYmxlZEFjdGlvbnM6IHN0cmluZ1tdLFxuICAgICAgICBfOiBib29sZWFuLFxuICAgICAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlXG4gICAgICApID0+IGVuYWJsZWRBY3Rpb25zLmluZGV4T2YoJ3NlbmQtcmVwbHknKSAhPT0gLTEgJiYgIW1lc3NhZ2UucGFyZW50X2lkLFxuICAgIH0sXG4gICAge1xuICAgICAgYWN0aW9uTmFtZTogJ3BpbicsXG4gICAgICBhY3Rpb25MYWJlbE9yVHJhbnNsYXRpb25LZXk6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlKSA9PlxuICAgICAgICBtZXNzYWdlLnBpbm5lZCA/ICdzdHJlYW1DaGF0LlVucGluJyA6ICdzdHJlYW1DaGF0LlBpbicsXG4gICAgICBhY3Rpb25IYW5kbGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSkgPT4ge1xuICAgICAgICBtZXNzYWdlLnBpbm5lZFxuICAgICAgICAgID8gdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLnVucGluTWVzc2FnZShtZXNzYWdlKVxuICAgICAgICAgIDogdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLnBpbk1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB9LFxuICAgICAgaXNWaXNpYmxlOiAoZW5hYmxlZEFjdGlvbnM6IHN0cmluZ1tdKSA9PlxuICAgICAgICBlbmFibGVkQWN0aW9ucy5pbmRleE9mKCdwaW4tbWVzc2FnZScpICE9PSAtMSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFjdGlvbk5hbWU6ICdmbGFnJyxcbiAgICAgIGFjdGlvbkxhYmVsT3JUcmFuc2xhdGlvbktleTogJ3N0cmVhbUNoYXQuRmxhZycsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtcHJvbWlzZXNcbiAgICAgIGFjdGlvbkhhbmRsZXI6IGFzeW5jIChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5mbGFnTWVzc2FnZShtZXNzYWdlLmlkKTtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgJ3N0cmVhbUNoYXQuTWVzc2FnZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZmxhZ2dlZCcsXG4gICAgICAgICAgICAnc3VjY2VzcydcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnc3RyZWFtQ2hhdC5FcnJvciBhZGRpbmcgZmxhZydcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaXNWaXNpYmxlOiAoZW5hYmxlZEFjdGlvbnM6IHN0cmluZ1tdLCBpc01pbmU6IGJvb2xlYW4pID0+XG4gICAgICAgIGVuYWJsZWRBY3Rpb25zLmluZGV4T2YoJ2ZsYWctbWVzc2FnZScpICE9PSAtMSAmJiAhaXNNaW5lLFxuICAgIH0sXG4gICAge1xuICAgICAgYWN0aW9uTmFtZTogJ2VkaXQnLFxuICAgICAgYWN0aW9uTGFiZWxPclRyYW5zbGF0aW9uS2V5OiAnc3RyZWFtQ2hhdC5FZGl0IE1lc3NhZ2UnLFxuICAgICAgYWN0aW9uSGFuZGxlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpID0+IHtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9FZGl0JC5uZXh0KG1lc3NhZ2UpO1xuICAgICAgfSxcbiAgICAgIGlzVmlzaWJsZTogKGVuYWJsZWRBY3Rpb25zOiBzdHJpbmdbXSwgaXNNaW5lOiBib29sZWFuKSA9PlxuICAgICAgICAoZW5hYmxlZEFjdGlvbnMuaW5kZXhPZigndXBkYXRlLW93bi1tZXNzYWdlJykgIT09IC0xICYmIGlzTWluZSkgfHxcbiAgICAgICAgZW5hYmxlZEFjdGlvbnMuaW5kZXhPZigndXBkYXRlLWFueS1tZXNzYWdlJykgIT09IC0xLFxuICAgIH0sXG4gICAge1xuICAgICAgYWN0aW9uTmFtZTogJ2RlbGV0ZScsXG4gICAgICBhY3Rpb25MYWJlbE9yVHJhbnNsYXRpb25LZXk6ICdzdHJlYW1DaGF0LkRlbGV0ZScsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtcHJvbWlzZXNcbiAgICAgIGFjdGlvbkhhbmRsZXI6IGFzeW5jIChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jaGFubmVsU2VydmljZS5kZWxldGVNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnc3RyZWFtQ2hhdC5FcnJvciBkZWxldGluZyBtZXNzYWdlJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBpc1Zpc2libGU6IChlbmFibGVkQWN0aW9uczogc3RyaW5nW10sIGlzTWluZTogYm9vbGVhbikgPT5cbiAgICAgICAgKChlbmFibGVkQWN0aW9ucy5pbmRleE9mKCdkZWxldGUnKSAhPT0gLTEgfHxcbiAgICAgICAgICBlbmFibGVkQWN0aW9ucy5pbmRleE9mKCdkZWxldGUtb3duLW1lc3NhZ2UnKSAhPT0gLTEpICYmXG4gICAgICAgICAgaXNNaW5lKSB8fFxuICAgICAgICBlbmFibGVkQWN0aW9ucy5pbmRleE9mKCdkZWxldGUtYW55JykgIT09IC0xIHx8XG4gICAgICAgIGVuYWJsZWRBY3Rpb25zLmluZGV4T2YoJ2RlbGV0ZS1hbnktbWVzc2FnZScpICE9PSAtMSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFjdGlvbk5hbWU6ICdjb3B5LW1lc3NhZ2UtdGV4dCcsXG4gICAgICBhY3Rpb25MYWJlbE9yVHJhbnNsYXRpb25LZXk6ICdzdHJlYW1DaGF0LkNvcHkgdGV4dCcsXG4gICAgICBpc1Zpc2libGU6IChfOiBzdHJpbmdbXSwgX186IGJvb2xlYW4sIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXNDbGlwYm9hcmRTdXBwb3J0ZWQgPSBuYXZpZ2F0b3I/LmNsaXBib2FyZD8ud3JpdGUgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFpc0NsaXBib2FyZFN1cHBvcnRlZCAmJiAhdGhpcy5oYXNEaXNwbGF5ZWRDbGlwYm9hcmRXYXJuaW5nKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtTdHJlYW0gQ2hhdF0gQ29weSBhY3Rpb24gaXMgZGlzYWJsZWQgYmVjYXVzZSBjbGlwYm9hcmQgQVBJIGlzbid0IGF2YWlsYWJsZSwgcGxlYXNlIGNoZWNrIHNlY3VyaXR5IGFuZCBicm93c2VyIHJlcXVpcmVtZW50czogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NsaXBib2FyZC93cml0ZSNzZWN1cml0eV9jb25zaWRlcmF0aW9uc2BcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuaGFzRGlzcGxheWVkQ2xpcGJvYXJkV2FybmluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAhIW1lc3NhZ2UudGV4dCAmJlxuICAgICAgICAgIChtZXNzYWdlLnR5cGUgPT09ICdyZWd1bGFyJyB8fCBtZXNzYWdlLnR5cGUgPT09ICdyZXBseScpICYmXG4gICAgICAgICAgaXNDbGlwYm9hcmRTdXBwb3J0ZWRcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBhY3Rpb25IYW5kbGVyOiAoXG4gICAgICAgIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UsXG4gICAgICAgIGV4dHJhUGFyYW1zOiBNZXNzYWdlQWN0aW9uSGFuZGxlckV4dHJhUGFyYW1zXG4gICAgICApID0+IHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tDb250ZW50ID0gbWVzc2FnZS50ZXh0IHx8ICcnO1xuICAgICAgICAvLyBBbmRyb2lkIENocm9tZSBjYW4gb25seSBjb3B5IHBsYWluIHRleHQ6IGh0dHBzOi8vaXNzdWVzLmNocm9taXVtLm9yZy9pc3N1ZXMvNDA4NTE1MDJcbiAgICAgICAgdm9pZCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlKFtcbiAgICAgICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7XG4gICAgICAgICAgICAndGV4dC9wbGFpbic6IG5ldyBCbG9iKFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgZXh0cmFQYXJhbXMubWVzc2FnZVRleHRIdG1sRWxlbWVudD8uaW5uZXJUZXh0IHx8XG4gICAgICAgICAgICAgICAgICBmYWxsYmFja0NvbnRlbnQsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHsgdHlwZTogJ3RleHQvcGxhaW4nIH1cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAndGV4dC9odG1sJzogbmV3IEJsb2IoXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBleHRyYVBhcmFtcy5tZXNzYWdlVGV4dEh0bWxFbGVtZW50Py5pbm5lckhUTUwgfHxcbiAgICAgICAgICAgICAgICAgIGZhbGxiYWNrQ29udGVudCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgeyB0eXBlOiAndGV4dC9odG1sJyB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgXTtcbiAgLyoqXG4gICAqIFRoZSBidWlsdC1pbiBjb21wb25lbnRzIHdpbGwgaGFuZGxlIGNoYW5nZXMgdG8gdGhpcyBvYnNlcnZhYmxlLlxuICAgKi9cbiAgbWVzc2FnZVRvRWRpdCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIC8qKlxuICAgKiBZb3UgY2FuIHBhc3MgeW91ciBvd24gY3VzdG9tIGFjdGlvbnMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbnNpZGUgdGhlIGJ1aWx0LWluIG1lc3NhZ2UgYWN0aW9ucyBjb21wb25lbnRcbiAgICovXG4gIGN1c3RvbUFjdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDdXN0b21NZXNzYWdlQWN0aW9uSXRlbVtdPihbXSk7XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBbYE1lc3NhZ2VDb21wb25lbnRgXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3Y2LXJjL2NvbXBvbmVudHMvTWVzc2FnZUNvbXBvbmVudC8pIHdpbGwgZGlzcGxheSB0aGUgW2BNZXNzYWdlQWN0aW9uc0JveENvbXBvbmVudGBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvdjYtcmMvY29tcG9uZW50cy9NZXNzYWdlQWN0aW9uc0JveENvbXBvbmVudC8pLiBZb3UgY2FuIG92ZXJyaWRlIHRoYXQgYmVoYXZpb3IgYnkgcHJvdmlkaW5nIHlvdXIgb3duIGV2ZW50IGhhbmRsZXIuXG4gICAqL1xuICBjdXN0b21BY3Rpb25DbGlja0hhbmRsZXI/OiAoZGV0YWlsczogTWVzc2FnZUFjdGlvbnNDbGlja0RldGFpbHMpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG1lc3NhZ2VNZW51T3BlbmVkRm9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGhhc0Rpc3BsYXllZENsaXBib2FyZFdhcm5pbmcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYXRDbGllbnRTZXJ2aWNlOiBDaGF0Q2xpZW50U2VydmljZSxcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2VcbiAgKSB7XG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLm1lc3NhZ2VUb0VkaXQkLFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsJCxcbiAgICBdKS5zdWJzY3JpYmUoKFttZXNzYWdlVG9FZGl0LCBhY3RpdmVDaGFubmVsXSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBtZXNzYWdlVG9FZGl0ICYmXG4gICAgICAgICghYWN0aXZlQ2hhbm5lbCB8fCBhY3RpdmVDaGFubmVsPy5jaWQgIT09IG1lc3NhZ2VUb0VkaXQuY2lkKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVRvRWRpdCQubmV4dCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5tZXNzYWdlVG9FZGl0JCxcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlUGFyZW50TWVzc2FnZUlkJCxcbiAgICBdKS5zdWJzY3JpYmUoKFttZXNzYWdlVG9FZGl0LCBwYXJlbnRNZXNzYWdlSWRdKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIG1lc3NhZ2VUb0VkaXQgJiZcbiAgICAgICAgbWVzc2FnZVRvRWRpdC5wYXJlbnRfaWQgJiZcbiAgICAgICAgbWVzc2FnZVRvRWRpdC5wYXJlbnRfaWQgIT09IHBhcmVudE1lc3NhZ2VJZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVRvRWRpdCQubmV4dCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHJldHVybnMgaG93IG1hbnkgYXV0aG9yaXplZCBhY3Rpb25zIGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIG1lc3NhZ2VcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIGVuYWJsZWRBY3Rpb25zXG4gICAqIEByZXR1cm5zIHRoZSBjb3VudFxuICAgKi9cbiAgZ2V0QXV0aG9yaXplZE1lc3NhZ2VBY3Rpb25zQ291bnQoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSxcbiAgICBlbmFibGVkQWN0aW9uczogc3RyaW5nW11cbiAgKSB7XG4gICAgY29uc3QgY3VzdG9tQWN0aW9ucyA9IHRoaXMuY3VzdG9tQWN0aW9ucyQuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgICBjb25zdCBhbGxBY3Rpb25zID0gWy4uLnRoaXMuZGVmYXVsdEFjdGlvbnMsIC4uLmN1c3RvbUFjdGlvbnNdO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcj8uaWQ7XG4gICAgY29uc3QgaXNNaW5lID0gbWVzc2FnZS51c2VyX2lkID09PSBjdXJyZW50VXNlcklkO1xuXG4gICAgcmV0dXJuIGFsbEFjdGlvbnMuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgaXRlbS5pc1Zpc2libGUoZW5hYmxlZEFjdGlvbnMsIGlzTWluZSwgbWVzc2FnZSlcbiAgICApLmxlbmd0aDtcbiAgfVxufVxuIl19
@@ -0,0 +1,71 @@
1
+ import { Component, HostBinding } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../channel.service";
4
+ import * as i2 from "../custom-templates.service";
5
+ import * as i3 from "../message-actions.service";
6
+ import * as i4 from "@angular/common";
7
+ import * as i5 from "../modal/modal.component";
8
+ import * as i6 from "@ngx-translate/core";
9
+ /**
10
+ * The component watches for the [`channelService.bouncedMessage$` stream](/chat/docs/sdk/angular/v6-rc/services/ChannelService/#bouncedmessage) and opens the bounce modal if a message is emitted.
11
+ *
12
+ * To bounce messages, you need to set up [semantic filters for moderation](https://getstream.io/automated-moderation/docs/automod_configuration/?q=semantic%20filters).
13
+ */
14
+ export class MessageBouncePromptComponent {
15
+ constructor(channelService, customTemplatesService, messageActionsService) {
16
+ this.channelService = channelService;
17
+ this.customTemplatesService = customTemplatesService;
18
+ this.messageActionsService = messageActionsService;
19
+ this.class = 'str-chat__message-bounce-prompt';
20
+ this.isModalOpen = false;
21
+ this.subscriptions = [];
22
+ this.messageBounceModalOpenChanged = (isOpen) => {
23
+ this.isModalOpen = isOpen;
24
+ if (!isOpen) {
25
+ this.message = undefined;
26
+ this.channelService.bouncedMessage$.next(undefined);
27
+ }
28
+ };
29
+ this.subscriptions.push(this.channelService.bouncedMessage$.subscribe((m) => {
30
+ if (m !== this.message) {
31
+ this.message = m;
32
+ if (this.message) {
33
+ this.isModalOpen = true;
34
+ }
35
+ }
36
+ }));
37
+ }
38
+ ngOnDestroy() {
39
+ this.subscriptions.forEach((s) => s.unsubscribe());
40
+ }
41
+ async resendMessage() {
42
+ this.isModalOpen = false;
43
+ await this.channelService.resendMessage(this.message);
44
+ this.message = undefined;
45
+ this.channelService.bouncedMessage$.next(undefined);
46
+ }
47
+ async deleteMessage() {
48
+ if (!this.message) {
49
+ return;
50
+ }
51
+ this.isModalOpen = false;
52
+ await this.channelService.deleteMessage(this.message, true);
53
+ this.message = undefined;
54
+ this.channelService.bouncedMessage$.next(undefined);
55
+ }
56
+ editMessage() {
57
+ this.isModalOpen = false;
58
+ this.messageActionsService.messageToEdit$.next(this.message);
59
+ this.message = undefined;
60
+ this.channelService.bouncedMessage$.next(undefined);
61
+ }
62
+ }
63
+ MessageBouncePromptComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageBouncePromptComponent, deps: [{ token: i1.ChannelService }, { token: i2.CustomTemplatesService }, { token: i3.MessageActionsService }], target: i0.ɵɵFactoryTarget.Component });
64
+ MessageBouncePromptComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: MessageBouncePromptComponent, selector: "stream-message-bounce-prompt", host: { properties: { "class": "this.class" } }, ngImport: i0, template: "<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: {\n message: message,\n isOpen: isModalOpen,\n isOpenChangeHandler: messageBounceModalOpenChanged,\n content: modalContent\n }\n \"\n></ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n *ngIf=\"isOpen\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div\n class=\"str-chat__message-bounce-prompt\"\n data-testid=\"message-bounce-prompt\"\n >\n <div class=\"str-chat__message-bounce-prompt-header\">\n {{\n \"streamChat.This message did not meet our content guidelines\"\n | translate\n }}\n </div>\n <div class=\"str-chat__message-bounce-actions\">\n <button\n class=\"str-chat__message-bounce-edit\"\n data-testid=\"message-bounce-edit\"\n type=\"button\"\n (click)=\"editMessage()\"\n (keyup.enter)=\"editMessage()\"\n >\n {{ \"streamChat.Edit Message\" | translate }}\n </button>\n <button\n class=\"str-chat__message-bounce-send\"\n data-testid=\"message-bounce-send\"\n (click)=\"resendMessage()\"\n (keyup.enter)=\"resendMessage()\"\n >\n {{ \"streamChat.Send Anyway\" | translate }}\n </button>\n <button\n class=\"str-chat__message-bounce-delete\"\n data-testid=\"message-bounce-delete\"\n (click)=\"deleteMessage()\"\n (keyup.enter)=\"deleteMessage()\"\n >\n {{ \"streamChat.Delete\" | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageBouncePromptComponent, decorators: [{
66
+ type: Component,
67
+ args: [{ selector: 'stream-message-bounce-prompt', template: "<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: {\n message: message,\n isOpen: isModalOpen,\n isOpenChangeHandler: messageBounceModalOpenChanged,\n content: modalContent\n }\n \"\n></ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n *ngIf=\"isOpen\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div\n class=\"str-chat__message-bounce-prompt\"\n data-testid=\"message-bounce-prompt\"\n >\n <div class=\"str-chat__message-bounce-prompt-header\">\n {{\n \"streamChat.This message did not meet our content guidelines\"\n | translate\n }}\n </div>\n <div class=\"str-chat__message-bounce-actions\">\n <button\n class=\"str-chat__message-bounce-edit\"\n data-testid=\"message-bounce-edit\"\n type=\"button\"\n (click)=\"editMessage()\"\n (keyup.enter)=\"editMessage()\"\n >\n {{ \"streamChat.Edit Message\" | translate }}\n </button>\n <button\n class=\"str-chat__message-bounce-send\"\n data-testid=\"message-bounce-send\"\n (click)=\"resendMessage()\"\n (keyup.enter)=\"resendMessage()\"\n >\n {{ \"streamChat.Send Anyway\" | translate }}\n </button>\n <button\n class=\"str-chat__message-bounce-delete\"\n data-testid=\"message-bounce-delete\"\n (click)=\"deleteMessage()\"\n (keyup.enter)=\"deleteMessage()\"\n >\n {{ \"streamChat.Delete\" | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n" }]
68
+ }], ctorParameters: function () { return [{ type: i1.ChannelService }, { type: i2.CustomTemplatesService }, { type: i3.MessageActionsService }]; }, propDecorators: { class: [{
69
+ type: HostBinding
70
+ }] } });
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1ib3VuY2UtcHJvbXB0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWJvdW5jZS1wcm9tcHQvbWVzc2FnZS1ib3VuY2UtcHJvbXB0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWJvdW5jZS1wcm9tcHQvbWVzc2FnZS1ib3VuY2UtcHJvbXB0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFhLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQU9sRTs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLDRCQUE0QjtJQU12QyxZQUNVLGNBQThCLEVBQzdCLHNCQUE4QyxFQUMvQyxxQkFBNEM7UUFGNUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzdCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDL0MsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQVJ2QyxVQUFLLEdBQUcsaUNBQWlDLENBQUM7UUFDekQsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFWixrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFtQjNDLGtDQUE2QixHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDWCxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3JEO1FBQ0gsQ0FBQyxDQUFDO1FBbEJBLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNsRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztpQkFDekI7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBVUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWE7UUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBUSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDOzt5SEF6RFUsNEJBQTRCOzZHQUE1Qiw0QkFBNEIscUhDakJ6Qyx1MERBbUVBOzJGRGxEYSw0QkFBNEI7a0JBTHhDLFNBQVM7K0JBQ0UsOEJBQThCOzhLQUt6QixLQUFLO3NCQUFuQixXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZywgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGFubmVsU2VydmljZSB9IGZyb20gJy4uL2NoYW5uZWwuc2VydmljZSc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWVzc2FnZUFjdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vbWVzc2FnZS1hY3Rpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RyZWFtTWVzc2FnZSB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgY29tcG9uZW50IHdhdGNoZXMgZm9yIHRoZSBbYGNoYW5uZWxTZXJ2aWNlLmJvdW5jZWRNZXNzYWdlJGAgc3RyZWFtXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3Y2LXJjL3NlcnZpY2VzL0NoYW5uZWxTZXJ2aWNlLyNib3VuY2VkbWVzc2FnZSkgYW5kIG9wZW5zIHRoZSBib3VuY2UgbW9kYWwgaWYgYSBtZXNzYWdlIGlzIGVtaXR0ZWQuXG4gKlxuICogVG8gYm91bmNlIG1lc3NhZ2VzLCB5b3UgbmVlZCB0byBzZXQgdXAgW3NlbWFudGljIGZpbHRlcnMgZm9yIG1vZGVyYXRpb25dKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2F1dG9tYXRlZC1tb2RlcmF0aW9uL2RvY3MvYXV0b21vZF9jb25maWd1cmF0aW9uLz9xPXNlbWFudGljJTIwZmlsdGVycykuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLWJvdW5jZS1wcm9tcHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS1ib3VuY2UtcHJvbXB0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUJvdW5jZVByb21wdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBIb3N0QmluZGluZygpIGNsYXNzID0gJ3N0ci1jaGF0X19tZXNzYWdlLWJvdW5jZS1wcm9tcHQnO1xuICBpc01vZGFsT3BlbiA9IGZhbHNlO1xuICBtZXNzYWdlPzogU3RyZWFtTWVzc2FnZTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxTZXJ2aWNlLFxuICAgIHJlYWRvbmx5IGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlQWN0aW9uc1NlcnZpY2U6IE1lc3NhZ2VBY3Rpb25zU2VydmljZVxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYm91bmNlZE1lc3NhZ2UkLnN1YnNjcmliZSgobSkgPT4ge1xuICAgICAgICBpZiAobSAhPT0gdGhpcy5tZXNzYWdlKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlID0gbTtcbiAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmlzTW9kYWxPcGVuID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG1lc3NhZ2VCb3VuY2VNb2RhbE9wZW5DaGFuZ2VkID0gKGlzT3BlbjogYm9vbGVhbikgPT4ge1xuICAgIHRoaXMuaXNNb2RhbE9wZW4gPSBpc09wZW47XG4gICAgaWYgKCFpc09wZW4pIHtcbiAgICAgIHRoaXMubWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYm91bmNlZE1lc3NhZ2UkLm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gIH07XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBhc3luYyByZXNlbmRNZXNzYWdlKCkge1xuICAgIHRoaXMuaXNNb2RhbE9wZW4gPSBmYWxzZTtcbiAgICBhd2FpdCB0aGlzLmNoYW5uZWxTZXJ2aWNlLnJlc2VuZE1lc3NhZ2UodGhpcy5tZXNzYWdlISk7XG4gICAgdGhpcy5tZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYm91bmNlZE1lc3NhZ2UkLm5leHQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU1lc3NhZ2UoKSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc01vZGFsT3BlbiA9IGZhbHNlO1xuICAgIGF3YWl0IHRoaXMuY2hhbm5lbFNlcnZpY2UuZGVsZXRlTWVzc2FnZSh0aGlzLm1lc3NhZ2UsIHRydWUpO1xuICAgIHRoaXMubWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmJvdW5jZWRNZXNzYWdlJC5uZXh0KHVuZGVmaW5lZCk7XG4gIH1cblxuICBlZGl0TWVzc2FnZSgpIHtcbiAgICB0aGlzLmlzTW9kYWxPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UubWVzc2FnZVRvRWRpdCQubmV4dCh0aGlzLm1lc3NhZ2UpO1xuICAgIHRoaXMubWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmJvdW5jZWRNZXNzYWdlJC5uZXh0KHVuZGVmaW5lZCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXJcbiAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tb2RhbFRlbXBsYXRlJCB8IGFzeW5jKSB8fCBkZWZhdWx0TW9kYWw7XG4gICAgY29udGV4dDoge1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIGlzT3BlbjogaXNNb2RhbE9wZW4sXG4gICAgICBpc09wZW5DaGFuZ2VIYW5kbGVyOiBtZXNzYWdlQm91bmNlTW9kYWxPcGVuQ2hhbmdlZCxcbiAgICAgIGNvbnRlbnQ6IG1vZGFsQ29udGVudFxuICAgIH1cbiAgXCJcbj48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlXG4gICNkZWZhdWx0TW9kYWxcbiAgbGV0LWlzT3Blbj1cImlzT3BlblwiXG4gIGxldC1pc09wZW5DaGFuZ2VIYW5kbGVyPVwiaXNPcGVuQ2hhbmdlSGFuZGxlclwiXG4gIGxldC1jb250ZW50PVwiY29udGVudFwiXG4+XG4gIDxzdHJlYW0tbW9kYWxcbiAgICAqbmdJZj1cImlzT3BlblwiXG4gICAgW2lzT3Blbl09XCJpc09wZW5cIlxuICAgIFtjb250ZW50XT1cImNvbnRlbnRcIlxuICAgIChpc09wZW5DaGFuZ2UpPVwiaXNPcGVuQ2hhbmdlSGFuZGxlcigkZXZlbnQpXCJcbiAgPlxuICA8L3N0cmVhbS1tb2RhbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kYWxDb250ZW50PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1ib3VuY2UtcHJvbXB0XCJcbiAgICBkYXRhLXRlc3RpZD1cIm1lc3NhZ2UtYm91bmNlLXByb21wdFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYm91bmNlLXByb21wdC1oZWFkZXJcIj5cbiAgICAgIHt7XG4gICAgICAgIFwic3RyZWFtQ2hhdC5UaGlzIG1lc3NhZ2UgZGlkIG5vdCBtZWV0IG91ciBjb250ZW50IGd1aWRlbGluZXNcIlxuICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1ib3VuY2UtYWN0aW9uc1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWJvdW5jZS1lZGl0XCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWJvdW5jZS1lZGl0XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJlZGl0TWVzc2FnZSgpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cImVkaXRNZXNzYWdlKClcIlxuICAgICAgPlxuICAgICAgICB7eyBcInN0cmVhbUNoYXQuRWRpdCBNZXNzYWdlXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWJvdW5jZS1zZW5kXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWJvdW5jZS1zZW5kXCJcbiAgICAgICAgKGNsaWNrKT1cInJlc2VuZE1lc3NhZ2UoKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJyZXNlbmRNZXNzYWdlKClcIlxuICAgICAgPlxuICAgICAgICB7eyBcInN0cmVhbUNoYXQuU2VuZCBBbnl3YXlcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYm91bmNlLWRlbGV0ZVwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1ib3VuY2UtZGVsZXRlXCJcbiAgICAgICAgKGNsaWNrKT1cImRlbGV0ZU1lc3NhZ2UoKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJkZWxldGVNZXNzYWdlKClcIlxuICAgICAgPlxuICAgICAgICB7eyBcInN0cmVhbUNoYXQuRGVsZXRlXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=