@rolatech/angular-account 17.2.0 → 17.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/esm2022/lib/components/avatar-update-dialog/avatar-update-dialog.component.mjs +3 -3
  2. package/esm2022/lib/components/forgot-password/forgot-password.component.mjs +3 -3
  3. package/esm2022/lib/components/index.mjs +2 -1
  4. package/esm2022/lib/components/login/login-wechat/login-wechat.component.mjs +3 -3
  5. package/esm2022/lib/components/logout/logout.component.mjs +3 -3
  6. package/esm2022/lib/components/passwordreset/passwordreset.component.mjs +3 -3
  7. package/esm2022/lib/components/topbar-login/topbar-login.component.mjs +3 -3
  8. package/esm2022/lib/components/user-item/user-item.component.mjs +28 -0
  9. package/esm2022/lib/pages/accounts/signin/signin.component.mjs +37 -38
  10. package/esm2022/lib/pages/accounts/signup/signup.component.mjs +3 -3
  11. package/esm2022/lib/pages/myaccount/email/email.component.mjs +3 -3
  12. package/esm2022/lib/pages/myaccount/email-verification/email-verification.component.mjs +3 -3
  13. package/esm2022/lib/pages/myaccount/gender/gender.component.mjs +3 -3
  14. package/esm2022/lib/pages/myaccount/home/home.component.mjs +60 -9
  15. package/esm2022/lib/pages/myaccount/personal-info/info.component.mjs +6 -6
  16. package/esm2022/lib/pages/myaccount/personal-info/profile/profile.component.mjs +3 -3
  17. package/esm2022/lib/pages/myaccount/personal-info/username/username.component.mjs +3 -3
  18. package/esm2022/lib/pages/myaccount/phone/phone.component.mjs +3 -3
  19. package/esm2022/lib/pages/myaccount/security/security-faceid/security-faceid.component.mjs +3 -3
  20. package/esm2022/lib/pages/myaccount/security/security-index/security-index.component.mjs +3 -3
  21. package/esm2022/lib/pages/myaccount/security/security-password/security-password.component.mjs +3 -3
  22. package/esm2022/lib/pages/myaccount/security/security-verification/security-verification.component.mjs +12 -14
  23. package/esm2022/lib/services/wechat-login.service.mjs +3 -3
  24. package/fesm2022/{rolatech-angular-account-email-verification.component-Yr6sqNmw.mjs → rolatech-angular-account-email-verification.component-D9e--XMc.mjs} +4 -4
  25. package/fesm2022/{rolatech-angular-account-email-verification.component-Yr6sqNmw.mjs.map → rolatech-angular-account-email-verification.component-D9e--XMc.mjs.map} +1 -1
  26. package/fesm2022/{rolatech-angular-account-email.component-BJHAz8uK.mjs → rolatech-angular-account-email.component-DC8qYVOJ.mjs} +4 -4
  27. package/fesm2022/{rolatech-angular-account-email.component-BJHAz8uK.mjs.map → rolatech-angular-account-email.component-DC8qYVOJ.mjs.map} +1 -1
  28. package/fesm2022/{rolatech-angular-account-gender.component-CS2hSvax.mjs → rolatech-angular-account-gender.component-DWdWJiQW.mjs} +4 -4
  29. package/fesm2022/{rolatech-angular-account-gender.component-CS2hSvax.mjs.map → rolatech-angular-account-gender.component-DWdWJiQW.mjs.map} +1 -1
  30. package/fesm2022/rolatech-angular-account-home.component-C1Qm2HeL.mjs +83 -0
  31. package/fesm2022/rolatech-angular-account-home.component-C1Qm2HeL.mjs.map +1 -0
  32. package/fesm2022/rolatech-angular-account-info.component-DNi4eTxV.mjs +105 -0
  33. package/fesm2022/rolatech-angular-account-info.component-DNi4eTxV.mjs.map +1 -0
  34. package/fesm2022/{rolatech-angular-account-login.routes-DvmIiOwo.mjs → rolatech-angular-account-login.routes-dJ6K7YSD.mjs} +5 -6
  35. package/fesm2022/{rolatech-angular-account-login.routes-DvmIiOwo.mjs.map → rolatech-angular-account-login.routes-dJ6K7YSD.mjs.map} +1 -1
  36. package/fesm2022/{rolatech-angular-account-phone.component-DaSRdJam.mjs → rolatech-angular-account-phone.component-r9dWPfEL.mjs} +4 -4
  37. package/fesm2022/{rolatech-angular-account-phone.component-DaSRdJam.mjs.map → rolatech-angular-account-phone.component-r9dWPfEL.mjs.map} +1 -1
  38. package/fesm2022/{rolatech-angular-account-profile.component-B_bSqz0X.mjs → rolatech-angular-account-profile.component-CJfmQ3Ba.mjs} +4 -4
  39. package/fesm2022/{rolatech-angular-account-profile.component-B_bSqz0X.mjs.map → rolatech-angular-account-profile.component-CJfmQ3Ba.mjs.map} +1 -1
  40. package/fesm2022/{rolatech-angular-account-rolatech-angular-account-D5W_Ag2w.mjs → rolatech-angular-account-rolatech-angular-account-juLtk_PW.mjs} +92 -68
  41. package/fesm2022/rolatech-angular-account-rolatech-angular-account-juLtk_PW.mjs.map +1 -0
  42. package/fesm2022/{rolatech-angular-account-security.routes-B9DWZw7I.mjs → rolatech-angular-account-security.routes-Dag8RZ38.mjs} +18 -20
  43. package/fesm2022/rolatech-angular-account-security.routes-Dag8RZ38.mjs.map +1 -0
  44. package/fesm2022/{rolatech-angular-account-username.component-BDW_ZpOU.mjs → rolatech-angular-account-username.component-BL2F5fnx.mjs} +4 -4
  45. package/fesm2022/{rolatech-angular-account-username.component-BDW_ZpOU.mjs.map → rolatech-angular-account-username.component-BL2F5fnx.mjs.map} +1 -1
  46. package/fesm2022/rolatech-angular-account.mjs +1 -2
  47. package/fesm2022/rolatech-angular-account.mjs.map +1 -1
  48. package/lib/components/index.d.ts +1 -0
  49. package/lib/components/user-item/user-item.component.d.ts +12 -0
  50. package/lib/pages/accounts/signin/signin.component.d.ts +3 -4
  51. package/lib/pages/myaccount/home/home.component.d.ts +9 -0
  52. package/lib/pages/myaccount/security/security-verification/security-verification.component.d.ts +1 -1
  53. package/package.json +1 -1
  54. package/themes/_default.scss +1 -1
  55. package/fesm2022/rolatech-angular-account-home.component-Cc26-TjO.mjs +0 -25
  56. package/fesm2022/rolatech-angular-account-home.component-Cc26-TjO.mjs.map +0 -1
  57. package/fesm2022/rolatech-angular-account-info.component-Bk-DhHtK.mjs +0 -105
  58. package/fesm2022/rolatech-angular-account-info.component-Bk-DhHtK.mjs.map +0 -1
  59. package/fesm2022/rolatech-angular-account-rolatech-angular-account-D5W_Ag2w.mjs.map +0 -1
  60. package/fesm2022/rolatech-angular-account-security.routes-B9DWZw7I.mjs.map +0 -1
@@ -1,20 +1,44 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, PLATFORM_ID, input, Component, output, Injectable, HostListener, makeEnvironmentProviders } from '@angular/core';
2
+ import { input, output, Component, ViewEncapsulation, HostBinding, inject, PLATFORM_ID, Injectable, signal, effect, HostListener, makeEnvironmentProviders } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
- import { isPlatformBrowser, CommonModule } from '@angular/common';
4
+ import { CommonModule, isPlatformBrowser } from '@angular/common';
5
5
  import { APP_CONFIG, AngularCommonModule, WINDOW } from '@rolatech/angular-common';
6
6
  import { AuthService, AuthUserService, AuthGuard, UnauthorizedComponent, ForbiddenComponent } from '@rolatech/angular-auth';
7
7
  import { MatSnackBar } from '@angular/material/snack-bar';
8
8
  import { ActivatedRoute, Router, ROUTES } from '@angular/router';
9
- import { AngularComponentsModule, BaseComponent } from '@rolatech/angular-components';
9
+ import { AngularComponentsModule, BaseComponent, TabsComponent, TabComponent } from '@rolatech/angular-components';
10
10
  import * as i1$1 from '@angular/forms';
11
11
  import { FormBuilder, Validators } from '@angular/forms';
12
12
  import { DomSanitizer } from '@angular/platform-browser';
13
13
  import * as i3 from '@angular/material/form-field';
14
14
  import * as i4 from '@angular/material/input';
15
- import * as i5 from '@angular/material/tabs';
16
15
  import * as i2 from '@angular/material/button';
17
16
 
