@banta/sdk 4.0.1 → 4.0.4

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.
@@ -7863,8 +7863,8 @@
7863
7863
  BantaChatComponent.prototype.showSignIn = function () {
7864
7864
  this._signInSelected.next();
7865
7865
  };
7866
- BantaChatComponent.prototype.sendPermissionError = function () {
7867
- this._permissionDeniedError.next();
7866
+ BantaChatComponent.prototype.sendPermissionError = function (message) {
7867
+ this._permissionDeniedError.next(message);
7868
7868
  };
7869
7869
  BantaChatComponent.prototype.insertEmoji = function (emoji) {
7870
7870
  var message = this.newMessage.message || '';
@@ -8684,9 +8684,8 @@
8684
8684
  return [2 /*return*/, true];
8685
8685
  case 4:
8686
8686
  e_1 = _d.sent();
8687
- console.error("Failed to send message: ", message);
8688
- console.error(e_1);
8689
- throw new Error("Could not send: " + e_1.message);
8687
+ this.handleBackendException(e_1, 'Could not send: ');
8688
+ return [3 /*break*/, 5];
8690
8689
  case 5: return [2 /*return*/];
8691
8690
  }
8692
8691
  });
@@ -8708,20 +8707,41 @@
8708
8707
  case 3: return [2 /*return*/, true];
8709
8708
  case 4:
8710
8709
  e_2 = _d.sent();
8711
- console.error("Failed to send message: ", message);
8712
- console.error(e_2);
8713
- throw new Error("Could not send reply: " + e_2.message);
8710
+ this.handleBackendException(e_2, 'Could not send reply: ');
8711
+ return [3 /*break*/, 5];
8714
8712
  case 5: return [2 /*return*/];
8715
8713
  }
8716
8714
  });
8717
8715
  }); };
8718
8716
  }
8717
+ BantaCommentsComponent.prototype.handleBackendExceptionAsAlert = function (e, prefix) {
8718
+ if (prefix === void 0) { prefix = ''; }
8719
+ try {
8720
+ this.handleBackendException(e, prefix);
8721
+ }
8722
+ catch (e) {
8723
+ alert(e.message);
8724
+ }
8725
+ };
8726
+ BantaCommentsComponent.prototype.handleBackendException = function (e, prefix) {
8727
+ if (prefix === void 0) { prefix = ''; }
8728
+ var errorMessage = e.message;
8729
+ if (errorMessage.startsWith('permission-denied|')) {
8730
+ errorMessage = errorMessage.replace(/^permission-denied\|/, '');
8731
+ if (errorMessage.startsWith("app-handle|")) {
8732
+ // If this is an error during authorizeAction on the backend, pass control to the user-provided
8733
+ // permission-denied handler.
8734
+ this.sendPermissionDenied(errorMessage.replace(/^app-handle\|/, ''));
8735
+ return;
8736
+ }
8737
+ }
8738
+ throw new Error("" + prefix + errorMessage);
8739
+ };
8719
8740
  // Lifecycle Events / Initialization
8720
8741
  BantaCommentsComponent.prototype.ngOnInit = function () {
8721
8742
  var _this = this;
8722
8743
  this._subs.add(this.backend.userChanged.subscribe(function (user) { return _this.user = user; }));
8723
8744
  this.startLoading();
8724
- console.log("Checking...");
8725
8745
  if (typeof window !== 'undefined') {
8726
8746
  var queryString = window.location.search.substring(1);
8727
8747
  var query = queryString.split('&')
@@ -8730,8 +8750,6 @@
8730
8750
  var _e = __read(_d, 2), k = _e[0], v = _e[1];
8731
8751
  return (o[k] = v, o);
8732
8752
  }, {});
8733
- console.log('here:');
8734
- console.dir(query);
8735
8753
  var commentID = query['comment'];
8736
8754
  if (commentID) {
8737
8755
  this.sharedCommentID = commentID;
@@ -8828,7 +8846,7 @@
8828
8846
  };
8829
8847
  BantaCommentsComponent.prototype.updateLoading = function () {
8830
8848
  var _this = this;
8831
- var _a, _b, _c;
8849
+ var _a, _b;
8832
8850
  if (((_a = this.source) === null || _a === void 0 ? void 0 : _a.state) && ((_b = this.source) === null || _b === void 0 ? void 0 : _b.state) !== 'connecting') {
8833
8851
  clearInterval(this._loadingTimer);
8834
8852
  this.loadingMessage = "Here we go!";
@@ -8837,7 +8855,6 @@
8837
8855
  }, 750);
