@odx/angular 5.3.4 → 5.5.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/CHANGELOG.md +18 -0
- package/components/footer/README.md +3 -0
- package/components/footer/index.d.ts +3 -0
- package/components/footer/lib/footer.component.d.ts +23 -0
- package/components/footer/lib/footer.config.d.ts +30 -0
- package/components/footer/lib/footer.i18n.d.ts +3 -0
- package/components/footer/lib/helpers/create-footer-links.d.ts +12 -0
- package/components/footer/lib/helpers/index.d.ts +1 -0
- package/components/footer/lib/models/footer-link.d.ts +4 -0
- package/components/footer/lib/models/footer-variant.d.ts +5 -0
- package/components/footer/lib/models/index.d.ts +2 -0
- package/components/header/lib/header.component.d.ts +1 -1
- package/components/header-navigation/README.md +3 -0
- package/components/header-navigation/index.d.ts +3 -0
- package/components/header-navigation/lib/directives/header-navigation-link.directive.d.ts +11 -0
- package/components/header-navigation/lib/directives/index.d.ts +1 -0
- package/components/header-navigation/lib/header-navigation.component.d.ts +8 -0
- package/components/header-navigation/lib/header-navigation.module.d.ts +9 -0
- package/components/main-menu/lib/helpers/create-main-menu-links.d.ts +2 -1
- package/components/main-menu/lib/main-menu.component.d.ts +5 -5
- package/components/main-menu/lib/main-menu.config.d.ts +1 -0
- package/components/notification/README.md +3 -0
- package/components/notification/index.d.ts +7 -0
- package/components/notification/lib/components/index.d.ts +2 -0
- package/components/notification/lib/components/notification-center/notification-center.component.d.ts +19 -0
- package/components/notification/lib/components/notification-item/notification-item.component.d.ts +37 -0
- package/components/notification/lib/directives/index.d.ts +1 -0
- package/components/notification/lib/directives/notification-center.directive.d.ts +69 -0
- package/components/notification/lib/features/index.d.ts +5 -0
- package/components/notification/lib/features/with-browser-notifications.d.ts +17 -0
- package/components/notification/lib/features/with-load-notifications.d.ts +18 -0
- package/components/notification/lib/features/with-notification-transformer.d.ts +26 -0
- package/components/notification/lib/features/with-peristent-notifications.d.ts +63 -0
- package/components/notification/lib/features/with-save-notifications.d.ts +11 -0
- package/components/notification/lib/helpers/get-notifications-by-tag.d.ts +2 -0
- package/components/notification/lib/helpers/index.d.ts +3 -0
- package/components/notification/lib/helpers/sort-notifications.d.ts +3 -0
- package/components/notification/lib/helpers/to-notification-collection.d.ts +3 -0
- package/components/notification/lib/models/index.d.ts +8 -0
- package/components/notification/lib/models/notification-action.d.ts +2 -0
- package/components/notification/lib/models/notification-collection.d.ts +6 -0
- package/components/notification/lib/models/notification-feature.d.ts +5 -0
- package/components/notification/lib/models/notification-options.d.ts +7 -0
- package/components/notification/lib/models/notification-query.d.ts +2 -0
- package/components/notification/lib/models/notification-sort-fn.d.ts +2 -0
- package/components/notification/lib/models/notification.d.ts +6 -0
- package/components/notification/lib/models/notification.ref.d.ts +9 -0
- package/components/notification/lib/notification.config.d.ts +11 -0
- package/components/notification/lib/notification.i18n.d.ts +3 -0
- package/components/notification/lib/notification.logger.d.ts +3 -0
- package/components/notification/lib/notification.service.d.ts +110 -0
- package/components/notification/lib/notification.tokens.d.ts +4 -0
- package/components/notification/lib/services/index.d.ts +1 -0
- package/components/notification/lib/services/notification-center.service.d.ts +69 -0
- package/components/notification/testing/README.md +3 -0
- package/components/notification/testing/index.d.ts +1 -0
- package/components/notification/testing/lib/test-helpers.d.ts +5 -0
- package/components/toast/lib/toast.service.d.ts +30 -2
- package/esm2022/breakpoints/lib/directives/match-breakpoints.directive.mjs +3 -2
- package/esm2022/components/footer/index.mjs +4 -0
- package/esm2022/components/footer/lib/footer.component.mjs +51 -0
- package/esm2022/components/footer/lib/footer.config.mjs +29 -0
- package/esm2022/components/footer/lib/footer.i18n.mjs +19 -0
- package/esm2022/components/footer/lib/helpers/create-footer-links.mjs +25 -0
- package/esm2022/components/footer/lib/helpers/index.mjs +2 -0
- package/esm2022/components/footer/lib/models/footer-link.mjs +2 -0
- package/esm2022/components/footer/lib/models/footer-variant.mjs +5 -0
- package/esm2022/components/footer/lib/models/index.mjs +3 -0
- package/esm2022/components/footer/odx-angular-components-footer.mjs +5 -0
- package/esm2022/components/header/lib/header.component.mjs +3 -3
- package/esm2022/components/header-navigation/index.mjs +4 -0
- package/esm2022/components/header-navigation/lib/directives/header-navigation-link.directive.mjs +37 -0
- package/esm2022/components/header-navigation/lib/directives/index.mjs +2 -0
- package/esm2022/components/header-navigation/lib/header-navigation.component.mjs +28 -0
- package/esm2022/components/header-navigation/lib/header-navigation.module.mjs +19 -0
- package/esm2022/components/header-navigation/odx-angular-components-header-navigation.mjs +5 -0
- package/esm2022/components/main-menu/lib/helpers/create-main-menu-links.mjs +7 -4
- package/esm2022/components/main-menu/lib/main-menu.component.mjs +9 -11
- package/esm2022/components/main-menu/lib/main-menu.config.mjs +1 -1
- package/esm2022/components/notification/index.mjs +8 -0
- package/esm2022/components/notification/lib/components/index.mjs +3 -0
- package/esm2022/components/notification/lib/components/notification-center/notification-center.component.mjs +65 -0
- package/esm2022/components/notification/lib/components/notification-item/notification-item.component.mjs +65 -0
- package/esm2022/components/notification/lib/directives/index.mjs +2 -0
- package/esm2022/components/notification/lib/directives/notification-center.directive.mjs +142 -0
- package/esm2022/components/notification/lib/features/index.mjs +6 -0
- package/esm2022/components/notification/lib/features/with-browser-notifications.mjs +75 -0
- package/esm2022/components/notification/lib/features/with-load-notifications.mjs +45 -0
- package/esm2022/components/notification/lib/features/with-notification-transformer.mjs +34 -0
- package/esm2022/components/notification/lib/features/with-peristent-notifications.mjs +94 -0
- package/esm2022/components/notification/lib/features/with-save-notifications.mjs +45 -0
- package/esm2022/components/notification/lib/helpers/get-notifications-by-tag.mjs +7 -0
- package/esm2022/components/notification/lib/helpers/index.mjs +4 -0
- package/esm2022/components/notification/lib/helpers/sort-notifications.mjs +10 -0
- package/esm2022/components/notification/lib/helpers/to-notification-collection.mjs +9 -0
- package/esm2022/components/notification/lib/models/index.mjs +9 -0
- package/esm2022/components/notification/lib/models/notification-action.mjs +2 -0
- package/esm2022/components/notification/lib/models/notification-collection.mjs +2 -0
- package/esm2022/components/notification/lib/models/notification-feature.mjs +4 -0
- package/esm2022/components/notification/lib/models/notification-options.mjs +2 -0
- package/esm2022/components/notification/lib/models/notification-query.mjs +2 -0
- package/esm2022/components/notification/lib/models/notification-sort-fn.mjs +2 -0
- package/esm2022/components/notification/lib/models/notification.mjs +2 -0
- package/esm2022/components/notification/lib/models/notification.ref.mjs +2 -0
- package/esm2022/components/notification/lib/notification.config.mjs +11 -0
- package/esm2022/components/notification/lib/notification.i18n.mjs +11 -0
- package/esm2022/components/notification/lib/notification.logger.mjs +3 -0
- package/esm2022/components/notification/lib/notification.service.mjs +168 -0
- package/esm2022/components/notification/lib/notification.tokens.mjs +7 -0
- package/esm2022/components/notification/lib/services/index.mjs +2 -0
- package/esm2022/components/notification/lib/services/notification-center.service.mjs +96 -0
- package/esm2022/components/notification/odx-angular-components-notification.mjs +5 -0
- package/esm2022/components/notification/testing/index.mjs +2 -0
- package/esm2022/components/notification/testing/lib/test-helpers.mjs +33 -0
- package/esm2022/components/notification/testing/odx-angular-components-notification-testing.mjs +5 -0
- package/esm2022/components/toast/lib/components/toast-container/toast-container.component.mjs +6 -6
- package/esm2022/components/toast/lib/toast.service.mjs +38 -8
- package/esm2022/utils/lib/helpers/array.mjs +24 -1
- package/esm2022/utils/lib/helpers/build-website-url.mjs +24 -1
- package/fesm2022/odx-angular-breakpoints.mjs +2 -1
- package/fesm2022/odx-angular-breakpoints.mjs.map +1 -1
- package/fesm2022/odx-angular-components-footer.mjs +131 -0
- package/fesm2022/odx-angular-components-footer.mjs.map +1 -0
- package/fesm2022/odx-angular-components-header-navigation.mjs +84 -0
- package/fesm2022/odx-angular-components-header-navigation.mjs.map +1 -0
- package/fesm2022/odx-angular-components-header.mjs +2 -2
- package/fesm2022/odx-angular-components-header.mjs.map +1 -1
- package/fesm2022/odx-angular-components-main-menu.mjs +11 -9
- package/fesm2022/odx-angular-components-main-menu.mjs.map +1 -1
- package/fesm2022/odx-angular-components-notification-testing.mjs +39 -0
- package/fesm2022/odx-angular-components-notification-testing.mjs.map +1 -0
- package/fesm2022/odx-angular-components-notification.mjs +832 -0
- package/fesm2022/odx-angular-components-notification.mjs.map +1 -0
- package/fesm2022/odx-angular-components-toast.mjs +42 -11
- package/fesm2022/odx-angular-components-toast.mjs.map +1 -1
- package/fesm2022/odx-angular-utils.mjs +46 -0
- package/fesm2022/odx-angular-utils.mjs.map +1 -1
- package/package.json +25 -1
- package/utils/lib/helpers/array.d.ts +23 -0
- package/utils/lib/helpers/build-website-url.d.ts +23 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { DestroyRef, Directive, Input, Output, inject } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { DisabledController } from '@odx/angular';
|
|
4
|
+
import { BadgeDirective } from '@odx/angular/components/badge';
|
|
5
|
+
import { DropdownDirective } from '@odx/angular/components/dropdown';
|
|
6
|
+
import { Position } from '@odx/angular/utils';
|
|
7
|
+
import { map, merge, startWith, switchMap, tap } from 'rxjs';
|
|
8
|
+
import { NotificationCenterComponent } from '../components';
|
|
9
|
+
import { NotificationCenterService } from '../services';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@odx/angular/components/badge";
|
|
12
|
+
import * as i2 from "@odx/angular/components/dropdown";
|
|
13
|
+
/**
|
|
14
|
+
* A directive that provides an interface for managing notifications.
|
|
15
|
+
* It allows configuring a notification center with dynamic content, sorting, and badge display functionalities.
|
|
16
|
+
*/
|
|
17
|
+
export class NotificationCenterDirective {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.badgeDirective = inject(BadgeDirective, { self: true });
|
|
20
|
+
this.destroyRef = inject(DestroyRef);
|
|
21
|
+
this.disabledController = DisabledController.inject();
|
|
22
|
+
this.dropdownDirective = inject(DropdownDirective, { self: true });
|
|
23
|
+
this.notificationCenterService = inject(NotificationCenterService, { self: true });
|
|
24
|
+
this.dropdownStateChange$ = merge(this.dropdownDirective.beforeOpen, this.dropdownDirective.beforeClose).pipe(startWith(void 0));
|
|
25
|
+
this.badgeValue$ = this.notificationCenterService.unseenNotifications$.pipe(switchMap(({ count }) => this.dropdownStateChange$.pipe(map(() => this.formatBadgeValue(count)))));
|
|
26
|
+
/**
|
|
27
|
+
* An event that is emitted when a new notification is added.
|
|
28
|
+
* Listeners can use this event to react to new notifications being added to the notification center.
|
|
29
|
+
*/
|
|
30
|
+
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
31
|
+
this.notificationAdd = this.notificationCenterService.onNotificationAdd$;
|
|
32
|
+
/**
|
|
33
|
+
* An event that is emitted when a notification is updated.
|
|
34
|
+
* This can be used to react to changes in notifications, such as their read status or content updates.
|
|
35
|
+
*/
|
|
36
|
+
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
37
|
+
this.notificationUpdate = this.notificationCenterService.onNotificationUpdate$;
|
|
38
|
+
/**
|
|
39
|
+
* An event that is emitted when a notification is removed from the notification center.
|
|
40
|
+
* Use this event to handle the removal of notifications, such as cleaning up resources or updating UI elements.
|
|
41
|
+
*/
|
|
42
|
+
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
43
|
+
this.notificationRemove = this.notificationCenterService.onNotificationRemove$;
|
|
44
|
+
/**
|
|
45
|
+
* An event that is emitted when a notification is marked as seen.
|
|
46
|
+
* This event can be used to perform actions when the user acknowledges a notification.
|
|
47
|
+
*/
|
|
48
|
+
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
49
|
+
this.notificationSeen = this.notificationCenterService.onNotificationSeen$;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Sets the tag for filtering notifications. Only notifications with this tag will be shown in the notification center.
|
|
53
|
+
* @param value The tag value to filter notifications. If null, all notifications are shown.
|
|
54
|
+
*/
|
|
55
|
+
set tag(value) {
|
|
56
|
+
this.notificationCenterService.setTag(value);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Sets the title of the notification center. The title can be dynamic and change based on the application state.
|
|
60
|
+
* @param value The title content, which can be a string or an Observable returning a string. Allows for dynamic titles.
|
|
61
|
+
*/
|
|
62
|
+
set title(value) {
|
|
63
|
+
this.notificationCenterService.setTitle(value);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Sets the sorting function used to order notifications within the notification center.
|
|
67
|
+
* @param value A function that compares two notifications and returns the sort order.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* sortFfn = (a: NotificationRef, b: NotificationRef) => {
|
|
71
|
+
if (a.createdAt < b.createdAt) return -1;
|
|
72
|
+
if (a.createdAt > b.createdAt) return 1;
|
|
73
|
+
return 0;
|
|
74
|
+
};
|
|
75
|
+
*/
|
|
76
|
+
set sortFn(value) {
|
|
77
|
+
this.notificationCenterService.setSortFn(value);
|
|
78
|
+
}
|
|
79
|
+
ngOnInit() {
|
|
80
|
+
this.badgeDirective.position = Position.BOTTOM;
|
|
81
|
+
this.badgeDirective.offset = 6;
|
|
82
|
+
this.dropdownDirective.content = NotificationCenterComponent;
|
|
83
|
+
this.dropdownDirective.options = {
|
|
84
|
+
containerClass: 'odx-notification-center-overlay',
|
|
85
|
+
position: Position.BOTTOM_END,
|
|
86
|
+
enableFallback: false,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
ngAfterViewInit() {
|
|
90
|
+
merge(this.handleBadgeUpdates(), this.handleDropdownUpdates()).pipe(takeUntilDestroyed(this.destroyRef)).subscribe();
|
|
91
|
+
}
|
|
92
|
+
formatBadgeValue(value) {
|
|
93
|
+
return this.dropdownDirective.isOpen || value === 0 ? null : value.toFixed(0);
|
|
94
|
+
}
|
|
95
|
+
handleBadgeUpdates() {
|
|
96
|
+
return this.badgeValue$.pipe(tap((value) => {
|
|
97
|
+
this.badgeDirective.value = value;
|
|
98
|
+
this.badgeDirective.ngOnChanges();
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
handleDropdownUpdates() {
|
|
102
|
+
return this.notificationCenterService.notifications$.pipe(tap(({ isEmpty }) => {
|
|
103
|
+
this.disabledController?.setDisabledState(isEmpty);
|
|
104
|
+
if (!isEmpty)
|
|
105
|
+
return;
|
|
106
|
+
this.dropdownDirective.close();
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationCenterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
110
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: NotificationCenterDirective, isStandalone: true, selector: "[odxNotificationCenter]", inputs: { tag: ["odxNotificationCenter", "tag"], title: ["odxNotificationCenterTitle", "title"], sortFn: ["odxNotificationCenterSortFn", "sortFn"] }, outputs: { notificationAdd: "odxNotificationCenterAdd", notificationUpdate: "odxNotificationCenterUpdate", notificationRemove: "odxNotificationCenterRemove", notificationSeen: "odxNotificationCenterSeen" }, providers: [NotificationCenterService], hostDirectives: [{ directive: i1.BadgeDirective, inputs: ["odxBadgeVariant", "odxNotificationCenterBadgeVariant"] }, { directive: i2.DropdownDirective }], ngImport: i0 }); }
|
|
111
|
+
}
|
|
112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationCenterDirective, decorators: [{
|
|
113
|
+
type: Directive,
|
|
114
|
+
args: [{
|
|
115
|
+
standalone: true,
|
|
116
|
+
selector: '[odxNotificationCenter]',
|
|
117
|
+
hostDirectives: [{ directive: BadgeDirective, inputs: ['odxBadgeVariant:odxNotificationCenterBadgeVariant'] }, DropdownDirective],
|
|
118
|
+
providers: [NotificationCenterService],
|
|
119
|
+
}]
|
|
120
|
+
}], propDecorators: { tag: [{
|
|
121
|
+
type: Input,
|
|
122
|
+
args: ['odxNotificationCenter']
|
|
123
|
+
}], title: [{
|
|
124
|
+
type: Input,
|
|
125
|
+
args: ['odxNotificationCenterTitle']
|
|
126
|
+
}], sortFn: [{
|
|
127
|
+
type: Input,
|
|
128
|
+
args: ['odxNotificationCenterSortFn']
|
|
129
|
+
}], notificationAdd: [{
|
|
130
|
+
type: Output,
|
|
131
|
+
args: ['odxNotificationCenterAdd']
|
|
132
|
+
}], notificationUpdate: [{
|
|
133
|
+
type: Output,
|
|
134
|
+
args: ['odxNotificationCenterUpdate']
|
|
135
|
+
}], notificationRemove: [{
|
|
136
|
+
type: Output,
|
|
137
|
+
args: ['odxNotificationCenterRemove']
|
|
138
|
+
}], notificationSeen: [{
|
|
139
|
+
type: Output,
|
|
140
|
+
args: ['odxNotificationCenterSeen']
|
|
141
|
+
}] } });
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWNlbnRlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9kaXJlY3RpdmVzL25vdGlmaWNhdGlvbi1jZW50ZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQWMsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7O0FBRXhEOzs7R0FHRztBQU9ILE1BQU0sT0FBTywyQkFBMkI7SUFOeEM7UUFPbUIsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyx1QkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqRCxzQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RCw4QkFBeUIsR0FBRyxNQUFNLENBQUMseUJBQXlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RSx5QkFBb0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUgsZ0JBQVcsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUNyRixTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2xHLENBQUM7UUFvQ0Y7OztXQUdHO1FBQ0gsNERBQTREO1FBRXJELG9CQUFlLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGtCQUFrQixDQUFDO1FBRTNFOzs7V0FHRztRQUNILDREQUE0RDtRQUVyRCx1QkFBa0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMscUJBQXFCLENBQUM7UUFFakY7OztXQUdHO1FBQ0gsNERBQTREO1FBRXJELHVCQUFrQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsQ0FBQztRQUVqRjs7O1dBR0c7UUFDSCw0REFBNEQ7UUFFckQscUJBQWdCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDO0tBd0M5RTtJQXhHQzs7O09BR0c7SUFDSCxJQUNXLEdBQUcsQ0FBQyxLQUFvQjtRQUNqQyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNXLEtBQUssQ0FBQyxLQUFnQztRQUMvQyxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsSUFDVyxNQUFNLENBQUMsS0FBeUI7UUFDekMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBa0NNLFFBQVE7UUFDYixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUUvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxHQUFHLDJCQUEyQixDQUFDO1FBQzdELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUc7WUFDL0IsY0FBYyxFQUFFLGlDQUFpQztZQUNqRCxRQUFRLEVBQUUsUUFBUSxDQUFDLFVBQVU7WUFDN0IsY0FBYyxFQUFFLEtBQUs7U0FDdEIsQ0FBQztJQUNKLENBQUM7SUFFTSxlQUFlO1FBQ3BCLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2SCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsS0FBYTtRQUNwQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDMUIsR0FBRyxDQUFDLENBQUMsS0FBZ0MsRUFBRSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLEtBQTJCLENBQUM7WUFDeEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUN2RCxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU87WUFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOytHQWxIVSwyQkFBMkI7bUdBQTNCLDJCQUEyQiwyYUFGM0IsQ0FBQyx5QkFBeUIsQ0FBQzs7NEZBRTNCLDJCQUEyQjtrQkFOdkMsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLHlCQUF5QjtvQkFDbkMsY0FBYyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDLG1EQUFtRCxDQUFDLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQztvQkFDakksU0FBUyxFQUFFLENBQUMseUJBQXlCLENBQUM7aUJBQ3ZDOzhCQWlCWSxHQUFHO3NCQURiLEtBQUs7dUJBQUMsdUJBQXVCO2dCQVVuQixLQUFLO3NCQURmLEtBQUs7dUJBQUMsNEJBQTRCO2dCQWlCeEIsTUFBTTtzQkFEaEIsS0FBSzt1QkFBQyw2QkFBNkI7Z0JBVzdCLGVBQWU7c0JBRHJCLE1BQU07dUJBQUMsMEJBQTBCO2dCQVMzQixrQkFBa0I7c0JBRHhCLE1BQU07dUJBQUMsNkJBQTZCO2dCQVM5QixrQkFBa0I7c0JBRHhCLE1BQU07dUJBQUMsNkJBQTZCO2dCQVM5QixnQkFBZ0I7c0JBRHRCLE1BQU07dUJBQUMsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGVzdHJveVJlZiwgRGlyZWN0aXZlLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRGlzYWJsZWRDb250cm9sbGVyIH0gZnJvbSAnQG9keC9hbmd1bGFyJztcbmltcG9ydCB7IER5bmFtaWNUZXh0Q29udGVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jZGsvZHluYW1pYy12aWV3JztcbmltcG9ydCB7IEJhZGdlRGlyZWN0aXZlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvYmFkZ2UnO1xuaW1wb3J0IHsgRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9kcm9wZG93bic7XG5pbXBvcnQgeyBQb3NpdGlvbiB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtYXAsIG1lcmdlLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25DZW50ZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNvcnRGbiB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25DZW50ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHRoYXQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBtYW5hZ2luZyBub3RpZmljYXRpb25zLlxuICogSXQgYWxsb3dzIGNvbmZpZ3VyaW5nIGEgbm90aWZpY2F0aW9uIGNlbnRlciB3aXRoIGR5bmFtaWMgY29udGVudCwgc29ydGluZywgYW5kIGJhZGdlIGRpc3BsYXkgZnVuY3Rpb25hbGl0aWVzLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbb2R4Tm90aWZpY2F0aW9uQ2VudGVyXScsXG4gIGhvc3REaXJlY3RpdmVzOiBbeyBkaXJlY3RpdmU6IEJhZGdlRGlyZWN0aXZlLCBpbnB1dHM6IFsnb2R4QmFkZ2VWYXJpYW50Om9keE5vdGlmaWNhdGlvbkNlbnRlckJhZGdlVmFyaWFudCddIH0sIERyb3Bkb3duRGlyZWN0aXZlXSxcbiAgcHJvdmlkZXJzOiBbTm90aWZpY2F0aW9uQ2VudGVyU2VydmljZV0sXG59KVxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbkNlbnRlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFkZ2VEaXJlY3RpdmUgPSBpbmplY3QoQmFkZ2VEaXJlY3RpdmUsIHsgc2VsZjogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2FibGVkQ29udHJvbGxlciA9IERpc2FibGVkQ29udHJvbGxlci5pbmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wZG93bkRpcmVjdGl2ZSA9IGluamVjdChEcm9wZG93bkRpcmVjdGl2ZSwgeyBzZWxmOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvbkNlbnRlclNlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uQ2VudGVyU2VydmljZSwgeyBzZWxmOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bkb3duU3RhdGVDaGFuZ2UkID0gbWVyZ2UodGhpcy5kcm9wZG93bkRpcmVjdGl2ZS5iZWZvcmVPcGVuLCB0aGlzLmRyb3Bkb3duRGlyZWN0aXZlLmJlZm9yZUNsb3NlKS5waXBlKHN0YXJ0V2l0aCh2b2lkIDApKTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYWRnZVZhbHVlJCA9IHRoaXMubm90aWZpY2F0aW9uQ2VudGVyU2VydmljZS51bnNlZW5Ob3RpZmljYXRpb25zJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoeyBjb3VudCB9KSA9PiB0aGlzLmRyb3Bkb3duU3RhdGVDaGFuZ2UkLnBpcGUobWFwKCgpID0+IHRoaXMuZm9ybWF0QmFkZ2VWYWx1ZShjb3VudCkpKSksXG4gICk7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRhZyBmb3IgZmlsdGVyaW5nIG5vdGlmaWNhdGlvbnMuIE9ubHkgbm90aWZpY2F0aW9ucyB3aXRoIHRoaXMgdGFnIHdpbGwgYmUgc2hvd24gaW4gdGhlIG5vdGlmaWNhdGlvbiBjZW50ZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdGFnIHZhbHVlIHRvIGZpbHRlciBub3RpZmljYXRpb25zLiBJZiBudWxsLCBhbGwgbm90aWZpY2F0aW9ucyBhcmUgc2hvd24uXG4gICAqL1xuICBASW5wdXQoJ29keE5vdGlmaWNhdGlvbkNlbnRlcicpXG4gIHB1YmxpYyBzZXQgdGFnKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXJTZXJ2aWNlLnNldFRhZyh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBjZW50ZXIuIFRoZSB0aXRsZSBjYW4gYmUgZHluYW1pYyBhbmQgY2hhbmdlIGJhc2VkIG9uIHRoZSBhcHBsaWNhdGlvbiBzdGF0ZS5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB0aXRsZSBjb250ZW50LCB3aGljaCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gT2JzZXJ2YWJsZSByZXR1cm5pbmcgYSBzdHJpbmcuIEFsbG93cyBmb3IgZHluYW1pYyB0aXRsZXMuXG4gICAqL1xuICBASW5wdXQoJ29keE5vdGlmaWNhdGlvbkNlbnRlclRpdGxlJylcbiAgcHVibGljIHNldCB0aXRsZSh2YWx1ZTogRHluYW1pY1RleHRDb250ZW50IHwgbnVsbCkge1xuICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyU2VydmljZS5zZXRUaXRsZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc29ydGluZyBmdW5jdGlvbiB1c2VkIHRvIG9yZGVyIG5vdGlmaWNhdGlvbnMgd2l0aGluIHRoZSBub3RpZmljYXRpb24gY2VudGVyLlxuICAgKiBAcGFyYW0gdmFsdWUgQSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHR3byBub3RpZmljYXRpb25zIGFuZCByZXR1cm5zIHRoZSBzb3J0IG9yZGVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgc29ydEZmbiA9IChhOiBOb3RpZmljYXRpb25SZWYsIGI6IE5vdGlmaWNhdGlvblJlZikgPT4ge1xuICAgICAgICBpZiAoYS5jcmVhdGVkQXQgPCBiLmNyZWF0ZWRBdCkgcmV0dXJuIC0xO1xuICAgICAgICBpZiAoYS5jcmVhdGVkQXQgPiBiLmNyZWF0ZWRBdCkgcmV0dXJuIDE7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfTtcbiAgICovXG4gIEBJbnB1dCgnb2R4Tm90aWZpY2F0aW9uQ2VudGVyU29ydEZuJylcbiAgcHVibGljIHNldCBzb3J0Rm4odmFsdWU6IE5vdGlmaWNhdGlvblNvcnRGbikge1xuICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyU2VydmljZS5zZXRTb3J0Rm4odmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIGEgbmV3IG5vdGlmaWNhdGlvbiBpcyBhZGRlZC5cbiAgICogTGlzdGVuZXJzIGNhbiB1c2UgdGhpcyBldmVudCB0byByZWFjdCB0byBuZXcgbm90aWZpY2F0aW9ucyBiZWluZyBhZGRlZCB0byB0aGUgbm90aWZpY2F0aW9uIGNlbnRlci5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LXJlbmFtZVxuICBAT3V0cHV0KCdvZHhOb3RpZmljYXRpb25DZW50ZXJBZGQnKVxuICBwdWJsaWMgbm90aWZpY2F0aW9uQWRkID0gdGhpcy5ub3RpZmljYXRpb25DZW50ZXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uQWRkJDtcblxuICAvKipcbiAgICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gYSBub3RpZmljYXRpb24gaXMgdXBkYXRlZC5cbiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIG5vdGlmaWNhdGlvbnMsIHN1Y2ggYXMgdGhlaXIgcmVhZCBzdGF0dXMgb3IgY29udGVudCB1cGRhdGVzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtcmVuYW1lXG4gIEBPdXRwdXQoJ29keE5vdGlmaWNhdGlvbkNlbnRlclVwZGF0ZScpXG4gIHB1YmxpYyBub3RpZmljYXRpb25VcGRhdGUgPSB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlclNlcnZpY2Uub25Ob3RpZmljYXRpb25VcGRhdGUkO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBhIG5vdGlmaWNhdGlvbiBpcyByZW1vdmVkIGZyb20gdGhlIG5vdGlmaWNhdGlvbiBjZW50ZXIuXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGhhbmRsZSB0aGUgcmVtb3ZhbCBvZiBub3RpZmljYXRpb25zLCBzdWNoIGFzIGNsZWFuaW5nIHVwIHJlc291cmNlcyBvciB1cGRhdGluZyBVSSBlbGVtZW50cy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LXJlbmFtZVxuICBAT3V0cHV0KCdvZHhOb3RpZmljYXRpb25DZW50ZXJSZW1vdmUnKVxuICBwdWJsaWMgbm90aWZpY2F0aW9uUmVtb3ZlID0gdGhpcy5ub3RpZmljYXRpb25DZW50ZXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uUmVtb3ZlJDtcblxuICAvKipcbiAgICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gYSBub3RpZmljYXRpb24gaXMgbWFya2VkIGFzIHNlZW4uXG4gICAqIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBhY3Rpb25zIHdoZW4gdGhlIHVzZXIgYWNrbm93bGVkZ2VzIGEgbm90aWZpY2F0aW9uLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtcmVuYW1lXG4gIEBPdXRwdXQoJ29keE5vdGlmaWNhdGlvbkNlbnRlclNlZW4nKVxuICBwdWJsaWMgbm90aWZpY2F0aW9uU2VlbiA9IHRoaXMubm90aWZpY2F0aW9uQ2VudGVyU2VydmljZS5vbk5vdGlmaWNhdGlvblNlZW4kO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmJhZGdlRGlyZWN0aXZlLnBvc2l0aW9uID0gUG9zaXRpb24uQk9UVE9NO1xuICAgIHRoaXMuYmFkZ2VEaXJlY3RpdmUub2Zmc2V0ID0gNjtcblxuICAgIHRoaXMuZHJvcGRvd25EaXJlY3RpdmUuY29udGVudCA9IE5vdGlmaWNhdGlvbkNlbnRlckNvbXBvbmVudDtcbiAgICB0aGlzLmRyb3Bkb3duRGlyZWN0aXZlLm9wdGlvbnMgPSB7XG4gICAgICBjb250YWluZXJDbGFzczogJ29keC1ub3RpZmljYXRpb24tY2VudGVyLW92ZXJsYXknLFxuICAgICAgcG9zaXRpb246IFBvc2l0aW9uLkJPVFRPTV9FTkQsXG4gICAgICBlbmFibGVGYWxsYmFjazogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgbWVyZ2UodGhpcy5oYW5kbGVCYWRnZVVwZGF0ZXMoKSwgdGhpcy5oYW5kbGVEcm9wZG93blVwZGF0ZXMoKSkucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEJhZGdlVmFsdWUodmFsdWU6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duRGlyZWN0aXZlLmlzT3BlbiB8fCB2YWx1ZSA9PT0gMCA/IG51bGwgOiB2YWx1ZS50b0ZpeGVkKDApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVCYWRnZVVwZGF0ZXMoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFkZ2VWYWx1ZSQucGlwZShcbiAgICAgIHRhcCgodmFsdWU6IER5bmFtaWNUZXh0Q29udGVudCB8IG51bGwpID0+IHtcbiAgICAgICAgdGhpcy5iYWRnZURpcmVjdGl2ZS52YWx1ZSA9IHZhbHVlIGFzIER5bmFtaWNUZXh0Q29udGVudDtcbiAgICAgICAgdGhpcy5iYWRnZURpcmVjdGl2ZS5uZ09uQ2hhbmdlcygpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJvcGRvd25VcGRhdGVzKCk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlclNlcnZpY2Uubm90aWZpY2F0aW9ucyQucGlwZShcbiAgICAgIHRhcCgoeyBpc0VtcHR5IH0pID0+IHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZENvbnRyb2xsZXI/LnNldERpc2FibGVkU3RhdGUoaXNFbXB0eSk7XG4gICAgICAgIGlmICghaXNFbXB0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmRyb3Bkb3duRGlyZWN0aXZlLmNsb3NlKCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './with-browser-notifications';
|
|
2
|
+
export * from './with-load-notifications';
|
|
3
|
+
export * from './with-notification-transformer';
|
|
4
|
+
export * from './with-peristent-notifications';
|
|
5
|
+
export * from './with-save-notifications';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9mZWF0dXJlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3dpdGgtYnJvd3Nlci1ub3RpZmljYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vd2l0aC1sb2FkLW5vdGlmaWNhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi93aXRoLW5vdGlmaWNhdGlvbi10cmFuc2Zvcm1lcic7XG5leHBvcnQgKiBmcm9tICcuL3dpdGgtcGVyaXN0ZW50LW5vdGlmaWNhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi93aXRoLXNhdmUtbm90aWZpY2F0aW9ucyc7XG4iXX0=
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { ENVIRONMENT_INITIALIZER, inject } from '@angular/core';
|
|
2
|
+
import { makeNotificationFeature } from '../models';
|
|
3
|
+
import { NotificationService } from '../notification.service';
|
|
4
|
+
import { PersistentNotificationSerializer } from './with-peristent-notifications';
|
|
5
|
+
/**
|
|
6
|
+
* Requests permission to display browser notifications and returns a boolean indicating whether permission was granted.
|
|
7
|
+
* @async
|
|
8
|
+
* @function requestBrowserNotificationPermissions
|
|
9
|
+
* @returns {Promise<boolean>} A promise that resolves to `true` if permission is granted, otherwise `false`.
|
|
10
|
+
*/
|
|
11
|
+
async function requestBrowserNotificationPermissions() {
|
|
12
|
+
if (!('Notification' in window))
|
|
13
|
+
return false;
|
|
14
|
+
if (Notification.permission === 'granted')
|
|
15
|
+
return true;
|
|
16
|
+
if (Notification.permission === 'denied')
|
|
17
|
+
return false;
|
|
18
|
+
const permission = await Notification.requestPermission();
|
|
19
|
+
return permission === 'granted';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates a function responsible for sending out browser notifications with the given options.
|
|
23
|
+
* @function sendBrowserNotification
|
|
24
|
+
* @param {NotificationSerializer} serializer - The serializer to use for notification data.
|
|
25
|
+
* @param {BrowserNotificationExtras} [options] - Additional options for the browser notification.
|
|
26
|
+
* @returns {SendBrowserNotificationFn} A function to send browser notifications.
|
|
27
|
+
*/
|
|
28
|
+
function sendBrowserNotification(serializer, options) {
|
|
29
|
+
return async (notificationRef) => {
|
|
30
|
+
if (!('Notification' in window))
|
|
31
|
+
return;
|
|
32
|
+
const [notificationObj] = await serializer.deserialize(await serializer.serialize([notificationRef]));
|
|
33
|
+
if (!notificationObj || notificationObj.hasBeenSeen)
|
|
34
|
+
return;
|
|
35
|
+
const { createdAt, item } = notificationObj;
|
|
36
|
+
new Notification(item.title, {
|
|
37
|
+
tag: notificationRef.options.tags?.[0],
|
|
38
|
+
lang: notificationRef.options.language,
|
|
39
|
+
...options,
|
|
40
|
+
body: item.description,
|
|
41
|
+
timestamp: createdAt,
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Configures the application to send browser notifications, using Angular's `ENVIRONMENT_INITIALIZER` for setup.
|
|
47
|
+
* @function withBrowserNotifications
|
|
48
|
+
* @param {WithBrowserNotificationsOptions} [options] - Optional configuration for browser notifications.
|
|
49
|
+
* @returns {NotificationFeature} A notification feature for integration into the application environment.
|
|
50
|
+
*/
|
|
51
|
+
export function withBrowserNotifications(options) {
|
|
52
|
+
return makeNotificationFeature([
|
|
53
|
+
{
|
|
54
|
+
provide: ENVIRONMENT_INITIALIZER,
|
|
55
|
+
useFactory: () => {
|
|
56
|
+
const isEnabled = options?.isEnabled ?? true;
|
|
57
|
+
if (!isEnabled)
|
|
58
|
+
return () => void 0;
|
|
59
|
+
const notificationService = inject(NotificationService);
|
|
60
|
+
const serializer = new PersistentNotificationSerializer();
|
|
61
|
+
const sendBrowserNotificationFn = options?.sendFn ?? sendBrowserNotification(serializer, options?.extras);
|
|
62
|
+
return async () => {
|
|
63
|
+
if (!isEnabled)
|
|
64
|
+
return;
|
|
65
|
+
const permissionsGranted = await requestBrowserNotificationPermissions();
|
|
66
|
+
if (!permissionsGranted)
|
|
67
|
+
return;
|
|
68
|
+
notificationService.onNotificationAdd$.subscribe(sendBrowserNotificationFn);
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
multi: true,
|
|
72
|
+
},
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1icm93c2VyLW5vdGlmaWNhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9mZWF0dXJlcy93aXRoLWJyb3dzZXItbm90aWZpY2F0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBd0MsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUEwQixnQ0FBZ0MsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBYTFHOzs7OztHQUtHO0FBQ0gsS0FBSyxVQUFVLHFDQUFxQztJQUNsRCxJQUFJLENBQUMsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUMsSUFBSSxZQUFZLENBQUMsVUFBVSxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2RCxJQUFJLFlBQVksQ0FBQyxVQUFVLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3ZELE1BQU0sVUFBVSxHQUFHLE1BQU0sWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFFMUQsT0FBTyxVQUFVLEtBQUssU0FBUyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHVCQUF1QixDQUFDLFVBQWtDLEVBQUUsT0FBbUM7SUFDdEcsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLEVBQUU7UUFDL0IsSUFBSSxDQUFDLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQztZQUFFLE9BQU87UUFDeEMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLE1BQU0sVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEcsSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlLENBQUMsV0FBVztZQUFFLE9BQU87UUFDNUQsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUM7UUFDNUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQWUsRUFBRTtZQUNyQyxHQUFHLEVBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUTtZQUN0QyxHQUFHLE9BQU87WUFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQXFCO1lBQ2hDLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxPQUF5QztJQUNoRixPQUFPLHVCQUF1QixDQUFDO1FBQzdCO1lBQ0UsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxVQUFVLEVBQUUsR0FBRyxFQUFFO2dCQUNmLE1BQU0sU0FBUyxHQUFHLE9BQU8sRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsU0FBUztvQkFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLFVBQVUsR0FBRyxJQUFJLGdDQUFnQyxFQUFFLENBQUM7Z0JBQzFELE1BQU0seUJBQXlCLEdBQUcsT0FBTyxFQUFFLE1BQU0sSUFBSSx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUUxRyxPQUFPLEtBQUssSUFBSSxFQUFFO29CQUNoQixJQUFJLENBQUMsU0FBUzt3QkFBRSxPQUFPO29CQUN2QixNQUFNLGtCQUFrQixHQUFHLE1BQU0scUNBQXFDLEVBQUUsQ0FBQztvQkFDekUsSUFBSSxDQUFDLGtCQUFrQjt3QkFBRSxPQUFPO29CQUNoQyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FBQztnQkFDOUUsQ0FBQyxDQUFDO1lBQ0osQ0FBQztZQUNELEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WSVJPTk1FTlRfSU5JVElBTElaRVIsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uRmVhdHVyZSwgTm90aWZpY2F0aW9uUmVmLCBtYWtlTm90aWZpY2F0aW9uRmVhdHVyZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VyaWFsaXplciwgUGVyc2lzdGVudE5vdGlmaWNhdGlvblNlcmlhbGl6ZXIgfSBmcm9tICcuL3dpdGgtcGVyaXN0ZW50LW5vdGlmaWNhdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBCcm93c2VyTm90aWZpY2F0aW9uRXh0cmFzID0gT21pdDxOb3RpZmljYXRpb25PcHRpb25zLCAnYm9keScgfCAndGltZXN0YW1wJz47XG5leHBvcnQgdHlwZSBCcm93c2VyTm90aWZpY2F0aW9uID0gTm90aWZpY2F0aW9uO1xuZXhwb3J0IHR5cGUgQnJvd3Nlck5vdGlmaWNhdGlvbkZhY3RvcnkgPSAobm90aWZpY2F0aW9uUmVmOiBOb3RpZmljYXRpb25SZWYpID0+IEJyb3dzZXJOb3RpZmljYXRpb247XG5leHBvcnQgdHlwZSBTZW5kQnJvd3Nlck5vdGlmaWNhdGlvbkZuID0gKG5vdGlmaWNhdGlvblJlZjogTm90aWZpY2F0aW9uUmVmKSA9PiB1bmtub3duO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhCcm93c2VyTm90aWZpY2F0aW9uc09wdGlvbnMge1xuICBzZW5kRm4/OiBTZW5kQnJvd3Nlck5vdGlmaWNhdGlvbkZuO1xuICBleHRyYXM/OiBCcm93c2VyTm90aWZpY2F0aW9uRXh0cmFzO1xuICBpc0VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlcXVlc3RzIHBlcm1pc3Npb24gdG8gZGlzcGxheSBicm93c2VyIG5vdGlmaWNhdGlvbnMgYW5kIHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBwZXJtaXNzaW9uIHdhcyBncmFudGVkLlxuICogQGFzeW5jXG4gKiBAZnVuY3Rpb24gcmVxdWVzdEJyb3dzZXJOb3RpZmljYXRpb25QZXJtaXNzaW9uc1xuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGB0cnVlYCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0QnJvd3Nlck5vdGlmaWNhdGlvblBlcm1pc3Npb25zKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoISgnTm90aWZpY2F0aW9uJyBpbiB3aW5kb3cpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChOb3RpZmljYXRpb24ucGVybWlzc2lvbiA9PT0gJ2dyYW50ZWQnKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uID09PSAnZGVuaWVkJykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwZXJtaXNzaW9uID0gYXdhaXQgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCk7XG5cbiAgcmV0dXJuIHBlcm1pc3Npb24gPT09ICdncmFudGVkJztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgb3V0IGJyb3dzZXIgbm90aWZpY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICogQGZ1bmN0aW9uIHNlbmRCcm93c2VyTm90aWZpY2F0aW9uXG4gKiBAcGFyYW0ge05vdGlmaWNhdGlvblNlcmlhbGl6ZXJ9IHNlcmlhbGl6ZXIgLSBUaGUgc2VyaWFsaXplciB0byB1c2UgZm9yIG5vdGlmaWNhdGlvbiBkYXRhLlxuICogQHBhcmFtIHtCcm93c2VyTm90aWZpY2F0aW9uRXh0cmFzfSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBicm93c2VyIG5vdGlmaWNhdGlvbi5cbiAqIEByZXR1cm5zIHtTZW5kQnJvd3Nlck5vdGlmaWNhdGlvbkZufSBBIGZ1bmN0aW9uIHRvIHNlbmQgYnJvd3NlciBub3RpZmljYXRpb25zLlxuICovXG5mdW5jdGlvbiBzZW5kQnJvd3Nlck5vdGlmaWNhdGlvbihzZXJpYWxpemVyOiBOb3RpZmljYXRpb25TZXJpYWxpemVyLCBvcHRpb25zPzogQnJvd3Nlck5vdGlmaWNhdGlvbkV4dHJhcyk6IFNlbmRCcm93c2VyTm90aWZpY2F0aW9uRm4ge1xuICByZXR1cm4gYXN5bmMgKG5vdGlmaWNhdGlvblJlZikgPT4ge1xuICAgIGlmICghKCdOb3RpZmljYXRpb24nIGluIHdpbmRvdykpIHJldHVybjtcbiAgICBjb25zdCBbbm90aWZpY2F0aW9uT2JqXSA9IGF3YWl0IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYXdhaXQgc2VyaWFsaXplci5zZXJpYWxpemUoW25vdGlmaWNhdGlvblJlZl0pKTtcbiAgICBpZiAoIW5vdGlmaWNhdGlvbk9iaiB8fCBub3RpZmljYXRpb25PYmouaGFzQmVlblNlZW4pIHJldHVybjtcbiAgICBjb25zdCB7IGNyZWF0ZWRBdCwgaXRlbSB9ID0gbm90aWZpY2F0aW9uT2JqO1xuICAgIG5ldyBOb3RpZmljYXRpb24oaXRlbS50aXRsZSBhcyBzdHJpbmcsIHtcbiAgICAgIHRhZzogbm90aWZpY2F0aW9uUmVmLm9wdGlvbnMudGFncz8uWzBdLFxuICAgICAgbGFuZzogbm90aWZpY2F0aW9uUmVmLm9wdGlvbnMubGFuZ3VhZ2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgYm9keTogaXRlbS5kZXNjcmlwdGlvbiBhcyBzdHJpbmcsXG4gICAgICB0aW1lc3RhbXA6IGNyZWF0ZWRBdCxcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBhcHBsaWNhdGlvbiB0byBzZW5kIGJyb3dzZXIgbm90aWZpY2F0aW9ucywgdXNpbmcgQW5ndWxhcidzIGBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUmAgZm9yIHNldHVwLlxuICogQGZ1bmN0aW9uIHdpdGhCcm93c2VyTm90aWZpY2F0aW9uc1xuICogQHBhcmFtIHtXaXRoQnJvd3Nlck5vdGlmaWNhdGlvbnNPcHRpb25zfSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciBicm93c2VyIG5vdGlmaWNhdGlvbnMuXG4gKiBAcmV0dXJucyB7Tm90aWZpY2F0aW9uRmVhdHVyZX0gQSBub3RpZmljYXRpb24gZmVhdHVyZSBmb3IgaW50ZWdyYXRpb24gaW50byB0aGUgYXBwbGljYXRpb24gZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQnJvd3Nlck5vdGlmaWNhdGlvbnMob3B0aW9ucz86IFdpdGhCcm93c2VyTm90aWZpY2F0aW9uc09wdGlvbnMpOiBOb3RpZmljYXRpb25GZWF0dXJlIHtcbiAgcmV0dXJuIG1ha2VOb3RpZmljYXRpb25GZWF0dXJlKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUixcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IHtcbiAgICAgICAgY29uc3QgaXNFbmFibGVkID0gb3B0aW9ucz8uaXNFbmFibGVkID8/IHRydWU7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm4gKCkgPT4gdm9pZCAwO1xuICAgICAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlID0gaW5qZWN0KE5vdGlmaWNhdGlvblNlcnZpY2UpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gbmV3IFBlcnNpc3RlbnROb3RpZmljYXRpb25TZXJpYWxpemVyKCk7XG4gICAgICAgIGNvbnN0IHNlbmRCcm93c2VyTm90aWZpY2F0aW9uRm4gPSBvcHRpb25zPy5zZW5kRm4gPz8gc2VuZEJyb3dzZXJOb3RpZmljYXRpb24oc2VyaWFsaXplciwgb3B0aW9ucz8uZXh0cmFzKTtcblxuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgcGVybWlzc2lvbnNHcmFudGVkID0gYXdhaXQgcmVxdWVzdEJyb3dzZXJOb3RpZmljYXRpb25QZXJtaXNzaW9ucygpO1xuICAgICAgICAgIGlmICghcGVybWlzc2lvbnNHcmFudGVkKSByZXR1cm47XG4gICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5vbk5vdGlmaWNhdGlvbkFkZCQuc3Vic2NyaWJlKHNlbmRCcm93c2VyTm90aWZpY2F0aW9uRm4pO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ENVIRONMENT_INITIALIZER, inject } from '@angular/core';
|
|
2
|
+
import { from, isObservable, of } from 'rxjs';
|
|
3
|
+
import { makeNotificationFeature } from '../models';
|
|
4
|
+
import { NotificationService } from '../notification.service';
|
|
5
|
+
/**
|
|
6
|
+
* Loads notifications using the provided `loadFn`. This function abstracts over the differences
|
|
7
|
+
* between synchronous notifications, promises, and observables, providing a uniform Observable output.
|
|
8
|
+
* @function loadNotifications
|
|
9
|
+
* @param {LoadNotificationsFn} [loadFn] - An optional function to load notifications.
|
|
10
|
+
* @returns {Observable<NotificationRef[]>} An Observable stream of notification references.
|
|
11
|
+
*/
|
|
12
|
+
function loadNotifications(loadFn) {
|
|
13
|
+
const notifications = loadFn?.();
|
|
14
|
+
if (isObservable(notifications)) {
|
|
15
|
+
return notifications;
|
|
16
|
+
}
|
|
17
|
+
if (notifications instanceof Promise) {
|
|
18
|
+
return from(notifications);
|
|
19
|
+
}
|
|
20
|
+
return of(notifications ?? []);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Integrates notification loading into the application environment. This function uses the Angular
|
|
24
|
+
* `ENVIRONMENT_INITIALIZER` to ensure that notifications are loaded as part of the application's
|
|
25
|
+
* initialization process.
|
|
26
|
+
* @function withLoadNotifications
|
|
27
|
+
* @param {LoadNotificationsFn} loadFn - The function to load notifications.
|
|
28
|
+
* @returns {NotificationFeature} A notification feature configured to load notifications at startup.
|
|
29
|
+
*/
|
|
30
|
+
export function withLoadNotifications(loadFn) {
|
|
31
|
+
return makeNotificationFeature([
|
|
32
|
+
{
|
|
33
|
+
provide: ENVIRONMENT_INITIALIZER,
|
|
34
|
+
useFactory: () => {
|
|
35
|
+
const notificationService = inject(NotificationService);
|
|
36
|
+
const notifications$ = loadNotifications(loadFn);
|
|
37
|
+
return () => {
|
|
38
|
+
notifications$.subscribe((notificationRefs) => notificationService.load(notificationRefs));
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
multi: true,
|
|
42
|
+
},
|
|
43
|
+
]);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1sb2FkLW5vdGlmaWNhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9mZWF0dXJlcy93aXRoLWxvYWQtbm90aWZpY2F0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBYyxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQXdDLHVCQUF1QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBVTlEOzs7Ozs7R0FNRztBQUNILFNBQVMsaUJBQWlCLENBQUMsTUFBNEI7SUFDckQsTUFBTSxhQUFhLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQztJQUNqQyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUMvQixPQUFPLGFBQWEsQ0FBQztLQUN0QjtJQUNELElBQUksYUFBYSxZQUFZLE9BQU8sRUFBRTtRQUNwQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztLQUM1QjtJQUNELE9BQU8sRUFBRSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxNQUEyQjtJQUMvRCxPQUFPLHVCQUF1QixDQUFDO1FBQzdCO1lBQ0UsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxVQUFVLEVBQUUsR0FBRyxFQUFFO2dCQUNmLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3hELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUVqRCxPQUFPLEdBQUcsRUFBRTtvQkFDVixjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzdGLENBQUMsQ0FBQztZQUNKLENBQUM7WUFDRCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOVklST05NRU5UX0lOSVRJQUxJWkVSLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20sIGlzT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkZlYXR1cmUsIE5vdGlmaWNhdGlvblJlZiwgbWFrZU5vdGlmaWNhdGlvbkZlYXR1cmUgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGEgZnVuY3Rpb24gdGhhdCBsb2FkcyBub3RpZmljYXRpb25zLlxuICogQ2FuIHJldHVybiBub3RpZmljYXRpb25zIGRpcmVjdGx5IGFzIGFuIGFycmF5LCBhcyBhIFByb21pc2UsIG9yIGFzIGFuIE9ic2VydmFibGUuXG4gKiBAdHlwZWRlZiB7RnVuY3Rpb259IExvYWROb3RpZmljYXRpb25zRm5cbiAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPE5vdGlmaWNhdGlvblJlZltdPiB8IFByb21pc2U8Tm90aWZpY2F0aW9uUmVmW10+IHwgTm90aWZpY2F0aW9uUmVmW119IFRoZSBsb2FkZWQgbm90aWZpY2F0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgTG9hZE5vdGlmaWNhdGlvbnNGbiA9ICgpID0+IE9ic2VydmFibGU8Tm90aWZpY2F0aW9uUmVmW10+IHwgUHJvbWlzZTxOb3RpZmljYXRpb25SZWZbXT4gfCBOb3RpZmljYXRpb25SZWZbXTtcblxuLyoqXG4gKiBMb2FkcyBub3RpZmljYXRpb25zIHVzaW5nIHRoZSBwcm92aWRlZCBgbG9hZEZuYC4gVGhpcyBmdW5jdGlvbiBhYnN0cmFjdHMgb3ZlciB0aGUgZGlmZmVyZW5jZXNcbiAqIGJldHdlZW4gc3luY2hyb25vdXMgbm90aWZpY2F0aW9ucywgcHJvbWlzZXMsIGFuZCBvYnNlcnZhYmxlcywgcHJvdmlkaW5nIGEgdW5pZm9ybSBPYnNlcnZhYmxlIG91dHB1dC5cbiAqIEBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uc1xuICogQHBhcmFtIHtMb2FkTm90aWZpY2F0aW9uc0ZufSBbbG9hZEZuXSAtIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGxvYWQgbm90aWZpY2F0aW9ucy5cbiAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPE5vdGlmaWNhdGlvblJlZltdPn0gQW4gT2JzZXJ2YWJsZSBzdHJlYW0gb2Ygbm90aWZpY2F0aW9uIHJlZmVyZW5jZXMuXG4gKi9cbmZ1bmN0aW9uIGxvYWROb3RpZmljYXRpb25zKGxvYWRGbj86IExvYWROb3RpZmljYXRpb25zRm4pOiBPYnNlcnZhYmxlPE5vdGlmaWNhdGlvblJlZltdPiB7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBsb2FkRm4/LigpO1xuICBpZiAoaXNPYnNlcnZhYmxlKG5vdGlmaWNhdGlvbnMpKSB7XG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbnM7XG4gIH1cbiAgaWYgKG5vdGlmaWNhdGlvbnMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgcmV0dXJuIGZyb20obm90aWZpY2F0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG9mKG5vdGlmaWNhdGlvbnMgPz8gW10pO1xufVxuXG4vKipcbiAqIEludGVncmF0ZXMgbm90aWZpY2F0aW9uIGxvYWRpbmcgaW50byB0aGUgYXBwbGljYXRpb24gZW52aXJvbm1lbnQuIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgQW5ndWxhclxuICogYEVOVklST05NRU5UX0lOSVRJQUxJWkVSYCB0byBlbnN1cmUgdGhhdCBub3RpZmljYXRpb25zIGFyZSBsb2FkZWQgYXMgcGFydCBvZiB0aGUgYXBwbGljYXRpb24nc1xuICogaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy5cbiAqIEBmdW5jdGlvbiB3aXRoTG9hZE5vdGlmaWNhdGlvbnNcbiAqIEBwYXJhbSB7TG9hZE5vdGlmaWNhdGlvbnNGbn0gbG9hZEZuIC0gVGhlIGZ1bmN0aW9uIHRvIGxvYWQgbm90aWZpY2F0aW9ucy5cbiAqIEByZXR1cm5zIHtOb3RpZmljYXRpb25GZWF0dXJlfSBBIG5vdGlmaWNhdGlvbiBmZWF0dXJlIGNvbmZpZ3VyZWQgdG8gbG9hZCBub3RpZmljYXRpb25zIGF0IHN0YXJ0dXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoTG9hZE5vdGlmaWNhdGlvbnMobG9hZEZuOiBMb2FkTm90aWZpY2F0aW9uc0ZuKTogTm90aWZpY2F0aW9uRmVhdHVyZSB7XG4gIHJldHVybiBtYWtlTm90aWZpY2F0aW9uRmVhdHVyZShbXG4gICAge1xuICAgICAgcHJvdmlkZTogRU5WSVJPTk1FTlRfSU5JVElBTElaRVIsXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uU2VydmljZSk7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMkID0gbG9hZE5vdGlmaWNhdGlvbnMobG9hZEZuKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIG5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSgobm90aWZpY2F0aW9uUmVmcykgPT4gbm90aWZpY2F0aW9uU2VydmljZS5sb2FkKG5vdGlmaWNhdGlvblJlZnMpKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { InjectionToken, inject } from '@angular/core';
|
|
2
|
+
import { makeNotificationFeature } from '../models';
|
|
3
|
+
/**
|
|
4
|
+
* An InjectionToken for the NotificationTransformFn. This token can be used to inject
|
|
5
|
+
* a custom notification transformation function into the Angular DI system.
|
|
6
|
+
* @type {InjectionToken<NotificationTransformFn>}
|
|
7
|
+
*/
|
|
8
|
+
export const ODX_NOTIFICATION_TRANSFORMER = new InjectionToken('@odx/angular/components/notification::NotificationTransformer');
|
|
9
|
+
/**
|
|
10
|
+
* Attempts to inject a NotificationTransformFn from the Angular DI system.
|
|
11
|
+
* If no provider is found, it returns null.
|
|
12
|
+
* @function injectNotificationTransform
|
|
13
|
+
* @returns {NotificationTransformFn | null} The injected NotificationTransformFn, or null if not provided.
|
|
14
|
+
*/
|
|
15
|
+
export function injectNotificationTransform() {
|
|
16
|
+
return inject(ODX_NOTIFICATION_TRANSFORMER, { optional: true });
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Configures a notification transformation function to be used within the application.
|
|
20
|
+
* This function provides a mechanism to globally apply transformations to notifications
|
|
21
|
+
* before they are processed or displayed.
|
|
22
|
+
* @function withNotificationTransform
|
|
23
|
+
* @param {NotificationTransformFn} transformFn - The function to transform notifications.
|
|
24
|
+
* @returns {NotificationFeature} A NotificationFeature configured with the provided transformation function.
|
|
25
|
+
*/
|
|
26
|
+
export function withNotificationTransform(transformFn) {
|
|
27
|
+
return makeNotificationFeature([
|
|
28
|
+
{
|
|
29
|
+
provide: ODX_NOTIFICATION_TRANSFORMER,
|
|
30
|
+
useValue: transformFn,
|
|
31
|
+
},
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1ub3RpZmljYXRpb24tdHJhbnNmb3JtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9mZWF0dXJlcy93aXRoLW5vdGlmaWNhdGlvbi10cmFuc2Zvcm1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RCxPQUFPLEVBQXdDLHVCQUF1QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSTFGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLGNBQWMsQ0FBMEIsK0RBQStELENBQUMsQ0FBQztBQUV6Sjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSwyQkFBMkI7SUFDekMsT0FBTyxNQUFNLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxXQUFvQztJQUM1RSxPQUFPLHVCQUF1QixDQUFDO1FBQzdCO1lBQ0UsT0FBTyxFQUFFLDRCQUE0QjtZQUNyQyxRQUFRLEVBQUUsV0FBVztTQUN0QjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25GZWF0dXJlLCBOb3RpZmljYXRpb25SZWYsIG1ha2VOb3RpZmljYXRpb25GZWF0dXJlIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IHR5cGUgTm90aWZpY2F0aW9uVHJhbnNmb3JtRm4gPSAocmVmOiBOb3RpZmljYXRpb25SZWYpID0+IE9ic2VydmFibGU8Tm90aWZpY2F0aW9uUmVmPjtcblxuLyoqXG4gKiBBbiBJbmplY3Rpb25Ub2tlbiBmb3IgdGhlIE5vdGlmaWNhdGlvblRyYW5zZm9ybUZuLiBUaGlzIHRva2VuIGNhbiBiZSB1c2VkIHRvIGluamVjdFxuICogYSBjdXN0b20gbm90aWZpY2F0aW9uIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGludG8gdGhlIEFuZ3VsYXIgREkgc3lzdGVtLlxuICogQHR5cGUge0luamVjdGlvblRva2VuPE5vdGlmaWNhdGlvblRyYW5zZm9ybUZuPn1cbiAqL1xuZXhwb3J0IGNvbnN0IE9EWF9OT1RJRklDQVRJT05fVFJBTlNGT1JNRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48Tm90aWZpY2F0aW9uVHJhbnNmb3JtRm4+KCdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb246Ok5vdGlmaWNhdGlvblRyYW5zZm9ybWVyJyk7XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gaW5qZWN0IGEgTm90aWZpY2F0aW9uVHJhbnNmb3JtRm4gZnJvbSB0aGUgQW5ndWxhciBESSBzeXN0ZW0uXG4gKiBJZiBubyBwcm92aWRlciBpcyBmb3VuZCwgaXQgcmV0dXJucyBudWxsLlxuICogQGZ1bmN0aW9uIGluamVjdE5vdGlmaWNhdGlvblRyYW5zZm9ybVxuICogQHJldHVybnMge05vdGlmaWNhdGlvblRyYW5zZm9ybUZuIHwgbnVsbH0gVGhlIGluamVjdGVkIE5vdGlmaWNhdGlvblRyYW5zZm9ybUZuLCBvciBudWxsIGlmIG5vdCBwcm92aWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdE5vdGlmaWNhdGlvblRyYW5zZm9ybSgpOiBOb3RpZmljYXRpb25UcmFuc2Zvcm1GbiB8IG51bGwge1xuICByZXR1cm4gaW5qZWN0KE9EWF9OT1RJRklDQVRJT05fVFJBTlNGT1JNRVIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBhIG5vdGlmaWNhdGlvbiB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0byBiZSB1c2VkIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGdsb2JhbGx5IGFwcGx5IHRyYW5zZm9ybWF0aW9ucyB0byBub3RpZmljYXRpb25zXG4gKiBiZWZvcmUgdGhleSBhcmUgcHJvY2Vzc2VkIG9yIGRpc3BsYXllZC5cbiAqIEBmdW5jdGlvbiB3aXRoTm90aWZpY2F0aW9uVHJhbnNmb3JtXG4gKiBAcGFyYW0ge05vdGlmaWNhdGlvblRyYW5zZm9ybUZufSB0cmFuc2Zvcm1GbiAtIFRoZSBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gbm90aWZpY2F0aW9ucy5cbiAqIEByZXR1cm5zIHtOb3RpZmljYXRpb25GZWF0dXJlfSBBIE5vdGlmaWNhdGlvbkZlYXR1cmUgY29uZmlndXJlZCB3aXRoIHRoZSBwcm92aWRlZCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhOb3RpZmljYXRpb25UcmFuc2Zvcm0odHJhbnNmb3JtRm46IE5vdGlmaWNhdGlvblRyYW5zZm9ybUZuKTogTm90aWZpY2F0aW9uRmVhdHVyZSB7XG4gIHJldHVybiBtYWtlTm90aWZpY2F0aW9uRmVhdHVyZShbXG4gICAge1xuICAgICAgcHJvdmlkZTogT0RYX05PVElGSUNBVElPTl9UUkFOU0ZPUk1FUixcbiAgICAgIHVzZVZhbHVlOiB0cmFuc2Zvcm1GbixcbiAgICB9LFxuICBdKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { deepmerge } from '@odx/angular/internal';
|
|
2
|
+
import { isFunction, isString } from '@odx/angular/utils';
|
|
3
|
+
import { firstValueFrom } from 'rxjs';
|
|
4
|
+
import { makeNotificationFeature } from '../models';
|
|
5
|
+
import { withLoadNotifications } from './with-load-notifications';
|
|
6
|
+
import { withSaveNotifications } from './with-save-notifications';
|
|
7
|
+
/**
|
|
8
|
+
* Implementation of NotificationSerializer for persistent storage.
|
|
9
|
+
* @class PersistentNotificationSerializer
|
|
10
|
+
* @implements {NotificationSerializer}
|
|
11
|
+
*/
|
|
12
|
+
export class PersistentNotificationSerializer {
|
|
13
|
+
/**
|
|
14
|
+
* Serializes an array of NotificationRef objects into a string.
|
|
15
|
+
* @function serialize
|
|
16
|
+
* @memberof NotificationSerializer
|
|
17
|
+
* @param {NotificationRef[]} value - The notification references to serialize.
|
|
18
|
+
* @returns {Promise<string>} A promise that resolves to the serialized string representation of notification references.
|
|
19
|
+
*/
|
|
20
|
+
async serialize(value) {
|
|
21
|
+
const serializedNotifications = await Promise.all(value.map(async (ref) => deepmerge(ref, {
|
|
22
|
+
item: {
|
|
23
|
+
title: await this.serializeDynamicTextContent(ref.item.title),
|
|
24
|
+
description: await this.serializeDynamicTextContent(ref.item.description),
|
|
25
|
+
},
|
|
26
|
+
})));
|
|
27
|
+
return JSON.stringify(serializedNotifications);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Deserializes a string into an array of NotificationRef objects.
|
|
31
|
+
* @function deserialize
|
|
32
|
+
* @memberof NotificationSerializer
|
|
33
|
+
* @param {string} value - The string representation of notification references to deserialize.
|
|
34
|
+
* @returns {Promise<NotificationRef[]>} A promise that resolves to the deserialized notification references.
|
|
35
|
+
*/
|
|
36
|
+
async deserialize(value) {
|
|
37
|
+
return JSON.parse(value);
|
|
38
|
+
}
|
|
39
|
+
async serializeDynamicTextContent(content) {
|
|
40
|
+
if (!content)
|
|
41
|
+
return '';
|
|
42
|
+
if (isString(content))
|
|
43
|
+
return content;
|
|
44
|
+
return firstValueFrom(content).catch(() => '');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Initializes and returns a function for loading persistent notifications.
|
|
49
|
+
* @function initPersistentNotifications
|
|
50
|
+
* @param {WithPersistentNotificationsStorageOptions} options - The storage options including serializer and storage key.
|
|
51
|
+
* @returns {LoadNotificationsFn} A function to load notifications from storage.
|
|
52
|
+
*/
|
|
53
|
+
export function initPersistentNotifications({ storage, storageKey, serializer, idTransformer, }) {
|
|
54
|
+
return async () => {
|
|
55
|
+
const storedValue = storage.getItem(storageKey);
|
|
56
|
+
if (!storedValue)
|
|
57
|
+
return [];
|
|
58
|
+
const notificationRefs = await serializer.deserialize(storedValue);
|
|
59
|
+
if (isFunction(idTransformer)) {
|
|
60
|
+
for (const notificationRef of notificationRefs) {
|
|
61
|
+
notificationRef.item.id = notificationRef.id = idTransformer(notificationRef);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return notificationRefs;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Returns a function for persisting notifications.
|
|
69
|
+
* @function persistNotifications
|
|
70
|
+
* @param {WithPersistentNotificationsStorageOptions} options - The storage options including serializer and storage key.
|
|
71
|
+
* @returns {SaveNotificationsFn} A function to save notifications to storage.
|
|
72
|
+
*/
|
|
73
|
+
export function persistNotifications({ storage, storageKey, serializer }) {
|
|
74
|
+
return async (notificationRefs) => {
|
|
75
|
+
storage.setItem(storageKey, await serializer.serialize(notificationRefs));
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Configures the application to use persistent notifications, automatically loading from and saving to the configured storage.
|
|
80
|
+
* @function withPersistentNotifications
|
|
81
|
+
* @param {Partial<WithPersistentNotificationsOptions>} [options] - Optional configuration for persistent notifications.
|
|
82
|
+
* @returns {NotificationFeature} A notification feature configured for persistence.
|
|
83
|
+
*/
|
|
84
|
+
export function withPersistentNotifications(options) {
|
|
85
|
+
const storageOptions = {
|
|
86
|
+
storageKey: options?.storageOptions?.storageKey ?? '@odx/angular/components/notification::Storage',
|
|
87
|
+
storage: options?.storageOptions?.storage ?? localStorage,
|
|
88
|
+
serializer: options?.storageOptions?.serializer ?? new PersistentNotificationSerializer(),
|
|
89
|
+
};
|
|
90
|
+
const initFn = options?.initFn ?? initPersistentNotifications(storageOptions);
|
|
91
|
+
const saveFn = options?.saveFn ?? persistNotifications(storageOptions);
|
|
92
|
+
return makeNotificationFeature([withLoadNotifications(initFn), withSaveNotifications(saveFn)]);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1wZXJpc3RlbnQtbm90aWZpY2F0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL25vdGlmaWNhdGlvbi9zcmMvbGliL2ZlYXR1cmVzL3dpdGgtcGVyaXN0ZW50LW5vdGlmaWNhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQXdDLHVCQUF1QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFGLE9BQU8sRUFBdUIscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RixPQUFPLEVBQXVCLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFPdkY7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxnQ0FBZ0M7SUFDM0M7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUF3QjtRQUM3QyxNQUFNLHVCQUF1QixHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDL0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FDdEIsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNiLElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQzdELFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUMxRTtTQUNGLENBQUMsQ0FDSCxDQUNGLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU8sS0FBSyxDQUFDLDJCQUEyQixDQUFDLE9BQTRCO1FBQ3BFLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFFdEMsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7Q0FDRjtBQWVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEVBQzFDLE9BQU8sRUFDUCxVQUFVLEVBQ1YsVUFBVSxFQUNWLGFBQWEsR0FDNkI7SUFDMUMsT0FBTyxLQUFLLElBQUksRUFBRTtRQUNoQixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbkUsSUFBSSxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDN0IsS0FBSyxNQUFNLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDOUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDL0U7U0FDRjtRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQTZDO0lBQ2pILE9BQU8sS0FBSyxFQUFFLGdCQUFtQyxFQUFFLEVBQUU7UUFDbkQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsT0FBcUQ7SUFDL0YsTUFBTSxjQUFjLEdBQThDO1FBQ2hFLFVBQVUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsSUFBSSwrQ0FBK0M7UUFDbEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsT0FBTyxJQUFJLFlBQVk7UUFDekQsVUFBVSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxJQUFJLElBQUksZ0NBQWdDLEVBQUU7S0FDMUYsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxNQUFNLElBQUksMkJBQTJCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDOUUsTUFBTSxNQUFNLEdBQUcsT0FBTyxFQUFFLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV2RSxPQUFPLHVCQUF1QixDQUFDLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEeW5hbWljVGV4dENvbnRlbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL2R5bmFtaWMtdmlldyc7XG5pbXBvcnQgeyBkZWVwbWVyZ2UgfSBmcm9tICdAb2R4L2FuZ3VsYXIvaW50ZXJuYWwnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNTdHJpbmcgfSBmcm9tICdAb2R4L2FuZ3VsYXIvdXRpbHMnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkZlYXR1cmUsIE5vdGlmaWNhdGlvblJlZiwgbWFrZU5vdGlmaWNhdGlvbkZlYXR1cmUgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgTG9hZE5vdGlmaWNhdGlvbnNGbiwgd2l0aExvYWROb3RpZmljYXRpb25zIH0gZnJvbSAnLi93aXRoLWxvYWQtbm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgeyBTYXZlTm90aWZpY2F0aW9uc0ZuLCB3aXRoU2F2ZU5vdGlmaWNhdGlvbnMgfSBmcm9tICcuL3dpdGgtc2F2ZS1ub3RpZmljYXRpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25TZXJpYWxpemVyIHtcbiAgc2VyaWFsaXplKHZhbHVlOiBOb3RpZmljYXRpb25SZWZbXSk6IFByb21pc2U8c3RyaW5nPjtcbiAgZGVzZXJpYWxpemUodmFsdWU6IHN0cmluZyk6IFByb21pc2U8Tm90aWZpY2F0aW9uUmVmW10+O1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIE5vdGlmaWNhdGlvblNlcmlhbGl6ZXIgZm9yIHBlcnNpc3RlbnQgc3RvcmFnZS5cbiAqIEBjbGFzcyBQZXJzaXN0ZW50Tm90aWZpY2F0aW9uU2VyaWFsaXplclxuICogQGltcGxlbWVudHMge05vdGlmaWNhdGlvblNlcmlhbGl6ZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBQZXJzaXN0ZW50Tm90aWZpY2F0aW9uU2VyaWFsaXplciBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvblNlcmlhbGl6ZXIge1xuICAvKipcbiAgICogU2VyaWFsaXplcyBhbiBhcnJheSBvZiBOb3RpZmljYXRpb25SZWYgb2JqZWN0cyBpbnRvIGEgc3RyaW5nLlxuICAgKiBAZnVuY3Rpb24gc2VyaWFsaXplXG4gICAqIEBtZW1iZXJvZiBOb3RpZmljYXRpb25TZXJpYWxpemVyXG4gICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9uUmVmW119IHZhbHVlIC0gVGhlIG5vdGlmaWNhdGlvbiByZWZlcmVuY2VzIHRvIHNlcmlhbGl6ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNlcmlhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG5vdGlmaWNhdGlvbiByZWZlcmVuY2VzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlcmlhbGl6ZSh2YWx1ZTogTm90aWZpY2F0aW9uUmVmW10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWROb3RpZmljYXRpb25zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB2YWx1ZS5tYXAoYXN5bmMgKHJlZikgPT5cbiAgICAgICAgZGVlcG1lcmdlKHJlZiwge1xuICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgIHRpdGxlOiBhd2FpdCB0aGlzLnNlcmlhbGl6ZUR5bmFtaWNUZXh0Q29udGVudChyZWYuaXRlbS50aXRsZSksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYXdhaXQgdGhpcy5zZXJpYWxpemVEeW5hbWljVGV4dENvbnRlbnQocmVmLml0ZW0uZGVzY3JpcHRpb24pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWROb3RpZmljYXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgYSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBOb3RpZmljYXRpb25SZWYgb2JqZWN0cy5cbiAgICogQGZ1bmN0aW9uIGRlc2VyaWFsaXplXG4gICAqIEBtZW1iZXJvZiBOb3RpZmljYXRpb25TZXJpYWxpemVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygbm90aWZpY2F0aW9uIHJlZmVyZW5jZXMgdG8gZGVzZXJpYWxpemUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE5vdGlmaWNhdGlvblJlZltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlc2VyaWFsaXplZCBub3RpZmljYXRpb24gcmVmZXJlbmNlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZSh2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTxOb3RpZmljYXRpb25SZWZbXT4ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VyaWFsaXplRHluYW1pY1RleHRDb250ZW50KGNvbnRlbnQ/OiBEeW5hbWljVGV4dENvbnRlbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghY29udGVudCkgcmV0dXJuICcnO1xuICAgIGlmIChpc1N0cmluZyhjb250ZW50KSkgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oY29udGVudCkuY2F0Y2goKCkgPT4gJycpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aFBlcnNpc3RlbnROb3RpZmljYXRpb25zU3RvcmFnZU9wdGlvbnMge1xuICBzdG9yYWdlS2V5OiBzdHJpbmc7XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIHNlcmlhbGl6ZXI6IE5vdGlmaWNhdGlvblNlcmlhbGl6ZXI7XG4gIGlkVHJhbnNmb3JtZXI/OiAobm90aWZpY2F0aW9uUmVmOiBOb3RpZmljYXRpb25SZWYpID0+IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXRoUGVyc2lzdGVudE5vdGlmaWNhdGlvbnNPcHRpb25zIHtcbiAgaW5pdEZuOiBMb2FkTm90aWZpY2F0aW9uc0ZuO1xuICBzYXZlRm46IFNhdmVOb3RpZmljYXRpb25zRm47XG4gIHN0b3JhZ2VPcHRpb25zOiBXaXRoUGVyc2lzdGVudE5vdGlmaWNhdGlvbnNTdG9yYWdlT3B0aW9ucztcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIGZvciBsb2FkaW5nIHBlcnNpc3RlbnQgbm90aWZpY2F0aW9ucy5cbiAqIEBmdW5jdGlvbiBpbml0UGVyc2lzdGVudE5vdGlmaWNhdGlvbnNcbiAqIEBwYXJhbSB7V2l0aFBlcnNpc3RlbnROb3RpZmljYXRpb25zU3RvcmFnZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc3RvcmFnZSBvcHRpb25zIGluY2x1ZGluZyBzZXJpYWxpemVyIGFuZCBzdG9yYWdlIGtleS5cbiAqIEByZXR1cm5zIHtMb2FkTm90aWZpY2F0aW9uc0ZufSBBIGZ1bmN0aW9uIHRvIGxvYWQgbm90aWZpY2F0aW9ucyBmcm9tIHN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0UGVyc2lzdGVudE5vdGlmaWNhdGlvbnMoe1xuICBzdG9yYWdlLFxuICBzdG9yYWdlS2V5LFxuICBzZXJpYWxpemVyLFxuICBpZFRyYW5zZm9ybWVyLFxufTogV2l0aFBlcnNpc3RlbnROb3RpZmljYXRpb25zU3RvcmFnZU9wdGlvbnMpOiBMb2FkTm90aWZpY2F0aW9uc0ZuIHtcbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KTtcbiAgICBpZiAoIXN0b3JlZFZhbHVlKSByZXR1cm4gW107XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uUmVmcyA9IGF3YWl0IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoc3RvcmVkVmFsdWUpO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oaWRUcmFuc2Zvcm1lcikpIHtcbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uUmVmIG9mIG5vdGlmaWNhdGlvblJlZnMpIHtcbiAgICAgICAgbm90aWZpY2F0aW9uUmVmLml0ZW0uaWQgPSBub3RpZmljYXRpb25SZWYuaWQgPSBpZFRyYW5zZm9ybWVyKG5vdGlmaWNhdGlvblJlZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvblJlZnM7XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIGZvciBwZXJzaXN0aW5nIG5vdGlmaWNhdGlvbnMuXG4gKiBAZnVuY3Rpb24gcGVyc2lzdE5vdGlmaWNhdGlvbnNcbiAqIEBwYXJhbSB7V2l0aFBlcnNpc3RlbnROb3RpZmljYXRpb25zU3RvcmFnZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc3RvcmFnZSBvcHRpb25zIGluY2x1ZGluZyBzZXJpYWxpemVyIGFuZCBzdG9yYWdlIGtleS5cbiAqIEByZXR1cm5zIHtTYXZlTm90aWZpY2F0aW9uc0ZufSBBIGZ1bmN0aW9uIHRvIHNhdmUgbm90aWZpY2F0aW9ucyB0byBzdG9yYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGVyc2lzdE5vdGlmaWNhdGlvbnMoeyBzdG9yYWdlLCBzdG9yYWdlS2V5LCBzZXJpYWxpemVyIH06IFdpdGhQZXJzaXN0ZW50Tm90aWZpY2F0aW9uc1N0b3JhZ2VPcHRpb25zKTogU2F2ZU5vdGlmaWNhdGlvbnNGbiB7XG4gIHJldHVybiBhc3luYyAobm90aWZpY2F0aW9uUmVmczogTm90aWZpY2F0aW9uUmVmW10pID0+IHtcbiAgICBzdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgYXdhaXQgc2VyaWFsaXplci5zZXJpYWxpemUobm90aWZpY2F0aW9uUmVmcykpO1xuICB9O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGFwcGxpY2F0aW9uIHRvIHVzZSBwZXJzaXN0ZW50IG5vdGlmaWNhdGlvbnMsIGF1dG9tYXRpY2FsbHkgbG9hZGluZyBmcm9tIGFuZCBzYXZpbmcgdG8gdGhlIGNvbmZpZ3VyZWQgc3RvcmFnZS5cbiAqIEBmdW5jdGlvbiB3aXRoUGVyc2lzdGVudE5vdGlmaWNhdGlvbnNcbiAqIEBwYXJhbSB7UGFydGlhbDxXaXRoUGVyc2lzdGVudE5vdGlmaWNhdGlvbnNPcHRpb25zPn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgcGVyc2lzdGVudCBub3RpZmljYXRpb25zLlxuICogQHJldHVybnMge05vdGlmaWNhdGlvbkZlYXR1cmV9IEEgbm90aWZpY2F0aW9uIGZlYXR1cmUgY29uZmlndXJlZCBmb3IgcGVyc2lzdGVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGVyc2lzdGVudE5vdGlmaWNhdGlvbnMob3B0aW9ucz86IFBhcnRpYWw8V2l0aFBlcnNpc3RlbnROb3RpZmljYXRpb25zT3B0aW9ucz4pOiBOb3RpZmljYXRpb25GZWF0dXJlIHtcbiAgY29uc3Qgc3RvcmFnZU9wdGlvbnM6IFdpdGhQZXJzaXN0ZW50Tm90aWZpY2F0aW9uc1N0b3JhZ2VPcHRpb25zID0ge1xuICAgIHN0b3JhZ2VLZXk6IG9wdGlvbnM/LnN0b3JhZ2VPcHRpb25zPy5zdG9yYWdlS2V5ID8/ICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb246OlN0b3JhZ2UnLFxuICAgIHN0b3JhZ2U6IG9wdGlvbnM/LnN0b3JhZ2VPcHRpb25zPy5zdG9yYWdlID8/IGxvY2FsU3RvcmFnZSxcbiAgICBzZXJpYWxpemVyOiBvcHRpb25zPy5zdG9yYWdlT3B0aW9ucz8uc2VyaWFsaXplciA/PyBuZXcgUGVyc2lzdGVudE5vdGlmaWNhdGlvblNlcmlhbGl6ZXIoKSxcbiAgfTtcbiAgY29uc3QgaW5pdEZuID0gb3B0aW9ucz8uaW5pdEZuID8/IGluaXRQZXJzaXN0ZW50Tm90aWZpY2F0aW9ucyhzdG9yYWdlT3B0aW9ucyk7XG4gIGNvbnN0IHNhdmVGbiA9IG9wdGlvbnM/LnNhdmVGbiA/PyBwZXJzaXN0Tm90aWZpY2F0aW9ucyhzdG9yYWdlT3B0aW9ucyk7XG5cbiAgcmV0dXJuIG1ha2VOb3RpZmljYXRpb25GZWF0dXJlKFt3aXRoTG9hZE5vdGlmaWNhdGlvbnMoaW5pdEZuKSwgd2l0aFNhdmVOb3RpZmljYXRpb25zKHNhdmVGbildKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ENVIRONMENT_INITIALIZER, Injector, inject, runInInjectionContext } from '@angular/core';
|
|
2
|
+
import { firstValueFrom, isObservable } from 'rxjs';
|
|
3
|
+
import { makeNotificationFeature } from '../models';
|
|
4
|
+
import { NotificationService } from '../notification.service';
|
|
5
|
+
/**
|
|
6
|
+
* Asynchronously saves notifications using the provided save function. It handles Observable and Promise results seamlessly.
|
|
7
|
+
* @async
|
|
8
|
+
* @function saveNotifications
|
|
9
|
+
* @param {NotificationRef[]} notifications - The notifications to be saved.
|
|
10
|
+
* @param {SaveNotificationsFn} [saveFn] - Optional custom save function.
|
|
11
|
+
* @returns {Promise<void>} A promise that resolves when the save operation is complete.
|
|
12
|
+
*/
|
|
13
|
+
async function saveNotifications(notifications, saveFn) {
|
|
14
|
+
const save = saveFn?.(notifications);
|
|
15
|
+
if (isObservable(save)) {
|
|
16
|
+
await firstValueFrom(save);
|
|
17
|
+
}
|
|
18
|
+
else if (save instanceof Promise) {
|
|
19
|
+
await save;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Configures the application to automatically save notifications using a specified save function.
|
|
24
|
+
* This setup integrates with Angular's environment initialization process to ensure notifications are saved as needed.
|
|
25
|
+
* @function withSaveNotifications
|
|
26
|
+
* @param {SaveNotificationsFn} saveFn - The function to save notifications.
|
|
27
|
+
* @returns {NotificationFeature} A notification feature configured to automatically save notifications.
|
|
28
|
+
*/
|
|
29
|
+
export function withSaveNotifications(saveFn) {
|
|
30
|
+
return makeNotificationFeature([
|
|
31
|
+
{
|
|
32
|
+
provide: ENVIRONMENT_INITIALIZER,
|
|
33
|
+
useFactory: () => {
|
|
34
|
+
const injector = Injector.create({ parent: inject(Injector), providers: [] });
|
|
35
|
+
const notificationService = inject(NotificationService);
|
|
36
|
+
const saveFnWithContext = (notifications) => runInInjectionContext(injector, () => saveFn(notifications));
|
|
37
|
+
return () => {
|
|
38
|
+
notificationService.notifications$.subscribe(({ values }) => saveNotifications(values, saveFnWithContext));
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
multi: true,
|
|
42
|
+
},
|
|
43
|
+
]);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1zYXZlLW5vdGlmaWNhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9mZWF0dXJlcy93aXRoLXNhdmUtbm90aWZpY2F0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQWMsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQXdDLHVCQUF1QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSTlEOzs7Ozs7O0dBT0c7QUFDSCxLQUFLLFVBQVUsaUJBQWlCLENBQUMsYUFBZ0MsRUFBRSxNQUE0QjtJQUM3RixNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNyQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN0QixNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM1QjtTQUFNLElBQUksSUFBSSxZQUFZLE9BQU8sRUFBRTtRQUNsQyxNQUFNLElBQUksQ0FBQztLQUNaO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxNQUEyQjtJQUMvRCxPQUFPLHVCQUF1QixDQUFDO1FBQzdCO1lBQ0UsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxVQUFVLEVBQUUsR0FBRyxFQUFFO2dCQUNmLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RSxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLGlCQUFpQixHQUF3QixDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUUvSCxPQUFPLEdBQUcsRUFBRTtvQkFDVixtQkFBbUIsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDN0csQ0FBQyxDQUFDO1lBQ0osQ0FBQztZQUNELEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WSVJPTk1FTlRfSU5JVElBTElaRVIsIEluamVjdG9yLCBpbmplY3QsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZmlyc3RWYWx1ZUZyb20sIGlzT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uRmVhdHVyZSwgTm90aWZpY2F0aW9uUmVmLCBtYWtlTm90aWZpY2F0aW9uRmVhdHVyZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBTYXZlTm90aWZpY2F0aW9uc0ZuID0gKG5vdGlmaWNhdGlvblJlZnM6IE5vdGlmaWNhdGlvblJlZltdKSA9PiBPYnNlcnZhYmxlPHZvaWQ+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgc2F2ZXMgbm90aWZpY2F0aW9ucyB1c2luZyB0aGUgcHJvdmlkZWQgc2F2ZSBmdW5jdGlvbi4gSXQgaGFuZGxlcyBPYnNlcnZhYmxlIGFuZCBQcm9taXNlIHJlc3VsdHMgc2VhbWxlc3NseS5cbiAqIEBhc3luY1xuICogQGZ1bmN0aW9uIHNhdmVOb3RpZmljYXRpb25zXG4gKiBAcGFyYW0ge05vdGlmaWNhdGlvblJlZltdfSBub3RpZmljYXRpb25zIC0gVGhlIG5vdGlmaWNhdGlvbnMgdG8gYmUgc2F2ZWQuXG4gKiBAcGFyYW0ge1NhdmVOb3RpZmljYXRpb25zRm59IFtzYXZlRm5dIC0gT3B0aW9uYWwgY3VzdG9tIHNhdmUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2F2ZSBvcGVyYXRpb24gaXMgY29tcGxldGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVOb3RpZmljYXRpb25zKG5vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvblJlZltdLCBzYXZlRm4/OiBTYXZlTm90aWZpY2F0aW9uc0ZuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNhdmUgPSBzYXZlRm4/Lihub3RpZmljYXRpb25zKTtcbiAgaWYgKGlzT2JzZXJ2YWJsZShzYXZlKSkge1xuICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHNhdmUpO1xuICB9IGVsc2UgaWYgKHNhdmUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgYXdhaXQgc2F2ZTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGFwcGxpY2F0aW9uIHRvIGF1dG9tYXRpY2FsbHkgc2F2ZSBub3RpZmljYXRpb25zIHVzaW5nIGEgc3BlY2lmaWVkIHNhdmUgZnVuY3Rpb24uXG4gKiBUaGlzIHNldHVwIGludGVncmF0ZXMgd2l0aCBBbmd1bGFyJ3MgZW52aXJvbm1lbnQgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyB0byBlbnN1cmUgbm90aWZpY2F0aW9ucyBhcmUgc2F2ZWQgYXMgbmVlZGVkLlxuICogQGZ1bmN0aW9uIHdpdGhTYXZlTm90aWZpY2F0aW9uc1xuICogQHBhcmFtIHtTYXZlTm90aWZpY2F0aW9uc0ZufSBzYXZlRm4gLSBUaGUgZnVuY3Rpb24gdG8gc2F2ZSBub3RpZmljYXRpb25zLlxuICogQHJldHVybnMge05vdGlmaWNhdGlvbkZlYXR1cmV9IEEgbm90aWZpY2F0aW9uIGZlYXR1cmUgY29uZmlndXJlZCB0byBhdXRvbWF0aWNhbGx5IHNhdmUgbm90aWZpY2F0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTYXZlTm90aWZpY2F0aW9ucyhzYXZlRm46IFNhdmVOb3RpZmljYXRpb25zRm4pOiBOb3RpZmljYXRpb25GZWF0dXJlIHtcbiAgcmV0dXJuIG1ha2VOb3RpZmljYXRpb25GZWF0dXJlKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUixcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoeyBwYXJlbnQ6IGluamVjdChJbmplY3RvciksIHByb3ZpZGVyczogW10gfSk7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uU2VydmljZSk7XG4gICAgICAgIGNvbnN0IHNhdmVGbldpdGhDb250ZXh0OiBTYXZlTm90aWZpY2F0aW9uc0ZuID0gKG5vdGlmaWNhdGlvbnMpID0+IHJ1bkluSW5qZWN0aW9uQ29udGV4dChpbmplY3RvciwgKCkgPT4gc2F2ZUZuKG5vdGlmaWNhdGlvbnMpKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZpY2F0aW9ucyQuc3Vic2NyaWJlKCh7IHZhbHVlcyB9KSA9PiBzYXZlTm90aWZpY2F0aW9ucyh2YWx1ZXMsIHNhdmVGbldpdGhDb250ZXh0KSk7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function getNotificationsByTags(...tags) {
|
|
2
|
+
const cachedTags = new Set(tags.filter(Boolean));
|
|
3
|
+
return ({ options }) => {
|
|
4
|
+
return cachedTags.size < 1 || options.tags.every((tag) => cachedTags.has(tag));
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LW5vdGlmaWNhdGlvbnMtYnktdGFnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL3NyYy9saWIvaGVscGVycy9nZXQtbm90aWZpY2F0aW9ucy1ieS10YWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLHNCQUFzQixDQUFDLEdBQUcsSUFBc0M7SUFDOUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWpELE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7UUFDckIsT0FBTyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb3RpZmljYXRpb25RdWVyeSB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb3RpZmljYXRpb25zQnlUYWdzKC4uLnRhZ3M6IEFycmF5PHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KTogTm90aWZpY2F0aW9uUXVlcnkge1xuICBjb25zdCBjYWNoZWRUYWdzID0gbmV3IFNldCh0YWdzLmZpbHRlcihCb29sZWFuKSk7XG5cbiAgcmV0dXJuICh7IG9wdGlvbnMgfSkgPT4ge1xuICAgIHJldHVybiBjYWNoZWRUYWdzLnNpemUgPCAxIHx8IG9wdGlvbnMudGFncy5ldmVyeSgodGFnKSA9PiBjYWNoZWRUYWdzLmhhcyh0YWcpKTtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './get-notifications-by-tag';
|
|
2
|
+
export * from './sort-notifications';
|
|
3
|
+
export * from './to-notification-collection';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9oZWxwZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDhCQUE4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9nZXQtbm90aWZpY2F0aW9ucy1ieS10YWcnO1xuZXhwb3J0ICogZnJvbSAnLi9zb3J0LW5vdGlmaWNhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi90by1ub3RpZmljYXRpb24tY29sbGVjdGlvbic7XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { isFunction } from '@odx/angular/utils';
|
|
2
|
+
import { tap } from 'rxjs';
|
|
3
|
+
export function sortNotifications(sortFn) {
|
|
4
|
+
return (source$) => source$.pipe(tap((values) => {
|
|
5
|
+
if (!isFunction(sortFn))
|
|
6
|
+
return;
|
|
7
|
+
values.sort(sortFn);
|
|
8
|
+
}));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC1ub3RpZmljYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL3NyYy9saWIvaGVscGVycy9zb3J0LW5vdGlmaWNhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBNEIsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3JELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxNQUEyQjtJQUMzRCxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDakIsT0FBTyxDQUFDLElBQUksQ0FDVixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNiLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTztRQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uUmVmLCBOb3RpZmljYXRpb25Tb3J0Rm4gfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc29ydE5vdGlmaWNhdGlvbnMoc29ydEZuPzogTm90aWZpY2F0aW9uU29ydEZuKTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPE5vdGlmaWNhdGlvblJlZltdPiB7XG4gIHJldHVybiAoc291cmNlJCkgPT5cbiAgICBzb3VyY2UkLnBpcGUoXG4gICAgICB0YXAoKHZhbHVlcykgPT4ge1xuICAgICAgICBpZiAoIWlzRnVuY3Rpb24oc29ydEZuKSkgcmV0dXJuO1xuICAgICAgICB2YWx1ZXMuc29ydChzb3J0Rm4pO1xuICAgICAgfSksXG4gICAgKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { map } from 'rxjs';
|
|
2
|
+
export function toNotificationCollection() {
|
|
3
|
+
return (source$) => source$.pipe(map((notificationRefs) => ({
|
|
4
|
+
values: notificationRefs,
|
|
5
|
+
count: notificationRefs.length,
|
|
6
|
+
isEmpty: notificationRefs.length === 0,
|
|
7
|
+
})));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tbm90aWZpY2F0aW9uLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9oZWxwZXJzL3RvLW5vdGlmaWNhdGlvbi1jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0IsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzdDLE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekIsTUFBTSxFQUFFLGdCQUFnQjtRQUN4QixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsTUFBTTtRQUM5QixPQUFPLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUM7S0FDdkMsQ0FBQyxDQUFDLENBQ0osQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcGVyYXRvckZ1bmN0aW9uLCBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkNvbGxlY3Rpb24sIE5vdGlmaWNhdGlvblJlZiB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b05vdGlmaWNhdGlvbkNvbGxlY3Rpb24oKTogT3BlcmF0b3JGdW5jdGlvbjxOb3RpZmljYXRpb25SZWZbXSwgTm90aWZpY2F0aW9uQ29sbGVjdGlvbj4ge1xuICByZXR1cm4gKHNvdXJjZSQpID0+XG4gICAgc291cmNlJC5waXBlKFxuICAgICAgbWFwKChub3RpZmljYXRpb25SZWZzKSA9PiAoe1xuICAgICAgICB2YWx1ZXM6IG5vdGlmaWNhdGlvblJlZnMsXG4gICAgICAgIGNvdW50OiBub3RpZmljYXRpb25SZWZzLmxlbmd0aCxcbiAgICAgICAgaXNFbXB0eTogbm90aWZpY2F0aW9uUmVmcy5sZW5ndGggPT09IDAsXG4gICAgICB9KSksXG4gICAgKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './notification';
|
|
2
|
+
export * from './notification-action';
|
|
3
|
+
export * from './notification-collection';
|
|
4
|
+
export * from './notification-feature';
|
|
5
|
+
export * from './notification-options';
|
|
6
|
+
export * from './notification-query';
|
|
7
|
+
export * from './notification-sort-fn';
|
|
8
|
+
export * from './notification.ref';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9tb2RlbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb24tYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZpY2F0aW9uLWNvbGxlY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb24tZmVhdHVyZSc7XG5leHBvcnQgKiBmcm9tICcuL25vdGlmaWNhdGlvbi1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZpY2F0aW9uLXF1ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZpY2F0aW9uLXNvcnQtZm4nO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb24ucmVmJztcbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWFjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL25vdGlmaWNhdGlvbi9zcmMvbGliL21vZGVscy9ub3RpZmljYXRpb24tYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb3RpZmljYXRpb25SZWYgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5yZWYnO1xuXG5leHBvcnQgdHlwZSBOb3RpZmljYXRpb25BY3Rpb24gPSAobm90aWZpY2F0aW9uUmVmOiBOb3RpZmljYXRpb25SZWYpID0+IHZvaWQ7XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9tb2RlbHMvbm90aWZpY2F0aW9uLWNvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vdGlmaWNhdGlvblJlZiB9IGZyb20gJy4vbm90aWZpY2F0aW9uLnJlZic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uQ29sbGVjdGlvbiB7XG4gIHZhbHVlczogTm90aWZpY2F0aW9uUmVmW107XG4gIGNvdW50OiBudW1iZXI7XG4gIGlzRW1wdHk6IGJvb2xlYW47XG59XG4iXX0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export function makeNotificationFeature(provider) {
|
|
2
|
+
return provider;
|
|
3
|
+
}
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWZlYXR1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9tb2RlbHMvbm90aWZpY2F0aW9uLWZlYXR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFFBQW1FO0lBQ3pHLE9BQU8sUUFBd0MsQ0FBQztBQUNsRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnRQcm92aWRlcnMsIFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvbkZlYXR1cmUgPSBFbnZpcm9ubWVudFByb3ZpZGVycyAmIHsgybVvZHhCcmFuZDogJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL25vdGlmaWNhdGlvbjo6Tm90aWZpY2F0aW9uRmVhdHVyZScgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VOb3RpZmljYXRpb25GZWF0dXJlKHByb3ZpZGVyOiAoUHJvdmlkZXIgfCBOb3RpZmljYXRpb25GZWF0dXJlKVtdIHwgRW52aXJvbm1lbnRQcm92aWRlcnMpOiBOb3RpZmljYXRpb25GZWF0dXJlIHtcbiAgcmV0dXJuIHByb3ZpZGVyIGFzIG5ldmVyIGFzIE5vdGlmaWNhdGlvbkZlYXR1cmU7XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9tb2RlbHMvbm90aWZpY2F0aW9uLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uT3B0aW9ucyB7XG4gIGljb246IHN0cmluZztcbiAgdGFnczogc3RyaW5nW107XG4gIGRpc21pc3NhYmxlOiBib29sZWFuO1xuICBhY3Rpb24/OiBzdHJpbmc7XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLXF1ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL3NyYy9saWIvbW9kZWxzL25vdGlmaWNhdGlvbi1xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm90aWZpY2F0aW9uUmVmIH0gZnJvbSAnLi9ub3RpZmljYXRpb24ucmVmJztcblxuZXhwb3J0IHR5cGUgTm90aWZpY2F0aW9uUXVlcnkgPSAobm90aWZpY2F0aW9uUmVmOiBOb3RpZmljYXRpb25SZWYpID0+IGJvb2xlYW47XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLXNvcnQtZm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9tb2RlbHMvbm90aWZpY2F0aW9uLXNvcnQtZm4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vdGlmaWNhdGlvblJlZiB9IGZyb20gJy4vbm90aWZpY2F0aW9uLnJlZic7XG5cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvblNvcnRGbiA9IFBhcmFtZXRlcnM8QXJyYXk8Tm90aWZpY2F0aW9uUmVmPlsnc29ydCddPlswXTtcbiJdfQ==
|