@@ -0,0 +1,17 @@ | |||||
import { NgModule } from '@angular/core'; | |||||
import { Routes, RouterModule } from '@angular/router'; | |||||
import { AddPartyPage } from './add-party.page'; | |||||
const routes: Routes = [ | |||||
{ | |||||
path: '', | |||||
component: AddPartyPage | |||||
} | |||||
]; | |||||
@NgModule({ | |||||
imports: [RouterModule.forChild(routes)], | |||||
exports: [RouterModule], | |||||
}) | |||||
export class AddPartyPageRoutingModule {} |
@@ -0,0 +1,20 @@ | |||||
import { NgModule } from '@angular/core'; | |||||
import { CommonModule } from '@angular/common'; | |||||
import { FormsModule } from '@angular/forms'; | |||||
import { IonicModule } from '@ionic/angular'; | |||||
import { AddPartyPageRoutingModule } from './add-party-routing.module'; | |||||
import { AddPartyPage } from './add-party.page'; | |||||
@NgModule({ | |||||
imports: [ | |||||
CommonModule, | |||||
FormsModule, | |||||
IonicModule, | |||||
AddPartyPageRoutingModule | |||||
], | |||||
declarations: [AddPartyPage] | |||||
}) | |||||
export class AddPartyPageModule {} |
@@ -0,0 +1,39 @@ | |||||
<ion-content> | |||||
<section class="action-buttons"> | |||||
<div class="nav"> | |||||
<button (click)="back()"> | |||||
<ion-icon name="chevron-back-outline"></ion-icon> <span> BACK </span> | |||||
</button> | |||||
</div> | |||||
<header> | |||||
Create Party <br> | |||||
<span> Send invitation to contacts </span> <br> | |||||
<span> {{ selectedContacts.length }} contact(s) selected </span> | |||||
</header> | |||||
</section> | |||||
<ion-searchbar showCancelButton="never" mode="ios" | |||||
[(ngModel)]="searchInput" (ionChange)="searchContact()" | |||||
placeholder="Search by name or number"></ion-searchbar> | |||||
<ion-list mode="ios"> | |||||
<ion-item *ngFor="let contact of contactList"> | |||||
<ion-label> | |||||
<h2> {{ contact.name }} </h2> | |||||
<p> {{ contact.phone }} </p> | |||||
</ion-label> | |||||
<ion-button slot="end" fill="outline" [ngClass]="{'active' : selectedContacts.includes(contact.phone) }" | |||||
(click)="selectContact(contact.phone)"> | |||||
<ion-icon name="add"></ion-icon> | |||||
<ion-icon name="checkmark"></ion-icon> | |||||
</ion-button> | |||||
</ion-item> | |||||
</ion-list> | |||||
<ion-button size="block" class="confirm-button" (click)="createParty()" *ngIf="selectedContacts.length > 0"> | |||||
Create Party | |||||
</ion-button> | |||||
</ion-content> |
@@ -0,0 +1,124 @@ | |||||
$dark-blue: #161e2d; | |||||
$blue-grey: #949599; | |||||
$green: #01b868; | |||||
$pink: #d73e53; | |||||
$dark-blue-shade1: #24367c; | |||||
$dark-blue-shade2: #263982; | |||||
ion-content { | |||||
--background: white; | |||||
} | |||||
.action-buttons { | |||||
display: flex; | |||||
justify-content: space-between; | |||||
align-items: flex-start; | |||||
padding: 0 3% 0 0%; | |||||
height: 70px; | |||||
position: sticky; | |||||
left: 0; | |||||
top: 0; | |||||
background-color: lighten($blue-grey, 35%); | |||||
z-index: 2; | |||||
width: 100%; | |||||
align-items: center; | |||||
box-shadow: 0px 0px 5px $dark-blue; | |||||
button { | |||||
background-color: transparent; | |||||
border: none; | |||||
} | |||||
.nav button { | |||||
color: $blue-grey; | |||||
display: flex; | |||||
align-items: center; | |||||
ion-icon { | |||||
font-size: 24px; | |||||
} | |||||
span { | |||||
margin-left: 5px; | |||||
font-size: 0.9rem; | |||||
font-size: 14px; | |||||
} | |||||
} | |||||
header { | |||||
flex-grow: 1; | |||||
padding: 0 10px; | |||||
font-size: 16px; | |||||
color: darken($blue-grey, 30%); | |||||
font-weight: 500; | |||||
text-align: left; | |||||
white-space: nowrap; | |||||
overflow: hidden; | |||||
text-overflow: ellipsis; | |||||
span { | |||||
font-weight: 500; | |||||
color: $blue-grey; | |||||
font-size: 12px; | |||||
} | |||||
} | |||||
} | |||||
ion-searchbar { | |||||
margin: 10px 0; | |||||
} | |||||
ion-list { | |||||
margin-bottom: 60px; | |||||
ion-item { | |||||
--padding-start: 5%; | |||||
--padding-end: 5%; | |||||
} | |||||
ion-button { | |||||
margin: 0; | |||||
--border-width: 2px; | |||||
--border-radius: 5px; | |||||
width: 40px; | |||||
height: 40px; | |||||
transform: scale(0.9); | |||||
&.active { | |||||
--background: #01b868; | |||||
--color: white; | |||||
--border-color: #00ad62; | |||||
ion-icon { | |||||
font-size: 30px; | |||||
&:nth-child(2) { | |||||
display: block; | |||||
} | |||||
&:nth-child(1) { | |||||
display: none; | |||||
} | |||||
} | |||||
} | |||||
ion-icon { | |||||
font-size: 20px; | |||||
&:nth-child(2) { | |||||
display: none; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
.confirm-button { | |||||
position: fixed; | |||||
bottom: 0; | |||||
left: 0; | |||||
--color: white; | |||||
margin: 0; | |||||
width: 100%; | |||||
height: 50px; | |||||
--background: #01b868; | |||||
} |
@@ -0,0 +1,24 @@ | |||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||||
import { IonicModule } from '@ionic/angular'; | |||||
import { AddPartyPage } from './add-party.page'; | |||||
describe('AddPartyPage', () => { | |||||
let component: AddPartyPage; | |||||
let fixture: ComponentFixture<AddPartyPage>; | |||||
beforeEach(async(() => { | |||||
TestBed.configureTestingModule({ | |||||
declarations: [ AddPartyPage ], | |||||
imports: [IonicModule.forRoot()] | |||||
}).compileComponents(); | |||||
fixture = TestBed.createComponent(AddPartyPage); | |||||
component = fixture.componentInstance; | |||||
fixture.detectChanges(); | |||||
})); | |||||
it('should create', () => { | |||||
expect(component).toBeTruthy(); | |||||
}); | |||||
}); |
@@ -0,0 +1,70 @@ | |||||
import { Component, OnInit } from '@angular/core'; | |||||
import * as faker from 'faker'; | |||||
import { ModalController } from '@ionic/angular'; | |||||
@Component({ | |||||
selector: 'app-add-party', | |||||
templateUrl: './add-party.page.html', | |||||
styleUrls: ['./add-party.page.scss'], | |||||
}) | |||||
export class AddPartyPage implements OnInit { | |||||
contactList: Array<{ | |||||
name: string, | |||||
phone: string | |||||
}> = []; | |||||
tempContactList: Array<{ | |||||
name: string, | |||||
phone: string | |||||
}> = []; | |||||
searchInput: string = ''; | |||||
selectedContacts: Array<string> = []; | |||||
constructor( | |||||
private modalController: ModalController | |||||
) { } | |||||
back() { | |||||
this.modalController.dismiss({ | |||||
createParty: false | |||||
}); | |||||
} | |||||
createParty() { | |||||
this.modalController.dismiss({ | |||||
createParty: true | |||||
}); | |||||
} | |||||
ngOnInit() { | |||||
for (let i = 0; i < 12; i += 1) { | |||||
this.contactList.push({ | |||||
name: faker.name.findName(), | |||||
phone: faker.phone.phoneNumber() | |||||
}); | |||||
} | |||||
this.tempContactList = JSON.parse(JSON.stringify(this.contactList)); | |||||
} | |||||
searchContact() { | |||||
this.contactList = this.tempContactList.filter((contact) => { | |||||
return contact.phone.toString().toLowerCase().includes(this.searchInput.toLowerCase().trim()) || | |||||
contact.name.toString().toLowerCase().includes(this.searchInput.toLowerCase().trim()); | |||||
}); | |||||
} | |||||
selectContact(phone: string) { | |||||
if (this.selectedContacts.includes(phone)) { | |||||
this.selectedContacts.splice(this.selectedContacts.indexOf(phone), 1); | |||||
} else { | |||||
this.selectedContacts.push(phone); | |||||
} | |||||
} | |||||
} |
@@ -45,6 +45,10 @@ const routes: Routes = [ | |||||
{ | { | ||||
path: 'collections', | path: 'collections', | ||||
loadChildren: () => import('./collections/collections.module').then( m => m.CollectionsPageModule) | loadChildren: () => import('./collections/collections.module').then( m => m.CollectionsPageModule) | ||||
}, | |||||
{ | |||||
path: 'add-party', | |||||
loadChildren: () => import('./add-party/add-party.module').then( m => m.AddPartyPageModule) | |||||
} | } | ||||
]; | ]; | ||||
@NgModule({ | @NgModule({ | ||||
@@ -22,6 +22,9 @@ export class AppComponent { | |||||
this.platform.ready().then(() => { | this.platform.ready().then(() => { | ||||
this.statusBar.styleDefault(); | this.statusBar.styleDefault(); | ||||
this.splashScreen.hide(); | this.splashScreen.hide(); | ||||
localStorage.isPartyChatOn = 'no'; | |||||
}); | }); | ||||
} | } | ||||
} | } |
@@ -5,7 +5,7 @@ | |||||
</div> | </div> | ||||
<div class="action"> | <div class="action"> | ||||
<button class="toggle" (click)="isPollChecked = !isPollChecked"> <ion-checkbox [(ngModel)]="isPollChecked"></ion-checkbox> Poll </button> | <button class="toggle" (click)="isPollChecked = !isPollChecked"> <ion-checkbox [(ngModel)]="isPollChecked"></ion-checkbox> Poll </button> | ||||
<button> <ion-icon name="link-outline"></ion-icon> </button> | |||||
<button (click)="copyLink()"> <ion-icon name="link-outline"></ion-icon> </button> | |||||
</div> | </div> | ||||
</section> | </section> | ||||
@@ -1,6 +1,8 @@ | |||||
import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||
import { ModalController } from '@ionic/angular'; | import { ModalController } from '@ionic/angular'; | ||||
import * as faker from 'faker'; | import * as faker from 'faker'; | ||||
import { ToastController } from '@ionic/angular'; | |||||
type IMember = { | type IMember = { | ||||
name: string, | name: string, | ||||
@@ -41,13 +43,30 @@ export class ChatPage implements OnInit { | |||||
myAccount: IMember; | myAccount: IMember; | ||||
constructor( | constructor( | ||||
private modalController: ModalController | |||||
private modalController: ModalController, | |||||
public toastController: ToastController | |||||
) { } | ) { } | ||||
back() { | back() { | ||||
this.modalController.dismiss(); | this.modalController.dismiss(); | ||||
} | } | ||||
async copyLink() { | |||||
const toast = await this.toastController.create({ | |||||
message: 'Copied invitation link!', | |||||
color: 'medium', | |||||
mode: 'md', | |||||
duration: 100000, | |||||
position: 'top', | |||||
buttons: [{ | |||||
text: 'Ok', | |||||
role: 'cancel', | |||||
}], | |||||
}); | |||||
toast.present(); | |||||
} | |||||
ngOnInit() { | ngOnInit() { | ||||
let myAccountIndex = Math.floor(Math.random() * 11); | let myAccountIndex = Math.floor(Math.random() * 11); | ||||
@@ -132,7 +151,7 @@ export class ChatPage implements OnInit { | |||||
setTimeout(() => { | setTimeout(() => { | ||||
this.scrollToEnd(); | this.scrollToEnd(); | ||||
}, 300); | |||||
}, 1000); | |||||
}, 200); | }, 200); | ||||
@@ -175,7 +194,6 @@ export class ChatPage implements OnInit { | |||||
this.scrollToEnd(); | this.scrollToEnd(); | ||||
this.myMessage = ''; | this.myMessage = ''; | ||||
}, 100); | |||||
}, 1000); | |||||
} | } | ||||
} | } |
@@ -131,10 +131,16 @@ | |||||
</div> | </div> | ||||
<ion-fab vertical="bottom" horizontal="end" slot="fixed"> | |||||
<ion-fab vertical="bottom" horizontal="end" slot="fixed" *ngIf="!showAddParty"> | |||||
<ion-fab-button class="chat-button" (click)="presentChatModal()"> | <ion-fab-button class="chat-button" (click)="presentChatModal()"> | ||||
<ion-icon name="chatbubble-ellipses-outline"></ion-icon> | <ion-icon name="chatbubble-ellipses-outline"></ion-icon> | ||||
</ion-fab-button> | </ion-fab-button> | ||||
</ion-fab> | </ion-fab> | ||||
<ion-fab vertical="bottom" horizontal="end" slot="fixed" *ngIf="showAddParty"> | |||||
<ion-fab-button class="chat-button" (click)="presentAddChatModal()"> | |||||
<ion-icon name="add-outline"></ion-icon> | |||||
</ion-fab-button> | |||||
</ion-fab> | |||||
</ion-content> | </ion-content> |
@@ -4,6 +4,7 @@ import * as moment from 'moment'; | |||||
import { ChatPage } from '../chat/chat.page'; | import { ChatPage } from '../chat/chat.page'; | ||||
import * as faker from 'faker'; | import * as faker from 'faker'; | ||||
import { Router } from '@angular/router'; | import { Router } from '@angular/router'; | ||||
import { AddPartyPage } from '../add-party/add-party.page'; | |||||
export type IscoreCard = { | export type IscoreCard = { | ||||
teamName: string, | teamName: string, | ||||
@@ -110,6 +111,8 @@ export class LivePage implements OnInit { | |||||
}> | }> | ||||
}> = []; | }> = []; | ||||
showAddParty: boolean = false; | |||||
constructor( | constructor( | ||||
public modalController: ModalController, | public modalController: ModalController, | ||||
private router: Router | private router: Router | ||||
@@ -272,16 +275,35 @@ export class LivePage implements OnInit { | |||||
totalWickets: 1, | totalWickets: 1, | ||||
} | } | ||||
} | } | ||||
if (localStorage.isPartyChatOn = 'no') { | |||||
this.showAddParty = true; | |||||
} | |||||
} | } | ||||
async presentChatModal() { | async presentChatModal() { | ||||
const modal = await this.modalController.create({ | const modal = await this.modalController.create({ | ||||
component: ChatPage, | component: ChatPage, | ||||
cssClass: 'my-custom-class' | |||||
}); | }); | ||||
return await modal.present(); | return await modal.present(); | ||||
} | } | ||||
async presentAddChatModal() { | |||||
const modal = await this.modalController.create({ | |||||
component: AddPartyPage, | |||||
}); | |||||
modal.onDidDismiss().then((data) => { | |||||
if(data.data.createParty) { | |||||
this.showAddParty = false; | |||||
} | |||||
}); | |||||
return await modal.present(); | |||||
} | |||||
showBookingDetails(matchData) { | showBookingDetails(matchData) { | ||||
this.router.navigate(['/booking-details' , { matchData: JSON.stringify(matchData) }]); | this.router.navigate(['/booking-details' , { matchData: JSON.stringify(matchData) }]); | ||||
} | } | ||||