rd-outer-component 0.0.67 → 0.0.69

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.
@@ -1,3 +1,4 @@
1
+ // notification.component.ts
1
2
  import { Component, ViewChild } from '@angular/core';
2
3
  import * as i0 from "@angular/core";
3
4
  import * as i1 from "ng-zorro-antd/notification";
@@ -12,14 +13,16 @@ export class RdNotificationComponent {
12
13
  constructor(notificationService, sanitizer) {
13
14
  this.notificationService = notificationService;
14
15
  this.sanitizer = sanitizer;
16
+ this.notifications = new Map();
15
17
  }
16
18
  showNotification(data) {
17
- this.notification = this.notificationService.template(this.notificationTpl, {
19
+ const notificationId = this.generateId();
20
+ const notification = this.notificationService.template(this.notificationTpl, {
18
21
  nzData: data,
19
22
  nzDuration: data.duration || 8 * 1000,
20
23
  nzStyle: {
21
24
  borderRadius: '4px',
22
- border: `1px solid ${borderColorMap[data?.type]}`,
25
+ border: `1px solid ${borderColorMap[data?.type] || '#e5e7eb'}`,
23
26
  boxShadow: '0px 8px 16px 0px rgba(31, 41, 55, 0.08)',
24
27
  display: 'flex',
25
28
  padding: '0',
@@ -28,20 +31,34 @@ export class RdNotificationComponent {
28
31
  },
29
32
  nzClass: 'custom-wallet-notification',
30
33
  nzCloseIcon: this.closeTpl,
34
+ nzKey: notificationId, // 添加唯一 key
31
35
  });
36
+ this.notifications.set(notificationId, notification);
37
+ // 自动清理
38
+ setTimeout(() => {
39
+ this.notifications.delete(notificationId);
40
+ }, data.duration || 8000);
32
41
  }
33
42
  getDesc(desc) {
34
43
  return this.sanitizer.bypassSecurityTrustHtml(desc);
35
44
  }
36
45
  onClick(data) {
37
- if (this.notification?.messageId) {
38
- this.notificationService.remove(this.notification?.messageId);
39
- }
40
46
  if (data.onLinkClick) {
41
- // 明确检查存在性
42
47
  data.onLinkClick();
43
48
  }
44
49
  }
50
+ generateId() {
51
+ return `rd-notification-${Date.now()}-${Math.random()
52
+ .toString(36)
53
+ .substr(2, 9)}`;
54
+ }
55
+ ngOnDestroy() {
56
+ // 清理所有通知
57
+ this.notifications.forEach((notification, id) => {
58
+ this.notificationService.remove(id);
59
+ });
60
+ this.notifications.clear();
61
+ }
45
62
  }
46
63
  RdNotificationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationComponent, deps: [{ token: i1.NzNotificationService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
47
64
  RdNotificationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RdNotificationComponent, selector: "app-rd-notification", viewQueries: [{ propertyName: "notificationTpl", first: true, predicate: ["notificationTpl"], descendants: true, static: true }, { propertyName: "closeTpl", first: true, predicate: ["closeTpl"], descendants: true, static: true }], ngImport: i0, template: "<ng-template #notificationTpl let-data=\"data\">\n <div class=\"rd-custom-notification\"></div>\n <div\n class=\"rd-custom-notification-icon\"\n [class]=\"\n data.type === 'warn'\n ? 'rd-custom-warn-background'\n : data.type === 'error'\n ? 'rd-custom-error-background'\n : ''\n \"\n >\n <img\n [hidden]=\"data.type !== 'success'\"\n src=\"assets/img/icon/success-tip.svg\"\n />\n <img [hidden]=\"data.type !== 'warn'\" src=\"assets/img/icon/warm-tip.svg\" />\n <img [hidden]=\"data.type !== 'error'\" src=\"assets/img/icon/error-tip.svg\" />\n </div>\n <div class=\"rd-custom-notification-container\">\n <div class=\"rd-custom-notification-title\">{{ data.title }}</div>\n <div\n class=\"rd-custom-notification-desc\"\n [innerHTML]=\"getDesc(data.desc)\"\n ></div>\n <div\n *ngIf=\"data.actionDesc\"\n class=\"rd-custom-notification-link\"\n (click)=\"onClick(data)\"\n >\n {{ data.actionDesc }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #closeTpl>\n <div class=\"rd-custom-notification-close\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3.40039 3.3999L8.00039 7.9999M12.6004 12.5999L8.00039 7.9999M8.00039 7.9999L12.6004 3.3999L3.40039 12.5999\"\n stroke=\"#030712\"\n stroke-width=\"1.36\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n</ng-template>\n", styles: [".rd-custom-notification-container{padding:12px 40px 12px 12px}.rd-custom-notification-container .rd-custom-notification-title{font-size:12px;font-weight:600}.rd-custom-notification-container .rd-custom-notification-desc{font-size:12px;font-weight:500;margin-top:4px}.rd-custom-notification-container .rd-custom-notification-link{color:#367af6;font-size:13px;font-style:normal;font-weight:600;line-height:16px;cursor:pointer;margin-top:12px;padding:0 2px}.rd-custom-warn-background{background-color:#fef0c3!important}.rd-custom-error-background{background-color:#fce8eb!important}.rd-custom-notification-icon{display:flex;width:40px;padding:16px 12px;justify-content:center;align-items:center;flex-shrink:0;align-self:stretch;background-color:#dcfcf0}.rd-custom-notification-icon svg{flex-shrink:0;width:20px;height:20px}.rd-custom-notification-close{padding:16px 12px}.rd-custom-notification-close svg{width:16px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
@@ -55,4 +72,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
55
72
  type: ViewChild,
56
73
  args: ['closeTpl', { static: true }]
57
74
  }] } });
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1saWIvc3JjL2xpYi9tb2R1bGVzL3JkLW5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkLWxpYi9zcmMvbGliL21vZHVsZXMvcmQtbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFlLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFRbEUsTUFBTSxjQUFjLEdBQWtDO0lBQ3BELE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUksRUFBRSxTQUFTO0lBQ2YsS0FBSyxFQUFFLFNBQVM7Q0FDakIsQ0FBQztBQU9GLE1BQU0sT0FBTyx1QkFBdUI7SUFPbEMsWUFDVSxtQkFBMEMsRUFDMUMsU0FBdUI7UUFEdkIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUF1QjtRQUMxQyxjQUFTLEdBQVQsU0FBUyxDQUFjO0lBQzlCLENBQUM7SUFFSixnQkFBZ0IsQ0FBQyxJQUFXO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FDbkQsSUFBSSxDQUFDLGVBQWUsRUFDcEI7WUFDRSxNQUFNLEVBQUUsSUFBSTtZQUNaLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJO1lBQ3JDLE9BQU8sRUFBRTtnQkFDUCxZQUFZLEVBQUUsS0FBSztnQkFDbkIsTUFBTSxFQUFFLGNBQWMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDbEQsU0FBUyxFQUFFLHlDQUF5QztnQkFDcEQsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsT0FBTyxFQUFFLEdBQUc7Z0JBQ1osS0FBSyxFQUFFLE9BQU87Z0JBQ2QsU0FBUyxFQUFFLE1BQU07YUFDbEI7WUFDRCxPQUFPLEVBQUUsNEJBQTRCO1lBQ3JDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUMzQixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVk7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxPQUFPLENBQUMsSUFBVztRQUNqQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztTQUMvRDtRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixVQUFVO1lBQ1YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQzs7cUhBN0NVLHVCQUF1Qjt5R0FBdkIsdUJBQXVCLGtTQ25CcEMsdWpEQXNEQTs0RkRuQ2EsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQjt1SUFNdkIsZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSXRDLFFBQVE7c0JBRGYsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBOek5vdGlmaWNhdGlvblJlZixcbiAgTnpOb3RpZmljYXRpb25TZXJ2aWNlLFxufSBmcm9tICduZy16b3Jyby1hbnRkL25vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBJRGF0YSB9IGZyb20gJy4vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmNvbnN0IGJvcmRlckNvbG9yTWFwOiBSZWNvcmQ8SURhdGFbJ3R5cGUnXSwgc3RyaW5nPiA9IHtcbiAgc3VjY2VzczogJyNiYmY3ZTAnLFxuICB3YXJuOiAnI2ZlZjBjMycsXG4gIGVycm9yOiAnI0VGNzQ4NCcsXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmQtbm90aWZpY2F0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vdGlmaWNhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vdGlmaWNhdGlvbi5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBSZE5vdGlmaWNhdGlvbkNvbXBvbmVudCB7XG4gIEBWaWV3Q2hpbGQoJ25vdGlmaWNhdGlvblRwbCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgbm90aWZpY2F0aW9uVHBsITogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAVmlld0NoaWxkKCdjbG9zZVRwbCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgY2xvc2VUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBwcml2YXRlIG5vdGlmaWNhdGlvbiE6IE56Tm90aWZpY2F0aW9uUmVmO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE56Tm90aWZpY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyXG4gICkge31cblxuICBzaG93Tm90aWZpY2F0aW9uKGRhdGE6IElEYXRhKSB7XG4gICAgdGhpcy5ub3RpZmljYXRpb24gPSB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudGVtcGxhdGUoXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblRwbCxcbiAgICAgIHtcbiAgICAgICAgbnpEYXRhOiBkYXRhLFxuICAgICAgICBuekR1cmF0aW9uOiBkYXRhLmR1cmF0aW9uIHx8IDggKiAxMDAwLFxuICAgICAgICBuelN0eWxlOiB7XG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgICAgICAgICBib3JkZXI6IGAxcHggc29saWQgICR7Ym9yZGVyQ29sb3JNYXBbZGF0YT8udHlwZV19YCxcbiAgICAgICAgICBib3hTaGFkb3c6ICcwcHggOHB4IDE2cHggMHB4IHJnYmEoMzEsIDQxLCA1NSwgMC4wOCknLFxuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICBwYWRkaW5nOiAnMCcsXG4gICAgICAgICAgd2lkdGg6ICczMjBweCcsXG4gICAgICAgICAgbWFyZ2luVG9wOiAnLTFweCcsXG4gICAgICAgIH0sXG4gICAgICAgIG56Q2xhc3M6ICdjdXN0b20td2FsbGV0LW5vdGlmaWNhdGlvbicsXG4gICAgICAgIG56Q2xvc2VJY29uOiB0aGlzLmNsb3NlVHBsLFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXREZXNjKGRlc2M6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChkZXNjKTtcbiAgfVxuXG4gIG9uQ2xpY2soZGF0YTogSURhdGEpIHtcbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb24/Lm1lc3NhZ2VJZCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnJlbW92ZSh0aGlzLm5vdGlmaWNhdGlvbj8ubWVzc2FnZUlkKTtcbiAgICB9XG4gICAgaWYgKGRhdGEub25MaW5rQ2xpY2spIHtcbiAgICAgIC8vIOaYjuehruajgOafpeWtmOWcqOaAp1xuICAgICAgZGF0YS5vbkxpbmtDbGljaygpO1xuICAgIH1cbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNub3RpZmljYXRpb25UcGwgbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxkaXYgY2xhc3M9XCJyZC1jdXN0b20tbm90aWZpY2F0aW9uXCI+PC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cInJkLWN1c3RvbS1ub3RpZmljYXRpb24taWNvblwiXG4gICAgW2NsYXNzXT1cIlxuICAgICAgZGF0YS50eXBlID09PSAnd2FybidcbiAgICAgICAgPyAncmQtY3VzdG9tLXdhcm4tYmFja2dyb3VuZCdcbiAgICAgICAgOiBkYXRhLnR5cGUgPT09ICdlcnJvcidcbiAgICAgICAgPyAncmQtY3VzdG9tLWVycm9yLWJhY2tncm91bmQnXG4gICAgICAgIDogJydcbiAgICBcIlxuICA+XG4gICAgPGltZ1xuICAgICAgW2hpZGRlbl09XCJkYXRhLnR5cGUgIT09ICdzdWNjZXNzJ1wiXG4gICAgICBzcmM9XCJhc3NldHMvaW1nL2ljb24vc3VjY2Vzcy10aXAuc3ZnXCJcbiAgICAvPlxuICAgIDxpbWcgW2hpZGRlbl09XCJkYXRhLnR5cGUgIT09ICd3YXJuJ1wiIHNyYz1cImFzc2V0cy9pbWcvaWNvbi93YXJtLXRpcC5zdmdcIiAvPlxuICAgIDxpbWcgW2hpZGRlbl09XCJkYXRhLnR5cGUgIT09ICdlcnJvcidcIiBzcmM9XCJhc3NldHMvaW1nL2ljb24vZXJyb3ItdGlwLnN2Z1wiIC8+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicmQtY3VzdG9tLW5vdGlmaWNhdGlvbi1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicmQtY3VzdG9tLW5vdGlmaWNhdGlvbi10aXRsZVwiPnt7IGRhdGEudGl0bGUgfX08L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJkLWN1c3RvbS1ub3RpZmljYXRpb24tZGVzY1wiXG4gICAgICBbaW5uZXJIVE1MXT1cImdldERlc2MoZGF0YS5kZXNjKVwiXG4gICAgPjwvZGl2PlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiZGF0YS5hY3Rpb25EZXNjXCJcbiAgICAgIGNsYXNzPVwicmQtY3VzdG9tLW5vdGlmaWNhdGlvbi1saW5rXCJcbiAgICAgIChjbGljayk9XCJvbkNsaWNrKGRhdGEpXCJcbiAgICA+XG4gICAgICB7eyBkYXRhLmFjdGlvbkRlc2MgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Nsb3NlVHBsPlxuICA8ZGl2IGNsYXNzPVwicmQtY3VzdG9tLW5vdGlmaWNhdGlvbi1jbG9zZVwiPlxuICAgIDxzdmdcbiAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICBoZWlnaHQ9XCIxNlwiXG4gICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgIGZpbGw9XCJub25lXCJcbiAgICA+XG4gICAgICA8cGF0aFxuICAgICAgICBkPVwiTTMuNDAwMzkgMy4zOTk5TDguMDAwMzkgNy45OTk5TTEyLjYwMDQgMTIuNTk5OUw4LjAwMDM5IDcuOTk5OU04LjAwMDM5IDcuOTk5OUwxMi42MDA0IDMuMzk5OUwzLjQwMDM5IDEyLjU5OTlcIlxuICAgICAgICBzdHJva2U9XCIjMDMwNzEyXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zNlwiXG4gICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAvPlxuICAgIDwvc3ZnPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1saWIvc3JjL2xpYi9tb2R1bGVzL3JkLW5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkLWxpYi9zcmMvbGliL21vZHVsZXMvcmQtbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBZSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7Ozs7O0FBUTdFLE1BQU0sY0FBYyxHQUEyQjtJQUM3QyxPQUFPLEVBQUUsU0FBUztJQUNsQixJQUFJLEVBQUUsU0FBUztJQUNmLEtBQUssRUFBRSxTQUFTO0NBQ2pCLENBQUM7QUFPRixNQUFNLE9BQU8sdUJBQXVCO0lBU2xDLFlBQ1UsbUJBQTBDLEVBQzFDLFNBQXVCO1FBRHZCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBdUI7UUFDMUMsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUp6QixrQkFBYSxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBSzFELENBQUM7SUFFSixnQkFBZ0IsQ0FBQyxJQUFXO1FBQzFCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV6QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUNwRCxJQUFJLENBQUMsZUFBZSxFQUNwQjtZQUNFLE1BQU0sRUFBRSxJQUFJO1lBQ1osVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUk7WUFDckMsT0FBTyxFQUFFO2dCQUNQLFlBQVksRUFBRSxLQUFLO2dCQUNuQixNQUFNLEVBQUUsY0FBYyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLFNBQVMsRUFBRTtnQkFDL0QsU0FBUyxFQUFFLHlDQUF5QztnQkFDcEQsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsT0FBTyxFQUFFLEdBQUc7Z0JBQ1osS0FBSyxFQUFFLE9BQU87Z0JBQ2QsU0FBUyxFQUFFLE1BQU07YUFDbEI7WUFDRCxPQUFPLEVBQUUsNEJBQTRCO1lBQ3JDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUMxQixLQUFLLEVBQUUsY0FBYyxFQUFFLFdBQVc7U0FDbkMsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXJELE9BQU87UUFDUCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVc7UUFDakIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFTyxVQUFVO1FBQ2hCLE9BQU8sbUJBQW1CLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2FBQ2xELFFBQVEsQ0FBQyxFQUFFLENBQUM7YUFDWixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFdBQVc7UUFDVCxTQUFTO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsQ0FBQzs7cUhBbkVVLHVCQUF1Qjt5R0FBdkIsdUJBQXVCLGtTQ3BCcEMsdWpEQXNEQTs0RkRsQ2EsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQjt1SUFNdkIsZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSXRDLFFBQVE7c0JBRGYsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbm90aWZpY2F0aW9uLmNvbXBvbmVudC50c1xuaW1wb3J0IHsgQ29tcG9uZW50LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE56Tm90aWZpY2F0aW9uUmVmLFxuICBOek5vdGlmaWNhdGlvblNlcnZpY2UsXG59IGZyb20gJ25nLXpvcnJvLWFudGQvbm90aWZpY2F0aW9uJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgSURhdGEgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcblxuY29uc3QgYm9yZGVyQ29sb3JNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIHN1Y2Nlc3M6ICcjYmJmN2UwJyxcbiAgd2FybjogJyNmZWYwYzMnLFxuICBlcnJvcjogJyNFRjc0ODQnLFxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJkLW5vdGlmaWNhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub3RpZmljYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ub3RpZmljYXRpb24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUmROb3RpZmljYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdub3RpZmljYXRpb25UcGwnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIG5vdGlmaWNhdGlvblRwbCE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQFZpZXdDaGlsZCgnY2xvc2VUcGwnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIGNsb3NlVHBsITogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwcml2YXRlIG5vdGlmaWNhdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgTnpOb3RpZmljYXRpb25SZWY+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOek5vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplclxuICApIHt9XG5cbiAgc2hvd05vdGlmaWNhdGlvbihkYXRhOiBJRGF0YSkge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbklkID0gdGhpcy5nZW5lcmF0ZUlkKCk7XG5cbiAgICBjb25zdCBub3RpZmljYXRpb24gPSB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudGVtcGxhdGUoXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblRwbCxcbiAgICAgIHtcbiAgICAgICAgbnpEYXRhOiBkYXRhLFxuICAgICAgICBuekR1cmF0aW9uOiBkYXRhLmR1cmF0aW9uIHx8IDggKiAxMDAwLFxuICAgICAgICBuelN0eWxlOiB7XG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgICAgICAgICBib3JkZXI6IGAxcHggc29saWQgICR7Ym9yZGVyQ29sb3JNYXBbZGF0YT8udHlwZV0gfHwgJyNlNWU3ZWInfWAsXG4gICAgICAgICAgYm94U2hhZG93OiAnMHB4IDhweCAxNnB4IDBweCByZ2JhKDMxLCA0MSwgNTUsIDAuMDgpJyxcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgcGFkZGluZzogJzAnLFxuICAgICAgICAgIHdpZHRoOiAnMzIwcHgnLFxuICAgICAgICAgIG1hcmdpblRvcDogJy0xcHgnLFxuICAgICAgICB9LFxuICAgICAgICBuekNsYXNzOiAnY3VzdG9tLXdhbGxldC1ub3RpZmljYXRpb24nLFxuICAgICAgICBuekNsb3NlSWNvbjogdGhpcy5jbG9zZVRwbCxcbiAgICAgICAgbnpLZXk6IG5vdGlmaWNhdGlvbklkLCAvLyDmt7vliqDllK/kuIAga2V5XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMubm90aWZpY2F0aW9ucy5zZXQobm90aWZpY2F0aW9uSWQsIG5vdGlmaWNhdGlvbik7XG5cbiAgICAvLyDoh6rliqjmuIXnkIZcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5kZWxldGUobm90aWZpY2F0aW9uSWQpO1xuICAgIH0sIGRhdGEuZHVyYXRpb24gfHwgODAwMCk7XG4gIH1cblxuICBnZXREZXNjKGRlc2M6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChkZXNjKTtcbiAgfVxuXG4gIG9uQ2xpY2soZGF0YTogSURhdGEpIHtcbiAgICBpZiAoZGF0YS5vbkxpbmtDbGljaykge1xuICAgICAgZGF0YS5vbkxpbmtDbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgcmQtbm90aWZpY2F0aW9uLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpXG4gICAgICAudG9TdHJpbmcoMzYpXG4gICAgICAuc3Vic3RyKDIsIDkpfWA7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyDmuIXnkIbmiYDmnInpgJrnn6VcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMuZm9yRWFjaCgobm90aWZpY2F0aW9uLCBpZCkgPT4ge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnJlbW92ZShpZCk7XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZmljYXRpb25zLmNsZWFyKCk7XG4gIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjbm90aWZpY2F0aW9uVHBsIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8ZGl2IGNsYXNzPVwicmQtY3VzdG9tLW5vdGlmaWNhdGlvblwiPjwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJyZC1jdXN0b20tbm90aWZpY2F0aW9uLWljb25cIlxuICAgIFtjbGFzc109XCJcbiAgICAgIGRhdGEudHlwZSA9PT0gJ3dhcm4nXG4gICAgICAgID8gJ3JkLWN1c3RvbS13YXJuLWJhY2tncm91bmQnXG4gICAgICAgIDogZGF0YS50eXBlID09PSAnZXJyb3InXG4gICAgICAgID8gJ3JkLWN1c3RvbS1lcnJvci1iYWNrZ3JvdW5kJ1xuICAgICAgICA6ICcnXG4gICAgXCJcbiAgPlxuICAgIDxpbWdcbiAgICAgIFtoaWRkZW5dPVwiZGF0YS50eXBlICE9PSAnc3VjY2VzcydcIlxuICAgICAgc3JjPVwiYXNzZXRzL2ltZy9pY29uL3N1Y2Nlc3MtdGlwLnN2Z1wiXG4gICAgLz5cbiAgICA8aW1nIFtoaWRkZW5dPVwiZGF0YS50eXBlICE9PSAnd2FybidcIiBzcmM9XCJhc3NldHMvaW1nL2ljb24vd2FybS10aXAuc3ZnXCIgLz5cbiAgICA8aW1nIFtoaWRkZW5dPVwiZGF0YS50eXBlICE9PSAnZXJyb3InXCIgc3JjPVwiYXNzZXRzL2ltZy9pY29uL2Vycm9yLXRpcC5zdmdcIiAvPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInJkLWN1c3RvbS1ub3RpZmljYXRpb24tY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cInJkLWN1c3RvbS1ub3RpZmljYXRpb24tdGl0bGVcIj57eyBkYXRhLnRpdGxlIH19PC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyZC1jdXN0b20tbm90aWZpY2F0aW9uLWRlc2NcIlxuICAgICAgW2lubmVySFRNTF09XCJnZXREZXNjKGRhdGEuZGVzYylcIlxuICAgID48L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cImRhdGEuYWN0aW9uRGVzY1wiXG4gICAgICBjbGFzcz1cInJkLWN1c3RvbS1ub3RpZmljYXRpb24tbGlua1wiXG4gICAgICAoY2xpY2spPVwib25DbGljayhkYXRhKVwiXG4gICAgPlxuICAgICAge3sgZGF0YS5hY3Rpb25EZXNjIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjbG9zZVRwbD5cbiAgPGRpdiBjbGFzcz1cInJkLWN1c3RvbS1ub3RpZmljYXRpb24tY2xvc2VcIj5cbiAgICA8c3ZnXG4gICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgIHdpZHRoPVwiMTZcIlxuICAgICAgaGVpZ2h0PVwiMTZcIlxuICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICBmaWxsPVwibm9uZVwiXG4gICAgPlxuICAgICAgPHBhdGhcbiAgICAgICAgZD1cIk0zLjQwMDM5IDMuMzk5OUw4LjAwMDM5IDcuOTk5OU0xMi42MDA0IDEyLjU5OTlMOC4wMDAzOSA3Ljk5OTlNOC4wMDAzOSA3Ljk5OTlMMTIuNjAwNCAzLjM5OTlMMy40MDAzOSAxMi41OTk5XCJcbiAgICAgICAgc3Ryb2tlPVwiIzAzMDcxMlwiXG4gICAgICAgIHN0cm9rZS13aWR0aD1cIjEuMzZcIlxuICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgLz5cbiAgICA8L3N2Zz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -1,19 +1,41 @@
1
- import { NgModule } from '@angular/core';
1
+ // notification.module.ts (在 NPM 包中)
2
+ import { NgModule, Optional, SkipSelf, } from '@angular/core';
2
3
  import { CommonModule } from '@angular/common';
4
+ import { NzNotificationModule } from 'ng-zorro-antd/notification';
3
5
  import { RdNotificationComponent } from './notification.component';
4
- import { RouterModule } from '@angular/router';
5
- import { FormsModule, ReactiveFormsModule } from '@angular/forms';
6
+ import { RdNotificationService } from './notification.service';
6
7
  import * as i0 from "@angular/core";
7
8
  export class RdNotificationModule {
9
+ constructor(parentModule) {
10
+ if (parentModule) {
11
+ throw new Error('RdNotificationModule is already loaded. Import it in the AppModule only');
12
+ }
13
+ }
14
+ // 修复:使用正确的类型和静态方法
15
+ static forRoot(config) {
16
+ return {
17
+ ngModule: RdNotificationModule,
18
+ providers: [
19
+ RdNotificationService,
20
+ // 如果有配置,可以在这里提供
21
+ config ? { provide: 'RD_NOTIFICATION_CONFIG', useValue: config } : [],
22
+ ],
23
+ };
24
+ }
8
25
  }
9
- RdNotificationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
- RdNotificationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, declarations: [RdNotificationComponent], imports: [CommonModule, RouterModule, FormsModule, ReactiveFormsModule] });
11
- RdNotificationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, imports: [CommonModule, RouterModule, FormsModule, ReactiveFormsModule] });
26
+ RdNotificationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, deps: [{ token: RdNotificationModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule });
27
+ RdNotificationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, declarations: [RdNotificationComponent], imports: [CommonModule, NzNotificationModule], exports: [RdNotificationComponent] });
28
+ RdNotificationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, imports: [CommonModule, NzNotificationModule] });
12
29
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, decorators: [{
13
30
  type: NgModule,
14
31
  args: [{
32
+ imports: [CommonModule, NzNotificationModule],
15
33
  declarations: [RdNotificationComponent],
16
- imports: [CommonModule, RouterModule, FormsModule, ReactiveFormsModule],
34
+ exports: [RdNotificationComponent],
17
35
  }]
18
- }] });
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1saWIvc3JjL2xpYi9tb2R1bGVzL3JkLW5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBTWxFLE1BQU0sT0FBTyxvQkFBb0I7O2tIQUFwQixvQkFBb0I7bUhBQXBCLG9CQUFvQixpQkFIaEIsdUJBQXVCLGFBQzVCLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQjttSEFFM0Qsb0JBQW9CLFlBRnJCLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQjs0RkFFM0Qsb0JBQW9CO2tCQUpoQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLHVCQUF1QixDQUFDO29CQUN2QyxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQztpQkFDeEUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJkTm90aWZpY2F0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9ub3RpZmljYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbUmROb3RpZmljYXRpb25Db21wb25lbnRdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSb3V0ZXJNb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgUmROb3RpZmljYXRpb25Nb2R1bGUge31cbiJdfQ==
36
+ }], ctorParameters: function () { return [{ type: RdNotificationModule, decorators: [{
37
+ type: Optional
38
+ }, {
39
+ type: SkipSelf
40
+ }] }]; } });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1saWIvc3JjL2xpYi9tb2R1bGVzL3JkLW5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9DQUFvQztBQUNwQyxPQUFPLEVBQ0wsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEdBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWxFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQWMvRCxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLFlBQW9DLFlBQW1DO1FBQ3JFLElBQUksWUFBWSxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUVBQXlFLENBQzFFLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsTUFBTSxDQUFDLE9BQU8sQ0FDWixNQUE2QjtRQUU3QixPQUFPO1lBQ0wsUUFBUSxFQUFFLG9CQUFvQjtZQUM5QixTQUFTLEVBQUU7Z0JBQ1QscUJBQXFCO2dCQUNyQixnQkFBZ0I7Z0JBQ2hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO2FBQ3RFO1NBQ0YsQ0FBQztJQUNKLENBQUM7O2tIQXJCVSxvQkFBb0I7bUhBQXBCLG9CQUFvQixpQkFIaEIsdUJBQXVCLGFBRDVCLFlBQVksRUFBRSxvQkFBb0IsYUFFbEMsdUJBQXVCO21IQUV0QixvQkFBb0IsWUFKckIsWUFBWSxFQUFFLG9CQUFvQjs0RkFJakMsb0JBQW9CO2tCQUxoQyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQztvQkFDN0MsWUFBWSxFQUFFLENBQUMsdUJBQXVCLENBQUM7b0JBQ3ZDLE9BQU8sRUFBRSxDQUFDLHVCQUF1QixDQUFDO2lCQUNuQzs7MEJBRWMsUUFBUTs7MEJBQUksUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8vIG5vdGlmaWNhdGlvbi5tb2R1bGUudHMgKOWcqCBOUE0g5YyF5LitKVxuaW1wb3J0IHtcbiAgTmdNb2R1bGUsXG4gIE9wdGlvbmFsLFxuICBTa2lwU2VsZixcbiAgTW9kdWxlV2l0aFByb3ZpZGVycyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTnpOb3RpZmljYXRpb25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL25vdGlmaWNhdGlvbic7XG5cbmltcG9ydCB7IFJkTm90aWZpY2F0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9ub3RpZmljYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJkTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuXG4vLyDmt7vliqDphY3nva7mjqXlj6NcbmV4cG9ydCBpbnRlcmZhY2UgUmROb3RpZmljYXRpb25Db25maWcge1xuICAvLyDlj6/ku6Xmt7vliqDphY3nva7pgInpobnvvIzmr5TlpoLpu5jorqTmjIHnu63ml7bpl7TnrYlcbiAgZGVmYXVsdER1cmF0aW9uPzogbnVtYmVyO1xuICBtYXhTdGFjaz86IG51bWJlcjtcbn1cblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTnpOb3RpZmljYXRpb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtSZE5vdGlmaWNhdGlvbkNvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtSZE5vdGlmaWNhdGlvbkNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIFJkTm90aWZpY2F0aW9uTW9kdWxlIHtcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcGFyZW50TW9kdWxlPzogUmROb3RpZmljYXRpb25Nb2R1bGUpIHtcbiAgICBpZiAocGFyZW50TW9kdWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdSZE5vdGlmaWNhdGlvbk1vZHVsZSBpcyBhbHJlYWR5IGxvYWRlZC4gSW1wb3J0IGl0IGluIHRoZSBBcHBNb2R1bGUgb25seSdcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8g5L+u5aSN77ya5L2/55So5q2j56Gu55qE57G75Z6L5ZKM6Z2Z5oCB5pa55rOVXG4gIHN0YXRpYyBmb3JSb290KFxuICAgIGNvbmZpZz86IFJkTm90aWZpY2F0aW9uQ29uZmlnXG4gICk6IE1vZHVsZVdpdGhQcm92aWRlcnM8UmROb3RpZmljYXRpb25Nb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IFJkTm90aWZpY2F0aW9uTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIFJkTm90aWZpY2F0aW9uU2VydmljZSxcbiAgICAgICAgLy8g5aaC5p6c5pyJ6YWN572u77yM5Y+v5Lul5Zyo6L+Z6YeM5o+Q5L6bXG4gICAgICAgIGNvbmZpZyA/IHsgcHJvdmlkZTogJ1JEX05PVElGSUNBVElPTl9DT05GSUcnLCB1c2VWYWx1ZTogY29uZmlnIH0gOiBbXSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -1,38 +1,105 @@
1
- import { Injectable } from '@angular/core';
2
- import { createComponent, } from '@angular/core';
1
+ // notification.service.ts
2
+ import { Injectable, } from '@angular/core';
3
+ import { createComponent } from '@angular/core';
3
4
  import { RdNotificationComponent } from './notification.component';
