1
+ import { Component , OnInit , OnDestroy , Injectable } from "@angular/core" ;
2
+ import { RouterConfig , Router , CanActivate } from '@angular/router' ;
3
+ import { Observable } from "rxjs" ;
4
+ import { NS_ROUTER_DIRECTIVES , nsProvideRouter , RouterExtensions , PageRoute } from "nativescript-angular/router" ;
5
+ import { NSLocationStrategy } from "nativescript-angular/router/ns-location-strategy" ;
6
+ import { BehaviorSubject } from "rxjs" ;
7
+ import * as appSettings from "application-settings"
8
+
9
+ const USER_KEY = "user" ;
10
+
11
+ @Injectable ( )
12
+ class LoginService {
13
+ username : string ;
14
+ get isLogged ( ) : boolean { return ! ! this . username ; }
15
+
16
+ constructor ( ) {
17
+ this . username = appSettings . getString ( USER_KEY ) ;
18
+ console . log ( "LoginService.constructor() username: " + this . username ) ;
19
+ }
20
+
21
+ login ( user : string , password : string ) : Promise < boolean > {
22
+ console . log ( "LoginService.login() username: " + this . username ) ;
23
+ if ( user ) {
24
+ this . username = user ;
25
+ appSettings . setString ( USER_KEY , this . username ) ;
26
+ return Promise . resolve ( true ) ;
27
+ } else {
28
+ return Promise . resolve ( false ) ;
29
+ }
30
+ }
31
+
32
+ logout ( ) : Promise < boolean > {
33
+ console . log ( "LoginService.logout()" ) ;
34
+
35
+ this . username = undefined ;
36
+ appSettings . remove ( USER_KEY ) ;
37
+ return Promise . resolve ( true ) ;
38
+ }
39
+ }
40
+
41
+
42
+ @Component ( {
43
+ selector : 'login' ,
44
+ directives : [ NS_ROUTER_DIRECTIVES ] ,
45
+ styleUrls : [ "examples/router/styles.css" ] ,
46
+ template : `
47
+ <StackLayout>
48
+ <Label text="Login Page" class="title"></Label>
49
+
50
+ <TextField [(ngModel)]="user" hint="user"></TextField>
51
+ <TextField [(ngModel)]="pass" hint="password" secure="true"></TextField>
52
+ <Button text='Login' (tap)="login()" class="stretch"></Button>
53
+ </StackLayout>
54
+ `
55
+ } )
56
+ class LoginComponent {
57
+ public user : string ;
58
+ public pass : string ;
59
+ constructor ( private nav : RouterExtensions , private loginService : LoginService ) {
60
+ }
61
+
62
+ login ( ) {
63
+ this . loginService . login ( this . user , this . pass ) . then ( ( result ) => {
64
+ if ( result ) {
65
+ this . nav . navigate ( [ "/" ] , { clearHistory : true } ) ;
66
+ }
67
+ } ) ;
68
+ }
69
+ }
70
+
71
+ @Component ( {
72
+ selector : 'main' ,
73
+ directives : [ NS_ROUTER_DIRECTIVES ] ,
74
+ styleUrls : [ "examples/router/styles.css" ] ,
75
+ template : `
76
+ <StackLayout>
77
+ <Label text="Main Page" class="title"></Label>
78
+ <Label [text]="'Hello, ' + loginService.username" class="subtitle"></Label>
79
+ <Button text='logout' (tap)="logout()" class="stretch"></Button>
80
+ </StackLayout>
81
+ `
82
+ } )
83
+ class MainComponent {
84
+ constructor ( private nav : RouterExtensions , private loginService : LoginService ) {
85
+ }
86
+
87
+ logout ( ) {
88
+ this . loginService . logout ( ) . then ( ( result ) => {
89
+ if ( result ) {
90
+ this . nav . navigate ( [ "/login" ] , { clearHistory : true } ) ;
91
+ }
92
+ } ) ;
93
+ }
94
+ }
95
+
96
+ @Injectable ( )
97
+ class AuthGuard implements CanActivate {
98
+ constructor (
99
+ private loginService : LoginService ,
100
+ private nav : RouterExtensions ) {
101
+ }
102
+
103
+ canActivate ( ) {
104
+ if ( this . loginService . isLogged ) {
105
+ console . log ( "GUARD: authenticated" ) ;
106
+ return true ;
107
+ }
108
+ else {
109
+ console . log ( "GUARD: redirecting to login" ) ;
110
+ this . nav . navigate ( [ "/login" ] ) ;
111
+ return false ;
112
+ }
113
+ }
114
+ }
115
+
116
+ @Component ( {
117
+ selector : 'navigation-test' ,
118
+ directives : [ NS_ROUTER_DIRECTIVES ] ,
119
+ template : `<page-router-outlet></page-router-outlet>`
120
+ } )
121
+ export class LoginAppComponent { }
122
+
123
+ const routes : RouterConfig = [
124
+ { path : "" , redirectTo : "/main" , terminal : true } ,
125
+ { path : "main" , component : MainComponent , canActivate : [ AuthGuard ] } ,
126
+ { path : "login" , component : LoginComponent } ,
127
+ ] ;
128
+
129
+ export const LoginExampleProviders = [
130
+ LoginService ,
131
+ AuthGuard ,
132
+ nsProvideRouter ( routes , { enableTracing : false } )
133
+ ] ;
0 commit comments