@banta/sdk 5.2.5 → 5.4.0

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 (139) hide show
  1. package/{esm2022 → esm2020}/banta-sdk.mjs +4 -4
  2. package/{esm2022 → esm2020}/lib/attachment-scraper.mjs +1 -1
  3. package/esm2020/lib/banta/banta.component.mjs +204 -0
  4. package/{esm2022 → esm2020}/lib/banta-logo.component.mjs +11 -11
  5. package/{esm2022 → esm2020}/lib/banta-sdk.module.mjs +135 -135
  6. package/esm2020/lib/chat/banta-chat/banta-chat.component.mjs +209 -0
  7. package/esm2020/lib/chat/chat-message/chat-message.component.mjs +62 -0
  8. package/esm2020/lib/chat/chat-view/chat-view.component.mjs +170 -0
  9. package/{esm2022 → esm2020}/lib/chat/chat.module.mjs +51 -51
  10. package/{esm2022 → esm2020}/lib/chat/index.mjs +5 -5
  11. package/esm2020/lib/chat/live-chat-message.component.mjs +80 -0
  12. package/esm2020/lib/chat-backend-base.mjs +31 -0
  13. package/esm2020/lib/chat-backend.mjs +194 -0
  14. package/{esm2022 → esm2020}/lib/chat-source-base.mjs +1 -1
  15. package/esm2020/lib/chat-source.mjs +233 -0
  16. package/esm2020/lib/comments/attachment-button/attachment-button.component.mjs +76 -0
  17. package/esm2020/lib/comments/attachment-scraper.directive.mjs +107 -0
  18. package/esm2020/lib/comments/banta-comments/banta-comments.component.mjs +749 -0
  19. package/esm2020/lib/comments/comment/comment.component.mjs +175 -0
  20. package/esm2020/lib/comments/comment-field/comment-field.component.mjs +401 -0
  21. package/esm2020/lib/comments/comment-sort/comment-sort.component.mjs +37 -0
  22. package/esm2020/lib/comments/comment-view/comment-view.component.mjs +470 -0
  23. package/{esm2022 → esm2020}/lib/comments/comments.module.mjs +111 -111
  24. package/{esm2022 → esm2020}/lib/comments/index.mjs +10 -10
  25. package/esm2020/lib/comments/live-comment.component.mjs +80 -0
  26. package/{esm2022 → esm2020}/lib/comments/reply-send-options.directive.mjs +13 -13
  27. package/esm2020/lib/common/attachment/attachment.component.mjs +128 -0
  28. package/{esm2022 → esm2020}/lib/common/attachments/attachments.component.mjs +75 -75
  29. package/{esm2022 → esm2020}/lib/common/common.module.mjs +68 -68
  30. package/{esm2022 → esm2020}/lib/common/index.mjs +10 -10
  31. package/{esm2022 → esm2020}/lib/common/lazy-connection.mjs +14 -14
  32. package/esm2020/lib/common/lightbox/lightbox.component.mjs +31 -0
  33. package/esm2020/lib/common/markdown-to-html.pipe.mjs +88 -0
  34. package/esm2020/lib/common/mention-linker.pipe.mjs +35 -0
  35. package/esm2020/lib/common/timer-pool.service.mjs +83 -0
  36. package/esm2020/lib/common/timestamp.component.mjs +123 -0
  37. package/{esm2022 → esm2020}/lib/common/trust-resource-url.pipe.mjs +22 -22
  38. package/esm2020/lib/emoji/emoji-selector-button.component.mjs +116 -0
  39. package/esm2020/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +98 -0
  40. package/{esm2022 → esm2020}/lib/emoji/emoji.module.mjs +55 -55
  41. package/{esm2022 → esm2020}/lib/emoji/emojis.mjs +6507 -6507
  42. package/{esm2022 → esm2020}/lib/emoji/index.mjs +4 -4
  43. package/esm2020/lib/giphy-attachments.mjs +16 -0
  44. package/{esm2022 → esm2020}/lib/index.mjs +19 -19
  45. package/{esm2022 → esm2020}/lib/live-message.component.mjs +61 -61
  46. package/{esm2022 → esm2020}/lib/message-menu-item.mjs +1 -1
  47. package/{esm2022 → esm2020}/lib/sdk-options.mjs +1 -1
  48. package/esm2020/lib/static-chat-source.mjs +71 -0
  49. package/esm2020/lib/tweet-attachments.mjs +13 -0
  50. package/esm2020/lib/url-attachments.mjs +42 -0
  51. package/esm2020/lib/youtube-attachments.mjs +29 -0
  52. package/{esm2022 → esm2020}/public-api.mjs +4 -4
  53. package/fesm2015/banta-sdk.mjs +11258 -0
  54. package/fesm2015/banta-sdk.mjs.map +1 -0
  55. package/{fesm2022 → fesm2020}/banta-sdk.mjs +10823 -10782
  56. package/fesm2020/banta-sdk.mjs.map +1 -0
  57. package/index.d.ts +5 -5
  58. package/lib/attachment-scraper.d.ts +15 -15
  59. package/lib/banta/banta.component.d.ts +58 -58
  60. package/lib/banta-logo.component.d.ts +5 -5
  61. package/lib/banta-sdk.module.d.ts +31 -31
  62. package/lib/chat/banta-chat/banta-chat.component.d.ts +79 -70
  63. package/lib/chat/chat-message/chat-message.component.d.ts +21 -21
  64. package/lib/chat/chat-view/chat-view.component.d.ts +52 -52
  65. package/lib/chat/chat.module.d.ts +15 -15
  66. package/lib/chat/index.d.ts +5 -5
  67. package/lib/chat/live-chat-message.component.d.ts +23 -23
  68. package/lib/chat-backend-base.d.ts +72 -71
  69. package/lib/chat-backend.d.ts +67 -67
  70. package/lib/chat-source-base.d.ts +44 -44
  71. package/lib/chat-source.d.ts +65 -65
  72. package/lib/comments/attachment-button/attachment-button.component.d.ts +17 -17
  73. package/lib/comments/attachment-scraper.directive.d.ts +21 -21
  74. package/lib/comments/banta-comments/banta-comments.component.d.ts +203 -196
  75. package/lib/comments/comment/comment.component.d.ts +72 -72
  76. package/lib/comments/comment-field/comment-field.component.d.ts +89 -89
  77. package/lib/comments/comment-sort/comment-sort.component.d.ts +16 -16
  78. package/lib/comments/comment-view/comment-view.component.d.ts +121 -121
  79. package/lib/comments/comments.module.d.ts +30 -30
  80. package/lib/comments/index.d.ts +10 -10
  81. package/lib/comments/live-comment.component.d.ts +23 -23
  82. package/lib/comments/reply-send-options.directive.d.ts +5 -5
  83. package/lib/common/attachment/attachment.component.d.ts +34 -34
  84. package/lib/common/attachments/attachments.component.d.ts +26 -26
  85. package/lib/common/common.module.d.ts +19 -19
  86. package/lib/common/index.d.ts +10 -10
  87. package/lib/common/lazy-connection.d.ts +6 -6
  88. package/lib/common/lightbox/lightbox.component.d.ts +14 -14
  89. package/lib/common/markdown-to-html.pipe.d.ts +15 -15
  90. package/lib/common/mention-linker.pipe.d.ts +13 -13
  91. package/lib/common/timer-pool.service.d.ts +15 -15
  92. package/lib/common/timestamp.component.d.ts +19 -19
  93. package/lib/common/trust-resource-url.pipe.d.ts +10 -10
  94. package/lib/emoji/emoji-selector-button.component.d.ts +30 -30
  95. package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +26 -26
  96. package/lib/emoji/emoji.module.d.ts +16 -16
  97. package/lib/emoji/emojis.d.ts +6507 -6507
  98. package/lib/emoji/index.d.ts +4 -4
  99. package/lib/giphy-attachments.d.ts +5 -5
  100. package/lib/index.d.ts +19 -19
  101. package/lib/live-message.component.d.ts +22 -22
  102. package/lib/message-menu-item.d.ts +6 -6
  103. package/lib/sdk-options.d.ts +5 -5
  104. package/lib/static-chat-source.d.ts +42 -42
  105. package/lib/tweet-attachments.d.ts +5 -5
  106. package/lib/url-attachments.d.ts +14 -14
  107. package/lib/youtube-attachments.d.ts +5 -5
  108. package/package.json +11 -5
  109. package/public-api.d.ts +1 -1
  110. package/esm2022/lib/banta/banta.component.mjs +0 -204
  111. package/esm2022/lib/chat/banta-chat/banta-chat.component.mjs +0 -187
  112. package/esm2022/lib/chat/chat-message/chat-message.component.mjs +0 -62
  113. package/esm2022/lib/chat/chat-view/chat-view.component.mjs +0 -170
  114. package/esm2022/lib/chat/live-chat-message.component.mjs +0 -80
  115. package/esm2022/lib/chat-backend-base.mjs +0 -31
  116. package/esm2022/lib/chat-backend.mjs +0 -194
  117. package/esm2022/lib/chat-source.mjs +0 -233
  118. package/esm2022/lib/comments/attachment-button/attachment-button.component.mjs +0 -76
  119. package/esm2022/lib/comments/attachment-scraper.directive.mjs +0 -107
  120. package/esm2022/lib/comments/banta-comments/banta-comments.component.mjs +0 -730
  121. package/esm2022/lib/comments/comment/comment.component.mjs +0 -175
  122. package/esm2022/lib/comments/comment-field/comment-field.component.mjs +0 -401
  123. package/esm2022/lib/comments/comment-sort/comment-sort.component.mjs +0 -37
  124. package/esm2022/lib/comments/comment-view/comment-view.component.mjs +0 -470
  125. package/esm2022/lib/comments/live-comment.component.mjs +0 -80
  126. package/esm2022/lib/common/attachment/attachment.component.mjs +0 -128
  127. package/esm2022/lib/common/lightbox/lightbox.component.mjs +0 -31
  128. package/esm2022/lib/common/markdown-to-html.pipe.mjs +0 -88
  129. package/esm2022/lib/common/mention-linker.pipe.mjs +0 -35
  130. package/esm2022/lib/common/timer-pool.service.mjs +0 -83
  131. package/esm2022/lib/common/timestamp.component.mjs +0 -123
  132. package/esm2022/lib/emoji/emoji-selector-button.component.mjs +0 -115
  133. package/esm2022/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +0 -98
  134. package/esm2022/lib/giphy-attachments.mjs +0 -16
  135. package/esm2022/lib/static-chat-source.mjs +0 -71
  136. package/esm2022/lib/tweet-attachments.mjs +0 -13
  137. package/esm2022/lib/url-attachments.mjs +0 -42
  138. package/esm2022/lib/youtube-attachments.mjs +0 -29
  139. package/fesm2022/banta-sdk.mjs.map +0 -1
