ionic start login blank
cd login
ionic g provider authService
ionic g page register
ionic g page login
Open src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { AuthServiceProvider } from '../providers/auth-service/auth-service';
import { HttpModule } from '@angular/http';
@NgModule({
declarations: [
MyApp,
HomePage
],
imports: [
BrowserModule,
HttpModule,
IonicModule.forRoot(MyApp)
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
HomePage
],
providers: [
StatusBar,
SplashScreen,
{provide: ErrorHandler, useClass: IonicErrorHandler},
AuthServiceProvider
]
})
export class AppModule {}
Open src/app/app.component.ts
import { Component } from '@angular/core';
import { Platform } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { HomePage } from '../pages/home/home';
@Component({
templateUrl: 'app.html'
})
export class MyApp {
rootPage:any = 'LoginPage';
constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {
platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
statusBar.styleDefault();
splashScreen.hide();
});
}
}
Open src/providers/auth-service.ts
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/map';
/*
Generated class for the AuthServiceProvider provider.
See https://angular.io/guide/dependency-injection for more info on providers
and Angular DI.
*/
@Injectable()
export class AuthServiceProvider {
// Change to this http://ed43bb3b.ngrok.io/api/login
static readonly LOGIN_URL = 'http://contoh.dev/api/login';
// Change to this http://ed43bb3b.ngrok.io/api/register
static readonly REGISTER_URL = 'http://contoh.dev/api/register';
access: boolean;
token: string;
constructor(public http: Http) {}
// Login
public login(credentials) {
if (credentials.email === null || credentials.password === null) {
return Observable.throw("Please insert credentials.");
} else {
return Observable.create(observer => {
this.http.post(AuthServiceProvider.LOGIN_URL, credentials)
.map(res => res.json())
.subscribe( data => {
if (data.access_token) {
this.token = 'Bearer ' + data.access_token;
this.access = true;
} else {
this.access = false;
}
});
setTimeout(() => {
observer.next(this.access);
}, 500);
setTimeout(() => {
observer.complete();
}, 1000);
}, err => console.error(err));
}
}
// Register
public register(credentials) {
if (credentials.name === null || credentials.email === null || credentials.password === null) {
return Observable.throw("Please insert credentials");
} else {
return Observable.create(observer => {
this.http.post(AuthServiceProvider.REGISTER_URL, credentials)
.map(res => res.json())
.subscribe( data => {
console.log(data);
});
observer.next(true);
observer.complete();
});
}
}
// Get Token
public getToken() {
return this.token;
}
// Logout
public logout() {
return Observable.create(observer => {
observer.next(true);
observer.complete();
});
}
}
Open src/pages/login/login.ts
import { Component } from '@angular/core';
import { IonicPage, NavController, AlertController, LoadingController, Loading } from 'ionic-angular';
import { AuthServiceProvider } from '../../providers/auth-service/auth-service';
import { HomePage } from '../home/home';
/**
* Generated class for the LoginPage page.
*
* See https://ionicframework.com/docs/components/#navigation for more info on
* Ionic pages and navigation.
*/
@IonicPage()
@Component({
selector: 'page-login',
templateUrl: 'login.html',
})
export class LoginPage {
loading: Loading;
registerCredentials = { email: '', password: '' };
constructor(
public nav: NavController,
private auth: AuthServiceProvider,
private alertCtrl: AlertController,
private loadingCtrl: LoadingController
) {}
public createAccount() {
this.nav.push('RegisterPage');
}
public login() {
this.showLoading()
this.auth.login(this.registerCredentials).subscribe(allowed => {
if (allowed) {
this.nav.setRoot(HomePage);
} else {
this.showError("These credentials do not match our records.");
}
},
error => {
this.showError(error);
});
}
showLoading() {
this.loading = this.loadingCtrl.create({
content: 'Please wait...',
dismissOnPageChange: true
});
this.loading.present();
}
showError(text) {
this.loading.dismiss();
let alert = this.alertCtrl.create({
title: 'Fail',
subTitle: text,
buttons: ['OK']
});
alert.present(prompt);
}
}
Open src/pages/login/login.html
<!--
Generated template for the LoginPage page.
See http://ionicframework.com/docs/components/#navigation for more info on
Ionic pages and navigation.
-->
<ion-header>
<ion-navbar color="primary">
<ion-title>Login</ion-title>
</ion-navbar>
</ion-header>
<ion-content padding>
<form (ngSubmit)="login()" #registerForm="ngForm">
<ion-row>
<ion-col>
<ion-list inset>
<ion-item>
<ion-input type="text" placeholder="Email" name="email" [(ngModel)]="registerCredentials.email" required></ion-input>
</ion-item>
<ion-item>
<ion-input type="password" placeholder="Password" name="password" [(ngModel)]="registerCredentials.password" required></ion-input>
</ion-item>
</ion-list>
</ion-col>
</ion-row>
<ion-row>
<button ion-button class="submit-btn" full type="submit" [disabled]="!registerForm.form.valid">Login</button>
</ion-row>
</form>
<ion-row>
<button ion-button class="register-btn" block clear (click)="createAccount()">Create New Account</button>
</ion-row>
</ion-content>
Open src/pages/register/register.ts
import { Component } from '@angular/core';
import { IonicPage, NavController, AlertController } from 'ionic-angular';
import { AuthServiceProvider } from '../../providers/auth-service/auth-service';
/**
* Generated class for the RegisterPage page.
*
* See https://ionicframework.com/docs/components/#navigation for more info on
* Ionic pages and navigation.
*/
@IonicPage()
@Component({
selector: 'page-register',
templateUrl: 'register.html',
})
export class RegisterPage {
createSuccess = false;
registerCredentials = { name: '', email: '', password: '', confirmation_password: '' };
constructor(
private nav: NavController,
private auth: AuthServiceProvider,
private alertCtrl: AlertController
) {}
public register() {
if (this.registerCredentials.password != this.registerCredentials.confirmation_password) {
this.showPopup("Error", 'The password confirmation does not match.');
} else {
this.auth.register(this.registerCredentials).subscribe(success => {
if (success) {
this.createSuccess = true;
this.showPopup("Success", "Account created.");
} else {
this.showPopup("Error", "Problem creating account.");
}
},
error => {
this.showPopup("Error", error);
});
}
}
showPopup(title, text) {
let alert = this.alertCtrl.create({
title: title,
subTitle: text,
buttons: [
{
text: 'OK',
handler: data => {
if (this.createSuccess) {
this.nav.popToRoot();
}
}
}
]
});
alert.present();
}
}
Open src/pages/register/register.html
<!--
Generated template for the RegisterPage page.
See http://ionicframework.com/docs/components/#navigation for more info on
Ionic pages and navigation.
-->
<ion-header>
<ion-navbar>
<ion-title>register</ion-title>
</ion-navbar>
</ion-header>
<ion-content padding>
<form (ngSubmit)="register()" #registerForm="ngForm">
<ion-row>
<ion-col>
<ion-list inset>
<ion-item>
<ion-input type="text" placeholder="Name" name="name" [(ngModel)]="registerCredentials.name" required></ion-input>
</ion-item>
<ion-item>
<ion-input type="text" placeholder="Email" name="email" [(ngModel)]="registerCredentials.email" required></ion-input>
</ion-item>
<ion-item>
<ion-input type="password" placeholder="Password" name="password" [(ngModel)]="registerCredentials.password" required></ion-input>
</ion-item>
<ion-item>
<ion-input type="password" placeholder="Confirm Password" name="confirmation_password" [(ngModel)]="registerCredentials.confirmation_password" required></ion-input>
</ion-item>
</ion-list>
</ion-col>
</ion-row>
<ion-row>
<ion-col class="signup-col">
<button ion-button class="submit-btn" full type="submit" [disabled]="!registerForm.form.valid">Register</button>
</ion-col>
</ion-row>
</form>
</ion-content>
Open *src/pages/home/home.ts *
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { AuthServiceProvider } from '../../providers/auth-service/auth-service';
import { Http, RequestOptions, Headers } from '@angular/http';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/map';
@Component({
selector: 'page-home',
templateUrl: 'home.html'
})
export class HomePage {
users;
constructor(private nav: NavController, private auth: AuthServiceProvider, public http:Http) {
this.getUsers();
}
public getUsers() {
let headers = new Headers(
{
'Authorization' : this.auth.getToken()
});
let options = new RequestOptions({ headers: headers });
// Change to this http://ed43bb3b.ngrok.io/api/users
let url = 'http://contoh.dev/api/users';
this.http.get(url, options).map(res => res.json()).subscribe(
data => {
this.users = data.data;
}
);
}
public logout() {
this.auth.logout().subscribe(succ => {
this.nav.setRoot('LoginPage')
});
}
}
Open src/pages/home/home.html
<ion-header>
<ion-navbar>
<ion-title>
Member Area
</ion-title>
<ion-buttons end>
<button ion-button (click)="logout()">
<ion-icon name="log-out"></ion-icon>
</button>
</ion-buttons>
</ion-navbar>
</ion-header>
<ion-content>
<ion-list>
<ion-list-header>
Users
</ion-list-header>
<ion-item *ngFor="let user of users">{{ user.name }}</ion-item>
</ion-list>
</ion-content>