8838
8856
  return true;
8839
8857
  }
8840
- console.log("[Banta] Status check: " + (((_c = this.source) === null || _c === void 0 ? void 0 : _c.state) || 'connecting'));
8841
8858
  var messageSwitchTime = 5 * 1000;
8842
8859
  if (this.messageChangedAt + messageSwitchTime < Date.now()) {
8843
8860
  if (this.loadingMessages[this._loadingMessageIndex]) {
@@ -8940,7 +8957,6 @@
8940
8957
  BantaCommentsComponent.prototype.scrollToComment = function (commentId) {
8941
8958
  setTimeout(function () {
8942
8959
  var comment = document.querySelectorAll("[data-comment-id=\"" + commentId + "\"]");
8943
- console.dir(comment);
8944
8960
  if (comment.length > 0) {
8945
8961
  // comment.item(0).scroll({behavior: 'smooth'});
8946
8962
  comment.item(0).scrollIntoView();
@@ -9007,8 +9023,18 @@
9007
9023
  });
9008
9024
  });
9009
9025
  };
9010
- BantaCommentsComponent.prototype.showPermissionDenied = function () {
9011
- this._permissionDeniedError.next();
9026
+ BantaCommentsComponent.prototype.handlePermissionDenied = function (errorMessage) {
9027
+ // This is what other components call when handling permission errors
9028
+ if (errorMessage.startsWith("app-handle|")) {
9029
+ // If this is an error during authorizeAction on the backend, pass control to the user-provided
9030
+ // permission-denied handler.
9031
+ this.sendPermissionDenied(errorMessage.replace(/^app-handle\|/, ''));
9032
+ return;
9033
+ }
9034
+ alert(errorMessage);
9035
+ };
9036
+ BantaCommentsComponent.prototype.sendPermissionDenied = function (message) {
9037
+ this._permissionDeniedError.next(message);
9012
9038
  };
9013
9039
  BantaCommentsComponent.prototype.scrollToMessage = function (message) {
9014
9040
  var el = this.elementRef.nativeElement.querySelector("[data-comment-id=\"" + message.id + "\"]");
@@ -9045,8 +9071,8 @@
9045
9071
  return [3 /*break*/, 4];
9046
9072
  case 3:
9047
9073
  e_4 = _d.sent();
9048
- alert("Could not like this message: " + e_4.message);
9049
- return [2 /*return*/];
9074
+ this.handleBackendExceptionAsAlert(e_4, 'Could not like this message: ');
9075
+ return [3 /*break*/, 4];
9050
9076
  case 4: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(function () { return resolve(); }, 250); })];
9051
9077
  case 5:
9052
9078
  _d.sent();
@@ -9076,7 +9102,7 @@
9076
9102
  return [3 /*break*/, 4];
9077
9103
  case 3:
9078
9104
  e_5 = _d.sent();
9079
- alert("Failed to unlike message: " + e_5.message);
9105
+ this.handleBackendExceptionAsAlert(e_5, 'Failed to unlike this message: ');
9080
9106
  return [3 /*break*/, 4];
9081
9107
  case 4: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(function () { return resolve(); }, 250); })];
9082
9108
  case 5:
@@ -9188,17 +9214,31 @@
9188
9214
  };
9189
9215
  BantaCommentsComponent.prototype.deleteMessage = function (message) {
9190
9216
  return __awaiter(this, void 0, void 0, function () {
9217
+ var e_6;
9191
9218
  return __generator(this, function (_d) {
9192
- if (!confirm("Are you sure you want to delete this comment? You cannot undo this action."))
9193
- return [2 /*return*/];
9194
- this.source.deleteMessage(message.id);
9195
- return [2 /*return*/];
9219
+ switch (_d.label) {
9220
+ case 0:
9221
+ if (!confirm("Are you sure you want to delete this comment? You cannot undo this action."))
9222
+ return [2 /*return*/];
9223
+ _d.label = 1;
9224
+ case 1:
9225
+ _d.trys.push([1, 3, , 4]);
9226
+ return [4 /*yield*/, this.source.deleteMessage(message.id)];
9227
+ case 2:
9228
+ _d.sent();
9229
+ return [3 /*break*/, 4];
9230
+ case 3:
9231
+ e_6 = _d.sent();
9232
+ this.handleBackendExceptionAsAlert(e_6, "Could not delete message: ");
9233
+ return [3 /*break*/, 4];
9234
+ case 4: return [2 /*return*/];
9235
+ }
9196
9236
  });
9197
9237
  });
9198
9238
  };
