Skip to content
This repository was archived by the owner on Dec 8, 2022. It is now read-only.

Commit 20d4935

Browse files
authored
Merge pull request #48 from codewizardshq/voting-and-design
Voting and design
2 parents b4394f7 + e9cfacc commit 20d4935

File tree

4 files changed

+131
-85
lines changed

4 files changed

+131
-85
lines changed

CodeChallenge/api/questions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def json_error(reason, status=400):
2020

2121
@bp.before_request
2222
def end_code_challenge():
23-
if core.challenge_ended():
23+
if core.challenge_ended() and request.path != "/api/v1/questions/leaderboard":
2424
r = jsonify(status="error",
2525
reason="code challenge has ended")
2626
r.status_code = 403

src/components/QuizBar.vue

Lines changed: 51 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,68 @@
11
<template>
2-
<v-toolbar
3-
color="dark2 quiz-bar"
4-
flat
5-
class="secondary--text"
6-
:height="60"
7-
:max-height="60"
8-
>
9-
<div class="quiz-bar-rank" v-show="User.isAuthorized">
10-
<div class="level-display">Level</div>
11-
<div class="rank">{{ User.rank }}</div>
12-
</div>
13-
<v-container>
14-
<v-row>
15-
<v-col>
16-
<span v-if="User.isAuthorized" class="barrow-bold"
17-
>Welcome pilgrim {{ User.displayName }}</span
18-
>
2+
<v-toolbar color="dark2 quiz-bar" flat class="secondary--text" :height="60" :max-height="60">
3+
<div class="quiz-bar-rank" v-show="User.isAuthorized && Quiz.quizHasStarted && !Quiz.quizHasEnded">
4+
<div class="level-display">Level</div>
5+
<div class="rank">{{ User.rank }}</div>
6+
</div>
7+
<v-container>
8+
<v-row>
9+
<v-col>
10+
<span
11+
v-if="User.isAuthorized"
12+
class="barrow-bold"
13+
>Welcome pilgrim {{ User.displayName }}</span>
1914

20-
<router-link
21-
v-else
22-
color="secondary"
23-
text
24-
x-large
25-
active-class="none"
26-
:to="{ name: 'register' }"
27-
>Start your journey</router-link
28-
>
29-
</v-col>
15+
<router-link
16+
v-else
17+
color="secondary"
18+
text
19+
x-large
20+
active-class="none"
21+
:to="{ name: 'register' }"
22+
>Start your journey</router-link>
23+
</v-col>
3024

31-
<v-col class="text-right">
32-
<v-menu offset-y>
33-
<template v-slot:activator="{ on: menu }">
34-
<a href="#" v-on="menu">Get Help</a>
35-
</template>
36-
<v-list class="list">
37-
<v-list-item :to="{ name: 'faq' }">
38-
<v-list-item-title>Check The FAQ</v-list-item-title>
39-
</v-list-item>
40-
<v-list-item href="https://discord.gg/fDWbCj9" target="_blank">
41-
<v-list-item-title>Get Help On Discord</v-list-item-title>
42-
</v-list-item>
43-
<v-list-item href="https://www.facebook.com" target="_blank">
44-
<v-list-item-title>Get Help On Facebook</v-list-item-title>
45-
</v-list-item>
46-
</v-list>
47-
</v-menu>
25+
<v-col class="text-right">
26+
<v-menu offset-y>
27+
<template v-slot:activator="{ on: menu }">
28+
<a href="#" v-on="menu">Get Help</a>
29+
</template>
30+
<v-list class="list">
31+
<!-- <v-list-item :to="{ name: 'faq' }">
32+
<v-list-item-title>Check The FAQ</v-list-item-title>
33+
</v-list-item> -->
34+
<v-list-item href="https://discord.gg/fDWbCj9" target="_blank">
35+
<v-list-item-title>Get Help On Discord</v-list-item-title>
36+
</v-list-item>
37+
<v-list-item href="https://www.facebook.com" target="_blank">
38+
<v-list-item-title>Get Help On Facebook</v-list-item-title>
39+
</v-list-item>
40+
</v-list>
41+
</v-menu>
4842

49-
<router-link v-if="!User.isAuthorized" :to="{ name: 'login' }"
50-
>Sign In</router-link
51-
>
43+
<router-link v-if="!User.isAuthorized" :to="{ name: 'login' }">Sign In</router-link>
5244

53-
<router-link v-if="User.isAuthorized" :to="{ name: 'logout' }"
54-
>Sign Out</router-link
55-
>
56-
</v-col>
57-
</v-row>
58-
</v-container>
59-
</v-toolbar>
45+
<router-link v-if="User.isAuthorized" :to="{ name: 'logout' }">Sign Out</router-link>
46+
</v-col>
47+
</v-row>
48+
</v-container>
49+
</v-toolbar>
6050
</template>
6151

6252
<script>
63-
import { User } from "@/store";
53+
import { User, Quiz } from "@/store";
6454
6555
export default {
66-
name: "quizBar",
67-
computed: {
68-
...User.mapState()
69-
}
56+
name: "quizBar",
57+
computed: {
58+
...User.mapState(),
59+
...Quiz.mapState()
60+
}
7061
};
7162
</script>
7263

7364
<style lang="scss" scoped>
7465
.list {
75-
padding: 20px;
66+
padding: 20px;
7667
}
7768
</style>

src/plugins/router.js

Lines changed: 78 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,36 @@
11
import Vue from "vue";
22
import VueRouter from "vue-router";
3-
import { auth } from "@/api";
3+
import { auth, quiz } from "@/api";
44
import store from "@/store";
55

66
Vue.use(VueRouter);
77

