stream-chat-angular 2.19.0 → 2.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,40 +11,56 @@ export class NotificationService {
11
11
  }
12
12
  /**
13
13
  * Displays a notification for the given amount of time.
14
- * @param text The text of the notification
14
+ * @param content The text of the notification or the HTML template for the notification
15
15
  * @param type The type of the notification
16
16
  * @param timeout The number of milliseconds while the notification should be visible
17
- * @param translateParams Translation parameters for the `text`
17
+ * @param translateParams Translation parameters for the `content` (for text notifications)
18
+ * @param templateContext The input of the notification template (for HTML notifications)
18
19
  * @returns A method to clear the notification (before the timeout).
19
20
  */
20
- addTemporaryNotification(text, type = 'error', timeout = 5000, translateParams) {
21
- this.addNotification(text, type, translateParams);
22
- const id = setTimeout(() => this.removeNotification(text), timeout);
23
- return () => {
21
+ addTemporaryNotification(content, type = 'error', timeout = 5000, translateParams, templateContext) {
22
+ const notification = this.createNotification(content, type, translateParams, templateContext);
23
+ const id = setTimeout(() => this.removeNotification(notification.id), timeout);
24
+ notification.dismissFn = () => {
24
25
  clearTimeout(id);
25
- this.removeNotification(text);
26
+ this.removeNotification(notification.id);
26
27
  };
28
+ this.notificationsSubject.next([
29
+ ...this.notificationsSubject.getValue(),
30
+ notification,
31
+ ]);
32
+ return notification.dismissFn;
27
33
  }
28
34
  /**
29
35
  * Displays a notification, that will be visible until it's removed.
30
- * @param text The text of the notification
36
+ * @param content The text of the notification or the HTML template for the notification
31
37
  * @param type The type of the notification
32
- * @param translateParams Translation parameters for the `text`
38
+ * @param translateParams Translation parameters for the `content` (for text notifications)
39
+ * @param templateContext The input of the notification template (for HTML notifications)
33
40
  * @returns A method to clear the notification.
34
41
  */
35
- addPermanentNotification(text, type = 'error', translateParams) {
36
- this.addNotification(text, type, translateParams);
37
- return () => this.removeNotification(text);
38
- }
39
- addNotification(text, type, translateParams) {
42
+ addPermanentNotification(content, type = 'error', translateParams, templateContext) {
43
+ const notification = this.createNotification(content, type, translateParams, templateContext);
40
44
  this.notificationsSubject.next([
41
45
  ...this.notificationsSubject.getValue(),
42
- { text, type, translateParams },
46
+ notification,
43
47
  ]);
48
+ return notification.dismissFn;
49
+ }
50
+ createNotification(content, type, translateParams, templateContext) {
51
+ const id = new Date().getTime().toString() + Math.random().toString();
52
+ return {
53
+ id,
54
+ [typeof content === 'string' ? 'text' : 'template']: content,
55
+ type,
56
+ translateParams,
57
+ templateContext,
58
+ dismissFn: () => this.removeNotification(id),
59
+ };
44
60
  }
45
- removeNotification(text) {
61
+ removeNotification(id) {
46
62
  const notifications = this.notificationsSubject.getValue();
47
- const index = notifications.findIndex((n) => n.text === text);
63
+ const index = notifications.findIndex((n) => n.id === id);
48
64
  if (index === -1) {
49
65
  return;
50
66
  }
@@ -60,4 +76,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
60
76
  providedIn: 'root',
61
77
  }]
62
78
  }], ctorParameters: function () { return []; } });
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbm90aWZpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDOztBQVVuRDs7R0FFRztBQUlILE1BQU0sT0FBTyxtQkFBbUI7SUFPOUI7UUFGUSx5QkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FBd0IsRUFBRSxDQUFDLENBQUM7UUFHNUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCx3QkFBd0IsQ0FDdEIsSUFBWSxFQUNaLE9BQXlCLE9BQU8sRUFDaEMsVUFBa0IsSUFBSSxFQUN0QixlQUF3QjtRQUV4QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDbEQsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVwRSxPQUFPLEdBQUcsRUFBRTtZQUNWLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILHdCQUF3QixDQUN0QixJQUFZLEVBQ1osT0FBeUIsT0FBTyxFQUNoQyxlQUF3QjtRQUV4QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFbEQsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLGVBQWUsQ0FDckIsSUFBWSxFQUNaLElBQXNCLEVBQ3RCLGVBQXdCO1FBRXhCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7WUFDN0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFO1lBQ3ZDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUU7U0FDaEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQVk7UUFDckMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDOUQsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDaEIsT0FBTztTQUNSO1FBQ0QsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDOztnSEF0RVUsbUJBQW1CO29IQUFuQixtQkFBbUIsY0FGbEIsTUFBTTsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvblR5cGUgPSAnc3VjY2VzcycgfCAnZXJyb3InO1xuXG5leHBvcnQgdHlwZSBOb3RpZmljYXRpb25QYXlsb2FkID0ge1xuICB0eXBlOiBOb3RpZmljYXRpb25UeXBlO1xuICB0ZXh0OiBzdHJpbmc7XG4gIHRyYW5zbGF0ZVBhcmFtcz86IE9iamVjdDtcbn07XG5cbi8qKlxuICogVGhlIGBOb3RpZmljYXRpb25TZXJ2aWNlYCBjYW4gYmUgdXNlZCB0byBhZGQgb3IgcmVtb3ZlIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQgdGhlIFtgTm90aWZpY2F0aW9uTGlzdGBdKC4uL2NvbXBvbmVudHMvTm90aWZpY2F0aW9uTGlzdENvbXBvbmVudC5tZHgpIGNvbXBvbmVudCBkaXNwbGF5cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBub3RpZmljYXRpb25zLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uU2VydmljZSB7XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBbbm90aWZpY2F0aW9uc10oaHR0cHM6Ly9naXRodWIuY29tL0dldFN0cmVhbS9zdHJlYW0tY2hhdC1hbmd1bGFyL2Jsb2IvbWFzdGVyL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9ub3RpZmljYXRpb24uc2VydmljZS50cykuXG4gICAqL1xuICBub3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb25QYXlsb2FkW10+O1xuICBwcml2YXRlIG5vdGlmaWNhdGlvbnNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOb3RpZmljYXRpb25QYXlsb2FkW10+KFtdKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMkID0gdGhpcy5ub3RpZmljYXRpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyBhIG5vdGlmaWNhdGlvbiBmb3IgdGhlIGdpdmVuIGFtb3VudCBvZiB0aW1lLlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBvZiB0aGUgbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBub3RpZmljYXRpb25cbiAgICogQHBhcmFtIHRpbWVvdXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgd2hpbGUgdGhlIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgdmlzaWJsZVxuICAgKiBAcGFyYW0gdHJhbnNsYXRlUGFyYW1zIFRyYW5zbGF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBgdGV4dGBcbiAgICogQHJldHVybnMgQSBtZXRob2QgdG8gY2xlYXIgdGhlIG5vdGlmaWNhdGlvbiAoYmVmb3JlIHRoZSB0aW1lb3V0KS5cbiAgICovXG4gIGFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZSA9ICdlcnJvcicsXG4gICAgdGltZW91dDogbnVtYmVyID0gNTAwMCxcbiAgICB0cmFuc2xhdGVQYXJhbXM/OiBPYmplY3RcbiAgKSB7XG4gICAgdGhpcy5hZGROb3RpZmljYXRpb24odGV4dCwgdHlwZSwgdHJhbnNsYXRlUGFyYW1zKTtcbiAgICBjb25zdCBpZCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZW1vdmVOb3RpZmljYXRpb24odGV4dCksIHRpbWVvdXQpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgICB0aGlzLnJlbW92ZU5vdGlmaWNhdGlvbih0ZXh0KTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgbm90aWZpY2F0aW9uLCB0aGF0IHdpbGwgYmUgdmlzaWJsZSB1bnRpbCBpdCdzIHJlbW92ZWQuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSBub3RpZmljYXRpb25cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gdHJhbnNsYXRlUGFyYW1zIFRyYW5zbGF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBgdGV4dGBcbiAgICogQHJldHVybnMgQSBtZXRob2QgdG8gY2xlYXIgdGhlIG5vdGlmaWNhdGlvbi5cbiAgICovXG4gIGFkZFBlcm1hbmVudE5vdGlmaWNhdGlvbihcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZSA9ICdlcnJvcicsXG4gICAgdHJhbnNsYXRlUGFyYW1zPzogT2JqZWN0XG4gICkge1xuICAgIHRoaXMuYWRkTm90aWZpY2F0aW9uKHRleHQsIHR5cGUsIHRyYW5zbGF0ZVBhcmFtcyk7XG5cbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVOb3RpZmljYXRpb24odGV4dCk7XG4gIH1cblxuICBwcml2YXRlIGFkZE5vdGlmaWNhdGlvbihcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZSxcbiAgICB0cmFuc2xhdGVQYXJhbXM/OiBPYmplY3RcbiAgKSB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25zU3ViamVjdC5uZXh0KFtcbiAgICAgIC4uLnRoaXMubm90aWZpY2F0aW9uc1N1YmplY3QuZ2V0VmFsdWUoKSxcbiAgICAgIHsgdGV4dCwgdHlwZSwgdHJhbnNsYXRlUGFyYW1zIH0sXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU5vdGlmaWNhdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25zID0gdGhpcy5ub3RpZmljYXRpb25zU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IGluZGV4ID0gbm90aWZpY2F0aW9ucy5maW5kSW5kZXgoKG4pID0+IG4udGV4dCA9PT0gdGV4dCk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBub3RpZmljYXRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5ub3RpZmljYXRpb25zU3ViamVjdC5uZXh0KFsuLi5ub3RpZmljYXRpb25zXSk7XG4gIH1cbn1cbiJdfQ==
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbm90aWZpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDOztBQUduRDs7R0FFRztBQUlILE1BQU0sT0FBTyxtQkFBbUI7SUFPOUI7UUFGUSx5QkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FBd0IsRUFBRSxDQUFDLENBQUM7UUFHNUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsd0JBQXdCLENBQ3RCLE9BQWdDLEVBQ2hDLE9BQXlCLE9BQU8sRUFDaEMsVUFBa0IsSUFBSSxFQUN0QixlQUF3QixFQUN4QixlQUFtQjtRQUVuQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQzFDLE9BQU8sRUFDUCxJQUFJLEVBQ0osZUFBZSxFQUNmLGVBQWUsQ0FDaEIsQ0FBQztRQUNGLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FDbkIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDOUMsT0FBTyxDQUNSLENBQUM7UUFDRixZQUFZLENBQUMsU0FBUyxHQUFHLEdBQUcsRUFBRTtZQUM1QixZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDO1lBQzdCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRTtZQUN2QyxZQUFZO1NBQ2IsQ0FBQyxDQUFDO1FBRUgsT0FBTyxZQUFZLENBQUMsU0FBUyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsd0JBQXdCLENBTXRCLE9BQWdDLEVBQ2hDLE9BQXlCLE9BQU8sRUFDaEMsZUFBd0IsRUFDeEIsZUFBbUI7UUFFbkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUMxQyxPQUFPLEVBQ1AsSUFBSSxFQUNKLGVBQWUsRUFDZixlQUFlLENBQ2hCLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDO1lBQzdCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRTtZQUN2QyxZQUFZO1NBQ2IsQ0FBQyxDQUFDO1FBRUgsT0FBTyxZQUFZLENBQUMsU0FBUyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsT0FBZ0MsRUFDaEMsSUFBc0IsRUFDdEIsZUFBd0IsRUFDeEIsZUFBbUI7UUFFbkIsTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEUsT0FBTztZQUNMLEVBQUU7WUFDRixDQUFDLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPO1lBQzVELElBQUk7WUFDSixlQUFlO1lBQ2YsZUFBZTtZQUNmLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1NBQzdDLENBQUM7SUFDSixDQUFDO0lBRU8sa0JBQWtCLENBQUMsRUFBVTtRQUNuQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0QsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNoQixPQUFPO1NBQ1I7UUFDRCxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7O2dIQTNHVSxtQkFBbUI7b0hBQW5CLG1CQUFtQixjQUZsQixNQUFNOzJGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25QYXlsb2FkLCBOb3RpZmljYXRpb25UeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBOb3RpZmljYXRpb25TZXJ2aWNlYCBjYW4gYmUgdXNlZCB0byBhZGQgb3IgcmVtb3ZlIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQgdGhlIFtgTm90aWZpY2F0aW9uTGlzdGBdKC4uL2NvbXBvbmVudHMvTm90aWZpY2F0aW9uTGlzdENvbXBvbmVudC5tZHgpIGNvbXBvbmVudCBkaXNwbGF5cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBub3RpZmljYXRpb25zLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uU2VydmljZSB7XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBbbm90aWZpY2F0aW9uc10oaHR0cHM6Ly9naXRodWIuY29tL0dldFN0cmVhbS9zdHJlYW0tY2hhdC1hbmd1bGFyL2Jsb2IvbWFzdGVyL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9ub3RpZmljYXRpb24uc2VydmljZS50cykuXG4gICAqL1xuICBub3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb25QYXlsb2FkW10+O1xuICBwcml2YXRlIG5vdGlmaWNhdGlvbnNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOb3RpZmljYXRpb25QYXlsb2FkW10+KFtdKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMkID0gdGhpcy5ub3RpZmljYXRpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyBhIG5vdGlmaWNhdGlvbiBmb3IgdGhlIGdpdmVuIGFtb3VudCBvZiB0aW1lLlxuICAgKiBAcGFyYW0gY29udGVudCBUaGUgdGV4dCBvZiB0aGUgbm90aWZpY2F0aW9uIG9yIHRoZSBIVE1MIHRlbXBsYXRlIGZvciB0aGUgbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBub3RpZmljYXRpb25cbiAgICogQHBhcmFtIHRpbWVvdXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgd2hpbGUgdGhlIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgdmlzaWJsZVxuICAgKiBAcGFyYW0gdHJhbnNsYXRlUGFyYW1zIFRyYW5zbGF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBgY29udGVudGAgKGZvciB0ZXh0IG5vdGlmaWNhdGlvbnMpXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZUNvbnRleHQgVGhlIGlucHV0IG9mIHRoZSBub3RpZmljYXRpb24gdGVtcGxhdGUgKGZvciBIVE1MIG5vdGlmaWNhdGlvbnMpXG4gICAqIEByZXR1cm5zIEEgbWV0aG9kIHRvIGNsZWFyIHRoZSBub3RpZmljYXRpb24gKGJlZm9yZSB0aGUgdGltZW91dCkuXG4gICAqL1xuICBhZGRUZW1wb3JhcnlOb3RpZmljYXRpb248VD4oXG4gICAgY29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8VD4sXG4gICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZSA9ICdlcnJvcicsXG4gICAgdGltZW91dDogbnVtYmVyID0gNTAwMCxcbiAgICB0cmFuc2xhdGVQYXJhbXM/OiBPYmplY3QsXG4gICAgdGVtcGxhdGVDb250ZXh0PzogVFxuICApIHtcbiAgICBjb25zdCBub3RpZmljYXRpb24gPSB0aGlzLmNyZWF0ZU5vdGlmaWNhdGlvbjxUPihcbiAgICAgIGNvbnRlbnQsXG4gICAgICB0eXBlLFxuICAgICAgdHJhbnNsYXRlUGFyYW1zLFxuICAgICAgdGVtcGxhdGVDb250ZXh0XG4gICAgKTtcbiAgICBjb25zdCBpZCA9IHNldFRpbWVvdXQoXG4gICAgICAoKSA9PiB0aGlzLnJlbW92ZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uaWQpLFxuICAgICAgdGltZW91dFxuICAgICk7XG4gICAgbm90aWZpY2F0aW9uLmRpc21pc3NGbiA9ICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgICB0aGlzLnJlbW92ZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uaWQpO1xuICAgIH07XG4gICAgdGhpcy5ub3RpZmljYXRpb25zU3ViamVjdC5uZXh0KFtcbiAgICAgIC4uLnRoaXMubm90aWZpY2F0aW9uc1N1YmplY3QuZ2V0VmFsdWUoKSxcbiAgICAgIG5vdGlmaWNhdGlvbixcbiAgICBdKTtcblxuICAgIHJldHVybiBub3RpZmljYXRpb24uZGlzbWlzc0ZuO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgbm90aWZpY2F0aW9uLCB0aGF0IHdpbGwgYmUgdmlzaWJsZSB1bnRpbCBpdCdzIHJlbW92ZWQuXG4gICAqIEBwYXJhbSBjb250ZW50IFRoZSB0ZXh0IG9mIHRoZSBub3RpZmljYXRpb24gb3IgdGhlIEhUTUwgdGVtcGxhdGUgZm9yIHRoZSBub3RpZmljYXRpb25cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gdHJhbnNsYXRlUGFyYW1zIFRyYW5zbGF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBgY29udGVudGAgKGZvciB0ZXh0IG5vdGlmaWNhdGlvbnMpXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZUNvbnRleHQgVGhlIGlucHV0IG9mIHRoZSBub3RpZmljYXRpb24gdGVtcGxhdGUgKGZvciBIVE1MIG5vdGlmaWNhdGlvbnMpXG4gICAqIEByZXR1cm5zIEEgbWV0aG9kIHRvIGNsZWFyIHRoZSBub3RpZmljYXRpb24uXG4gICAqL1xuICBhZGRQZXJtYW5lbnROb3RpZmljYXRpb248XG4gICAgVCA9IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgIGRpc21pc3NGbjogKCkgPT4ge307XG4gICAgfVxuICA+KFxuICAgIGNvbnRlbnQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPFQ+LFxuICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUgPSAnZXJyb3InLFxuICAgIHRyYW5zbGF0ZVBhcmFtcz86IE9iamVjdCxcbiAgICB0ZW1wbGF0ZUNvbnRleHQ/OiBUXG4gICkge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHRoaXMuY3JlYXRlTm90aWZpY2F0aW9uPFQ+KFxuICAgICAgY29udGVudCxcbiAgICAgIHR5cGUsXG4gICAgICB0cmFuc2xhdGVQYXJhbXMsXG4gICAgICB0ZW1wbGF0ZUNvbnRleHRcbiAgICApO1xuICAgIHRoaXMubm90aWZpY2F0aW9uc1N1YmplY3QubmV4dChbXG4gICAgICAuLi50aGlzLm5vdGlmaWNhdGlvbnNTdWJqZWN0LmdldFZhbHVlKCksXG4gICAgICBub3RpZmljYXRpb24sXG4gICAgXSk7XG5cbiAgICByZXR1cm4gbm90aWZpY2F0aW9uLmRpc21pc3NGbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTm90aWZpY2F0aW9uPFQ+KFxuICAgIGNvbnRlbnQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPFQ+LFxuICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUsXG4gICAgdHJhbnNsYXRlUGFyYW1zPzogT2JqZWN0LFxuICAgIHRlbXBsYXRlQ29udGV4dD86IFRcbiAgKSB7XG4gICAgY29uc3QgaWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKS50b1N0cmluZygpICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygpO1xuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIFt0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycgPyAndGV4dCcgOiAndGVtcGxhdGUnXTogY29udGVudCxcbiAgICAgIHR5cGUsXG4gICAgICB0cmFuc2xhdGVQYXJhbXMsXG4gICAgICB0ZW1wbGF0ZUNvbnRleHQsXG4gICAgICBkaXNtaXNzRm46ICgpID0+IHRoaXMucmVtb3ZlTm90aWZpY2F0aW9uKGlkKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVOb3RpZmljYXRpb24oaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSB0aGlzLm5vdGlmaWNhdGlvbnNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgaW5kZXggPSBub3RpZmljYXRpb25zLmZpbmRJbmRleCgobikgPT4gbi5pZCA9PT0gaWQpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbm90aWZpY2F0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMubm90aWZpY2F0aW9uc1N1YmplY3QubmV4dChbLi4ubm90aWZpY2F0aW9uc10pO1xuICB9XG59XG4iXX0=
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgQXR0YWNobWVudCxcbiAgQ2hhbm5lbE1lbWJlclJlc3BvbnNlLFxuICBDb21tYW5kUmVzcG9uc2UsXG4gIEV2ZW50LFxuICBGb3JtYXRNZXNzYWdlUmVzcG9uc2UsXG4gIExpdGVyYWxTdHJpbmdGb3JVbmlvbixcbiAgTXV0ZSxcbiAgVXNlclJlc3BvbnNlLFxufSBmcm9tICdzdHJlYW0tY2hhdCc7XG5cbmV4cG9ydCB0eXBlIFVua25vd25UeXBlID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCB0eXBlIEN1c3RvbVRyaWdnZXIgPSB7XG4gIFtrZXk6IHN0cmluZ106IHtcbiAgICBjb21wb25lbnRQcm9wczogVW5rbm93blR5cGU7XG4gICAgZGF0YTogVW5rbm93blR5cGU7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0QXR0YWNobWVudFR5cGUgPSBVbmtub3duVHlwZSAmIHtcbiAgYXNzZXRfdXJsPzogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgaW1hZ2VzPzogQXJyYXk8QXR0YWNobWVudDxEZWZhdWx0QXR0YWNobWVudFR5cGU+PjtcbiAgbWltZV90eXBlPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdENoYW5uZWxUeXBlID0gVW5rbm93blR5cGUgJiB7XG4gIGltYWdlPzogc3RyaW5nO1xuICBtZW1iZXJfY291bnQ/OiBudW1iZXI7XG4gIHN1YnRpdGxlPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdENvbW1hbmRUeXBlID0gTGl0ZXJhbFN0cmluZ0ZvclVuaW9uO1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0RXZlbnRUeXBlID0gVW5rbm93blR5cGU7XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRNZXNzYWdlVHlwZSA9IFVua25vd25UeXBlICYge1xuICBjdXN0b21UeXBlPzogJ2NoYW5uZWwuaW50cm8nIHwgJ21lc3NhZ2UuZGF0ZSc7XG4gIGRhdGU/OiBzdHJpbmcgfCBEYXRlO1xuICBlcnJvclN0YXR1c0NvZGU/OiBudW1iZXI7XG4gIGV2ZW50PzogRXZlbnQ8XG4gICAgRGVmYXVsdEF0dGFjaG1lbnRUeXBlLFxuICAgIERlZmF1bHRDaGFubmVsVHlwZSxcbiAgICBEZWZhdWx0Q29tbWFuZFR5cGUsXG4gICAgRGVmYXVsdEV2ZW50VHlwZSxcbiAgICBEZWZhdWx0TWVzc2FnZVR5cGUsXG4gICAgRGVmYXVsdFJlYWN0aW9uVHlwZSxcbiAgICBEZWZhdWx0VXNlclR5cGVcbiAgPjtcbiAgdW5yZWFkPzogYm9vbGVhbjtcbiAgcmVhZEJ5OiBVc2VyUmVzcG9uc2U8RGVmYXVsdFVzZXJUeXBlPltdO1xufTtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdFJlYWN0aW9uVHlwZSA9IFVua25vd25UeXBlO1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0VXNlclR5cGVJbnRlcm5hbCA9IHtcbiAgaW1hZ2U/OiBzdHJpbmc7XG4gIHN0YXR1cz86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRVc2VyVHlwZTxcbiAgVXNlclR5cGUgZXh0ZW5kcyBEZWZhdWx0VXNlclR5cGVJbnRlcm5hbCA9IERlZmF1bHRVc2VyVHlwZUludGVybmFsXG4+ID0gVW5rbm93blR5cGUgJlxuICBEZWZhdWx0VXNlclR5cGVJbnRlcm5hbCAmIHtcbiAgICBtdXRlcz86IEFycmF5PE11dGU8VXNlclR5cGU+PjtcbiAgfTtcblxuZXhwb3J0IHR5cGUgU3RyZWFtTWVzc2FnZTxcbiAgQXQgZXh0ZW5kcyBEZWZhdWx0QXR0YWNobWVudFR5cGUgPSBEZWZhdWx0QXR0YWNobWVudFR5cGUsXG4gIENoIGV4dGVuZHMgRGVmYXVsdENoYW5uZWxUeXBlID0gRGVmYXVsdENoYW5uZWxUeXBlLFxuICBDbyBleHRlbmRzIERlZmF1bHRDb21tYW5kVHlwZSA9IERlZmF1bHRDb21tYW5kVHlwZSxcbiAgTWUgZXh0ZW5kcyBEZWZhdWx0TWVzc2FnZVR5cGUgPSBEZWZhdWx0TWVzc2FnZVR5cGUsXG4gIFJlIGV4dGVuZHMgRGVmYXVsdFJlYWN0aW9uVHlwZSA9IERlZmF1bHRSZWFjdGlvblR5cGUsXG4gIFVzIGV4dGVuZHMgRGVmYXVsdFVzZXJUeXBlPFVzPiA9IERlZmF1bHRVc2VyVHlwZVxuPiA9IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxBdCwgQ2gsIENvLCBNZSwgUmUsIFVzPjtcblxuZXhwb3J0IHR5cGUgQXR0YWNobWVudFVwbG9hZCA9IHtcbiAgZmlsZTogRmlsZTtcbiAgc3RhdGU6ICdlcnJvcicgfCAnc3VjY2VzcycgfCAndXBsb2FkaW5nJztcbiAgdXJsPzogc3RyaW5nO1xuICB0eXBlOiAnaW1hZ2UnIHwgJ2ZpbGUnO1xuICBwcmV2aWV3VXJpPzogc3RyaW5nIHwgQXJyYXlCdWZmZXI7XG59O1xuXG5leHBvcnQgdHlwZSBNZW50aW9uQXV0Y29tcGxldGVMaXN0SXRlbUNvbnRleHQgPSB7XG4gIGl0ZW06IE1lbnRpb25BdXRjb21wbGV0ZUxpc3RJdGVtO1xufTtcblxuZXhwb3J0IHR5cGUgQ29tbWFuZEF1dG9jb21wbGV0ZUxpc3RJdGVtQ29udGV4dCA9IHtcbiAgaXRlbTogQ29tYW5kQXV0b2NvbXBsZXRlTGlzdEl0ZW07XG59O1xuXG5leHBvcnQgdHlwZSBNZW50aW9uQXV0Y29tcGxldGVMaXN0SXRlbSA9IChcbiAgfCBDaGFubmVsTWVtYmVyUmVzcG9uc2VcbiAgfCBVc2VyUmVzcG9uc2VcbikgJiB7XG4gIGF1dG9jb21wbGV0ZUxhYmVsOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDb21hbmRBdXRvY29tcGxldGVMaXN0SXRlbSA9IENvbW1hbmRSZXNwb25zZSAmIHtcbiAgYXV0b2NvbXBsZXRlTGFiZWw6IHN0cmluZztcbn07XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dGFjaG1lbnQsXG4gIENoYW5uZWxNZW1iZXJSZXNwb25zZSxcbiAgQ29tbWFuZFJlc3BvbnNlLFxuICBFdmVudCxcbiAgRm9ybWF0TWVzc2FnZVJlc3BvbnNlLFxuICBMaXRlcmFsU3RyaW5nRm9yVW5pb24sXG4gIE11dGUsXG4gIFVzZXJSZXNwb25zZSxcbn0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuXG5leHBvcnQgdHlwZSBVbmtub3duVHlwZSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgdHlwZSBDdXN0b21UcmlnZ2VyID0ge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgY29tcG9uZW50UHJvcHM6IFVua25vd25UeXBlO1xuICAgIGRhdGE6IFVua25vd25UeXBlO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdEF0dGFjaG1lbnRUeXBlID0gVW5rbm93blR5cGUgJiB7XG4gIGFzc2V0X3VybD86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGltYWdlcz86IEFycmF5PEF0dGFjaG1lbnQ8RGVmYXVsdEF0dGFjaG1lbnRUeXBlPj47XG4gIG1pbWVfdHlwZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRDaGFubmVsVHlwZSA9IFVua25vd25UeXBlICYge1xuICBpbWFnZT86IHN0cmluZztcbiAgbWVtYmVyX2NvdW50PzogbnVtYmVyO1xuICBzdWJ0aXRsZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRDb21tYW5kVHlwZSA9IExpdGVyYWxTdHJpbmdGb3JVbmlvbjtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdEV2ZW50VHlwZSA9IFVua25vd25UeXBlO1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0TWVzc2FnZVR5cGUgPSBVbmtub3duVHlwZSAmIHtcbiAgY3VzdG9tVHlwZT86ICdjaGFubmVsLmludHJvJyB8ICdtZXNzYWdlLmRhdGUnO1xuICBkYXRlPzogc3RyaW5nIHwgRGF0ZTtcbiAgZXJyb3JTdGF0dXNDb2RlPzogbnVtYmVyO1xuICBldmVudD86IEV2ZW50PFxuICAgIERlZmF1bHRBdHRhY2htZW50VHlwZSxcbiAgICBEZWZhdWx0Q2hhbm5lbFR5cGUsXG4gICAgRGVmYXVsdENvbW1hbmRUeXBlLFxuICAgIERlZmF1bHRFdmVudFR5cGUsXG4gICAgRGVmYXVsdE1lc3NhZ2VUeXBlLFxuICAgIERlZmF1bHRSZWFjdGlvblR5cGUsXG4gICAgRGVmYXVsdFVzZXJUeXBlXG4gID47XG4gIHVucmVhZD86IGJvb2xlYW47XG4gIHJlYWRCeTogVXNlclJlc3BvbnNlPERlZmF1bHRVc2VyVHlwZT5bXTtcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRSZWFjdGlvblR5cGUgPSBVbmtub3duVHlwZTtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdFVzZXJUeXBlSW50ZXJuYWwgPSB7XG4gIGltYWdlPzogc3RyaW5nO1xuICBzdGF0dXM/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0VXNlclR5cGU8XG4gIFVzZXJUeXBlIGV4dGVuZHMgRGVmYXVsdFVzZXJUeXBlSW50ZXJuYWwgPSBEZWZhdWx0VXNlclR5cGVJbnRlcm5hbFxuPiA9IFVua25vd25UeXBlICZcbiAgRGVmYXVsdFVzZXJUeXBlSW50ZXJuYWwgJiB7XG4gICAgbXV0ZXM/OiBBcnJheTxNdXRlPFVzZXJUeXBlPj47XG4gIH07XG5cbmV4cG9ydCB0eXBlIFN0cmVhbU1lc3NhZ2U8XG4gIEF0IGV4dGVuZHMgRGVmYXVsdEF0dGFjaG1lbnRUeXBlID0gRGVmYXVsdEF0dGFjaG1lbnRUeXBlLFxuICBDaCBleHRlbmRzIERlZmF1bHRDaGFubmVsVHlwZSA9IERlZmF1bHRDaGFubmVsVHlwZSxcbiAgQ28gZXh0ZW5kcyBEZWZhdWx0Q29tbWFuZFR5cGUgPSBEZWZhdWx0Q29tbWFuZFR5cGUsXG4gIE1lIGV4dGVuZHMgRGVmYXVsdE1lc3NhZ2VUeXBlID0gRGVmYXVsdE1lc3NhZ2VUeXBlLFxuICBSZSBleHRlbmRzIERlZmF1bHRSZWFjdGlvblR5cGUgPSBEZWZhdWx0UmVhY3Rpb25UeXBlLFxuICBVcyBleHRlbmRzIERlZmF1bHRVc2VyVHlwZTxVcz4gPSBEZWZhdWx0VXNlclR5cGVcbj4gPSBGb3JtYXRNZXNzYWdlUmVzcG9uc2U8QXQsIENoLCBDbywgTWUsIFJlLCBVcz47XG5cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRVcGxvYWQgPSB7XG4gIGZpbGU6IEZpbGU7XG4gIHN0YXRlOiAnZXJyb3InIHwgJ3N1Y2Nlc3MnIHwgJ3VwbG9hZGluZyc7XG4gIHVybD86IHN0cmluZztcbiAgdHlwZTogJ2ltYWdlJyB8ICdmaWxlJztcbiAgcHJldmlld1VyaT86IHN0cmluZyB8IEFycmF5QnVmZmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTWVudGlvbkF1dGNvbXBsZXRlTGlzdEl0ZW1Db250ZXh0ID0ge1xuICBpdGVtOiBNZW50aW9uQXV0Y29tcGxldGVMaXN0SXRlbTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbW1hbmRBdXRvY29tcGxldGVMaXN0SXRlbUNvbnRleHQgPSB7XG4gIGl0ZW06IENvbWFuZEF1dG9jb21wbGV0ZUxpc3RJdGVtO1xufTtcblxuZXhwb3J0IHR5cGUgTWVudGlvbkF1dGNvbXBsZXRlTGlzdEl0ZW0gPSAoXG4gIHwgQ2hhbm5lbE1lbWJlclJlc3BvbnNlXG4gIHwgVXNlclJlc3BvbnNlXG4pICYge1xuICBhdXRvY29tcGxldGVMYWJlbDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQ29tYW5kQXV0b2NvbXBsZXRlTGlzdEl0ZW0gPSBDb21tYW5kUmVzcG9uc2UgJiB7XG4gIGF1dG9jb21wbGV0ZUxhYmVsOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBOb3RpZmljYXRpb25UeXBlID0gJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyB8ICdpbmZvJztcblxuZXhwb3J0IHR5cGUgTm90aWZpY2F0aW9uUGF5bG9hZDxUID0ge30+ID0ge1xuICBpZDogc3RyaW5nO1xuICB0eXBlOiBOb3RpZmljYXRpb25UeXBlO1xuICB0ZXh0Pzogc3RyaW5nO1xuICB0cmFuc2xhdGVQYXJhbXM/OiBPYmplY3Q7XG4gIHRlbXBsYXRlPzogVGVtcGxhdGVSZWY8VD47XG4gIHRlbXBsYXRlQ29udGV4dD86IFQ7XG4gIGRpc21pc3NGbjogRnVuY3Rpb247XG59O1xuIl19
@@ -17,7 +17,7 @@ import transliterate from '@stream-io/transliterate';
17
17
  import * as i6$1 from 'angular-mentions';
