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