8+
function isChallengeOpen() {
9+
return store.state.Quiz.quizHasStarted && !store.state.Quiz.quizHasEnded;
10+
}
11+
12+
function isChallengePending() {
13+
return !store.state.Quiz.quizHasStarted && !store.state.Quiz.quizHasEnded;
14+
}
15+
16+
function isChallengeClosed() {
17+
return store.state.Quiz.quizHasEnded;
18+
}
19+
820
const routes = [
921
{
1022
path: "/home",
1123
name: "home",
12-
redirect: {
13-
name: "quiz"
24+
beforeEnter(to, from, next) {
25+
if (isChallengeOpen() || isChallengePending()) {
26+
next({ name: 'quiz' });
27+
return;
28+
}
29+
30+
if (isChallengeClosed()) {
31+
next({ name: 'voting' })
32+
return;
33+
}
1434
}
1535
},
1636
{
@@ -63,7 +83,10 @@ const routes = [
6383
{
6484
path: "/voting",
6585
name: "voting",
66-
component: () => import("@/views/Voting/Ballot.vue")
86+
component: () => import("@/views/Voting/Ballot.vue"),
87+
meta: {
88+
challengeOver: true
89+
}
6790
},
6891
{
6992
// dev only
@@ -82,13 +105,8 @@ const routes = [
82105
component: async () => {
83106
await store.dispatch("Quiz/refresh");
84107

85-
// CHALLENGE IS OVER
86-
if (store.state.Quiz.quizHasEnded) {
87-
return import("@/views/Quiz/QuizFinished");
88-
}
89-
90108
// CHALLENGE HAS NOT STARTED
91-
if (!store.state.Quiz.quizHasStarted) {
109+
if (!isChallengeOpen()) {
92110
return import("@/views/Quiz/QuizCountdown");
93111
}
94112

@@ -106,28 +124,30 @@ const routes = [
106124
if (store.state.Quiz.isLastQuestion) {
107125
return import("@/views/Quiz/QuizFinalQuestion");
108126
}
127+
109128
// NORMAL QUIZ MODE
110129
return import("@/views/Quiz/Quiz");
111130
},
112131
beforeEnter(from, to, next) {
113132
// USER MUST SEE INTRO VIDEO
114-
if (!store.state.Quiz.hasSeenIntro && store.state.User.rank == 1) {
133+
if (isChallengeOpen() && !store.state.Quiz.hasSeenIntro && store.state.User.rank == 1) {
115134
next({ name: "quiz-intro" });
116135
return;
117136
}
118137
next();
119138
},
120139
meta: {
121-
secured: true
140+
secured: true,
141+
challengeOpenOrPending: true
122142
}
123143
},
124144
{
125145
path: "/quiz/intro",
126146
name: "quiz-intro",
127147
component: () => import("@/views/Quiz/QuizIntro"),
128-
async beforeEnter(to, from, next) {
129-
await store.dispatch("Quiz/refresh");
130-
next();
148+
meta: {
149+
secured: true,
150+
challengeOpenOrPending: true
131151
}
132152
},
133153
{
@@ -144,19 +164,54 @@ const router = new VueRouter({
144164
routes
145165
});
146166

147-
router.beforeEach((to, from, next) => {
148-
const isAuthenticated = !!auth.currentUser().auth;
167+
router.beforeEach(async (to, from, next) => {
149168
const requireAuth = to.matched.some(record => record.meta.secured);
150169
const requireAnon = to.matched.some(record => record.meta.anon);
170+
const requireChallengePending = to.matched.some(record => record.meta.challengePending);
171+
const requireChallengeOpen = to.matched.some(record => record.meta.challengeOpen);
172+
const requireChallengeClosed = to.matched.some(record => record.meta.challengeOver);
173+
const requireChallengeOpenPending = to.matched.some(record => (record.meta.challengeOpenOrPending));
174+
175+
if (requireChallengePending || requireChallengeOpen || requireChallengeClosed || requireChallengeOpenPending) {
176+
await store.dispatch("Quiz/refresh");
177+
178+
const challengeIsClosed = isChallengeClosed();
179+
const challengeIsPending = isChallengePending();
180+
const challengeIsOpen = isChallengeOpen();
181+
182+
if (!challengeIsClosed && requireChallengeClosed) {
183+
next({ name: 'home' });
184+
return;
185+
}
186+
187+
if (!challengeIsOpen && requireChallengeOpen) {
188+
next({ name: 'home' });
189+
return;
190+
}
191+
192+
if (!challengeIsPending && requireChallengePending) {
193+
next({ name: 'home' });
194+
return;
195+
}
151196

152-
if (!isAuthenticated && requireAuth) {
153-
next({ name: "register" });
154-
return;
197+
if ((!challengeIsOpen && !challengeIsPending) && requireChallengeOpenPending) {
198+
next({ name: 'home' });
199+
return;
200+
}
155201
}
156202

157-
if (isAuthenticated && requireAnon) {
158-
next({ name: "home" });
159-
return;
203+
if (requireAuth || requireAnon) {
204+
const isAuthenticated = !!auth.currentUser().auth;
205+
206+
if (!isAuthenticated && requireAuth) {
207+
next({ name: "register" });
208+
return;
209+
}
210+
211+
if (isAuthenticated && requireAnon) {
212+
next({ name: "home" });
213+
return;
214+
}
160215
}
161216

162217
next();

src/views/Quiz/QuizFinalQuestion.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ output = calculateAnswer()`;
143143
async makeRequest(checkOnly) {
144144
const response = await api.quiz.submitFinal(
145145
this.fields.code.value,
146-
this.fields.language.value === "javascript" ? "js" : "py",
146+
this.fields.language.value === "javascript" ? "js" : "python",
147147
checkOnly
148148
);
149149
const isCorrect = response.correct;

0 commit comments

Comments
 (0)