18
18
  import { MentionModule } from 'angular-mentions';
19
19
 
20
- const version = '2.19.0';
20
+ const version = '2.20.2';
21
21
 
22
22
  /**
23
23
  * The `NotificationService` can be used to add or remove notifications. By default the [`NotificationList`](../components/NotificationListComponent.mdx) component displays the currently active notifications.
@@ -29,40 +29,56 @@ class NotificationService {
29
29
  }
30
30
  /**
31
31
  * Displays a notification for the given amount of time.
32
- * @param text The text of the notification
32
+ * @param content The text of the notification or the HTML template for the notification
33
33
  * @param type The type of the notification
34
34
  * @param timeout The number of milliseconds while the notification should be visible
35
- * @param translateParams Translation parameters for the `text`
35
+ * @param translateParams Translation parameters for the `content` (for text notifications)
36
+ * @param templateContext The input of the notification template (for HTML notifications)
36
37
  * @returns A method to clear the notification (before the timeout).
37
38
  */
38
- addTemporaryNotification(text, type = 'error', timeout = 5000, translateParams) {
39
- this.addNotification(text, type, translateParams);
40
- const id = setTimeout(() => this.removeNotification(text), timeout);
41
- return () => {
39
+ addTemporaryNotification(content, type = 'error', timeout = 5000, translateParams, templateContext) {
40
+ const notification = this.createNotification(content, type, translateParams, templateContext);
41
+ const id = setTimeout(() => this.removeNotification(notification.id), timeout);
42
+ notification.dismissFn = () => {
42
43
  clearTimeout(id);
43
- this.removeNotification(text);
44
+ this.removeNotification(notification.id);
44
45
  };
46
+ this.notificationsSubject.next([
47
+ ...this.notificationsSubject.getValue(),
48
+ notification,
49
+ ]);
50
+ return notification.dismissFn;
45
51
  }
46
52
  /**
47
53
  * Displays a notification, that will be visible until it's removed.
48
- * @param text The text of the notification
54
+ * @param content The text of the notification or the HTML template for the notification
49
55
  * @param type The type of the notification
50
- * @param translateParams Translation parameters for the `text`
56
+ * @param translateParams Translation parameters for the `content` (for text notifications)
57
+ * @param templateContext The input of the notification template (for HTML notifications)
51
58
  * @returns A method to clear the notification.
52
59
  */
53
- addPermanentNotification(text, type = 'error', translateParams) {
54
- this.addNotification(text, type, translateParams);
55
- return () => this.removeNotification(text);
56
- }
57
- addNotification(text, type, translateParams) {
60
+ addPermanentNotification(content, type = 'error', translateParams, templateContext) {
61
+ const notification = this.createNotification(content, type, translateParams, templateContext);
58
62
  this.notificationsSubject.next([
59
63
  ...this.notificationsSubject.getValue(),
60
- { text, type, translateParams },
64
+ notification,
61
65
  ]);
66
+ return notification.dismissFn;
67
+ }
68
+ createNotification(content, type, translateParams, templateContext) {
69
+ const id = new Date().getTime().toString() + Math.random().toString();
70
+ return {
71
+ id,
72
+ [typeof content === 'string' ? 'text' : 'template']: content,
73
+ type,
74
+ translateParams,
75
+ templateContext,
76
+ dismissFn: () => this.removeNotification(id),
77
+ };
62
78
  }
63
- removeNotification(text) {
79
+ removeNotification(id) {
64
80
  const notifications = this.notificationsSubject.getValue();
65
- const index = notifications.findIndex((n) => n.text === text);
81
+ const index = notifications.findIndex((n) => n.id === id);
66
82
  if (index === -1) {
67
83
  return;
68
84
  }
@@ -89,9 +105,11 @@ class ChatClientService {
89
105
  this.notificationSubject = new ReplaySubject(1);
90
106
  this.connectionStateSubject = new ReplaySubject(1);
91
107
  this.appSettingsSubject = new BehaviorSubject(undefined);
108
+ this.pendingInvitesSubject = new BehaviorSubject([]);
92
109
  this.notification$ = this.notificationSubject.asObservable();
93
110
  this.connectionState$ = this.connectionStateSubject.asObservable();
94
111
  this.appSettings$ = this.appSettingsSubject.asObservable();
112
+ this.pendingInvites$ = this.pendingInvitesSubject.asObservable();
95
113
  }
96
114
  /**
97
115
  * Creates a [`StreamChat`](https://github.com/GetStream/stream-chat-js/blob/668b3e5521339f4e14fc657834531b4c8bf8176b/src/client.ts#L124) instance using the provided `apiKey`, and connects a user with the given meta data and token. More info about [connecting users](https://getstream.io/chat/docs/javascript/init_and_users/?language=javascript) can be found in the platform documentation.
@@ -100,16 +118,20 @@ class ChatClientService {
100
118
  * @param userTokenOrProvider
101
119
  */
102
120
  init(apiKey, userOrId, userTokenOrProvider) {
121
+ var _a;
103
122
  return __awaiter(this, void 0, void 0, function* () {
104
123
  this.chatClient = StreamChat.getInstance(apiKey);
124
+ this.chatClient.devToken;
105
125
  yield this.ngZone.runOutsideAngular(() => __awaiter(this, void 0, void 0, function* () {
106
126
  const user = typeof userOrId === 'string' ? { id: userOrId } : userOrId;
107
127
  yield this.chatClient.connectUser(user, userTokenOrProvider);
108
128
  this.chatClient.setUserAgent(`stream-chat-angular-${version}-${this.chatClient.getUserAgent()}`);
109
- this.chatClient.getAppSettings;
110
129
  }));
130
+ const channels = yield this.chatClient.queryChannels({ invite: 'pending' }, {}, { user_id: (_a = this.chatClient.user) === null || _a === void 0 ? void 0 : _a.id });
131
+ this.pendingInvitesSubject.next(channels);
111
132
  this.appSettingsSubject.next(undefined);
112
133
  this.chatClient.on((e) => {
134
+ this.updatePendingInvites(e);
113
135
  this.notificationSubject.next({
114
136
  eventType: e.type,
115
137
  event: e,
@@ -138,6 +160,7 @@ class ChatClientService {
138
160
  */
139
161
  disconnectUser() {
140
162
  return __awaiter(this, void 0, void 0, function* () {
163
+ this.pendingInvitesSubject.next([]);
141
164
  yield this.chatClient.disconnectUser();
142
165
  });
143
166
  }
@@ -182,6 +205,23 @@ class ChatClientService {
182
205
  return result.users;
183
206
  });
184
207
  }
208
+ updatePendingInvites(e) {
209
+ var _a, _b, _c;
210
+ if (((_b = (_a = e.member) === null || _a === void 0 ? void 0 : _a.user) === null || _b === void 0 ? void 0 : _b.id) === ((_c = this.chatClient.user) === null || _c === void 0 ? void 0 : _c.id) && e.channel) {
211
+ const pendingInvites = this.pendingInvitesSubject.getValue();
212
+ if (e.type === 'notification.invited') {
213
+ this.pendingInvitesSubject.next([...pendingInvites, e.channel]);
214
+ }
215
+ else if (e.type === 'notification.invite_accepted' ||
216
+ e.type === 'notification.invite_rejected') {
217
+ const index = pendingInvites.findIndex((i) => { var _a; return (i === null || i === void 0 ? void 0 : i.cid) === ((_a = e.channel) === null || _a === void 0 ? void 0 : _a.cid); });
218
+ if (index !== -1) {
219
+ pendingInvites.splice(index, 1);
220
+ this.pendingInvitesSubject.next([...pendingInvites]);
221
+ }
222
+ }
223
+ }
224
+ }
185
225
  }
186
226
  ChatClientService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChatClientService, deps: [{ token: i0.NgZone }, { token: NotificationService }], target: i0.ɵɵFactoryTarget.Injectable });
187
227
  ChatClientService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChatClientService, providedIn: 'root' });
@@ -244,7 +284,14 @@ class ChannelService {
244
284
  this.usersTypingInChannelSubject = new BehaviorSubject([]);
245
285
  this.usersTypingInThreadSubject = new BehaviorSubject([]);
246
286
  this.channelListSetter = (channels) => {
247
- this.channelsSubject.next(channels);
287
+ const currentChannels = this.channelsSubject.getValue() || [];
288
+ const newChannels = channels.filter((c) => !currentChannels.find((channel) => channel.cid === c.cid));
289
+ const deletedChannels = currentChannels.filter((c) => !(channels === null || channels === void 0 ? void 0 : channels.find((channel) => channel.cid === c.cid)));
290
+ this.addChannelsFromNotification(newChannels);
291
+ this.removeChannelsFromChannelList(deletedChannels.map((c) => c.cid));
292
+ if (!newChannels.length && !deletedChannels.length) {
293
+ this.channelsSubject.next(channels);
294
+ }
248
295
  };
249
296
  this.messageListSetter = (messages) => {
250
297
  this.activeChannelMessagesSubject.next(messages);
@@ -641,75 +688,80 @@ class ChannelService {
641
688
  });
642
689
  }
643
690
  handleNotification(notification) {
644
- return __awaiter(this, void 0, void 0, function* () {
645
- switch (notification.eventType) {
646
- case 'notification.message_new': {
647
- yield this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
648
- if (this.customNewMessageNotificationHandler) {
649
- this.customNewMessageNotificationHandler(notification, this.channelListSetter);
650
- }
651
- else {
652
- yield this.handleNewMessageNotification(notification);
653
- }
654
- }));
655
- break;
656
- }
657
- case 'notification.added_to_channel': {
658
- yield this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
659
- if (this.customAddedToChannelNotificationHandler) {
660
- this.customAddedToChannelNotificationHandler(notification, this.channelListSetter);
661
- }
662
- else {
663
- yield this.handleAddedToChannelNotification(notification);
664
- }
665
- }));
666
- break;
667
- }
668
- case 'notification.removed_from_channel': {
669
- this.ngZone.run(() => {
670
- if (this.customRemovedFromChannelNotificationHandler) {
671
- this.customRemovedFromChannelNotificationHandler(notification, this.channelListSetter);
672
- }
673
- else {
674
- this.handleRemovedFromChannelNotification(notification);
675
- }
676
- });
677
- }
691
+ switch (notification.eventType) {
692
+ case 'notification.message_new': {
693
+ this.ngZone.run(() => {
694
+ if (this.customNewMessageNotificationHandler) {
695
+ this.customNewMessageNotificationHandler(notification, this.channelListSetter);
696
+ }
697
+ else {
698
+ this.handleNewMessageNotification(notification);
699
+ }
700
+ });
701
+ break;
678
702
  }
679
- });
703
+ case 'notification.added_to_channel': {
704
+ this.ngZone.run(() => {
705
+ if (this.customAddedToChannelNotificationHandler) {
706
+ this.customAddedToChannelNotificationHandler(notification, this.channelListSetter);
707
+ }
708
+ else {
709
+ this.handleAddedToChannelNotification(notification);
710
+ }
711
+ });
712
+ break;
713
+ }
714
+ case 'notification.removed_from_channel': {
715
+ this.ngZone.run(() => {
716
+ if (this.customRemovedFromChannelNotificationHandler) {
717
+ this.customRemovedFromChannelNotificationHandler(notification, this.channelListSetter);
718
+ }
719
+ else {
720
+ this.handleRemovedFromChannelNotification(notification);
721
+ }
722
+ });
723
+ }
724
+ }
680
725
  }
681
726
  handleRemovedFromChannelNotification(notification) {
682
727
  const channelIdToBeRemoved = notification.event.channel.cid;
683
- this.removeFromChannelList(channelIdToBeRemoved);
728
+ this.removeChannelsFromChannelList([channelIdToBeRemoved]);
684
729
  }
685
730
  handleNewMessageNotification(notification) {
686
- return __awaiter(this, void 0, void 0, function* () {
687
- yield this.addChannelFromNotification(notification);
688
- });
731
+ if (notification.event.channel) {
732
+ this.addChannelsFromNotification([notification.event.channel]);
733
+ }
689
734
  }
690
735
  handleAddedToChannelNotification(notification) {
691
- return __awaiter(this, void 0, void 0, function* () {
692
- yield this.addChannelFromNotification(notification);
693
- });
736
+ if (notification.event.channel) {
737
+ this.addChannelsFromNotification([notification.event.channel]);
738
+ }
694
739
  }
695
- addChannelFromNotification(notification) {
696
- var _a, _b;
697
- return __awaiter(this, void 0, void 0, function* () {
698
- const channel = this.chatClientService.chatClient.channel((_a = notification.event.channel) === null || _a === void 0 ? void 0 : _a.type, (_b = notification.event.channel) === null || _b === void 0 ? void 0 : _b.id);
699
- yield channel.watch();
740
+ addChannelsFromNotification(channelResponses) {
741
+ const newChannels = [];
742
+ channelResponses.forEach((channelResponse) => {
743
+ const channel = this.chatClientService.chatClient.channel(channelResponse.type, channelResponse.id);
744
+ void channel.watch();
700
745
  this.watchForChannelEvents(channel);
701
- this.channelsSubject.next([
702
- channel,
703
- ...(this.channelsSubject.getValue() || []),
704
- ]);
746
+ newChannels.push(channel);
705
747
  });
748
+ this.channelsSubject.next([
749
+ ...newChannels,
750
+ ...(this.channelsSubject.getValue() || []),
751
+ ]);
706
752
  }
707
- removeFromChannelList(cid) {
708
- const channels = this.channels.filter((c) => c.cid !== cid);
753
+ removeChannelsFromChannelList(cids) {
754
+ var _a;
755
+ const channels = this.channels.filter((c) => !cids.includes(c.cid || ''));
709
756
  if (channels.length < this.channels.length) {
710
757
  this.channelsSubject.next(channels);
711
- if (this.activeChannelSubject.getValue().cid === cid) {
712
- this.setAsActiveChannel(channels[0]);
758
+ if (cids.includes(((_a = this.activeChannelSubject.getValue()) === null || _a === void 0 ? void 0 : _a.cid) || '')) {
759
+ if (channels.length > 0) {
760
+ this.setAsActiveChannel(channels[0]);
761
+ }
762
+ else {
763
+ this.activeChannelSubject.next(undefined);
764
+ }
713
765
  }
714
766
  }
715
767
  }
@@ -927,10 +979,10 @@ class ChannelService {
927
979
  this.channelsSubject.next([channel, ...this.channels]);
928
980
  }
929
981
  handleChannelHidden(event) {
930
- this.removeFromChannelList(event.channel.cid);
982
+ this.removeChannelsFromChannelList([event.channel.cid]);
931
983
  }
932
984
  handleChannelDeleted(event) {
933
- this.removeFromChannelList(event.channel.cid);
985
+ this.removeChannelsFromChannelList([event.channel.cid]);
934
986
  }
935
987
  handleChannelVisible(event, channel) {
936
988
  if (!this.channels.find((c) => c.cid === event.cid)) {
@@ -2354,12 +2406,15 @@ class NotificationListComponent {
2354
2406
  this.notificationService = notificationService;
2355
2407
  this.notifications$ = this.notificationService.notifications$;
2356
2408
  }
2357
- trackByItem(_, item) {
2358
- return item;
2409
+ trackById(_, item) {
2410
+ return item.id;
2411
+ }
2412
+ getTemplateContext(notification) {
2413
+ return Object.assign(Object.assign({}, notification.templateContext), { dismissFn: notification.dismissFn });
2359
2414
  }
2360
2415
  }
2361
2416
  NotificationListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: NotificationListComponent, deps: [{ token: NotificationService }], target: i0.ɵɵFactoryTarget.Component });
2362
- NotificationListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: NotificationListComponent, selector: "stream-notification-list", ngImport: i0, template: "<div class=\"str-chat__list-notifications\">\n <stream-notification\n *ngFor=\"let notification of notifications$ | async; trackBy: trackByItem\"\n [type]=\"notification.type\"\n ><div data-testclass=\"notification-content\">\n {{ notification.text | translate: notification.translateParams }}\n </div></stream-notification\n >\n</div>\n", components: [{ type: NotificationComponent, selector: "stream-notification", inputs: ["type"] }], directives: [{ type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i6.AsyncPipe, "translate": i2.TranslatePipe } });
2417
+ NotificationListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: NotificationListComponent, selector: "stream-notification-list", ngImport: i0, template: "<div class=\"str-chat__list-notifications\">\n <stream-notification\n *ngFor=\"let notification of notifications$ | async; trackBy: trackById\"\n [type]=\"notification.type\"\n >\n <div\n *ngIf=\"notification.text !== undefined\"\n data-testclass=\"notification-content\"\n >\n {{ notification.text | translate: notification.translateParams }}\n </div>\n <ng-container *ngIf=\"notification.template !== undefined\">\n <ng-container\n *ngTemplateOutlet=\"\n notification.template;\n context: getTemplateContext(notification)\n \"\n ></ng-container>\n </ng-container>\n </stream-notification>\n</div>\n", components: [{ type: NotificationComponent, selector: "stream-notification", inputs: ["type"] }], directives: [{ type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i6.AsyncPipe, "translate": i2.TranslatePipe } });
2363
2418
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: NotificationListComponent, decorators: [{
2364
2419
  type: Component,
2365
2420
  args: [{
@@ -2660,7 +2715,7 @@ class ChannelHeaderComponent {
2660
2715
  }
2661
2716
  }
2662
2717
  ChannelHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChannelHeaderComponent, deps: [{ token: ChannelService }, { token: ChannelListToggleService }], target: i0.ɵɵFactoryTarget.Component });
2663
- ChannelHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelHeaderComponent, selector: "stream-channel-header", ngImport: i0, template: "<div class=\"str-chat__header-livestream\">\n <div\n class=\"str-chat__header-hamburger\"\n (click)=\"toggleMenu($event)\"\n (keyup.enter)=\"toggleMenu($event)\"\n >\n <stream-icon icon=\"menu\"></stream-icon>\n </div>\n <stream-avatar\n imageUrl=\"{{ activeChannel?.data?.image }}\"\n name=\"{{ activeChannel?.data?.name }}\"\n ></stream-avatar>\n <div class=\"str-chat__header-livestream-left\">\n <p data-testid=\"name\" class=\"str-chat__header-livestream-left--title\">\n {{ activeChannel?.data?.name }}\n </p>\n <p data-testid=\"info\" class=\"str-chat__header-livestream-left--members\">\n {{'streamChat.{{ memberCount }} members' | translate:memberCountParam}}\n {{canReceiveConnectEvents ? ('streamChat.{{ watcherCount }} online' |\n translate:watcherCountParam) : ''}}\n </p>\n </div>\n</div>\n", components: [{ type: IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }, { type: AvatarComponent, selector: "stream-avatar", inputs: ["name", "imageUrl", "size"] }], pipes: { "translate": i2.TranslatePipe } });
2718
+ ChannelHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ChannelHeaderComponent, selector: "stream-channel-header", inputs: { channelActionsTemplate: "channelActionsTemplate" }, ngImport: i0, template: "<div class=\"str-chat__header-livestream\">\n <div\n class=\"str-chat__header-hamburger\"\n (click)=\"toggleMenu($event)\"\n (keyup.enter)=\"toggleMenu($event)\"\n >\n <stream-icon icon=\"menu\"></stream-icon>\n </div>\n <stream-avatar\n imageUrl=\"{{ activeChannel?.data?.image }}\"\n name=\"{{ activeChannel?.data?.name }}\"\n ></stream-avatar>\n <div class=\"str-chat__header-livestream-left\">\n <p data-testid=\"name\" class=\"str-chat__header-livestream-left--title\">\n {{ activeChannel?.data?.name }}\n </p>\n <p data-testid=\"info\" class=\"str-chat__header-livestream-left--members\">\n {{'streamChat.{{ memberCount }} members' | translate:memberCountParam}}\n {{canReceiveConnectEvents ? ('streamChat.{{ watcherCount }} online' |\n translate:watcherCountParam) : ''}}\n </p>\n </div>\n <ng-container *ngIf=\"channelActionsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n channelActionsTemplate;\n context: { channel: activeChannel }\n \"\n ></ng-container>\n </ng-container>\n</div>\n", components: [{ type: IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }, { type: AvatarComponent, selector: "stream-avatar", inputs: ["name", "imageUrl", "size"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "translate": i2.TranslatePipe } });
2664
2719
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: ChannelHeaderComponent, decorators: [{
2665
2720
  type: Component,
2666
2721
  args: [{
@@ -2668,7 +2723,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
2668
2723
  templateUrl: './channel-header.component.html',
2669
2724
  styles: [],
2670
2725
  }]
2671
- }], ctorParameters: function () { return [{ type: ChannelService }, { type: ChannelListToggleService }]; } });
2726
+ }], ctorParameters: function () { return [{ type: ChannelService }, { type: ChannelListToggleService }]; }, propDecorators: { channelActionsTemplate: [{
2727
+ type: Input
2728
+ }] } });
2672
2729
 
