I'm trying to change the [hidden] properties of some elements in my app.component.html file based on the 'isAuthenticated' boolean value present in the component controller, which is matched to the property of the same name defined in my auth.service service.
So when there is an authenticated user, and the boolean value for 'isAuthenticated' is true, the elements should show.
Currently, the boolean is set to false by default and updated where in the same auth.service file where it is defined upon successful login, but I need the value to update in the app.component.ts file as well, but can't do this due to 'Observable' not being assignable to booleans.
auth.service.ts
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import * as firebase from 'firebase/app';
import { AngularFireAuth } from 'angularfire2/auth';
@Injectable()
export class AuthService {
private user: Observable<firebase.User>;
isAuthenticated: boolean = false;
constructor(private firebaseAuth: AngularFireAuth, private router: Router) {
this.user = firebaseAuth.authState;
}
signIn(email: string, password: string) {
this.firebaseAuth
.auth
.signInWithEmailAndPassword(email, password)
.then(value => {
console.log('Signed In');
this.isAuthenticated = true;
this.router.navigateByUrl('/dashboard');
})
.catch(err => {
console.log('Sign-In Error: ', err.message);
});
}
signOut() {
this.firebaseAuth
.auth
.signOut();
this.isAuthenticated = false;
this.router.navigateByUrl('/login');
console.log('Signed Out');
}
register(email: string, password: string) {
this.firebaseAuth
.auth
.createUserWithEmailAndPassword(email, password)
.then(value => {
console.log('Registration Successful', value);
})
.catch(err => {
console.log('Registration Error: ', err.message);
});
}
}
can-activate-route.guard.ts
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { AuthService } from './services/auth.service';
@Injectable()
export class CanActivateRouteGuard implements CanActivate {
constructor(private auth: AuthService) { }
canActivate (
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this.auth.isAuthenticated;
}
}
app.component.ts
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { AngularFirestore } from 'angularfire2/firestore';
import { UsersService } from './services/users.service';
import { AuthService } from './services/auth.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
isAuthenticated: boolean;
titles: any[];
constructor(public db: AngularFirestore, private usersService: UsersService, public authService: AuthService, private router: Router) {
this.isAuthenticated = this.authService.isAuthenticated;
}
app.component.html
<button mat-button (click)="signOut()" [hidden]="isAuthenticated">Sign Out</button>