Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Texto "Please, login!" não aparece quando usuário não está logado

Boa noite pessoal, então, a aplicação está indo bem, porém quando o usuário está na página de login, não aparece o texto "Please, login!", fica aparecendo o "(Logout)". Não sei o que pode estar acontecendo.

Meu header.component.html

<header class="fixed-top">
  <nav class="navbar navbar-light bg-white">
      <a class="navbar-brand">HUGOPICTURES</a>
      <div *ngIf="(user$ | async) as user; else login"><!--O pipe async serve para capturar direto no template a última emissão do observable-->
          <i class="fa fa-user-circle"></i>
          <a class="ml-2">{{ user.name }}</a>
          <a class="ml-2" (click)="logout()">(Logout)</a>
      </div>
      <ng-template #login>
        <span class="navbar-text">
            Please, login!
        </span>
      </ng-template>
  </nav>
</header>

Meu header.component.ts

import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { Observable } from 'rxjs';

import { User } from '../user/user';
import { UserService } from './../user/user.service';

@Component({
  selector: 'hp-header',
  templateUrl: './header.component.html',
  styleUrls: [ './header.component.css' ]
})

export class HeaderComponent {

  user$: Observable<User>;

  constructor(
    private userService: UserService,
    private router: Router) {

    this.user$ = this.userService.getUser();
  }

  logout() {
    this.userService.logout();
    this.router.navigate(['']);
  }
}

Meu user.service.ts

import { Injectable } from '@angular/core';
import jwt_decode from 'jwt-decode';
import { BehaviorSubject } from 'rxjs';

import { TokenService } from './../token/token.service';
import { User } from './user';

/** Serviço para armazenar o token com auxílio do TokenService e retornar o usuário logado*/
@Injectable({ providedIn: 'root' })
export class UserService {

  /** O Behavior Subject vai pegar a informação do usuário e guardar até que alguém utilize a informação */
  private userSubject = new BehaviorSubject<User>({id:0,name:'',email:''});
  private userName!: string;

  constructor(
    private tokenService: TokenService) {
    this.tokenService.hasToken() &&
      this.decodeAndNotify();
  }

  setToken(token: string) {
    this.tokenService.setToken(token);
    this.decodeAndNotify();
  }

  getUser() {
    return this.userSubject.asObservable();
  }

  private decodeAndNotify() {
    const token = this.tokenService.getToken();
    const user = jwt_decode(token) as User;
    this.userName = user.name;
    this.userSubject.next(user);
  }

  logout() {
    this.tokenService.removeToken();
    this.userSubject.next({id:0,name:'',email:''});
  }

  isLogged() {
    return this.tokenService.hasToken();
  }

  getUserName() {
    return this.userName;
  }

}

Alguém pode me ajudar por favor?

2 respostas
solução!

O problema é que seu subject está emitindo, para representar um usuário deslogado, um objeto válido - com id 0, mas ainda assim um objeto. Para o javascript, ao realizar o cast para boolean, ele equivale a true - por isso o bloco do ngIf que contém logout é apresentado na tela, e não o bloco de template login.

Ao invés de colocar o valor default "{id:0,name:'',email:''}" na declaração do subject, e ao deslogar (na função logout) use null. O typescript pode reclamar que null não é um valor do tipo User - é só mudar os tipos de User para "User | null", indicando para o typescript que pode aceitar tanto um objeto do tipo User quanto null nesses valores.

Espero ter ajudado. Se não funcionar, avisa aqui no fórum.

Olá pessoal!

Leonardo, cara, demais! Obrigado, mas muito obrigado mesmo. Já tinha isso em vista, que ele estava reconhecendo um objeto válido e mesmo deslogado, sem token, ele continuava reconhecendo.

Esse seu comentário "O typescript pode reclamar que null não é um valor do tipo User - é só mudar os tipos de User para "User | null", indicando para o typescript que pode aceitar tanto um objeto do tipo User quanto null nesses valores." me salvou aqui, porque não sabia como fazer isso.

Mais uma vez, muito obrigado por me esclarecer.

Abraço.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software