4
5
  import * as i0 from "@angular/core";
5
6
  export class RdNotificationService {
6
- constructor(applicationRef, injector) {
7
- this.applicationRef = applicationRef;
7
+ constructor(injector, environmentInjector // 添加 EnvironmentInjector
8
+ ) {
8
9
  this.injector = injector;
9
- this.createNotificationComponent();
10
+ this.environmentInjector = environmentInjector;
11
+ this.isCreating = false;
12
+ // 防止重复实例化
13
+ if (RdNotificationService.instance) {
14
+ return RdNotificationService.instance;
15
+ }
16
+ RdNotificationService.instance = this;
10
17
  }
11
- createNotificationComponent() {
12
- // 创建组件
13
- this.notificationComponent = createComponent(RdNotificationComponent, {
14
- environmentInjector: this.applicationRef.injector,
15
- elementInjector: this.injector,
18
+ ensureComponentCreated() {
19
+ return new Promise((resolve) => {
20
+ if (this.notificationComponentRef) {
21
+ resolve();
22
+ return;
23
+ }
24
+ if (this.isCreating) {
25
+ // 如果正在创建,等待创建完成
26
+ const checkInterval = setInterval(() => {
27
+ if (this.notificationComponentRef && !this.isCreating) {
28
+ clearInterval(checkInterval);
29
+ resolve();
30
+ }
31
+ }, 10);
32
+ return;
33
+ }
34
+ this.isCreating = true;
35
+ try {
36
+ // 使用 setTimeout 避免在 Angular 生命周期内创建组件
37
+ setTimeout(() => {
38
+ // Angular 15+ 的正确用法
39
+ this.notificationComponentRef = createComponent(RdNotificationComponent, {
40
+ environmentInjector: this.environmentInjector,
41
+ elementInjector: this.injector,
42
+ });
43
+ const hostView = this.notificationComponentRef
44
+ .hostView;
45
+ const rootNode = hostView.rootNodes[0];
46
+ if (document.body) {
47
+ document.body.appendChild(rootNode);
48
+ }
49
+ else {
50
+ // 如果 document.body 还不存在,等待 DOM 准备就绪
51
+ document.addEventListener('DOMContentLoaded', () => {
52
+ document.body.appendChild(rootNode);
53
+ });
54
+ }
55
+ this.notificationComponentRef.changeDetectorRef.detectChanges();
56
+ this.isCreating = false;
57
+ resolve();
58
+ });
59
+ }
60
+ catch (error) {
61
+ console.error('Failed to create notification component:', error);
62
+ this.isCreating = false;
63
+ resolve();
64
+ }
16
65
  });
17
- // 添加到 DOM
18
- const domElem = this.notificationComponent.hostView.rootNodes[0];
19
- document.body.appendChild(domElem);
20
- // 添加到 ApplicationRef
21
- this.applicationRef.attachView(this.notificationComponent.hostView);
22
66
  }
23
- /**
24
- * 显示通知
25
- */
26
- show(data) {
27
- this.notificationComponent?.instance.showNotification(data);
67
+ async show(data) {
68
+ await this.ensureComponentCreated();
69
+ if (this.notificationComponentRef?.instance) {
70
+ // 使用 setTimeout 确保在下一个 Angular 周期执行
71
+ setTimeout(() => {
72
+ this.notificationComponentRef.instance.showNotification(data);
73
+ });
74
+ }
75
+ }
76
+ ngOnDestroy() {
77
+ if (this.notificationComponentRef) {
78
+ this.notificationComponentRef.destroy();
79
+ this.notificationComponentRef = undefined;
80
+ }
81
+ RdNotificationService.instance = null;
82
+ }
83
+ // 静态方法用于快速访问
84
+ static show(data) {
85
+ setTimeout(() => {
86
+ const instance = this.getInstance();
87
+ if (instance) {
88
+ instance.show(data);
89
+ }
90
+ });
91
+ }
92
+ static getInstance() {
93
+ return this.instance;
28
94
  }
29
95
  }
30
- RdNotificationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, deps: [{ token: i0.ApplicationRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
96
+ RdNotificationService.instance = null;
97
+ RdNotificationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, deps: [{ token: i0.Injector }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable });
31
98
  RdNotificationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, providedIn: 'root' });
32
99
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, decorators: [{
33
100
  type: Injectable,
34
101
  args: [{
35
102
  providedIn: 'root',
36
103
  }]
37
- }], ctorParameters: function () { return [{ type: i0.ApplicationRef }, { type: i0.Injector }]; } });
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQtbGliL3NyYy9saWIvbW9kdWxlcy9yZC1ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwsZUFBZSxHQUloQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFjbkUsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxZQUNVLGNBQThCLEVBQzlCLFFBQWtCO1FBRGxCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBRTFCLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTywyQkFBMkI7UUFDakMsT0FBTztRQUNQLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxlQUFlLENBQUMsdUJBQXVCLEVBQUU7WUFDcEUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRO1lBQ2pELGVBQWUsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUMvQixDQUFDLENBQUM7UUFFSCxVQUFVO1FBQ1YsTUFBTSxPQUFPLEdBQ1gsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQzVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkMscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLENBQUMsSUFBVztRQUNkLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQzs7bUhBaENVLHFCQUFxQjt1SEFBckIscUJBQXFCLGNBRnBCLE1BQU07NEZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFJlZixcbiAgY3JlYXRlQ29tcG9uZW50LFxuICBBcHBsaWNhdGlvblJlZixcbiAgSW5qZWN0b3IsXG4gIEVtYmVkZGVkVmlld1JlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZE5vdGlmaWNhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vbm90aWZpY2F0aW9uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGEge1xuICB0aXRsZT86IHN0cmluZztcbiAgZGVzYz86IHN0cmluZztcbiAgYWN0aW9uRGVzYz86IHN0cmluZztcbiAgZHVyYXRpb24/OiBudW1iZXI7XG4gIHR5cGU6ICdzdWNjZXNzJyB8ICd3YXJuJyB8ICdlcnJvcic7XG4gIG9uTGlua0NsaWNrPzogKCkgPT4gdm9pZDtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFJkTm90aWZpY2F0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uQ29tcG9uZW50PzogQ29tcG9uZW50UmVmPFJkTm90aWZpY2F0aW9uQ29tcG9uZW50PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFwcGxpY2F0aW9uUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvclxuICApIHtcbiAgICB0aGlzLmNyZWF0ZU5vdGlmaWNhdGlvbkNvbXBvbmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOb3RpZmljYXRpb25Db21wb25lbnQoKSB7XG4gICAgLy8g5Yib5bu657uE5Lu2XG4gICAgdGhpcy5ub3RpZmljYXRpb25Db21wb25lbnQgPSBjcmVhdGVDb21wb25lbnQoUmROb3RpZmljYXRpb25Db21wb25lbnQsIHtcbiAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuYXBwbGljYXRpb25SZWYuaW5qZWN0b3IsXG4gICAgICBlbGVtZW50SW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG5cbiAgICAvLyDmt7vliqDliLAgRE9NXG4gICAgY29uc3QgZG9tRWxlbSA9IChcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uQ29tcG9uZW50Lmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+XG4gICAgKS5yb290Tm9kZXNbMF07XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb21FbGVtKTtcblxuICAgIC8vIOa3u+WKoOWIsCBBcHBsaWNhdGlvblJlZlxuICAgIHRoaXMuYXBwbGljYXRpb25SZWYuYXR0YWNoVmlldyh0aGlzLm5vdGlmaWNhdGlvbkNvbXBvbmVudC5ob3N0Vmlldyk7XG4gIH1cblxuICAvKipcbiAgICog5pi+56S66YCa55+lXG4gICAqL1xuICBzaG93KGRhdGE6IElEYXRhKSB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25Db21wb25lbnQ/Lmluc3RhbmNlLnNob3dOb3RpZmljYXRpb24oZGF0YSk7XG4gIH1cbn1cbiJdfQ==
104
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.EnvironmentInjector }]; } });
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQtbGliL3NyYy9saWIvbW9kdWxlcy9yZC1ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMEJBQTBCO0FBQzFCLE9BQU8sRUFDTCxVQUFVLEdBSVgsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFnQixlQUFlLEVBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQWNuRSxNQUFNLE9BQU8scUJBQXFCO0lBS2hDLFlBQ1UsUUFBa0IsRUFDbEIsbUJBQXdDLENBQUMseUJBQXlCOztRQURsRSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFKMUMsZUFBVSxHQUFHLEtBQUssQ0FBQztRQU16QixVQUFVO1FBQ1YsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLEVBQUU7WUFDbEMsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLENBQUM7U0FDdkM7UUFDRCxxQkFBcUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdCLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFO2dCQUNqQyxPQUFPLEVBQUUsQ0FBQztnQkFDVixPQUFPO2FBQ1I7WUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLGdCQUFnQjtnQkFDaEIsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtvQkFDckMsSUFBSSxJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO3dCQUNyRCxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQzdCLE9BQU8sRUFBRSxDQUFDO3FCQUNYO2dCQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDUCxPQUFPO2FBQ1I7WUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUV2QixJQUFJO2dCQUNGLHNDQUFzQztnQkFDdEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxvQkFBb0I7b0JBQ3BCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxlQUFlLENBQzdDLHVCQUF1QixFQUN2Qjt3QkFDRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO3dCQUM3QyxlQUFlLEVBQUUsSUFBSSxDQUFDLFFBQVE7cUJBQy9CLENBQ0YsQ0FBQztvQkFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsd0JBQXdCO3lCQUMzQyxRQUFnQyxDQUFDO29CQUNwQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUV2QyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7d0JBQ2pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUNyQzt5QkFBTTt3QkFDTCxvQ0FBb0M7d0JBQ3BDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7NEJBQ2pELFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUN0QyxDQUFDLENBQUMsQ0FBQztxQkFDSjtvQkFFRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ2hFLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO29CQUN4QixPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDLENBQUMsQ0FBQzthQUNKO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLE9BQU8sRUFBRSxDQUFDO2FBQ1g7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQVc7UUFDcEIsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxRQUFRLEVBQUU7WUFDM0Msb0NBQW9DO1lBQ3BDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLHdCQUF5QixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRSxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNqQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQztTQUMzQztRQUNELHFCQUFxQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDeEMsQ0FBQztJQUVELGFBQWE7SUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLElBQVc7UUFDckIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxJQUFJLFFBQVEsRUFBRTtnQkFDWixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVc7UUFDeEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7O0FBdkdjLDhCQUFRLEdBQWlDLElBQUksQ0FBQzttSEFEbEQscUJBQXFCO3VIQUFyQixxQkFBcUIsY0FGcEIsTUFBTTs0RkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbm90aWZpY2F0aW9uLnNlcnZpY2UudHNcbmltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBjcmVhdGVDb21wb25lbnQsIEVtYmVkZGVkVmlld1JlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmROb3RpZmljYXRpb25Db21wb25lbnQgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIGRlc2M/OiBzdHJpbmc7XG4gIGFjdGlvbkRlc2M/OiBzdHJpbmc7XG4gIGR1cmF0aW9uPzogbnVtYmVyO1xuICB0eXBlOiAnc3VjY2VzcycgfCAnd2FybicgfCAnZXJyb3InO1xuICBvbkxpbmtDbGljaz86ICgpID0+IHZvaWQ7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZE5vdGlmaWNhdGlvblNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogUmROb3RpZmljYXRpb25TZXJ2aWNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPFJkTm90aWZpY2F0aW9uQ29tcG9uZW50PjtcbiAgcHJpdmF0ZSBpc0NyZWF0aW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBlbnZpcm9ubWVudEluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yIC8vIOa3u+WKoCBFbnZpcm9ubWVudEluamVjdG9yXG4gICkge1xuICAgIC8vIOmYsuatoumHjeWkjeWunuS+i+WMllxuICAgIGlmIChSZE5vdGlmaWNhdGlvblNlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBSZE5vdGlmaWNhdGlvblNlcnZpY2UuaW5zdGFuY2U7XG4gICAgfVxuICAgIFJkTm90aWZpY2F0aW9uU2VydmljZS5pbnN0YW5jZSA9IHRoaXM7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUNvbXBvbmVudENyZWF0ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAodGhpcy5ub3RpZmljYXRpb25Db21wb25lbnRSZWYpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgICAgLy8g5aaC5p6c5q2j5Zyo5Yib5bu677yM562J5b6F5Yib5bu65a6M5oiQXG4gICAgICAgIGNvbnN0IGNoZWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubm90aWZpY2F0aW9uQ29tcG9uZW50UmVmICYmICF0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY2hlY2tJbnRlcnZhbCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0NyZWF0aW5nID0gdHJ1ZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8g5L2/55SoIHNldFRpbWVvdXQg6YG/5YWN5ZyoIEFuZ3VsYXIg55Sf5ZG95ZGo5pyf5YaF5Yib5bu657uE5Lu2XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIEFuZ3VsYXIgMTUrIOeahOato+ehrueUqOazlVxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ29tcG9uZW50UmVmID0gY3JlYXRlQ29tcG9uZW50KFxuICAgICAgICAgICAgUmROb3RpZmljYXRpb25Db21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52aXJvbm1lbnRJbmplY3RvciwgLy8g5b+F6ZyA5Y+C5pWwXG4gICAgICAgICAgICAgIGVsZW1lbnRJbmplY3RvcjogdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgaG9zdFZpZXcgPSB0aGlzLm5vdGlmaWNhdGlvbkNvbXBvbmVudFJlZlxuICAgICAgICAgICAgLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+O1xuICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gaG9zdFZpZXcucm9vdE5vZGVzWzBdO1xuXG4gICAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocm9vdE5vZGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDlpoLmnpwgZG9jdW1lbnQuYm9keSDov5jkuI3lrZjlnKjvvIznrYnlvoUgRE9NIOWHhuWkh+Wwsee7qlxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyb290Tm9kZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgdGhpcy5pc0NyZWF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgbm90aWZpY2F0aW9uIGNvbXBvbmVudDonLCBlcnJvcik7XG4gICAgICAgIHRoaXMuaXNDcmVhdGluZyA9IGZhbHNlO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaG93KGRhdGE6IElEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVDb21wb25lbnRDcmVhdGVkKCk7XG5cbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25Db21wb25lbnRSZWY/Lmluc3RhbmNlKSB7XG4gICAgICAvLyDkvb/nlKggc2V0VGltZW91dCDnoa7kv53lnKjkuIvkuIDkuKogQW5ndWxhciDlkajmnJ/miafooYxcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNvbXBvbmVudFJlZiEuaW5zdGFuY2Uuc2hvd05vdGlmaWNhdGlvbihkYXRhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm5vdGlmaWNhdGlvbkNvbXBvbmVudFJlZikge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25Db21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25Db21wb25lbnRSZWYgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFJkTm90aWZpY2F0aW9uU2VydmljZS5pbnN0YW5jZSA9IG51bGw7XG4gIH1cblxuICAvLyDpnZnmgIHmlrnms5XnlKjkuo7lv6vpgJ/orr/pl65cbiAgc3RhdGljIHNob3coZGF0YTogSURhdGEpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5nZXRJbnN0YW5jZSgpO1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIGluc3RhbmNlLnNob3coZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBSZE5vdGlmaWNhdGlvblNlcnZpY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgfVxufVxuIl19
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, forwardRef, Component, Input, Output, NgModule, ViewChild, createComponent, Injectable, Pipe } from '@angular/core';
2
+ import { EventEmitter, forwardRef, Component, Input, Output, NgModule, ViewChild, createComponent, Injectable, Optional, SkipSelf, Pipe } from '@angular/core';
3
3
  import * as i2 from '@angular/forms';
