Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | 133x 37x 37x 37x 37x 37x 37x 2x 37x 37x 37x 37x 37x 529x 37x 18x 18x 18x 18x 16x 16x 16x 16x 16x 16x 15x 1x 529x | import { Component, inject, OnInit, OnDestroy } from '@angular/core';
import { Router, RouterModule, RouterLink, ActivatedRoute } from '@angular/router';
import { FormsModule } from '@angular/forms';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ReactiveFormsModule } from '@angular/forms';
import { ToastModule } from 'primeng/toast';
import { MessageService } from 'primeng/api';
import { StyleService } from '../../services/style.service';
import { TwinpadApiService } from '../../services/twinpad-api.service';
import { first, interval, Subscription } from 'rxjs';
@Component({
selector: 'app-login',
imports: [RouterModule, RouterLink, FormsModule, ReactiveFormsModule, ToastModule],
providers: [],
templateUrl: './login.component.html',
styleUrl: './login.component.scss'
})
export class LoginComponent implements OnInit, OnDestroy{
tokenValiditySubscription: Subscription;
messageService = inject(MessageService);
param: string;
email: string;
password: string;
company: string = "spacedreams";
loginForm: FormGroup;
// TODO: Associating logos to organizations ?
companyLogo: string;
constructor(private router: Router, private fb: FormBuilder, private twinpadApiService: TwinpadApiService,
private route: ActivatedRoute, private styleService: StyleService){}
ngOnInit() {
this.twinpadApiService.cloudStatusBehaviorSubject$.pipe(first()).subscribe({
next: status => {
if (status.services.backend === "up" && this.twinpadApiService.isTokenValid()) {
this.router.navigate(['']);
}
}
});
this.route.queryParams
.subscribe(params => {
this.param = params['email'];
});
this.companyLogo = this.styleService.defaultLogo;
// Initialize the form
this.loginForm = this.fb.group({
email: [this.param, [Validators.required, Validators.email]], // Add validation for email
password: ['', Validators.required]
});
// Watch for email input changes
this.loginForm.get('email')?.valueChanges.subscribe((email: string) => {
this.updateCompanyLogo(email);
});
this.tokenValiditySubscription = interval(5000).subscribe({
next: _ => {
if (this.twinpadApiService.isTokenValid()) {
this.twinpadApiService.loggedInUserBehaviorSubject$.next(true);
setTimeout(() => {
this.router.navigate(['']);
}, 500);
}
}
});
}
ngOnDestroy(): void {
this.tokenValiditySubscription?.unsubscribe();
}
login(){
const email = this.loginForm.get("email")?.value;
localStorage.removeItem('accessToken');
this.twinpadApiService.login(this.loginForm).subscribe(
{
next: value => {
this.messageService.add({severity:'success', summary: 'Login success', detail: 'Welcome '+ email});
localStorage.setItem('accessToken', value.access_token );
this.tokenValiditySubscription?.unsubscribe();
this.twinpadApiService.loggedInUserBehaviorSubject$.next(this.twinpadApiService.isTokenValid());
this.route.queryParams.subscribe({
next: queryParams => {
setTimeout(() => {
this.router.navigate(['/' + (queryParams["redirectTo"] ?? "")]);
}, 1500);
}
});
},
error: err => {
this.messageService.add({severity:'error', summary: 'Login failed', detail: err.error.detail});
}
}
);
}
updateCompanyLogo(email: string) {
// Parse the domain from the email
this.companyLogo = this.styleService.getCustomerLogoFromEmail(email);
// Set the company logo based on the domain
}
}
|