@banta/sdk 5.4.0 → 5.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/banta-sdk.mjs +4 -4
- package/{esm2020 → esm2022}/lib/attachment-scraper.mjs +1 -1
- package/esm2022/lib/banta/banta.component.mjs +204 -0
- package/{esm2020 → esm2022}/lib/banta-logo.component.mjs +11 -11
- package/{esm2020 → esm2022}/lib/banta-sdk.module.mjs +135 -135
- package/esm2022/lib/chat/banta-chat/banta-chat.component.mjs +209 -0
- package/esm2022/lib/chat/chat-message/chat-message.component.mjs +62 -0
- package/esm2022/lib/chat/chat-view/chat-view.component.mjs +170 -0
- package/{esm2020 → esm2022}/lib/chat/chat.module.mjs +51 -51
- package/{esm2020 → esm2022}/lib/chat/index.mjs +5 -5
- package/esm2022/lib/chat/live-chat-message.component.mjs +80 -0
- package/{esm2020 → esm2022}/lib/chat-backend-base.mjs +30 -30
- package/esm2022/lib/chat-backend.mjs +194 -0
- package/{esm2020 → esm2022}/lib/chat-source-base.mjs +1 -1
- package/esm2022/lib/chat-source.mjs +233 -0
- package/esm2022/lib/comments/attachment-button/attachment-button.component.mjs +76 -0
- package/esm2022/lib/comments/attachment-scraper.directive.mjs +107 -0
- package/esm2022/lib/comments/banta-comments/banta-comments.component.mjs +748 -0
- package/esm2022/lib/comments/comment/comment.component.mjs +175 -0
- package/esm2022/lib/comments/comment-field/comment-field.component.mjs +401 -0
- package/esm2022/lib/comments/comment-sort/comment-sort.component.mjs +37 -0
- package/esm2022/lib/comments/comment-view/comment-view.component.mjs +470 -0
- package/{esm2020 → esm2022}/lib/comments/comments.module.mjs +111 -111
- package/{esm2020 → esm2022}/lib/comments/index.mjs +10 -10
- package/esm2022/lib/comments/live-comment.component.mjs +80 -0
- package/{esm2020 → esm2022}/lib/comments/reply-send-options.directive.mjs +13 -13
- package/esm2022/lib/common/attachment/attachment.component.mjs +128 -0
- package/{esm2020 → esm2022}/lib/common/attachments/attachments.component.mjs +75 -75
- package/{esm2020 → esm2022}/lib/common/common.module.mjs +68 -68
- package/{esm2020 → esm2022}/lib/common/index.mjs +10 -10
- package/{esm2020 → esm2022}/lib/common/lazy-connection.mjs +14 -14
- package/esm2022/lib/common/lightbox/lightbox.component.mjs +31 -0
- package/esm2022/lib/common/markdown-to-html.pipe.mjs +88 -0
- package/esm2022/lib/common/mention-linker.pipe.mjs +35 -0
- package/esm2022/lib/common/timer-pool.service.mjs +85 -0
- package/esm2022/lib/common/timestamp.component.mjs +124 -0
- package/{esm2020 → esm2022}/lib/common/trust-resource-url.pipe.mjs +22 -22
- package/esm2022/lib/emoji/emoji-selector-button.component.mjs +115 -0
- package/esm2022/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +98 -0
- package/{esm2020 → esm2022}/lib/emoji/emoji.module.mjs +55 -55
- package/{esm2020 → esm2022}/lib/emoji/emojis.mjs +6507 -6507
- package/{esm2020 → esm2022}/lib/emoji/index.mjs +4 -4
- package/esm2022/lib/giphy-attachments.mjs +16 -0
- package/{esm2020 → esm2022}/lib/index.mjs +19 -19
- package/{esm2020 → esm2022}/lib/live-message.component.mjs +61 -61
- package/{esm2020 → esm2022}/lib/message-menu-item.mjs +1 -1
- package/{esm2020 → esm2022}/lib/sdk-options.mjs +1 -1
- package/esm2022/lib/static-chat-source.mjs +71 -0
- package/esm2022/lib/tweet-attachments.mjs +13 -0
- package/esm2022/lib/url-attachments.mjs +42 -0
- package/esm2022/lib/youtube-attachments.mjs +29 -0
- package/{esm2020 → esm2022}/public-api.mjs +4 -4
- package/{fesm2020 → fesm2022}/banta-sdk.mjs +10825 -10823
- package/fesm2022/banta-sdk.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/attachment-scraper.d.ts +15 -15
- package/lib/banta/banta.component.d.ts +58 -58
- package/lib/banta-logo.component.d.ts +5 -5
- package/lib/banta-sdk.module.d.ts +31 -31
- package/lib/chat/banta-chat/banta-chat.component.d.ts +79 -79
- package/lib/chat/chat-message/chat-message.component.d.ts +21 -21
- package/lib/chat/chat-view/chat-view.component.d.ts +52 -52
- package/lib/chat/chat.module.d.ts +15 -15
- package/lib/chat/index.d.ts +5 -5
- package/lib/chat/live-chat-message.component.d.ts +23 -23
- package/lib/chat-backend-base.d.ts +72 -72
- package/lib/chat-backend.d.ts +67 -67
- package/lib/chat-source-base.d.ts +44 -44
- package/lib/chat-source.d.ts +65 -65
- package/lib/comments/attachment-button/attachment-button.component.d.ts +17 -17
- package/lib/comments/attachment-scraper.directive.d.ts +21 -21
- package/lib/comments/banta-comments/banta-comments.component.d.ts +203 -203
- package/lib/comments/comment/comment.component.d.ts +72 -72
- package/lib/comments/comment-field/comment-field.component.d.ts +89 -89
- package/lib/comments/comment-sort/comment-sort.component.d.ts +16 -16
- package/lib/comments/comment-view/comment-view.component.d.ts +121 -121
- package/lib/comments/comments.module.d.ts +30 -30
- package/lib/comments/index.d.ts +10 -10
- package/lib/comments/live-comment.component.d.ts +23 -23
- package/lib/comments/reply-send-options.directive.d.ts +5 -5
- package/lib/common/attachment/attachment.component.d.ts +34 -34
- package/lib/common/attachments/attachments.component.d.ts +26 -26
- package/lib/common/common.module.d.ts +19 -19
- package/lib/common/index.d.ts +10 -10
- package/lib/common/lazy-connection.d.ts +6 -6
- package/lib/common/lightbox/lightbox.component.d.ts +14 -14
- package/lib/common/markdown-to-html.pipe.d.ts +15 -15
- package/lib/common/mention-linker.pipe.d.ts +13 -13
- package/lib/common/timer-pool.service.d.ts +15 -15
- package/lib/common/timestamp.component.d.ts +19 -19
- package/lib/common/trust-resource-url.pipe.d.ts +10 -10
- package/lib/emoji/emoji-selector-button.component.d.ts +30 -30
- package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +26 -26
- package/lib/emoji/emoji.module.d.ts +16 -16
- package/lib/emoji/emojis.d.ts +6507 -6507
- package/lib/emoji/index.d.ts +4 -4
- package/lib/giphy-attachments.d.ts +5 -5
- package/lib/index.d.ts +19 -19
- package/lib/live-message.component.d.ts +22 -22
- package/lib/message-menu-item.d.ts +6 -6
- package/lib/sdk-options.d.ts +5 -5
- package/lib/static-chat-source.d.ts +42 -42
- package/lib/tweet-attachments.d.ts +5 -5
- package/lib/url-attachments.d.ts +14 -14
- package/lib/youtube-attachments.d.ts +5 -5
- package/package.json +5 -11
- package/public-api.d.ts +1 -1
- package/esm2020/lib/banta/banta.component.mjs +0 -204
- package/esm2020/lib/chat/banta-chat/banta-chat.component.mjs +0 -209
- package/esm2020/lib/chat/chat-message/chat-message.component.mjs +0 -62
- package/esm2020/lib/chat/chat-view/chat-view.component.mjs +0 -170
- package/esm2020/lib/chat/live-chat-message.component.mjs +0 -80
- package/esm2020/lib/chat-backend.mjs +0 -194
- package/esm2020/lib/chat-source.mjs +0 -233
- package/esm2020/lib/comments/attachment-button/attachment-button.component.mjs +0 -76
- package/esm2020/lib/comments/attachment-scraper.directive.mjs +0 -107
- package/esm2020/lib/comments/banta-comments/banta-comments.component.mjs +0 -749
- package/esm2020/lib/comments/comment/comment.component.mjs +0 -175
- package/esm2020/lib/comments/comment-field/comment-field.component.mjs +0 -401
- package/esm2020/lib/comments/comment-sort/comment-sort.component.mjs +0 -37
- package/esm2020/lib/comments/comment-view/comment-view.component.mjs +0 -470
- package/esm2020/lib/comments/live-comment.component.mjs +0 -80
- package/esm2020/lib/common/attachment/attachment.component.mjs +0 -128
- package/esm2020/lib/common/lightbox/lightbox.component.mjs +0 -31
- package/esm2020/lib/common/markdown-to-html.pipe.mjs +0 -88
- package/esm2020/lib/common/mention-linker.pipe.mjs +0 -35
- package/esm2020/lib/common/timer-pool.service.mjs +0 -83
- package/esm2020/lib/common/timestamp.component.mjs +0 -123
- package/esm2020/lib/emoji/emoji-selector-button.component.mjs +0 -116
- package/esm2020/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +0 -98
- package/esm2020/lib/giphy-attachments.mjs +0 -16
- package/esm2020/lib/static-chat-source.mjs +0 -71
- package/esm2020/lib/tweet-attachments.mjs +0 -13
- package/esm2020/lib/url-attachments.mjs +0 -42
- package/esm2020/lib/youtube-attachments.mjs +0 -29
- package/fesm2015/banta-sdk.mjs +0 -11258
- package/fesm2015/banta-sdk.mjs.map +0 -1
- package/fesm2020/banta-sdk.mjs.map +0 -1
|
@@ -1,135 +1,135 @@
|
|
|
1
|
-
import { NgModule } from '@angular/core';
|
|
2
|
-
import { CommentsModule } from './comments';
|
|
3
|
-
import { ChatModule } from './chat';
|
|
4
|
-
import { EmojiModule } from './emoji';
|
|
5
|
-
import { BantaComponent } from './banta/banta.component';
|
|
6
|
-
import { BantaLogoComponent } from './banta-logo.component';
|
|
7
|
-
import { CommonModule } from '@angular/common';
|
|
8
|
-
import { FormsModule } from '@angular/forms';
|
|
9
|
-
import { BantaCommonModule } from './common/common.module';
|
|
10
|
-
import { LiveMessageComponent } from './live-message.component';
|
|
11
|
-
import { MatButtonModule } from "@angular/material/button";
|
|
12
|
-
import { MatIconModule } from "@angular/material/icon";
|
|
13
|
-
import { MatTooltipModule } from "@angular/material/tooltip";
|
|
14
|
-
import { MatMenuModule } from "@angular/material/menu";
|
|
15
|
-
import { MatDialogModule } from "@angular/material/dialog";
|
|
16
|
-
import { MatSnackBarModule } from "@angular/material/snack-bar";
|
|
17
|
-
import { MatFormFieldModule } from "@angular/material/form-field";
|
|
18
|
-
import { MatInputModule } from "@angular/material/input";
|
|
19
|
-
import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
|
|
20
|
-
import { ChatBackend } from './chat-backend';
|
|
21
|
-
import { BANTA_SDK_OPTIONS } from './sdk-options';
|
|
22
|
-
import { ChatBackendBase } from './chat-backend-base';
|
|
23
|
-
import { OverlayModule } from '@angular/cdk/overlay';
|
|
24
|
-
import { PortalModule } from '@angular/cdk/portal';
|
|
25
|
-
import { UrlAttachmentResolver, UrlAttachmentScraper } from './url-attachments';
|
|
26
|
-
import { YouTubeAttachmentResolver } from './youtube-attachments';
|
|
27
|
-
import { GiphyAttachmentResolver } from './giphy-attachments';
|
|
28
|
-
import { TweetAttachmentResolver } from './tweet-attachments';
|
|
29
|
-
import * as i0 from "@angular/core";
|
|
30
|
-
import * as i1 from "./chat-backend-base";
|
|
31
|
-
import * as i2 from "./common/common.module";
|
|
32
|
-
export class BantaSdkModule {
|
|
33
|
-
constructor(chatBackend) {
|
|
34
|
-
chatBackend.registerAttachmentScraper(new UrlAttachmentScraper());
|
|
35
|
-
chatBackend.registerAttachmentResolver(new GiphyAttachmentResolver());
|
|
36
|
-
chatBackend.registerAttachmentResolver(new YouTubeAttachmentResolver());
|
|
37
|
-
chatBackend.registerAttachmentResolver(new TweetAttachmentResolver());
|
|
38
|
-
chatBackend.registerAttachmentResolver(new UrlAttachmentResolver(chatBackend));
|
|
39
|
-
}
|
|
40
|
-
static configure(options) {
|
|
41
|
-
return {
|
|
42
|
-
ngModule: BantaSdkModule,
|
|
43
|
-
providers: [
|
|
44
|
-
{
|
|
45
|
-
provide: BANTA_SDK_OPTIONS,
|
|
46
|
-
useValue: options || {}
|
|
47
|
-
},
|
|
48
|
-
{ provide: ChatBackendBase, useClass: ChatBackend }
|
|
49
|
-
]
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
98
|
-
type: NgModule,
|
|
99
|
-
args: [{
|
|
100
|
-
imports: [
|
|
101
|
-
CommonModule,
|
|
102
|
-
FormsModule,
|
|
103
|
-
BantaCommonModule.forRoot(),
|
|
104
|
-
CommentsModule,
|
|
105
|
-
ChatModule,
|
|
106
|
-
EmojiModule,
|
|
107
|
-
MatIconModule,
|
|
108
|
-
MatButtonModule,
|
|
109
|
-
MatTooltipModule,
|
|
110
|
-
MatMenuModule,
|
|
111
|
-
MatDialogModule,
|
|
112
|
-
MatFormFieldModule,
|
|
113
|
-
MatInputModule,
|
|
114
|
-
MatProgressSpinnerModule,
|
|
115
|
-
MatSnackBarModule,
|
|
116
|
-
OverlayModule,
|
|
117
|
-
PortalModule
|
|
118
|
-
],
|
|
119
|
-
declarations: [
|
|
120
|
-
BantaComponent,
|
|
121
|
-
BantaLogoComponent,
|
|
122
|
-
LiveMessageComponent
|
|
123
|
-
],
|
|
124
|
-
exports: [
|
|
125
|
-
BantaComponent,
|
|
126
|
-
BantaLogoComponent,
|
|
127
|
-
LiveMessageComponent,
|
|
128
|
-
BantaCommonModule,
|
|
129
|
-
ChatModule,
|
|
130
|
-
CommentsModule,
|
|
131
|
-
EmojiModule
|
|
132
|
-
]
|
|
133
|
-
}]
|
|
134
|
-
}], ctorParameters:
|
|
135
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommentsModule } from './comments';
|
|
3
|
+
import { ChatModule } from './chat';
|
|
4
|
+
import { EmojiModule } from './emoji';
|
|
5
|
+
import { BantaComponent } from './banta/banta.component';
|
|
6
|
+
import { BantaLogoComponent } from './banta-logo.component';
|
|
7
|
+
import { CommonModule } from '@angular/common';
|
|
8
|
+
import { FormsModule } from '@angular/forms';
|
|
9
|
+
import { BantaCommonModule } from './common/common.module';
|
|
10
|
+
import { LiveMessageComponent } from './live-message.component';
|
|
11
|
+
import { MatButtonModule } from "@angular/material/button";
|
|
12
|
+
import { MatIconModule } from "@angular/material/icon";
|
|
13
|
+
import { MatTooltipModule } from "@angular/material/tooltip";
|
|
14
|
+
import { MatMenuModule } from "@angular/material/menu";
|
|
15
|
+
import { MatDialogModule } from "@angular/material/dialog";
|
|
16
|
+
import { MatSnackBarModule } from "@angular/material/snack-bar";
|
|
17
|
+
import { MatFormFieldModule } from "@angular/material/form-field";
|
|
18
|
+
import { MatInputModule } from "@angular/material/input";
|
|
19
|
+
import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
|
|
20
|
+
import { ChatBackend } from './chat-backend';
|
|
21
|
+
import { BANTA_SDK_OPTIONS } from './sdk-options';
|
|
22
|
+
import { ChatBackendBase } from './chat-backend-base';
|
|
23
|
+
import { OverlayModule } from '@angular/cdk/overlay';
|
|
24
|
+
import { PortalModule } from '@angular/cdk/portal';
|
|
25
|
+
import { UrlAttachmentResolver, UrlAttachmentScraper } from './url-attachments';
|
|
26
|
+
import { YouTubeAttachmentResolver } from './youtube-attachments';
|
|
27
|
+
import { GiphyAttachmentResolver } from './giphy-attachments';
|
|
28
|
+
import { TweetAttachmentResolver } from './tweet-attachments';
|
|
29
|
+
import * as i0 from "@angular/core";
|
|
30
|
+
import * as i1 from "./chat-backend-base";
|
|
31
|
+
import * as i2 from "./common/common.module";
|
|
32
|
+
export class BantaSdkModule {
|
|
33
|
+
constructor(chatBackend) {
|
|
34
|
+
chatBackend.registerAttachmentScraper(new UrlAttachmentScraper());
|
|
35
|
+
chatBackend.registerAttachmentResolver(new GiphyAttachmentResolver());
|
|
36
|
+
chatBackend.registerAttachmentResolver(new YouTubeAttachmentResolver());
|
|
37
|
+
chatBackend.registerAttachmentResolver(new TweetAttachmentResolver());
|
|
38
|
+
chatBackend.registerAttachmentResolver(new UrlAttachmentResolver(chatBackend));
|
|
39
|
+
}
|
|
40
|
+
static configure(options) {
|
|
41
|
+
return {
|
|
42
|
+
ngModule: BantaSdkModule,
|
|
43
|
+
providers: [
|
|
44
|
+
{
|
|
45
|
+
provide: BANTA_SDK_OPTIONS,
|
|
46
|
+
useValue: options || {}
|
|
47
|
+
},
|
|
48
|
+
{ provide: ChatBackendBase, useClass: ChatBackend }
|
|
49
|
+
]
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaSdkModule, deps: [{ token: i1.ChatBackendBase }], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
53
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.9", ngImport: i0, type: BantaSdkModule, declarations: [BantaComponent,
|
|
54
|
+
BantaLogoComponent,
|
|
55
|
+
LiveMessageComponent], imports: [CommonModule,
|
|
56
|
+
FormsModule, i2.BantaCommonModule, CommentsModule,
|
|
57
|
+
ChatModule,
|
|
58
|
+
EmojiModule,
|
|
59
|
+
MatIconModule,
|
|
60
|
+
MatButtonModule,
|
|
61
|
+
MatTooltipModule,
|
|
62
|
+
MatMenuModule,
|
|
63
|
+
MatDialogModule,
|
|
64
|
+
MatFormFieldModule,
|
|
65
|
+
MatInputModule,
|
|
66
|
+
MatProgressSpinnerModule,
|
|
67
|
+
MatSnackBarModule,
|
|
68
|
+
OverlayModule,
|
|
69
|
+
PortalModule], exports: [BantaComponent,
|
|
70
|
+
BantaLogoComponent,
|
|
71
|
+
LiveMessageComponent,
|
|
72
|
+
BantaCommonModule,
|
|
73
|
+
ChatModule,
|
|
74
|
+
CommentsModule,
|
|
75
|
+
EmojiModule] }); }
|
|
76
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaSdkModule, imports: [CommonModule,
|
|
77
|
+
FormsModule,
|
|
78
|
+
BantaCommonModule.forRoot(),
|
|
79
|
+
CommentsModule,
|
|
80
|
+
ChatModule,
|
|
81
|
+
EmojiModule,
|
|
82
|
+
MatIconModule,
|
|
83
|
+
MatButtonModule,
|
|
84
|
+
MatTooltipModule,
|
|
85
|
+
MatMenuModule,
|
|
86
|
+
MatDialogModule,
|
|
87
|
+
MatFormFieldModule,
|
|
88
|
+
MatInputModule,
|
|
89
|
+
MatProgressSpinnerModule,
|
|
90
|
+
MatSnackBarModule,
|
|
91
|
+
OverlayModule,
|
|
92
|
+
PortalModule, BantaCommonModule,
|
|
93
|
+
ChatModule,
|
|
94
|
+
CommentsModule,
|
|
95
|
+
EmojiModule] }); }
|
|
96
|
+
}
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaSdkModule, decorators: [{
|
|
98
|
+
type: NgModule,
|
|
99
|
+
args: [{
|
|
100
|
+
imports: [
|
|
101
|
+
CommonModule,
|
|
102
|
+
FormsModule,
|
|
103
|
+
BantaCommonModule.forRoot(),
|
|
104
|
+
CommentsModule,
|
|
105
|
+
ChatModule,
|
|
106
|
+
EmojiModule,
|
|
107
|
+
MatIconModule,
|
|
108
|
+
MatButtonModule,
|
|
109
|
+
MatTooltipModule,
|
|
110
|
+
MatMenuModule,
|
|
111
|
+
MatDialogModule,
|
|
112
|
+
MatFormFieldModule,
|
|
113
|
+
MatInputModule,
|
|
114
|
+
MatProgressSpinnerModule,
|
|
115
|
+
MatSnackBarModule,
|
|
116
|
+
OverlayModule,
|
|
117
|
+
PortalModule
|
|
118
|
+
],
|
|
119
|
+
declarations: [
|
|
120
|
+
BantaComponent,
|
|
121
|
+
BantaLogoComponent,
|
|
122
|
+
LiveMessageComponent
|
|
123
|
+
],
|
|
124
|
+
exports: [
|
|
125
|
+
BantaComponent,
|
|
126
|
+
BantaLogoComponent,
|
|
127
|
+
LiveMessageComponent,
|
|
128
|
+
BantaCommonModule,
|
|
129
|
+
ChatModule,
|
|
130
|
+
CommentsModule,
|
|
131
|
+
EmojiModule
|
|
132
|
+
]
|
|
133
|
+
}]
|
|
134
|
+
}], ctorParameters: () => [{ type: i1.ChatBackendBase }] });
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFudGEtc2RrLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2JhbnRhLXNkay5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxj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QUNmLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCx3QkFBd0I7d0JBQ3hCLGlCQUFpQjt3QkFDakIsYUFBYTt3QkFDYixZQUFZO3FCQUNmO29CQUNELFlBQVksRUFBRTt3QkFDVixjQUFjO3dCQUNkLGtCQUFrQjt3QkFDbEIsb0JBQW9CO3FCQUN2QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ0wsY0FBYzt3QkFDZCxrQkFBa0I7d0JBQ2xCLG9CQUFvQjt3QkFDcEIsaUJBQWlCO3dCQUNqQixVQUFVO3dCQUNWLGNBQWM7d0JBQ2QsV0FBVztxQkFDZDtpQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1lbnRzTW9kdWxlIH0gZnJvbSAnLi9jb21tZW50cyc7XHJcbmltcG9ydCB7IENoYXRNb2R1bGUgfSBmcm9tICcuL2NoYXQnO1xyXG5pbXBvcnQgeyBFbW9qaU1vZHVsZSB9IGZyb20gJy4vZW1vamknO1xyXG5pbXBvcnQgeyBCYW50YUNvbXBvbmVudCB9IGZyb20gJy4vYmFudGEvYmFudGEuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQmFudGFMb2dvQ29tcG9uZW50IH0gZnJvbSAnLi9iYW50YS1sb2dvLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBCYW50YUNvbW1vbk1vZHVsZSB9IGZyb20gJy4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xyXG5pbXBvcnQgeyBMaXZlTWVzc2FnZUNvbXBvbmVudCB9IGZyb20gJy4vbGl2ZS1tZXNzYWdlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcFwiO1xyXG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL21lbnVcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQgeyBNYXRTbmFja0Jhck1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXJcIjtcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXRcIjtcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXJcIjtcclxuaW1wb3J0IHsgQ2hhdEJhY2tlbmQgfSBmcm9tICcuL2NoYXQtYmFja2VuZCc7XHJcbmltcG9ydCB7IFNka09wdGlvbnMgfSBmcm9tICcuL3Nkay1vcHRpb25zJztcclxuaW1wb3J0IHsgQkFOVEFfU0RLX09QVElPTlMgfSBmcm9tICcuL3Nkay1vcHRpb25zJztcclxuaW1wb3J0IHsgQ2hhdEJhY2tlbmRCYXNlIH0gZnJvbSAnLi9jaGF0LWJhY2tlbmQtYmFzZSc7XHJcbmltcG9ydCB7IE92ZXJsYXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IFBvcnRhbE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQgeyBVcmxBdHRhY2htZW50UmVzb2x2ZXIsIFVybEF0dGFjaG1lbnRTY3JhcGVyIH0gZnJvbSAnLi91cmwtYXR0YWNobWVudHMnO1xyXG5pbXBvcnQgeyBZb3VUdWJlQXR0YWNobWVudFJlc29sdmVyIH0gZnJvbSAnLi95b3V0dWJlLWF0dGFjaG1lbnRzJztcclxuaW1wb3J0IHsgR2lwaHlBdHRhY2htZW50UmVzb2x2ZXIgfSBmcm9tICcuL2dpcGh5LWF0dGFjaG1lbnRzJztcclxuaW1wb3J0IHsgVHdlZXRBdHRhY2htZW50UmVzb2x2ZXIgfSBmcm9tICcuL3R3ZWV0LWF0dGFjaG1lbnRzJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgICAgIEJhbnRhQ29tbW9uTW9kdWxlLmZvclJvb3QoKSxcclxuICAgICAgICBDb21tZW50c01vZHVsZSxcclxuICAgICAgICBDaGF0TW9kdWxlLFxyXG4gICAgICAgIEVtb2ppTW9kdWxlLFxyXG4gICAgICAgIFxyXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICAgICAgTWF0TWVudU1vZHVsZSxcclxuICAgICAgICBNYXREaWFsb2dNb2R1bGUsXHJcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcclxuICAgICAgICBNYXRTbmFja0Jhck1vZHVsZSxcclxuICAgICAgICBPdmVybGF5TW9kdWxlLFxyXG4gICAgICAgIFBvcnRhbE1vZHVsZVxyXG4gICAgXSxcclxuICAgIGRlY2xhcmF0aW9uczogW1xyXG4gICAgICAgIEJhbnRhQ29tcG9uZW50LFxyXG4gICAgICAgIEJhbnRhTG9nb0NvbXBvbmVudCxcclxuICAgICAgICBMaXZlTWVzc2FnZUNvbXBvbmVudFxyXG4gICAgXSxcclxuICAgIGV4cG9ydHM6IFtcclxuICAgICAgICBCYW50YUNvbXBvbmVudCxcclxuICAgICAgICBCYW50YUxvZ29Db21wb25lbnQsXHJcbiAgICAgICAgTGl2ZU1lc3NhZ2VDb21wb25lbnQsXHJcbiAgICAgICAgQmFudGFDb21tb25Nb2R1bGUsXHJcbiAgICAgICAgQ2hhdE1vZHVsZSxcclxuICAgICAgICBDb21tZW50c01vZHVsZSxcclxuICAgICAgICBFbW9qaU1vZHVsZVxyXG4gICAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFudGFTZGtNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgY2hhdEJhY2tlbmQ6IENoYXRCYWNrZW5kQmFzZVxyXG4gICAgKSB7XHJcbiAgICAgICAgY2hhdEJhY2tlbmQucmVnaXN0ZXJBdHRhY2htZW50U2NyYXBlcihuZXcgVXJsQXR0YWNobWVudFNjcmFwZXIoKSk7XHJcbiAgICAgICAgY2hhdEJhY2tlbmQucmVnaXN0ZXJBdHRhY2htZW50UmVzb2x2ZXIobmV3IEdpcGh5QXR0YWNobWVudFJlc29sdmVyKCkpO1xyXG4gICAgICAgIGNoYXRCYWNrZW5kLnJlZ2lzdGVyQXR0YWNobWVudFJlc29sdmVyKG5ldyBZb3VUdWJlQXR0YWNobWVudFJlc29sdmVyKCkpO1xyXG4gICAgICAgIGNoYXRCYWNrZW5kLnJlZ2lzdGVyQXR0YWNobWVudFJlc29sdmVyKG5ldyBUd2VldEF0dGFjaG1lbnRSZXNvbHZlcigpKTtcclxuICAgICAgICBjaGF0QmFja2VuZC5yZWdpc3RlckF0dGFjaG1lbnRSZXNvbHZlcihuZXcgVXJsQXR0YWNobWVudFJlc29sdmVyKGNoYXRCYWNrZW5kKSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBjb25maWd1cmUob3B0aW9ucz86IFNka09wdGlvbnMpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPEJhbnRhU2RrTW9kdWxlPiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbmdNb2R1bGU6IEJhbnRhU2RrTW9kdWxlLFxyXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICAgICAgICAgIHsgXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogQkFOVEFfU0RLX09QVElPTlMsIFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBvcHRpb25zIHx8IHt9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgeyBwcm92aWRlOiBDaGF0QmFja2VuZEJhc2UsIHVzZUNsYXNzOiBDaGF0QmFja2VuZCB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { Component, Input, Output, ViewChild } 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 "@angular/forms";
|
|
7
|
+
import * as i4 from "@angular/material/button";
|
|
8
|
+
import * as i5 from "../../emoji/emoji-selector-button.component";
|
|
9
|
+
import * as i6 from "../chat-view/chat-view.component";
|
|
10
|
+
/**
|
|
11
|
+
* Chat component
|
|
12
|
+
*/
|
|
13
|
+
export class BantaChatComponent {
|
|
14
|
+
constructor(backend) {
|
|
15
|
+
this.backend = backend;
|
|
16
|
+
this._subs = new Subscription();
|
|
17
|
+
this.user = null;
|
|
18
|
+
this._metadata = {};
|
|
19
|
+
this.signInLabel = 'Sign In';
|
|
20
|
+
this.sendLabel = 'Send';
|
|
21
|
+
this.permissionDeniedLabel = 'Send';
|
|
22
|
+
this.messageFieldPlaceholder = 'Chat';
|
|
23
|
+
this.emptyLabel = 'Be the first to chat';
|
|
24
|
+
this._selected = new Subject();
|
|
25
|
+
this._selected$ = this._selected.asObservable();
|
|
26
|
+
this._reported = new Subject();
|
|
27
|
+
this._reported$ = this._reported.asObservable();
|
|
28
|
+
this._upvoted = new Subject();
|
|
29
|
+
this._upvoted$ = this._upvoted.asObservable();
|
|
30
|
+
this._userSelected = new Subject();
|
|
31
|
+
this._userSelected$ = this._userSelected.asObservable();
|
|
32
|
+
this._permissionDeniedError = new Subject();
|
|
33
|
+
this._permissionDeniedError$ = this._permissionDeniedError.asObservable();
|
|
34
|
+
this._signInSelected = new Subject();
|
|
35
|
+
this._signInSelected$ = this._signInSelected.asObservable();
|
|
36
|
+
this._received = new Subject();
|
|
37
|
+
this._received$ = this._received.asObservable();
|
|
38
|
+
this.showEmojiPanel = false;
|
|
39
|
+
this.newMessage = {};
|
|
40
|
+
}
|
|
41
|
+
ngOnInit() {
|
|
42
|
+
this._subs.add(this.backend.userChanged.subscribe(user => this.user = user));
|
|
43
|
+
}
|
|
44
|
+
ngOnDestroy() {
|
|
45
|
+
this._subs.unsubscribe();
|
|
46
|
+
}
|
|
47
|
+
get source() {
|
|
48
|
+
return this._source;
|
|
49
|
+
}
|
|
50
|
+
set source(value) {
|
|
51
|
+
this._source = value;
|
|
52
|
+
}
|
|
53
|
+
get topicID() {
|
|
54
|
+
return this._source.identifier;
|
|
55
|
+
}
|
|
56
|
+
set topicID(value) {
|
|
57
|
+
this.setSourceFromTopicID(value);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Arbitrary metadata to send to the chat server. This can be used to provide context about the client to the server
|
|
61
|
+
* for things like validating authorization and other uses.
|
|
62
|
+
*/
|
|
63
|
+
get metadata() { return this._metadata; }
|
|
64
|
+
set metadata(value) {
|
|
65
|
+
if (JSON.stringify(this._metadata) !== JSON.stringify(value)) {
|
|
66
|
+
this._metadata = value;
|
|
67
|
+
this.reloadSource();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
reloadSource() {
|
|
71
|
+
clearTimeout(this._reloadSourceTimeout);
|
|
72
|
+
this._reloadSourceTimeout = setTimeout(() => {
|
|
73
|
+
this.setSourceFromTopicID(this.topicID);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async setSourceFromTopicID(topicID) {
|
|
77
|
+
if (this._source && this._source.close)
|
|
78
|
+
this._source.close();
|
|
79
|
+
this._source = null;
|
|
80
|
+
this._source = await this.backend.getSourceForTopic(topicID, {
|
|
81
|
+
metadata: this.metadata
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
get selected() { return this._selected$; }
|
|
85
|
+
get reported() { return this._reported$; }
|
|
86
|
+
get upvoted() { return this._upvoted$; }
|
|
87
|
+
get userSelected() { return this._userSelected$; }
|
|
88
|
+
get permissionDeniedError() { return this._permissionDeniedError$; }
|
|
89
|
+
get signInSelected() { return this._signInSelected$; }
|
|
90
|
+
get received() { return this._received$; }
|
|
91
|
+
onReceived(message) {
|
|
92
|
+
this._received.next(message);
|
|
93
|
+
}
|
|
94
|
+
showSignIn() {
|
|
95
|
+
this._signInSelected.next();
|
|
96
|
+
}
|
|
97
|
+
sendPermissionError(message) {
|
|
98
|
+
this._permissionDeniedError.next(message);
|
|
99
|
+
}
|
|
100
|
+
insertEmoji(emoji) {
|
|
101
|
+
let message = this.newMessage.message || '';
|
|
102
|
+
this.newMessage.message = message + emoji;
|
|
103
|
+
}
|
|
104
|
+
onKeyDown(event) {
|
|
105
|
+
// TODO
|
|
106
|
+
}
|
|
107
|
+
jumpToMessage(message) {
|
|
108
|
+
if (this.chatView)
|
|
109
|
+
this.chatView.jumpTo(message);
|
|
110
|
+
}
|
|
111
|
+
select(message) {
|
|
112
|
+
this._selected.next(message);
|
|
113
|
+
}
|
|
114
|
+
selectUser(message) {
|
|
115
|
+
this._userSelected.next(message);
|
|
116
|
+
}
|
|
117
|
+
report(message) {
|
|
118
|
+
this._reported.next(message);
|
|
119
|
+
}
|
|
120
|
+
async upvote(message) {
|
|
121
|
+
await this.source.likeMessage(message.id);
|
|
122
|
+
this._upvoted.next(message);
|
|
123
|
+
}
|
|
124
|
+
get canChat() {
|
|
125
|
+
if (!this.user)
|
|
126
|
+
return false;
|
|
127
|
+
// TODO
|
|
128
|
+
// if (!this.user.permissions)
|
|
129
|
+
// return true;
|
|
130
|
+
// if (!this.user.permissions.canChat)
|
|
131
|
+
// return true;
|
|
132
|
+
// return this.user.permissions?.canChat(this.source);
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
async sendMessage() {
|
|
136
|
+
if (!this.source)
|
|
137
|
+
return;
|
|
138
|
+
let text = (this.newMessage.message || '').trim();
|
|
139
|
+
this.newMessage.message = '';
|
|
140
|
+
if (text === '')
|
|
141
|
+
return;
|
|
142
|
+
let message = {
|
|
143
|
+
user: null,
|
|
144
|
+
sentAt: Date.now(),
|
|
145
|
+
likes: 0,
|
|
146
|
+
url: this.url ?? (typeof window !== 'undefined' ? location.href : undefined),
|
|
147
|
+
message: text
|
|
148
|
+
};
|
|
149
|
+
try {
|
|
150
|
+
const intercept = await this.shouldInterceptMessageSend?.(message, this.source);
|
|
151
|
+
if (!intercept) {
|
|
152
|
+
await this.source.send(message);
|
|
153
|
+
}
|
|
154
|
+
this.chatView.scrollToLatest();
|
|
155
|
+
this.inputElementRef.nativeElement.focus();
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
console.error(`Failed to send message: `, message);
|
|
159
|
+
console.error(e);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaChatComponent, deps: [{ token: i1.ChatBackendBase }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
163
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: BantaChatComponent, selector: "banta-chat", inputs: { shouldInterceptMessageSend: "shouldInterceptMessageSend", url: "url", source: "source", topicID: "topicID", metadata: "metadata", signInLabel: "signInLabel", sendLabel: "sendLabel", permissionDeniedLabel: "permissionDeniedLabel", messageFieldPlaceholder: "messageFieldPlaceholder", emptyLabel: "emptyLabel" }, outputs: { selected: "selected", reported: "reported", upvoted: "upvoted", userSelected: "userSelected", permissionDeniedError: "permissionDeniedError", signInSelected: "signInSelected", received: "received" }, viewQueries: [{ propertyName: "chatView", first: true, predicate: ["chatView"], descendants: true }, { propertyName: "inputElementRef", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<banta-chat-view \r\n #chatView\r\n [source]=\"source\"\r\n [emptyLabel]=\"emptyLabel\"\r\n (upvoted)=\"upvote($event)\"\r\n (reported)=\"report($event)\"\r\n (selected)=\"select($event)\"\r\n (received)=\"onReceived($event)\"\r\n (userSelected)=\"selectUser($event)\"\r\n ></banta-chat-view>\r\n\r\n<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n \r\n <div class=\"entry-container\">\r\n <input\r\n #input\r\n type=\"text\"\r\n name=\"message\" \r\n autocomplete=\"off\"\r\n enterkeyhint=\"send\"\r\n [placeholder]=\"messageFieldPlaceholder\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [(ngModel)]=\"newMessage.message\" />\r\n \r\n <emoji-selector-button\r\n (selected)=\"insertEmoji($event)\"\r\n overlayY=\"bottom\"\r\n overlayX=\"end\"\r\n originY=\"top\"\r\n ></emoji-selector-button>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n\r\n <ng-container *ngIf=\"!user\">\r\n <button type=\"button\" (click)=\"showSignIn()\" mat-raised-button color=\"primary\">{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"user\">\r\n <button *ngIf=\"canChat\" [disabled]=\"!newMessage.message\" mat-raised-button color=\"primary\">{{sendLabel}}</button>\r\n <button *ngIf=\"!canChat\" type=\"button\" (click)=\"sendPermissionError()\" mat-raised-button color=\"primary\">{{permissionDeniedLabel}}</button>\r\n </ng-container>\r\n </div>\r\n</form>", styles: [":host{display:flex;flex-direction:column;border-radius:5px;padding:10px;flex-grow:1;font-size:10pt;min-height:1px}.entry-container{display:flex;flex-direction:row;flex-grow:1;position:relative}.entry-container emoji-selector-button{position:absolute;right:0;top:.15em}.entry-container input{height:2.6em;font-size:12pt;padding-left:1em}.entry-container input:-webkit-autofill,.entry-container input:-webkit-autofill:hover,.entry-container input:-webkit-autofill:focus{outline:1px solid #9da302;-webkit-text-fill-color:#9da302;-webkit-box-shadow:0 0 0px 1000px #211e07 inset;transition:background-color 5000s ease-in-out 0s;caret-color:#9da302}.entry-container emoji-selector-panel{pointer-events:none;opacity:0;position:absolute;bottom:3.5em;right:0}.entry-container emoji-selector-panel.visible{opacity:1;pointer-events:initial}form{display:flex;padding:.5em 0;align-items:center}form textarea{font-size:14pt;background:#000;color:#fff;border:1px solid #333;min-height:6em;width:100%}form input[type=text]{background:#fff;color:#000;border:1px solid #ccc;width:100%;height:3.5em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}:host-context(.mat-dark-theme) form input[type=text]{background:#000;color:#fff;border:1px solid #333}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.EmojiSelectorButtonComponent, selector: "emoji-selector-button", inputs: ["disabled", "overlayX", "overlayY", "originX", "originY"], outputs: ["selected"] }, { kind: "component", type: i6.ChatViewComponent, selector: "banta-chat-view", inputs: ["source", "maxMessages", "emptyLabel"], outputs: ["selected", "userSelected", "reported", "upvoted", "received"] }] }); }
|
|
164
|
+
}
|
|
165
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaChatComponent, decorators: [{
|
|
166
|
+
type: Component,
|
|
167
|
+
args: [{ selector: 'banta-chat', template: "<banta-chat-view \r\n #chatView\r\n [source]=\"source\"\r\n [emptyLabel]=\"emptyLabel\"\r\n (upvoted)=\"upvote($event)\"\r\n (reported)=\"report($event)\"\r\n (selected)=\"select($event)\"\r\n (received)=\"onReceived($event)\"\r\n (userSelected)=\"selectUser($event)\"\r\n ></banta-chat-view>\r\n\r\n<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n \r\n <div class=\"entry-container\">\r\n <input\r\n #input\r\n type=\"text\"\r\n name=\"message\" \r\n autocomplete=\"off\"\r\n enterkeyhint=\"send\"\r\n [placeholder]=\"messageFieldPlaceholder\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [(ngModel)]=\"newMessage.message\" />\r\n \r\n <emoji-selector-button\r\n (selected)=\"insertEmoji($event)\"\r\n overlayY=\"bottom\"\r\n overlayX=\"end\"\r\n originY=\"top\"\r\n ></emoji-selector-button>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n\r\n <ng-container *ngIf=\"!user\">\r\n <button type=\"button\" (click)=\"showSignIn()\" mat-raised-button color=\"primary\">{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"user\">\r\n <button *ngIf=\"canChat\" [disabled]=\"!newMessage.message\" mat-raised-button color=\"primary\">{{sendLabel}}</button>\r\n <button *ngIf=\"!canChat\" type=\"button\" (click)=\"sendPermissionError()\" mat-raised-button color=\"primary\">{{permissionDeniedLabel}}</button>\r\n </ng-container>\r\n </div>\r\n</form>", styles: [":host{display:flex;flex-direction:column;border-radius:5px;padding:10px;flex-grow:1;font-size:10pt;min-height:1px}.entry-container{display:flex;flex-direction:row;flex-grow:1;position:relative}.entry-container emoji-selector-button{position:absolute;right:0;top:.15em}.entry-container input{height:2.6em;font-size:12pt;padding-left:1em}.entry-container input:-webkit-autofill,.entry-container input:-webkit-autofill:hover,.entry-container input:-webkit-autofill:focus{outline:1px solid #9da302;-webkit-text-fill-color:#9da302;-webkit-box-shadow:0 0 0px 1000px #211e07 inset;transition:background-color 5000s ease-in-out 0s;caret-color:#9da302}.entry-container emoji-selector-panel{pointer-events:none;opacity:0;position:absolute;bottom:3.5em;right:0}.entry-container emoji-selector-panel.visible{opacity:1;pointer-events:initial}form{display:flex;padding:.5em 0;align-items:center}form textarea{font-size:14pt;background:#000;color:#fff;border:1px solid #333;min-height:6em;width:100%}form input[type=text]{background:#fff;color:#000;border:1px solid #ccc;width:100%;height:3.5em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}:host-context(.mat-dark-theme) form input[type=text]{background:#000;color:#fff;border:1px solid #333}\n"] }]
|
|
168
|
+
}], ctorParameters: () => [{ type: i1.ChatBackendBase }], propDecorators: { shouldInterceptMessageSend: [{
|
|
169
|
+
type: Input
|
|
170
|
+
}], url: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], source: [{
|
|
173
|
+
type: Input
|
|
174
|
+
}], topicID: [{
|
|
175
|
+
type: Input
|
|
176
|
+
}], metadata: [{
|
|
177
|
+
type: Input
|
|
178
|
+
}], signInLabel: [{
|
|
179
|
+
type: Input
|
|
180
|
+
}], sendLabel: [{
|
|
181
|
+
type: Input
|
|
182
|
+
}], permissionDeniedLabel: [{
|
|
183
|
+
type: Input
|
|
184
|
+
}], messageFieldPlaceholder: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], emptyLabel: [{
|
|
187
|
+
type: Input
|
|
188
|
+
}], selected: [{
|
|
189
|
+
type: Output
|
|
190
|
+
}], reported: [{
|
|
191
|
+
type: Output
|
|
192
|
+
}], upvoted: [{
|
|
193
|
+
type: Output
|
|
194
|
+
}], userSelected: [{
|
|
195
|
+
type: Output
|
|
196
|
+
}], permissionDeniedError: [{
|
|
197
|
+
type: Output
|
|
198
|
+
}], signInSelected: [{
|
|
199
|
+
type: Output
|
|
200
|
+
}], received: [{
|
|
201
|
+
type: Output
|
|
202
|
+
}], chatView: [{
|
|
203
|
+
type: ViewChild,
|
|
204
|
+
args: ['chatView']
|
|
205
|
+
}], inputElementRef: [{
|
|
206
|
+
type: ViewChild,
|
|
207
|
+
args: ['input']
|
|
208
|
+
}] } });
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFudGEtY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jaGF0L2JhbnRhLWNoYXQvYmFudGEtY2hhdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jaGF0L2JhbnRhLWNoYXQvYmFudGEtY2hhdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQU96RDs7R0FFRztBQU1ILE1BQU0sT0FBTyxrQkFBa0I7SUFDM0IsWUFDWSxPQUF5QjtRQUF6QixZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUs3QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuQyxTQUFJLEdBQVUsSUFBSSxDQUFDO1FBK0JYLGNBQVMsR0FBd0IsRUFBRSxDQUFDO1FBK0JuQyxnQkFBVyxHQUFHLFNBQVMsQ0FBQztRQUN4QixjQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ25CLDBCQUFxQixHQUFHLE1BQU0sQ0FBQztRQUMvQiw0QkFBdUIsR0FBRyxNQUFNLENBQUM7UUFDakMsZUFBVSxHQUFHLHNCQUFzQixDQUFDO1FBRXJDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQ3ZDLGVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQ3ZDLGVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBZSxD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QXJCLE1BQU07Z0JBQ08sT0FBTztzQkFBcEIsTUFBTTtnQkFDTyxZQUFZO3NCQUF6QixNQUFNO2dCQUNPLHFCQUFxQjtzQkFBbEMsTUFBTTtnQkFDTyxjQUFjO3NCQUEzQixNQUFNO2dCQUNPLFFBQVE7c0JBQXJCLE1BQU07Z0JBMEJnQixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ0QsZUFBZTtzQkFBbEMsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFVzZXIsIENoYXRNZXNzYWdlLCBOZXdNZXNzYWdlRm9ybSB9IGZyb20gJ0BiYW50YS9jb21tb24nO1xyXG5pbXBvcnQgeyBDaGF0Vmlld0NvbXBvbmVudCB9IGZyb20gJy4uL2NoYXQtdmlldy9jaGF0LXZpZXcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2hhdEJhY2tlbmRCYXNlIH0gZnJvbSBcIi4uLy4uL2NoYXQtYmFja2VuZC1iYXNlXCI7XHJcbmltcG9ydCB7IENoYXRTb3VyY2VCYXNlIH0gZnJvbSBcIi4uLy4uL2NoYXQtc291cmNlLWJhc2VcIjtcclxuXHJcbi8qKlxyXG4gKiBDaGF0IGNvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JhbnRhLWNoYXQnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2JhbnRhLWNoYXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vYmFudGEtY2hhdC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYW50YUNoYXRDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBiYWNrZW5kIDogQ2hhdEJhY2tlbmRCYXNlXHJcbiAgICApIHtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9zb3VyY2UgOiBDaGF0U291cmNlQmFzZTtcclxuICAgIHByaXZhdGUgX3N1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgICB1c2VyIDogVXNlciA9IG51bGw7XHJcblxyXG4gICAgQElucHV0KCkgc2hvdWxkSW50ZXJjZXB0TWVzc2FnZVNlbmQ/OiAobWVzc2FnZTogQ2hhdE1lc3NhZ2UsIHNvdXJjZTogQ2hhdFNvdXJjZUJhc2UpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xyXG4gICAgQElucHV0KCkgdXJsOiBzdHJpbmc7XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3Vicy5hZGQodGhpcy5iYWNrZW5kLnVzZXJDaGFuZ2VkLnN1YnNjcmliZSh1c2VyID0+IHRoaXMudXNlciA9IHVzZXIpKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLl9zdWJzLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBzb3VyY2UoKSA6IENoYXRTb3VyY2VCYXNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBzb3VyY2UodmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9zb3VyY2UgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHRvcGljSUQoKSA6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5pZGVudGlmaWVyO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCB0b3BpY0lEKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTb3VyY2VGcm9tVG9waWNJRCh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFyYml0cmFyeSBtZXRhZGF0YSB0byBzZW5kIHRvIHRoZSBjaGF0IHNlcnZlci4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGNvbnRleHQgYWJvdXQgdGhlIGNsaWVudCB0byB0aGUgc2VydmVyXHJcbiAgICAgKiBmb3IgdGhpbmdzIGxpa2UgdmFsaWRhdGluZyBhdXRob3JpemF0aW9uIGFuZCBvdGhlciB1c2VzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBnZXQgbWV0YWRhdGEoKSB7IHJldHVybiB0aGlzLl9tZXRhZGF0YTsgfVxyXG4gICAgc2V0IG1ldGFkYXRhKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMuX21ldGFkYXRhKSAhPT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMucmVsb2FkU291cmNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3JlbG9hZFNvdXJjZVRpbWVvdXQ7XHJcbiAgICBwcml2YXRlIHJlbG9hZFNvdXJjZSgpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVsb2FkU291cmNlVGltZW91dCk7XHJcbiAgICAgICAgdGhpcy5fcmVsb2FkU291cmNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNvdXJjZUZyb21Ub3BpY0lEKHRoaXMudG9waWNJRCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRTb3VyY2VGcm9tVG9waWNJRCh0b3BpY0lEIDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSAmJiB0aGlzLl9zb3VyY2UuY2xvc2UpXHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5jbG9zZSgpO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fc291cmNlID0gYXdhaXQgdGhpcy5iYWNrZW5kLmdldFNvdXJjZUZvclRvcGljKHRvcGljSUQsIHsgXHJcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgc2lnbkluTGFiZWwgPSAnU2lnbiBJbic7XHJcbiAgICBASW5wdXQoKSBzZW5kTGFiZWwgPSAnU2VuZCc7XHJcbiAgICBASW5wdXQoKSBwZXJtaXNzaW9uRGVuaWVkTGFiZWwgPSAnU2VuZCc7XHJcbiAgICBASW5wdXQoKSBtZXNzYWdlRmllbGRQbGFjZWhvbGRlciA9ICdDaGF0JztcclxuICAgIEBJbnB1dCgpIGVtcHR5TGFiZWwgPSAnQmUgdGhlIGZpcnN0IHRvIGNoYXQnO1xyXG5cclxuICAgIHByaXZhdGUgX3NlbGVjdGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RlZCQgPSB0aGlzLl9zZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIHByaXZhdGUgX3JlcG9ydGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9yZXBvcnRlZCQgPSB0aGlzLl9yZXBvcnRlZC5hc09ic2VydmFibGUoKTtcclxuICAgIHByaXZhdGUgX3Vwdm90ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3Vwdm90ZWQkID0gdGhpcy5fdXB2b3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIHByaXZhdGUgX3VzZXJTZWxlY3RlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfdXNlclNlbGVjdGVkJCA9IHRoaXMuX3VzZXJTZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIHByaXZhdGUgX3Blcm1pc3Npb25EZW5pZWRFcnJvciA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICAgIHByaXZhdGUgX3Blcm1pc3Npb25EZW5pZWRFcnJvciQgPSB0aGlzLl9wZXJtaXNzaW9uRGVuaWVkRXJyb3IuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwcml2YXRlIF9zaWduSW5TZWxlY3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9zaWduSW5TZWxlY3RlZCQgPSB0aGlzLl9zaWduSW5TZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIHByaXZhdGUgX3JlY2VpdmVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9yZWNlaXZlZCQgPSB0aGlzLl9yZWNlaXZlZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBAT3V0cHV0KCkgZ2V0IHNlbGVjdGVkKCkgeyByZXR1cm4gdGhpcy5fc2VsZWN0ZWQkOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IHJlcG9ydGVkKCkgeyByZXR1cm4gdGhpcy5fcmVwb3J0ZWQkOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IHVwdm90ZWQoKSB7IHJldHVybiB0aGlzLl91cHZvdGVkJDsgfVxyXG4gICAgQE91dHB1dCgpIGdldCB1c2VyU2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl91c2VyU2VsZWN0ZWQkOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IHBlcm1pc3Npb25EZW5pZWRFcnJvcigpIHsgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25EZW5pZWRFcnJvciQ7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgc2lnbkluU2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9zaWduSW5TZWxlY3RlZCQ7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgcmVjZWl2ZWQoKSB7IHJldHVybiB0aGlzLl9yZWNlaXZlZCQ7IH1cclxuXHJcbiAgICBvblJlY2VpdmVkKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVjZWl2ZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93RW1vamlQYW5lbCA9IGZhbHNlO1xyXG5cclxuICAgIHNob3dTaWduSW4oKSB7XHJcbiAgICAgICAgdGhpcy5fc2lnbkluU2VsZWN0ZWQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbmRQZXJtaXNzaW9uRXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fcGVybWlzc2lvbkRlbmllZEVycm9yLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5zZXJ0RW1vamkoZW1vamkpIHtcclxuICAgICAgICBsZXQgbWVzc2FnZSA9IHRoaXMubmV3TWVzc2FnZS5tZXNzYWdlIHx8ICcnO1xyXG5cclxuICAgICAgICB0aGlzLm5ld01lc3NhZ2UubWVzc2FnZSA9IG1lc3NhZ2UgKyBlbW9qaTtcclxuICAgIH1cclxuXHJcbiAgICBvbktleURvd24oZXZlbnQgOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgLy8gVE9ET1xyXG4gICAgfVxyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2NoYXRWaWV3JykgY2hhdFZpZXcgOiBDaGF0Vmlld0NvbXBvbmVudDtcclxuICAgIEBWaWV3Q2hpbGQoJ2lucHV0JykgaW5wdXRFbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICAgIGp1bXBUb01lc3NhZ2UobWVzc2FnZSA6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhdFZpZXcpXHJcbiAgICAgICAgICAgIHRoaXMuY2hhdFZpZXcuanVtcFRvKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdChtZXNzYWdlIDogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdFVzZXIobWVzc2FnZSA6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlclNlbGVjdGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVwb3J0KG1lc3NhZ2UgOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXB2b3RlKG1lc3NhZ2UgOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlLmxpa2VNZXNzYWdlKG1lc3NhZ2UuaWQpO1xyXG4gICAgICAgIHRoaXMuX3Vwdm90ZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2FuQ2hhdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlcilcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBUT0RPXHJcbiAgICAgICAgLy8gaWYgKCF0aGlzLnVzZXIucGVybWlzc2lvbnMpXHJcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICAvLyBpZiAoIXRoaXMudXNlci5wZXJtaXNzaW9ucy5jYW5DaGF0KVxyXG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMudXNlci5wZXJtaXNzaW9ucz8uY2FuQ2hhdCh0aGlzLnNvdXJjZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgbmV3TWVzc2FnZSA6IE5ld01lc3NhZ2VGb3JtID0ge307XHJcblxyXG4gICAgYXN5bmMgc2VuZE1lc3NhZ2UoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgdGV4dCA9ICh0aGlzLm5ld01lc3NhZ2UubWVzc2FnZSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgIHRoaXMubmV3TWVzc2FnZS5tZXNzYWdlID0gJyc7XHJcblxyXG4gICAgICAgIGlmICh0ZXh0ID09PSAnJylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgbWVzc2FnZSA6IENoYXRNZXNzYWdlID0ge1xyXG4gICAgICAgICAgICB1c2VyOiBudWxsLFxyXG4gICAgICAgICAgICBzZW50QXQ6IERhdGUubm93KCksXHJcbiAgICAgICAgICAgIGxpa2VzOiAwLFxyXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsID8/ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IGxvY2F0aW9uLmhyZWYgOiB1bmRlZmluZWQpLFxyXG4gICAgICAgICAgICBtZXNzYWdlOiB0ZXh0XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0ID0gYXdhaXQgdGhpcy5zaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZD8uKG1lc3NhZ2UsIHRoaXMuc291cmNlKTtcclxuICAgICAgICAgICAgaWYgKCFpbnRlcmNlcHQpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlLnNlbmQobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2hhdFZpZXcuc2Nyb2xsVG9MYXRlc3QoKTtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHNlbmQgbWVzc2FnZTogYCwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxiYW50YS1jaGF0LXZpZXcgXHJcbiAgICAjY2hhdFZpZXdcclxuICAgIFtzb3VyY2VdPVwic291cmNlXCJcclxuICAgIFtlbXB0eUxhYmVsXT1cImVtcHR5TGFiZWxcIlxyXG4gICAgKHVwdm90ZWQpPVwidXB2b3RlKCRldmVudClcIlxyXG4gICAgKHJlcG9ydGVkKT1cInJlcG9ydCgkZXZlbnQpXCJcclxuICAgIChzZWxlY3RlZCk9XCJzZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAocmVjZWl2ZWQpPVwib25SZWNlaXZlZCgkZXZlbnQpXCJcclxuICAgICh1c2VyU2VsZWN0ZWQpPVwic2VsZWN0VXNlcigkZXZlbnQpXCJcclxuICAgID48L2JhbnRhLWNoYXQtdmlldz5cclxuXHJcbjxmb3JtIGNsYXNzPVwibmV3LW1lc3NhZ2VcIiAoc3VibWl0KT1cInNlbmRNZXNzYWdlKClcIj5cclxuICAgIFxyXG4gICAgPGRpdiBjbGFzcz1cImVudHJ5LWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAjaW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICBuYW1lPVwibWVzc2FnZVwiIFxyXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICBlbnRlcmtleWhpbnQ9XCJzZW5kXCJcclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm1lc3NhZ2VGaWVsZFBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm5ld01lc3NhZ2UubWVzc2FnZVwiIC8+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIDxlbW9qaS1zZWxlY3Rvci1idXR0b25cclxuICAgICAgICAgICAgKHNlbGVjdGVkKT1cImluc2VydEVtb2ppKCRldmVudClcIlxyXG4gICAgICAgICAgICBvdmVybGF5WT1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgIG92ZXJsYXlYPVwiZW5kXCJcclxuICAgICAgICAgICAgb3JpZ2luWT1cInRvcFwiXHJcbiAgICAgICAgICAgID48L2Vtb2ppLXNlbGVjdG9yLWJ1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdXNlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2hvd1NpZ25JbigpXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCI+e3tzaWduSW5MYWJlbH19PC9idXR0b24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZXJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImNhbkNoYXRcIiBbZGlzYWJsZWRdPVwiIW5ld01lc3NhZ2UubWVzc2FnZVwiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiPnt7c2VuZExhYmVsfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFjYW5DaGF0XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZW5kUGVybWlzc2lvbkVycm9yKClcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIj57e3Blcm1pc3Npb25EZW5pZWRMYWJlbH19PC9idXR0b24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9mb3JtPiJdfQ==
|