@@ -1,9 +1,59 @@ | |||||
<ion-header> | |||||
<ion-toolbar> | |||||
<ion-title>chat</ion-title> | |||||
</ion-toolbar> | |||||
</ion-header> | |||||
<ion-content> | <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> | |||||
<div class="action"> | |||||
<button class="toggle" (click)="isPollChecked = !isPollChecked"> <ion-checkbox [(ngModel)]="isPollChecked"></ion-checkbox> Poll </button> | |||||
<button> <ion-icon name="link-outline"></ion-icon> </button> | |||||
</div> | |||||
</section> | |||||
<section class="chat"> | |||||
<section class="chat-per-over" *ngFor="let overChat of chatData"> | |||||
<header class="over-heading"> <h5> Over {{ overChat.over }} </h5> </header> | |||||
<section class="question-card" *ngIf="isPollChecked"> | |||||
<header class="question"> | |||||
{{ overChat.triviaQuestion.question }} | |||||
</header> | |||||
<ul class="options" [ngClass]="{'show-votes' : overChat.triviaQuestion.selectedAnswer !== null }"> | |||||
<li *ngFor="let option of overChat.triviaQuestion.options; let i = index" | |||||
[ngClass]="{'active' : overChat.triviaQuestion.selectedAnswer === i }" | |||||
(click)="overChat.triviaQuestion.selectedAnswer = i"> | |||||
<span class="progress" | |||||
[ngStyle]="{ 'width.%' : (overChat.triviaQuestion.selectedAnswer !== null ? ((option.pollUserCount * 100) / overChat.triviaQuestion.maxUserCount) : 0 ) }"></span> | |||||
<label> {{ option.text }} </label> | |||||
<p> {{ option.pollUserCount }} votes </p> | |||||
</li> | |||||
</ul> | |||||
</section> | |||||
<section class="chat-per-ball" *ngFor="let ballChats of overChat.ballChat;"> | |||||
<header class="ball-heading"> Ball {{ ballChats.ball }} </header> | |||||
<ul> | |||||
<li *ngFor="let chat of ballChats.chat" [ngClass]="{'sender': chat.user && chat.user.name === 'You'}"> | |||||
<div class="user-data" *ngIf="chat.user"> | |||||
<img [src]="chat.user.image"> | |||||
<label [ngStyle]="{'color' : chat.user.color }"> {{ chat.user.name }} </label> | |||||
</div> | |||||
<div class="user-data" *ngIf="!chat.user"> | |||||
<img src="assets/home-team/KXIP.svg"> | |||||
<label> A KXIP Fan </label> | |||||
</div> | |||||
<p> {{ chat.text }} </p> | |||||
</li> | |||||
</ul> | |||||
</section> | |||||
</section> | |||||
</section> | |||||
</ion-content> | </ion-content> |
@@ -0,0 +1,285 @@ | |||||
$dark-blue: #161e2d; | |||||
$blue-grey: #949599; | |||||
$green: #01b868; | |||||
$pink: #d73e53; | |||||
$dark-blue-shade1: #24367c; | |||||
$dark-blue-shade2: #263982; | |||||
ion-content { | |||||
--background: transparent; | |||||
background-color: $dark-blue; | |||||
} | |||||
.action-buttons { | |||||
display: flex; | |||||
justify-content: space-between; | |||||
align-items: center; | |||||
padding: 15px 5% 15px 10px; | |||||
position: fixed; | |||||
top: 0; | |||||
left: 0; | |||||
width: 100%; | |||||
z-index: 1; | |||||
background-color: #161e2d; | |||||
box-shadow: 0px 0px 5px black; | |||||
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; | |||||
} | |||||
} | |||||
.action { | |||||
display: flex; | |||||
} | |||||
.action button { | |||||
width: 35px; | |||||
height: 35px; | |||||
border: 1px solid $blue-grey; | |||||
background-color: rgba($blue-grey, 0.1); | |||||
border-radius: 50%; | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: center; | |||||
margin-left: 15px; | |||||
ion-icon { | |||||
color: $blue-grey; | |||||
font-size: 17px; | |||||
} | |||||
&.toggle { | |||||
width: auto; | |||||
padding: 0 10px; | |||||
border-radius: 7px; | |||||
color: $blue-grey; | |||||
font-weight: 500; | |||||
letter-spacing: 0.5px; | |||||
ion-checkbox { | |||||
pointer-events: none; | |||||
margin: 0; | |||||
margin-right: 10px; | |||||
--border-color: #949599a6; | |||||
--border-color-checked: #d73e53; | |||||
--background: #94959970; | |||||
--background-checked: #d73e53; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
.chat { | |||||
margin-top: 65px; | |||||
padding: 10px 5%; | |||||
height: calc(100vh - 65px); | |||||
color: white; | |||||
} | |||||
.chat-per-over { | |||||
margin: 20px 0; | |||||
.over-heading { | |||||
width: 100%; | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: center; | |||||
position: relative; | |||||
&::before { | |||||
content: ''; | |||||
position: absolute; | |||||
left: 0; | |||||
top: calc(50% - 2px); | |||||
height: 4px; | |||||
background-color: $blue-grey; | |||||
width: 100%; | |||||
} | |||||
h5 { | |||||
position: relative; | |||||
background-color: $dark-blue; | |||||
padding: 0 10px; | |||||
margin: 0; | |||||
font-size: 1.2rem; | |||||
color: $blue-grey; | |||||
font-weight: 500; | |||||
letter-spacing: 1px; | |||||
} | |||||
} | |||||
} | |||||
.chat-per-ball { | |||||
margin: 20px 0px 70px 0px; | |||||
.ball-heading { | |||||
font-size: 0.9rem; | |||||
color: $blue-grey; | |||||
font-weight: 500; | |||||
letter-spacing: 1px; | |||||
text-align: center; | |||||
} | |||||
ul { | |||||
list-style: none; | |||||
padding: 0 10px; | |||||
margin: 0; | |||||
} | |||||
li { | |||||
background-color: lighten($dark-blue, 10%); | |||||
color: white; | |||||
max-width: 80%; | |||||
display: block; | |||||
border-radius: 15px; | |||||
padding: 10px; | |||||
margin: 25px auto 25px 0px; | |||||
box-shadow: -2px 2px 10px -2px black; | |||||
&.sender { | |||||
margin: 25px 0px 25px auto; | |||||
box-shadow: 2px 2px 10px -2px black; | |||||
.user-data { | |||||
flex-direction: row-reverse; | |||||
} | |||||
} | |||||
p { | |||||
margin: 0px; | |||||
font-size: 0.9rem; | |||||
color: white; | |||||
line-height: 1.5; | |||||
padding: 0 5px; | |||||
} | |||||
} | |||||
.user-data { | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: flex-start; | |||||
width: 100%; | |||||
border-bottom: 2px solid rgba($blue-grey, 0.3); | |||||
padding-bottom: 10px; | |||||
margin-bottom: 10px; | |||||
img { | |||||
width: 30px; | |||||
height: 30px; | |||||
padding: 2px; | |||||
object-fit: contain; | |||||
border-radius: 50%; | |||||
border: 1px solid $blue-grey; | |||||
background-color: rgba($blue-grey, 0.3); | |||||
} | |||||
label { | |||||
font-size: 0.9rem; | |||||
color: $blue-grey; | |||||
font-weight: 500; | |||||
letter-spacing: 1px; | |||||
margin: 0px 10px; | |||||
} | |||||
} | |||||
} | |||||
.question-card { | |||||
background-color: white; | |||||
padding: 10px; | |||||
border-radius: 10px; | |||||
box-shadow: 0px 0px 10px -2px black; | |||||
margin: 40px 0; | |||||
overflow: hidden; | |||||
background-color: rgba($blue-grey, 0.3); | |||||
header { | |||||
font-size: 1.5rem; | |||||
line-height: 1.5; | |||||
color: $dark-blue; | |||||
border-bottom: 2px solid rgba(white, 0.5); | |||||
padding: 5px 5px 15px 5px; | |||||
color: white; | |||||
margin-bottom: 10px; | |||||
} | |||||
.options { | |||||
list-style: none; | |||||
padding: 0; | |||||
margin: 0; | |||||
&.show-votes { | |||||
p { | |||||
display: block; | |||||
} | |||||
} | |||||
li { | |||||
background-color: rgba(white, 0.1); | |||||
border-radius: 7px; | |||||
overflow: hidden; | |||||
padding: 0px 15px; | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: space-between; | |||||
height: 50px; | |||||
margin: 20px 0; | |||||
position: relative; | |||||
.progress { | |||||
position: absolute; | |||||
left: 0; | |||||
top: 0; | |||||
height: 100%; | |||||
width: 0%; | |||||
background-color: $dark-blue; | |||||
pointer-events: none; | |||||
transition: transform 0.3s, width 0.3s, background-color 0.3s; | |||||
border-radius: 10px; | |||||
} | |||||
&.active { | |||||
.progress { | |||||
background-color: $pink; | |||||
} | |||||
} | |||||
label { | |||||
font-weight: 500; | |||||
font-size: 1.1rem; | |||||
position: relative; | |||||
} | |||||
&:last-child { | |||||
margin: 20px 0px 10px 0px; | |||||
} | |||||
} | |||||
p { | |||||
margin: 0; | |||||
display: none; | |||||
font-size: 0.9rem; | |||||
font-style: italic; | |||||
font-weight: 500; | |||||
position: relative; | |||||
} | |||||
} | |||||
} |
@@ -1,15 +1,101 @@ | |||||
import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||
import * as faker from 'faker'; | |||||
import * as moment from 'moment'; | |||||
type IMember = { | |||||
name: string, | |||||
image: string, | |||||
color: string, | |||||
} | |||||
@Component({ | @Component({ | ||||
selector: 'app-chat', | |||||
templateUrl: './chat.page.html', | |||||
styleUrls: ['./chat.page.scss'], | |||||
selector: 'app-chat', | |||||
templateUrl: './chat.page.html', | |||||
styleUrls: ['./chat.page.scss'], | |||||
}) | }) | ||||
export class ChatPage implements OnInit { | export class ChatPage implements OnInit { | ||||
isPollChecked: boolean = true; | |||||
chatData: Array<{ | |||||
over: number, | |||||
ballChat: Array<{ | |||||
ball: number, | |||||
chat: Array<{ | |||||
user: IMember, | |||||
text: string, | |||||
}>, | |||||
}>, | |||||
triviaQuestion: { | |||||
question: string, | |||||
selectedAnswer: number, | |||||
maxUserCount: number, | |||||
options: Array<{ | |||||
text: string, | |||||
pollUserCount: string, | |||||
}>, | |||||
} | |||||
}> = []; | |||||
members: Array<IMember> = []; | |||||
constructor() { } | |||||
ngOnInit() { | |||||
let myAccountIndex = Math.floor(Math.random() * 11); | |||||
for (let i = 0; i < 12; i += 1) { | |||||
this.members.push({ | |||||
name: myAccountIndex === i ? 'You' : faker.name.findName(), | |||||
image: 'assets/home-team/roster/' + (i + 1) + '.png', | |||||
color: faker.vehicle.color() | |||||
}); | |||||
} | |||||
for (let i = 0; i < 5; i += 1) { | |||||
let options = []; | |||||
for (let j = 0; j < 4; j += 1) { | |||||
options.push({ | |||||
text: faker.lorem.word(), | |||||
pollUserCount: faker.random.number() | |||||
}); | |||||
} | |||||
let ballChat = []; | |||||
for (let balls = 0; balls < 6; balls += 1) { | |||||
let randomNumber = Math.floor(Math.random() * 15); | |||||
let chat = []; | |||||
for (let k = 0; k < randomNumber; k += 1) { | |||||
let randomMemberIndex = Math.floor(Math.random() * 19); | |||||
chat.push({ | |||||
user: this.members[randomMemberIndex], | |||||
text: faker.lorem.sentence(), | |||||
time: faker.time.recent(), | |||||
}); | |||||
} | |||||
ballChat.push({ | |||||
ball: balls, | |||||
chat: chat | |||||
}); | |||||
} | |||||
constructor() { } | |||||
this.chatData.push({ | |||||
over: i, | |||||
ballChat: ballChat, | |||||
triviaQuestion: { | |||||
question: faker.lorem.sentence(), | |||||
maxUserCount: Math.max.apply(Math, options.map(function(o) { return o.pollUserCount; })), | |||||
options: options, | |||||
selectedAnswer: Math.floor(Math.random() * 4), | |||||
} | |||||
}); | |||||
} | |||||
ngOnInit() { | |||||
} | |||||
} | |||||
} | } |
@@ -144,7 +144,7 @@ ion-content { | |||||
width: 50px; | width: 50px; | ||||
height: 10px; | height: 10px; | ||||
border-radius: 50%; | border-radius: 50%; | ||||
background-color: white; | |||||
background-color: lighten($blue-grey, 20%); | |||||
box-shadow: 0px 2px 5px $dark-blue; | box-shadow: 0px 2px 5px $dark-blue; | ||||
margin-top: -5px; | margin-top: -5px; | ||||
} | } | ||||