17
+ class UserItemComponent {
18
+ constructor() {
19
+ this.hasClass = true;
20
+ this.user = input();
21
+ this.isFollowing = input(true);
22
+ this.follow = output();
23
+ this.unfollow = output();
24
+ }
25
+ onFollow() {
26
+ this.follow.emit(this.user().username);
27
+ }
28
+ onUnFollow() {
29
+ this.unfollow.emit(this.user().username);
30
+ }
31
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: UserItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
32
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: UserItemComponent, isStandalone: true, selector: "rolatech-account-user-item", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null }, isFollowing: { classPropertyName: "isFollowing", publicName: "isFollowing", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { follow: "follow", unfollow: "unfollow" }, host: { properties: { "class.rolatech-account-user-item": "this.hasClass" } }, ngImport: i0, template: "<div class=\"flex w-full justify-between items-center p-2 hover:bg-gray-100 cursor-pointer\">\n <div class=\"flex items-center\">\n <div class=\"bg-orange-600 w-12 h-12 rounded-full\">\n @if (user().avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"user().avatar\" />\n }\n </div>\n <div class=\"flex flex-col ml-3\">\n <a class=\"text-lg font-bold\">\n <span>{{ user().name }}</span>\n </a>\n <a class=\"text-md\">\n <span>{{ user().username }}</span>\n </a>\n </div>\n </div>\n @if (isFollowing()) {\n <div class=\"w-[100px] py-1 flex items-center justify-center bg-gray-300 rounded-md cursor-pointer\" (click)=\"onUnFollow()\">\n <a>\n <span>\u53D6\u6D88\u5173\u6CE8</span>\n </a>\n </div>\n } @else {\n <div\n class=\"w-[100px] py-1 flex items-center justify-center bg-orange-600 text-white rounded-md cursor-pointer\"\n (click)=\"onFollow()\"\n >\n <a>\n <span>\u5173\u6CE8</span>\n </a>\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }], encapsulation: i0.ViewEncapsulation.None }); }
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: UserItemComponent, decorators: [{
35
+ type: Component,
36
+ args: [{ selector: 'rolatech-account-user-item', standalone: true, imports: [CommonModule], encapsulation: ViewEncapsulation.None, template: "<div class=\"flex w-full justify-between items-center p-2 hover:bg-gray-100 cursor-pointer\">\n <div class=\"flex items-center\">\n <div class=\"bg-orange-600 w-12 h-12 rounded-full\">\n @if (user().avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"user().avatar\" />\n }\n </div>\n <div class=\"flex flex-col ml-3\">\n <a class=\"text-lg font-bold\">\n <span>{{ user().name }}</span>\n </a>\n <a class=\"text-md\">\n <span>{{ user().username }}</span>\n </a>\n </div>\n </div>\n @if (isFollowing()) {\n <div class=\"w-[100px] py-1 flex items-center justify-center bg-gray-300 rounded-md cursor-pointer\" (click)=\"onUnFollow()\">\n <a>\n <span>\u53D6\u6D88\u5173\u6CE8</span>\n </a>\n </div>\n } @else {\n <div\n class=\"w-[100px] py-1 flex items-center justify-center bg-orange-600 text-white rounded-md cursor-pointer\"\n (click)=\"onFollow()\"\n >\n <a>\n <span>\u5173\u6CE8</span>\n </a>\n </div>\n }\n</div>\n" }]
37
+ }], propDecorators: { hasClass: [{
38
+ type: HostBinding,
39
+ args: ['class.rolatech-account-user-item']
40
+ }] } });
41
+
18
42
  class TopbarLoginComponent {
19
43
  constructor() {
20
44
  this.environment = inject(APP_CONFIG);
@@ -30,10 +54,10 @@ class TopbarLoginComponent {
30
54
  this.logoutUrl = this.environment.accountsUrl + `/logout?service=${this.service()}&continue=` + window.location.origin;
31
55
  }
32
56
  }
33
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: TopbarLoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.0", type: TopbarLoginComponent, isStandalone: true, selector: "rolatech-account-topbar-login", inputs: { service: { classPropertyName: "service", publicName: "service", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex\">\n <a class=\"inline-block sm:border border-black py-2 px-5 mr-2 cursor-pointer rounded-md\" [href]=\"signinUrl\"\n ><span>\u767B\u5F55</span></a\n >\n <a class=\"inline-block sm:border border-white py-2 px-5 text-white bg-orange-600 cursor-pointer rounded-md\" [href]=\"signupUrl\"\n ><span>\u6CE8\u518C</span></a\n >\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
57
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TopbarLoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
58
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.3", type: TopbarLoginComponent, isStandalone: true, selector: "rolatech-account-topbar-login", inputs: { service: { classPropertyName: "service", publicName: "service", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex\">\n <a class=\"inline-block sm:border border-black py-2 px-5 mr-2 cursor-pointer rounded-md\" [href]=\"signinUrl\"\n ><span>\u767B\u5F55</span></a\n >\n <a class=\"inline-block sm:border border-white py-2 px-5 text-white bg-orange-600 cursor-pointer rounded-md\" [href]=\"signupUrl\"\n ><span>\u6CE8\u518C</span></a\n >\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
35
59
  }
36
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: TopbarLoginComponent, decorators: [{
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TopbarLoginComponent, decorators: [{
37
61
  type: Component,
38
62
  args: [{ selector: 'rolatech-account-topbar-login', standalone: true, imports: [CommonModule], template: "<div class=\"flex\">\n <a class=\"inline-block sm:border border-black py-2 px-5 mr-2 cursor-pointer rounded-md\" [href]=\"signinUrl\"\n ><span>\u767B\u5F55</span></a\n >\n <a class=\"inline-block sm:border border-white py-2 px-5 text-white bg-orange-600 cursor-pointer rounded-md\" [href]=\"signupUrl\"\n ><span>\u6CE8\u518C</span></a\n >\n</div>\n" }]
39
63
  }] });
@@ -41,10 +65,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImpor
41
65
  class ForgotPasswordComponent {
42
66
  constructor() { }
43
67
  ngOnInit() { }
44
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: ForgotPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
45
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.0", type: ForgotPasswordComponent, isStandalone: true, selector: "rolatech-account-forgot-password", ngImport: i0, template: "<p>forgot-password works!</p>\n", styles: [""] }); }
68
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ForgotPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
69
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: ForgotPasswordComponent, isStandalone: true, selector: "rolatech-account-forgot-password", ngImport: i0, template: "<p>forgot-password works!</p>\n", styles: [""] }); }
46
70
  }
47
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: ForgotPasswordComponent, decorators: [{
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ForgotPasswordComponent, decorators: [{
48
72
  type: Component,
49
73
  args: [{ selector: 'rolatech-account-forgot-password', standalone: true, template: "<p>forgot-password works!</p>\n" }]
50
74
  }], ctorParameters: () => [] });
@@ -79,10 +103,10 @@ class LogoutComponent {
79
103
  },
80
104
  });
81
105
  }
82
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: LogoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
83
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.0", type: LogoutComponent, isStandalone: true, selector: "rolatech-account-logout", ngImport: i0, template: "<p>Please waiting...</p>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "ngmodule", type: AngularComponentsModule }] }); }
106
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: LogoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
107
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: LogoutComponent, isStandalone: true, selector: "rolatech-account-logout", ngImport: i0, template: "<p>Please waiting...</p>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "ngmodule", type: AngularComponentsModule }] }); }
84
108
  }
85
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: LogoutComponent, decorators: [{
109
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: LogoutComponent, decorators: [{
86
110
  type: Component,
87
111
  args: [{ standalone: true, imports: [AngularCommonModule, AngularComponentsModule], selector: 'rolatech-account-logout', template: "<p>Please waiting...</p>\n" }]
88
112
  }] });
@@ -90,10 +114,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImpor
90
114
  class PasswordresetComponent {
91
115
  constructor() { }
92
116
  ngOnInit() { }
93
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: PasswordresetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
94
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.0", type: PasswordresetComponent, isStandalone: true, selector: "rolatech-account-passwordreset", ngImport: i0, template: "<p>passwordreset works!</p>\n", styles: [""] }); }
117
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: PasswordresetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
118
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: PasswordresetComponent, isStandalone: true, selector: "rolatech-account-passwordreset", ngImport: i0, template: "<p>passwordreset works!</p>\n", styles: [""] }); }
95
119
  }
96
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: PasswordresetComponent, decorators: [{
120
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: PasswordresetComponent, decorators: [{
97
121
  type: Component,
98
122
  args: [{ selector: 'rolatech-account-passwordreset', standalone: true, template: "<p>passwordreset works!</p>\n" }]
99
123
  }], ctorParameters: () => [] });
@@ -102,10 +126,10 @@ class WeChatLoginService {
102
126
  constructor() {
103
127
  this.onWeChatLogin = output();
104
128
  }
105
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: WeChatLoginService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
106
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: WeChatLoginService, providedIn: 'root' }); }
129
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WeChatLoginService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
130
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WeChatLoginService, providedIn: 'root' }); }
107
131
  }