4
4
  import { NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule, NG_VALIDATORS } from '@angular/forms';
5
5
  import * as i1 from '@angular/common';
@@ -25,15 +25,15 @@ import * as i2$2 from 'ng-zorro-antd/button';
25
25
  import { NzButtonModule } from 'ng-zorro-antd/button';
26
26
  import * as i2$1 from 'ng-zorro-antd/core/transition-patch';
27
27
  import { differenceInCalendarDays } from 'date-fns';
28
- import { __decorate } from 'tslib';
28
+ import { __decorate, __awaiter } from 'tslib';
29
29
  import { NzDropDownModule } from 'ng-zorro-antd/dropdown';
30
30
  import * as i4$2 from 'ng-zorro-antd/pagination';
31
31
  import { NzPaginationModule } from 'ng-zorro-antd/pagination';
32
32
  import * as i5 from 'ng-zorro-antd/grid';
33
33
  import { NzGridModule } from 'ng-zorro-antd/grid';
34
34
  import * as i1$1 from 'ng-zorro-antd/notification';
35
+ import { NzNotificationModule } from 'ng-zorro-antd/notification';
35
36
  import * as i2$3 from '@angular/platform-browser';
36
- import { RouterModule } from '@angular/router';
37
37
  import { Subject, isObservable, of } from 'rxjs';