2673
2730
  /**
2674
2731
  * The `ChannelPreview` component displays a channel preview in the channel list, it consists of the image, name and latest message of the channel.
@@ -3124,7 +3181,12 @@ class MessageComponent {
3124
3181
  this.message.mentioned_users.length === 0) {
3125
3182
  // Wrap emojis in span to display emojis correctly in Chrome https://bugs.chromium.org/p/chromium/issues/detail?id=596223
3126
3183
  const regex = new RegExp(emojiRegex(), 'g');
3127
- content = content.replace(regex, (match) => `<span class="str-chat__emoji-display-fix">${match}</span>`);
3184
+ // Based on this: https://stackoverflow.com/questions/4565112/javascript-how-to-find-out-if-the-user-browser-is-chrome
3185
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3186
+ const isChrome = !!window.chrome &&
3187
+ typeof window.opr === 'undefined';
3188
+ /* eslint-enable @typescript-eslint/no-unsafe-member-access */
3189
+ content = content.replace(regex, (match) => `<span ${isChrome ? 'class="str-chat__emoji-display-fix"' : ''}>${match}</span>`);
3128
3190
  this.messageTextParts = [{ content, type: 'text' }];
3129
3191
  }
3130
3192
  else {
@@ -3767,7 +3829,7 @@ class MessageListComponent {
3767
3829
  }
3768
3830
  }