108
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: WeChatLoginService, decorators: [{
132
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WeChatLoginService, decorators: [{
109
133
  type: Injectable,
110
134
  args: [{
111
135
  providedIn: 'root',
@@ -113,8 +137,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImpor
113
137
  }], ctorParameters: () => [] });
114
138
 
115
139
  class SigninComponent extends BaseComponent {
140
+ onLogin(event) {
141
+ if (event.origin !== window.location.origin || /react-devtools/gi.test(event.data.source)) {
142
+ return;
143
+ }
144
+ if (event.origin === this.environment.accountsUrl && event.data.code === 200) {
145
+ window.location.href = this.continue === this.environment.accountsUrl ? this.environment.myaccountUrl : this.continue;
146
+ }
147
+ }
116
148
  constructor() {
117
- super(...arguments);
149
+ super();
118
150
  this.continue = '';
119
151
  this.environment = inject(APP_CONFIG);
120
152
  this.platformId = inject(PLATFORM_ID);
@@ -122,22 +154,29 @@ class SigninComponent extends BaseComponent {
122
154
  this.authService = inject(AuthService);
123
155
  this.authUserService = inject(AuthUserService);
124
156
  this.wechtLoginService = inject(WeChatLoginService);
125
- this.tabIndex = 0;
157
+ this.sanitizer = inject(DomSanitizer);
158
+ this.tabIndex = signal(0);
126
159
  this.countDown = false;
127
160
  this.countDownTime = 60;
128
161
  this.showButtonText = '发送验证码';
129
162
  this.appid = 'wx567acbea73439828';
130
163
  this.state = 'add';
131
- this.sanitizer = inject(DomSanitizer);
164
+ this.urlSafe = this.sanitizer.bypassSecurityTrustResourceUrl('');
132
165
  this.baseUrl = 'https://open.weixin.qq.com/connect/qrconnect';
133
- }
134
- onLogin(event) {
135
- if (event.origin !== window.location.origin || /react-devtools/gi.test(event.data.source)) {
136
- return;
137
- }
138
- if (event.origin === this.environment.accountsUrl && event.data.code === 200) {
139
- window.location.href = this.continue === this.environment.accountsUrl ? this.environment.myaccountUrl : this.continue;
140
- }
166
+ effect(() => {
167
+ const index = this.tabIndex();
168
+ if (index === 0) {
169
+ this.codeForm.reset();
170
+ }
171
+ if (index === 1) {
172
+ this.passrodForm.reset();
173
+ }
174
+ if (index === 2) {
175
+ this.codeForm.reset();
176
+ this.passrodForm.reset();
177
+ this.wechat();
178
+ }
179
+ });
141
180
  }
142
181
  ngOnInit() {
143
182
  this.titleService.setTitle('账号登录 - 拼小课');
@@ -152,7 +191,7 @@ class SigninComponent extends BaseComponent {
152
191
  this.continue = this.route.snapshot.queryParams['continue'] || '/';
153
192
  }
154
193
  get form() {
155
- return this.tabIndex === 0 ? this.passrodForm.controls : this.codeForm.controls;
194
+ return this.tabIndex() === 0 ? this.passrodForm.controls : this.codeForm.controls;
156
195
  }
157
196
  sendSMSCode() {
158
197
  const phoneControl = this.codeForm.get('phone');
@@ -183,7 +222,7 @@ class SigninComponent extends BaseComponent {
183
222
  }
184
223
  login() {
185
224
  let data = {};
186
- if (this.tabIndex === 0) {
225
+ if (this.tabIndex() === 0) {
187
226
  if (!this.passrodForm.valid) {
188
227
  return;
189
228
  }
@@ -192,7 +231,7 @@ class SigninComponent extends BaseComponent {
192
231
  password: this.form['password'].value,
193
232
  };
194
233
  }
195
- if (this.tabIndex === 1) {
234
+ if (this.tabIndex() === 1) {
196
235
  if (!this.codeForm.valid) {
197
236
  return;
198
237
  }
@@ -212,21 +251,6 @@ class SigninComponent extends BaseComponent {
212
251
  },
213
252
  });
214
253
  }
215
- onSelectedTabChange(e) {
216
- const { index } = e;
217
- this.tabIndex = index;
218
- if (index === 0) {
219
- this.codeForm.reset();
220
- }
221
- if (index === 1) {
222
- this.passrodForm.reset();
223
- }
224
- if (index === 2) {
225
- this.codeForm.reset();
226
- this.passrodForm.reset();
227
- this.wechat();
228
- }
229
- }
230
254
  wechat() {
231
255
  const redirectUri = 'https://accounts.pinxiaoke.cn/login?continue';
232
256
  // const redirectUri = `${window.location.origin}/login?continue`;
@@ -235,13 +259,13 @@ class SigninComponent extends BaseComponent {
235
259
  const src = `${this.baseUrl}?appid=${this.appid}&response_type=code&self_redirect=true&scope=snsapi_login&href=${href}&redirect_uri=${encodedURI}&state=${this.state}#wechat_redirect`;
236
260
  this.urlSafe = this.sanitizer.bypassSecurityTrustResourceUrl(src);
237
261
  }
238
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: SigninComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
239
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: SigninComponent, isStandalone: true, selector: "rolatech-account-auth-signin", host: { listeners: { "window:message": "onLogin($event)" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"h-full flex flex-col items-center sm:justify-center sm:bg-gray-100\">\n <div\n class=\"w-full p-8 lg:p-11 rounded-xl bg-white flex flex-col lg:flex-row justify-between xl:w-[800px] lg:w-[600px] sm:w-[600px]\"\n >\n <!-- header -->\n <div class=\"flex flex-col py-6\">\n <div class=\"text-3xl font-medium mb-3\">\u767B\u5F55</div>\n <div class=\"text-md\">\u4F7F\u7528\u62FC\u5C0F\u8BFE\u8D26\u53F7\u767B\u5F55</div>\n </div>\n <div>\n <!-- content -->\n <mat-tab-group mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" (selectedTabChange)=\"onSelectedTabChange($event)\">\n <mat-tab label=\"\u8D26\u53F7\u5BC6\u7801\">\n <div class=\"pt-6\">\n <form [formGroup]=\"passrodForm\" class=\"flex flex-col\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u7528\u6237\u540D/\u624B\u673A\u53F7 </mat-label>\n <input matInput formControlName=\"account\" required />\n @if (passrodForm.controls['account'].touched && passrodForm.controls['account'].invalid) {\n <mat-error>\n @if (passrodForm.controls['account'].errors?.['required']) {\n <span>\u7528\u6237\u540D\u5FC5\u586B</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5BC6\u7801 </mat-label>\n <input autocomplete matInput formControlName=\"password\" type=\"password\" />\n @if (passrodForm.controls['password'].touched && passrodForm.controls['password'].invalid) {\n <mat-error>\n @if (passrodForm.controls['password'].errors?.['required']) {\n <span>\u8BF7\u8F93\u5165\u5BC6\u7801</span>\n }\n </mat-error>\n }\n </mat-form-field>\n </form>\n </div>\n </mat-tab>\n <mat-tab label=\"\u77ED\u4FE1\u9A8C\u8BC1\u7801\">\n <div class=\"pt-6\">\n <form [formGroup]=\"codeForm\" class=\"flex flex-col\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u624B\u673A\u53F7 </mat-label>\n <input autocomplete matInput formControlName=\"phone\" required />\n @if (codeForm.controls['phone'].touched && codeForm.controls['phone'].invalid) {\n <mat-error>\n @if (codeForm.controls['phone'].errors?.['required']) {\n <span> \u624B\u673A\u53F7\u5FC5\u586B</span>\n }\n @if (codeForm.controls['phone'].errors?.['pattern']) {\n <span> \u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <div class=\"flex justify-between items-start gap-3\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u9A8C\u8BC1\u7801 </mat-label>\n <input matInput formControlName=\"code\" type=\"text\" required />\n @if (codeForm.controls['code'].touched && codeForm.controls['code'].invalid) {\n <mat-error>\n @if (codeForm.controls['code'].errors?.['required']) {\n <span> \u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801 </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <button\n (click)=\"sendSMSCode()\"\n [disabled]=\"countDown\"\n [ngClass]=\"countDown ? 'bg-orange-300' : 'bg-orange-600 shadow shadow-gray-300 cursor-pointer'\"\n class=\"max-w-[128px] p-3 mt-2 text-white rounded text-center\"\n >\n <span>{{ showButtonText }}</span>\n </button>\n </div>\n </form>\n </div>\n </mat-tab>\n <mat-tab label=\"\u5FAE\u4FE1\u626B\u7801\">\n <div class=\"py-6\">\n <div class=\"w-[190px] h-[190px] mx-auto\">\n @if (tabIndex === 2) {\n <iframe [src]=\"urlSafe\" class=\"w-full h-full inline\" scrolling=\"no\" frameBorder=\"no\" #iframe></iframe>\n <!-- <img [src]=\"urlSafe\" class=\"w-full h-full inline\" /> -->\n <div></div>\n }\n </div>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <!-- actions -->\n <div class=\"flex justify-between items-center py-2 pl-2\">\n <a class=\"underline underline-offset-4\" href=\"signup\">\u521B\u5EFA\u8D26\u53F7</a>\n <div\n (click)=\"login()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>\u767B\u5F55</span>\n </div>\n </div>\n </div>\n\n <!-- 3-part -->\n <!-- <div class=\"flex flex-col justify-center items-center mt-6\">\n <div class=\"flex items-center\">\n <span class=\"w-16 h-[1px] bg-gray-300\"></span>\n <span class=\"px-3\">\u7B2C\u4E09\u65B9\u767B\u5F55</span>\n <span class=\"w-16 h-[1px] bg-gray-300\"></span>\n </div>\n <div class=\"mt-3 flex items-center hover:shadow hover:shadow-gray-400 cursor-pointer p-3\">\n <img class=\"w-4 h-4\" src=\"assets/images/icon64_appwx_logo.png\" />\n <span class=\"ml-1\">\u5FAE\u4FE1</span>\n </div>\n </div> -->\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }] }); }
262
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: SigninComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
263
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: SigninComponent, isStandalone: true, selector: "rolatech-account-auth-signin", host: { listeners: { "window:message": "onLogin($event)" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"h-full flex flex-col items-center sm:justify-center sm:bg-gray-100\">\n <div\n class=\"w-full p-6 lg:p-11 rounded-xl bg-white flex flex-col lg:flex-row justify-between xl:w-[800px] lg:w-[600px] sm:w-[600px]\"\n >\n <!-- header -->\n <div class=\"flex flex-col py-6\">\n <div class=\"text-3xl font-medium mb-3 ml-2\">\u767B\u5F55</div>\n <div class=\"text-md ml-2\">\u4F7F\u7528\u62FC\u5C0F\u8BFE\u8D26\u53F7\u767B\u5F55</div>\n </div>\n <div>\n <rolatech-tabs [(select)]=\"tabIndex\">\n <rolatech-tab label=\"\u8D26\u53F7\u5BC6\u7801\"></rolatech-tab>\n <rolatech-tab label=\"\u77ED\u4FE1\u9A8C\u8BC1\u7801\"></rolatech-tab>\n <rolatech-tab label=\"\u5FAE\u4FE1\u626B\u7801\"></rolatech-tab>\n </rolatech-tabs>\n <!-- content -->\n <div class=\"pt-6 min-w-[190px] min-h-[214px]\">\n @if (tabIndex() === 0) {\n <form [formGroup]=\"passrodForm\" class=\"flex flex-col\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u7528\u6237\u540D/\u624B\u673A\u53F7 </mat-label>\n <input matInput formControlName=\"account\" required />\n @if (passrodForm.controls['account'].touched && passrodForm.controls['account'].invalid) {\n <mat-error>\n @if (passrodForm.controls['account'].errors?.['required']) {\n <span>\u7528\u6237\u540D\u5FC5\u586B</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5BC6\u7801 </mat-label>\n <input autocomplete matInput formControlName=\"password\" type=\"password\" />\n @if (passrodForm.controls['password'].touched && passrodForm.controls['password'].invalid) {\n <mat-error>\n @if (passrodForm.controls['password'].errors?.['required']) {\n <span>\u8BF7\u8F93\u5165\u5BC6\u7801</span>\n }\n </mat-error>\n }\n </mat-form-field>\n </form>\n }\n @if (tabIndex() === 1) {\n <form [formGroup]=\"codeForm\" class=\"flex flex-col\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u624B\u673A\u53F7 </mat-label>\n <input autocomplete matInput formControlName=\"phone\" required />\n @if (codeForm.controls['phone'].touched && codeForm.controls['phone'].invalid) {\n <mat-error>\n @if (codeForm.controls['phone'].errors?.['required']) {\n <span> \u624B\u673A\u53F7\u5FC5\u586B</span>\n }\n @if (codeForm.controls['phone'].errors?.['pattern']) {\n <span> \u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <div class=\"flex justify-between items-start\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u9A8C\u8BC1\u7801 </mat-label>\n <input matInput formControlName=\"code\" type=\"text\" required />\n @if (codeForm.controls['code'].touched && codeForm.controls['code'].invalid) {\n <mat-error>\n @if (codeForm.controls['code'].errors?.['required']) {\n <span> \u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801 </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <button\n (click)=\"sendSMSCode()\"\n [disabled]=\"countDown\"\n [ngClass]=\"countDown ? 'bg-orange-300' : 'bg-orange-600 shadow shadow-gray-300 cursor-pointer'\"\n class=\"max-w-[128px] p-3 mt-2 text-white rounded text-center\"\n >\n <span>{{ showButtonText }}</span>\n </button>\n </div>\n </form>\n }\n @if (tabIndex() === 2) {\n <div class=\"w-[190px] h-[190px] mx-auto\">\n <iframe [src]=\"urlSafe\" class=\"w-full h-full inline\" scrolling=\"no\" frameBorder=\"no\" #iframe></iframe>\n <div></div>\n </div>\n }\n </div>\n <!-- actions -->\n <div class=\"flex justify-between items-center py-2 pl-2\">\n <a class=\"underline underline-offset-4\" href=\"signup\">\u521B\u5EFA\u8D26\u53F7</a>\n <div\n (click)=\"login()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>\u767B\u5F55</span>\n </div>\n </div>\n </div>\n\n <!-- 3-part -->\n <!-- <div class=\"flex flex-col justify-center items-center mt-6\">\n <div class=\"flex items-center\">\n <span class=\"w-16 h-[1px] bg-gray-300\"></span>\n <span class=\"px-3\">\u7B2C\u4E09\u65B9\u767B\u5F55</span>\n <span class=\"w-16 h-[1px] bg-gray-300\"></span>\n </div>\n <div class=\"mt-3 flex items-center hover:shadow hover:shadow-gray-400 cursor-pointer p-3\">\n <img class=\"w-4 h-4\" src=\"assets/images/icon64_appwx_logo.png\" />\n <span class=\"ml-1\">\u5FAE\u4FE1</span>\n </div>\n </div> -->\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"] }] }); }
240
264
  }
241
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: SigninComponent, decorators: [{
265
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: SigninComponent, decorators: [{
242
266
  type: Component,
243
- args: [{ standalone: true, imports: [AngularCommonModule, AngularComponentsModule], selector: 'rolatech-account-auth-signin', template: "<div class=\"h-full flex flex-col items-center sm:justify-center sm:bg-gray-100\">\n <div\n class=\"w-full p-8 lg:p-11 rounded-xl bg-white flex flex-col lg:flex-row justify-between xl:w-[800px] lg:w-[600px] sm:w-[600px]\"\n >\n <!-- header -->\n <div class=\"flex flex-col py-6\">\n <div class=\"text-3xl font-medium mb-3\">\u767B\u5F55</div>\n <div class=\"text-md\">\u4F7F\u7528\u62FC\u5C0F\u8BFE\u8D26\u53F7\u767B\u5F55</div>\n </div>\n <div>\n <!-- content -->\n <mat-tab-group mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" (selectedTabChange)=\"onSelectedTabChange($event)\">\n <mat-tab label=\"\u8D26\u53F7\u5BC6\u7801\">\n <div class=\"pt-6\">\n <form [formGroup]=\"passrodForm\" class=\"flex flex-col\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u7528\u6237\u540D/\u624B\u673A\u53F7 </mat-label>\n <input matInput formControlName=\"account\" required />\n @if (passrodForm.controls['account'].touched && passrodForm.controls['account'].invalid) {\n <mat-error>\n @if (passrodForm.controls['account'].errors?.['required']) {\n <span>\u7528\u6237\u540D\u5FC5\u586B</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5BC6\u7801 </mat-label>\n <input autocomplete matInput formControlName=\"password\" type=\"password\" />\n @if (passrodForm.controls['password'].touched && passrodForm.controls['password'].invalid) {\n <mat-error>\n @if (passrodForm.controls['password'].errors?.['required']) {\n <span>\u8BF7\u8F93\u5165\u5BC6\u7801</span>\n }\n </mat-error>\n }\n </mat-form-field>\n </form>\n </div>\n </mat-tab>\n <mat-tab label=\"\u77ED\u4FE1\u9A8C\u8BC1\u7801\">\n <div class=\"pt-6\">\n <form [formGroup]=\"codeForm\" class=\"flex flex-col\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u624B\u673A\u53F7 </mat-label>\n <input autocomplete matInput formControlName=\"phone\" required />\n @if (codeForm.controls['phone'].touched && codeForm.controls['phone'].invalid) {\n <mat-error>\n @if (codeForm.controls['phone'].errors?.['required']) {\n <span> \u624B\u673A\u53F7\u5FC5\u586B</span>\n }\n @if (codeForm.controls['phone'].errors?.['pattern']) {\n <span> \u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <div class=\"flex justify-between items-start gap-3\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u9A8C\u8BC1\u7801 </mat-label>\n <input matInput formControlName=\"code\" type=\"text\" required />\n @if (codeForm.controls['code'].touched && codeForm.controls['code'].invalid) {\n <mat-error>\n @if (codeForm.controls['code'].errors?.['required']) {\n <span> \u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801 </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <button\n (click)=\"sendSMSCode()\"\n [disabled]=\"countDown\"\n [ngClass]=\"countDown ? 'bg-orange-300' : 'bg-orange-600 shadow shadow-gray-300 cursor-pointer'\"\n class=\"max-w-[128px] p-3 mt-2 text-white rounded text-center\"\n >\n <span>{{ showButtonText }}</span>\n </button>\n </div>\n </form>\n </div>\n </mat-tab>\n <mat-tab label=\"\u5FAE\u4FE1\u626B\u7801\">\n <div class=\"py-6\">\n <div class=\"w-[190px] h-[190px] mx-auto\">\n @if (tabIndex === 2) {\n <iframe [src]=\"urlSafe\" class=\"w-full h-full inline\" scrolling=\"no\" frameBorder=\"no\" #iframe></iframe>\n <!-- <img [src]=\"urlSafe\" class=\"w-full h-full inline\" /> -->\n <div></div>\n }\n </div>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <!-- actions -->\n <div class=\"flex justify-between items-center py-2 pl-2\">\n <a class=\"underline underline-offset-4\" href=\"signup\">\u521B\u5EFA\u8D26\u53F7</a>\n <div\n (click)=\"login()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>\u767B\u5F55</span>\n </div>\n </div>\n </div>\n\n <!-- 3-part -->\n <!-- <div class=\"flex flex-col justify-center items-center mt-6\">\n <div class=\"flex items-center\">\n <span class=\"w-16 h-[1px] bg-gray-300\"></span>\n <span class=\"px-3\">\u7B2C\u4E09\u65B9\u767B\u5F55</span>\n <span class=\"w-16 h-[1px] bg-gray-300\"></span>\n </div>\n <div class=\"mt-3 flex items-center hover:shadow hover:shadow-gray-400 cursor-pointer p-3\">\n <img class=\"w-4 h-4\" src=\"assets/images/icon64_appwx_logo.png\" />\n <span class=\"ml-1\">\u5FAE\u4FE1</span>\n </div>\n </div> -->\n </div>\n</div>\n" }]
244
- }], propDecorators: { onLogin: [{
267
+ args: [{ standalone: true, imports: [AngularCommonModule, AngularComponentsModule, TabsComponent, TabComponent], selector: 'rolatech-account-auth-signin', template: "<div class=\"h-full flex flex-col items-center sm:justify-center sm:bg-gray-100\">\n <div\n class=\"w-full p-6 lg:p-11 rounded-xl bg-white flex flex-col lg:flex-row justify-between xl:w-[800px] lg:w-[600px] sm:w-[600px]\"\n >\n <!-- header -->\n <div class=\"flex flex-col py-6\">\n <div class=\"text-3xl font-medium mb-3 ml-2\">\u767B\u5F55</div>\n <div class=\"text-md ml-2\">\u4F7F\u7528\u62FC\u5C0F\u8BFE\u8D26\u53F7\u767B\u5F55</div>\n </div>\n <div>\n <rolatech-tabs [(select)]=\"tabIndex\">\n <rolatech-tab label=\"\u8D26\u53F7\u5BC6\u7801\"></rolatech-tab>\n <rolatech-tab label=\"\u77ED\u4FE1\u9A8C\u8BC1\u7801\"></rolatech-tab>\n <rolatech-tab label=\"\u5FAE\u4FE1\u626B\u7801\"></rolatech-tab>\n </rolatech-tabs>\n <!-- content -->\n <div class=\"pt-6 min-w-[190px] min-h-[214px]\">\n @if (tabIndex() === 0) {\n <form [formGroup]=\"passrodForm\" class=\"flex flex-col\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u7528\u6237\u540D/\u624B\u673A\u53F7 </mat-label>\n <input matInput formControlName=\"account\" required />\n @if (passrodForm.controls['account'].touched && passrodForm.controls['account'].invalid) {\n <mat-error>\n @if (passrodForm.controls['account'].errors?.['required']) {\n <span>\u7528\u6237\u540D\u5FC5\u586B</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5BC6\u7801 </mat-label>\n <input autocomplete matInput formControlName=\"password\" type=\"password\" />\n @if (passrodForm.controls['password'].touched && passrodForm.controls['password'].invalid) {\n <mat-error>\n @if (passrodForm.controls['password'].errors?.['required']) {\n <span>\u8BF7\u8F93\u5165\u5BC6\u7801</span>\n }\n </mat-error>\n }\n </mat-form-field>\n </form>\n }\n @if (tabIndex() === 1) {\n <form [formGroup]=\"codeForm\" class=\"flex flex-col\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u624B\u673A\u53F7 </mat-label>\n <input autocomplete matInput formControlName=\"phone\" required />\n @if (codeForm.controls['phone'].touched && codeForm.controls['phone'].invalid) {\n <mat-error>\n @if (codeForm.controls['phone'].errors?.['required']) {\n <span> \u624B\u673A\u53F7\u5FC5\u586B</span>\n }\n @if (codeForm.controls['phone'].errors?.['pattern']) {\n <span> \u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <div class=\"flex justify-between items-start\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u9A8C\u8BC1\u7801 </mat-label>\n <input matInput formControlName=\"code\" type=\"text\" required />\n @if (codeForm.controls['code'].touched && codeForm.controls['code'].invalid) {\n <mat-error>\n @if (codeForm.controls['code'].errors?.['required']) {\n <span> \u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801 </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <button\n (click)=\"sendSMSCode()\"\n [disabled]=\"countDown\"\n [ngClass]=\"countDown ? 'bg-orange-300' : 'bg-orange-600 shadow shadow-gray-300 cursor-pointer'\"\n class=\"max-w-[128px] p-3 mt-2 text-white rounded text-center\"\n >\n <span>{{ showButtonText }}</span>\n </button>\n </div>\n </form>\n }\n @if (tabIndex() === 2) {\n <div class=\"w-[190px] h-[190px] mx-auto\">\n <iframe [src]=\"urlSafe\" class=\"w-full h-full inline\" scrolling=\"no\" frameBorder=\"no\" #iframe></iframe>\n <div></div>\n </div>\n }\n </div>\n <!-- actions -->\n <div class=\"flex justify-between items-center py-2 pl-2\">\n <a class=\"underline underline-offset-4\" href=\"signup\">\u521B\u5EFA\u8D26\u53F7</a>\n <div\n (click)=\"login()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>\u767B\u5F55</span>\n </div>\n </div>\n </div>\n\n <!-- 3-part -->\n <!-- <div class=\"flex flex-col justify-center items-center mt-6\">\n <div class=\"flex items-center\">\n <span class=\"w-16 h-[1px] bg-gray-300\"></span>\n <span class=\"px-3\">\u7B2C\u4E09\u65B9\u767B\u5F55</span>\n <span class=\"w-16 h-[1px] bg-gray-300\"></span>\n </div>\n <div class=\"mt-3 flex items-center hover:shadow hover:shadow-gray-400 cursor-pointer p-3\">\n <img class=\"w-4 h-4\" src=\"assets/images/icon64_appwx_logo.png\" />\n <span class=\"ml-1\">\u5FAE\u4FE1</span>\n </div>\n </div> -->\n </div>\n</div>\n" }]
268
+ }], ctorParameters: () => [], propDecorators: { onLogin: [{
245
269
  type: HostListener,
246
270
  args: ['window:message', ['$event']]
247
271
  }] } });
@@ -310,10 +334,10 @@ class SignupComponent extends BaseComponent {
310
334
  },
311
335
  });
312
336
  }
313
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: SignupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
314
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: SignupComponent, isStandalone: true, selector: "rolatech-account-signup", usesInheritance: true, ngImport: i0, template: "<div class=\"h-full flex flex-col md:justify-center items-center\">\n <div class=\"md:shadow-md p-8 rounded-md\">\n <div class=\"text-2xl pl-2 pb-6\">\u6CE8\u518C</div>\n <form [formGroup]=\"signupForm\" (submit)=\"submit()\">\n <!-- name -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u59D3\u540D </mat-label>\n <input matInput formControlName=\"name\" required />\n @if (signupForm.controls['name'].touched && signupForm.controls['name'].invalid) {\n <mat-error>\n @if (signupForm.controls['name'].errors?.['required']) {\n <span>\u59D3\u540D\u5FC5\u586B</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <!-- phone -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u624B\u673A\u53F7 </mat-label>\n <input matInput formControlName=\"phone\" required />\n @if (signupForm.controls['phone'].touched && signupForm.controls['phone'].invalid) {\n <mat-error>\n @if (signupForm.controls['phone'].errors?.['required']) {\n <span>\u624B\u673A\u53F7\u5FC5\u586B</span>\n }\n @if (signupForm.controls['phone'].errors?.['pattern']) {\n <span> \u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <!-- phone code -->\n <div class=\"flex justify-between items-start gap-3\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u9A8C\u8BC1\u7801 </mat-label>\n <input matInput formControlName=\"code\" required />\n @if (signupForm.controls['code'].touched && signupForm.controls['code'].invalid) {\n <mat-error>\n @if (signupForm.controls['code'].errors?.['required']) {\n <span>\u9A8C\u8BC1\u7801\u5FC5\u586B</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <div\n (click)=\"sendSMSCode()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 mt-2 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>\u53D1\u9001\u9A8C\u8BC1\u7801</span>\n </div>\n </div>\n\n <!-- password -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5BC6\u7801 </mat-label>\n <input matInput formControlName=\"password\" type=\"password\" autocomplete=\"password\" />\n @if (signupForm.controls['password'].touched && signupForm.controls['password'].invalid) {\n <mat-error>\n @if (signupForm.controls['password'].errors?.['required']) {\n <span>\u8BF7\u8F93\u5165\u5BC6\u7801</span>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <!-- password confirm -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u786E\u8BA4\u5BC6\u7801 </mat-label>\n <input matInput formControlName=\"rePassword\" type=\"password\" autocomplete=\"rePassword\" />\n @if (signupForm.controls['rePassword'].touched && signupForm.controls['rePassword'].invalid) {\n <mat-error>\n @if (signupForm.controls['rePassword'].errors?.['required']) {\n <span>\u8BF7\u786E\u8BA4\u5BC6\u7801</span>\n }\n </mat-error>\n }\n </mat-form-field>\n </form>\n <div class=\"flex justify-between items-center px-3\">\n <a mat-button href=\"/signin\">\u767B\u5F55</a>\n <div\n (click)=\"submit()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>\u6CE8\u518C</span>\n </div>\n </div>\n </div>\n</div>\n", styles: ["mat-form-field{width:100%;margin-bottom:8px}\n"], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: i2.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }] }); }
337
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: SignupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
338
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: SignupComponent, isStandalone: true, selector: "rolatech-account-signup", usesInheritance: true, ngImport: i0, template: "<div class=\"h-full flex flex-col md:justify-center items-center\">\n <div class=\"md:shadow-md p-8 rounded-md\">\n <div class=\"text-2xl pl-2 pb-6\">\u6CE8\u518C</div>\n <form [formGroup]=\"signupForm\" (submit)=\"submit()\">\n <!-- name -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u59D3\u540D </mat-label>\n <input matInput formControlName=\"name\" required />\n @if (signupForm.controls['name'].touched && signupForm.controls['name'].invalid) {\n <mat-error>\n @if (signupForm.controls['name'].errors?.['required']) {\n <span>\u59D3\u540D\u5FC5\u586B</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <!-- phone -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u624B\u673A\u53F7 </mat-label>\n <input matInput formControlName=\"phone\" required />\n @if (signupForm.controls['phone'].touched && signupForm.controls['phone'].invalid) {\n <mat-error>\n @if (signupForm.controls['phone'].errors?.['required']) {\n <span>\u624B\u673A\u53F7\u5FC5\u586B</span>\n }\n @if (signupForm.controls['phone'].errors?.['pattern']) {\n <span> \u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <!-- phone code -->\n <div class=\"flex justify-between items-start gap-3\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u9A8C\u8BC1\u7801 </mat-label>\n <input matInput formControlName=\"code\" required />\n @if (signupForm.controls['code'].touched && signupForm.controls['code'].invalid) {\n <mat-error>\n @if (signupForm.controls['code'].errors?.['required']) {\n <span>\u9A8C\u8BC1\u7801\u5FC5\u586B</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <div\n (click)=\"sendSMSCode()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 mt-2 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>\u53D1\u9001\u9A8C\u8BC1\u7801</span>\n </div>\n </div>\n\n <!-- password -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5BC6\u7801 </mat-label>\n <input matInput formControlName=\"password\" type=\"password\" autocomplete=\"password\" />\n @if (signupForm.controls['password'].touched && signupForm.controls['password'].invalid) {\n <mat-error>\n @if (signupForm.controls['password'].errors?.['required']) {\n <span>\u8BF7\u8F93\u5165\u5BC6\u7801</span>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <!-- password confirm -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u786E\u8BA4\u5BC6\u7801 </mat-label>\n <input matInput formControlName=\"rePassword\" type=\"password\" autocomplete=\"rePassword\" />\n @if (signupForm.controls['rePassword'].touched && signupForm.controls['rePassword'].invalid) {\n <mat-error>\n @if (signupForm.controls['rePassword'].errors?.['required']) {\n <span>\u8BF7\u786E\u8BA4\u5BC6\u7801</span>\n }\n </mat-error>\n }\n </mat-form-field>\n </form>\n <div class=\"flex justify-between items-center px-3\">\n <a mat-button href=\"/signin\">\u767B\u5F55</a>\n <div\n (click)=\"submit()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>\u6CE8\u518C</span>\n </div>\n </div>\n </div>\n</div>\n", styles: ["mat-form-field{width:100%;margin-bottom:8px}\n"], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: i2.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }] }); }
315
339
  }
