1
1
import { Injectable , Inject , Optional , NgZone } from '@angular/core' ;
2
2
import { CanActivate , ActivatedRouteSnapshot , RouterStateSnapshot , Router } from '@angular/router' ;
3
3
import { Observable , of , pipe , UnaryFunction } from 'rxjs' ;
4
- import { map , switchMap , take , observeOn , shareReplay } from 'rxjs/operators'
4
+ import { map , switchMap , take , observeOn , shareReplay } from 'rxjs/operators' ;
5
5
import { User } from 'firebase/app' ;
6
6
import { ɵAngularFireSchedulers , FirebaseOptions , FirebaseAppConfig , FIREBASE_OPTIONS , FIREBASE_APP_NAME , ɵfirebaseAppFactory } from '@angular/fire' ;
7
7
8
8
export type AuthPipeGenerator = ( next : ActivatedRouteSnapshot , state : RouterStateSnapshot ) => AuthPipe ;
9
- export type AuthPipe = UnaryFunction < Observable < User | null > , Observable < boolean | any [ ] > > ;
9
+ export type AuthPipe = UnaryFunction < Observable < User | null > , Observable < boolean | string | any [ ] > > ;
10
10
11
11
@Injectable ( {
12
12
providedIn : 'any'
@@ -16,8 +16,8 @@ export class AngularFireAuthGuard implements CanActivate {
16
16
authState : Observable < User | null > ;
17
17
18
18
constructor (
19
- @Inject ( FIREBASE_OPTIONS ) options :FirebaseOptions ,
20
- @Optional ( ) @Inject ( FIREBASE_APP_NAME ) nameOrConfig :string | FirebaseAppConfig | null | undefined ,
19
+ @Inject ( FIREBASE_OPTIONS ) options : FirebaseOptions ,
20
+ @Optional ( ) @Inject ( FIREBASE_APP_NAME ) nameOrConfig : string | FirebaseAppConfig | null | undefined ,
21
21
zone : NgZone ,
22
22
private router : Router
23
23
) {
@@ -40,21 +40,23 @@ export class AngularFireAuthGuard implements CanActivate {
40
40
return this . authState . pipe (
41
41
take ( 1 ) ,
42
42
authPipeFactory ( next , state ) ,
43
- map ( can => typeof can == "boolean" ? can : this . router . createUrlTree ( < any [ ] > can ) )
43
+ map ( can => typeof can === 'boolean' ? can :
44
+ Array . isArray ( can ) ? this . router . createUrlTree ( can ) : this . router . parseUrl ( can )
45
+ )
44
46
) ;
45
47
}
46
48
47
49
}
48
50
49
51
export const canActivate = ( pipe : AuthPipeGenerator ) => ( {
50
- canActivate : [ AngularFireAuthGuard ] , data : { authGuardPipe : pipe }
52
+ canActivate : [ AngularFireAuthGuard ] , data : { authGuardPipe : pipe }
51
53
} ) ;
52
54
53
55
export const loggedIn : AuthPipe = map ( user => ! ! user ) ;
54
56
export const isNotAnonymous : AuthPipe = map ( user => ! ! user && ! user . isAnonymous ) ;
55
57
export const idTokenResult = switchMap ( ( user : User | null ) => user ? user . getIdTokenResult ( ) : of ( null ) ) ;
56
58
export const emailVerified : AuthPipe = map ( user => ! ! user && user . emailVerified ) ;
57
59
export const customClaims = pipe ( idTokenResult , map ( idTokenResult => idTokenResult ? idTokenResult . claims : [ ] ) ) ;
58
- export const hasCustomClaim = ( claim :string ) => pipe ( customClaims , map ( claims => claims . hasOwnProperty ( claim ) ) ) ;
59
- export const redirectUnauthorizedTo = ( redirect : any [ ] ) => pipe ( loggedIn , map ( loggedIn => loggedIn || redirect ) ) ;
60
- export const redirectLoggedInTo = ( redirect : any [ ] ) => pipe ( loggedIn , map ( loggedIn => loggedIn && redirect || true ) ) ;
60
+ export const hasCustomClaim = ( claim : string ) => pipe ( customClaims , map ( claims => claims . hasOwnProperty ( claim ) ) ) ;
61
+ export const redirectUnauthorizedTo = ( redirect : string | any [ ] ) => pipe ( loggedIn , map ( loggedIn => loggedIn || redirect ) ) ;
62
+ export const redirectLoggedInTo = ( redirect : string | any [ ] ) => pipe ( loggedIn , map ( loggedIn => loggedIn && redirect || true ) ) ;
0 commit comments