All files / src/app/components/login login.component.ts

88.88% Statements 32/36
80% Branches 8/10
86.66% Functions 13/15
87.5% Lines 28/32

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                                      125x   35x       35x           35x 35x     35x   35x 2x       35x   35x     35x     35x           35x 465x     35x                         16x       16x 16x 16x     14x 14x 14x 14x 14x   14x 13x           1x               465x          
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
  }
 
}