3769
3831
  MessageListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageListComponent, deps: [{ token: ChannelService }, { token: ChatClientService }, { token: ImageLoadService }], target: i0.ɵɵFactoryTarget.Component });
3770
- MessageListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageListComponent, selector: "stream-message-list", inputs: { messageTemplate: "messageTemplate", messageInputTemplate: "messageInputTemplate", mentionTemplate: "mentionTemplate", typingIndicatorTemplate: "typingIndicatorTemplate", areReactionsEnabled: "areReactionsEnabled", enabledMessageActionsInput: ["enabledMessageActions", "enabledMessageActionsInput"], mode: "mode" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "parentMessageElement", first: true, predicate: ["parentMessageElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #scrollContainer\n data-testid=\"scroll-container\"\n class=\"str-chat__list\"\n (scroll)=\"scrolled()\"\n>\n <div class=\"str-chat__reverse-infinite-scroll\">\n <ul class=\"str-chat__ul\">\n <li\n #parentMessageElement\n *ngIf=\"mode === 'thread'\"\n data-testid=\"parent-message\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: parentMessage }\n \"\n ></ng-container>\n <div class=\"str-chat__thread-start\" translate>\n streamChat.Start of a new thread\n </div>\n </li>\n <li\n data-testclass=\"message\"\n *ngFor=\"\n let message of messages$ | async;\n let i = index;\n trackBy: trackByMessageId\n \"\n class=\"str-chat__li str-chat__li--{{ groupStyles[i] }}\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: message }\n \"\n ></ng-container>\n </li>\n </ul>\n <ng-container *ngIf=\"typingIndicatorTemplate; else defaultTypingIndicator\">\n <ng-container\n *ngTemplateOutlet=\"\n typingIndicatorTemplate;\n context: { usersTyping$: usersTyping$ }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultTypingIndicator>\n <div\n *ngIf=\"(usersTyping$ | async)?.length\"\n data-testid=\"typing-indicator\"\n class=\"str-chat__typing-indicator str-chat__typing-indicator--typing\"\n >\n <stream-avatar\n *ngFor=\"let user of usersTyping$ | async; trackBy: trackByUserId\"\n [name]=\"user.name || user.id\"\n [imageUrl]=\"user.image\"\n ></stream-avatar>\n <div class=\"str-chat__typing-indicator__dots\">\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n </div>\n </div>\n </ng-template>\n </div>\n</div>\n<div class=\"str-chat__list-notifications\">\n <button\n data-testid=\"scroll-to-bottom\"\n *ngIf=\"isUserScrolledUp\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-right\n str-chat__message-notification-scroll-down\n \"\n (keyup.enter)=\"scrollToBottom()\"\n (click)=\"scrollToBottom()\"\n >\n <div\n *ngIf=\"unreadMessageCount > 0\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-scroll-down-unread-count\n \"\n >\n {{ unreadMessageCount }}\n </div>\n </button>\n</div>\n\n<ng-template #messageTemplateContainer let-message=\"message\">\n <ng-container *ngIf=\"messageTemplate; else defaultMessageTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplate;\n context: {\n message: message,\n areReactionsEnabled: areReactionsEnabled,\n canReactToMessage: canReactToMessage,\n lastSentMessageId: !!(\n lastSentMessageId && message?.id === lastSentMessageId\n ),\n canReceiveReadEvents: canReceiveReadEvents,\n messageInputTemplate: messageInputTemplate,\n mentionTemplate: mentionTemplate,\n mode: mode\n }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultMessageTemplate>\n <stream-message\n [message]=\"message\"\n [areReactionsEnabled]=\"areReactionsEnabled\"\n [canReactToMessage]=\"canReactToMessage\"\n [isLastSentMessage]=\"\n !!(lastSentMessageId && message?.id === lastSentMessageId)\n \"\n [enabledMessageActions]=\"enabledMessageActions\"\n [canReceiveReadEvents]=\"canReceiveReadEvents\"\n [messageInputTemplate]=\"messageInputTemplate\"\n [mentionTemplate]=\"mentionTemplate\"\n [mode]=\"mode\"\n ></stream-message>\n </ng-template>\n</ng-template>\n", components: [{ type: AvatarComponent, selector: "stream-avatar", inputs: ["name", "imageUrl", "size"] }, { type: MessageComponent, selector: "stream-message", inputs: ["messageInputTemplate", "mentionTemplate", "message", "enabledMessageActions", "areReactionsEnabled", "canReactToMessage", "isLastSentMessage", "canReceiveReadEvents", "mode"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i6.AsyncPipe } });
3832
+ MessageListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageListComponent, selector: "stream-message-list", inputs: { messageTemplate: "messageTemplate", messageInputTemplate: "messageInputTemplate", mentionTemplate: "mentionTemplate", typingIndicatorTemplate: "typingIndicatorTemplate", areReactionsEnabled: "areReactionsEnabled", enabledMessageActionsInput: ["enabledMessageActions", "enabledMessageActionsInput"], mode: "mode" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "parentMessageElement", first: true, predicate: ["parentMessageElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #scrollContainer\n data-testid=\"scroll-container\"\n class=\"str-chat__list\"\n (scroll)=\"scrolled()\"\n>\n <div class=\"str-chat__reverse-infinite-scroll\">\n <ul class=\"str-chat__ul\">\n <li\n #parentMessageElement\n *ngIf=\"mode === 'thread'\"\n data-testid=\"parent-message\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: parentMessage }\n \"\n ></ng-container>\n <div class=\"str-chat__thread-start\" translate>\n streamChat.Start of a new thread\n </div>\n </li>\n <li\n data-testclass=\"message\"\n *ngFor=\"\n let message of messages$ | async;\n let i = index;\n trackBy: trackByMessageId\n \"\n class=\"str-chat__li str-chat__li--{{ groupStyles[i] }}\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: message }\n \"\n ></ng-container>\n </li>\n </ul>\n <ng-container *ngIf=\"typingIndicatorTemplate; else defaultTypingIndicator\">\n <ng-container\n *ngTemplateOutlet=\"\n typingIndicatorTemplate;\n context: { usersTyping$: usersTyping$ }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultTypingIndicator>\n <div\n *ngIf=\"(usersTyping$ | async)?.length\"\n data-testid=\"typing-indicator\"\n class=\"str-chat__typing-indicator str-chat__typing-indicator--typing\"\n >\n <stream-avatar\n *ngFor=\"let user of usersTyping$ | async; trackBy: trackByUserId\"\n [name]=\"user.name || user.id\"\n [imageUrl]=\"user.image\"\n ></stream-avatar>\n <div class=\"str-chat__typing-indicator__dots\">\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n </div>\n </div>\n </ng-template>\n </div>\n</div>\n<div class=\"str-chat__list-notifications\">\n <button\n data-testid=\"scroll-to-bottom\"\n *ngIf=\"isUserScrolledUp\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-right\n str-chat__message-notification-scroll-down\n \"\n (keyup.enter)=\"scrollToBottom()\"\n (click)=\"scrollToBottom()\"\n >\n <div\n *ngIf=\"unreadMessageCount > 0\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-scroll-down-unread-count\n \"\n >\n {{ unreadMessageCount }}\n </div>\n </button>\n</div>\n\n<ng-template #messageTemplateContainer let-message=\"message\">\n <ng-container *ngIf=\"messageTemplate; else defaultMessageTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplate;\n context: {\n message: message,\n areReactionsEnabled: areReactionsEnabled,\n canReactToMessage: canReactToMessage,\n lastSentMessageId: !!(\n lastSentMessageId && message?.id === lastSentMessageId\n ),\n canReceiveReadEvents: canReceiveReadEvents,\n messageInputTemplate: messageInputTemplate,\n mentionTemplate: mentionTemplate,\n mode: mode,\n enabledMessageActions: enabledMessageActions\n }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultMessageTemplate>\n <stream-message\n [message]=\"message\"\n [areReactionsEnabled]=\"areReactionsEnabled\"\n [canReactToMessage]=\"canReactToMessage\"\n [isLastSentMessage]=\"\n !!(lastSentMessageId && message?.id === lastSentMessageId)\n \"\n [enabledMessageActions]=\"enabledMessageActions\"\n [canReceiveReadEvents]=\"canReceiveReadEvents\"\n [messageInputTemplate]=\"messageInputTemplate\"\n [mentionTemplate]=\"mentionTemplate\"\n [mode]=\"mode\"\n ></stream-message>\n </ng-template>\n</ng-template>\n", components: [{ type: AvatarComponent, selector: "stream-avatar", inputs: ["name", "imageUrl", "size"] }, { type: MessageComponent, selector: "stream-message", inputs: ["messageInputTemplate", "mentionTemplate", "message", "enabledMessageActions", "areReactionsEnabled", "canReactToMessage", "isLastSentMessage", "canReceiveReadEvents", "mode"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i6.AsyncPipe } });
3771
3833
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageListComponent, decorators: [{
3772
3834
  type: Component,
3773
3835
  args: [{