@@ -1,3 +1,5 @@ | |||
<p> | |||
mcq works! | |||
</p> | |||
<section class="question"> | |||
<h3> {{ text }} </h3> | |||
</section> |
@@ -0,0 +1,8 @@ | |||
@import '../../colors'; | |||
h3 { | |||
color: white; | |||
font-weight: 500; | |||
letter-spacing: 0.5px; | |||
line-height: 1.5; | |||
} |
@@ -1,14 +1,20 @@ | |||
import { Component, OnInit } from '@angular/core'; | |||
import { Component, OnInit, Input } from '@angular/core'; | |||
@Component({ | |||
selector: 'app-mcq', | |||
templateUrl: './mcq.component.html', | |||
styleUrls: ['./mcq.component.scss'], | |||
selector: 'app-mcq', | |||
templateUrl: './mcq.component.html', | |||
styleUrls: ['./mcq.component.scss'], | |||
}) | |||
export class McqComponent implements OnInit { | |||
@Input() text: string = ''; | |||
@Input() choice: Array<{ | |||
value: string, | |||
text: string, | |||
}>; | |||
@Input() correctAnswer: number | |||
constructor() { } | |||
constructor() { } | |||
ngOnInit() {} | |||
ngOnInit() {} | |||
} |
@@ -7,6 +7,8 @@ import { IonicModule } from '@ionic/angular'; | |||
import { QuizPageRoutingModule } from './quiz-routing.module'; | |||
import { QuizPage } from './quiz.page'; | |||
import { McqComponent } from './mcq/mcq.component'; | |||
import { SwipeCardsComponent } from './swipe-cards/swipe-cards.component'; | |||
@NgModule({ | |||
imports: [ | |||
@@ -15,6 +17,6 @@ import { QuizPage } from './quiz.page'; | |||
IonicModule, | |||
QuizPageRoutingModule | |||
], | |||
declarations: [QuizPage] | |||
declarations: [QuizPage, McqComponent, SwipeCardsComponent] | |||
}) | |||
export class QuizPageModule {} |
@@ -1,3 +1,34 @@ | |||
<ion-content> | |||
<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" | |||
[choice]="question.choice" | |||
[correctAnswer]="question.correctAnswer"></app-mcq> | |||
</li> | |||
<li *ngIf="question.type === 'CARD'"> | |||
<app-swipe-cards></app-swipe-cards> | |||
</li> | |||
</ng-container> | |||
</ng-container> | |||
</ul> | |||
</div> | |||
</ion-content> |
@@ -0,0 +1,89 @@ | |||
@import '../colors'; | |||
.dotted-bg { | |||
position: fixed; | |||
left: 0; | |||
bottom: 0; | |||
z-index: 0; | |||
width: 100%; | |||
object-fit: cover; | |||
height: 10vh; | |||
background-repeat: no-repeat; | |||
background-position: top; | |||
} | |||
.visual-timer { | |||
display: flex; | |||
width: 80%; | |||
margin: 40px auto; | |||
position: relative; | |||
background-color: transparent; | |||
border: 4px solid rgba($blue-grey, 0.3); | |||
border-radius: 30px; | |||
height: 45px; | |||
align-items: center; | |||
justify-content: center; | |||
z-index: 0; | |||
overflow: hidden; | |||
p { | |||
flex-grow: 1; | |||
margin: 0; | |||
text-align: center; | |||
color: white; | |||
font-size: 1rem; | |||
font-weight: 500; | |||
letter-spacing: 1px; | |||
position: relative; | |||
z-index: 1; | |||
} | |||
ion-icon { | |||
position: absolute; | |||
right: 10px; | |||
top: 10px; | |||
font-size: 1rem; | |||
color: white; | |||
z-index: 1; | |||
} | |||
.progress { | |||
position: absolute; | |||
left: 0; | |||
top: 0; | |||
border-radius: 30px; | |||
background: linear-gradient(90deg, lighten($brand-red, 5%) 5%, lighten($dark-blue, 20%) 80%); | |||
width: 100%; | |||
height: 100%; | |||
transition: width 1s linear; | |||
} | |||
} | |||
.container { | |||
width: 80%; | |||
margin: 40px auto; | |||
} | |||
.question-counter { | |||
border-bottom: 2px dotted rgba($blue-grey, 0.3); | |||
padding-bottom: 10px; | |||
h2 { | |||
color: $blue-grey; | |||
font-size: 1.3rem; | |||
letter-spacing: 1px; | |||
font-weight: 700; | |||
margin: 0; | |||
span { | |||
font-size: 1.1rem; | |||
font-weight: 300; | |||
} | |||
} | |||
} | |||
.questions { | |||
list-style: none; | |||
padding: 0; | |||
margin: 0; | |||
} |
@@ -1,15 +1,59 @@ | |||
import { Component, OnInit } from '@angular/core'; | |||
import * as faker from 'faker'; | |||
@Component({ | |||
selector: 'app-quiz', | |||
templateUrl: './quiz.page.html', | |||
styleUrls: ['./quiz.page.scss'], | |||
selector: 'app-quiz', | |||
templateUrl: './quiz.page.html', | |||
styleUrls: ['./quiz.page.scss'], | |||
}) | |||
export class QuizPage implements OnInit { | |||
secondsPerQuestion: number = 30; | |||
selectedQuestion: number = 0; | |||
constructor() { } | |||
questions: Array<{ | |||
type: 'MCQ' | 'CARD', | |||
question: string, | |||
choice?: Array<{ | |||
value: string, | |||
text: string, | |||
}>, | |||
correctAnswer?: string, | |||
secondsAllotted?: number | |||
}>; | |||
ngOnInit() { | |||
} | |||
constructor() { } | |||
ngOnInit() { | |||
let timer = setInterval(() => { | |||
if (this.secondsPerQuestion === 0) { | |||
clearInterval(timer); | |||
} else { | |||
this.secondsPerQuestion -= 1; | |||
} | |||
}, 1000); | |||
this.questions = [{ | |||
type: 'MCQ', | |||
question: faker.lorem.sentence(), | |||
choice: [{ | |||
value: 'A', | |||
text: 'Choice 1' | |||
}, { | |||
value: 'B', | |||
text: 'Choice 1' | |||
}, { | |||
value: 'B', | |||
text: 'Choice 1' | |||
}], | |||
correctAnswer: 'A', | |||
secondsAllotted: 50 | |||
}, { | |||
type: 'CARD', | |||
question: faker.lorem.sentence(), | |||
secondsAllotted: 50 | |||
}]; | |||
} | |||
} |