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