@@ -2,6 +2,7 @@ import Vue from "vue";
22import VueRouter from "vue-router" ;
33import { auth } from "@/api" ;
44import store from "@/store" ;
5+ import moment from "moment" ;
56
67Vue . use ( VueRouter ) ;
78
@@ -22,6 +23,23 @@ async function logout() {
2223 await auth . logout ( ) ;
2324}
2425
26+ // dates for determining components to render
27+
28+ // start and end time for questions before boss question
29+ let mainQuestionsStartTime = moment ( "5 Apr 2021 08:00:00 CDT" ) ;
30+ let mainQuestionsEndTime = moment ( "25 Apr 2021 23:59:59 CDT" ) ;
31+
32+ // start and end time for boss question (final question)
33+ let bossStartTime = moment ( "26 Apr 2021 08:00:00 CDT" ) ;
34+ let bossEndTime = moment ( "30 Apr 2021 23:59:59 CDT" ) ;
35+
36+ // start and end time for voting
37+ let votingStartTime = moment ( "3 May 2021 08:00:00 CDT" ) ;
38+ let votingEndTime = moment ( "7 May 2021 23:59:59 CDT" ) ;
39+
40+ // easy route testing by passing a date string below
41+ let now = moment ( ) ;
42+
2543const routes = [
2644 // testing route
2745 {
@@ -42,7 +60,6 @@ const routes = [
4260 beforeEnter ( to , from , next ) {
4361 // for testing
4462 if ( to . path === "/testing/vote" ) {
45- console . log ( "in redirect" , to . path ) ;
4663 next ( { path : "/testing/vote" } ) ;
4764 return ;
4865 }
@@ -134,23 +151,21 @@ const routes = [
134151 path : "voting" ,
135152 name : "voting" ,
136153 component : ( ) => {
137- // return import("@/views/Voting/VotingOver");
138- return import ( "@/views/Voting/VoteWoah" ) ;
139- // if (isChallengeClosed()) {
140- // return import("@/views/Voting/Ballot");
141- // } else {
142- // return import("@/views/Voting/VoteWoah");
143- // }
154+ // show VoteWoah if before vote start time
155+ if ( now < votingStartTime ) {
156+ return import ( "@/views/Voting/VoteWoah" ) ;
157+ }
158+
159+ // show VotingOver if past vote end time
160+ if ( now > votingEndTime ) {
161+ // TODO: add a leaderboard here once built
162+ return import ( "@/views/Voting/VotingOver" ) ;
163+ }
164+
165+ // show Ballot otherwise
166+ return import ( "@/views/Voting/Ballot" ) ;
144167 }
145168 }
146- // {
147- // path: "vote-confirmation",
148- // name: "voting-confirmation",
149- // meta: {
150- // challengeOver: true
151- // },
152- // component: () => import("@/views/Voting/Confirm")
153- // }
154169 ]
155170 } ,
156171 {
@@ -163,38 +178,71 @@ const routes = [
163178 path : "quiz" ,
164179 name : "quiz" ,
165180 component : async ( ) => {
166- // CHALLENGE HAS NOT STARTED
167- if ( ! isChallengeOpen ( ) ) {
181+ // time before challenge has started
182+ if ( now < mainQuestionsStartTime ) {
183+ // TODO: update QuizCountdown's content for 2022's before start time
168184 return import ( "@/views/Quiz/QuizCountdown" ) ;
169185 }
170186
171- // USER HAS FINISHED QUIZ
172- if ( store . state . Quiz . maxRank === store . state . User . rank - 1 ) {
173- return import ( "@/views/Quiz/QuizFinished" ) ;
174- }
187+ // time during main quiz
188+ if ( now >= mainQuestionsStartTime && now <= mainQuestionsEndTime ) {
189+ // USER HAS FINISHED QUIZ
190+ // TODO: for 2022 import a 'you finished now wait for boss' component
191+ // if done will all questions except boss
175192
176- // User did not make the cut
177- if (
178- store . state . Quiz . rankToday == store . state . Quiz . maxRank &&
179- store . state . User . rank != store . state . Quiz . rankToday
180- ) {
181- return import ( "@/views/Quiz/QuizFinishedFail" ) ;
193+ // NORMAL QUIZ MODE
194+ return import ( "@/views/Quiz/Quiz" ) ;
182195 }
183196
184- // MUST WAIT FOR NEXT QUESTION
185- if ( store . state . Quiz . awaitNextQuestion ) {
197+ // time between main questions ending and boss starting
198+ if ( now > mainQuestionsEndTime && now < bossStartTime ) {
199+ // TODO: for 2022 make an await final boss component, or start passing props to QuizCountdown
200+
201+ // MUST WAIT FOR NEXT QUESTION
186202 return import ( "@/views/Quiz/QuizCountdown" ) ;
187203 }
188204
189- // SHOW THE LAST QUESTION
190- if ( store . state . Quiz . isLastQuestion ) {
191- return import ( "@/views/Quiz/QuizFinalQuestion" ) ;
205+ // time during boss final question
206+ if ( now >= bossStartTime && now <= bossEndTime ) {
207+ // User did not make the cut
208+ if (
209+ store . state . Quiz . rankToday == store . state . Quiz . maxRank &&
210+ store . state . User . rank != store . state . Quiz . rankToday
211+ ) {
212+ return import ( "@/views/Quiz/QuizFinishedFail" ) ;
213+ }
214+
215+ // user has finished the boss question
216+ if ( store . state . Quiz . maxRank === store . state . User . rank - 1 ) {
217+ return import ( "@/views/Quiz/QuizFinished" ) ;
218+ }
219+
220+ // show boss question
221+ if ( store . state . Quiz . isLastQuestion ) {
222+ return import ( "@/views/Quiz/QuizFinalQuestion" ) ;
223+ }
192224 }
193225
194- // NORMAL QUIZ MODE
195- return import ( "@/views/Quiz/Quiz" ) ;
226+ // time after boss question ends and before voting
227+ if ( now > bossEndTime && now < votingStartTime ) {
228+ // user has finished the boss question
229+ if ( store . state . Quiz . maxRank === store . state . User . rank - 1 ) {
230+ return import ( "@/views/Quiz/QuizFinished" ) ;
231+ }
232+
233+ // if time is up and they did not finish, they failed
234+ return import ( "@/views/Quiz/QuizFinishedFail" ) ;
235+ }
236+
237+ // times after voting starts are handled in the route guard
238+ // TODO: make a component that alerts before redirect to /voting for better user experience
196239 } ,
197240 beforeEnter ( from , to , next ) {
241+ // redirect if all sections of quiz are over
242+ if ( now >= votingStartTime ) {
243+ next ( "/voting" ) ;
244+ }
245+
198246 // USER MUST SEE INTRO VIDEO
199247 if (
200248 isChallengeOpen ( ) &&
@@ -252,7 +300,6 @@ const router = new VueRouter({
252300router . beforeEach ( async ( to , from , next ) => {
253301 // for testing
254302 if ( to . path === "/testing/vote" ) {
255- console . log ( "bypassing beforeEach" ) ;
256303 next ( ) ;
257304 return ;
258305 }
0 commit comments