38
38
  import { debounceTime, filter, switchMap } from 'rxjs/operators';
39
39
 
@@ -1806,6 +1806,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1806
1806
  }]
1807
1807
  }] });
1808
1808
 
1809
+ // notification.component.ts
1809
1810
  const borderColorMap = {
1810
1811
  success: '#bbf7e0',
1811
1812
  warn: '#fef0c3',
@@ -1815,14 +1816,16 @@ class RdNotificationComponent {
1815
1816
  constructor(notificationService, sanitizer) {
1816
1817
  this.notificationService = notificationService;
1817
1818
  this.sanitizer = sanitizer;
1819
+ this.notifications = new Map();
1818
1820
  }
1819
1821
  showNotification(data) {
1820
- this.notification = this.notificationService.template(this.notificationTpl, {
1822
+ const notificationId = this.generateId();
1823
+ const notification = this.notificationService.template(this.notificationTpl, {
1821
1824
  nzData: data,
1822
1825
  nzDuration: data.duration || 8 * 1000,
1823
1826
  nzStyle: {
1824
1827
  borderRadius: '4px',
1825
- border: `1px solid ${borderColorMap[data === null || data === void 0 ? void 0 : data.type]}`,
1828
+ border: `1px solid ${borderColorMap[data === null || data === void 0 ? void 0 : data.type] || '#e5e7eb'}`,
1826
1829
  boxShadow: '0px 8px 16px 0px rgba(31, 41, 55, 0.08)',
1827
1830
  display: 'flex',
1828
1831
  padding: '0',
@@ -1831,21 +1834,34 @@ class RdNotificationComponent {
1831
1834
  },
1832
1835
  nzClass: 'custom-wallet-notification',
1833
1836
  nzCloseIcon: this.closeTpl,
1837
+ nzKey: notificationId, // 添加唯一 key
1834
1838
  });
1839
+ this.notifications.set(notificationId, notification);
1840
+ // 自动清理
1841
+ setTimeout(() => {
1842
+ this.notifications.delete(notificationId);
1843
+ }, data.duration || 8000);
1835
1844
  }
1836
1845
  getDesc(desc) {
1837
1846
  return this.sanitizer.bypassSecurityTrustHtml(desc);
1838
1847
  }
1839
1848
  onClick(data) {
1840
- var _a, _b;
1841
- if ((_a = this.notification) === null || _a === void 0 ? void 0 : _a.messageId) {
1842
- this.notificationService.remove((_b = this.notification) === null || _b === void 0 ? void 0 : _b.messageId);
1843
- }
1844
1849
  if (data.onLinkClick) {
1845
- // 明确检查存在性
1846
1850
  data.onLinkClick();
1847
1851
  }
1848
1852
  }
1853
+ generateId() {
1854
+ return `rd-notification-${Date.now()}-${Math.random()
1855
+ .toString(36)
1856
+ .substr(2, 9)}`;
1857
+ }
1858
+ ngOnDestroy() {
1859
+ // 清理所有通知
1860
+ this.notifications.forEach((notification, id) => {
1861
+ this.notificationService.remove(id);
1862
+ });
1863
+ this.notifications.clear();
1864
+ }
1849
1865
  }
1850
1866
  RdNotificationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationComponent, deps: [{ token: i1$1.NzNotificationService }, { token: i2$3.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
1851
1867
  RdNotificationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RdNotificationComponent, selector: "app-rd-notification", viewQueries: [{ propertyName: "notificationTpl", first: true, predicate: ["notificationTpl"], descendants: true, static: true }, { propertyName: "closeTpl", first: true, predicate: ["closeTpl"], descendants: true, static: true }], ngImport: i0, template: "<ng-template #notificationTpl let-data=\"data\">\n <div class=\"rd-custom-notification\"></div>\n <div\n class=\"rd-custom-notification-icon\"\n [class]=\"\n data.type === 'warn'\n ? 'rd-custom-warn-background'\n : data.type === 'error'\n ? 'rd-custom-error-background'\n : ''\n \"\n >\n <img\n [hidden]=\"data.type !== 'success'\"\n src=\"assets/img/icon/success-tip.svg\"\n />\n <img [hidden]=\"data.type !== 'warn'\" src=\"assets/img/icon/warm-tip.svg\" />\n <img [hidden]=\"data.type !== 'error'\" src=\"assets/img/icon/error-tip.svg\" />\n </div>\n <div class=\"rd-custom-notification-container\">\n <div class=\"rd-custom-notification-title\">{{ data.title }}</div>\n <div\n class=\"rd-custom-notification-desc\"\n [innerHTML]=\"getDesc(data.desc)\"\n ></div>\n <div\n *ngIf=\"data.actionDesc\"\n class=\"rd-custom-notification-link\"\n (click)=\"onClick(data)\"\n >\n {{ data.actionDesc }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #closeTpl>\n <div class=\"rd-custom-notification-close\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3.40039 3.3999L8.00039 7.9999M12.6004 12.5999L8.00039 7.9999M8.00039 7.9999L12.6004 3.3999L3.40039 12.5999\"\n stroke=\"#030712\"\n stroke-width=\"1.36\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n</ng-template>\n", styles: [".rd-custom-notification-container{padding:12px 40px 12px 12px}.rd-custom-notification-container .rd-custom-notification-title{font-size:12px;font-weight:600}.rd-custom-notification-container .rd-custom-notification-desc{font-size:12px;font-weight:500;margin-top:4px}.rd-custom-notification-container .rd-custom-notification-link{color:#367af6;font-size:13px;font-style:normal;font-weight:600;line-height:16px;cursor:pointer;margin-top:12px;padding:0 2px}.rd-custom-warn-background{background-color:#fef0c3!important}.rd-custom-error-background{background-color:#fce8eb!important}.rd-custom-notification-icon{display:flex;width:40px;padding:16px 12px;justify-content:center;align-items:center;flex-shrink:0;align-self:stretch;background-color:#dcfcf0}.rd-custom-notification-icon svg{flex-shrink:0;width:20px;height:20px}.rd-custom-notification-close{padding:16px 12px}.rd-custom-notification-close svg{width:16px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
@@ -1860,53 +1876,145 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1860
1876
  args: ['closeTpl', { static: true }]
1861
1877
  }] } });
1862
1878
 
1863
- class RdNotificationModule {
1864
- }
1865
- RdNotificationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1866
- RdNotificationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, declarations: [RdNotificationComponent], imports: [CommonModule, RouterModule, FormsModule, ReactiveFormsModule] });
1867
- RdNotificationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, imports: [CommonModule, RouterModule, FormsModule, ReactiveFormsModule] });
1868
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, decorators: [{
1869
- type: NgModule,
1870
- args: [{
1871
- declarations: [RdNotificationComponent],
1872
- imports: [CommonModule, RouterModule, FormsModule, ReactiveFormsModule],
1873
- }]
1874
- }] });
1875
-
1876
1879
  class RdNotificationService {
1877
- constructor(applicationRef, injector) {
1878
- this.applicationRef = applicationRef;
1880
+ constructor(injector, environmentInjector // 添加 EnvironmentInjector
1881
+ ) {
1879
1882
  this.injector = injector;
1880
- this.createNotificationComponent();
1883
+ this.environmentInjector = environmentInjector;
1884
+ this.isCreating = false;
1885
+ // 防止重复实例化
1886
+ if (RdNotificationService.instance) {
1887
+ return RdNotificationService.instance;
1888
+ }
1889
+ RdNotificationService.instance = this;
1881
1890
  }
1882
- createNotificationComponent() {
1883
- // 创建组件
1884
- this.notificationComponent = createComponent(RdNotificationComponent, {
1885
- environmentInjector: this.applicationRef.injector,
1886
- elementInjector: this.injector,
1891
+ ensureComponentCreated() {
1892
+ return new Promise((resolve) => {
1893
+ if (this.notificationComponentRef) {
1894
+ resolve();
1895
+ return;
1896
+ }
1897
+ if (this.isCreating) {
1898
+ // 如果正在创建,等待创建完成
1899
+ const checkInterval = setInterval(() => {
1900
+ if (this.notificationComponentRef && !this.isCreating) {
1901
+ clearInterval(checkInterval);
1902
+ resolve();
1903
+ }
1904
+ }, 10);
1905
+ return;
1906
+ }
1907
+ this.isCreating = true;
1908
+ try {
1909
+ // 使用 setTimeout 避免在 Angular 生命周期内创建组件
1910
+ setTimeout(() => {
1911
+ // Angular 15+ 的正确用法
1912
+ this.notificationComponentRef = createComponent(RdNotificationComponent, {
1913
+ environmentInjector: this.environmentInjector,
1914
+ elementInjector: this.injector,
1915
+ });
1916
+ const hostView = this.notificationComponentRef
1917
+ .hostView;
1918
+ const rootNode = hostView.rootNodes[0];
1919
+ if (document.body) {
1920
+ document.body.appendChild(rootNode);
1921
+ }
1922
+ else {
1923
+ // 如果 document.body 还不存在,等待 DOM 准备就绪
1924
+ document.addEventListener('DOMContentLoaded', () => {
1925
+ document.body.appendChild(rootNode);
1926
+ });
1927
+ }
1928
+ this.notificationComponentRef.changeDetectorRef.detectChanges();
1929
+ this.isCreating = false;
1930
+ resolve();
1931
+ });
1932
+ }
1933
+ catch (error) {
1934
+ console.error('Failed to create notification component:', error);
1935
+ this.isCreating = false;
1936
+ resolve();
1937
+ }
1887
1938
  });
1888
- // 添加到 DOM
1889
- const domElem = this.notificationComponent.hostView.rootNodes[0];
1890
- document.body.appendChild(domElem);
1891
- // 添加到 ApplicationRef
1892
- this.applicationRef.attachView(this.notificationComponent.hostView);
1893
- }
1894
- /**
1895
- * 显示通知
1896
- */
1939
+ }
1897
1940
  show(data) {
1898
1941
  var _a;
1899
- (_a = this.notificationComponent) === null || _a === void 0 ? void 0 : _a.instance.showNotification(data);
1942
+ return __awaiter(this, void 0, void 0, function* () {
1943
+ yield this.ensureComponentCreated();
1944
+ if ((_a = this.notificationComponentRef) === null || _a === void 0 ? void 0 : _a.instance) {
1945
+ // 使用 setTimeout 确保在下一个 Angular 周期执行
1946
+ setTimeout(() => {
1947
+ this.notificationComponentRef.instance.showNotification(data);
1948
+ });
1949
+ }
1950
+ });
1951
+ }
1952
+ ngOnDestroy() {
1953
+ if (this.notificationComponentRef) {
1954
+ this.notificationComponentRef.destroy();
1955
+ this.notificationComponentRef = undefined;
1956
+ }
1957
+ RdNotificationService.instance = null;
1958
+ }
1959
+ // 静态方法用于快速访问
1960
+ static show(data) {
1961
+ setTimeout(() => {
1962
+ const instance = this.getInstance();
1963
+ if (instance) {
1964
+ instance.show(data);
1965
+ }
1966
+ });
1967
+ }
1968
+ static getInstance() {
1969
+ return this.instance;
1900
1970
  }
1901
1971
  }
1902
- RdNotificationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, deps: [{ token: i0.ApplicationRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
1972
+ RdNotificationService.instance = null;
1973
+ RdNotificationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, deps: [{ token: i0.Injector }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable });
1903
1974
  RdNotificationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, providedIn: 'root' });
1904
1975
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, decorators: [{
1905
1976
  type: Injectable,
1906
1977
  args: [{
1907
1978
  providedIn: 'root',
1908
1979
  }]
1909
- }], ctorParameters: function () { return [{ type: i0.ApplicationRef }, { type: i0.Injector }]; } });
1980
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.EnvironmentInjector }]; } });
1981
+
1982
+ // notification.module.ts (在 NPM 包中)
1983
+ class RdNotificationModule {
1984
+ constructor(parentModule) {
1985
+ if (parentModule) {
1986
+ throw new Error('RdNotificationModule is already loaded. Import it in the AppModule only');
1987
+ }
1988
+ }
1989
+ // 修复:使用正确的类型和静态方法
1990
+ static forRoot(config) {
1991
+ return {
1992
+ ngModule: RdNotificationModule,
1993
+ providers: [
1994
+ RdNotificationService,
1995
+ // 如果有配置,可以在这里提供
1996
+ config ? { provide: 'RD_NOTIFICATION_CONFIG', useValue: config } : [],
1997
+ ],
1998
+ };
1999
+ }
2000
+ }
2001
+ RdNotificationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, deps: [{ token: RdNotificationModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule });
2002
+ RdNotificationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, declarations: [RdNotificationComponent], imports: [CommonModule, NzNotificationModule], exports: [RdNotificationComponent] });
2003
+ RdNotificationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, imports: [CommonModule, NzNotificationModule] });
2004
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, decorators: [{
2005
+ type: NgModule,
2006
+ args: [{
2007
+ imports: [CommonModule, NzNotificationModule],
2008
+ declarations: [RdNotificationComponent],
2009
+ exports: [RdNotificationComponent],
2010
+ }]
2011
+ }], ctorParameters: function () {
2012
+ return [{ type: RdNotificationModule, decorators: [{
2013
+ type: Optional
2014
+ }, {
2015
+ type: SkipSelf
2016
+ }] }];
2017
+ } });
1910
2018
 
1911
2019
  class SearchListBaseComponent {
1912
2020
  constructor(searchStorageKey = '', isOutDatePicker = false) {