@rolatech/angular-account 17.2.5 → 17.2.6

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 (71) 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/login/login-wechat/login-wechat.component.mjs +4 -8
  4. package/esm2022/lib/components/logout/logout.component.mjs +3 -3
  5. package/esm2022/lib/components/passwordreset/passwordreset.component.mjs +3 -3
  6. package/esm2022/lib/components/topbar-login/topbar-login.component.mjs +3 -3
  7. package/esm2022/lib/components/user-item/user-item.component.mjs +7 -5
  8. package/esm2022/lib/pages/accounts/signin/signin.component.mjs +21 -9
  9. package/esm2022/lib/pages/accounts/signup/signup.component.mjs +5 -5
  10. package/esm2022/lib/pages/myaccount/email/email.component.mjs +14 -14
  11. package/esm2022/lib/pages/myaccount/email-verification/email-verification.component.mjs +3 -3
  12. package/esm2022/lib/pages/myaccount/gender/gender.component.mjs +15 -16
  13. package/esm2022/lib/pages/myaccount/home/home.component.mjs +45 -10
  14. package/esm2022/lib/pages/myaccount/personal-info/info.component.mjs +10 -17
  15. package/esm2022/lib/pages/myaccount/personal-info/profile/profile.component.mjs +22 -16
  16. package/esm2022/lib/pages/myaccount/personal-info/username/username.component.mjs +12 -14
  17. package/esm2022/lib/pages/myaccount/phone/phone.component.mjs +19 -24
  18. package/esm2022/lib/pages/myaccount/security/security-faceid/security-faceid.component.mjs +3 -3
  19. package/esm2022/lib/pages/myaccount/security/security-index/security-index.component.mjs +3 -3
  20. package/esm2022/lib/pages/myaccount/security/security-password/security-password.component.mjs +8 -11
  21. package/esm2022/lib/pages/myaccount/security/security-verification/security-verification.component.mjs +6 -6
  22. package/esm2022/lib/services/wechat-login.service.mjs +9 -6
  23. package/fesm2022/{rolatech-angular-account-email-verification.component-D9e--XMc.mjs → rolatech-angular-account-email-verification.component-Wgkfs9Lk.mjs} +4 -4
  24. package/fesm2022/{rolatech-angular-account-email-verification.component-D9e--XMc.mjs.map → rolatech-angular-account-email-verification.component-Wgkfs9Lk.mjs.map} +1 -1
  25. package/fesm2022/{rolatech-angular-account-email.component-DC8qYVOJ.mjs → rolatech-angular-account-email.component-OZQWgvRq.mjs} +14 -14
  26. package/fesm2022/rolatech-angular-account-email.component-OZQWgvRq.mjs.map +1 -0
  27. package/fesm2022/{rolatech-angular-account-gender.component-DWdWJiQW.mjs → rolatech-angular-account-gender.component-et-tBTIn.mjs} +15 -16
  28. package/fesm2022/rolatech-angular-account-gender.component-et-tBTIn.mjs.map +1 -0
  29. package/fesm2022/rolatech-angular-account-home.component-CLpbrgbY.mjs +77 -0
  30. package/fesm2022/rolatech-angular-account-home.component-CLpbrgbY.mjs.map +1 -0
  31. package/fesm2022/rolatech-angular-account-info.component-BylW4MU8.mjs +98 -0
  32. package/fesm2022/rolatech-angular-account-info.component-BylW4MU8.mjs.map +1 -0
  33. package/fesm2022/{rolatech-angular-account-login.routes-DWwDcOM9.mjs → rolatech-angular-account-login.routes-Ck2VnoP1.mjs} +6 -10
  34. package/fesm2022/rolatech-angular-account-login.routes-Ck2VnoP1.mjs.map +1 -0
  35. package/fesm2022/rolatech-angular-account-phone.component-Y1-PQ88s.mjs +68 -0
  36. package/fesm2022/rolatech-angular-account-phone.component-Y1-PQ88s.mjs.map +1 -0
  37. package/fesm2022/rolatech-angular-account-profile.component-qPo6AqKP.mjs +50 -0
  38. package/fesm2022/rolatech-angular-account-profile.component-qPo6AqKP.mjs.map +1 -0
  39. package/fesm2022/rolatech-angular-account-rolatech-angular-account-OPsV8YM0.mjs +444 -0
  40. package/fesm2022/rolatech-angular-account-rolatech-angular-account-OPsV8YM0.mjs.map +1 -0
  41. package/fesm2022/{rolatech-angular-account-security.routes-Dag8RZ38.mjs → rolatech-angular-account-security.routes-oSrz_UlJ.mjs} +14 -15
  42. package/fesm2022/rolatech-angular-account-security.routes-oSrz_UlJ.mjs.map +1 -0
  43. package/fesm2022/{rolatech-angular-account-username.component-BL2F5fnx.mjs → rolatech-angular-account-username.component-aqWzvFh7.mjs} +12 -14
  44. package/fesm2022/rolatech-angular-account-username.component-aqWzvFh7.mjs.map +1 -0
  45. package/fesm2022/rolatech-angular-account.mjs +2 -2
  46. package/lib/pages/myaccount/email/email.component.d.ts +5 -4
  47. package/lib/pages/myaccount/gender/gender.component.d.ts +4 -1
  48. package/lib/pages/myaccount/home/home.component.d.ts +8 -4
  49. package/lib/pages/myaccount/personal-info/info.component.d.ts +2 -4
  50. package/lib/pages/myaccount/personal-info/profile/profile.component.d.ts +2 -2
  51. package/lib/pages/myaccount/personal-info/username/username.component.d.ts +2 -2
  52. package/lib/pages/myaccount/phone/phone.component.d.ts +2 -2
  53. package/lib/pages/myaccount/security/security-verification/security-verification.component.d.ts +1 -1
  54. package/lib/services/wechat-login.service.d.ts +3 -1
  55. package/package.json +5 -5
  56. package/themes/_default.scss +1 -1
  57. package/fesm2022/rolatech-angular-account-email.component-DC8qYVOJ.mjs.map +0 -1
  58. package/fesm2022/rolatech-angular-account-gender.component-DWdWJiQW.mjs.map +0 -1
  59. package/fesm2022/rolatech-angular-account-home.component-DOQ-USiX.mjs +0 -41
  60. package/fesm2022/rolatech-angular-account-home.component-DOQ-USiX.mjs.map +0 -1
  61. package/fesm2022/rolatech-angular-account-info.component-DNi4eTxV.mjs +0 -105
  62. package/fesm2022/rolatech-angular-account-info.component-DNi4eTxV.mjs.map +0 -1
  63. package/fesm2022/rolatech-angular-account-login.routes-DWwDcOM9.mjs.map +0 -1
  64. package/fesm2022/rolatech-angular-account-phone.component-r9dWPfEL.mjs +0 -73
  65. package/fesm2022/rolatech-angular-account-phone.component-r9dWPfEL.mjs.map +0 -1
  66. package/fesm2022/rolatech-angular-account-profile.component-CJfmQ3Ba.mjs +0 -44
  67. package/fesm2022/rolatech-angular-account-profile.component-CJfmQ3Ba.mjs.map +0 -1
  68. package/fesm2022/rolatech-angular-account-rolatech-angular-account-CMkF3BmF.mjs +0 -429
  69. package/fesm2022/rolatech-angular-account-rolatech-angular-account-CMkF3BmF.mjs.map +0 -1
  70. package/fesm2022/rolatech-angular-account-security.routes-Dag8RZ38.mjs.map +0 -1
  71. package/fesm2022/rolatech-angular-account-username.component-BL2F5fnx.mjs.map +0 -1
