| @@ -1,9 +1,59 @@ | |||
| <ion-header> | |||
| <ion-toolbar> | |||
| <ion-title>chat</ion-title> | |||
| </ion-toolbar> | |||
| </ion-header> | |||
| <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> | |||
| @@ -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 * as faker from 'faker'; | |||
| import * as moment from 'moment'; | |||
| type IMember = { | |||
| name: string, | |||
| image: string, | |||
| color: string, | |||
| } | |||
| @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 { | |||
| 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; | |||
| height: 10px; | |||
| border-radius: 50%; | |||
| background-color: white; | |||
| background-color: lighten($blue-grey, 20%); | |||
| box-shadow: 0px 2px 5px $dark-blue; | |||
| margin-top: -5px; | |||
| } | |||