New file |
| | |
| | | import { Component, OnDestroy } from '@angular/core'; |
| | | import { Router } from '@angular/router'; |
| | | import { |
| | | FormGroup, |
| | | FormBuilder, |
| | | Validators, |
| | | FormControl, |
| | | } from '@angular/forms'; |
| | | import { NzMessageService } from 'ng-zorro-antd'; |
| | | |
| | | @Component({ |
| | | selector: 'passport-register', |
| | | templateUrl: './register.component.html', |
| | | styleUrls: ['./register.component.less'], |
| | | }) |
| | | export class UserRegisterComponent implements OnDestroy { |
| | | form: FormGroup; |
| | | error = ''; |
| | | type = 0; |
| | | loading = false; |
| | | visible = false; |
| | | status = 'pool'; |
| | | progress = 0; |
| | | passwordProgressMap = { |
| | | ok: 'success', |
| | | pass: 'normal', |
| | | pool: 'exception', |
| | | }; |
| | | |
| | | constructor( |
| | | fb: FormBuilder, |
| | | private router: Router, |
| | | public msg: NzMessageService, |
| | | ) { |
| | | this.form = fb.group({ |
| | | mail: [null, [Validators.email]], |
| | | password: [ |
| | | null, |
| | | [ |
| | | Validators.required, |
| | | Validators.minLength(6), |
| | | UserRegisterComponent.checkPassword.bind(this), |
| | | ], |
| | | ], |
| | | confirm: [ |
| | | null, |
| | | [ |
| | | Validators.required, |
| | | Validators.minLength(6), |
| | | UserRegisterComponent.passwordEquar, |
| | | ], |
| | | ], |
| | | mobilePrefix: ['+86'], |
| | | mobile: [null, [Validators.required, Validators.pattern(/^1\d{10}$/)]], |
| | | captcha: [null, [Validators.required]], |
| | | }); |
| | | } |
| | | |
| | | static checkPassword(control: FormControl) { |
| | | if (!control) return null; |
| | | const self: any = this; |
| | | self.visible = !!control.value; |
| | | if (control.value && control.value.length > 9) self.status = 'ok'; |
| | | else if (control.value && control.value.length > 5) self.status = 'pass'; |
| | | else self.status = 'pool'; |
| | | |
| | | if (self.visible) |
| | | self.progress = |
| | | control.value.length * 10 > 100 ? 100 : control.value.length * 10; |
| | | } |
| | | |
| | | static passwordEquar(control: FormControl) { |
| | | if (!control || !control.parent) return null; |
| | | if (control.value !== control.parent.get('password').value) { |
| | | return { equar: true }; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | // region: fields |
| | | |
| | | get mail() { |
| | | return this.form.controls.mail; |
| | | } |
| | | get password() { |
| | | return this.form.controls.password; |
| | | } |
| | | get confirm() { |
| | | return this.form.controls.confirm; |
| | | } |
| | | get mobile() { |
| | | return this.form.controls.mobile; |
| | | } |
| | | get captcha() { |
| | | return this.form.controls.captcha; |
| | | } |
| | | |
| | | // endregion |
| | | |
| | | // region: get captcha |
| | | |
| | | count = 0; |
| | | interval$: any; |
| | | |
| | | getCaptcha() { |
| | | this.count = 59; |
| | | this.interval$ = setInterval(() => { |
| | | this.count -= 1; |
| | | if (this.count <= 0) clearInterval(this.interval$); |
| | | }, 1000); |
| | | } |
| | | |
| | | // endregion |
| | | |
| | | submit() { |
| | | this.error = ''; |
| | | for (const i in this.form.controls) { |
| | | this.form.controls[i].markAsDirty(); |
| | | this.form.controls[i].updateValueAndValidity(); |
| | | } |
| | | if (this.form.invalid) return; |
| | | // mock http |
| | | this.loading = true; |
| | | setTimeout(() => { |
| | | this.loading = false; |
| | | this.router.navigate(['/passport/register-result']); |
| | | }, 1000); |
| | | } |
| | | |
| | | ngOnDestroy(): void { |
| | | if (this.interval$) clearInterval(this.interval$); |
| | | } |
| | | } |