316
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: SignupComponent, decorators: [{
340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: SignupComponent, decorators: [{
317
341
  type: Component,
318
342
  args: [{ standalone: true, imports: [AngularCommonModule, AngularComponentsModule], selector: 'rolatech-account-signup', template: "<div class=\"h-full flex flex-col md:justify-center items-center\">\n <div class=\"md:shadow-md p-8 rounded-md\">\n <div class=\"text-2xl pl-2 pb-6\">\u6CE8\u518C</div>\n <form [formGroup]=\"signupForm\" (submit)=\"submit()\">\n <!-- name -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u59D3\u540D </mat-label>\n <input matInput formControlName=\"name\" required />\n @if (signupForm.controls['name'].touched && signupForm.controls['name'].invalid) {\n <mat-error>\n @if (signupForm.controls['name'].errors?.['required']) {\n <span>\u59D3\u540D\u5FC5\u586B</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <!-- phone -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u624B\u673A\u53F7 </mat-label>\n <input matInput formControlName=\"phone\" required />\n @if (signupForm.controls['phone'].touched && signupForm.controls['phone'].invalid) {\n <mat-error>\n @if (signupForm.controls['phone'].errors?.['required']) {\n <span>\u624B\u673A\u53F7\u5FC5\u586B</span>\n }\n @if (signupForm.controls['phone'].errors?.['pattern']) {\n <span> \u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <!-- phone code -->\n <div class=\"flex justify-between items-start gap-3\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u9A8C\u8BC1\u7801 </mat-label>\n <input matInput formControlName=\"code\" required />\n @if (signupForm.controls['code'].touched && signupForm.controls['code'].invalid) {\n <mat-error>\n @if (signupForm.controls['code'].errors?.['required']) {\n <span>\u9A8C\u8BC1\u7801\u5FC5\u586B</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <div\n (click)=\"sendSMSCode()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 mt-2 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>\u53D1\u9001\u9A8C\u8BC1\u7801</span>\n </div>\n </div>\n\n <!-- password -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5BC6\u7801 </mat-label>\n <input matInput formControlName=\"password\" type=\"password\" autocomplete=\"password\" />\n @if (signupForm.controls['password'].touched && signupForm.controls['password'].invalid) {\n <mat-error>\n @if (signupForm.controls['password'].errors?.['required']) {\n <span>\u8BF7\u8F93\u5165\u5BC6\u7801</span>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <!-- password confirm -->\n <mat-form-field appearance=\"fill\">\n <mat-label> \u786E\u8BA4\u5BC6\u7801 </mat-label>\n <input matInput formControlName=\"rePassword\" type=\"password\" autocomplete=\"rePassword\" />\n @if (signupForm.controls['rePassword'].touched && signupForm.controls['rePassword'].invalid) {\n <mat-error>\n @if (signupForm.controls['rePassword'].errors?.['required']) {\n <span>\u8BF7\u786E\u8BA4\u5BC6\u7801</span>\n }\n </mat-error>\n }\n </mat-form-field>\n </form>\n <div class=\"flex justify-between items-center px-3\">\n <a mat-button href=\"/signin\">\u767B\u5F55</a>\n <div\n (click)=\"submit()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>\u6CE8\u518C</span>\n </div>\n </div>\n </div>\n</div>\n", styles: ["mat-form-field{width:100%;margin-bottom:8px}\n"] }]
319
343
  }] });