9199
9239
  BantaCommentsComponent.prototype.editMessage = function (source, message, newText) {
9200
9240
  return __awaiter(this, void 0, void 0, function () {
9201
- var e_6;
9241
+ var e_7;
9202
9242
  return __generator(this, function (_d) {
9203
9243
  switch (_d.label) {
9204
9244
  case 0:
@@ -9208,8 +9248,8 @@
9208
9248
  _d.sent();
9209
9249
  return [3 /*break*/, 3];
9210
9250
  case 2:
9211
- e_6 = _d.sent();
9212
- alert(e_6.message);
9251
+ e_7 = _d.sent();
9252
+ this.handleBackendExceptionAsAlert(e_7, 'Could not edit this message: ');
9213
9253
  return [2 /*return*/];
9214
9254
  case 3:
9215
9255
  message.message = newText;
@@ -9230,7 +9270,7 @@
9230
9270
  };
9231
9271
  BantaCommentsComponent.prototype.saveEdit = function (message, text) {
9232
9272
  return __awaiter(this, void 0, void 0, function () {
9233
- var e_7;
9273
+ var e_8;
9234
9274
  return __generator(this, function (_d) {
9235
9275
  switch (_d.label) {
9236
9276
  case 0:
@@ -9241,8 +9281,8 @@
9241
9281
  message.transientState.editing = false;
9242
9282
  return [3 /*break*/, 3];
9243
9283
  case 2:
9244
- e_7 = _d.sent();
9245
- alert("Could not edit message: " + e_7.message);
9284
+ e_8 = _d.sent();
9285
+ this.handleBackendExceptionAsAlert(e_8, "Could not edit message: ");
9246
9286
  return [3 /*break*/, 3];
9247
9287
  case 3: return [2 /*return*/];
9248
9288
  }
@@ -9254,7 +9294,7 @@
9254
9294
  BantaCommentsComponent.decorators = [
9255
9295
  { type: core.Component, args: [{
9256
9296
  selector: 'banta-comments',
9257
- template: "<ng-container *ngIf=\"loading\">\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>Loading Comments</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage\">\r\n\r\n <div>\r\n <a mat-button href=\"javascript:;\" (click)=\"unselectMessage()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [liking]=\"selectedMessage.transientState.liking\"\r\n [mine]=\"user?.id === selectedMessage.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"false\"\r\n [editing]=\"selectedMessage.transientState.editing\"\r\n (editStarted)=\"startEditing(selectedMessage)\"\r\n (editEnded)=\"selectedMessage.transientState.editing = false\"\r\n (edited)=\"saveEdit(selectedMessage, $event)\"\r\n (userSelected)=\"selectMessageUser(selectedMessage)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(source, selectedMessage)\"\r\n (unliked)=\"unlikeMessage(source, selectedMessage)\"\r\n (reported)=\"reportMessage(selectedMessage)\"\r\n (selected)=\"selectMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"false\"\r\n [newestLast]=\"true\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n ></banta-comment-view>\r\n\r\n <banta-comment-field\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"permissionDeniedLabel\"\r\n (permissionDeniedError)=\"showPermissionDenied()\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n >\r\n <ng-content select=\".reply-send-options\"></ng-content>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"main\" [class.hidden]=\"selectedMessage\">\r\n <banta-comment-field\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n [permissionDeniedLabel]=\"permissionDeniedLabel\"\r\n (permissionDeniedError)=\"showPermissionDenied()\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n >\r\n \r\n </banta-comment-field>\r\n\r\n <banta-comment-sort\r\n [(sort)]=\"sortOrder\"></banta-comment-sort>\r\n\r\n <banta-comment-view\r\n [class.faded]=\"selectedMessage\"\r\n [source]=\"source\"\r\n [fixedHeight]=\"fixedHeight\"\r\n [maxMessages]=\"maxMessages\"\r\n [maxVisibleMessages]=\"maxVisibleMessages\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (selected)=\"selectMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(source, $event)\"\r\n (messageEdited)=\"editMessage(source, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n ></banta-comment-view>\r\n </div>\r\n</ng-container>",
9297
+ template: "<ng-container *ngIf=\"loading\">\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>Loading Comments</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage\">\r\n\r\n <div>\r\n <a mat-button href=\"javascript:;\" (click)=\"unselectMessage()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [liking]=\"selectedMessage.transientState.liking\"\r\n [mine]=\"user?.id === selectedMessage.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"false\"\r\n [editing]=\"selectedMessage.transientState.editing\"\r\n (editStarted)=\"startEditing(selectedMessage)\"\r\n (editEnded)=\"selectedMessage.transientState.editing = false\"\r\n (edited)=\"saveEdit(selectedMessage, $event)\"\r\n (userSelected)=\"selectMessageUser(selectedMessage)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(source, selectedMessage)\"\r\n (unliked)=\"unlikeMessage(source, selectedMessage)\"\r\n (reported)=\"reportMessage(selectedMessage)\"\r\n (selected)=\"selectMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"false\"\r\n [newestLast]=\"true\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n ></banta-comment-view>\r\n\r\n <banta-comment-field\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n >\r\n <ng-content select=\".reply-send-options\"></ng-content>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"main\" [class.hidden]=\"selectedMessage\">\r\n <banta-comment-field\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n >\r\n \r\n </banta-comment-field>\r\n\r\n <banta-comment-sort\r\n [(sort)]=\"sortOrder\"></banta-comment-sort>\r\n\r\n <banta-comment-view\r\n [class.faded]=\"selectedMessage\"\r\n [source]=\"source\"\r\n [fixedHeight]=\"fixedHeight\"\r\n [maxMessages]=\"maxMessages\"\r\n [maxVisibleMessages]=\"maxVisibleMessages\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (selected)=\"selectMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(source, $event)\"\r\n (messageEdited)=\"editMessage(source, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n ></banta-comment-view>\r\n </div>\r\n</ng-container>",
9258
9298
  styles: [":host{display:flex;flex-direction:column}@-webkit-keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}@keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}.focused{-webkit-animation-name:select-comment;animation-name:select-comment;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.focused .replies{margin-top:1em;margin-left:4em}banta-comment-view{opacity:1;transition:opacity .4s ease-in-out}banta-comment-view.faded{opacity:.25}.loading{display:block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin:0 auto;min-height:16em}.main.hidden{display:none}@media (max-width:500px){.focused .replies{margin-left:0}}.loading-screen{text-align:center;opacity:0;transition:opacity .25s ease-in-out}.loading-screen.visible{opacity:1}.loading-screen h1{font-weight:100}.loading-screen mat-spinner{margin:5em auto}.loading-screen .loading-message{opacity:0;transition:opacity .25s ease-in-out;width:500px;max-width:100%;margin:0 auto}.loading-screen .loading-message.visible{opacity:1}"]
9259
9299
  },] }
9260
9300
  ];
@@ -9403,8 +9443,8 @@
9403
9443
  var root = document.body.querySelector('[ng-version]') || document.body;
9404
9444
  root.appendChild(this.autocompleteEl.nativeElement);
9405
9445
  };
9406
- CommentFieldComponent.prototype.showPermissionDenied = function () {
9407
- this._permissionDeniedError.next();
9446
+ CommentFieldComponent.prototype.sendPermissionDenied = function (message) {
9447
+ this._permissionDeniedError.next(message);
9408
9448
  };
9409
9449
  CommentFieldComponent.prototype.showAutoComplete = function (options) {
9410
9450
  this.autoCompleteSelected = 0;
@@ -9630,7 +9670,7 @@
9630
9670
  CommentFieldComponent.decorators = [
9631
9671
  { type: core.Component, args: [{
9632
9672
  selector: 'banta-comment-field',
9633
- template: "<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n <div class=\"avatar-container\">\r\n <a href=\"javascript:;\"\r\n class=\"avatar\"\r\n (click)=\"showEditAvatar()\"\r\n [style.background-image]=\"'url(' + user?.avatarUrl + ')'\"\r\n ></a>\r\n </div>\r\n <div class=\"text-container\">\r\n <div class=\"field-container\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{label}}</mat-label>\r\n <textarea\r\n #textarea\r\n name=\"message\"\r\n [placeholder]=\"placeholder\"\r\n matInput\r\n cdkTextareaAutosize\r\n (keydown)=\"onKeyDown($event)\"\r\n (blur)=\"onBlur()\"\r\n [disabled]=\"sending\"\r\n [(ngModel)]=\"text\"></textarea>\r\n </mat-form-field>\r\n <ng-content></ng-content>\r\n <div #autocompleteContainer class=\"autocomplete-container\">\r\n <div #autocomplete class=\"autocomplete\" [class.visible]=\"autocompleteVisible\">\r\n\r\n <div>\r\n <strong>{{completionPrefix}}</strong>...\r\n </div>\r\n\r\n <a\r\n mat-button\r\n *ngFor=\"let option of autocompleteOptions; index as index\"\r\n (click)=\"activateAutoComplete(option)\"\r\n [class.active]=\"autoCompleteSelected === index\"\r\n >\r\n {{option.label}}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <mat-spinner *ngIf=\"sending\" class=\"icon loading\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <div *ngIf=\"sendError\" class=\"error-message\" [class.expanded]=\"expandError\">\r\n <mat-icon *ngIf=\"sendError\">error</mat-icon>\r\n {{sendError.message}}\r\n </div>\r\n <emoji-selector-button\r\n class=\"top-right\"\r\n (selected)=\"insertEmoji($event)\"\r\n ></emoji-selector-button>\r\n </div>\r\n <div class=\"actions\">\r\n <ng-container *ngIf=\"!user\">\r\n <button\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"showSignIn()\"\r\n >{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"user\">\r\n <button\r\n *ngIf=\"canComment\"\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"!text || sending\"\r\n >\r\n <mat-icon *ngIf=\"!sending\">chevron_right</mat-icon>\r\n <mat-spinner *ngIf=\"sending\" class=\"icon\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <span class=\"label\">\r\n <ng-container *ngIf=\"!sending\">\r\n {{sendLabel}}\r\n </ng-container>\r\n <ng-container *ngIf=\"sending\">\r\n {{sendingLabel}}\r\n </ng-container>\r\n </span>\r\n\r\n </button>\r\n <button\r\n *ngIf=\"!canComment\"\r\n type=\"button\"\r\n (click)=\"showPermissionDenied()\"\r\n mat-raised-button\r\n color=\"primary\"\r\n >{{permissionDeniedLabel}}</button>\r\n </ng-container>\r\n </div>\r\n</form>\r\n",
9673
+ template: "<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n <div class=\"avatar-container\">\r\n <a href=\"javascript:;\"\r\n class=\"avatar\"\r\n (click)=\"showEditAvatar()\"\r\n [style.background-image]=\"'url(' + user?.avatarUrl + ')'\"\r\n ></a>\r\n </div>\r\n <div class=\"text-container\">\r\n <div class=\"field-container\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{label}}</mat-label>\r\n <textarea\r\n #textarea\r\n name=\"message\"\r\n [placeholder]=\"placeholder\"\r\n matInput\r\n cdkTextareaAutosize\r\n (keydown)=\"onKeyDown($event)\"\r\n (blur)=\"onBlur()\"\r\n [disabled]=\"sending\"\r\n [(ngModel)]=\"text\"></textarea>\r\n </mat-form-field>\r\n <ng-content></ng-content>\r\n <div #autocompleteContainer class=\"autocomplete-container\">\r\n <div #autocomplete class=\"autocomplete\" [class.visible]=\"autocompleteVisible\">\r\n\r\n <div>\r\n <strong>{{completionPrefix}}</strong>...\r\n </div>\r\n\r\n <a\r\n mat-button\r\n *ngFor=\"let option of autocompleteOptions; index as index\"\r\n (click)=\"activateAutoComplete(option)\"\r\n [class.active]=\"autoCompleteSelected === index\"\r\n >\r\n {{option.label}}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <mat-spinner *ngIf=\"sending\" class=\"icon loading\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <div *ngIf=\"sendError\" class=\"error-message\" [class.expanded]=\"expandError\">\r\n <mat-icon *ngIf=\"sendError\">error</mat-icon>\r\n {{sendError.message}}\r\n </div>\r\n <emoji-selector-button\r\n class=\"top-right\"\r\n (selected)=\"insertEmoji($event)\"\r\n ></emoji-selector-button>\r\n </div>\r\n <div class=\"actions\">\r\n <ng-container *ngIf=\"!user\">\r\n <button\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"showSignIn()\"\r\n >{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"user\">\r\n <button\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"canComment && (!text || sending)\"\r\n >\r\n <ng-container *ngIf=\"canComment\">\r\n <mat-icon *ngIf=\"!sending\">chevron_right</mat-icon>\r\n <mat-spinner *ngIf=\"sending\" class=\"icon\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n </ng-container>\r\n\r\n <span class=\"label\">\r\n <ng-container *ngIf=\"!canComment\">\r\n {{permissionDeniedLabel}}\r\n </ng-container>\r\n <ng-container *ngIf=\"canComment\">\r\n <ng-container *ngIf=\"!sending\">\r\n {{sendLabel}}\r\n </ng-container>\r\n <ng-container *ngIf=\"sending\">\r\n {{sendingLabel}}\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n</form>\r\n",
9634
9674
  styles: ["@-webkit-keyframes comment-field-appear{0%{transform:translateY(128px);opacity:0}to{transform:translate(0);opacity:1}}@keyframes comment-field-appear{0%{transform:translateY(128px);opacity:0}to{transform:translate(0);opacity:1}}:host{margin:0 2em 0 0;display:block;-webkit-animation-name:comment-field-appear;animation-name:comment-field-appear;-webkit-animation-duration:.8s;animation-duration:.8s;-webkit-animation-delay:.4s;animation-delay:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.avatar-container{width:calc(48px + 1.75em);display:flex;justify-content:flex-end}.avatar-container .avatar{width:48px;height:48px;background:pink;border-radius:100%;background-size:cover;background-repeat:no-repeat;background-position:50%;margin-top:.75em;margin-right:.75em}form{display:flex;padding:.5em;align-items:center}form .text-container{position:relative;display:flex;flex-grow:1}form .text-container textarea{font-size:14pt;width:100%}form .text-container textarea[disabled]{opacity:.5}form .text-container mat-form-field{margin-bottom:1em}form .text-container emoji-selector-button{bottom:0;right:0;position:absolute}form .text-container .error-message,form .text-container mat-spinner.loading{position:absolute;left:.5em;bottom:.5em}form .text-container .error-message{color:#683333;overflow-x:hidden;max-width:1.5em;white-space:nowrap;transition:max-width 2s ease-in-out}form .text-container .error-message.expanded,form .text-container .error-message:hover{max-width:100%}form .text-container .error-message mat-icon{vertical-align:middle}form input[type=text]{background:#000;color:#fff;border:1px solid #333;width:100%;height:1em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}form.new-message{display:flex;align-items:flex-start}form.new-message .field-container{flex-grow:1;display:flex;flex-direction:column}form.new-message mat-form-field{width:100%}form.new-message button{margin:1.25em 0 0}button.send{min-width:9em}textarea{max-height:7em}.autocomplete-container{width:calc(100% - 2em);position:relative;pointer-events:none;top:-2em}.autocomplete{visibility:hidden;pointer-events:none;position:absolute;background:#333;padding:.5em;display:flex;flex-direction:column;z-index:100}.autocomplete.visible{visibility:visible;pointer-events:auto}.autocomplete a{width:100%;text-align:left}.autocomplete a.active{background:#555}@media (max-width:500px){:host{margin:0}.avatar-container{width:auto}.avatar-container .avatar{width:32px;height:32px;margin-top:1.5em}button.send{min-width:auto;margin-top:1.5em}button.send .label{display:none}}"]
9635
9675
  },] }
9636
9676
  ];
@@ -9847,10 +9887,13 @@
9847
9887
  return __awaiter(this, void 0, void 0, function () {
9848
9888
  return __generator(this, function (_b) {
9849
9889
  switch (_b.label) {
9850
- case 0: return [4 /*yield*/, this.peer.authenticate((_a = this.backend.user) === null || _a === void 0 ? void 0 : _a.token)];
9890
+ case 0:
9891
+ if (!this.backend.user) return [3 /*break*/, 2];
9892
+ return [4 /*yield*/, this.peer.authenticate((_a = this.backend.user) === null || _a === void 0 ? void 0 : _a.token)];
9851
9893
  case 1:
9852
9894
  _b.sent();
9853
- return [2 /*return*/];
9895
+ _b.label = 2;
9896
+ case 2: return [2 /*return*/];
9854
9897
  }
9855
9898
  });
9856
9899
  });