@banta/sdk 4.6.26 → 4.7.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.
- package/{esm2015/banta-sdk.js → esm2020/banta-sdk.mjs} +0 -0
- package/{esm2015/lib/attachment-scraper.js → esm2020/lib/attachment-scraper.mjs} +0 -0
- package/esm2020/lib/banta/banta.component.mjs +204 -0
- package/esm2020/lib/banta-logo.component.mjs +11 -0
- package/esm2020/lib/banta-sdk.module.mjs +144 -0
- package/esm2020/lib/chat/banta-chat/banta-chat.component.mjs +185 -0
- package/esm2020/lib/chat/chat-message/chat-message.component.mjs +62 -0
- package/esm2020/lib/chat/chat-view/chat-view.component.mjs +170 -0
- package/esm2020/lib/chat/chat.module.mjs +51 -0
- package/{esm2015/lib/chat/index.js → esm2020/lib/chat/index.mjs} +0 -0
- package/esm2020/lib/chat/live-chat-message.component.mjs +80 -0
- package/{esm2015/lib/chat-backend-base.js → esm2020/lib/chat-backend-base.mjs} +0 -0
- package/esm2020/lib/chat-backend.mjs +83 -0
- package/{esm2015/lib/chat-source-base.js → esm2020/lib/chat-source-base.mjs} +0 -0
- package/esm2020/lib/chat-source.mjs +169 -0
- package/esm2020/lib/comments/attachment-button/attachment-button.component.mjs +69 -0
- package/esm2020/lib/comments/attachment-scraper.directive.mjs +107 -0
- package/esm2020/lib/comments/banta-comments/banta-comments.component.mjs +666 -0
- package/esm2020/lib/comments/comment/comment.component.mjs +217 -0
- package/esm2020/lib/comments/comment-field/comment-field.component.mjs +377 -0
- package/esm2020/lib/comments/comment-sort/comment-sort.component.mjs +37 -0
- package/esm2020/lib/comments/comment-view/comment-view.component.mjs +379 -0
- package/esm2020/lib/comments/comments.module.mjs +111 -0
- package/{esm2015/lib/comments/index.js → esm2020/lib/comments/index.mjs} +0 -0
- package/esm2020/lib/comments/live-comment.component.mjs +80 -0
- package/esm2020/lib/comments/reply-send-options.directive.mjs +13 -0
- package/esm2020/lib/common/attachment/attachment.component.mjs +113 -0
- package/esm2020/lib/common/attachments/attachments.component.mjs +72 -0
- package/esm2020/lib/common/common.module.mjs +59 -0
- package/{esm2015/lib/common/index.js → esm2020/lib/common/index.mjs} +0 -0
- package/{esm2015/lib/common/lazy-connection.js → esm2020/lib/common/lazy-connection.mjs} +0 -0
- package/esm2020/lib/common/lightbox/lightbox.component.mjs +31 -0
- package/esm2020/lib/common/markdown-to-html.pipe.mjs +76 -0
- package/esm2020/lib/common/mention-linker.pipe.mjs +35 -0
- package/esm2020/lib/common/timestamp.component.mjs +113 -0
- package/esm2020/lib/common/trust-resource-url.pipe.mjs +22 -0
- package/esm2020/lib/emoji/emoji-selector-button.component.mjs +113 -0
- package/esm2020/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +88 -0
- package/esm2020/lib/emoji/emoji.module.mjs +55 -0
- package/{esm2015/lib/emoji/emojis.js → esm2020/lib/emoji/emojis.mjs} +0 -0
- package/{esm2015/lib/emoji/index.js → esm2020/lib/emoji/index.mjs} +0 -0
- package/esm2020/lib/giphy-attachments.mjs +16 -0
- package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +0 -0
- package/esm2020/lib/live-message.component.mjs +96 -0
- package/{esm2015/lib/message-menu-item.js → esm2020/lib/message-menu-item.mjs} +0 -0
- package/{esm2015/lib/sdk-options.js → esm2020/lib/sdk-options.mjs} +0 -0
- package/esm2020/lib/tweet-attachments.mjs +13 -0
- package/esm2020/lib/url-attachments.mjs +42 -0
- package/esm2020/lib/youtube-attachments.mjs +22 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/{banta-sdk.js → banta-sdk.mjs} +2323 -2008
- package/fesm2015/banta-sdk.mjs.map +1 -0
- package/fesm2020/banta-sdk.mjs +10490 -0
- package/fesm2020/banta-sdk.mjs.map +1 -0
- package/{banta-sdk.d.ts → index.d.ts} +1 -0
- package/lib/banta/banta.component.d.ts +3 -0
- package/lib/banta-logo.component.d.ts +3 -0
- package/lib/banta-sdk.module.d.ts +24 -0
- package/lib/chat/banta-chat/banta-chat.component.d.ts +3 -0
- package/lib/chat/chat-message/chat-message.component.d.ts +3 -0
- package/lib/chat/chat-view/chat-view.component.d.ts +3 -0
- package/lib/chat/chat.module.d.ts +13 -0
- package/lib/chat/live-chat-message.component.d.ts +3 -0
- package/lib/chat-backend.d.ts +3 -0
- package/lib/chat-source.d.ts +3 -3
- package/lib/comments/attachment-button/attachment-button.component.d.ts +3 -0
- package/lib/comments/attachment-scraper.directive.d.ts +3 -0
- package/lib/comments/banta-comments/banta-comments.component.d.ts +3 -0
- package/lib/comments/comment/comment.component.d.ts +3 -0
- package/lib/comments/comment-field/comment-field.component.d.ts +3 -0
- package/lib/comments/comment-sort/comment-sort.component.d.ts +3 -0
- package/lib/comments/comment-view/comment-view.component.d.ts +3 -0
- package/lib/comments/comments.module.d.ts +28 -0
- package/lib/comments/live-comment.component.d.ts +3 -0
- package/lib/comments/reply-send-options.directive.d.ts +3 -0
- package/lib/common/attachment/attachment.component.d.ts +3 -0
- package/lib/common/attachments/attachments.component.d.ts +3 -0
- package/lib/common/common.module.d.ts +15 -0
- package/lib/common/lightbox/lightbox.component.d.ts +3 -0
- package/lib/common/markdown-to-html.pipe.d.ts +3 -0
- package/lib/common/mention-linker.pipe.d.ts +3 -0
- package/lib/common/timestamp.component.d.ts +3 -0
- package/lib/common/trust-resource-url.pipe.d.ts +3 -0
- package/lib/emoji/emoji-selector-button.component.d.ts +3 -0
- package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +3 -0
- package/lib/emoji/emoji.module.d.ts +14 -0
- package/lib/live-message.component.d.ts +3 -0
- package/lib/url-attachments.d.ts +3 -0
- package/package.json +22 -10
- package/banta-sdk.metadata.json +0 -1
- package/bundles/banta-sdk.umd.js +0 -11895
- package/bundles/banta-sdk.umd.js.map +0 -1
- package/bundles/banta-sdk.umd.min.js +0 -2
- package/bundles/banta-sdk.umd.min.js.map +0 -1
- package/esm2015/lib/banta/banta.component.js +0 -201
- package/esm2015/lib/banta-logo.component.js +0 -20
- package/esm2015/lib/banta-sdk.module.js +0 -98
- package/esm2015/lib/chat/banta-chat/banta-chat.component.js +0 -175
- package/esm2015/lib/chat/chat-message/chat-message.component.js +0 -56
- package/esm2015/lib/chat/chat-view/chat-view.component.js +0 -167
- package/esm2015/lib/chat/chat.module.js +0 -32
- package/esm2015/lib/chat/live-chat-message.component.js +0 -71
- package/esm2015/lib/chat-backend.js +0 -92
- package/esm2015/lib/chat-source.js +0 -205
- package/esm2015/lib/comments/attachment-button/attachment-button.component.js +0 -70
- package/esm2015/lib/comments/attachment-scraper.directive.js +0 -109
- package/esm2015/lib/comments/banta-comments/banta-comments.component.js +0 -678
- package/esm2015/lib/comments/comment/comment.component.js +0 -186
- package/esm2015/lib/comments/comment-field/comment-field.component.js +0 -350
- package/esm2015/lib/comments/comment-sort/comment-sort.component.js +0 -34
- package/esm2015/lib/comments/comment-view/comment-view.component.js +0 -364
- package/esm2015/lib/comments/comments.module.js +0 -62
- package/esm2015/lib/comments/live-comment.component.js +0 -71
- package/esm2015/lib/comments/reply-send-options.directive.js +0 -9
- package/esm2015/lib/common/attachment/attachment.component.js +0 -105
- package/esm2015/lib/common/attachments/attachments.component.js +0 -66
- package/esm2015/lib/common/common.module.js +0 -36
- package/esm2015/lib/common/lightbox/lightbox.component.js +0 -30
- package/esm2015/lib/common/markdown-to-html.pipe.js +0 -74
- package/esm2015/lib/common/mention-linker.pipe.js +0 -31
- package/esm2015/lib/common/timestamp.component.js +0 -106
- package/esm2015/lib/common/trust-resource-url.pipe.js +0 -21
- package/esm2015/lib/emoji/emoji-selector-button.component.js +0 -108
- package/esm2015/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.js +0 -86
- package/esm2015/lib/emoji/emoji.module.js +0 -34
- package/esm2015/lib/giphy-attachments.js +0 -20
- package/esm2015/lib/live-message.component.js +0 -74
- package/esm2015/lib/tweet-attachments.js +0 -16
- package/esm2015/lib/url-attachments.js +0 -46
- package/esm2015/lib/youtube-attachments.js +0 -25
- package/fesm2015/banta-sdk.js.map +0 -1
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import { __awaiter, __decorate, __metadata } from "tslib";
|
|
2
|
-
import { Subject, Subscription } from "rxjs";
|
|
3
|
-
import { RpcEvent, SocketRPC } from "@banta/common";
|
|
4
|
-
export class ChatSource extends SocketRPC {
|
|
5
|
-
constructor(backend, identifier, parentIdentifier, sortOrder) {
|
|
6
|
-
super();
|
|
7
|
-
this.backend = backend;
|
|
8
|
-
this.identifier = identifier;
|
|
9
|
-
this.parentIdentifier = parentIdentifier;
|
|
10
|
-
this.sortOrder = sortOrder;
|
|
11
|
-
this.subscription = new Subscription();
|
|
12
|
-
this._state = 'connecting';
|
|
13
|
-
this._connectionStateChanged = new Subject();
|
|
14
|
-
this.messageMap = new Map();
|
|
15
|
-
this._messageReceived = new Subject();
|
|
16
|
-
this._messageUpdated = new Subject();
|
|
17
|
-
this._messageSent = new Subject();
|
|
18
|
-
this._messageObserved = new Subject();
|
|
19
|
-
this.messages = [];
|
|
20
|
-
this.ready = new Promise(resolve => this.markReady = resolve);
|
|
21
|
-
}
|
|
22
|
-
get state() {
|
|
23
|
-
return this._state;
|
|
24
|
-
}
|
|
25
|
-
set state(value) {
|
|
26
|
-
this._state = value;
|
|
27
|
-
setTimeout(() => this._connectionStateChanged.next(this._state));
|
|
28
|
-
}
|
|
29
|
-
get connectionStateChanged() {
|
|
30
|
-
return this._connectionStateChanged.asObservable();
|
|
31
|
-
}
|
|
32
|
-
bind(socket) {
|
|
33
|
-
const _super = Object.create(null, {
|
|
34
|
-
bind: { get: () => super.bind }
|
|
35
|
-
});
|
|
36
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
-
_super.bind.call(this, socket);
|
|
38
|
-
this.state = 'connected';
|
|
39
|
-
this.markReady();
|
|
40
|
-
yield this.subscribeToTopic();
|
|
41
|
-
this.subscription.add(this.backend.userChanged.subscribe(() => this.authenticate()));
|
|
42
|
-
socket.addEventListener('open', () => __awaiter(this, void 0, void 0, function* () {
|
|
43
|
-
this.state = 'connected';
|
|
44
|
-
}));
|
|
45
|
-
socket.addEventListener('lost', () => __awaiter(this, void 0, void 0, function* () {
|
|
46
|
-
this.state = 'lost';
|
|
47
|
-
}));
|
|
48
|
-
socket.addEventListener('restore', () => __awaiter(this, void 0, void 0, function* () {
|
|
49
|
-
this.state = 'restored';
|
|
50
|
-
yield this.authenticate();
|
|
51
|
-
yield this.subscribeToTopic();
|
|
52
|
-
}));
|
|
53
|
-
return this;
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
mapOrUpdateMessages(messages) {
|
|
57
|
-
return messages.map(message => this.mapOrUpdateMessage(message));
|
|
58
|
-
}
|
|
59
|
-
mapOrUpdateMessage(message) {
|
|
60
|
-
let existingMessage = this.messageMap.get(message.id);
|
|
61
|
-
if (existingMessage) {
|
|
62
|
-
message = Object.assign(existingMessage, message);
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
this.messageMap.set(message.id, message);
|
|
66
|
-
this._messageObserved.next(message);
|
|
67
|
-
}
|
|
68
|
-
return message;
|
|
69
|
-
}
|
|
70
|
-
getExistingMessages() {
|
|
71
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
-
let messages = yield this.peer.getExistingMessages();
|
|
73
|
-
messages = this.mapOrUpdateMessages(messages);
|
|
74
|
-
return messages;
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
ensureConnection(errorMessage) {
|
|
78
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
-
let reason = `Connection to chat services is not currently available.`;
|
|
80
|
-
if (this.state !== 'connected' && this.state !== 'restored') {
|
|
81
|
-
if (errorMessage)
|
|
82
|
-
throw new Error(`${errorMessage}: ${reason}`);
|
|
83
|
-
else
|
|
84
|
-
throw new Error(`${reason}`);
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
editMessage(messageId, text) {
|
|
89
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
-
yield this.ensureConnection();
|
|
91
|
-
yield this.peer.editMessage(messageId, text);
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
subscribeToTopic() {
|
|
95
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
96
|
-
yield this.peer.subscribe(this.identifier, this.parentIdentifier, this.sortOrder);
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
authenticate() {
|
|
100
|
-
var _a;
|
|
101
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
102
|
-
if (this.backend.user) {
|
|
103
|
-
try {
|
|
104
|
-
yield this.peer.authenticate((_a = this.backend.user) === null || _a === void 0 ? void 0 : _a.token);
|
|
105
|
-
}
|
|
106
|
-
catch (e) {
|
|
107
|
-
console.error(`Could not authenticate with Banta server:`);
|
|
108
|
-
console.error(e);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
close() {
|
|
114
|
-
super.close();
|
|
115
|
-
this.subscription.unsubscribe();
|
|
116
|
-
}
|
|
117
|
-
onPermissions(permissions) {
|
|
118
|
-
window.bantaPermissionsDebug = permissions;
|
|
119
|
-
this.permissions = permissions;
|
|
120
|
-
}
|
|
121
|
-
onChatMessage(message) {
|
|
122
|
-
if (this.messageMap.has(message.id)) {
|
|
123
|
-
return this.mapOrUpdateMessage(message);
|
|
124
|
-
}
|
|
125
|
-
else if (!message.hidden) {
|
|
126
|
-
// Only process non-hidden messages through here.
|
|
127
|
-
// Hidden messages may be sent to us when they become hidden (ie moderation is occurring).
|
|
128
|
-
// But if we never had the message to begin with, we should discard it.
|
|
129
|
-
this.messageMap.set(message.id, message);
|
|
130
|
-
this._messageReceived.next(message);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
get messageReceived() { return this._messageReceived.asObservable(); }
|
|
134
|
-
get messageUpdated() { return this._messageUpdated.asObservable(); }
|
|
135
|
-
get messageSent() { return this._messageSent.asObservable(); }
|
|
136
|
-
get messageObserved() { return this._messageObserved.asObservable(); }
|
|
137
|
-
send(message) {
|
|
138
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
139
|
-
yield this.ensureConnection();
|
|
140
|
-
return yield this.peer.sendMessage(message);
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
loadAfter(message, count) {
|
|
144
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
145
|
-
if (!message)
|
|
146
|
-
return;
|
|
147
|
-
if (!message.pagingCursor)
|
|
148
|
-
return [];
|
|
149
|
-
return this.mapOrUpdateMessages(yield this.peer.loadAfter(Number(message.pagingCursor), count));
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
get(id) {
|
|
153
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
154
|
-
if (this.messageMap.has(id))
|
|
155
|
-
return this.messageMap.get(id);
|
|
156
|
-
yield this.ensureConnection(`Could not get message`);
|
|
157
|
-
let message = yield this.peer.getMessage(id);
|
|
158
|
-
if (this.messageMap.has(id)) {
|
|
159
|
-
let existingMessage = this.messageMap.get(id);
|
|
160
|
-
Object.assign(existingMessage, message);
|
|
161
|
-
message = existingMessage;
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
this.messageMap.set(id, message);
|
|
165
|
-
}
|
|
166
|
-
return message;
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
getCount() {
|
|
170
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
171
|
-
return yield this.peer.getCount();
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
likeMessage(messageId) {
|
|
175
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
176
|
-
yield this.ensureConnection();
|
|
177
|
-
return yield this.peer.likeMessage(messageId);
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
unlikeMessage(messageId) {
|
|
181
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
182
|
-
yield this.ensureConnection();
|
|
183
|
-
return yield this.peer.unlikeMessage(messageId);
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
deleteMessage(messageId) {
|
|
187
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
188
|
-
yield this.ensureConnection();
|
|
189
|
-
return yield this.peer.deleteMessage(messageId);
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
__decorate([
|
|
194
|
-
RpcEvent(),
|
|
195
|
-
__metadata("design:type", Function),
|
|
196
|
-
__metadata("design:paramtypes", [Object]),
|
|
197
|
-
__metadata("design:returntype", void 0)
|
|
198
|
-
], ChatSource.prototype, "onPermissions", null);
|
|
199
|
-
__decorate([
|
|
200
|
-
RpcEvent(),
|
|
201
|
-
__metadata("design:type", Function),
|
|
202
|
-
__metadata("design:paramtypes", [Object]),
|
|
203
|
-
__metadata("design:returntype", void 0)
|
|
204
|
-
], ChatSource.prototype, "onChatMessage", null);
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jaGF0LXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJcEQsTUFBTSxPQUFPLFVBQVcsU0FBUSxTQUFTO0lBQ3JDLFlBQ2EsT0FBb0IsRUFDcEIsVUFBa0IsRUFDbEIsZ0JBQXdCLEVBQ3hCLFNBQXdCO1FBRWpDLEtBQUssRUFBRSxDQUFDO1FBTEMsWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBUTtRQUN4QixjQUFTLEdBQVQsU0FBUyxDQUFlO1FBTTdCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQU1sQyxXQUFNLEdBQXFELFlBQVksQ0FBQztRQVd4RSw0QkFBdUIsR0FBRyxJQUFJLE9BQU8sRUFBb0QsQ0FBQztRQTBHMUYsZUFBVSxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBQzVDLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFDOUMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQzdDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUMxQyxxQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBT3RELGFBQVEsR0FBa0IsRUFBRSxDQUFDO1FBekl6QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksT0FBTyxDQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBVUQsSUFBSSxLQUFLO1FBQ0ws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QUNsRCxDQUFDO0tBQUE7SUFFSyxhQUFhLENBQUMsU0FBaUI7O1lBQ2pDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDOUIsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7S0FBQTtJQUVLLGFBQWEsQ0FBQyxTQUFpQjs7WUFDakMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM5QixPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEQsQ0FBQztLQUFBO0NBRUo7QUFyRkc7SUFEQyxRQUFRLEVBQUU7Ozs7K0NBSVY7QUFHRDtJQURDLFFBQVEsRUFBRTs7OzsrQ0FXViIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYXRNZXNzYWdlLCBDaGF0UGVybWlzc2lvbnMsIENvbW1lbnRzT3JkZXIsIER1cmFibGVTb2NrZXQsIFVzZXIgfSBmcm9tIFwiQGJhbnRhL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBScGNFdmVudCwgU29ja2V0UlBDIH0gZnJvbSBcIkBiYW50YS9jb21tb25cIjtcclxuaW1wb3J0IHsgQ2hhdFNvdXJjZUJhc2UgfSBmcm9tIFwiLi9jaGF0LXNvdXJjZS1iYXNlXCI7XHJcbmltcG9ydCB7IENoYXRCYWNrZW5kIH0gZnJvbSBcIi4vY2hhdC1iYWNrZW5kXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2hhdFNvdXJjZSBleHRlbmRzIFNvY2tldFJQQyBpbXBsZW1lbnRzIENoYXRTb3VyY2VCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHJlYWRvbmx5IGJhY2tlbmQ6IENoYXRCYWNrZW5kLFxyXG4gICAgICAgIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZyxcclxuICAgICAgICByZWFkb25seSBwYXJlbnRJZGVudGlmaWVyOiBzdHJpbmcsXHJcbiAgICAgICAgcmVhZG9ubHkgc29ydE9yZGVyOiBDb21tZW50c09yZGVyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucmVhZHkgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHRoaXMubWFya1JlYWR5ID0gcmVzb2x2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgICBwcml2YXRlIG1hcmtSZWFkeTogKCkgPT4gdm9pZDtcclxuXHJcbiAgICByZWFkeTogUHJvbWlzZTx2b2lkPjtcclxuXHJcbiAgICBwZXJtaXNzaW9uczogQ2hhdFBlcm1pc3Npb25zO1xyXG4gICAgcHJpdmF0ZSBfc3RhdGU6ICdjb25uZWN0ZWQnIHwgJ2Nvbm5lY3RpbmcnIHwgJ2xvc3QnIHwgJ3Jlc3RvcmVkJyA9ICdjb25uZWN0aW5nJztcclxuXHJcbiAgICBnZXQgc3RhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBzdGF0ZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3N0YXRlID0gdmFsdWU7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9jb25uZWN0aW9uU3RhdGVDaGFuZ2VkLm5leHQodGhpcy5fc3RhdGUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jb25uZWN0aW9uU3RhdGVDaGFuZ2VkID0gbmV3IFN1YmplY3Q8J2Nvbm5lY3RlZCcgfCAnY29ubmVjdGluZycgfCAnbG9zdCcgfCAncmVzdG9yZWQnPigpO1xyXG4gICAgZ2V0IGNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25TdGF0ZUNoYW5nZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYmluZChzb2NrZXQ6IER1cmFibGVTb2NrZXQpOiBQcm9taXNlPHRoaXM+IHtcclxuICAgICAgICBzdXBlci5iaW5kKHNvY2tldCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdjb25uZWN0ZWQnO1xyXG4gICAgICAgIHRoaXMubWFya1JlYWR5KCk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuc3Vic2NyaWJlVG9Ub3BpYygpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmJhY2tlbmQudXNlckNoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMuYXV0aGVudGljYXRlKCkpKTtcclxuXHJcbiAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnY29ubmVjdGVkJztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2xvc3QnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnbG9zdCc7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdyZXN0b3JlJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gJ3Jlc3RvcmVkJztcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hdXRoZW50aWNhdGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb1RvcGljKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWFwT3JVcGRhdGVNZXNzYWdlcyhtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSk6IENoYXRNZXNzYWdlW10ge1xyXG4gICAgICAgIHJldHVybiBtZXNzYWdlcy5tYXAobWVzc2FnZSA9PiB0aGlzLm1hcE9yVXBkYXRlTWVzc2FnZShtZXNzYWdlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtYXBPclVwZGF0ZU1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpOiBDaGF0TWVzc2FnZSB7XHJcbiAgICAgICAgbGV0IGV4aXN0aW5nTWVzc2FnZSA9IHRoaXMubWVzc2FnZU1hcC5nZXQobWVzc2FnZS5pZCk7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nTWVzc2FnZSkge1xyXG4gICAgICAgICAgICBtZXNzYWdlID0gT2JqZWN0LmFzc2lnbihleGlzdGluZ01lc3NhZ2UsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZU1hcC5zZXQobWVzc2FnZS5pZCwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VPYnNlcnZlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0RXhpc3RpbmdNZXNzYWdlcygpOiBQcm9taXNlPENoYXRNZXNzYWdlW10+IHtcclxuICAgICAgICBsZXQgbWVzc2FnZXMgPSBhd2FpdCB0aGlzLnBlZXIuZ2V0RXhpc3RpbmdNZXNzYWdlcygpO1xyXG4gICAgICAgIG1lc3NhZ2VzID0gdGhpcy5tYXBPclVwZGF0ZU1lc3NhZ2VzKG1lc3NhZ2VzKTtcclxuICAgICAgICByZXR1cm4gbWVzc2FnZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKGVycm9yTWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZWFzb24gPSBgQ29ubmVjdGlvbiB0byBjaGF0IHNlcnZpY2VzIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLmA7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09ICdjb25uZWN0ZWQnICYmIHRoaXMuc3RhdGUgIT09ICdyZXN0b3JlZCcpIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJvck1lc3NhZ2V9OiAke3JlYXNvbn1gKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlYXNvbn1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZWRpdE1lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcsIHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGlvbigpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucGVlci5lZGl0TWVzc2FnZShtZXNzYWdlSWQsIHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHN1YnNjcmliZVRvVG9waWMoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wZWVyLnN1YnNjcmliZSh0aGlzLmlkZW50aWZpZXIsIHRoaXMucGFyZW50SWRlbnRpZmllciwgdGhpcy5zb3J0T3JkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGF1dGhlbnRpY2F0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5iYWNrZW5kLnVzZXIpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGVlci5hdXRoZW50aWNhdGUodGhpcy5iYWNrZW5kLnVzZXI/LnRva2VuKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IGF1dGhlbnRpY2F0ZSB3aXRoIEJhbnRhIHNlcnZlcjpgKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuY2xvc2UoKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIEBScGNFdmVudCgpXHJcbiAgICBvblBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBDaGF0UGVybWlzc2lvbnMpIHtcclxuICAgICAgICAod2luZG93IGFzIGFueSkuYmFudGFQZXJtaXNzaW9uc0RlYnVnID0gcGVybWlzc2lvbnM7XHJcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xyXG4gICAgfVxyXG5cclxuICAgIEBScGNFdmVudCgpXHJcbiAgICBvbkNoYXRNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZU1hcC5oYXMobWVzc2FnZS5pZCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwT3JVcGRhdGVNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIW1lc3NhZ2UuaGlkZGVuKSB7XHJcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBub24taGlkZGVuIG1lc3NhZ2VzIHRocm91Z2ggaGVyZS4gXHJcbiAgICAgICAgICAgIC8vIEhpZGRlbiBtZXNzYWdlcyBtYXkgYmUgc2VudCB0byB1cyB3aGVuIHRoZXkgYmVjb21lIGhpZGRlbiAoaWUgbW9kZXJhdGlvbiBpcyBvY2N1cnJpbmcpLlxyXG4gICAgICAgICAgICAvLyBCdXQgaWYgd2UgbmV2ZXIgaGFkIHRoZSBtZXNzYWdlIHRvIGJlZ2luIHdpdGgsIHdlIHNob3VsZCBkaXNjYXJkIGl0LlxyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VNYXAuc2V0KG1lc3NhZ2UuaWQsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlUmVjZWl2ZWQubmV4dChtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZVJlY2VpdmVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9tZXNzYWdlVXBkYXRlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZVNlbnQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX21lc3NhZ2VPYnNlcnZlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG5cclxuICAgIGdldCBtZXNzYWdlUmVjZWl2ZWQoKSB7IHJldHVybiB0aGlzLl9tZXNzYWdlUmVjZWl2ZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuICAgIGdldCBtZXNzYWdlVXBkYXRlZCgpIHsgcmV0dXJuIHRoaXMuX21lc3NhZ2VVcGRhdGVkLmFzT2JzZXJ2YWJsZSgpOyB9XHJcbiAgICBnZXQgbWVzc2FnZVNlbnQoKSB7IHJldHVybiB0aGlzLl9tZXNzYWdlU2VudC5hc09ic2VydmFibGUoKTsgfVxyXG4gICAgZ2V0IG1lc3NhZ2VPYnNlcnZlZCgpIHsgcmV0dXJuIHRoaXMuX21lc3NhZ2VPYnNlcnZlZC5hc09ic2VydmFibGUoKTsgfVxyXG5cclxuICAgIG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XHJcblxyXG4gICAgYXN5bmMgc2VuZChtZXNzYWdlOiBDaGF0TWVzc2FnZSk6IFByb21pc2U8Q2hhdE1lc3NhZ2U+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24oKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wZWVyLnNlbmRNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRBZnRlcihtZXNzYWdlOiBDaGF0TWVzc2FnZSwgY291bnQ6IG51bWJlcik6IFByb21pc2U8Q2hhdE1lc3NhZ2VbXT4ge1xyXG4gICAgICAgIGlmICghbWVzc2FnZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAoIW1lc3NhZ2UucGFnaW5nQ3Vyc29yKVxyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwT3JVcGRhdGVNZXNzYWdlcyhcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wZWVyLmxvYWRBZnRlcihOdW1iZXIobWVzc2FnZS5wYWdpbmdDdXJzb3IpLCBjb3VudClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldChpZDogc3RyaW5nKTogUHJvbWlzZTxDaGF0TWVzc2FnZT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VNYXAuaGFzKGlkKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZU1hcC5nZXQoaWQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGlvbihgQ291bGQgbm90IGdldCBtZXNzYWdlYCk7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnBlZXIuZ2V0TWVzc2FnZShpZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VNYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICBsZXQgZXhpc3RpbmdNZXNzYWdlID0gdGhpcy5tZXNzYWdlTWFwLmdldChpZCk7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXhpc3RpbmdNZXNzYWdlLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgbWVzc2FnZSA9IGV4aXN0aW5nTWVzc2FnZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VNYXAuc2V0KGlkLCBtZXNzYWdlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENvdW50KCk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGVlci5nZXRDb3VudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxpa2VNZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGVlci5saWtlTWVzc2FnZShtZXNzYWdlSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGlrZU1lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24oKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wZWVyLnVubGlrZU1lc3NhZ2UobWVzc2FnZUlkKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGVNZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGVlci5kZWxldGVNZXNzYWdlKG1lc3NhZ2VJZCk7XHJcbiAgICB9XHJcblxyXG59Il19
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Component, ElementRef, Output, ViewChild } from '@angular/core';
|
|
3
|
-
import { CDNProvider } from '@banta/common';
|
|
4
|
-
import { Subject } from 'rxjs';
|
|
5
|
-
export class AttachmentButtonComponent {
|
|
6
|
-
constructor(cdnProvider) {
|
|
7
|
-
this.cdnProvider = cdnProvider;
|
|
8
|
-
this._addedAttachment = new Subject();
|
|
9
|
-
this._attachmentError = new Subject();
|
|
10
|
-
}
|
|
11
|
-
get addedAttachment() { return this._addedAttachment.asObservable(); }
|
|
12
|
-
get attachmentError() { return this._attachmentError.asObservable(); }
|
|
13
|
-
show() {
|
|
14
|
-
this.fileInput.nativeElement.click();
|
|
15
|
-
}
|
|
16
|
-
fileChange(event) {
|
|
17
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
18
|
-
const element = event.currentTarget;
|
|
19
|
-
if (element.files.length) {
|
|
20
|
-
console.log('[Banta] File Added to comment');
|
|
21
|
-
const file = element.files[0];
|
|
22
|
-
let publicURL;
|
|
23
|
-
let attachment = {
|
|
24
|
-
type: file.type,
|
|
25
|
-
url: undefined,
|
|
26
|
-
transientState: {
|
|
27
|
-
uploading: true,
|
|
28
|
-
error: false,
|
|
29
|
-
errorMessage: undefined
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
this._addedAttachment.next(attachment);
|
|
33
|
-
try {
|
|
34
|
-
publicURL = yield this.cdnProvider.uploadImage(file);
|
|
35
|
-
}
|
|
36
|
-
catch (e) {
|
|
37
|
-
attachment.transientState.error = true;
|
|
38
|
-
attachment.transientState.errorMessage = "Failed to upload";
|
|
39
|
-
console.error(`[Banta] Caught an error while uploading image to CDN:`);
|
|
40
|
-
console.error(e);
|
|
41
|
-
alert(`Failed to upload image. Please try again later.`);
|
|
42
|
-
this._attachmentError.next(attachment);
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
// If no URL was returned, then an error must have occurred. Presumably the CDN
|
|
46
|
-
// provider has conveyed an error to the user.
|
|
47
|
-
if (!publicURL)
|
|
48
|
-
return;
|
|
49
|
-
attachment.url = publicURL;
|
|
50
|
-
attachment.transientState = undefined;
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
AttachmentButtonComponent.decorators = [
|
|
56
|
-
{ type: Component, args: [{
|
|
57
|
-
selector: 'banta-attachment-button',
|
|
58
|
-
template: "<button matTooltip=\"Add an image or gif\" #button type=\"button\" mat-icon-button (click)=\"show()\">\r\n\t<mat-icon>image</mat-icon>\r\n</button>\r\n<input style=\"display: none;\" #fileUpload [multiple]=\"false\" (change)=\"fileChange($event)\" type=\"file\" >",
|
|
59
|
-
styles: ["button{color:#666}"]
|
|
60
|
-
},] }
|
|
61
|
-
];
|
|
62
|
-
AttachmentButtonComponent.ctorParameters = () => [
|
|
63
|
-
{ type: CDNProvider }
|
|
64
|
-
];
|
|
65
|
-
AttachmentButtonComponent.propDecorators = {
|
|
66
|
-
fileInput: [{ type: ViewChild, args: ['fileUpload', { static: false },] }],
|
|
67
|
-
addedAttachment: [{ type: Output }],
|
|
68
|
-
attachmentError: [{ type: Output }]
|
|
69
|
-
};
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvYXR0YWNobWVudC1idXR0b24vYXR0YWNobWVudC1idXR0b24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxXQUFXLEVBQXlCLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFPL0IsTUFBTSxPQUFPLHlCQUF5QjtJQUVwQyxZQUNVLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBSTFCLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUF5QixDQUFDO1FBQ3hELHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUF5QixDQUFDO0lBSGhFLENBQUM7SUFPRCxJQUFjLGVBQWUsS0FBSyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEYsSUFBYyxlQUFlLEtBQUssT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWhGLElBQUk7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWtDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQUVLLFVBQVUsQ0FBQyxLQUFZOztZQUMzQixNQUFNLE9BQU8sR0FBSSxLQUFLLENBQUMsYUFBa0MsQ0FBQztZQUMxRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLENBQUM7Z0JBQzdDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLElBQUksU0FBaUIsQ0FBQztnQkFFdEIsSUFBSSxVQUFVLEdBQTBCO29CQUN0QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsR0FBRyxFQUFFLFNBQVM7b0JBQ2QsY0FBYyxFQUFFO3dCQUNkLFNBQVMsRUFBRSxJQUFJO3dCQUNmLEtBQUssRUFBRSxLQUFLO3dCQUNaLFlBQVksRUFBRSxTQUFTO3FCQUN4QjtpQkFDRixDQUFBO2dCQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRXZDLElBQUk7b0JBQ0YsU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3REO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNWLFVBQVUsQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztvQkFDdkMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUM7b0JBRTVELE9BQU8sQ0FBQyxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztvQkFDdkUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakIsS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7b0JBRXpELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3ZDLE9BQU87aUJBQ1I7Z0JBRUQsK0VBQStFO2dCQUMvRSw4Q0FBOEM7Z0JBQzlDLElBQUksQ0FBQyxTQUFTO29CQUNaLE9BQU87Z0JBRVQsVUFBVSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7Z0JBQzNCLFVBQVUsQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO2FBQ3ZDO1FBRUgsQ0FBQztLQUFBOzs7WUFsRUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx5QkFBeUI7Z0JBQ25DLG9SQUFpRDs7YUFFbEQ7OztZQVBRLFdBQVc7Ozt3QkFrQmpCLFNBQVMsU0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzhCQUV6QyxNQUFNOzhCQUNOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENETlByb3ZpZGVyLCBDaGF0TWVzc2FnZUF0dGFjaG1lbnQgfSBmcm9tICdAYmFudGEvY29tbW9uJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdiYW50YS1hdHRhY2htZW50LWJ1dHRvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2F0dGFjaG1lbnQtYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hdHRhY2htZW50LWJ1dHRvbi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50QnV0dG9uQ29tcG9uZW50IHtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNkblByb3ZpZGVyOiBDRE5Qcm92aWRlcixcclxuICApIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FkZGVkQXR0YWNobWVudCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlQXR0YWNobWVudD4oKTtcclxuICBwcml2YXRlIF9hdHRhY2htZW50RXJyb3IgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZUF0dGFjaG1lbnQ+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVVcGxvYWQnLCB7IHN0YXRpYzogZmFsc2UgfSkgZmlsZUlucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuICBAT3V0cHV0KCkgZ2V0IGFkZGVkQXR0YWNobWVudCgpIHsgcmV0dXJuIHRoaXMuX2FkZGVkQXR0YWNobWVudC5hc09ic2VydmFibGUoKTsgfVxyXG4gIEBPdXRwdXQoKSBnZXQgYXR0YWNobWVudEVycm9yKCkgeyByZXR1cm4gdGhpcy5fYXR0YWNobWVudEVycm9yLmFzT2JzZXJ2YWJsZSgpOyB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICAodGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmlsZUNoYW5nZShldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KTtcclxuICAgIGlmIChlbGVtZW50LmZpbGVzLmxlbmd0aCkge1xyXG4gICAgICBjb25zb2xlLmxvZygnW0JhbnRhXSBGaWxlIEFkZGVkIHRvIGNvbW1lbnQnKTtcclxuICAgICAgY29uc3QgZmlsZSA9IGVsZW1lbnQuZmlsZXNbMF07XHJcbiAgICAgIGxldCBwdWJsaWNVUkw6IHN0cmluZztcclxuICAgICAgXHJcbiAgICAgIGxldCBhdHRhY2htZW50OiBDaGF0TWVzc2FnZUF0dGFjaG1lbnQgPSB7XHJcbiAgICAgICAgdHlwZTogZmlsZS50eXBlLFxyXG4gICAgICAgIHVybDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHRyYW5zaWVudFN0YXRlOiB7XHJcbiAgICAgICAgICB1cGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICBlcnJvcjogZmFsc2UsXHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fYWRkZWRBdHRhY2htZW50Lm5leHQoYXR0YWNobWVudCk7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHB1YmxpY1VSTCA9IGF3YWl0IHRoaXMuY2RuUHJvdmlkZXIudXBsb2FkSW1hZ2UoZmlsZSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBhdHRhY2htZW50LnRyYW5zaWVudFN0YXRlLmVycm9yID0gdHJ1ZTtcclxuICAgICAgICBhdHRhY2htZW50LnRyYW5zaWVudFN0YXRlLmVycm9yTWVzc2FnZSA9IFwiRmFpbGVkIHRvIHVwbG9hZFwiO1xyXG5cclxuICAgICAgICBjb25zb2xlLmVycm9yKGBbQmFudGFdIENhdWdodCBhbiBlcnJvciB3aGlsZSB1cGxvYWRpbmcgaW1hZ2UgdG8gQ0ROOmApO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgYWxlcnQoYEZhaWxlZCB0byB1cGxvYWQgaW1hZ2UuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuYCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2F0dGFjaG1lbnRFcnJvci5uZXh0KGF0dGFjaG1lbnQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSWYgbm8gVVJMIHdhcyByZXR1cm5lZCwgdGhlbiBhbiBlcnJvciBtdXN0IGhhdmUgb2NjdXJyZWQuIFByZXN1bWFibHkgdGhlIENETlxyXG4gICAgICAvLyBwcm92aWRlciBoYXMgY29udmV5ZWQgYW4gZXJyb3IgdG8gdGhlIHVzZXIuXHJcbiAgICAgIGlmICghcHVibGljVVJMKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgXHJcbiAgICAgIGF0dGFjaG1lbnQudXJsID0gcHVibGljVVJMO1xyXG4gICAgICBhdHRhY2htZW50LnRyYW5zaWVudFN0YXRlID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG59XHJcbiJdfQ==
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Directive, ElementRef, Input, Output } from "@angular/core";
|
|
3
|
-
import { Subject } from "rxjs";
|
|
4
|
-
import { ChatBackendBase } from "../chat-backend-base";
|
|
5
|
-
export class AttachmentScraperDirective {
|
|
6
|
-
constructor(elementRef, chatBackend) {
|
|
7
|
-
this.elementRef = elementRef;
|
|
8
|
-
this.chatBackend = chatBackend;
|
|
9
|
-
this.attachments = [];
|
|
10
|
-
this.attachmentsChange = new Subject();
|
|
11
|
-
this.scrapeDebounce = 1500;
|
|
12
|
-
this.fragments = new Map();
|
|
13
|
-
}
|
|
14
|
-
ngOnInit() {
|
|
15
|
-
if (typeof window === 'undefined')
|
|
16
|
-
return;
|
|
17
|
-
this.element.addEventListener('keydown', () => {
|
|
18
|
-
clearTimeout(this.scrapeTimeout);
|
|
19
|
-
this.scrapeTimeout = setTimeout(() => this.scrape(), this.scrapeDebounce);
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
get element() {
|
|
23
|
-
var _a;
|
|
24
|
-
return (_a = this.elementRef) === null || _a === void 0 ? void 0 : _a.nativeElement;
|
|
25
|
-
}
|
|
26
|
-
get text() {
|
|
27
|
-
return this.element.value;
|
|
28
|
-
}
|
|
29
|
-
scrape() {
|
|
30
|
-
let message = {
|
|
31
|
-
likes: 0,
|
|
32
|
-
message: this.text,
|
|
33
|
-
sentAt: undefined,
|
|
34
|
-
user: null,
|
|
35
|
-
attachments: this.attachments
|
|
36
|
-
};
|
|
37
|
-
let foundFragments = [];
|
|
38
|
-
for (let scraper of this.chatBackend.attachmentScrapers) {
|
|
39
|
-
let fragments = scraper.findFragments(message);
|
|
40
|
-
if (!fragments) {
|
|
41
|
-
console.error(`Attachment fragment scraper ${scraper.constructor.name} is implemented incorrectly: Returned null instead of array`);
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
for (let fragment of fragments) {
|
|
45
|
-
foundFragments.push(fragment.text);
|
|
46
|
-
if (!this.fragments.has(fragment.text)) {
|
|
47
|
-
console.log(`Scraped new fragment:`);
|
|
48
|
-
console.dir(fragment);
|
|
49
|
-
this.fragments.set(fragment.text, {
|
|
50
|
-
fragment,
|
|
51
|
-
resolution: undefined
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// Remove fragments that are no longer in the message.
|
|
57
|
-
let removedFragments = [];
|
|
58
|
-
for (let [key] of this.fragments) {
|
|
59
|
-
if (!foundFragments.includes(key))
|
|
60
|
-
removedFragments.push(key);
|
|
61
|
-
}
|
|
62
|
-
for (let removedFragment of removedFragments) {
|
|
63
|
-
console.log(`Removed fragment: ${removedFragment}`);
|
|
64
|
-
this.fragments.delete(removedFragment);
|
|
65
|
-
}
|
|
66
|
-
// Process any fragments that are not yet resolved (or being
|
|
67
|
-
// resolved)
|
|
68
|
-
for (let [key, state] of this.fragments) {
|
|
69
|
-
if (state.resolution)
|
|
70
|
-
continue;
|
|
71
|
-
state.resolution = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
72
|
-
console.log(`Resolving fragment ${key}`);
|
|
73
|
-
for (let resolver of this.chatBackend.attachmentResolvers) {
|
|
74
|
-
console.log(`- Trying resolver ${resolver.constructor.name}...`);
|
|
75
|
-
try {
|
|
76
|
-
let attachment = yield resolver.resolveFragment(message, state.fragment);
|
|
77
|
-
if (attachment) {
|
|
78
|
-
console.log(`Resolved fragment ${key} into attachment:`);
|
|
79
|
-
console.dir(attachment);
|
|
80
|
-
this.attachments.push(attachment);
|
|
81
|
-
this.attachmentsChange.next(this.attachments.slice());
|
|
82
|
-
resolve(attachment);
|
|
83
|
-
break;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
catch (e) {
|
|
87
|
-
console.error(`Caught error during attachment resolver ${resolver.constructor.name}:`);
|
|
88
|
-
console.error(e);
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}));
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
AttachmentScraperDirective.decorators = [
|
|
97
|
-
{ type: Directive, args: [{
|
|
98
|
-
selector: '[attachmentScraper]'
|
|
99
|
-
},] }
|
|
100
|
-
];
|
|
101
|
-
AttachmentScraperDirective.ctorParameters = () => [
|
|
102
|
-
{ type: ElementRef },
|
|
103
|
-
{ type: ChatBackendBase }
|
|
104
|
-
];
|
|
105
|
-
AttachmentScraperDirective.propDecorators = {
|
|
106
|
-
attachments: [{ type: Input }],
|
|
107
|
-
attachmentsChange: [{ type: Output }]
|
|
108
|
-
};
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1zY3JhcGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1lbnRzL2F0dGFjaG1lbnQtc2NyYXBlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVdkQsTUFBTSxPQUFPLDBCQUEwQjtJQUNuQyxZQUNZLFVBQTJDLEVBQzNDLFdBQTRCO1FBRDVCLGVBQVUsR0FBVixVQUFVLENBQWlDO1FBQzNDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUkvQixnQkFBVyxHQUE0QixFQUFFLENBQUM7UUFDekMsc0JBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQTJCLENBQUM7UUFxQjdELG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLGNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBbUMsQ0FBQztJQXpCL0QsQ0FBQztJQUlELFFBQVE7UUFDSixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7WUFDN0IsT0FBTztRQUVYLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUMxQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSSxPQUFPOztRQUNQLGFBQU8sSUFB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Q3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQzs0QkFDdEQsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUNwQixNQUFNO3lCQUNUO3FCQUNKO29CQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzt3QkFDdkYsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDakIsU0FBUztxQkFDWjtpQkFDSjtZQUNMLENBQUMsQ0FBQSxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7OztZQXhHSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLHFCQUFxQjthQUNsQzs7O1lBYm1CLFVBQVU7WUFJckIsZUFBZTs7OzBCQWlCbkIsS0FBSztnQ0FDTCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRNZXNzYWdlQXR0YWNobWVudCB9IGZyb20gXCJAYmFudGEvY29tbW9uXCI7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50RnJhZ21lbnQgfSBmcm9tIFwiLi4vYXR0YWNobWVudC1zY3JhcGVyXCI7XHJcbmltcG9ydCB7IENoYXRCYWNrZW5kQmFzZSB9IGZyb20gXCIuLi9jaGF0LWJhY2tlbmQtYmFzZVwiO1xyXG5cclxuaW50ZXJmYWNlIEF0dGFjaG1lbnRGcmFnbWVudFN0YXRlIHtcclxuICAgIGZyYWdtZW50OiBBdHRhY2htZW50RnJhZ21lbnQ7XHJcbiAgICByZXNvbHV0aW9uOiBQcm9taXNlPENoYXRNZXNzYWdlQXR0YWNobWVudD47XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbYXR0YWNobWVudFNjcmFwZXJdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXR0YWNobWVudFNjcmFwZXJEaXJlY3RpdmUge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+LFxyXG4gICAgICAgIHByaXZhdGUgY2hhdEJhY2tlbmQ6IENoYXRCYWNrZW5kQmFzZVxyXG4gICAgKSB7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgYXR0YWNobWVudHM6IENoYXRNZXNzYWdlQXR0YWNobWVudFtdID0gW107XHJcbiAgICBAT3V0cHV0KCkgYXR0YWNobWVudHNDaGFuZ2UgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZUF0dGFjaG1lbnRbXT4oKTtcclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JhcGVUaW1lb3V0KTtcclxuICAgICAgICAgICAgdGhpcy5zY3JhcGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcmFwZSgpLCB0aGlzLnNjcmFwZURlYm91bmNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZWxlbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0ZXh0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQudmFsdWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgc2NyYXBlVGltZW91dDtcclxuICAgIHByaXZhdGUgc2NyYXBlRGVib3VuY2UgPSAxNTAwO1xyXG4gICAgcHJpdmF0ZSBmcmFnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgQXR0YWNobWVudEZyYWdtZW50U3RhdGU+KCk7XHJcbiAgICBwcml2YXRlIHNjcmFwZSgpIHtcclxuICAgICAgICBsZXQgbWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICAgIGxpa2VzOiAwLFxyXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnRleHQsXHJcbiAgICAgICAgICAgIHNlbnRBdDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1c2VyOiBudWxsLFxyXG4gICAgICAgICAgICBhdHRhY2htZW50czogdGhpcy5hdHRhY2htZW50c1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBmb3VuZEZyYWdtZW50czogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgc2NyYXBlciBvZiB0aGlzLmNoYXRCYWNrZW5kLmF0dGFjaG1lbnRTY3JhcGVycykge1xyXG4gICAgICAgICAgICBsZXQgZnJhZ21lbnRzID0gc2NyYXBlci5maW5kRnJhZ21lbnRzKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBpZiAoIWZyYWdtZW50cykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQXR0YWNobWVudCBmcmFnbWVudCBzY3JhcGVyICR7c2NyYXBlci5jb25zdHJ1Y3Rvci5uYW1lfSBpcyBpbXBsZW1lbnRlZCBpbmNvcnJlY3RseTogUmV0dXJuZWQgbnVsbCBpbnN0ZWFkIG9mIGFycmF5YCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGxldCBmcmFnbWVudCBvZiBmcmFnbWVudHMpIHtcclxuICAgICAgICAgICAgICAgIGZvdW5kRnJhZ21lbnRzLnB1c2goZnJhZ21lbnQudGV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZnJhZ21lbnRzLmhhcyhmcmFnbWVudC50ZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTY3JhcGVkIG5ldyBmcmFnbWVudDpgKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihmcmFnbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFnbWVudHMuc2V0KGZyYWdtZW50LnRleHQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb246IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZW1vdmUgZnJhZ21lbnRzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgbWVzc2FnZS5cclxuICAgICAgICBsZXQgcmVtb3ZlZEZyYWdtZW50czogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBba2V5XSBvZiB0aGlzLmZyYWdtZW50cykge1xyXG4gICAgICAgICAgICBpZiAoIWZvdW5kRnJhZ21lbnRzLmluY2x1ZGVzKGtleSkpXHJcbiAgICAgICAgICAgICAgICByZW1vdmVkRnJhZ21lbnRzLnB1c2goa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgcmVtb3ZlZEZyYWdtZW50IG9mIHJlbW92ZWRGcmFnbWVudHMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFJlbW92ZWQgZnJhZ21lbnQ6ICR7cmVtb3ZlZEZyYWdtZW50fWApO1xyXG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50cy5kZWxldGUocmVtb3ZlZEZyYWdtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFByb2Nlc3MgYW55IGZyYWdtZW50cyB0aGF0IGFyZSBub3QgeWV0IHJlc29sdmVkIChvciBiZWluZyBcclxuICAgICAgICAvLyByZXNvbHZlZClcclxuXHJcbiAgICAgICAgZm9yIChsZXQgW2tleSwgc3RhdGVdIG9mIHRoaXMuZnJhZ21lbnRzKSB7XHJcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZXNvbHV0aW9uKVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBzdGF0ZS5yZXNvbHV0aW9uID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlc29sdmluZyBmcmFnbWVudCAke2tleX1gKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHJlc29sdmVyIG9mIHRoaXMuY2hhdEJhY2tlbmQuYXR0YWNobWVudFJlc29sdmVycykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAtIFRyeWluZyByZXNvbHZlciAke3Jlc29sdmVyLmNvbnN0cnVjdG9yLm5hbWV9Li4uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF0dGFjaG1lbnQgPSBhd2FpdCByZXNvbHZlci5yZXNvbHZlRnJhZ21lbnQobWVzc2FnZSwgc3RhdGUuZnJhZ21lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlc29sdmVkIGZyYWdtZW50ICR7a2V5fSBpbnRvIGF0dGFjaG1lbnQ6YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudHMucHVzaChhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudHNDaGFuZ2UubmV4dCh0aGlzLmF0dGFjaG1lbnRzLnNsaWNlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDYXVnaHQgZXJyb3IgZHVyaW5nIGF0dGFjaG1lbnQgcmVzb2x2ZXIgJHtyZXNvbHZlci5jb25zdHJ1Y3Rvci5uYW1lfTpgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59Il19
|