@@ -327,7 +351,7 @@ const accountRoutes = [
327
351
  { path: 'signin', canActivate: [AuthGuard], component: SigninComponent, data: { title: 'Signin' } },
328
352
  { path: 'signup', component: SignupComponent, data: { title: 'Signup' } },
329
353
  { path: 'logout', component: LogoutComponent },
330
- { path: 'login', loadChildren: () => import('./rolatech-angular-account-login.routes-DvmIiOwo.mjs') },
354
+ { path: 'login', loadChildren: () => import('./rolatech-angular-account-login.routes-dJ6K7YSD.mjs') },
331
355
  {
332
356
  path: 'passwordreset/:token',
333
357
  component: PasswordresetComponent,
@@ -351,31 +375,31 @@ const accountRoutes = [
351
375
  const myaccountRoutes = [
352
376
  {
353
377
  path: '',
354
- loadComponent: () => import('./rolatech-angular-account-home.component-Cc26-TjO.mjs').then((c) => c.HomeComponent),
378
+ loadComponent: () => import('./rolatech-angular-account-home.component-C1Qm2HeL.mjs').then((c) => c.HomeComponent),
355
379
  data: { title: '首页' },
356
380
  },
357
381
  {
358
382
  path: 'personal-info',
359
- loadComponent: () => import('./rolatech-angular-account-info.component-Bk-DhHtK.mjs').then((c) => c.InfoComponent),
383
+ loadComponent: () => import('./rolatech-angular-account-info.component-DNi4eTxV.mjs').then((c) => c.InfoComponent),
360
384
  },
361
385
  {
362
386
  path: 'profile',
363
- loadComponent: () => import('./rolatech-angular-account-profile.component-B_bSqz0X.mjs').then((c) => c.ProfileComponent),
387
+ loadComponent: () => import('./rolatech-angular-account-profile.component-CJfmQ3Ba.mjs').then((c) => c.ProfileComponent),
364
388
  },
365
389
  {
366
390
  path: 'username',
367
- loadComponent: () => import('./rolatech-angular-account-username.component-BDW_ZpOU.mjs').then((c) => c.UsernameComponent),
391
+ loadComponent: () => import('./rolatech-angular-account-username.component-BL2F5fnx.mjs').then((c) => c.UsernameComponent),
368
392
  },
369
- { path: 'gender', loadComponent: () => import('./rolatech-angular-account-gender.component-CS2hSvax.mjs').then((c) => c.GenderComponent) },
370
- { path: 'email', loadComponent: () => import('./rolatech-angular-account-email.component-BJHAz8uK.mjs').then((c) => c.EmailComponent) },
393
+ { path: 'gender', loadComponent: () => import('./rolatech-angular-account-gender.component-DWdWJiQW.mjs').then((c) => c.GenderComponent) },
394
+ { path: 'email', loadComponent: () => import('./rolatech-angular-account-email.component-DC8qYVOJ.mjs').then((c) => c.EmailComponent) },
371
395
  {
372
396
  path: 'email-verification/:id',
373
- loadComponent: () => import('./rolatech-angular-account-email-verification.component-Yr6sqNmw.mjs').then((c) => c.EmailVerificationComponent),
397
+ loadComponent: () => import('./rolatech-angular-account-email-verification.component-D9e--XMc.mjs').then((c) => c.EmailVerificationComponent),
374
398
  },
375
- { path: 'phone', loadComponent: () => import('./rolatech-angular-account-phone.component-DaSRdJam.mjs').then((c) => c.PhoneComponent) },
399
+ { path: 'phone', loadComponent: () => import('./rolatech-angular-account-phone.component-r9dWPfEL.mjs').then((c) => c.PhoneComponent) },
376
400
  {
377
401
  path: 'security',
378
- loadChildren: () => import('./rolatech-angular-account-security.routes-B9DWZw7I.mjs'),
402
+ loadChildren: () => import('./rolatech-angular-account-security.routes-Dag8RZ38.mjs'),
379
403
  data: { title: 'Security' },
380
404
  },
381
405
  {
@@ -400,5 +424,5 @@ function provideAngularAuthRoutes() {
400
424
  * Generated bundle index. Do not edit.
401
425
  */
402
426
 
403
- export { TopbarLoginComponent as T, WeChatLoginService as W, accountRoutes as a, myaccountRoutes as m, provideAngularAuthRoutes as p };
404
- //# sourceMappingURL=rolatech-angular-account-rolatech-angular-account-D5W_Ag2w.mjs.map
427
+ export { TopbarLoginComponent as T, UserItemComponent as U, WeChatLoginService as W, accountRoutes as a, myaccountRoutes as m, provideAngularAuthRoutes as p };
428
+ //# sourceMappingURL=rolatech-angular-account-rolatech-angular-account-juLtk_PW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolatech-angular-account-rolatech-angular-account-juLtk_PW.mjs","sources":["../../../../libs/angular-account/src/lib/components/user-item/user-item.component.ts","../../../../libs/angular-account/src/lib/components/user-item/user-item.component.html","../../../../libs/angular-account/src/lib/components/topbar-login/topbar-login.component.ts","../../../../libs/angular-account/src/lib/components/topbar-login/topbar-login.component.html","../../../../libs/angular-account/src/lib/components/forgot-password/forgot-password.component.ts","../../../../libs/angular-account/src/lib/components/forgot-password/forgot-password.component.html","../../../../libs/angular-account/src/lib/components/logout/logout.component.ts","../../../../libs/angular-account/src/lib/components/logout/logout.component.html","../../../../libs/angular-account/src/lib/components/passwordreset/passwordreset.component.ts","../../../../libs/angular-account/src/lib/components/passwordreset/passwordreset.component.html","../../../../libs/angular-account/src/lib/services/wechat-login.service.ts","../../../../libs/angular-account/src/lib/pages/accounts/signin/signin.component.ts","../../../../libs/angular-account/src/lib/pages/accounts/signin/signin.component.html","../../../../libs/angular-account/src/lib/pages/accounts/signup/signup.component.ts","../../../../libs/angular-account/src/lib/pages/accounts/signup/signup.component.html","../../../../libs/angular-account/src/lib/account.routes.ts","../../../../libs/angular-account/src/lib/myaccount.routes.ts","../../../../libs/angular-account/src/provider.ts","../../../../libs/angular-account/src/rolatech-angular-account.ts"],"sourcesContent":["import { Component, HostBinding, ViewEncapsulation, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'rolatech-account-user-item',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './user-item.component.html',\n styleUrl: './user-item.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class UserItemComponent {\n @HostBinding('class.rolatech-account-user-item') hasClass = true;\n user = input<any>();\n isFollowing = input(true);\n follow = output<string>();\n unfollow = output();\n onFollow() {\n this.follow.emit(this.user().username);\n }\n onUnFollow() {\n this.unfollow.emit(this.user().username);\n }\n}\n","<div class=\"flex w-full justify-between items-center p-2 hover:bg-gray-100 cursor-pointer\">\n <div class=\"flex items-center\">\n <div class=\"bg-orange-600 w-12 h-12 rounded-full\">\n @if (user().avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"user().avatar\" />\n }\n </div>\n <div class=\"flex flex-col ml-3\">\n <a class=\"text-lg font-bold\">\n <span>{{ user().name }}</span>\n </a>\n <a class=\"text-md\">\n <span>{{ user().username }}</span>\n </a>\n </div>\n </div>\n @if (isFollowing()) {\n <div class=\"w-[100px] py-1 flex items-center justify-center bg-gray-300 rounded-md cursor-pointer\" (click)=\"onUnFollow()\">\n <a>\n <span>取消关注</span>\n </a>\n </div>\n } @else {\n <div\n class=\"w-[100px] py-1 flex items-center justify-center bg-orange-600 text-white rounded-md cursor-pointer\"\n (click)=\"onFollow()\"\n >\n <a>\n <span>关注</span>\n </a>\n </div>\n }\n</div>\n","import { Component, OnInit, PLATFORM_ID, inject, input } from '@angular/core';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { APP_CONFIG } from '@rolatech/angular-common';\n\n@Component({\n selector: 'rolatech-account-topbar-login',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './topbar-login.component.html',\n styleUrl: './topbar-login.component.scss',\n})\nexport class TopbarLoginComponent implements OnInit {\n environment = inject(APP_CONFIG);\n platformId = inject(PLATFORM_ID);\n service = input('www');\n signinUrl = '';\n signupUrl = this.environment.accountsUrl + '/signup';\n logoutUrl = this.environment.accountsUrl + `/logout?service=${this.service()}`;\n ngOnInit(): void {\n if (isPlatformBrowser(this.platformId)) {\n this.signinUrl = `${this.environment.accountsUrl}/signin?continue=` + window.location.href;\n this.logoutUrl = this.environment.accountsUrl + `/logout?service=${this.service()}&continue=` + window.location.origin;\n }\n }\n}\n","<div class=\"flex\">\n <a class=\"inline-block sm:border border-black py-2 px-5 mr-2 cursor-pointer rounded-md\" [href]=\"signinUrl\"\n ><span>登录</span></a\n >\n <a class=\"inline-block sm:border border-white py-2 px-5 text-white bg-orange-600 cursor-pointer rounded-md\" [href]=\"signupUrl\"\n ><span>注册</span></a\n >\n</div>\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'rolatech-account-forgot-password',\n templateUrl: './forgot-password.component.html',\n styleUrls: ['./forgot-password.component.scss'],\n standalone: true,\n})\nexport class ForgotPasswordComponent implements OnInit {\n constructor() {}\n\n ngOnInit(): void {}\n}\n","<p>forgot-password works!</p>\n","import { isPlatformBrowser } from '@angular/common';\nimport { Component, inject, OnInit, PLATFORM_ID } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AuthService } from '@rolatech/angular-auth';\nimport { APP_CONFIG, AngularCommonModule } from '@rolatech/angular-common';\nimport { AngularComponentsModule } from '@rolatech/angular-components';\nimport { map, take } from 'rxjs';\n\n@Component({\n standalone: true,\n imports: [AngularCommonModule, AngularComponentsModule],\n selector: 'rolatech-account-logout',\n templateUrl: './logout.component.html',\n styleUrls: ['./logout.component.scss'],\n})\nexport class LogoutComponent implements OnInit {\n service = '';\n continue = '';\n environment = inject(APP_CONFIG);\n platformId = inject(PLATFORM_ID);\n route = inject(ActivatedRoute);\n router = inject(Router);\n authService = inject(AuthService);\n snackBar = inject(MatSnackBar);\n\n ngOnInit(): void {\n this.service = this.route.snapshot.queryParams['service'] || 'www';\n this.continue = this.route.snapshot.queryParams['continue'] || '/';\n if (isPlatformBrowser(this.platformId)) {\n this.logout();\n }\n }\n logout() {\n this.authService.logout().subscribe({\n next: (res) => {\n this.router.navigate(['/signin'], {\n queryParams: { continue: this.continue },\n });\n },\n error: (error) => {\n this.snackBar.open(error.message);\n },\n });\n }\n}\n","<p>Please waiting...</p>\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'rolatech-account-passwordreset',\n templateUrl: './passwordreset.component.html',\n styleUrls: ['./passwordreset.component.scss'],\n standalone: true,\n})\nexport class PasswordresetComponent implements OnInit {\n constructor() {}\n\n ngOnInit(): void {}\n}\n","<p>passwordreset works!</p>\n","import { Injectable, output } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WeChatLoginService {\n onWeChatLogin = output<any>();\n\n constructor() {}\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Component, effect, HostListener, inject, OnInit, PLATFORM_ID, signal } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { MatTabChangeEvent } from '@angular/material/tabs';\nimport { SafeResourceUrl, DomSanitizer } from '@angular/platform-browser';\nimport { AngularCommonModule, APP_CONFIG } from '@rolatech/angular-common';\nimport { AngularComponentsModule, BaseComponent, TabComponent, TabsComponent } from '@rolatech/angular-components';\nimport { AuthService, AuthUserService } from '@rolatech/angular-auth';\nimport { WeChatLoginService } from '../../../services/wechat-login.service';\n\n@Component({\n standalone: true,\n imports: [AngularCommonModule, AngularComponentsModule, TabsComponent, TabComponent],\n selector: 'rolatech-account-auth-signin',\n templateUrl: './signin.component.html',\n styleUrls: ['./signin.component.scss'],\n})\nexport class SigninComponent extends BaseComponent implements OnInit {\n passrodForm!: FormGroup;\n codeForm!: FormGroup;\n continue = '';\n environment = inject(APP_CONFIG);\n platformId = inject(PLATFORM_ID);\n formBuilder = inject(FormBuilder);\n authService = inject(AuthService);\n authUserService = inject(AuthUserService);\n wechtLoginService = inject(WeChatLoginService);\n sanitizer = inject(DomSanitizer);\n tabIndex = signal(0);\n countDown = false;\n countDownTime = 60;\n showButtonText = '发送验证码';\n appid = 'wx567acbea73439828';\n state = 'add';\n urlSafe: SafeResourceUrl = this.sanitizer.bypassSecurityTrustResourceUrl('');\n baseUrl = 'https://open.weixin.qq.com/connect/qrconnect';\n\n @HostListener('window:message', ['$event'])\n onLogin(event: any): void {\n if (event.origin !== window.location.origin || /react-devtools/gi.test(event.data.source)) {\n return;\n }\n if (event.origin === this.environment.accountsUrl && event.data.code === 200) {\n window.location.href = this.continue === this.environment.accountsUrl ? this.environment.myaccountUrl : this.continue;\n }\n }\n constructor() {\n super();\n effect(() => {\n const index = this.tabIndex();\n if (index === 0) {\n this.codeForm.reset();\n }\n if (index === 1) {\n this.passrodForm.reset();\n }\n if (index === 2) {\n this.codeForm.reset();\n this.passrodForm.reset();\n this.wechat();\n }\n });\n }\n ngOnInit(): void {\n this.titleService.setTitle('账号登录 - 拼小课');\n this.passrodForm = this.formBuilder.group({\n account: [null, Validators.required],\n password: [null, Validators.required],\n });\n this.codeForm = this.formBuilder.group({\n phone: [null, [Validators.required, Validators.pattern('1(3|4|5|6|7|8|9)\\\\d{9}')]],\n code: [null, Validators.required],\n });\n this.continue = this.route.snapshot.queryParams['continue'] || '/';\n }\n get form() {\n return this.tabIndex() === 0 ? this.passrodForm.controls : this.codeForm.controls;\n }\n sendSMSCode() {\n const phoneControl = this.codeForm.get('phone');\n if (!phoneControl?.valid) {\n return;\n }\n const phone = phoneControl.value;\n this.countDown = true;\n const start = setInterval(() => {\n if (this.countDownTime >= 0) {\n this.showButtonText = `${this.countDownTime--}秒重发`;\n } else {\n clearInterval(start);\n this.showButtonText = '重新发送';\n this.countDown = false;\n this.countDownTime = 60;\n }\n }, 1000);\n\n this.authUserService.sendSMSCode('+86', phone).subscribe({\n next: (res) => {\n this.snackBarService.open('发送成功');\n },\n error: (error) => {\n this.snackBarService.open(error.message);\n },\n });\n }\n login() {\n let data = {};\n if (this.tabIndex() === 0) {\n if (!this.passrodForm.valid) {\n return;\n }\n data = {\n account: this.form['account'].value,\n password: this.form['password'].value,\n };\n }\n if (this.tabIndex() === 1) {\n if (!this.codeForm.valid) {\n return;\n }\n data = {\n phone: this.form['phone'].value,\n code: this.form['code'].value,\n };\n }\n\n this.authService.login(data).subscribe({\n next: () => {\n if (isPlatformBrowser(this.platformId)) {\n window.location.href = this.continue === this.environment.accountsUrl ? this.environment.myaccountUrl : this.continue;\n }\n },\n error: (error) => {\n this.snackBarService.open(error.message);\n },\n });\n }\n wechat() {\n const redirectUri = 'https://accounts.pinxiaoke.cn/login?continue';\n // const redirectUri = `${window.location.origin}/login?continue`;\n const href = 'https://cloudcache.tencent-cloud.com/open_proj/proj_qcloud_v2/gateway/login-regist/css/link-wx-login.css';\n const encodedURI = encodeURI(redirectUri);\n const src = `${this.baseUrl}?appid=${this.appid}&response_type=code&self_redirect=true&scope=snsapi_login&href=${href}&redirect_uri=${encodedURI}&state=${this.state}#wechat_redirect`;\n this.urlSafe = this.sanitizer.bypassSecurityTrustResourceUrl(src);\n }\n}\n","<div class=\"h-full flex flex-col items-center sm:justify-center sm:bg-gray-100\">\n <div\n class=\"w-full p-6 lg:p-11 rounded-xl bg-white flex flex-col lg:flex-row justify-between xl:w-[800px] lg:w-[600px] sm:w-[600px]\"\n >\n <!-- header -->\n <div class=\"flex flex-col py-6\">\n <div class=\"text-3xl font-medium mb-3 ml-2\">登录</div>\n <div class=\"text-md ml-2\">使用拼小课账号登录</div>\n </div>\n <div>\n <rolatech-tabs [(select)]=\"tabIndex\">\n <rolatech-tab label=\"账号密码\"></rolatech-tab>\n <rolatech-tab label=\"短信验证码\"></rolatech-tab>\n <rolatech-tab label=\"微信扫码\"></rolatech-tab>\n </rolatech-tabs>\n <!-- content -->\n <div class=\"pt-6 min-w-[190px] min-h-[214px]\">\n @if (tabIndex() === 0) {\n <form [formGroup]=\"passrodForm\" class=\"flex flex-col\">\n <mat-form-field appearance=\"fill\">\n <mat-label> 用户名/手机号 </mat-label>\n <input matInput formControlName=\"account\" required />\n @if (passrodForm.controls['account'].touched && passrodForm.controls['account'].invalid) {\n <mat-error>\n @if (passrodForm.controls['account'].errors?.['required']) {\n <span>用户名必填</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label> 密码 </mat-label>\n <input autocomplete matInput formControlName=\"password\" type=\"password\" />\n @if (passrodForm.controls['password'].touched && passrodForm.controls['password'].invalid) {\n <mat-error>\n @if (passrodForm.controls['password'].errors?.['required']) {\n <span>请输入密码</span>\n }\n </mat-error>\n }\n </mat-form-field>\n </form>\n }\n @if (tabIndex() === 1) {\n <form [formGroup]=\"codeForm\" class=\"flex flex-col\">\n <mat-form-field appearance=\"fill\">\n <mat-label> 手机号 </mat-label>\n <input autocomplete matInput formControlName=\"phone\" required />\n @if (codeForm.controls['phone'].touched && codeForm.controls['phone'].invalid) {\n <mat-error>\n @if (codeForm.controls['phone'].errors?.['required']) {\n <span> 手机号必填</span>\n }\n @if (codeForm.controls['phone'].errors?.['pattern']) {\n <span> 手机号格式错误 </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <div class=\"flex justify-between items-start\">\n <mat-form-field appearance=\"fill\">\n <mat-label> 验证码 </mat-label>\n <input matInput formControlName=\"code\" type=\"text\" required />\n @if (codeForm.controls['code'].touched && codeForm.controls['code'].invalid) {\n <mat-error>\n @if (codeForm.controls['code'].errors?.['required']) {\n <span> 请输入验证码 </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <button\n (click)=\"sendSMSCode()\"\n [disabled]=\"countDown\"\n [ngClass]=\"countDown ? 'bg-orange-300' : 'bg-orange-600 shadow shadow-gray-300 cursor-pointer'\"\n class=\"max-w-[128px] p-3 mt-2 text-white rounded text-center\"\n >\n <span>{{ showButtonText }}</span>\n </button>\n </div>\n </form>\n }\n @if (tabIndex() === 2) {\n <div class=\"w-[190px] h-[190px] mx-auto\">\n <iframe [src]=\"urlSafe\" class=\"w-full h-full inline\" scrolling=\"no\" frameBorder=\"no\" #iframe></iframe>\n <div></div>\n </div>\n }\n </div>\n <!-- actions -->\n <div class=\"flex justify-between items-center py-2 pl-2\">\n <a class=\"underline underline-offset-4\" href=\"signup\">创建账号</a>\n <div\n (click)=\"login()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>登录</span>\n </div>\n </div>\n </div>\n\n <!-- 3-part -->\n <!-- <div class=\"flex flex-col justify-center items-center mt-6\">\n <div class=\"flex items-center\">\n <span class=\"w-16 h-[1px] bg-gray-300\"></span>\n <span class=\"px-3\">第三方登录</span>\n <span class=\"w-16 h-[1px] bg-gray-300\"></span>\n </div>\n <div class=\"mt-3 flex items-center hover:shadow hover:shadow-gray-400 cursor-pointer p-3\">\n <img class=\"w-4 h-4\" src=\"assets/images/icon64_appwx_logo.png\" />\n <span class=\"ml-1\">微信</span>\n </div>\n </div> -->\n </div>\n</div>\n","import { Component, inject, OnInit } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { AngularCommonModule, APP_CONFIG, WINDOW } from '@rolatech/angular-common';\nimport { AngularComponentsModule, BaseComponent } from '@rolatech/angular-components';\nimport { AuthUserService } from '@rolatech/angular-auth';\n\n@Component({\n standalone: true,\n imports: [AngularCommonModule, AngularComponentsModule],\n selector: 'rolatech-account-signup',\n templateUrl: './signup.component.html',\n styleUrls: ['./signup.component.scss'],\n})\nexport class SignupComponent extends BaseComponent implements OnInit {\n signupForm!: FormGroup;\n continue = '/';\n authUserService = inject(AuthUserService);\n formBuilder = inject(FormBuilder);\n environment = inject(APP_CONFIG);\n window = inject(WINDOW);\n countDown = false;\n countDownTime = 60;\n showButtonText = '发送验证码';\n\n ngOnInit(): void {\n this.titleService.setTitle('账号注册 - 拼小课');\n this.signupForm = this.formBuilder.group({\n name: [null, Validators.required],\n phone: [null, [Validators.required, Validators.pattern('1(3|4|5|6|7|8|9)\\\\d{9}')]],\n code: [null, Validators.required],\n password: [null, Validators.required],\n rePassword: [null, Validators.required],\n });\n this.continue = this.route.snapshot.queryParams['continue'] || '/';\n }\n sendSMSCode() {\n const phoneControl = this.signupForm.get('phone');\n if (!phoneControl?.valid) {\n return;\n }\n const phone = phoneControl.value;\n this.countDown = true;\n const start = setInterval(() => {\n if (this.countDownTime >= 0) {\n this.showButtonText = `${this.countDownTime--}秒重发`;\n } else {\n clearInterval(start);\n this.showButtonText = '重新发送';\n this.countDown = false;\n this.countDownTime = 60;\n }\n }, 1000);\n this.authUserService.sendSMSCode('+86', phone).subscribe({\n next: (res) => {\n this.snackBarService.open('发送成功');\n },\n error: (error) => {\n this.snackBarService.open(error.message);\n },\n });\n }\n submit() {\n if (!this.signupForm.valid) {\n return;\n }\n const data = {};\n this.authUserService.signup(this.signupForm.value).subscribe({\n next: (res) => {\n this.window.location.href = this.continue ? this.continue : this.environment.myaccountUrl;\n },\n error: (error) => {\n this.snackBarService.open(error.message);\n },\n });\n }\n}\n","<div class=\"h-full flex flex-col md:justify-center items-center\">\n <div class=\"md:shadow-md p-8 rounded-md\">\n <div class=\"text-2xl pl-2 pb-6\">注册</div>\n <form [formGroup]=\"signupForm\" (submit)=\"submit()\">\n <!-- name -->\n <mat-form-field appearance=\"fill\">\n <mat-label> 姓名 </mat-label>\n <input matInput formControlName=\"name\" required />\n @if (signupForm.controls['name'].touched && signupForm.controls['name'].invalid) {\n <mat-error>\n @if (signupForm.controls['name'].errors?.['required']) {\n <span>姓名必填</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <!-- phone -->\n <mat-form-field appearance=\"fill\">\n <mat-label> 手机号 </mat-label>\n <input matInput formControlName=\"phone\" required />\n @if (signupForm.controls['phone'].touched && signupForm.controls['phone'].invalid) {\n <mat-error>\n @if (signupForm.controls['phone'].errors?.['required']) {\n <span>手机号必填</span>\n }\n @if (signupForm.controls['phone'].errors?.['pattern']) {\n <span> 手机号格式错误 </span>\n }\n </mat-error>\n }\n </mat-form-field>\n <!-- phone code -->\n <div class=\"flex justify-between items-start gap-3\">\n <mat-form-field appearance=\"fill\">\n <mat-label> 验证码 </mat-label>\n <input matInput formControlName=\"code\" required />\n @if (signupForm.controls['code'].touched && signupForm.controls['code'].invalid) {\n <mat-error>\n @if (signupForm.controls['code'].errors?.['required']) {\n <span>验证码必填</span>\n }\n </mat-error>\n }\n </mat-form-field>\n <div\n (click)=\"sendSMSCode()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 mt-2 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>发送验证码</span>\n </div>\n </div>\n\n <!-- password -->\n <mat-form-field appearance=\"fill\">\n <mat-label> 密码 </mat-label>\n <input matInput formControlName=\"password\" type=\"password\" autocomplete=\"password\" />\n @if (signupForm.controls['password'].touched && signupForm.controls['password'].invalid) {\n <mat-error>\n @if (signupForm.controls['password'].errors?.['required']) {\n <span>请输入密码</span>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <!-- password confirm -->\n <mat-form-field appearance=\"fill\">\n <mat-label> 确认密码 </mat-label>\n <input matInput formControlName=\"rePassword\" type=\"password\" autocomplete=\"rePassword\" />\n @if (signupForm.controls['rePassword'].touched && signupForm.controls['rePassword'].invalid) {\n <mat-error>\n @if (signupForm.controls['rePassword'].errors?.['required']) {\n <span>请确认密码</span>\n }\n </mat-error>\n }\n </mat-form-field>\n </form>\n <div class=\"flex justify-between items-center px-3\">\n <a mat-button href=\"/signin\">登录</a>\n <div\n (click)=\"submit()\"\n class=\"cursor-pointer bg-orange-600 hover:bg-orange-700 w-[128px] p-3 shadow-gray-300 shadow hover:shadow-lg text-white rounded text-center\"\n >\n <span>注册</span>\n </div>\n </div>\n </div>\n</div>\n","import { Routes } from '@angular/router';\nimport { AuthGuard, ForbiddenComponent, UnauthorizedComponent } from '@rolatech/angular-auth';\nimport { ForgotPasswordComponent } from './components/forgot-password/forgot-password.component';\nimport { LogoutComponent } from './components/logout/logout.component';\nimport { PasswordresetComponent } from './components/passwordreset/passwordreset.component';\nimport { SigninComponent } from './pages/accounts/signin/signin.component';\nimport { SignupComponent } from './pages/accounts/signup/signup.component';\n\nexport const accountRoutes: Routes = [\n {\n path: '',\n pathMatch: 'full',\n redirectTo: 'signin',\n },\n { path: 'signin', canActivate: [AuthGuard], component: SigninComponent, data: { title: 'Signin' } },\n { path: 'signup', component: SignupComponent, data: { title: 'Signup' } },\n { path: 'logout', component: LogoutComponent },\n { path: 'login', loadChildren: () => import('./components/login/login.routes') },\n {\n path: 'passwordreset/:token',\n component: PasswordresetComponent,\n data: { title: 'Password Reset' },\n },\n {\n path: 'forgot',\n component: ForgotPasswordComponent,\n data: { title: 'Forgot Password' },\n },\n {\n path: 'unauthorized',\n component: UnauthorizedComponent,\n },\n {\n path: 'forbidden',\n component: ForbiddenComponent,\n },\n];\n","import { Routes } from '@angular/router';\n\nexport const myaccountRoutes: Routes = [\n {\n path: '',\n loadComponent: () => import('./pages/myaccount/home/home.component').then((c) => c.HomeComponent),\n data: { title: '首页' },\n },\n {\n path: 'personal-info',\n loadComponent: () => import('./pages/myaccount/personal-info/info.component').then((c) => c.InfoComponent),\n },\n {\n path: 'profile',\n loadComponent: () => import('./pages/myaccount/personal-info/profile/profile.component').then((c) => c.ProfileComponent),\n },\n {\n path: 'username',\n loadComponent: () => import('./pages/myaccount/personal-info/username/username.component').then((c) => c.UsernameComponent),\n },\n { path: 'gender', loadComponent: () => import('./pages/myaccount/gender/gender.component').then((c) => c.GenderComponent) },\n { path: 'email', loadComponent: () => import('./pages/myaccount/email/email.component').then((c) => c.EmailComponent) },\n {\n path: 'email-verification/:id',\n loadComponent: () =>\n import('./pages/myaccount/email-verification/email-verification.component').then((c) => c.EmailVerificationComponent),\n },\n { path: 'phone', loadComponent: () => import('./pages/myaccount/phone/phone.component').then((c) => c.PhoneComponent) },\n {\n path: 'security',\n loadChildren: () => import('./pages/myaccount/security/security.routes'),\n data: { title: 'Security' },\n },\n {\n path: 'notifications',\n loadChildren: () => import('@rolatech/angular-notification').then((m) => m.notificationRoutes),\n data: { title: '通知中心' },\n },\n];\n","import { EnvironmentProviders, Provider, makeEnvironmentProviders } from '@angular/core';\nimport { ROUTES } from '@angular/router';\nimport { accountRoutes } from './lib/account.routes';\n\nexport function provideAngularAuthRoutes(): EnvironmentProviders {\n const provider: Provider[] = [\n {\n provide: ROUTES,\n useValue: accountRoutes,\n multi: true,\n },\n ];\n return makeEnvironmentProviders(provider);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}