Professional Documents
Culture Documents
Mts3072 Development of Mobile Application Project Title: Mycafe
Mts3072 Development of Mobile Application Project Title: Mycafe
Mts3072 Development of Mobile Application Project Title: Mycafe
PROJECT TITLE
MyCafe
LECTURE
PROFESOR MADYA DR. MASHITOH BINTI HASHIM
ADMIN
ADMIN LOGIN
ADMIN MENU
ABOUT
PAGES
REGISTER DATABASE
USER
USER REGISTER
USER HOME PAGE
admin-login.page.html
<ion-header>
<ion-toolbar color="warning">
<ion-title>Admin Login</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-item>
<ion-label position="floating">Email</ion-label>
</ion-item>
<ion-item>
<ion-label position="floating">Password</ion-label>
</ion-item>
<ion-button class="ion-
padding" color="warning" expand="full" (click)="login(user)">Login</ion-
button>
<ion-button
class="ion-padding"
color="light"
expand="full"
[routerLink]="['/login']"
>
</ion-button>
</ion-content>
admin-login.page.ts
@Component({
selector: 'app-admin-login',
templateUrl: './admin-login.page.html',
styleUrls: ['./admin-login.page.scss'],
})
user = {} as User;
posts = {} as Post;
constructor(
) { }
ngOnInit() {
if (this.formValidation()){
//show loader
// eslint-disable-next-line prefer-const
});
(await loader).present();
try{
await this.afAuth
.signInWithEmailAndPassword(user.email,user.password)
.then(data => {
console.log(data);
this.navCtrl.navigateRoot('menu');
});
}catch(e){
this.showToast(e);
//dismiss loader
(await loader).dismiss();
formValidation(){
if (!this.user.email){
this.showToast('Enter email');
return false;
if (!this.user.password){
this.showToast('Enter password');
return false;
return true;
showToast(message: string){
this.toastCtrl
.create({
message,
duration:3000
})
}
admin-home.page.html
<ion-header>
<ion-toolbar color="warning">
<ion-buttons slot="start">
<ion-menu-button></ion-menu-button>
</ion-buttons>
<ion-title>Home (Admin)</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]="false">
<ion-fab-button [routerLink]="['/add-post-admin']">
<ion-icon name="add"></ion-icon>
</ion-fab-button>
</ion-fab>
<ion-list>
<ion-item class="no-padding">
<ion-label>
<img src="/assets/{{i}}.jpg">
<h2>{{post.title}}</h2>
<p>{{post.details}}</p>
</ion-label>
</ion-item>
<ion-item-options side="start">
</ion-item-option>
</ion-item-options>
<ion-item-options side="end">
</ion-item-option>
</ion-item-options>
</ion-item-sliding>
</ion-list>
</ion-content>
admin-home.page.ts
@Component({
selector: 'app-admin-home',
templateUrl: './admin-home.page.html',
styleUrls: ['./admin-home.page.scss'],
})
posts: any;
constructor(
) {}
ionViewWillEnter(){
this.getPosts();
async getPosts(){
//show loader
});
(await loader).present();
try{
this.firestore
.collection('posts')
.snapshotChanges()
.subscribe(data => {
id : e.payload.doc.id,
title : e.payload.doc.data()['title'],
details : e.payload.doc.data()['details']
}));
});
//dismiss loader
(await loader).dismiss();
} catch(e){
this.showToast(e);
//show loader
});
(await loader).present();
//dismiss loader
(await loader).dismiss();
showToast(message: string){
this.toastCtrl
.create({
message,
duration:3000
})
}
}
add-post-admin.page.html
<ion-header>
<ion-toolbar color="warning">
</ion-toolbar>
</ion-header>
<ion-content>
<ion-item>
<ion-label position="floating">Food</ion-label>
</ion-item>
<ion-item>
<ion-label position="floating">Price</ion-label>
</ion-item>
(click)="createPost(post)">Create</ion-button>
<ion-button
class="ion-padding"
color="danger"
expand="full"
[routerLink]="['/admin-home']"
>
Cancel
</ion-button>
</ion-content>
add-post-admin.page.ts
@Component({
selector: 'app-add-post-admin',
templateUrl: './add-post-admin.page.html',
styleUrls: ['./add-post-admin.page.scss'],
})
post = {} as Post;
constructor(
) { }
ngOnInit() {
if (this.formValidation()){
//show loader
});
(await loader).present();
try {
await this.firestore.collection('posts').add(post);
}catch(e){
this.showToast(e);
//dismiss loader
(await loader).dismiss();
this.navCtrl.navigateRoot('admin-home');
if (!this.post.title){
this.showToast('Enter title');
return false;
if (!this.post.details){
this.showToast('Enter Details');
return false;
return true;
showToast(message: string){
this.toastCtrl
.create({
message: message,
duration:3000
})
}
edit-post.page.html
<ion-header>
<ion-toolbar color="warning">
</ion-toolbar>
</ion-header>
<ion-content>
<ion-item>
</ion-item>
<ion-item>
<ion-label position="floating">Price</ion-label>
</ion-item>
<ion-button class="ion-padding"
color="warning"
expand="full"
(click)="updatePost(post)">Update</ion-button>
<ion-button
class="ion-padding"
color="danger"
expand="full"
[routerLink]="['/admin-home']"
>
Cancel
</ion-button>
</ion-content>
edit-post.page.ts
@Component({
selector: 'app-edit-post',
templateUrl: './edit-post.page.html',
styleUrls: ['./edit-post.page.scss'],
})
post = {} as Post;
id: any;
constructor(
) {
this.id = this.actRoute.snapshot.paramMap.get('id');
ngOnInit() {
this.getPostById(this.id);
//show loader
});
(await loader).present();
this.firestore
.doc('posts/' +id)
.valueChanges()
.subscribe(data => {
this.post.title = data['title'];
this.post.details = data['details'];
});
//dismiss loader
(await loader).dismiss();
// this.navCtrl.navigateRoot("home");
if (this.formValidation()){
//show loader
});
(await loader).present();
try {
}catch(e){
this.showToast(e);
//dismiss loader
(await loader).dismiss();
this.navCtrl.navigateRoot('admin-home');
}
formValidation(){
if (!this.post.title){
this.showToast('Enter title');
return false;
if (!this.post.details){
this.showToast('Enter Details');
return false;
return true;
showToast(message: string){
this.toastCtrl
.create({
message: message,
duration:3000
})
}
login.page.html
<ion-header><h5>MyCafe</h5></ion-header>
<ion-toolbar color="primary">
<ion-title>Login</ion-title>
</ion-toolbar>
<ion-content>
<ion-item>
<ion-label position="floating">Email</ion-label>
</ion-item>
<ion-item>
<ion-label position="floating">Password</ion-label>
</ion-item>
<ion-button class="ion-
padding" color="primary" expand="full" (click)="login(user)">Login</ion-
button>
<ion-button
class="ion-padding"
color="light"
expand="full"
[routerLink]="['/register']"
>
Register
</ion-button>
<ion-button
class="ion-padding"
color="light"
expand="full"
[routerLink]="['/admin-login']"
>
</ion-button>
</ion-content>
login.page.ts
@Component({
selector: 'app-login',
templateUrl: './login.page.html',
styleUrls: ['./login.page.scss'],
})
user = {} as User;
constructor(
) { }
ngOnInit() {
if (this.formValidation()){
//show loader
});
(await loader).present();
try{
await this.afAuth
.signInWithEmailAndPassword(user.email,user.password)
.then(data => {
console.log(data);
this.navCtrl.navigateRoot('home');
});
}catch(e){
this.showToast(e);
//dismiss loader
(await loader).dismiss();
formValidation(){
if (!this.user.email){
this.showToast('Enter email');
return false;
if (!this.user.password){
this.showToast('Enter password');
return false;
return true;
showToast(message: string){
this.toastCtrl
.create({
message,
duration:3000
})
login.page.scss
h5 {
font-size: 100px;
text-align: center;
}
home.page.html
<ion-header>
<ion-toolbar color="success">
<ion-buttons slot="start">
<ion-menu-button></ion-menu-button>
</ion-buttons>
<ion-title>Home</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]="true">
<ion-fab-list side="top">
<ion-fab-button href="/about">
<ion-icon name="information-circle-outline"></ion-icon>
</ion-fab-button>
<ion-fab-button href='/login'>
</ion-fab-button>
</ion-fab-list>
</ion-fab>
<ion-list lines="none">
<ion-item class="no-padding">
<ion-label>
<img src="/assets/{{i}}.jpg">
<h2>{{post.title}}</h2>
<p>{{post.details}}</p>
<ion-button color="success" [routerLink]="['/add-post']">BUY</ion-
button>
</ion-label>
</ion-item>
</ion-item-sliding>
</ion-list>
</ion-content>
home.page.ts
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
posts: any;
constructor(
) {}
ionViewWillEnter(){
this.getPosts();
async getPosts(){
//show loader
});
(await loader).present();
try{
this.firestore
.collection('posts')
.snapshotChanges()
.subscribe(data => {
id : e.payload.doc.id,
title : e.payload.doc.data()['title'],
details : e.payload.doc.data()['details']
}));
});
//dismiss loader
(await loader).dismiss();
} catch(e){
this.showToast(e);
//show loader
});
(await loader).present();
//dismiss loader
(await loader).dismiss();
showToast(message: string){
this.toastCtrl
.create({
message,
duration:3000
})
}
home.page.scss
#container {
text-align: center;
position: absolute;
left: 0;
right: 0;
top: 50%;
transform: translateY(-50%);
#container strong {
font-size: 20px;
line-height: 26px;
#container p {
font-size: 16px;
line-height: 22px;
color: #8c8c8c;
margin: 0;
#container a {
text-decoration: none;
ion-item-sliding{
}
add-post.page.html
<ion-header>
<ion-toolbar color="primary">
</ion-toolbar>
</ion-header>
<ion-content>
<ion-item>
</ion-item>
<ion-item>
<ion-label position="floating">Quantity</ion-label>
</ion-item>
<ion-item>
</ion-item>
<ion-button class="ion-
padding" color="primary" expand="full" (click)="createPost(order)" (click)="pr
esentAlert()">Create</ion-button>
<ion-button class="ion-
padding" color="danger" expand="full" href="/home">Cancel</ion-button>
</ion-content>
add-post.page.ts
@Component({
selector: 'app-add-post',
templateUrl: './add-post.page.html',
styleUrls: ['./add-post.page.scss'],
})
order = {} as Order;
constructor(
) { }
ngOnInit() {
async presentAlert() {
cssClass: 'my-custom-class',
header: 'Congrats!',
buttons: ['OK']
});
await alert.present();
if (this.formValidation()){
//show loader
});
(await loader).present();
try {
await this.firestore.collection('order').add(order);
}catch(e){
this.showToast(e);
//dismiss loader
(await loader).dismiss();
this.navCtrl.navigateRoot('home');
formValidation(){
if (!this.order.foodName){
return false;
if (!this.order.quantity){
this.showToast('Enter Quantity!');
return false;
}
if (!this.order.name){
return false;
return true;
showToast(message: string){
this.toastCtrl
.create({
message: message,
duration:3000
})
}
Create folder ‘models’ inside your directory and create this three (3) files inside:
order.mode.ts
foodName: string;
quantity: string;
name: string;
post.mode.ts
title: string;
details: string;
user.mode.ts
email: string;
password: string;
}
Inside folder ‘pages’ there should be another folder call ‘menu’
menu.page.html
<ion-menu contentId="content">
<ion-header>
<ion-toolbar color="warning">
<ion-title>Menu</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-menu-toggle *ngIf="p.url">
<ion-
item [routerLink]="p.url" routerDirection ="root" routerLinkActive="active">
<ion-label>{{p.title}}</ion-label>
</ion-item>
</ion-menu-toggle>
<ion-
item button *ngIf ="p.children?.length >0" (click)="p.open = !p.open" [class.a
ctive-parent] = "p.open" detail="false">
<ion-label>{{p.title}}</ion-label>
</ion-item>
<ion-menu-toggle>
<ion-item class="sub-
item" *ngFor="let sub of p.children" [routerLink]="sub.url" routerDirection ="
root" routerLinkActive="active">
<ion-label>{{sub.title}}</ion-label>
</ion-item>
</ion-menu-toggle>
</ion-list>
</div>
</ion-content>
</ion-menu>
</ion-router-outlet>
menu.page.ts
@Component({
selector: 'app-menu',
templateUrl: './menu.page.html',
styleUrls: ['./menu.page.scss'],
})
pages = [
{
title: 'Main',
url:'/menu/',
icon:'Person'
},
title:'Option',
children: [
url:'/menu/order',
icon:'list-outline'
},
title: 'About',
url:'/menu/about',
icon:'person'
},
title: 'Logout',
url:'/login',
icon:'log-out-outline'
},
];
constructor() { }
ngOnInit() {
}
menu.page.scss
.active{
--ion-text-color: var(--ion-color-primary);
ion-icon{
--ion-text-color-rgb: var(--ion-color-primary);
.active-parent {
font-weight: 500;
.sub-item {
padding-left: 20px;
font-size: small,
}
register.page.html
<ion-header>
<ion-toolbar color="primary">
<ion-title>Register</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-item>
<ion-label position="floating">Email</ion-label>
</ion-item>
<ion-item>
<ion-label position="floating">Password</ion-label>
</ion-item>
<ion-button class="ion-
padding" color="primary" expand="full" (click)="register(user)">Register</ion-
button>
<ion-button
class="ion-padding"
color="danger"
expand="full"
[routerLink]="['/login']"
>
Cancel
</ion-button>
</ion-content>
register.page.ts
@Component({
selector: 'app-register',
templateUrl: './register.page.html',
styleUrls: ['./register.page.scss'],
})
user = {} as User;
constructor(
) { }
ngOnInit() {
if(this.formValidation()){
//show loader
});
(await loader).present();
try{
await this.afAuth.createUserWithEmailAndPassword(user.email,user.passw
ord).then(data => {
console.log(data);
this.navCtrl.navigateRoot('login');
});
catch(e){
this.showToast(e);
//dismiss loader
(await loader).dismiss();
formValidation(){
if(!this.user.email){
this.showToast('Enter email');
return false;
if(!this.user.password){
this.showToast('Enter password');
return false;
return false;
showToast(message: string){
this.toastCtrl.create({
message,
duration: 3000
}
app-routing.module.ts
path: '',
redirectTo: 'login',
pathMatch: 'full'
},
path: 'home',
},
path: 'login',
},
path: 'register',
},
path: 'add-post',
},
path: 'edit-post/:id',
loadChildren: () => import('./edit-post/edit-
post.module').then( m => m.EditPostPageModule)
},
path: 'admin-login',
},
path: 'admin-home',
},
path: 'order',
},
path: 'add-post-admin',
},
path: 'about',
},
path: 'pages',
},
{
path: 'menu',
];
@NgModule({
imports: [
],
exports: [RouterModule]
})
@NgModule({
declarations: [AppComponent],
entryComponents: [],
AngularFireModule.initializeApp(environment.FIREBASE_CONFIG),
AngularFireAuthModule, AngularFirestoreModule],
bootstrap: [AppComponent],
})
production: false,
// eslint-disable-next-line @typescript-eslint/naming-convention
FIREBASE_CONFIG:{
apiKey: 'YOUR_API_KEY',
authDomain: 'DOMAIN_NAME',
databaseURL: 'DATABASE',
projectId: 'PROJECT_ID,
storageBucket: 'STORAGE',
messagingSenderId: 'MESSAGING_SENDER_ID',
appId: 'APP_ID',
measurementId: 'MEASUREMENT_ID'
};