From c95e87290f85011ab31fdf2039f627a05c3aec5f Mon Sep 17 00:00:00 2001 From: "narindra.rajohnso" <narindra-hasimanjaka-david.rajohnson@etu.hesge.ch> Date: Thu, 8 Jun 2023 10:30:17 +0200 Subject: [PATCH] add token send and verify --- .../quizz-game/src/app/app-routing.module.ts | 22 ++++++++++++ Frontend/quizz-game/src/app/app.module.ts | 18 ++++++++-- .../src/app/homepage/homepage.component.css | 0 .../src/app/homepage/homepage.component.html | 20 +++++++++++ .../app/homepage/homepage.component.spec.ts | 21 ++++++++++++ .../src/app/homepage/homepage.component.ts | 19 +++++++++++ .../quizz-play/quizz-play.component.css | 0 .../quizz-play/quizz-play.component.html | 1 + .../quizz-play/quizz-play.component.spec.ts | 21 ++++++++++++ .../quizz-play/quizz-play.component.ts | 10 ++++++ .../src/app/homepage/quizz.service.spec.ts | 16 +++++++++ .../src/app/homepage/quizz.service.ts | 15 ++++++++ .../waiting-players.component.css | 0 .../waiting-players.component.html | 14 ++++++++ .../waiting-players.component.spec.ts | 21 ++++++++++++ .../waiting-players.component.ts | 24 +++++++++++++ .../quizz-game/src/app/login/session-model.ts | 6 ++++ .../src/app/login/session.service.spec.ts | 16 +++++++++ .../src/app/login/session.service.ts | 34 +++++++++++++++++++ .../app/login/sign-in/sign-in.component.ts | 10 ++++-- .../app/login/sign-up/sign-up.component.ts | 8 +++-- .../login/token-interceptor.service.spec.ts | 16 +++++++++ .../app/login/token-interceptor.service.ts | 25 ++++++++++++++ .../users/list-users/list-users.component.ts | 5 +-- 24 files changed, 331 insertions(+), 11 deletions(-) create mode 100644 Frontend/quizz-game/src/app/homepage/homepage.component.css create mode 100644 Frontend/quizz-game/src/app/homepage/homepage.component.html create mode 100644 Frontend/quizz-game/src/app/homepage/homepage.component.spec.ts create mode 100644 Frontend/quizz-game/src/app/homepage/homepage.component.ts create mode 100644 Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.css create mode 100644 Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.html create mode 100644 Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.spec.ts create mode 100644 Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.ts create mode 100644 Frontend/quizz-game/src/app/homepage/quizz.service.spec.ts create mode 100644 Frontend/quizz-game/src/app/homepage/quizz.service.ts create mode 100644 Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.css create mode 100644 Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.html create mode 100644 Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.spec.ts create mode 100644 Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.ts create mode 100644 Frontend/quizz-game/src/app/login/session.service.spec.ts create mode 100644 Frontend/quizz-game/src/app/login/session.service.ts create mode 100644 Frontend/quizz-game/src/app/login/token-interceptor.service.spec.ts create mode 100644 Frontend/quizz-game/src/app/login/token-interceptor.service.ts diff --git a/Frontend/quizz-game/src/app/app-routing.module.ts b/Frontend/quizz-game/src/app/app-routing.module.ts index 4c9cd1f..fda8f9f 100644 --- a/Frontend/quizz-game/src/app/app-routing.module.ts +++ b/Frontend/quizz-game/src/app/app-routing.module.ts @@ -9,6 +9,9 @@ import {ListQuestionsComponent} from "./manage/questions/list-questions/list-que import {CreateUserComponent} from "./manage/users/create-user/create-user.component"; import {CreateQuestionComponent} from "./manage/questions/create-question/create-question.component"; import {AccountDetailsComponent} from "./manage/account-details/account-details.component"; +import {HomepageComponent} from "./homepage/homepage.component"; +import {WaitingPlayersComponent} from "./homepage/waiting-players/waiting-players.component"; +import {QuizzPlayComponent} from "./homepage/quizz-play/quizz-play.component"; const routes: Routes = [ { path: '', redirectTo: 'login', pathMatch: 'full' }, @@ -52,8 +55,27 @@ const routes: Routes = [ component: AccountDetailsComponent } ] + }, + { path: ':username/play', + component: HomepageComponent, + children: [ + { + path: '', + redirectTo: 'waiting-players', + pathMatch: 'full' + }, + { + path: 'waiting-players', + component: WaitingPlayersComponent + }, + { + path: 'quizz-play', + component: QuizzPlayComponent + } + ] } + ]; @NgModule({ diff --git a/Frontend/quizz-game/src/app/app.module.ts b/Frontend/quizz-game/src/app/app.module.ts index 9e50a3d..48bd2b7 100644 --- a/Frontend/quizz-game/src/app/app.module.ts +++ b/Frontend/quizz-game/src/app/app.module.ts @@ -9,7 +9,7 @@ import { LoginComponent } from './login/login.component'; import {CommonModule, NgOptimizedImage} from "@angular/common"; import { FormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms'; -import { HttpClientModule } from '@angular/common/http'; +import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http'; import { ErrorloginComponent } from './login/errorlogin/errorlogin.component'; import { ManageComponent } from './manage/manage.component'; import { ListUsersComponent } from './manage/users/list-users/list-users.component'; @@ -22,6 +22,10 @@ import { LoadingComponent } from './manage/component/loading/loading.component'; import { EditUserComponent } from './manage/users/edit-user/edit-user.component'; import { EditQuestionComponent } from './manage/questions/edit-question/edit-question.component'; import { DeleteItemComponent } from './manage/component/delete-item/delete-item.component'; +import { HomepageComponent } from './homepage/homepage.component'; +import { WaitingPlayersComponent } from './homepage/waiting-players/waiting-players.component'; +import { QuizzPlayComponent } from './homepage/quizz-play/quizz-play.component'; +import {TokenInterceptorService} from "./login/token-interceptor.service"; @@ -42,7 +46,10 @@ import { DeleteItemComponent } from './manage/component/delete-item/delete-item. LoadingComponent, EditUserComponent, EditQuestionComponent, - DeleteItemComponent + DeleteItemComponent, + HomepageComponent, + WaitingPlayersComponent, + QuizzPlayComponent ], imports: [ BrowserModule, @@ -53,7 +60,12 @@ import { DeleteItemComponent } from './manage/component/delete-item/delete-item. HttpClientModule, NgOptimizedImage ], - providers: [], + providers: [{ + provide: HTTP_INTERCEPTORS, + useClass: TokenInterceptorService, + multi: true + }], + bootstrap: [AppComponent] }) export class AppModule { } diff --git a/Frontend/quizz-game/src/app/homepage/homepage.component.css b/Frontend/quizz-game/src/app/homepage/homepage.component.css new file mode 100644 index 0000000..e69de29 diff --git a/Frontend/quizz-game/src/app/homepage/homepage.component.html b/Frontend/quizz-game/src/app/homepage/homepage.component.html new file mode 100644 index 0000000..114dc72 --- /dev/null +++ b/Frontend/quizz-game/src/app/homepage/homepage.component.html @@ -0,0 +1,20 @@ +<div class="flex h-screen"> + <div class="w-1/4 flex h-screen flex-col justify-between border-e bg-white"> + + <div class="bg-white p-8"> + <h1 class="text-2xl font-bold mb-4">Joueurs Connectés</h1> + <ul class="text-gray-600"> + <li *ngFor="let player of players" class="mb-2">{{ player.firstname }} {{ player.lastname }}</li> + </ul> + <ng-container *ngIf="players.length === 3"> + <p class="text-green-500 mt-4">Tous les joueurs sont connectés ! La partie peut commencer.</p> + </ng-container> + </div> + + + </div> + <div class="w-3/4 h-screen"> + <router-outlet></router-outlet> + </div> +</div> + diff --git a/Frontend/quizz-game/src/app/homepage/homepage.component.spec.ts b/Frontend/quizz-game/src/app/homepage/homepage.component.spec.ts new file mode 100644 index 0000000..5115657 --- /dev/null +++ b/Frontend/quizz-game/src/app/homepage/homepage.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HomepageComponent } from './homepage.component'; + +describe('HomepageComponent', () => { + let component: HomepageComponent; + let fixture: ComponentFixture<HomepageComponent>; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [HomepageComponent] + }); + fixture = TestBed.createComponent(HomepageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Frontend/quizz-game/src/app/homepage/homepage.component.ts b/Frontend/quizz-game/src/app/homepage/homepage.component.ts new file mode 100644 index 0000000..50fa2ce --- /dev/null +++ b/Frontend/quizz-game/src/app/homepage/homepage.component.ts @@ -0,0 +1,19 @@ +import {Component, OnInit} from '@angular/core'; +import {User} from "../manage/users/user-model"; + +@Component({ + selector: 'app-homepage', + templateUrl: './homepage.component.html', + styleUrls: ['./homepage.component.css'] +}) +export class HomepageComponent implements OnInit { + players: User[]= []; + + ngOnInit() { + this.players.push(new User("test", "voila", "moi", "sdfg@sdf.th", "user", "fsfdss")); + } + + onUserConnect(user:User){ + this.players.push(user); + } +} diff --git a/Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.css b/Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.css new file mode 100644 index 0000000..e69de29 diff --git a/Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.html b/Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.html new file mode 100644 index 0000000..d4ff39b --- /dev/null +++ b/Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.html @@ -0,0 +1 @@ +<p>quizz-play works!</p> diff --git a/Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.spec.ts b/Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.spec.ts new file mode 100644 index 0000000..2c9ee6d --- /dev/null +++ b/Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { QuizzPlayComponent } from './quizz-play.component'; + +describe('QuizzPlayComponent', () => { + let component: QuizzPlayComponent; + let fixture: ComponentFixture<QuizzPlayComponent>; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [QuizzPlayComponent] + }); + fixture = TestBed.createComponent(QuizzPlayComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.ts b/Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.ts new file mode 100644 index 0000000..5308be1 --- /dev/null +++ b/Frontend/quizz-game/src/app/homepage/quizz-play/quizz-play.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-quizz-play', + templateUrl: './quizz-play.component.html', + styleUrls: ['./quizz-play.component.css'] +}) +export class QuizzPlayComponent { + +} diff --git a/Frontend/quizz-game/src/app/homepage/quizz.service.spec.ts b/Frontend/quizz-game/src/app/homepage/quizz.service.spec.ts new file mode 100644 index 0000000..1c8c518 --- /dev/null +++ b/Frontend/quizz-game/src/app/homepage/quizz.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { QuizzService } from './quizz.service'; + +describe('QuizzService', () => { + let service: QuizzService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(QuizzService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/Frontend/quizz-game/src/app/homepage/quizz.service.ts b/Frontend/quizz-game/src/app/homepage/quizz.service.ts new file mode 100644 index 0000000..36b1331 --- /dev/null +++ b/Frontend/quizz-game/src/app/homepage/quizz.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import {User} from "../manage/users/user-model"; +import {BehaviorSubject} from "rxjs"; + +@Injectable({ + providedIn: 'root' +}) +export class QuizzService { + private _players= new BehaviorSubject<User[]>([]); + + get players(){ + return this._players.asObservable(); + } + constructor() { } +} diff --git a/Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.css b/Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.css new file mode 100644 index 0000000..e69de29 diff --git a/Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.html b/Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.html new file mode 100644 index 0000000..934d865 --- /dev/null +++ b/Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.html @@ -0,0 +1,14 @@ +<script src="waiting-players.component.ts"></script> +<div class="flex items-center justify-center h-screen bg-primary"> + <div class="bg-white rounded-lg shadow p-8"> + <h1 class="text-2xl font-bold mb-4">Bienvenue></h1> + <h2 class="text-2xl font-bold mb-4">En attente de 3 joueurs...</h2> + <p class="text-gray-600">Veuillez patienter pendant que d'autres joueurs se connectent.</p> + <div class="flex justify-center mt-6"> + <div class="w-8 h-8 bg-sky-500 rounded-full animate-bounce"></div> + <div class="w-8 h-8 bg-sky-500 rounded-full mx-1 "></div> + <div class="w-8 h-8 bg-sky-500 rounded-full"></div> + </div> + </div> +</div> + diff --git a/Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.spec.ts b/Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.spec.ts new file mode 100644 index 0000000..5140f89 --- /dev/null +++ b/Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WaitingPlayersComponent } from './waiting-players.component'; + +describe('WaitingPlayersComponent', () => { + let component: WaitingPlayersComponent; + let fixture: ComponentFixture<WaitingPlayersComponent>; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [WaitingPlayersComponent] + }); + fixture = TestBed.createComponent(WaitingPlayersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.ts b/Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.ts new file mode 100644 index 0000000..cc6d73f --- /dev/null +++ b/Frontend/quizz-game/src/app/homepage/waiting-players/waiting-players.component.ts @@ -0,0 +1,24 @@ +import {Component, OnInit} from '@angular/core'; +import {Session} from "../../login/session-model"; +import {SessionService} from "../../login/session.service"; +import {Subscription} from "rxjs"; + +@Component({ + selector: 'app-waiting-players', + templateUrl: './waiting-players.component.html', + styleUrls: ['./waiting-players.component.css'] +}) +export class WaitingPlayersComponent implements OnInit{ + userInfo!: Session; + userSub!: Subscription; + constructor(private sessionService: SessionService) { + } + + ngOnInit() { + this.userSub=this.sessionService.sessionSubject.subscribe((session)=>{ + this.userInfo=session; + }) + console.log(this.userInfo); + } + +} diff --git a/Frontend/quizz-game/src/app/login/session-model.ts b/Frontend/quizz-game/src/app/login/session-model.ts index e69de29..1039275 100644 --- a/Frontend/quizz-game/src/app/login/session-model.ts +++ b/Frontend/quizz-game/src/app/login/session-model.ts @@ -0,0 +1,6 @@ +export class Session { + constructor( + public firstname: string, + public lastname: string + ) {} +} diff --git a/Frontend/quizz-game/src/app/login/session.service.spec.ts b/Frontend/quizz-game/src/app/login/session.service.spec.ts new file mode 100644 index 0000000..4238e14 --- /dev/null +++ b/Frontend/quizz-game/src/app/login/session.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { SessionService } from './session.service'; + +describe('SessionService', () => { + let service: SessionService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(SessionService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/Frontend/quizz-game/src/app/login/session.service.ts b/Frontend/quizz-game/src/app/login/session.service.ts new file mode 100644 index 0000000..33b4872 --- /dev/null +++ b/Frontend/quizz-game/src/app/login/session.service.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@angular/core'; +import {Subject} from "rxjs"; +import {Session} from "./session-model"; + +@Injectable({ + providedIn: 'root' +}) +export class SessionService { + private static LS_SESSION_TOKEN: string = "sessionToken" + + private _session!: Session; + + public sessionSubject: Subject<Session> = new Subject<Session>() + + get session(): Session { + return this._session + } + + set session(session: Session) { + this._session = session + this.sessionSubject.next(this._session) + } + + get token(): string { + return localStorage.getItem(SessionService.LS_SESSION_TOKEN) ?? "" + } + + set token(token: string) { + localStorage.setItem(SessionService.LS_SESSION_TOKEN, token) + } + + constructor() { } + +} diff --git a/Frontend/quizz-game/src/app/login/sign-in/sign-in.component.ts b/Frontend/quizz-game/src/app/login/sign-in/sign-in.component.ts index 2699332..45b29ab 100644 --- a/Frontend/quizz-game/src/app/login/sign-in/sign-in.component.ts +++ b/Frontend/quizz-game/src/app/login/sign-in/sign-in.component.ts @@ -3,6 +3,8 @@ import {Router} from "@angular/router"; import {FormControl, FormGroup, Validators} from "@angular/forms"; import {HttpClient} from "@angular/common/http"; import {ErrorLogin, LoginService} from "../login.service"; +import {SessionService} from "../session.service"; +import {Session} from "../session-model"; @Component({ selector: 'app-sign-in', @@ -13,7 +15,7 @@ export class SignInComponent implements OnInit{ formData!: FormGroup; errorOccured!: boolean; - constructor(private httpClient: HttpClient, private loginService: LoginService, private router: Router) { + constructor(private sessionService: SessionService, private httpClient: HttpClient, private loginService: LoginService, private router: Router) { } @@ -40,13 +42,15 @@ export class SignInComponent implements OnInit{ let username:string=this.formData.value.username; this.httpClient.post<any>('http://localhost:30992/api/v1/guest/'+username, passwordPost).subscribe( response => { + console.log("reponse sign in:", response); + this.sessionService.token=response.token; + this.sessionService.session=new Session(response.firstname, response.lastname); if(response.message === "USER_ALLOWED"){ - this.router.navigate(['/'+username+'/manage']); + this.router.navigate(['/'+username+'/play']); } if(response.message === "ADMIN_ALLOWED"){ this.router.navigate(['/' + username + '/manage']) } - console.log(response.message); }, error => { diff --git a/Frontend/quizz-game/src/app/login/sign-up/sign-up.component.ts b/Frontend/quizz-game/src/app/login/sign-up/sign-up.component.ts index e96e5f6..0f943d7 100644 --- a/Frontend/quizz-game/src/app/login/sign-up/sign-up.component.ts +++ b/Frontend/quizz-game/src/app/login/sign-up/sign-up.component.ts @@ -2,6 +2,7 @@ import {Component, ElementRef, OnInit, ViewChild} from '@angular/core'; import {FormControl, FormGroup, Validators} from "@angular/forms"; import {HttpClient} from "@angular/common/http"; import {ErrorLogin, LoginService} from "../login.service"; +import {Router} from "@angular/router"; @Component({ selector: 'app-sign-up', @@ -12,7 +13,7 @@ export class SignUpComponent{ formData!: FormGroup; @ViewChild('passwordConfirmation') passwordConfirmation!: ElementRef errorOccured!: boolean; - constructor(private httpClient: HttpClient, private loginService: LoginService) { } + constructor(private router: Router, private httpClient: HttpClient, private loginService: LoginService) { } ngOnInit() { this.errorOccured=false; @@ -34,8 +35,9 @@ export class SignUpComponent{ this.formData.value.accountType=0; this.httpClient.post<any>('http://localhost:30992/api/v1/guest/create-account', this.formData.value).subscribe( response => { - console.log(response); // Affiche la réponse du serveur dans la console - // Effectuer une action en fonction de la réponse du serveur ici + console.log(response); + this.router.navigate(['/login/sign-in']); + }, error => { this.errorOccured=true; diff --git a/Frontend/quizz-game/src/app/login/token-interceptor.service.spec.ts b/Frontend/quizz-game/src/app/login/token-interceptor.service.spec.ts new file mode 100644 index 0000000..b3ca21c --- /dev/null +++ b/Frontend/quizz-game/src/app/login/token-interceptor.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { TokenInterceptorService } from './token-interceptor.service'; + +describe('TokenInterceptorService', () => { + let service: TokenInterceptorService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(TokenInterceptorService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/Frontend/quizz-game/src/app/login/token-interceptor.service.ts b/Frontend/quizz-game/src/app/login/token-interceptor.service.ts new file mode 100644 index 0000000..4747a5d --- /dev/null +++ b/Frontend/quizz-game/src/app/login/token-interceptor.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import {SessionService} from "./session.service"; +import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from "@angular/common/http"; +import {Observable} from "rxjs"; + +@Injectable({ + providedIn: 'root' +}) +export class TokenInterceptorService implements HttpInterceptor { + + constructor(private sessionService: SessionService) { } + + intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { + if ((req.url.indexOf("127.0.0.1") !== -1 || req.url.indexOf("localhost") !== -1) && req.url.indexOf("assets") === -1) { + req = req.clone({ + setHeaders: { + Authorization: "Bearer " + this.sessionService.token + } + }) + } + + return next.handle(req) + } + +} diff --git a/Frontend/quizz-game/src/app/manage/users/list-users/list-users.component.ts b/Frontend/quizz-game/src/app/manage/users/list-users/list-users.component.ts index 39d0ffa..4fbfe7d 100644 --- a/Frontend/quizz-game/src/app/manage/users/list-users/list-users.component.ts +++ b/Frontend/quizz-game/src/app/manage/users/list-users/list-users.component.ts @@ -63,13 +63,14 @@ export class ListUsersComponent implements OnInit, OnDestroy { this.modalUser=false; this.userEdited=null; this.alertDelete=false; - if(value !== "error"){ + if(value !== "error" && value !== undefined){ this.alertSuccess=value; this.addSuccess=true; setTimeout(() => { this.addSuccess = false; }, 5000); - }else{ + } + if(value === "error"){ this.errorOccured=true; setTimeout(() => { this.errorOccured = false; -- GitLab