@@ -1,62 +0,0 @@
1
- import { Component, Input, Output } from "@angular/core";
2
- import { Subject } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/material/icon";
6
- import * as i3 from "@angular/material/button";
7
- export class ChatMessageComponent {
8
- constructor() {
9
- this._selected = new Subject();
10
- this._reported = new Subject();
11
- this._upvoted = new Subject();
12
- this._userSelected = new Subject();
13
- }
14
- get userSelected() {
15
- return this._userSelected;
16
- }
17
- get selected() {
18
- return this._selected;
19
- }
20
- get reported() {
21
- return this._reported;
22
- }
23
- get upvoted() {
24
- return this._upvoted;
25
- }
26
- avatarForUser(user) {
27
- if (user && user.avatarUrl) {
28
- let url = user.avatarUrl;
29
- return `url(${url})`;
30
- }
31
- return null;
32
- }
33
- upvote() {
34
- this._upvoted.next();
35
- }
36
- report() {
37
- this._reported.next();
38
- }
39
- select() {
40
- this._selected.next();
41
- }
42
- selectUser() {
43
- this._userSelected.next(this.message.user);
44
- }
45
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ChatMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: ChatMessageComponent, selector: "banta-chat-message", inputs: { message: "message" }, outputs: { userSelected: "userSelected", selected: "selected", reported: "reported", upvoted: "upvoted" }, ngImport: i0, template: "<div class=\"message-content\">\r\n <div class=\"user\" (click)=\"selectUser()\">\r\n <div class=\"avatar\" [style.background-image]=\"avatarForUser(message.user)\"></div>\r\n <label>{{message.user.username}}</label>\r\n </div>\r\n <div class=\"content\">\r\n <div (click)=\"select()\">\r\n {{message.message}}\r\n </div>\r\n <div class=\"status\">\r\n <div class=\"count-indicator\" *ngIf=\"message.likes > 0\">\r\n <mat-icon>star</mat-icon> {{message.likes}}\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"actions\">\r\n <button mat-icon-button matTooltip=\"Upvote\" matTooltipPosition=\"below\" (click)=\"upvote()\">\r\n <mat-icon>thumb_up</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip=\"Report\" matTooltipPosition=\"below\" (click)=\"report()\">\r\n <mat-icon>report</mat-icon>\r\n </button>\r\n</div>", styles: [":host{display:flex;flex-direction:row;align-items:center;padding:0 1em;background-color:#fff;color:#000;transition:.4s background-color ease-out}:host .message-content .content{color:#111}:host:hover{background-color:#ddd}:host.highlight{background:#00121b}:host.highlight:hover{background:#01324d}:host:nth-child(2n){background-color:#eee}:host:nth-child(2n):hover{background:#ddd}:host:nth-child(2n) .message-content .content{color:#222}:host:nth-child(2n).highlight{background:#001a2a}:host:nth-child(2n).highlight:hover{background:#002b44}:host .message-content{display:flex;flex-direction:row;flex-grow:1;align-items:center}:host .message-content .content{display:flex;flex-direction:row;padding:5px 0}:host .message-content .content .status{display:flex;flex-direction:row;align-items:center;margin-left:1em}:host .message-content .content .status mat-icon{margin-left:.5em}:host .user{color:#999;font-weight:400;text-align:right;margin-right:.25em;flex-shrink:0;display:flex;align-items:center}:host .user .avatar{background-position:center;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0;margin-right:1em;width:2em;height:2em}:host .user:after{content:\":\";margin-right:1em}:host .content{flex-grow:1}:host .actions{flex-shrink:0;white-space:nowrap;opacity:0;transition:.4s opacity ease-out}:host:hover .actions{opacity:1}.count-indicator{white-space:nowrap}.count-indicator mat-icon{vertical-align:bottom}:host-context(.mat-dark-theme){background-color:#000;color:#fff}:host-context(.mat-dark-theme) .message-content .content{color:#ddd}:host-context(.mat-dark-theme):hover{background-color:#111}:host-context(.mat-dark-theme):nth-child(2n).highlight{background:#001a2a}:host-context(.mat-dark-theme):nth-child(2n).highlight:hover{background:#002b44}:host-context(.mat-dark-theme):nth-child(2n):hover{background-color:#111}:host-context(.mat-dark-theme):nth-child(2n){background-color:#080808}:host-context(.mat-dark-theme):nth-child(2n) .message-content .content{color:#eee}label{margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }] }); }
47
- }
48
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ChatMessageComponent, decorators: [{
49
- type: Component,
50
- args: [{ selector: 'banta-chat-message', template: "<div class=\"message-content\">\r\n <div class=\"user\" (click)=\"selectUser()\">\r\n <div class=\"avatar\" [style.background-image]=\"avatarForUser(message.user)\"></div>\r\n <label>{{message.user.username}}</label>\r\n </div>\r\n <div class=\"content\">\r\n <div (click)=\"select()\">\r\n {{message.message}}\r\n </div>\r\n <div class=\"status\">\r\n <div class=\"count-indicator\" *ngIf=\"message.likes > 0\">\r\n <mat-icon>star</mat-icon> {{message.likes}}\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"actions\">\r\n <button mat-icon-button matTooltip=\"Upvote\" matTooltipPosition=\"below\" (click)=\"upvote()\">\r\n <mat-icon>thumb_up</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip=\"Report\" matTooltipPosition=\"below\" (click)=\"report()\">\r\n <mat-icon>report</mat-icon>\r\n </button>\r\n</div>", styles: [":host{display:flex;flex-direction:row;align-items:center;padding:0 1em;background-color:#fff;color:#000;transition:.4s background-color ease-out}:host .message-content .content{color:#111}:host:hover{background-color:#ddd}:host.highlight{background:#00121b}:host.highlight:hover{background:#01324d}:host:nth-child(2n){background-color:#eee}:host:nth-child(2n):hover{background:#ddd}:host:nth-child(2n) .message-content .content{color:#222}:host:nth-child(2n).highlight{background:#001a2a}:host:nth-child(2n).highlight:hover{background:#002b44}:host .message-content{display:flex;flex-direction:row;flex-grow:1;align-items:center}:host .message-content .content{display:flex;flex-direction:row;padding:5px 0}:host .message-content .content .status{display:flex;flex-direction:row;align-items:center;margin-left:1em}:host .message-content .content .status mat-icon{margin-left:.5em}:host .user{color:#999;font-weight:400;text-align:right;margin-right:.25em;flex-shrink:0;display:flex;align-items:center}:host .user .avatar{background-position:center;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0;margin-right:1em;width:2em;height:2em}:host .user:after{content:\":\";margin-right:1em}:host .content{flex-grow:1}:host .actions{flex-shrink:0;white-space:nowrap;opacity:0;transition:.4s opacity ease-out}:host:hover .actions{opacity:1}.count-indicator{white-space:nowrap}.count-indicator mat-icon{vertical-align:bottom}:host-context(.mat-dark-theme){background-color:#000;color:#fff}:host-context(.mat-dark-theme) .message-content .content{color:#ddd}:host-context(.mat-dark-theme):hover{background-color:#111}:host-context(.mat-dark-theme):nth-child(2n).highlight{background:#001a2a}:host-context(.mat-dark-theme):nth-child(2n).highlight:hover{background:#002b44}:host-context(.mat-dark-theme):nth-child(2n):hover{background-color:#111}:host-context(.mat-dark-theme):nth-child(2n){background-color:#080808}:host-context(.mat-dark-theme):nth-child(2n) .message-content .content{color:#eee}label{margin:0}\n"] }]
51
- }], propDecorators: { message: [{
52
- type: Input
53
- }], userSelected: [{
54
- type: Output
55
- }], selected: [{
56
- type: Output
57
- }], reported: [{
58
- type: Output
59
- }], upvoted: [{
60
- type: Output
61
- }] } });
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NoYXQvY2hhdC1tZXNzYWdlL2NoYXQtbWVzc2FnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jaGF0L2NoYXQtbWVzc2FnZS9jaGF0LW1lc3NhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBTy9CLE1BQU0sT0FBTyxvQkFBb0I7SUFMakM7UUFNWSxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNoQyxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNoQyxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUMvQixrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7S0FrRC9DO0lBN0NHLElBQ0ksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUNJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQsYUFBYSxDQUFDLElBQVc7UUFDckIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDekIsT0FBTyxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU07UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNO1FBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsVUFBVTtRQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQzs4R0FwRFEsb0JBQW9CO2tHQUFwQixvQkFBb0IscU1DVGpDLHM4QkF1Qk07OzJGRGRPLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDSSxvQkFBb0I7OEJBVzlCLE9BQU87c0JBRE4sS0FBSztnQkFJRixZQUFZO3NCQURmLE1BQU07Z0JBTUgsUUFBUTtzQkFEWCxNQUFNO2dCQU1ILFFBQVE7c0JBRFgsTUFBTTtnQkFNSCxPQUFPO3NCQURWLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBVc2VyLCBDaGF0TWVzc2FnZSB9IGZyb20gJ0BiYW50YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYmFudGEtY2hhdC1tZXNzYWdlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jaGF0LW1lc3NhZ2UuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENoYXRNZXNzYWdlQ29tcG9uZW50IHtcclxuICAgIHByaXZhdGUgX3NlbGVjdGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3JlcG9ydGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3Vwdm90ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfdXNlclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8VXNlcj4oKTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgbWVzc2FnZSA6IENoYXRNZXNzYWdlO1xyXG4gICAgXHJcbiAgICBAT3V0cHV0KCkgXHJcbiAgICBnZXQgdXNlclNlbGVjdGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyU2VsZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBnZXQgc2VsZWN0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgZ2V0IHJlcG9ydGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZXBvcnRlZDtcclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIGdldCB1cHZvdGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cHZvdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGF2YXRhckZvclVzZXIodXNlciA6IFVzZXIpIHtcclxuICAgICAgICBpZiAodXNlciAmJiB1c2VyLmF2YXRhclVybCkge1xyXG4gICAgICAgICAgICBsZXQgdXJsID0gdXNlci5hdmF0YXJVcmw7XHJcbiAgICAgICAgICAgIHJldHVybiBgdXJsKCR7dXJsfSlgO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHVwdm90ZSgpIHtcclxuICAgICAgICB0aGlzLl91cHZvdGVkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXBvcnQoKSB7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZWQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdCgpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZC5uZXh0KCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHNlbGVjdFVzZXIoKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlclNlbGVjdGVkLm5leHQodGhpcy5tZXNzYWdlLnVzZXIpO1xyXG4gICAgfVxyXG5cclxufSIsIjxkaXYgY2xhc3M9XCJtZXNzYWdlLWNvbnRlbnRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyXCIgKGNsaWNrKT1cInNlbGVjdFVzZXIoKVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXJcIiBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJhdmF0YXJGb3JVc2VyKG1lc3NhZ2UudXNlcilcIj48L2Rpdj5cclxuICAgICAgICA8bGFiZWw+e3ttZXNzYWdlLnVzZXIudXNlcm5hbWV9fTwvbGFiZWw+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiAoY2xpY2spPVwic2VsZWN0KClcIj5cclxuICAgICAgICAgICAge3ttZXNzYWdlLm1lc3NhZ2V9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50LWluZGljYXRvclwiICpuZ0lmPVwibWVzc2FnZS5saWtlcyA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5zdGFyPC9tYXQtaWNvbj4ge3ttZXNzYWdlLmxpa2VzfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiVXB2b3RlXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiAoY2xpY2spPVwidXB2b3RlKClcIj5cclxuICAgICAgICA8bWF0LWljb24+dGh1bWJfdXA8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiUmVwb3J0XCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiAoY2xpY2spPVwicmVwb3J0KClcIj5cclxuICAgICAgICA8bWF0LWljb24+cmVwb3J0PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG48L2Rpdj4iXX0=
@@ -1,170 +0,0 @@
1
- import { Component, Input, ViewChild, Output } from "@angular/core";
2
- import { Subject, Subscription } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../../chat-backend-base";
5
- import * as i2 from "@angular/common";
6
- import * as i3 from "../chat-message/chat-message.component";
7
- export class ChatViewComponent {
8
- constructor(backend, elementRef) {
9
- this.backend = backend;
10
- this.elementRef = elementRef;
11
- this._sourceSubs = new Subscription();
12
- this._selected = new Subject();
13
- this._selected$ = this._selected.asObservable();
14
- this._reported = new Subject();
15
- this._reported$ = this._reported.asObservable();
16
- this._upvoted = new Subject();
17
- this._upvoted$ = this._upvoted.asObservable();
18
- this._userSelected = new Subject();
19
- this._userSelected$ = this._userSelected.asObservable();
20
- this._received = new Subject();
21
- this._received$ = this._received.asObservable();
22
- this.messages = [];
23
- this.maxMessages = 200;
24
- this.emptyLabel = 'Be the first to chat';
25
- }
26
- get source() {
27
- return this._source;
28
- }
29
- get selected() { return this._selected$; }
30
- get userSelected() { return this._userSelected$; }
31
- get reported() { return this._reported$; }
32
- get upvoted() { return this._upvoted$; }
33
- get received() { return this._received$; }
34
- set source(value) {
35
- if (this._sourceSubs) {
36
- this._sourceSubs.unsubscribe();
37
- this._sourceSubs = null;
38
- }
39
- this._source = value;
40
- this.messages = [];
41
- if (value) {
42
- this._sourceSubs = new Subscription();
43
- this.messages = value.messages.slice();
44
- console.log(`Source set:`);
45
- console.dir(value);
46
- console.log(`Messages loaded:`);
47
- console.dir(this.messages);
48
- this._sourceSubs.add(this._source.messageReceived.subscribe(msg => this.messageReceived(msg)));
49
- this._sourceSubs.add(this._source.messageSent.subscribe(msg => this.messageSent(msg)));
50
- this._sourceSubs.add(this.backend.userChanged
51
- .subscribe(user => this.currentUser = user));
52
- this.getInitialMessages();
53
- }
54
- }
55
- async getInitialMessages() {
56
- let messages = (await this._source.getExistingMessages());
57
- messages.forEach(m => m.transientState ??= {});
58
- this.messages = messages.slice().reverse();
59
- this.sortMessages();
60
- }
61
- sortMessages() {
62
- if (!this.source)
63
- return;
64
- let sorter;
65
- sorter = (a, b) => (a.sentAt - b.sentAt);
66
- this.messages.sort(sorter);
67
- }
68
- addMessage(message) {
69
- if (this.messages.length > this.maxMessages + 1) {
70
- while (this.messages.length > this.maxMessages)
71
- this.messages.shift();
72
- }
73
- this.messages.push(message);
74
- this.sortMessages();
75
- }
76
- messageReceived(message) {
77
- this.addMessage(message);
78
- this._received.next(message);
79
- if (this.isScrolledToLatest())
80
- setTimeout(() => this.scrollToLatest());
81
- }
82
- isScrolledToLatest() {
83
- if (!this.messageContainer)
84
- return false;
85
- let el = this.messageContainer.nativeElement;
86
- let currentScroll = el.scrollTop;
87
- let currentTotal = el.scrollHeight - el.offsetHeight;
88
- return currentScroll > currentTotal - 10;
89
- }
90
- messageSent(message) {
91
- this.addMessage(message);
92
- if (!this.messageContainer)
93
- return;
94
- setTimeout(() => this.scrollToLatest());
95
- }
96
- scrollToLatest() {
97
- if (!this.messageContainer)
98
- return;
99
- let el = this.messageContainer.nativeElement;
100
- el.scrollTop = el.scrollHeight;
101
- }
102
- jumpTo(message) {
103
- let element = this.elementRef.nativeElement;
104
- let messageElement = element.querySelector(`banta-chat-message[data-id="${message.id}"]`);
105
- if (!messageElement) {
106
- alert(`could not find message ${message.id}`);
107
- return;
108
- }
109
- messageElement.scrollIntoView({ behavior: 'smooth' });
110
- this.flashMessage(message);
111
- }
112
- flashMessage(message) {
113
- if (!message)
114
- return;
115
- this.flashedMessageId = message.id;
116
- //setTimeout(() => this.flashedMessageId = null, 250);
117
- }
118
- mentionsMe(message) {
119
- if (!this.currentUser)
120
- return false;
121
- if (message.message.includes(`@${this.currentUser.username}`))
122
- return true;
123
- return false;
124
- }
125
- upvoteMessage(message) {
126
- this._upvoted.next(message);
127
- }
128
- reportMessage(message) {
129
- this._reported.next(message);
130
- }
131
- selectMessage(message) {
132
- this._selected.next(message);
133
- }
134
- selectMessageUser(message) {
135
- this._userSelected.next(message);
136
- }
137
- avatarForUser(user) {
138
- if (user && user.avatarUrl) {
139
- let url = user.avatarUrl;
140
- return `url(${url})`;
141
- }
142
- return null;
143
- }
144
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ChatViewComponent, deps: [{ token: i1.ChatBackendBase }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
145
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: ChatViewComponent, selector: "banta-chat-view", inputs: { source: "source", maxMessages: "maxMessages", emptyLabel: "emptyLabel" }, outputs: { selected: "selected", userSelected: "userSelected", reported: "reported", upvoted: "upvoted", received: "received" }, viewQueries: [{ propertyName: "messageContainer", first: true, predicate: ["messageContainer"], descendants: true }], ngImport: i0, template: "<div class=\"message-container\" #messageContainer>\r\n <ng-content select=\"[data-before]\"></ng-content>\r\n \r\n <div class=\"empty\" *ngIf=\"messages.length === 0\">\r\n {{emptyLabel}}\r\n </div>\r\n \r\n <ng-container *ngFor=\"let message of messages\">\r\n <banta-chat-message\r\n *ngIf=\"!message.hidden\"\r\n [message]=\"message\"\r\n [class.highlight]=\"mentionsMe(message)\" \r\n [class.flash]=\"message.id === flashedMessageId\"\r\n (selected)=\"selectMessage(message)\"\r\n (upvoted)=\"upvoteMessage(message)\"\r\n (reported)=\"reportMessage(message)\"\r\n (userSelected)=\"selectMessageUser(message)\"\r\n [attr.data-id]=\"message.id\"\r\n >\r\n </banta-chat-message>\r\n </ng-container>\r\n <ng-content select=\":not([data-before])\"></ng-content>\r\n</div>", styles: [":host{display:flex;flex-direction:column;flex-grow:1;min-height:1px}.message-container{flex-grow:1;overflow-y:auto;overflow-x:hidden;height:10em;color:#000;background:#fff;padding:.5em 1em .5em .5em}.message-container.no-scroll{height:auto;overflow-y:visible}:host-context(.mat-dark-theme) .message-container{color:#fff;background:#000}banta-chat-message.flash{animation:flash;animation-duration:2.5s;animation-iteration-count:1}@keyframes flash{0%{transform:scale(1);background:#425700}25%{transform:scale(1.05)}50%{transform:scale(1)}75%{transform:scale(1.05)}to{transform:scale(1)}}.empty{text-align:center;margin:2em;color:#888;font-size:150%}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ChatMessageComponent, selector: "banta-chat-message", inputs: ["message"], outputs: ["userSelected", "selected", "reported", "upvoted"] }] }); }
146
- }
147
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ChatViewComponent, decorators: [{
148
- type: Component,
149
- args: [{ selector: 'banta-chat-view', template: "<div class=\"message-container\" #messageContainer>\r\n <ng-content select=\"[data-before]\"></ng-content>\r\n \r\n <div class=\"empty\" *ngIf=\"messages.length === 0\">\r\n {{emptyLabel}}\r\n </div>\r\n \r\n <ng-container *ngFor=\"let message of messages\">\r\n <banta-chat-message\r\n *ngIf=\"!message.hidden\"\r\n [message]=\"message\"\r\n [class.highlight]=\"mentionsMe(message)\" \r\n [class.flash]=\"message.id === flashedMessageId\"\r\n (selected)=\"selectMessage(message)\"\r\n (upvoted)=\"upvoteMessage(message)\"\r\n (reported)=\"reportMessage(message)\"\r\n (userSelected)=\"selectMessageUser(message)\"\r\n [attr.data-id]=\"message.id\"\r\n >\r\n </banta-chat-message>\r\n </ng-container>\r\n <ng-content select=\":not([data-before])\"></ng-content>\r\n</div>", styles: [":host{display:flex;flex-direction:column;flex-grow:1;min-height:1px}.message-container{flex-grow:1;overflow-y:auto;overflow-x:hidden;height:10em;color:#000;background:#fff;padding:.5em 1em .5em .5em}.message-container.no-scroll{height:auto;overflow-y:visible}:host-context(.mat-dark-theme) .message-container{color:#fff;background:#000}banta-chat-message.flash{animation:flash;animation-duration:2.5s;animation-iteration-count:1}@keyframes flash{0%{transform:scale(1);background:#425700}25%{transform:scale(1.05)}50%{transform:scale(1)}75%{transform:scale(1.05)}to{transform:scale(1)}}.empty{text-align:center;margin:2em;color:#888;font-size:150%}\n"] }]
150
- }], ctorParameters: () => [{ type: i1.ChatBackendBase }, { type: i0.ElementRef }], propDecorators: { source: [{
151
- type: Input
152
- }], selected: [{
153
- type: Output
154
- }], userSelected: [{
155
- type: Output
156
- }], reported: [{
157
- type: Output
158
- }], upvoted: [{
159
- type: Output
160
- }], received: [{
161
- type: Output
162
- }], messageContainer: [{
163
- type: ViewChild,
164
- args: ['messageContainer']
165
- }], maxMessages: [{
166
- type: Input
167
- }], emptyLabel: [{
168
- type: Input
169
- }] } });
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NoYXQvY2hhdC12aWV3L2NoYXQtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jaGF0L2NoYXQtdmlldy9jaGF0LXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFjLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRixPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFTN0MsTUFBTSxPQUFPLGlCQUFpQjtJQUMxQixZQUNZLE9BQXdCLEVBQ3hCLFVBQW9DO1FBRHBDLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQ3hCLGVBQVUsR0FBVixVQUFVLENBQTBCO1FBS3hDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVFqQyxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUN2QyxlQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQyxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUN2QyxlQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQyxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUN0QyxjQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QyxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFDM0MsbUJBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ25ELGNBQVMsR0FBRyxJQUFJLE9BQU8s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QUFNO2dCQUNPLFFBQVE7c0JBQXJCLE1BQU07Z0JBQ08sT0FBTztzQkFBcEIsTUFBTTtnQkFDTyxRQUFRO3NCQUFyQixNQUFNO2dCQXdEUCxnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBR3BCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVXNlciwgQ2hhdE1lc3NhZ2UgfSBmcm9tICdAYmFudGEvY29tbW9uJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENoYXRCYWNrZW5kQmFzZSB9IGZyb20gXCIuLi8uLi9jaGF0LWJhY2tlbmQtYmFzZVwiO1xyXG5pbXBvcnQgeyBDaGF0U291cmNlQmFzZSB9IGZyb20gXCIuLi8uLi9jaGF0LXNvdXJjZS1iYXNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYmFudGEtY2hhdC12aWV3JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jaGF0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY2hhdC12aWV3LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENoYXRWaWV3Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYmFja2VuZDogQ2hhdEJhY2tlbmRCYXNlLFxyXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZiA6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XHJcbiAgICApIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc291cmNlU3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgIHByaXZhdGUgX3NvdXJjZSA6IENoYXRTb3VyY2VCYXNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgc291cmNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3NlbGVjdGVkJCA9IHRoaXMuX3NlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHJpdmF0ZSBfcmVwb3J0ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3JlcG9ydGVkJCA9IHRoaXMuX3JlcG9ydGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHJpdmF0ZSBfdXB2b3RlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfdXB2b3RlZCQgPSB0aGlzLl91cHZvdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHJpdmF0ZSBfdXNlclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF91c2VyU2VsZWN0ZWQkID0gdGhpcy5fdXNlclNlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHJpdmF0ZSBfcmVjZWl2ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3JlY2VpdmVkJCA9IHRoaXMuX3JlY2VpdmVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIEBPdXRwdXQoKSBnZXQgc2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RlZCQ7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgdXNlclNlbGVjdGVkKCkgeyByZXR1cm4gdGhpcy5fdXNlclNlbGVjdGVkJDsgfVxyXG4gICAgQE91dHB1dCgpIGdldCByZXBvcnRlZCgpIHsgcmV0dXJuIHRoaXMuX3JlcG9ydGVkJDsgfVxyXG4gICAgQE91dHB1dCgpIGdldCB1cHZvdGVkKCkgeyByZXR1cm4gdGhpcy5fdXB2b3RlZCQ7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgcmVjZWl2ZWQoKSB7IHJldHVybiB0aGlzLl9yZWNlaXZlZCQ7IH1cclxuXHJcbiAgICBzZXQgc291cmNlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZVN1YnMpIHtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vicy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VTdWJzID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICB0aGlzLm1lc3NhZ2VzID0gW107XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VTdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzID0gdmFsdWUubWVzc2FnZXMuc2xpY2UoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTb3VyY2Ugc2V0OmApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcih2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTWVzc2FnZXMgbG9hZGVkOmApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcih0aGlzLm1lc3NhZ2VzKTsgXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VTdWJzLmFkZCh0aGlzLl9zb3VyY2UubWVzc2FnZVJlY2VpdmVkLnN1YnNjcmliZShtc2cgPT4gdGhpcy5tZXNzYWdlUmVjZWl2ZWQobXNnKSkpO1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VTdWJzLmFkZCh0aGlzLl9zb3VyY2UubWVzc2FnZVNlbnQuc3Vic2NyaWJlKG1zZyA9PiB0aGlzLm1lc3NhZ2VTZW50KG1zZykpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnMuYWRkKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kLnVzZXJDaGFuZ2VkXHJcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh1c2VyID0+IHRoaXMuY3VycmVudFVzZXIgPSB1c2VyKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5nZXRJbml0aWFsTWVzc2FnZXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRJbml0aWFsTWVzc2FnZXMoKSB7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2VzID0gKGF3YWl0IHRoaXMuX3NvdXJjZS5nZXRFeGlzdGluZ01lc3NhZ2VzKCkpO1xyXG4gICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobSA9PiBtLnRyYW5zaWVudFN0YXRlID8/PSB7fSk7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKCkucmV2ZXJzZSgpO1xyXG4gICAgICAgIHRoaXMuc29ydE1lc3NhZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzb3J0TWVzc2FnZXMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBzb3J0ZXI6IChhOiBDaGF0TWVzc2FnZSwgYjogQ2hhdE1lc3NhZ2UpID0+IG51bWJlcjtcclxuXHJcbiAgICAgICAgc29ydGVyID0gKGEsIGIpID0+IChhLnNlbnRBdCAtIGIuc2VudEF0KTtcclxuXHJcbiAgICAgICAgdGhpcy5tZXNzYWdlcy5zb3J0KHNvcnRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgbWVzc2FnZXMgOiBDaGF0TWVzc2FnZVtdID0gW107XHJcbiAgICBjdXJyZW50VXNlciA6IFVzZXI7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnbWVzc2FnZUNvbnRhaW5lcicpXHJcbiAgICBtZXNzYWdlQ29udGFpbmVyIDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gICAgQElucHV0KCkgbWF4TWVzc2FnZXMgOiBudW1iZXIgPSAyMDA7XHJcbiAgICBASW5wdXQoKSBlbXB0eUxhYmVsID0gJ0JlIHRoZSBmaXJzdCB0byBjaGF0JztcclxuXHJcbiAgICBwcml2YXRlIGFkZE1lc3NhZ2UobWVzc2FnZSA6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZXMubGVuZ3RoID4gdGhpcy5tYXhNZXNzYWdlcyArIDEpIHtcclxuICAgICAgICAgICAgd2hpbGUgKHRoaXMubWVzc2FnZXMubGVuZ3RoID4gdGhpcy5tYXhNZXNzYWdlcylcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMuc2hpZnQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWVzc2FnZXMucHVzaChtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLnNvcnRNZXNzYWdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWVzc2FnZVJlY2VpdmVkKG1lc3NhZ2UgOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuYWRkTWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLl9yZWNlaXZlZC5uZXh0KG1lc3NhZ2UpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1Njcm9sbGVkVG9MYXRlc3QoKSlcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvTGF0ZXN0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzU2Nyb2xsZWRUb0xhdGVzdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUNvbnRhaW5lcilcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgZWwgPSB0aGlzLm1lc3NhZ2VDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBsZXQgY3VycmVudFNjcm9sbCA9IGVsLnNjcm9sbFRvcDtcclxuICAgICAgICBsZXQgY3VycmVudFRvdGFsID0gZWwuc2Nyb2xsSGVpZ2h0IC0gZWwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTY3JvbGwgPiBjdXJyZW50VG90YWwgLSAxMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1lc3NhZ2VTZW50KG1lc3NhZ2UgOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuYWRkTWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUNvbnRhaW5lcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9MYXRlc3QoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsVG9MYXRlc3QoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VDb250YWluZXIpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgZWwgPSB0aGlzLm1lc3NhZ2VDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAganVtcFRvKG1lc3NhZ2UgOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2VFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKGBiYW50YS1jaGF0LW1lc3NhZ2VbZGF0YS1pZD1cIiR7bWVzc2FnZS5pZH1cIl1gKVxyXG5cclxuICAgICAgICBpZiAoIW1lc3NhZ2VFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGFsZXJ0KGBjb3VsZCBub3QgZmluZCBtZXNzYWdlICR7bWVzc2FnZS5pZH1gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWVzc2FnZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZmxhc2hNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGZsYXNoTWVzc2FnZShtZXNzYWdlIDogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoIW1lc3NhZ2UpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmZsYXNoZWRNZXNzYWdlSWQgPSBtZXNzYWdlLmlkO1xyXG4gICAgICAgIC8vc2V0VGltZW91dCgoKSA9PiB0aGlzLmZsYXNoZWRNZXNzYWdlSWQgPSBudWxsLCAyNTApO1xyXG4gICAgfVxyXG5cclxuICAgIGZsYXNoZWRNZXNzYWdlSWQgOiBzdHJpbmc7XHJcblxyXG5cclxuICAgIG1lbnRpb25zTWUobWVzc2FnZSA6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRVc2VyKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2UuaW5jbHVkZXMoYEAke3RoaXMuY3VycmVudFVzZXIudXNlcm5hbWV9YCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdXB2b3RlTWVzc2FnZShtZXNzYWdlIDogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl91cHZvdGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVwb3J0TWVzc2FnZShtZXNzYWdlIDogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdE1lc3NhZ2UobWVzc2FnZSA6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RNZXNzYWdlVXNlcihtZXNzYWdlIDogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2VsZWN0ZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBhdmF0YXJGb3JVc2VyKHVzZXIgOiBVc2VyKSB7XHJcbiAgICAgICAgaWYgKHVzZXIgJiYgdXNlci5hdmF0YXJVcmwpIHtcclxuICAgICAgICAgICAgbGV0IHVybCA9IHVzZXIuYXZhdGFyVXJsO1xyXG4gICAgICAgICAgICByZXR1cm4gYHVybCgke3VybH0pYDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59IiwiPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGFpbmVyXCIgI21lc3NhZ2VDb250YWluZXI+XHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZGF0YS1iZWZvcmVdXCI+PC9uZy1jb250ZW50PlxyXG4gICAgXHJcbiAgICA8ZGl2IGNsYXNzPVwiZW1wdHlcIiAqbmdJZj1cIm1lc3NhZ2VzLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgIHt7ZW1wdHlMYWJlbH19XHJcbiAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBtZXNzYWdlc1wiPlxyXG4gICAgICAgIDxiYW50YS1jaGF0LW1lc3NhZ2VcclxuICAgICAgICAgICAgKm5nSWY9XCIhbWVzc2FnZS5oaWRkZW5cIlxyXG4gICAgICAgICAgICBbbWVzc2FnZV09XCJtZXNzYWdlXCJcclxuICAgICAgICAgICAgW2NsYXNzLmhpZ2hsaWdodF09XCJtZW50aW9uc01lKG1lc3NhZ2UpXCIgXHJcbiAgICAgICAgICAgIFtjbGFzcy5mbGFzaF09XCJtZXNzYWdlLmlkID09PSBmbGFzaGVkTWVzc2FnZUlkXCJcclxuICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdE1lc3NhZ2UobWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAodXB2b3RlZCk9XCJ1cHZvdGVNZXNzYWdlKG1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgKHJlcG9ydGVkKT1cInJlcG9ydE1lc3NhZ2UobWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAodXNlclNlbGVjdGVkKT1cInNlbGVjdE1lc3NhZ2VVc2VyKG1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS1pZF09XCJtZXNzYWdlLmlkXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2JhbnRhLWNoYXQtbWVzc2FnZT5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiOm5vdChbZGF0YS1iZWZvcmVdKVwiPjwvbmctY29udGVudD5cclxuPC9kaXY+Il19
@@ -1,80 +0,0 @@
1
- import { Component, Input, Output } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../chat-backend-base";
5
- import * as i2 from "@angular/common";
6
- import * as i3 from "./chat-message/chat-message.component";
7
- export class LiveChatMessageComponent {
8
- constructor(backend) {
9
- this.backend = backend;
10
- this._upvoted = new Subject();
11
- this._reported = new Subject();
12
- this._selected = new Subject();
13
- }
14
- get upvoted() {
15
- return this._upvoted;
16
- }
17
- get reported() {
18
- return this._reported;
19
- }
20
- get selected() {
21
- return this._selected;
22
- }
23
- get message() {
24
- return this._message;
25
- }
26
- set message(value) {
27
- let originalId = null;
28
- if (this._message)
29
- originalId = this._message.id;
30
- this._message = value;
31
- if (value && originalId === value.id) {
32
- return;
33
- }
34
- if (this.unsubscribe)
35
- this.unsubscribe();
36
- if (value) {
37
- this.unsubscribe = this.backend.watchMessage(value, message => this.message = message);
38
- }
39
- }
40
- report() {
41
- this._reported.next();
42
- }
43
- upvote() {
44
- this._upvoted.next();
45
- }
46
- select() {
47
- this._selected.next();
48
- }
49
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: LiveChatMessageComponent, deps: [{ token: i1.ChatBackendBase }], target: i0.ɵɵFactoryTarget.Component }); }
50
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: LiveChatMessageComponent, selector: "banta-live-chat-message", inputs: { message: "message" }, outputs: { upvoted: "upvoted", reported: "reported", selected: "selected" }, ngImport: i0, template: `
51
- <banta-chat-message
52
- *ngIf="message"
53
- [message]="message"
54
- (upvoted)="upvote()"
55
- (reported)="report()"
56
- (selected)="select()"
57
- ></banta-chat-message>
58
- `, isInline: true, styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ChatMessageComponent, selector: "banta-chat-message", inputs: ["message"], outputs: ["userSelected", "selected", "reported", "upvoted"] }] }); }
59
- }
60
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: LiveChatMessageComponent, decorators: [{
61
- type: Component,
62
- args: [{ selector: 'banta-live-chat-message', template: `
63
- <banta-chat-message
64
- *ngIf="message"
65
- [message]="message"
66
- (upvoted)="upvote()"
67
- (reported)="report()"
68
- (selected)="select()"
69
- ></banta-chat-message>
70
- ` }]
71
- }], ctorParameters: () => [{ type: i1.ChatBackendBase }], propDecorators: { upvoted: [{
72
- type: Output
73
- }], reported: [{
74
- type: Output
75
- }], selected: [{
76
- type: Output
77
- }], message: [{
78
- type: Input
79
- }] } });
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1jaGF0LW1lc3NhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY2hhdC9saXZlLWNoYXQtbWVzc2FnZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUM7Ozs7O0FBZ0IzQyxNQUFNLE9BQU8sd0JBQXdCO0lBQ2pDLFlBQ1ksT0FBeUI7UUFBekIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFNN0IsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDL0IsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFMeEMsQ0FBQztJQU9ELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUNJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBSUQsSUFBSSxPQUFPLENBQUMsS0FBSztRQUNiLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQ2IsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXRCLElBQUksS0FBSyxJQUFJLFVBQVUsS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbkMsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQ2hCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV2QixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQzNGLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU07UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNO1FBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDOzhHQS9EUSx3QkFBd0I7a0dBQXhCLHdCQUF3Qiw0S0FYdkI7Ozs7Ozs7O0tBUVQ7OzJGQUdRLHdCQUF3QjtrQkFicEMsU0FBUzsrQkFDSSx5QkFBeUIsWUFDekI7Ozs7Ozs7O0tBUVQ7b0ZBZ0JHLE9BQU87c0JBRFYsTUFBTTtnQkFNSCxRQUFRO3NCQURYLE1BQU07Z0JBTUgsUUFBUTtzQkFEWCxNQUFNO2dCQU1ILE9BQU87c0JBRFYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDaGF0TWVzc2FnZSB9IGZyb20gJ0BiYW50YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENoYXRCYWNrZW5kQmFzZSB9IGZyb20gJy4uL2NoYXQtYmFja2VuZC1iYXNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdiYW50YS1saXZlLWNoYXQtbWVzc2FnZScsXHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gICAgICAgIDxiYW50YS1jaGF0LW1lc3NhZ2UgXHJcbiAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZVwiXHJcbiAgICAgICAgICAgIFttZXNzYWdlXT1cIm1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAodXB2b3RlZCk9XCJ1cHZvdGUoKVwiXHJcbiAgICAgICAgICAgIChyZXBvcnRlZCk9XCJyZXBvcnQoKVwiXHJcbiAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3QoKVwiXHJcbiAgICAgICAgICAgID48L2JhbnRhLWNoYXQtbWVzc2FnZT5cclxuICAgIGAsXHJcbiAgICBzdHlsZXM6IFtgYF1cclxufSlcclxuZXhwb3J0IGNsYXNzIExpdmVDaGF0TWVzc2FnZUNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGJhY2tlbmQgOiBDaGF0QmFja2VuZEJhc2VcclxuICAgICkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlIDogQ2hhdE1lc3NhZ2U7XHJcbiAgICBwcml2YXRlIF91cHZvdGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3JlcG9ydGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3NlbGVjdGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIGdldCB1cHZvdGVkKCkgOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXB2b3RlZDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBnZXQgcmVwb3J0ZWQoKSA6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZXBvcnRlZDtcclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIGdldCBzZWxlY3RlZCgpIDogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IG1lc3NhZ2UoKSA6IENoYXRNZXNzYWdlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuc3Vic2NyaWJlIDogRnVuY3Rpb247XHJcblxyXG4gICAgc2V0IG1lc3NhZ2UodmFsdWUpIHtcclxuICAgICAgICBsZXQgb3JpZ2luYWxJZCA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX21lc3NhZ2UpXHJcbiAgICAgICAgICAgIG9yaWdpbmFsSWQgPSB0aGlzLl9tZXNzYWdlLmlkO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX21lc3NhZ2UgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlICYmIG9yaWdpbmFsSWQgPT09IHZhbHVlLmlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlKVxyXG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUgPSB0aGlzLmJhY2tlbmQud2F0Y2hNZXNzYWdlKHZhbHVlLCBtZXNzYWdlID0+IHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXBvcnQoKSB7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZWQubmV4dCgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB1cHZvdGUoKSB7XHJcbiAgICAgICAgdGhpcy5fdXB2b3RlZC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0KCkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkLm5leHQoKTtcclxuICAgIH1cclxufSJdfQ==
@@ -1,31 +0,0 @@
1
- import { BehaviorSubject } from 'rxjs';
2
- export class ChatBackendBase {
3
- constructor() {
4
- this._userChanged = new BehaviorSubject(null);
5
- this._attachmentScrapers = [];
6
- this._attachmentResolvers = [];
7
- }
8
- get userChanged() {
9
- return this._userChanged;
10
- }
11
- set user(user) {
12
- this._user = user;
13
- this._userChanged.next(user);
14
- }
15
- get user() {
16
- return this._user;
17
- }
18
- registerAttachmentScraper(scraper) {
19
- this._attachmentScrapers.push(scraper);
20
- }
21
- registerAttachmentResolver(resolver) {
22
- this._attachmentResolvers.push(resolver);
23
- }
24
- get attachmentScrapers() {
25
- return this._attachmentScrapers.slice();
26
- }
27
- get attachmentResolvers() {
28
- return this._attachmentResolvers.slice();
29
- }
30
- }
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1iYWNrZW5kLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jaGF0LWJhY2tlbmQtYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBZW5ELE1BQU0sT0FBZ0IsZUFBZTtJQUNqQztRQW9FUSxpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFPLElBQUksQ0FBQyxDQUFDO1FBZ0IvQyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBQzlDLHlCQUFvQixHQUF5QixFQUFFLENBQUM7SUFwRnhELENBQUM7SUFzRUQsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxJQUFXO1FBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUtELHlCQUF5QixDQUFDLE9BQTBCO1FBQ2hELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELDBCQUEwQixDQUFDLFFBQTRCO1FBQ25ELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNuQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIFZvdGUsIENvbW1lbnRzT3JkZXIsIE5vdGlmaWNhdGlvbiwgVXNlciwgVXJsQ2FyZCwgRmlsdGVyTW9kZSwgVG9waWMgfSBmcm9tICdAYmFudGEvY29tbW9uJztcclxuaW1wb3J0IHsgQ2hhdFNvdXJjZUJhc2UgfSBmcm9tICcuL2NoYXQtc291cmNlLWJhc2UnO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50UmVzb2x2ZXIsIEF0dGFjaG1lbnRTY3JhcGVyIH0gZnJvbSAnLi9hdHRhY2htZW50LXNjcmFwZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaGF0U291cmNlT3B0aW9ucyB7XHJcbiAgICBzb3J0T3JkZXI/OiBDb21tZW50c09yZGVyO1xyXG4gICAgZmlsdGVyTW9kZT86IEZpbHRlck1vZGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIb3cgbWFueSBtZXNzYWdlcyBzaG91bGQgYmUgbG9hZGVkIGluaXRpYWxseT9cclxuICAgICAqL1xyXG4gICAgaW5pdGlhbE1lc3NhZ2VDb3VudD86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENoYXRCYWNrZW5kQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYWJzdHJhY3QgZ2V0U291cmNlRm9yVG9waWModG9waWNJZCA6IHN0cmluZywgb3B0aW9ucz86IENoYXRTb3VyY2VPcHRpb25zKSA6IFByb21pc2U8Q2hhdFNvdXJjZUJhc2U+O1xyXG4gICAgYWJzdHJhY3QgZ2V0U291cmNlRm9yVGhyZWFkKHRvcGljSWQgOiBzdHJpbmcsIG1lc3NhZ2VJZCA6IHN0cmluZywgb3B0aW9ucz86IENoYXRTb3VyY2VPcHRpb25zKSA6IFByb21pc2U8Q2hhdFNvdXJjZUJhc2U+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjb3VudCBvZiB0aGUgZ2l2ZW4gdG9waWNcclxuICAgICAqIEBwYXJhbSB0b3BpY0lkIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGFic3RyYWN0IGdldFNvdXJjZUNvdW50Rm9yVG9waWModG9waWNJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjb3VudCBvZiB0aGUgZ2l2ZW4gdG9waWNzLiBcclxuICAgICAqIEBwYXJhbSB0b3BpY0lkIFRvcGljcyB0byBjb3VudCBtZXNzYWdlcyBvbi4gTWF4aW11bSBvZiAxMDAwLlxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGFic3RyYWN0IGdldFNvdXJjZUNvdW50Rm9yVG9waWNzKHRvcGljSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdpdmVuIHRvcGljLiBcclxuICAgICAqIEBwYXJhbSB0b3BpY0lkIFxyXG4gICAgICogQHJldHVybnMgVGhlIHRvcGljIG9iamVjdCwgb3IgdW5kZWZpbmVkIGlmIG5vIHN1Y2ggdG9waWMgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCBnZXRUb3BpYyh0b3BpY0lkOiBzdHJpbmcpOiBQcm9taXNlPFRvcGljIHwgdW5kZWZpbmVkPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2l2ZW4gdG9waWNzXHJcbiAgICAgKiBAcGFyYW0gdG9waWNJZHMgVGhlIHRvcGljIElEcyB0byBsb29rIHVwLiBNYXhpbXVtIG9mIDEwMDAuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBtYXRjaGluZyB0b3BpYyBvYmplY3RzLlxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCBnZXRUb3BpY3NCeUlkKHRvcGljSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8VG9waWNbXT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBzZXQgb2YgbWVzc2FnZXMgZnJvbSB0aGUgZ2l2ZW4gdG9waWMuXHJcbiAgICAgKiBAcGFyYW0gdG9waWNJZCBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCBnZXRNZXNzYWdlcyhcclxuICAgICAgICB0b3BpY0lkOiBzdHJpbmcsIFxyXG4gICAgICAgIHNvcnQ/OiBDb21tZW50c09yZGVyLCBcclxuICAgICAgICBmaWx0ZXI/OiBGaWx0ZXJNb2RlLCBcclxuICAgICAgICBvZmZzZXQ/OiBudW1iZXIsIFxyXG4gICAgICAgIGxpbWl0PzogbnVtYmVyXHJcbiAgICApOiBQcm9taXNlPENoYXRNZXNzYWdlW10+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgc2V0IG9mIG1lc3NhZ2VzIGZyb20gdGhlIGdpdmVuIHRvcGljLlxyXG4gICAgICogQHBhcmFtIHRvcGljSWQgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgYWJzdHJhY3QgZ2V0UmVwbGllcyhcclxuICAgICAgICBwYXJlbnRNZXNzYWdlSWQ6IHN0cmluZyxcclxuICAgICAgICBzb3J0PzogQ29tbWVudHNPcmRlciwgXHJcbiAgICAgICAgZmlsdGVyPzogRmlsdGVyTW9kZSwgXHJcbiAgICAgICAgb2Zmc2V0PzogbnVtYmVyLCBcclxuICAgICAgICBsaW1pdD86IG51bWJlclxyXG4gICAgKTogUHJvbWlzZTxDaGF0TWVzc2FnZVtdPjtcclxuXHJcbiAgICBhYnN0cmFjdCByZWZyZXNoTWVzc2FnZShtZXNzYWdlIDogQ2hhdE1lc3NhZ2UpOiBQcm9taXNlPENoYXRNZXNzYWdlPjtcclxuICAgIGFic3RyYWN0IGdldE1lc3NhZ2UodG9waWNJZCA6IHN0cmluZywgbWVzc2FnZUlkIDogc3RyaW5nKTogUHJvbWlzZTxDaGF0TWVzc2FnZT47XHJcbiAgICBhYnN0cmFjdCBnZXRTdWJNZXNzYWdlKHRvcGljSWQgOiBzdHJpbmcsIHBhcmVudE1lc3NhZ2VJZCA6IHN0cmluZywgbWVzc2FnZUlkIDogc3RyaW5nKTogUHJvbWlzZTxDaGF0TWVzc2FnZT47XHJcbiAgICBhYnN0cmFjdCB3YXRjaE1lc3NhZ2UobWVzc2FnZSA6IENoYXRNZXNzYWdlLCBoYW5kbGVyIDogKG1lc3NhZ2UgOiBDaGF0TWVzc2FnZSkgPT4gdm9pZCkgOiAoKSA9PiB2b2lkO1xyXG4gICAgYWJzdHJhY3QgZ2V0Q2FyZEZvclVybCh1cmw6IHN0cmluZyk6IFByb21pc2U8VXJsQ2FyZD47XHJcbiAgICByZWFkb25seSBub3RpZmljYXRpb25zQ2hhbmdlZCA6IE9ic2VydmFibGU8Tm90aWZpY2F0aW9uW10+O1xyXG4gICAgcmVhZG9ubHkgbmV3Tm90aWZpY2F0aW9uIDogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb24+O1xyXG4gICAgXHJcbiAgICBwcml2YXRlIF91c2VyQ2hhbmdlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlcj4obnVsbCk7XHJcbiAgICBwcml2YXRlIF91c2VyIDogVXNlcjtcclxuICAgIFxyXG4gICAgZ2V0IHVzZXJDaGFuZ2VkKCkgOiBPYnNlcnZhYmxlPFVzZXI+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlckNoYW5nZWQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHNldCB1c2VyKHVzZXIgOiBVc2VyKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlciA9IHVzZXI7XHJcbiAgICAgICAgdGhpcy5fdXNlckNoYW5nZWQubmV4dCh1c2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdXNlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlcjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfYXR0YWNobWVudFNjcmFwZXJzOiBBdHRhY2htZW50U2NyYXBlcltdID0gW107XHJcbiAgICBwcml2YXRlIF9hdHRhY2htZW50UmVzb2x2ZXJzOiBBdHRhY2htZW50UmVzb2x2ZXJbXSA9IFtdO1xyXG5cclxuICAgIHJlZ2lzdGVyQXR0YWNobWVudFNjcmFwZXIoc2NyYXBlcjogQXR0YWNobWVudFNjcmFwZXIpIHtcclxuICAgICAgICB0aGlzLl9hdHRhY2htZW50U2NyYXBlcnMucHVzaChzY3JhcGVyKTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlckF0dGFjaG1lbnRSZXNvbHZlcihyZXNvbHZlcjogQXR0YWNobWVudFJlc29sdmVyKSB7XHJcbiAgICAgICAgdGhpcy5fYXR0YWNobWVudFJlc29sdmVycy5wdXNoKHJlc29sdmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYXR0YWNobWVudFNjcmFwZXJzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2htZW50U2NyYXBlcnMuc2xpY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYXR0YWNobWVudFJlc29sdmVycygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNobWVudFJlc29sdmVycy5zbGljZSgpO1xyXG4gICAgfVxyXG59Il19