@@ -0,0 +1,50 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, effect, Component } from '@angular/core';
3
+ import * as i2 from '@angular/material/button';
4
+ import { MatButton } from '@angular/material/button';
5
+ import { AuthUserService, AuthService } from '@rolatech/angular-auth';
6
+ import { AngularCommonModule } from '@rolatech/angular-common';
7
+ import { BaseComponent, AngularComponentsModule, AppContainerComponent, ToolbarComponent } from '@rolatech/angular-components';
8
+ import { BackButtonDirective } from '@rolatech/angular-services';
9
+ import * as i1 from '@angular/forms';
10
+ import * as i3 from '@angular/material/form-field';
11
+ import * as i4 from '@angular/material/input';
12
+
13
+ class ProfileComponent extends BaseComponent {
14
+ constructor() {
15
+ super();
16
+ this.authUserService = inject(AuthUserService);
17
+ this.user = inject(AuthService).user;
18
+ this.name = '';
19
+ effect(() => {
20
+ this.name = this.user()?.name;
21
+ });
22
+ }
23
+ ngOnInit() { }
24
+ save() {
25
+ this.authUserService.changeName(this.name).subscribe({
26
+ next: (res) => {
27
+ this.snackBarService.open('修改成功');
28
+ },
29
+ error: (error) => {
30
+ this.snackBarService.open(error.message);
31
+ },
32
+ });
33
+ }
34
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: ProfileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.0", type: ProfileComponent, isStandalone: true, selector: "rolatech-account-profile", usesInheritance: true, ngImport: i0, template: "<rolatech-app-container>\n <rolatech-toolbar title=\"\u4FEE\u6539\u59D3\u540D\" back divider></rolatech-toolbar>\n <div class=\"p-3\">\n <p class=\"text-md my-3\">\u7528\u6237\u540D\u662F\u60A8\u5728\u672C\u7AD9\u7684\u7B80\u79F0, \u53EF\u4EE5\u662F\u771F\u5B9E\u59D3\u540D, \u4E5F\u53EF\u4EE5\u662F\u6635\u79F0</p>\n <div class=\"flex flex-col mt-3\">\n <mat-form-field appearance=\"fill\">\n <input matInput [(ngModel)]=\"name\" />\n </mat-form-field>\n <div class=\"flex justify-end items-center p-2\">\n <button mat-button rolatechBackButton>\u53D6\u6D88</button>\n <button mat-flat-button class=\"w-20 text-white\" (click)=\"save()\">\u4FDD\u5B58</button>\n </div>\n </div>\n </div>\n</rolatech-app-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { 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: "directive", type: BackButtonDirective, selector: "[rolatechBackButton]" }, { kind: "component", type: AppContainerComponent, selector: "rolatech-app-container" }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }] }); }
36
+ }
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: ProfileComponent, decorators: [{
38
+ type: Component,
39
+ args: [{ standalone: true, imports: [
40
+ AngularCommonModule,
41
+ AngularComponentsModule,
42
+ MatButton,
43
+ BackButtonDirective,
44
+ AppContainerComponent,
45
+ ToolbarComponent,
46
+ ], selector: 'rolatech-account-profile', template: "<rolatech-app-container>\n <rolatech-toolbar title=\"\u4FEE\u6539\u59D3\u540D\" back divider></rolatech-toolbar>\n <div class=\"p-3\">\n <p class=\"text-md my-3\">\u7528\u6237\u540D\u662F\u60A8\u5728\u672C\u7AD9\u7684\u7B80\u79F0, \u53EF\u4EE5\u662F\u771F\u5B9E\u59D3\u540D, \u4E5F\u53EF\u4EE5\u662F\u6635\u79F0</p>\n <div class=\"flex flex-col mt-3\">\n <mat-form-field appearance=\"fill\">\n <input matInput [(ngModel)]=\"name\" />\n </mat-form-field>\n <div class=\"flex justify-end items-center p-2\">\n <button mat-button rolatechBackButton>\u53D6\u6D88</button>\n <button mat-flat-button class=\"w-20 text-white\" (click)=\"save()\">\u4FDD\u5B58</button>\n </div>\n </div>\n </div>\n</rolatech-app-container>\n" }]
47
+ }], ctorParameters: () => [] });
48
+
49
+ export { ProfileComponent };
50
+ //# sourceMappingURL=rolatech-angular-account-profile.component-qPo6AqKP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolatech-angular-account-profile.component-qPo6AqKP.mjs","sources":["../../../../libs/angular-account/src/lib/pages/myaccount/personal-info/profile/profile.component.ts","../../../../libs/angular-account/src/lib/pages/myaccount/personal-info/profile/profile.component.html"],"sourcesContent":["import { Component, OnInit, effect, inject } from '@angular/core';\nimport { MatButton } from '@angular/material/button';\nimport { AuthService, AuthUserService } from '@rolatech/angular-auth';\nimport { AngularCommonModule } from '@rolatech/angular-common';\nimport { AngularComponentsModule, AppContainerComponent, BaseComponent, ToolbarComponent } from '@rolatech/angular-components';\nimport { BackButtonDirective } from '@rolatech/angular-services';\n\n@Component({\n standalone: true,\n imports: [\n AngularCommonModule,\n AngularComponentsModule,\n MatButton,\n BackButtonDirective,\n AppContainerComponent,\n ToolbarComponent,\n ],\n selector: 'rolatech-account-profile',\n templateUrl: './profile.component.html',\n styleUrls: ['./profile.component.scss'],\n})\nexport class ProfileComponent extends BaseComponent implements OnInit {\n authUserService = inject(AuthUserService);\n user = inject(AuthService).user;\n name = '';\n constructor() {\n super();\n effect(() => {\n this.name = this.user()?.name!;\n });\n }\n ngOnInit(): void {}\n\n save() {\n this.authUserService.changeName(this.name).subscribe({\n next: (res) => {\n this.snackBarService.open('修改成功');\n },\n error: (error) => {\n this.snackBarService.open(error.message);\n },\n });\n }\n}\n","<rolatech-app-container>\n <rolatech-toolbar title=\"修改姓名\" back divider></rolatech-toolbar>\n <div class=\"p-3\">\n <p class=\"text-md my-3\">用户名是您在本站的简称, 可以是真实姓名, 也可以是昵称</p>\n <div class=\"flex flex-col mt-3\">\n <mat-form-field appearance=\"fill\">\n <input matInput [(ngModel)]=\"name\" />\n </mat-form-field>\n <div class=\"flex justify-end items-center p-2\">\n <button mat-button rolatechBackButton>取消</button>\n <button mat-flat-button class=\"w-20 text-white\" (click)=\"save()\">保存</button>\n </div>\n </div>\n </div>\n</rolatech-app-container>\n"],"names":[],"mappings":";;;;;;;;;;;;AAqBM,MAAO,gBAAiB,SAAQ,aAAa,CAAA;AAIjD,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE,CAAC;AAJV,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AAC1C,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;QAChC,IAAI,CAAA,IAAA,GAAG,EAAE,CAAC;QAGR,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,IAAK,CAAC;AACjC,SAAC,CAAC,CAAC;KACJ;AACD,IAAA,QAAQ,MAAW;IAEnB,IAAI,GAAA;QACF,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;AACnD,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACnC;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;gBACf,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;aAC1C;AACF,SAAA,CAAC,CAAC;KACJ;8GArBU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrB7B,mwBAeA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDLI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,uBAAuB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEvB,mBAAmB,EAAA,QAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,qBAAqB,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,gBAAgB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAMP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAd5B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EACP,OAAA,EAAA;wBACP,mBAAmB;wBACnB,uBAAuB;wBACvB,SAAS;wBACT,mBAAmB;wBACnB,qBAAqB;wBACrB,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EACS,0BAA0B,EAAA,QAAA,EAAA,mwBAAA,EAAA,CAAA;;;;;"}
@@ -0,0 +1,444 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, Component, ViewEncapsulation, HostBinding, inject, PLATFORM_ID, EventEmitter, Injectable, Directive, signal, effect, HostListener, makeEnvironmentProviders } from '@angular/core';
3
+ import { CommonModule, isPlatformBrowser } from '@angular/common';
4
+ import * as i2 from '@angular/material/button';
5
+ import { MatButtonModule } from '@angular/material/button';
6
+ import { APP_CONFIG, AngularCommonModule, WINDOW } from '@rolatech/angular-common';
7
+ import { AuthService, AuthUserService, AuthGuard, UnauthorizedComponent, ForbiddenComponent } from '@rolatech/angular-auth';
8
+ import { MatSnackBar } from '@angular/material/snack-bar';
9
+ import { ActivatedRoute, Router, ROUTES } from '@angular/router';
10
+ import { AngularComponentsModule, BaseComponent, TabsComponent, TabComponent } from '@rolatech/angular-components';
11
+ import * as i1 from '@angular/forms';
12
+ import { FormBuilder, Validators, FormsModule } from '@angular/forms';
13
+ import { DomSanitizer } from '@angular/platform-browser';
14
+ import * as i3 from '@angular/material/form-field';
15
+ import { MatFormFieldModule } from '@angular/material/form-field';
16
+ import * as i4 from '@angular/material/input';
17
+ import { MatInputModule } from '@angular/material/input';
18
+
19
+ class UserItemComponent {
20
+ constructor() {
21
+ this.hasClass = true;
22
+ this.user = input();
23
+ this.isFollowing = input(true);
24
+ this.follow = output();
25
+ this.unfollow = output();
26
+ this.own = input();
27
+ }
28
+ onFollow() {
29
+ this.follow.emit(this.user().username);
30
+ }
31
+ onUnFollow() {
32
+ this.unfollow.emit(this.user().username);
33
+ }
34
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: UserItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", 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 }, own: { classPropertyName: "own", publicName: "own", 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 (!own()) {\n @if (isFollowing()) {\n <button mat-flat-button class=\"w-28 max-h-8\" (click)=\"onUnFollow()\">\u53D6\u6D88\u5173\u6CE8</button>\n } @else {\n <button mat-flat-button class=\"w-28 max-h-8\" (click)=\"onFollow()\">\u5173\u6CE8</button>\n }\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }], encapsulation: i0.ViewEncapsulation.None }); }
36
+ }
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: UserItemComponent, decorators: [{
38
+ type: Component,
39
+ args: [{ selector: 'rolatech-account-user-item', standalone: true, imports: [CommonModule, MatButtonModule], 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 (!own()) {\n @if (isFollowing()) {\n <button mat-flat-button class=\"w-28 max-h-8\" (click)=\"onUnFollow()\">\u53D6\u6D88\u5173\u6CE8</button>\n } @else {\n <button mat-flat-button class=\"w-28 max-h-8\" (click)=\"onFollow()\">\u5173\u6CE8</button>\n }\n }\n</div>\n" }]
40
+ }], propDecorators: { hasClass: [{
41
+ type: HostBinding,
42
+ args: ['class.rolatech-account-user-item']
43
+ }] } });
44
+
45
+ class TopbarLoginComponent {
46
+ constructor() {
47
+ this.environment = inject(APP_CONFIG);
48
+ this.platformId = inject(PLATFORM_ID);
49
+ this.service = input('www');
50
+ this.signinUrl = '';
51
+ this.signupUrl = this.environment.accountsUrl + '/signup';
52
+ this.logoutUrl = this.environment.accountsUrl + `/logout?service=${this.service()}`;
53
+ }
54
+ ngOnInit() {
55
+ if (isPlatformBrowser(this.platformId)) {
56
+ this.signinUrl = `${this.environment.accountsUrl}/signin?continue=` + window.location.href;
57
+ this.logoutUrl = this.environment.accountsUrl + `/logout?service=${this.service()}&continue=` + window.location.origin;
58
+ }
59
+ }
60
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: TopbarLoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
61
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.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 }] }); }
62
+ }
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: TopbarLoginComponent, decorators: [{
64
+ type: Component,
65
+ 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" }]
66
+ }] });
67
+
68
+ class ForgotPasswordComponent {
69
+ constructor() { }
70
+ ngOnInit() { }
71
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: ForgotPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
72
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.0", type: ForgotPasswordComponent, isStandalone: true, selector: "rolatech-account-forgot-password", ngImport: i0, template: "<p>forgot-password works!</p>\n", styles: [""] }); }
73
+ }
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: ForgotPasswordComponent, decorators: [{
75
+ type: Component,
76
+ args: [{ selector: 'rolatech-account-forgot-password', standalone: true, template: "<p>forgot-password works!</p>\n" }]
77
+ }], ctorParameters: () => [] });
78
+
79
+ class LogoutComponent {
80
+ constructor() {
81
+ this.service = '';
82
+ this.continue = '';
83
+ this.environment = inject(APP_CONFIG);
84
+ this.platformId = inject(PLATFORM_ID);
85
+ this.route = inject(ActivatedRoute);
86
+ this.router = inject(Router);
87
+ this.authService = inject(AuthService);
88
+ this.snackBar = inject(MatSnackBar);
89
+ }
90
+ ngOnInit() {
91
+ this.service = this.route.snapshot.queryParams['service'] || 'www';
92
+ this.continue = this.route.snapshot.queryParams['continue'] || '/';
93
+ if (isPlatformBrowser(this.platformId)) {
94
+ this.logout();
95
+ }
96
+ }
97
+ logout() {
98
+ this.authService.logout().subscribe({
99
+ next: (res) => {
100
+ this.router.navigate(['/signin'], {
101
+ queryParams: { continue: this.continue },
102
+ });
103
+ },
104
+ error: (error) => {
105
+ this.snackBar.open(error.message);
106
+ },
107
+ });
108
+ }
109
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: LogoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
110
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.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 }] }); }
111
+ }
112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: LogoutComponent, decorators: [{
113
+ type: Component,
114
+ args: [{ standalone: true, imports: [AngularCommonModule, AngularComponentsModule], selector: 'rolatech-account-logout', template: "<p>Please waiting...</p>\n" }]
115
+ }] });
116
+
117
+ class PasswordresetComponent {
118
+ constructor() { }
119
+ ngOnInit() { }
120
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: PasswordresetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.0", type: PasswordresetComponent, isStandalone: true, selector: "rolatech-account-passwordreset", ngImport: i0, template: "<p>passwordreset works!</p>\n", styles: [""] }); }
122
+ }
123
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: PasswordresetComponent, decorators: [{
124
+ type: Component,
125
+ args: [{ selector: 'rolatech-account-passwordreset', standalone: true, template: "<p>passwordreset works!</p>\n" }]
126
+ }], ctorParameters: () => [] });
127
+
128
+ class WeChatLoginService {
129
+ constructor() {
130
+ this.onWeChatLogin = new EventEmitter();
131
+ }
132
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: WeChatLoginService, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
133
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.0", type: WeChatLoginService, ngImport: i0 }); }
134
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: WeChatLoginService, providedIn: 'root' }); }
135
+ }
136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: WeChatLoginService, decorators: [{
137
+ type: Injectable,
138
+ args: [{
139
+ providedIn: 'root',
140
+ }]
141
+ }, {
142
+ type: Directive
143
+ }], ctorParameters: () => [] });
144
+
145
+ class SigninComponent extends BaseComponent {
146
+ onLogin(event) {
147
+ if (event.origin !== window.location.origin ||
148
+ /react-devtools/gi.test(event.data.source) ||
149
+ /angular-devtools/gi.test(event.data.source)) {
150
+ return;
151
+ }
152
+ if (event.origin === this.environment.accountsUrl && event.data.code === 200) {
153
+ window.location.href = this.continue === this.environment.accountsUrl ? this.environment.myaccountUrl : this.continue;
154
+ }
155
+ }
156
+ constructor() {
157
+ super();
158
+ this.continue = '';
159
+ this.environment = inject(APP_CONFIG);
160
+ this.platformId = inject(PLATFORM_ID);
161
+ this.formBuilder = inject(FormBuilder);
162
+ this.authService = inject(AuthService);
163
+ this.authUserService = inject(AuthUserService);
164
+ this.wechtLoginService = inject(WeChatLoginService);
165
+ this.sanitizer = inject(DomSanitizer);
166
+ this.tabIndex = signal(0);
167
+ this.countDown = false;
168
+ this.countDownTime = 60;
169
+ this.showButtonText = '发送验证码';
170
+ this.appid = 'wx567acbea73439828';
171
+ this.state = 'add';
172
+ this.urlSafe = this.sanitizer.bypassSecurityTrustResourceUrl('');
173
+ this.baseUrl = 'https://open.weixin.qq.com/connect/qrconnect';
174
+ effect(() => {
175
+ const index = this.tabIndex();
176
+ if (index === 0) {
177
+ this.codeForm.reset();
178
+ }
179
+ if (index === 1) {
180
+ this.passrodForm.reset();
181
+ }
182
+ if (index === 2) {
183
+ this.codeForm.reset();
184
+ this.passrodForm.reset();
185
+ this.wechat();
186
+ }
187
+ });
188
+ }
189
+ ngOnInit() {
190
+ this.titleService.setTitle('账号登录 - 拼小课');
191
+ this.passrodForm = this.formBuilder.group({
192
+ account: [null, Validators.required],
193
+ password: [null, Validators.required],
194
+ });
195
+ this.codeForm = this.formBuilder.group({
196
+ phone: [null, [Validators.required, Validators.pattern('1(3|4|5|6|7|8|9)\\d{9}')]],
197
+ code: [null, Validators.required],
198
+ });
199
+ this.continue = this.route.snapshot.queryParams['continue'] || '/';
200
+ }
201
+ get form() {
202
+ return this.tabIndex() === 0 ? this.passrodForm.controls : this.codeForm.controls;
203
+ }
204
+ sendSMSCode() {
205
+ const phoneControl = this.codeForm.get('phone');
206
+ if (!phoneControl?.valid) {
207
+ return;
208
+ }
209
+ const phone = phoneControl.value;
210
+ this.countDown = true;
211
+ const start = setInterval(() => {
212
+ if (this.countDownTime >= 0) {
213
+ this.showButtonText = `${this.countDownTime--}秒重发`;
214
+ }
215
+ else {
216
+ clearInterval(start);
217
+ this.showButtonText = '重新发送';
218
+ this.countDown = false;
219
+ this.countDownTime = 60;
220
+ }
221
+ }, 1000);
222
+ this.authUserService.sendSMSCode('+86', phone).subscribe({
223
+ next: (res) => {
224
+ this.snackBarService.open('发送成功');
225
+ },
226
+ error: (error) => {
227
+ this.snackBarService.open(error.message);
228
+ },
229
+ });
230
+ }
231
+ login() {
232
+ let data = {};
233
+ if (this.tabIndex() === 0) {
234
+ if (!this.passrodForm.valid) {
235
+ return;
236
+ }
237
+ data = {
238
+ account: this.form['account'].value,
239
+ password: this.form['password'].value,
240
+ };
241
+ }
242
+ if (this.tabIndex() === 1) {
243
+ if (!this.codeForm.valid) {
244
+ return;
245
+ }
246
+ data = {
247
+ phone: this.form['phone'].value,
248
+ code: this.form['code'].value,
249
+ };
250
+ }
251
+ this.authService.login(data).subscribe({
252
+ next: () => {
253
+ if (isPlatformBrowser(this.platformId)) {
254
+ window.location.href = this.continue === this.environment.accountsUrl ? this.environment.myaccountUrl : this.continue;
255
+ }
256
+ },
257
+ error: (error) => {
258
+ this.snackBarService.open(error.message);
259
+ },
260
+ });
261
+ }
262
+ wechat() {
263
+ const redirectUri = 'https://accounts.pinxiaoke.cn/login?continue';
264
+ // const redirectUri = `${window.location.origin}/login?continue`;
265
+ const href = 'https://cloudcache.tencent-cloud.com/open_proj/proj_qcloud_v2/gateway/login-regist/css/link-wx-login.css';
266
+ const encodedURI = encodeURI(redirectUri);
267
+ 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`;
268
+ this.urlSafe = this.sanitizer.bypassSecurityTrustResourceUrl(src);
269
+ }
270
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: SigninComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
271
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.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-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-[320px] min-h-[214px]\">\n @if (tabIndex() === 0) {\n <form [formGroup]=\"passrodForm\" class=\"flex flex-col\">\n <mat-form-field>\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>\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-center\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u9A8C\u8BC1\u7801 </mat-label>\n <input matInput formControlName=\"code\" 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 mat-button (click)=\"sendSMSCode()\" [disabled]=\"countDown\" class=\"max-w-[128px] text-white text-center\">\n <span>{{ showButtonText }}</span>\n </button>\n </div>\n </form>\n }\n @if (tabIndex() === 2) {\n <div class=\"w-[190px] h-[190px] ml-[56px]\">\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-3 pl-2\">\n <a class=\"underline underline-offset-4 text-sm\" href=\"signup\">\u521B\u5EFA\u8D26\u53F7</a>\n <button mat-flat-button (click)=\"login()\" class=\"w-[128px]\">\u767B\u5F55</button>\n </div>\n </div>\n </div>\n</div>\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 0s 600000s,color 0s 600000s!important}\n"], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { 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", "loading"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }] }); }
272
+ }
273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: SigninComponent, decorators: [{
274
+ type: Component,
275
+ args: [{ standalone: true, imports: [
276
+ AngularCommonModule,
277
+ AngularComponentsModule,
278
+ TabsComponent,
279
+ TabComponent,
280
+ FormsModule,
281
+ MatFormFieldModule,
282
+ MatInputModule,
283
+ ], 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-[320px] min-h-[214px]\">\n @if (tabIndex() === 0) {\n <form [formGroup]=\"passrodForm\" class=\"flex flex-col\">\n <mat-form-field>\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>\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-center\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u9A8C\u8BC1\u7801 </mat-label>\n <input matInput formControlName=\"code\" 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 mat-button (click)=\"sendSMSCode()\" [disabled]=\"countDown\" class=\"max-w-[128px] text-white text-center\">\n <span>{{ showButtonText }}</span>\n </button>\n </div>\n </form>\n }\n @if (tabIndex() === 2) {\n <div class=\"w-[190px] h-[190px] ml-[56px]\">\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-3 pl-2\">\n <a class=\"underline underline-offset-4 text-sm\" href=\"signup\">\u521B\u5EFA\u8D26\u53F7</a>\n <button mat-flat-button (click)=\"login()\" class=\"w-[128px]\">\u767B\u5F55</button>\n </div>\n </div>\n </div>\n</div>\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 0s 600000s,color 0s 600000s!important}\n"] }]
284
+ }], ctorParameters: () => [], propDecorators: { onLogin: [{
285
+ type: HostListener,
286
+ args: ['window:message', ['$event']]
287
+ }] } });
288
+
289
+ class SignupComponent extends BaseComponent {
290
+ constructor() {
291
+ super(...arguments);
292
+ this.continue = '/';
293
+ this.authUserService = inject(AuthUserService);
294
+ this.formBuilder = inject(FormBuilder);
295
+ this.environment = inject(APP_CONFIG);
296
+ this.window = inject(WINDOW);
297
+ this.countDown = false;
298
+ this.countDownTime = 60;
299
+ this.showButtonText = '发送验证码';
300
+ }
301
+ ngOnInit() {
302
+ this.titleService.setTitle('账号注册 - 拼小课');
303
+ this.signupForm = this.formBuilder.group({
304
+ name: [null, Validators.required],
305
+ phone: [null, [Validators.required, Validators.pattern('1(3|4|5|6|7|8|9)\\d{9}')]],
306
+ code: [null, Validators.required],
307
+ password: [null, Validators.required],
308
+ rePassword: [null, Validators.required],
309
+ });
310
+ this.continue = this.route.snapshot.queryParams['continue'] || '/';
311
+ }
312
+ sendSMSCode() {
313
+ const phoneControl = this.signupForm.get('phone');
314
+ if (!phoneControl?.valid) {
315
+ return;
316
+ }
317
+ const phone = phoneControl.value;
318
+ this.countDown = true;
319
+ const start = setInterval(() => {
320
+ if (this.countDownTime >= 0) {
321
+ this.showButtonText = `${this.countDownTime--}秒重发`;
322
+ }
323
+ else {
324
+ clearInterval(start);
325
+ this.showButtonText = '重新发送';
326
+ this.countDown = false;
327
+ this.countDownTime = 60;
328
+ }
329
+ }, 1000);
330
+ this.authUserService.sendSMSCode('+86', phone).subscribe({
331
+ next: (res) => {
332
+ this.snackBarService.open('发送成功');
333
+ },
334
+ error: (error) => {
335
+ this.snackBarService.open(error.message);
336
+ },
337
+ });
338
+ }
339
+ submit() {
340
+ if (!this.signupForm.valid) {
341
+ return;
342
+ }
343
+ const data = {};
344
+ this.authUserService.signup(this.signupForm.value).subscribe({
345
+ next: (res) => {
346
+ this.window.location.href = this.continue ? this.continue : this.environment.myaccountUrl;
347
+ },
348
+ error: (error) => {
349
+ this.snackBarService.open(error.message);
350
+ },
351
+ });
352
+ }
353
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: SignupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
354
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.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 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\">\u6CE8\u518C</div>\n <div class=\"text-md ml-2\">\u521B\u5EFA\u8D26\u53F7, \u83B7\u5F97\u66F4\u591A\u529F\u80FD</div>\n </div>\n <div>\n <form [formGroup]=\"signupForm\" (submit)=\"submit()\" class=\"flex flex-col\">\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-center gap-3\">\n <mat-form-field appearance=\"fill\" class=\"w-full\">\n <mat-label> \u9A8C\u8BC1\u7801 </mat-label>\n <input matInput type=\"text\" formControlName=\"code\" autocomplete=\"new-password\" 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 <button mat-button (click)=\"sendSMSCode()\" [disabled]=\"countDown\" class=\"w-[128px] text-white text-center\">\n <span>{{ showButtonText }}</span>\n </button>\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 py-3 pl-2\">\n <a mat-button href=\"/signin\">\u767B\u5F55</a>\n <button mat-flat-button (click)=\"submit()\" class=\"w-[128px]\">\u6CE8\u518C</button>\n </div>\n </div>\n </div>\n</div>\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 0s 600000s,color 0s 600000s!important}\n"], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.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: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { 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"] }] }); }
355
+ }
356
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: SignupComponent, decorators: [{
357
+ type: Component,
358
+ args: [{ standalone: true, imports: [AngularCommonModule, AngularComponentsModule], selector: 'rolatech-account-signup', template: "<div class=\"h-full flex flex-col md:justify-center items-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\">\u6CE8\u518C</div>\n <div class=\"text-md ml-2\">\u521B\u5EFA\u8D26\u53F7, \u83B7\u5F97\u66F4\u591A\u529F\u80FD</div>\n </div>\n <div>\n <form [formGroup]=\"signupForm\" (submit)=\"submit()\" class=\"flex flex-col\">\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-center gap-3\">\n <mat-form-field appearance=\"fill\" class=\"w-full\">\n <mat-label> \u9A8C\u8BC1\u7801 </mat-label>\n <input matInput type=\"text\" formControlName=\"code\" autocomplete=\"new-password\" 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 <button mat-button (click)=\"sendSMSCode()\" [disabled]=\"countDown\" class=\"w-[128px] text-white text-center\">\n <span>{{ showButtonText }}</span>\n </button>\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 py-3 pl-2\">\n <a mat-button href=\"/signin\">\u767B\u5F55</a>\n <button mat-flat-button (click)=\"submit()\" class=\"w-[128px]\">\u6CE8\u518C</button>\n </div>\n </div>\n </div>\n</div>\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 0s 600000s,color 0s 600000s!important}\n"] }]
359
+ }] });
360
+
361
+ const accountRoutes = [
362
+ {
363
+ path: '',
364
+ pathMatch: 'full',
365
+ redirectTo: 'signin',
366
+ },
367
+ { path: 'signin', canActivate: [AuthGuard], component: SigninComponent, data: { title: 'Signin' } },
368
+ { path: 'signup', component: SignupComponent, data: { title: 'Signup' } },
369
+ { path: 'logout', component: LogoutComponent },
370
+ { path: 'login', loadChildren: () => import('./rolatech-angular-account-login.routes-Ck2VnoP1.mjs') },
371
+ {
372
+ path: 'passwordreset/:token',
373
+ component: PasswordresetComponent,
374
+ data: { title: 'Password Reset' },
375
+ },
376
+ {
377
+ path: 'forgot',
378
+ component: ForgotPasswordComponent,
379
+ data: { title: 'Forgot Password' },
380
+ },
381
+ {
382
+ path: 'unauthorized',
383
+ component: UnauthorizedComponent,
384
+ },
385
+ {
386
+ path: 'forbidden',
387
+ component: ForbiddenComponent,
388
+ },
389
+ ];
390
+
391
+ const myaccountRoutes = [
392
+ {
393
+ path: '',
394
+ loadComponent: () => import('./rolatech-angular-account-home.component-CLpbrgbY.mjs').then((c) => c.HomeComponent),
395
+ data: { title: '首页' },
396
+ },
397
+ {
398
+ path: 'personal-info',
399
+ loadComponent: () => import('./rolatech-angular-account-info.component-BylW4MU8.mjs').then((c) => c.InfoComponent),
400
+ },
401
+ {
402
+ path: 'profile',
403
+ loadComponent: () => import('./rolatech-angular-account-profile.component-qPo6AqKP.mjs').then((c) => c.ProfileComponent),
404
+ },
405
+ {
406
+ path: 'username',
407
+ loadComponent: () => import('./rolatech-angular-account-username.component-aqWzvFh7.mjs').then((c) => c.UsernameComponent),
408
+ },
409
+ { path: 'gender', loadComponent: () => import('./rolatech-angular-account-gender.component-et-tBTIn.mjs').then((c) => c.GenderComponent) },
410
+ { path: 'email', loadComponent: () => import('./rolatech-angular-account-email.component-OZQWgvRq.mjs').then((c) => c.EmailComponent) },
411
+ {
412
+ path: 'email-verification/:id',
413
+ loadComponent: () => import('./rolatech-angular-account-email-verification.component-Wgkfs9Lk.mjs').then((c) => c.EmailVerificationComponent),
414
+ },
415
+ { path: 'phone', loadComponent: () => import('./rolatech-angular-account-phone.component-Y1-PQ88s.mjs').then((c) => c.PhoneComponent) },
416
+ {
417
+ path: 'security',
418
+ loadChildren: () => import('./rolatech-angular-account-security.routes-oSrz_UlJ.mjs'),
419
+ data: { title: 'Security' },
420
+ },
421
+ {
422
+ path: 'notifications',
423
+ loadChildren: () => import('@rolatech/angular-notification').then((m) => m.notificationRoutes),
424
+ data: { title: '通知中心' },
425
+ },
426
+ ];
427
+
428
+ function provideAngularAuthRoutes() {
429
+ const provider = [
430
+ {
431
+ provide: ROUTES,
432
+ useValue: accountRoutes,
433
+ multi: true,
434
+ },
435
+ ];
436
+ return makeEnvironmentProviders(provider);
437
+ }
438
+
439
+ /**
440
+ * Generated bundle index. Do not edit.
441
+ */
442
+
443
+ export { TopbarLoginComponent as T, UserItemComponent as U, WeChatLoginService as W, accountRoutes as a, myaccountRoutes as m, provideAngularAuthRoutes as p };
444
+ //# sourceMappingURL=rolatech-angular-account-rolatech-angular-account-OPsV8YM0.mjs.map