| @@ -1,41 +1,60 @@ | |||||
| <ion-content> | <ion-content> | ||||
| <img class="dotted-bg" src="https://www.searchpng.com/wp-content/uploads/2019/02/Polka-dot-Color-Pattern-PNG-Image.png"> | <img class="dotted-bg" src="https://www.searchpng.com/wp-content/uploads/2019/02/Polka-dot-Color-Pattern-PNG-Image.png"> | ||||
| <section class="visual-timer"> | |||||
| <p class="time"> {{ secondsPerQuestion }} </p> | |||||
| <ion-icon name="hourglass-outline"></ion-icon> | |||||
| <div class="progress" [ngStyle]="{'width.%' : (secondsPerQuestion * 100 / 30)}"></div> | |||||
| </section> | |||||
| <div class="container"> | |||||
| <header class="question-counter"> | |||||
| <h2> Question {{ selectedQuestion + 1 }}/<span>{{ questions.length }}</span> </h2> | |||||
| </header> | |||||
| <ul class="questions"> | |||||
| <ng-container *ngFor="let question of questions; let i = index"> | |||||
| <ng-container *ngIf="selectedQuestion === i"> | |||||
| <li *ngIf="question.type === 'MCQ'"> | |||||
| <app-mcq [text]="question.question" | |||||
| [choices]="question.choices" | |||||
| [correctAnswer]="question.correctAnswer"></app-mcq> | |||||
| </li> | |||||
| <li *ngIf="question.type === 'CARD'"> | |||||
| <app-swipe-cards [questions]="question.question"></app-swipe-cards> | |||||
| </li> | |||||
| </ng-container> | |||||
| </ng-container> | |||||
| </ul> | |||||
| <ng-container *ngIf="!showReport"> | |||||
| <section class="visual-timer"> | |||||
| <p class="time"> {{ secondsPerQuestion }} </p> | |||||
| <ion-icon name="hourglass-outline"></ion-icon> | |||||
| <div class="progress" [ngStyle]="{'width.%' : (secondsPerQuestion * 100 / 30)}"></div> | |||||
| </section> | |||||
| <div class="container"> | |||||
| <header class="question-counter"> | |||||
| <h2> Question {{ selectedQuestion + 1 }}/<span>{{ questions.length }}</span> </h2> | |||||
| </header> | |||||
| <ul class="questions"> | |||||
| <ng-container *ngFor="let question of questions; let i = index"> | |||||
| <ng-container *ngIf="selectedQuestion === i"> | |||||
| <li *ngIf="question.type === 'MCQ'"> | |||||
| <app-mcq [text]="question.question" | |||||
| [choices]="question.choices" | |||||
| [correctAnswer]="question.correctAnswer"></app-mcq> | |||||
| </li> | |||||
| </div> | |||||
| <button class="next-button" *ngIf="questionType === 'MCQ'" (click)="nextQuestion()"> | |||||
| <span class="text"> Next </span> | |||||
| <span class="dot"></span> | |||||
| </button> | |||||
| <li *ngIf="question.type === 'CARD'"> | |||||
| <app-swipe-cards (cardEvent)="getCardEvent($event)" [questions]="question.question"></app-swipe-cards> | |||||
| </li> | |||||
| </ng-container> | |||||
| </ng-container> | |||||
| </ul> | |||||
| </div> | |||||
| <button class="next-button" *ngIf="questionType === 'MCQ'" (click)="nextQuestion()"> | |||||
| <span class="text"> Next </span> | |||||
| <span class="dot"></span> | |||||
| </button> | |||||
| </ng-container> | |||||
| <ng-container *ngIf="showReport"> | |||||
| <section class="report-card"> | |||||
| <div> | |||||
| <h2> Yay! </h2> | |||||
| <p> | |||||
| You've completed all the fan Quiz questions! | |||||
| </p> | |||||
| </div> | |||||
| </section> | |||||
| <button class="next-button" (click)="startQuiz()"> | |||||
| <span class="text"> Restart </span> | |||||
| <span class="dot"></span> | |||||
| </button> | |||||
| </ng-container> | |||||
| </ion-content> | </ion-content> | ||||
| @@ -145,4 +145,32 @@ | |||||
| display: block; | display: block; | ||||
| transform: scale(0.3); | transform: scale(0.3); | ||||
| } | } | ||||
| } | |||||
| .report-card { | |||||
| background-color: white; | |||||
| padding: 20px; | |||||
| height: 250px; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| width: 80%; | |||||
| margin: 20vh auto; | |||||
| border-radius: 10px; | |||||
| text-align: center; | |||||
| background-color: lighten($blue-grey, 35%); | |||||
| box-shadow: 0px 3px 5px $dark-blue; | |||||
| h2 { | |||||
| color: $green; | |||||
| font-size: 1.5rem; | |||||
| margin: 10px 0; | |||||
| } | |||||
| p { | |||||
| margin: 10px 0; | |||||
| color: darken($blue-grey, 20%); | |||||
| font-size: 1.2rem; | |||||
| line-height: 1.5; | |||||
| } | |||||
| } | } | ||||
| @@ -22,10 +22,18 @@ export class QuizPage implements OnInit { | |||||
| correctAnswer?: string, | correctAnswer?: string, | ||||
| secondsAllotted: number | secondsAllotted: number | ||||
| }>; | }>; | ||||
| showReport: boolean = true; | |||||
| constructor() { } | constructor() { } | ||||
| ngOnInit() { | ngOnInit() { | ||||
| this.startQuiz(); | |||||
| } | |||||
| startQuiz() { | |||||
| this.selectedQuestion = 0; | |||||
| this.showReport = false; | |||||
| let timer = setInterval(() => { | let timer = setInterval(() => { | ||||
| if (this.secondsPerQuestion === 0) { | if (this.secondsPerQuestion === 0) { | ||||
| @@ -75,6 +83,16 @@ export class QuizPage implements OnInit { | |||||
| this.selectedQuestion += 1; | this.selectedQuestion += 1; | ||||
| this.secondsPerQuestion = this.questions[this.selectedQuestion].secondsAllotted; | this.secondsPerQuestion = this.questions[this.selectedQuestion].secondsAllotted; | ||||
| this.questionType = this.questions[this.selectedQuestion].type; | this.questionType = this.questions[this.selectedQuestion].type; | ||||
| } else { | |||||
| this.showReport = true; | |||||
| } | |||||
| } | |||||
| getCardEvent(data) { | |||||
| if (data) { | |||||
| if (data.end) { | |||||
| this.nextQuestion(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -2,14 +2,14 @@ | |||||
| <section class="card" #tinderCard *ngFor="let question of questions; let i = index" | <section class="card" #tinderCard *ngFor="let question of questions; let i = index" | ||||
| [ngStyle]="{ zIndex: questions.length - i, transform: 'scale(' + (20 - i) / 20 + ') translateY(-' + 20 * i + 'px)' }" | [ngStyle]="{ zIndex: questions.length - i, transform: 'scale(' + (20 - i) / 20 + ') translateY(-' + 20 * i + 'px)' }" | ||||
| (pan)="handlePan($event)" (panend)="handlePanEnd($event)"> | (pan)="handlePan($event)" (panend)="handlePanEnd($event)"> | ||||
| <img [src]="question.image" alt=""> | |||||
| <p> | <p> | ||||
| {{ question.text }} | {{ question.text }} | ||||
| </p> | </p> | ||||
| </section> | </section> | ||||
| <div class="action-buttons"> | <div class="action-buttons"> | ||||
| <button (click)="userClickedButton($event, false)"> <ion-icon name="close-outline"></ion-icon> </button> | <button (click)="userClickedButton($event, false)"> <ion-icon name="close-outline"></ion-icon> </button> | ||||
| <button (click)="userClickedButton($event, True)"> <ion-icon name="checkmark"></ion-icon> </button> | |||||
| <button (click)="userClickedButton($event, true)"> <ion-icon name="checkmark"></ion-icon> </button> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| @@ -13,10 +13,8 @@ | |||||
| .card { | .card { | ||||
| margin: 0; | margin: 0; | ||||
| padding: 15px; | padding: 15px; | ||||
| display: inline-block; | display: inline-block; | ||||
| width: 100%; | width: 100%; | ||||
| height: 300px; | |||||
| background: #FFFFFF; | background: #FFFFFF; | ||||
| border-radius: 20px; | border-radius: 20px; | ||||
| box-shadow: 0px 0px 15px -2px $dark-blue; | box-shadow: 0px 0px 15px -2px $dark-blue; | ||||
| @@ -27,6 +25,24 @@ | |||||
| cursor: -webkit-grab; | cursor: -webkit-grab; | ||||
| cursor: -moz-grab; | cursor: -moz-grab; | ||||
| cursor: grab; | cursor: grab; | ||||
| img { | |||||
| width: 100%; | |||||
| object-fit: cover; | |||||
| display: block; | |||||
| border-radius: 10px; | |||||
| margin-bottom: 10px; | |||||
| height: 230px; | |||||
| } | |||||
| p { | |||||
| text-align: center; | |||||
| margin: 0; | |||||
| font-size: 1.2rem; | |||||
| color: darken($blue-grey, 20%); | |||||
| font-weight: 500; | |||||
| } | |||||
| } | } | ||||
| @@ -35,8 +51,8 @@ | |||||
| position: fixed; | position: fixed; | ||||
| z-index: 1; | z-index: 1; | ||||
| bottom: 10vh; | bottom: 10vh; | ||||
| width: 120px; | |||||
| left: calc(50% - 60px); | |||||
| width: 100px; | |||||
| left: calc(50% - 50px); | |||||
| overflow: visible; | overflow: visible; | ||||
| align-items: center; | align-items: center; | ||||
| justify-content: space-between; | justify-content: space-between; | ||||
| @@ -54,6 +70,7 @@ | |||||
| display: flex; | display: flex; | ||||
| align-items: center; | align-items: center; | ||||
| justify-content: center; | justify-content: center; | ||||
| margin: 0; | |||||
| &:first-child { | &:first-child { | ||||
| margin-left: -30px; | margin-left: -30px; | ||||
| @@ -31,6 +31,11 @@ export class SwipeCardsComponent implements OnInit { | |||||
| this.tinderCardsArray = this.tinderCards.toArray(); | this.tinderCardsArray = this.tinderCards.toArray(); | ||||
| this.tinderCards.changes.subscribe(()=>{ | this.tinderCards.changes.subscribe(()=>{ | ||||
| this.tinderCardsArray = this.tinderCards.toArray(); | this.tinderCardsArray = this.tinderCards.toArray(); | ||||
| if(this.tinderCardsArray.length === 0) { | |||||
| this.cardEvent.emit({ end: true }); | |||||
| } else { | |||||
| this.cardEvent.emit({ end: false }); | |||||
| } | |||||
| }); | }); | ||||
| } | } | ||||