{"version":3,"sources":["services/auth.service.ts","services/local-store.service.ts","constants/store.ts","store/adminQuizzes/adminQuizzes.slice.ts","components/Footer/Footer.tsx","components/Header/Header.tsx","components/Page/Page.tsx","helpers/history.ts","store/quizzes/quizzes.slice.ts","store/quiz/quiz.slice.ts","store/adminQuestions/adminQuestions.slice.ts","store/session/session.slice.ts","store/rootReducer.ts","store/index.ts","components/SlidingPanel/SlidingPanel.tsx","models/quiz.model.ts","services/api.service.ts","constants/config.ts","services/question.service.ts","store/adminQuestions/adminQuestions.actions.ts","helpers/error-message.ts","services/quiz.service.ts","services/session.service.ts","store/session/session.actions.ts","store/quiz/quiz.actions.ts","components/Loader/Loader.tsx","views/AdminQuizQuestions/EditQuestion/EditQuestion.tsx","views/AdminQuizQuestions/QuestionAnswerList/QuestionAnswerList.tsx","views/AdminQuizQuestions/QuestionItem/QuestionItem.tsx","helpers/format-duration.ts","views/AdminQuizQuestions/QuizRank/QuizRank.tsx","views/AdminQuizQuestions/AdminQuizQuestions.tsx","store/adminQuizzes/adminQuizzes.actions.ts","views/AdminQuizzes/EditQuiz/EditQuiz.tsx","views/AdminQuizzes/EditEndPages/EditEndPages.tsx","views/AdminQuizzes/AdminQuizzes.tsx","views/EndQuiz/EndQuiz.tsx","store/quizzes/quizzes.actions.ts","views/Home/HomeCardQuiz/HomeCardQuiz.tsx","views/Home/HomeFeaturedQuiz/HomeFeaturedQuiz.tsx","views/Home/Home.tsx","views/Login/Login.tsx","views/MainQuiz/MainQuiz.tsx","components/Countdown/Countdown.tsx","components/QuizContainer/QuizContainer.tsx","views/Quiz/QuizFeature/QuizFeature.tsx","views/Quiz/Quiz.tsx","views/QuizStart/QuizStart.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["AuthService","auth","LocalStoreService","getItem","LOCAL_STORE_AUTH","Buffer","from","username","password","toString","setItem","key","value","JSON","stringify","this","ls","defaultValue","parse","e","clear","window","localStorage","LOCAL_STORE_SESSIONS","LOCAL_STORE_CURRENT_SESSION","AdminEditQuizView","Footer","Container","className","Component","Header","Navbar","variant","to","Brand","Page","ReactGA","pageview","location","pathname","search","title","props","document","history","createBrowserHistory","basename","quizzesSlice","createSlice","name","initialState","homeQuizzes","isLoading","reducers","getHomeQuizzesStart","state","getHomeQuizzesSuccess","action","payload","getHomeQuizzesFailure","actions","quizSlice","quiz","startQuizLoading","getQuizPending","getQuizSuccess","startQuizSuccess","adminQuestionsSlice","questions","selectedQuestion","editQuestionLoading","quizStats","setSelectedQuestion","getQuestionsSuccess","getQuizStatsSuccess","editQuestionSuccess","editQuestionFailure","getQuestionSuccess","index","findIndex","question","uuid","push","deleteQuestionSuccess","splice","session","questionLoading","answerLoading","lastAttempt","nextAllowedTry","Date","now","endPageLoading","endPage","undefined","sessionSlice","setSession","setSessionQuestion","setSessionQuestionLoading","setSessionQuestionFailed","setCheckAnswerLoading","setCheckAnswerSuccess","setLastAttempt","setNextAllowedTry","setEndPagePending","setEndPageFailed","setEndPageSuccess","quizzes","selectedQuiz","quizView","QuizView","editQuizLoading","adminQuizzes","getQuizzesSuccess","getAdminQuizSuccess","q","setSelectedQuiz","setQuizView","editQuizSuccess","editQuizFailure","deleteQuizSuccess","adminQuizzesReducer","reducer","rootReducer","combineReducers","quizzesReducer","quizReducer","adminQuestions","adminQuestionsReducer","sessionReducer","router","connectRouter","loadingBar","loadingBarReducer","store","PanelType","configureStore","getPanelGlassStyle","type","size","hidden","horizontal","Bottom","Top","width","height","Right","left","bottom","position","getPanelStyle","right","overflow","getNameFromPanelTypeEnum","result","Left","SlidingPanel","glassBefore","isOpen","CSSTransition","in","timeout","classNames","unmountOnExit","style","display","onClick","backdropClicked","panelClassName","children","defaultProps","QuizFeatures","fetchApi","axiosConfig","a","token","getAuthorizationHeader","headers","authorization","axios","rep","data","console","log","Config","apiUrl","process","timeBeforeNextQuestion","QuestionService","quizUuid","method","url","questionUuid","description","answers","relativeOrder","selectQuestion","deselectQuestion","fetchQuestions","dispatch","showLoading","getQuestions","then","getQuizStats","hideLoading","updateQuestion","getQuestion","updatedQuestion","message","createQuestion","createdQuestion","deleteQuestion","moveQuestion","direction","orderQuestion","errors","Unauthorized","getApiErrorMessage","error","defaultError","response","allErrors","QuizService","subtitle","visible","featured","startDate","endPages","file","FormData","append","SessionService","sessions","sessionUuid","answer","redirectToQuestion","saveLastSessionToStorage","getSession","sessionData","hasFinishedQuiz","loadSessionFromStorage","loadGame","lastSession","getLastSessionFromStorage","Error","toast","fetchSessionQuestion","getState","getSessionQuestion","checkAnswer","check","isCorrect","moment","valueOf","add","cooldown","fetchEndPage","getEndPage","fetchQuiz","getQuiz","startQuiz","saveSessionToStorage","resumeQuiz","Loader","React","QuestionSchema","Yup","shape","required","EditQuestion","onSubmit","bind","form","editedQuestion","swal","dangerMode","text","buttons","cancel","confirm","closeModal","close","Button","initialValues","validationSchema","values","touched","handleChange","handleBlur","Form","Group","Label","Control","placeholder","onChange","onBlur","formNoValidate","isInvalid","Feedback","as","rows","arrayHelpers","map","remove","disabled","connect","bindActionCreators","QuestionAnswerList","answerMaps","fontWeight","OverlayTrigger","placement","overlay","Tooltip","id","Array","Set","join","length","color","fontSize","padding","QuestionItem","open","toggleQuestion","editQuestion","setState","prev","stats","stat","nbCorrectAnswers","nbIncorrectAnswers","correctAnswers","incorrectAnswers","order","getQuestionStats","source","getQuestionAnswers","formatDuration","secs","Math","round","hours","floor","minutes","seconds","QuizRank","rank","duration","lastCheck","diff","createdAt","asSeconds","AdminQuizQuestions","addQuestion","reloadQuestions","match","params","deletedAt","chartData","fluid","Row","Col","xs","md","dataKey","fill","selectQuiz","deselectQuiz","setQuizViewAction","view","fetchQuizzes","getQuizzes","createQuiz","createdQuiz","uploadQuizImage","updateQuiz","updatedQuiz","deleteQuiz","QuizSchema","EditQuiz","selectedFile","onImageChange","editedQuiz","enableStartDate","toISOString","event","target","files","setFieldValue","controlId","Check","label","checked","showPopperArrow","selected","date","showTimeSelect","timeFormat","dateFormat","autoComplete","accept","EditEndPages","AdminQuizzes","features","imageName","EndPagesView","addQuiz","editQuizEndPages","editQuiz","EndQuiz","loadEndPage","endDescription","loading","fetchHomeQuizzes","getHomeQuizzes","getQuizImageUrl","HomeCardQuiz","backgroundImage","HomeFeaturedQuiz","Home","filter","sm","LoginSchema","Login","setCredentials","catch","finally","AnswerSchema","MainQuiz","formikRef","buttonAnimationFrame","socket","buttonProgress","answerCorrect","loadQuestion","URL","endsWith","io","host","path","on","currentQuestionUuid","info","autoClose","Audio","play","cancelAnimationFrame","disconnect","prevProps","resetForm","setErrors","onQuestionSuccess","onQuestionFailure","setTimeout","cooldownTime","requestAnimationFrame","buttonAnimation","remainingTime","background","innerRef","instance","validateOnMount","isValid","getButtonStyle","Countdown","interval","getStateFromProps","asMilliseconds","days","showCountdown","setCountdownInterval","clearInterval","clearCountdownInterval","setInterval","countdownContent","countdownEndContent","QuizContainer","builder","Questions","icon","Speed","QuizFeature","feature","Quiz","maxWidth","QuizStartSchema","trim","matches","QuizStart","createNewSession","initialize","App","component","Boolean","hostname","require","default","ReactDOM","render","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.0a9384bc.chunk.js","sourcesContent":["import { LocalStoreService } from './local-store.service';\nimport { LOCAL_STORE_AUTH } from '../constants/store';\n\nexport class AuthService {\n static getAuthorizationHeader() {\n const auth = LocalStoreService.getItem(LOCAL_STORE_AUTH);\n if (!auth) return null;\n return 'Basic ' + Buffer.from(`${auth.username}:${auth.password}`, 'utf8').toString('base64');\n }\n\n static setCredentials(username: string, password: string) {\n LocalStoreService.setItem(LOCAL_STORE_AUTH, {\n username,\n password\n });\n }\n\n static logout() {\n LocalStoreService.setItem(LOCAL_STORE_AUTH, null);\n }\n}\n","export class LocalStoreService {\n static ls = window.localStorage;\n\n static setItem(key: string, value: any) {\n value = JSON.stringify(value);\n this.ls.setItem(key, value);\n return true;\n }\n\n static getItem(key: string, defaultValue: any = null) {\n const value = this.ls.getItem(key);\n try {\n if (value) {\n return JSON.parse(value);\n }\n return defaultValue;\n } catch (e) {\n return defaultValue;\n }\n }\n\n static clear() {\n this.ls.clear();\n }\n}\n","export const LOCAL_STORE_SESSIONS = 'sessions';\nexport const LOCAL_STORE_CURRENT_SESSION = 'current_session';\nexport const LOCAL_STORE_AUTH = 'auth';\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { Quiz } from '../../models/quiz.model';\n\nexport interface AdminQuizzesState {\n quizzes: Quiz[];\n selectedQuiz: Quiz | null;\n quizView: AdminEditQuizView;\n editQuizLoading: boolean;\n}\n\nexport enum AdminEditQuizView {\n QuizView,\n EndPagesView,\n}\n\nconst initialState: AdminQuizzesState = {\n quizzes: [],\n selectedQuiz: null,\n quizView: AdminEditQuizView.QuizView,\n editQuizLoading: false,\n};\n\nconst adminQuizzes = createSlice({\n name: 'adminQuizzes',\n initialState,\n reducers: {\n getQuizzesSuccess: (state, action: PayloadAction) => {\n state.quizzes = action.payload;\n },\n getAdminQuizSuccess: (state, action: PayloadAction) => {\n const index = state.quizzes.findIndex(q => q.uuid === action.payload.uuid);\n if (index !== -1) {\n state.quizzes[index] = action.payload;\n } else {\n state.quizzes.push(action.payload);\n }\n },\n setSelectedQuiz: (state, action: PayloadAction) => {\n state.selectedQuiz = action.payload;\n },\n setQuizView: (state, action: PayloadAction) => {\n state.quizView = action.payload;\n },\n editQuizLoading: (state) => {\n state.editQuizLoading = true;\n },\n editQuizSuccess: (state) => {\n state.editQuizLoading = false;\n },\n editQuizFailure: (state) => {\n state.editQuizLoading = false;\n },\n deleteQuizSuccess: (state, action: PayloadAction) => {\n const index = state.quizzes.findIndex(q => q.uuid === action.payload);\n if (index !== -1) {\n state.quizzes.splice(index, 1);\n }\n }\n }\n});\n\nexport const {\n getQuizzesSuccess,\n setSelectedQuiz,\n setQuizView,\n editQuizLoading,\n editQuizSuccess,\n editQuizFailure,\n deleteQuizSuccess,\n getAdminQuizSuccess,\n} = adminQuizzes.actions;\n\nconst adminQuizzesReducer = adminQuizzes.reducer;\nexport default adminQuizzesReducer;\n","import React, { Component } from 'react';\nimport { Container } from 'react-bootstrap';\n\nexport default class Footer extends Component {\n render() {\n return (\n \n {/* Footer */}\n \n );\n }\n}\n","import React, { Component } from 'react';\nimport { Container, Navbar } from 'react-bootstrap';\nimport { Link } from 'react-router-dom';\nimport './Header.scss';\n\nexport default class Header extends Component {\n render() {\n return (\n \n \n \n \n BrainQuiz\n \n \n \n \n );\n }\n}\n","import React, { Component } from 'react';\nimport { RouteProps, Route } from 'react-router-dom';\nimport ReactGA from 'react-ga';\n\nexport interface PageProps extends RouteProps {\n title?: string;\n}\n\nexport default class Page extends Component {\n componentDidMount() {\n ReactGA.pageview(window.location.pathname + window.location.search);\n\n const { title } = this.props;\n const appName = 'BrainQuiz';\n if (title) {\n document.title = title + ' - ' + appName;\n } else {\n document.title = appName;\n }\n }\n\n render() {\n return ;\n }\n}\n","import { createBrowserHistory } from 'history';\n\nexport const history = createBrowserHistory({ basename: '/' });\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { Quiz } from '../../models/quiz.model';\n\nexport interface QuizzesState {\n homeQuizzes: Quiz[];\n isLoading: boolean;\n}\n\nconst initialState: QuizzesState = {\n homeQuizzes: [],\n isLoading: false,\n};\n\nconst startLoading = (state: QuizzesState) => {\n state.isLoading = true;\n};\n\nconst loadingFailed = (state: QuizzesState, action: PayloadAction) => {\n state.isLoading = false;\n};\n\nconst quizzesSlice = createSlice({\n name: 'quizzes',\n initialState,\n reducers: {\n getHomeQuizzesStart: startLoading,\n getHomeQuizzesSuccess: (state, action: PayloadAction) => {\n state.isLoading = false;\n state.homeQuizzes = action.payload;\n },\n getHomeQuizzesFailure: loadingFailed,\n }\n});\n\nexport const {\n getHomeQuizzesStart,\n getHomeQuizzesSuccess,\n getHomeQuizzesFailure,\n} = quizzesSlice.actions;\n\nexport default quizzesSlice.reducer;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { Quiz } from '../../models/quiz.model';\n\nexport interface QuizState {\n quiz: Quiz | null;\n startQuizLoading: boolean;\n}\n\nconst initialState: QuizState = {\n quiz: null,\n startQuizLoading: false,\n};\n\nconst quizSlice = createSlice({\n name: 'quiz',\n initialState,\n reducers: {\n getQuizPending: (state) => {\n state.quiz = null;\n },\n getQuizSuccess: (state, action: PayloadAction) => {\n state.quiz = action.payload;\n },\n startQuizLoading: (state) => {\n state.startQuizLoading = true;\n },\n startQuizSuccess: (state) => {\n state.startQuizLoading = false;\n },\n }\n});\n\nexport const {\n getQuizPending,\n getQuizSuccess,\n startQuizLoading,\n startQuizSuccess,\n} = quizSlice.actions;\n\nexport default quizSlice.reducer;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { Question, QuizStats } from '../../models/question.model';\n\nexport interface AdminQuestionsState {\n questions: Question[];\n selectedQuestion: Question | null;\n editQuestionLoading: boolean;\n quizStats: QuizStats | null;\n}\n\nconst initialState: AdminQuestionsState = {\n questions: [],\n selectedQuestion: null,\n editQuestionLoading: false,\n quizStats: null,\n};\n\nconst adminQuestionsSlice = createSlice({\n name: 'adminQuestions',\n initialState,\n reducers: {\n setSelectedQuestion: (state, action: PayloadAction) => {\n state.selectedQuestion = action.payload;\n },\n getQuestionsSuccess: (state, action: PayloadAction) => {\n state.questions = action.payload;\n },\n getQuizStatsSuccess: (state, action: PayloadAction) => {\n state.quizStats = action.payload;\n },\n editQuestionLoading: (state) => {\n state.editQuestionLoading = true;\n },\n editQuestionSuccess: (state) => {\n state.editQuestionLoading = false;\n },\n editQuestionFailure: (state, action: PayloadAction) => {\n state.editQuestionLoading = false;\n },\n getQuestionSuccess: (state, action: PayloadAction) => {\n const index = state.questions.findIndex(question => question.uuid === action.payload.uuid);\n if (index !== -1) {\n state.questions[index] = action.payload;\n } else {\n state.questions.push(action.payload);\n }\n },\n deleteQuestionSuccess: (state, action: PayloadAction) => {\n const index = state.questions.findIndex(question => question.uuid === action.payload);\n if (index !== -1) {\n state.questions.splice(index, 1);\n }\n }\n }\n});\n\nexport const {\n setSelectedQuestion,\n getQuestionsSuccess,\n getQuestionSuccess,\n editQuestionLoading,\n editQuestionSuccess,\n editQuestionFailure,\n deleteQuestionSuccess,\n getQuizStatsSuccess,\n} = adminQuestionsSlice.actions;\n\nexport default adminQuestionsSlice.reducer;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { Session, SessionEndPage } from '../../models/session.model';\nimport { SessionQuestion } from '../../models/session-question.model';\n\nexport interface SessionState {\n session: Session | null;\n question: SessionQuestion | null;\n questionLoading: boolean;\n answerLoading: boolean;\n lastAttempt: number;\n nextAllowedTry: number;\n endPageLoading: boolean;\n endPage?: SessionEndPage;\n}\n\nconst initialState: SessionState = {\n session: null,\n question: null,\n questionLoading: false,\n answerLoading: false,\n lastAttempt: 0,\n nextAllowedTry: Date.now(),\n endPageLoading: false,\n endPage: undefined,\n};\n\nconst sessionSlice = createSlice({\n name: 'session',\n initialState,\n reducers: {\n setSession: (state, action: PayloadAction) => {\n state.session = action.payload;\n },\n setSessionQuestion: (state, action: PayloadAction) => {\n state.question = action.payload;\n state.questionLoading = false;\n },\n setSessionQuestionLoading: (state) => {\n state.questionLoading = true;\n },\n setSessionQuestionFailed: (state) => {\n state.questionLoading = false;\n },\n setCheckAnswerLoading: (state) => {\n state.answerLoading = true;\n },\n setCheckAnswerSuccess: (state) => {\n state.answerLoading = false;\n },\n setLastAttempt: (state, action: PayloadAction) => {\n state.lastAttempt = action.payload;\n },\n setNextAllowedTry: (state, action: PayloadAction) => {\n state.nextAllowedTry = action.payload;\n },\n setEndPagePending: (state) => {\n state.endPageLoading = true;\n },\n setEndPageFailed: (state) => {\n state.endPageLoading = false;\n },\n setEndPageSuccess: (state, action: PayloadAction) => {\n state.endPageLoading = false;\n state.endPage = action.payload;\n },\n }\n});\n\nexport const {\n setSession,\n setSessionQuestion,\n setSessionQuestionLoading,\n setSessionQuestionFailed,\n setCheckAnswerLoading,\n setCheckAnswerSuccess,\n setLastAttempt,\n setNextAllowedTry,\n setEndPagePending,\n setEndPageFailed,\n setEndPageSuccess,\n} = sessionSlice.actions;\n\nexport default sessionSlice.reducer;\n","import { combineReducers } from '@reduxjs/toolkit';\nimport { connectRouter } from 'connected-react-router';\nimport { loadingBarReducer } from 'react-redux-loading-bar';\nimport { history } from '../helpers/history';\nimport quizzesReducer from './quizzes/quizzes.slice';\nimport quizReducer from './quiz/quiz.slice';\nimport adminQuestionsReducer from './adminQuestions/adminQuestions.slice';\nimport sessionReducer from './session/session.slice';\nimport adminQuizzesReducer from './adminQuizzes/adminQuizzes.slice';\n\n\nconst rootReducer = combineReducers({\n quizzes: quizzesReducer,\n quiz: quizReducer,\n adminQuizzes: adminQuizzesReducer,\n adminQuestions: adminQuestionsReducer,\n session: sessionReducer,\n router: connectRouter(history),\n loadingBar: loadingBarReducer,\n});\n\nexport type RootState = ReturnType;\n\nexport default rootReducer;\n","import { Action, configureStore } from '@reduxjs/toolkit';\nimport { ThunkAction } from 'redux-thunk';\nimport rootReducer, { RootState } from './rootReducer';\n\nconst store = configureStore({\n reducer: rootReducer\n});\n\nif (process.env.NODE_ENV === 'development' && (module as any).hot) {\n (module as any).hot.accept('./rootReducer', () => {\n // eslint-disable-next-line global-require\n const newRootReducer = require('./rootReducer').default;\n store.replaceReducer(newRootReducer);\n });\n}\n\nexport type AppDispatch = typeof store.dispatch;\nexport type AppThunk = ThunkAction>;\n\nexport default store;\n","import React from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport './SlidingPanel.scss';\n\n\nexport enum PanelType {\n Top = 1,\n Right,\n Bottom,\n Left,\n}\n\n// http://reactcommunity.org/react-transition-group/transition#Transition-prop-onEntering\ntype Nullable = T | null;\nexport interface SliderProps {\n type: PanelType;\n size: number;\n panelClassName?: string;\n isOpen: boolean;\n children: Nullable;\n backdropClicked: () => void;\n}\n\n\nconst getPanelGlassStyle = (type: PanelType, size: number, hidden: boolean): React.CSSProperties => {\n const horizontal = type === PanelType.Bottom || type === PanelType.Top;\n return {\n width: horizontal ? `${hidden ? '0' : '100'}vw` : `${100 - size}vw`,\n height: horizontal ? `${100 - size}vh` : `${hidden ? '0' : '100'}vh`,\n ...(type === PanelType.Right && { left: 0 }),\n ...(type === PanelType.Top && { bottom: 0 }),\n position: 'inherit',\n };\n};\n\nconst getPanelStyle = (type: PanelType, size: number): React.CSSProperties => {\n const horizontal = type === PanelType.Bottom || type === PanelType.Top;\n return {\n width: horizontal ? '100vw' : `${size}vw`,\n height: horizontal ? `${size}vh` : '100vh',\n ...(type === PanelType.Right && { right: 0 }),\n ...(type === PanelType.Bottom && { bottom: 0 }),\n position: 'inherit',\n overflow: 'auto',\n };\n};\n\n\nfunction getNameFromPanelTypeEnum(type: PanelType): string {\n let result = '';\n // eslint-disable-next-line default-case\n switch (type) {\n case PanelType.Right:\n result = 'right';\n break;\n case PanelType.Left:\n result = 'left';\n break;\n case PanelType.Top:\n result = 'top';\n break;\n case PanelType.Bottom:\n result = 'bottom';\n break;\n }\n return result;\n}\n\nconst SlidingPanel: React.SFC = (props) => {\n const glassBefore = props.type === PanelType.Right || props.type === PanelType.Bottom;\n const horizontal = props.type === PanelType.Bottom || props.type === PanelType.Top;\n return (\n
\n
\n
\n \n
\n {glassBefore && (\n ) => { props.backdropClicked(); }}\n />\n )}\n
\n
{props.children}
\n
\n {!glassBefore && (\n ) => { props.backdropClicked(); }}\n />\n )}\n
\n \n
\n
\n
\n );\n};\n\n\nSlidingPanel.defaultProps = {\n type: PanelType.Left,\n size: 50,\n panelClassName: '',\n isOpen: false,\n children: null,\n backdropClicked: () => null\n};\n\nexport default SlidingPanel;\n","import Config from '../constants/config';\n\nexport interface Quiz {\n uuid: string;\n name: string;\n subtitle: string;\n description: string;\n visible: boolean;\n featured: boolean;\n startDate: string | null;\n features: QuizFeatures[];\n deletedAt: string | null;\n endPages: EndPage[];\n imageName: string | null;\n}\n\nexport const getQuizImageUrl = (quiz: Quiz) => {\n if (quiz.imageName) {\n return Config.apiUrl + '/quiz/image/' + quiz.imageName;\n }\n return '/assets/images/quiz.jpg';\n};\n\nexport interface EndPage {\n from: number;\n to: number;\n description: string;\n}\n\nexport enum QuizFeatures {\n Questions = 'questions',\n Speed = 'speed',\n}\n","import axios, { AxiosRequestConfig } from 'axios';\nimport { Dispatch } from 'redux';\nimport { API_CALL } from '../middlewares/api.middleware';\nimport { AuthService } from './auth.service';\n\nexport interface ApiAction {\n url: string,\n method: string,\n types?: (string | null)[] | null,\n data?: any,\n onSuccess?: Function,\n onFailure?: Function,\n headers?: {[header: string]: string} | null,\n}\n\nexport const apiAction = ({\n url = '',\n method = 'GET',\n types = null,\n data = null,\n onSuccess = () => {},\n onFailure = () => {},\n headers = null,\n}: ApiAction) => {\n return {\n type: API_CALL,\n payload: {\n url,\n method,\n data,\n types,\n headers,\n onSuccess,\n onFailure\n }\n };\n};\n\nexport const apiPromise = (\n dispatch: Dispatch,\n apiData: ApiAction\n) => {\n return new Promise((resolve, reject) => {\n dispatch(\n apiAction(\n {\n ...apiData,\n onSuccess: resolve,\n onFailure: reject\n }\n )\n );\n });\n};\n\n\nexport const fetchApi = async (\n axiosConfig: AxiosRequestConfig,\n retried: boolean = false\n) => {\n const token = AuthService.getAuthorizationHeader();\n if (token) {\n if (!axiosConfig.headers) {\n axiosConfig.headers = {};\n }\n axiosConfig.headers.authorization = token;\n }\n try {\n const rep = await axios(axiosConfig);\n return rep.data;\n } catch (error) {\n console.log(error);\n throw error;\n }\n};\n","\nconst Config = {\n apiUrl: process.env.REACT_APP_API_URL as string,\n timeBeforeNextQuestion: 2,\n};\n\nexport default Config;\n","import { fetchApi } from './api.service';\nimport Config from '../constants/config';\nimport { Question } from '../models/question.model';\n\nexport default class QuestionService {\n static getQuestions(quizUuid: string) {\n return fetchApi({\n method: 'GET',\n url: Config.apiUrl + '/quiz/' + quizUuid + '/questions',\n });\n }\n\n static getQuizStats(quizUuid: string) {\n return fetchApi({\n method: 'GET',\n url: Config.apiUrl + '/quiz/' + quizUuid + '/questions/stats',\n });\n }\n\n static getQuestion(quizUuid: string, questionUuid: string) {\n return fetchApi({\n method: 'GET',\n url: Config.apiUrl + '/quiz/' + quizUuid + '/questions/' + questionUuid,\n });\n }\n\n static createQuestion(quizUuid: string, question: Partial) {\n return fetchApi({\n method: 'POST',\n url: Config.apiUrl + '/quiz/' + quizUuid + '/questions',\n data: {\n name: question.name,\n description: question.description,\n answers: question.answers,\n }\n });\n }\n\n static updateQuestion(quizUuid: string, question: Question) {\n return fetchApi({\n method: 'PUT',\n url: Config.apiUrl + '/quiz/' + quizUuid + '/questions/' + question.uuid,\n data: {\n name: question.name,\n description: question.description,\n answers: question.answers,\n }\n });\n }\n\n static deleteQuestion(quizUuid: string, questionUuid: string) {\n return fetchApi({\n method: 'DELETE',\n url: Config.apiUrl + '/quiz/' + quizUuid + '/questions/' + questionUuid,\n });\n }\n\n static orderQuestion(quizUuid: string, questionUuid: string, relativeOrder: number) {\n return fetchApi({\n method: 'POST',\n url: Config.apiUrl + '/quiz/' + quizUuid + '/questions/' + questionUuid + '/order',\n data: {\n relativeOrder\n },\n });\n }\n}\n","import { hideLoading, showLoading } from 'react-redux-loading-bar';\nimport { Dispatch } from 'redux';\nimport { AppThunk } from '..';\nimport { Question } from '../../models/question.model';\nimport QuestionService from '../../services/question.service';\nimport {\n deleteQuestionSuccess, editQuestionFailure, editQuestionLoading, editQuestionSuccess, getQuestionsSuccess, getQuestionSuccess, getQuizStatsSuccess, setSelectedQuestion\n} from './adminQuestions.slice';\n\n\nexport const selectQuestion = (question: Question) => setSelectedQuestion(question);\n\nexport const deselectQuestion = () => setSelectedQuestion(null);\n\n\nexport const fetchQuestions = (quizUuid: string): AppThunk => async dispatch => {\n try {\n dispatch(getQuizStatsSuccess(null));\n dispatch(showLoading());\n QuestionService.getQuestions(quizUuid)\n .then(quiz => {\n dispatch(getQuestionsSuccess(quiz));\n });\n\n QuestionService.getQuizStats(quizUuid)\n .then(quizStats => {\n dispatch(getQuizStatsSuccess(quizStats));\n });\n } catch (e) {\n console.log(e);\n } finally {\n dispatch(hideLoading());\n }\n};\n\nexport const fetchQuestion = (quizUuid: string, questionUuid: string): AppThunk => async dispatch => {\n try {\n dispatch(showLoading());\n const question = await QuestionService.getQuestion(quizUuid, questionUuid);\n dispatch(getQuestionSuccess(question));\n } finally {\n dispatch(hideLoading());\n }\n};\n\nexport const updateQuestion = (quizUuid: string, question: Question): AppThunk => async dispatch => {\n try {\n dispatch(editQuestionLoading());\n dispatch(showLoading());\n await QuestionService.updateQuestion(quizUuid, question);\n const updatedQuestion = await QuestionService.getQuestion(quizUuid, question.uuid);\n dispatch(getQuestionSuccess(updatedQuestion));\n dispatch(editQuestionSuccess());\n dispatch(setSelectedQuestion(null));\n } catch (e) {\n dispatch(editQuestionFailure(e.message));\n } finally {\n dispatch(hideLoading());\n }\n};\n\n\nexport const createQuestion = (quizUuid: string, question: Partial): AppThunk => async dispatch => {\n try {\n dispatch(editQuestionLoading());\n dispatch(showLoading());\n const createdQuestion = await QuestionService.createQuestion(quizUuid, question);\n dispatch(getQuestionSuccess(createdQuestion));\n dispatch(editQuestionSuccess());\n dispatch(setSelectedQuestion(null));\n } catch (e) {\n dispatch(editQuestionFailure(e.message));\n } finally {\n dispatch(hideLoading());\n }\n};\n\nexport const deleteQuestion = (quizUuid: string, questionUuid: string) => async (dispatch: Dispatch) => {\n try {\n dispatch(editQuestionLoading());\n dispatch(showLoading());\n await QuestionService.deleteQuestion(quizUuid, questionUuid);\n dispatch(deleteQuestionSuccess(questionUuid));\n dispatch(editQuestionSuccess());\n dispatch(setSelectedQuestion(null));\n } catch (e) {\n dispatch(editQuestionFailure(e.message));\n } finally {\n dispatch(hideLoading());\n }\n};\n\nexport const moveQuestion = (quizUuid: string, questionUuid: string, direction: number): AppThunk> => async dispatch => {\n await QuestionService.orderQuestion(quizUuid, questionUuid, direction);\n const quiz = await QuestionService.getQuestions(quizUuid);\n dispatch(getQuestionsSuccess(quiz));\n};\n","export type ApiErrorMessageMap = {[apiError: string]: string};\n\nconst errors: {[apiError: string]: string} = {\n Unauthorized: 'Vous n\\'avez pas accès à cette page.',\n 'The quiz has not started yet.': \"Le quiz n'a pas encore démarré.\",\n 'Request failed with status code 500': 'Une erreur interne est survenue.',\n};\n\nexport const getApiErrorMessage = (error: any, defaultError?: string | ApiErrorMessageMap) => {\n const message: string = error.response?.data?.message\n ?? error.response?.data?.error\n ?? error.message\n ?? (typeof defaultError === 'string' && defaultError)\n ?? 'Une erreur est survenue.';\n const allErrors = {\n ...errors,\n ...(typeof defaultError === 'object' ? defaultError : {})\n };\n if (message && allErrors[message]) {\n return allErrors[message];\n }\n return message;\n};\n","import { fetchApi } from './api.service';\nimport Config from '../constants/config';\nimport { Session } from '../models/session.model';\nimport { Quiz } from '../models/quiz.model';\n\nexport default class QuizService {\n static getHomeQuizzes() {\n return fetchApi({\n method: 'GET',\n url: Config.apiUrl + '/quiz/home',\n });\n }\n\n static getQuizzes() {\n return fetchApi({\n method: 'GET',\n url: Config.apiUrl + '/quiz',\n });\n }\n\n static getQuiz(quizUuid: string) {\n return fetchApi({\n method: 'GET',\n url: Config.apiUrl + '/quiz/' + quizUuid,\n });\n }\n\n static startQuiz(quizUuid: string, username: string): Promise {\n return fetchApi({\n method: 'POST',\n url: Config.apiUrl + '/quiz/' + quizUuid + '/start',\n data: {\n username,\n }\n });\n }\n\n static createQuiz(quiz: Partial): Promise {\n return fetchApi({\n method: 'POST',\n url: Config.apiUrl + '/quiz',\n data: {\n name: quiz.name,\n subtitle: quiz.subtitle,\n description: quiz.description,\n visible: quiz.visible,\n featured: quiz.featured,\n startDate: quiz.startDate,\n }\n });\n }\n\n static updateQuiz(quiz: Partial): Promise {\n return fetchApi({\n method: 'PUT',\n url: Config.apiUrl + '/quiz/' + quiz.uuid,\n data: {\n name: quiz.name,\n subtitle: quiz.subtitle,\n description: quiz.description,\n visible: quiz.visible,\n featured: quiz.featured,\n startDate: quiz.startDate,\n endPages: quiz.endPages,\n }\n });\n }\n\n static deleteQuiz(quizUuid: string) {\n return fetchApi({\n method: 'DELETE',\n url: Config.apiUrl + '/quiz/' + quizUuid,\n });\n }\n\n static uploadQuizImage(quizUuid: string, file: File) {\n const data = new FormData();\n data.append('image', file);\n return fetchApi({\n method: 'PUT',\n url: Config.apiUrl + '/quiz/' + quizUuid + '/image',\n data\n });\n }\n}\n","import { LocalStoreService } from './local-store.service';\nimport { LOCAL_STORE_SESSIONS, LOCAL_STORE_CURRENT_SESSION } from '../constants/store';\nimport { Session } from '../models/session.model';\nimport { fetchApi } from './api.service';\nimport Config from '../constants/config';\n\nexport default class SessionService {\n static loadSessionFromStorage(quizUuid: string): Session | null {\n const sessions = LocalStoreService.getItem(LOCAL_STORE_SESSIONS, {});\n if (sessions[quizUuid]) {\n // Load session\n return sessions[quizUuid];\n }\n return null;\n }\n\n static saveSessionToStorage(quizUuid: string, session: Session) {\n const sessions = LocalStoreService.getItem(LOCAL_STORE_SESSIONS, {});\n sessions[quizUuid] = session;\n LocalStoreService.setItem(LOCAL_STORE_SESSIONS, sessions);\n }\n\n static getLastSessionFromStorage(): Session | null {\n return LocalStoreService.getItem(LOCAL_STORE_CURRENT_SESSION, null);\n }\n\n static saveLastSessionToStorage(session: Session) {\n LocalStoreService.setItem(LOCAL_STORE_CURRENT_SESSION, session);\n }\n\n static getSession(sessionUuid: string) {\n return fetchApi({\n method: 'GET',\n url: Config.apiUrl + '/session',\n headers: {\n 'X-Session-UUID': sessionUuid\n }\n });\n }\n\n static getSessionQuestion(sessionUuid: string, questionUuid: string) {\n return fetchApi({\n method: 'GET',\n url: Config.apiUrl + '/session/question/' + questionUuid,\n headers: {\n 'X-Session-UUID': sessionUuid\n }\n });\n }\n\n static getEndPage(sessionUuid: string) {\n return fetchApi({\n method: 'GET',\n url: Config.apiUrl + '/session/end',\n headers: {\n 'X-Session-UUID': sessionUuid\n }\n });\n }\n\n static checkAnswer(sessionUuid: string, questionUuid: string, answer: string) {\n return fetchApi({\n method: 'POST',\n url: Config.apiUrl + '/session/question/' + questionUuid + '/answer',\n headers: {\n 'X-Session-UUID': sessionUuid,\n },\n data: {\n answer\n }\n });\n }\n}\n","import moment from 'moment';\nimport { hideLoading, showLoading } from 'react-redux-loading-bar';\nimport { toast } from 'react-toastify';\nimport { AppThunk } from '..';\nimport { getApiErrorMessage } from '../../helpers/error-message';\nimport { history } from '../../helpers/history';\nimport { Session } from '../../models/session.model';\nimport SessionService from '../../services/session.service';\nimport {\n setCheckAnswerLoading, setCheckAnswerSuccess, setEndPageFailed, setEndPagePending, setEndPageSuccess, setLastAttempt, setNextAllowedTry, setSession, setSessionQuestion, setSessionQuestionFailed, setSessionQuestionLoading\n} from './session.slice';\n\nexport const redirectToQuestion = (session: Session): AppThunk => async dispatch => {\n // Load current question into storage\n SessionService.saveLastSessionToStorage(session);\n // Load session data (next question)\n const sessionData = await SessionService.getSession(session.uuid);\n if (sessionData.hasFinishedQuiz) {\n history.push('/main/end');\n } else {\n history.push('/main/' + sessionData.questionUuid);\n }\n};\n\n/** Load a session from local storage */\nexport const loadSessionFromStorage = (quizUuid: string): AppThunk => dispatch => {\n const session = SessionService.loadSessionFromStorage(quizUuid);\n dispatch(setSession(session));\n};\n\n/** Load the last session from local storage */\nexport const loadLastSessionFromStorage = (): AppThunk => dispatch => {\n const lastSession = SessionService.getLastSessionFromStorage();\n if (!lastSession) {\n throw new Error('Last session not found');\n }\n dispatch(setSession(lastSession));\n};\n\n\n/** Load the game */\nexport const loadGame = (): AppThunk => async dispatch => {\n try {\n dispatch(loadLastSessionFromStorage());\n } catch (e) {\n // Failed to load the question\n // Redirect to home\n toast.error('Impossible de charger la session courante.');\n history.push('/');\n }\n};\n\nexport const fetchSessionQuestion = (questionUuid: string): AppThunk => async (dispatch, getState) => {\n const { session } = getState();\n if (!session.session) return;\n dispatch(showLoading());\n dispatch(setSessionQuestionLoading());\n try {\n const question = await SessionService.getSessionQuestion(session.session.uuid, questionUuid);\n dispatch(setSessionQuestion(question));\n } catch (e) {\n dispatch(setSessionQuestionFailed());\n\n // Failed to load the question\n // Redirect to home\n toast.error('Impossible de charger la question.');\n history.push('/');\n } finally {\n dispatch(hideLoading());\n }\n};\n\nexport const checkAnswer = (questionUuid: string, answer: string): AppThunk> => async (dispatch, getState) => {\n const { session } = getState();\n if (!session.session) return null;\n\n dispatch(setCheckAnswerLoading());\n\n try {\n const check = await SessionService.checkAnswer(session.session.uuid, questionUuid, answer);\n if (check.isCorrect) {\n return true;\n }\n // Wrong answer\n // Set next allowed try\n dispatch(setLastAttempt(moment().valueOf()));\n dispatch(setNextAllowedTry(moment().add(check.cooldown, 'seconds').valueOf()));\n return false;\n } catch (e) {\n toast.error('Impossible de valider, merci de réessayer.');\n } finally {\n dispatch(setCheckAnswerSuccess());\n }\n return null;\n};\n\nexport const fetchEndPage = (): AppThunk => async (dispatch, getState) => {\n const { session } = getState();\n if (!session.session) return;\n try {\n dispatch(setEndPagePending());\n const endPage = await SessionService.getEndPage(session.session.uuid);\n dispatch(setEndPageSuccess(endPage));\n } catch (e) {\n toast.error(getApiErrorMessage(e));\n dispatch(setEndPageFailed());\n }\n};\n","import { hideLoading, showLoading } from 'react-redux-loading-bar';\nimport { toast } from 'react-toastify';\nimport { AppThunk } from '..';\nimport { getApiErrorMessage } from '../../helpers/error-message';\nimport { Session } from '../../models/session.model';\nimport QuizService from '../../services/quiz.service';\nimport SessionService from '../../services/session.service';\nimport { redirectToQuestion } from '../session/session.actions';\nimport { setSession } from '../session/session.slice';\nimport {\n getQuizSuccess, startQuizLoading, startQuizSuccess, getQuizPending\n} from './quiz.slice';\n\nexport const fetchQuiz = (quizUuid: string): AppThunk => async dispatch => {\n try {\n dispatch(getQuizPending());\n dispatch(showLoading());\n const quiz = await QuizService.getQuiz(quizUuid);\n dispatch(getQuizSuccess(quiz));\n } catch (e) {\n toast.error(getApiErrorMessage(e));\n } finally {\n dispatch(hideLoading());\n }\n};\n\nexport const startQuiz = (quizUuid: string, username: string): AppThunk => async dispatch => {\n dispatch(startQuizLoading());\n try {\n // Create the session online\n const session = await QuizService.startQuiz(quizUuid, username);\n // Save it in local store\n SessionService.saveSessionToStorage(quizUuid, session);\n dispatch(setSession(session));\n // Redirect to the game\n await dispatch(redirectToQuestion(session));\n } catch (e) {\n toast.error(getApiErrorMessage(e, 'Impossible de charger le quiz. Merci de réessayer plus tard.'));\n } finally {\n dispatch(startQuizSuccess());\n }\n};\n\nexport const resumeQuiz = (session: Session): AppThunk => async dispatch => {\n dispatch(startQuizLoading());\n try {\n // Redirect to the game\n await dispatch(redirectToQuestion(session));\n } catch (e) {\n toast.error(getApiErrorMessage(e, 'Impossible de charger le quiz. Votre session a peut-être expiré.'));\n } finally {\n dispatch(startQuizSuccess());\n }\n};\n","import React from 'react';\nimport './Loader.scss';\n\nexport class Loader extends React.Component {\n render() {\n return (\n
\n
\n
\n
\n
\n
\n );\n }\n}\n","import { FieldArray, Form as FormikForm, Formik } from 'formik';\nimport React, { Component } from 'react';\nimport { Button, Form } from 'react-bootstrap';\nimport { connect } from 'react-redux';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport swal from 'sweetalert';\nimport * as Yup from 'yup';\nimport { Loader } from '../../../components/Loader/Loader';\nimport { Question } from '../../../models/question.model';\nimport {\n createQuestion, deselectQuestion, updateQuestion, deleteQuestion\n} from '../../../store/adminQuestions/adminQuestions.actions';\nimport { RootState } from '../../../store/rootReducer';\n\ninterface EditQuestionForm {\n name: string;\n description: string;\n answers: string[];\n}\n\nconst QuestionSchema = Yup.object().shape({\n name: Yup.string().required('Vous devez entrer le nom de la question.'),\n});\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n deselectQuestion,\n updateQuestion,\n createQuestion,\n deleteQuestion,\n}, dispatch);\n\nconst mapStateToProps = ({ adminQuestions }: RootState) => {\n return {\n isLoading: adminQuestions.editQuestionLoading\n };\n};\n\nexport interface EditQuestionProps\n extends ReturnType,\n ReturnType {\n question: Question;\n}\n\nclass EditQuestion extends Component {\n constructor(props: EditQuestionProps) {\n super(props);\n\n this.onSubmit = this.onSubmit.bind(this);\n this.deleteQuestion = this.deleteQuestion.bind(this);\n }\n\n onSubmit(form: EditQuestionForm) {\n console.log('submit');\n const { question } = this.props;\n\n const editedQuestion = {\n ...question,\n name: form.name,\n description: form.description,\n answers: form.answers,\n };\n console.log(form);\n console.log(form.answers);\n\n if (question.uuid) {\n // Edit the question\n this.props.updateQuestion(question.quiz, editedQuestion);\n } else {\n // Create the question\n this.props.createQuestion(question.quiz, editedQuestion);\n }\n }\n\n deleteQuestion() {\n swal({\n dangerMode: true,\n title: 'Supprimer une question',\n text: 'Voulez-vous vraiment supprimer cette question ?',\n buttons: {\n cancel: {\n text: 'Fermer',\n value: null,\n visible: true,\n },\n confirm: {\n text: 'Supprimer',\n value: true,\n closeModal: false,\n },\n },\n }).then((rep) => {\n if (rep) {\n if (!this.props.question) return null;\n swal.close!();\n return this.props.deleteQuestion(this.props.question.quiz, this.props.question.uuid);\n // .then(() => {\n // swal.close!();\n // });\n }\n return null;\n });\n }\n\n render() {\n const { question, isLoading } = this.props;\n\n if (question === null) return
;\n\n return (\n
\n
\n \n
\n
\n
{ question.uuid ? 'Modifier une question' : 'Ajouter une question' }
\n
\n {({\n values, errors, touched, handleChange, handleBlur\n }) => (\n \n \n Nom de la question\n \n {errors.name && touched.name ? (\n {errors.name}\n ) : null}\n \n \n Description\n \n {errors.description && touched.description ? (\n {errors.description}\n ) : null}\n \n Réponses\n \n {arrayHelpers => (\n
\n {values.answers.map((answer, index) => (\n
\n
\n \n \n
\n
\n \n
\n
\n ))}\n \n
\n )}\n \n
\n
\n \n {question.uuid && }\n {isLoading && }\n
\n
\n )}\n
\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditQuestion);\n","import React, { Component } from 'react';\nimport { OverlayTrigger, Tooltip } from 'react-bootstrap';\nimport { AnswerMap } from '../../../models/question.model';\n\nexport interface QuestionAnswerListProps {\n answerMaps: AnswerMap[];\n}\n\nclass QuestionAnswerList extends Component {\n render() {\n const { answerMaps } = this.props;\n\n return (\n
    \n {answerMaps.map(answer => (\n
  • \n \n {Array.from(new Set(answer.sessions.map(session => session.username))).join(', ')}\n \n }\n >\n \n {answer.answer} : {answer.sessions.length} réponse{answer.sessions.length > 1 ? 's' : ''}\n \n \n {' '}\n
  • \n ))}\n
\n );\n }\n}\n\nexport default QuestionAnswerList;\n","import React, { Component } from 'react';\nimport { Button, OverlayTrigger, Tooltip } from 'react-bootstrap';\nimport { connect } from 'react-redux';\nimport { SlideDown } from 'react-slidedown';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport ReactMarkdown from 'react-markdown';\nimport { Question } from '../../../models/question.model';\nimport { selectQuestion, moveQuestion } from '../../../store/adminQuestions/adminQuestions.actions';\nimport { RootState } from '../../../store/rootReducer';\nimport './QuestionItem.scss';\nimport { Loader } from '../../../components/Loader/Loader';\nimport QuestionAnswerList from '../QuestionAnswerList/QuestionAnswerList';\n\nconst mapStateToProps = ({ adminQuestions }: RootState) => {\n return {\n stats: adminQuestions.quizStats?.stats ?? null,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n selectQuestion,\n moveQuestion,\n}, dispatch);\n\nexport interface QuestionItemProps\n extends ReturnType,\n ReturnType {\n question: Question;\n}\n\nexport interface QuestionItemState {\n open: boolean;\n}\n\nclass QuestionItem extends Component {\n constructor(props: QuestionItemProps) {\n super(props);\n\n this.state = {\n open: false,\n };\n\n this.toggleQuestion = this.toggleQuestion.bind(this);\n this.editQuestion = this.editQuestion.bind(this);\n }\n\n componentDidMount() {\n\n }\n\n toggleQuestion() {\n this.setState((prev) => ({ open: !prev.open }));\n }\n\n editQuestion() {\n this.props.selectQuestion(this.props.question);\n }\n\n getQuestionStats() {\n const { question, stats } = this.props;\n if (!stats || !stats[question.uuid]) return ;\n const stat = stats[question.uuid];\n return (\n
\n {question.answers.length === 0 && {' '} |}\n \n {stat.sessions.map(session => session.username).join(', ')}\n \n }\n >\n {stat.sessions.length}\n {' '} |\n {' '} {stat.nbCorrectAnswers} |\n {' '} {stat.nbIncorrectAnswers}\n
\n );\n }\n\n getQuestionAnswers() {\n const { question, stats } = this.props;\n if (!stats || !stats[question.uuid]) return ;\n const stat = stats[question.uuid];\n\n return (\n
\n
Bonnes réponses
\n \n
Mauvaises réponses
\n \n
\n );\n }\n\n render() {\n const { question } = this.props;\n const { open } = this.state;\n\n return (\n
\n
\n
\n {question.order}\n
\n this.props.moveQuestion(question.quiz, question.uuid, -1)}>\n this.props.moveQuestion(question.quiz, question.uuid, 1)}>\n
\n
\n
\n {question.name}\n
\n {this.getQuestionStats()}\n
\n {' '}\n \n
\n
\n \n {this.state.open ? (\n
\n
\n
\n \n
\n
\n {this.getQuestionAnswers()}\n
\n
\n
\n ) : null}\n
\n
\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(QuestionItem);\n","export const formatDuration = (secs: number) => {\n secs = Math.round(secs);\n let hours: any = Math.floor(secs / 3600);\n let minutes: any = Math.floor((secs - (hours * 3600)) / 60);\n let seconds: any = secs - (hours * 3600) - (minutes * 60);\n\n if (hours < 10) { hours = '0' + hours; }\n if (minutes < 10) { minutes = '0' + minutes; }\n if (seconds < 10) { seconds = '0' + seconds; }\n return hours + ':' + minutes + ':' + seconds;\n};\n","import moment from 'moment';\nimport React, { Component } from 'react';\nimport { formatDuration } from '../../../helpers/format-duration';\nimport { UserRank } from '../../../models/question.model';\n\n\nexport interface QuizRankProps {\n rank: UserRank[];\n}\n\nexport default class QuizRank extends Component {\n render() {\n return (\n
\n \n \n \n \n \n \n \n \n \n {this.props.rank.map((rank, index) => (\n \n \n \n ))}\n \n
#PseudoQuestion (ou temps)
{index + 1}{rank.username}{rank.order\n ? ('Question ' + rank.order)\n : formatDuration(\n moment.duration(\n moment(rank.lastCheck).diff(rank.createdAt)\n ).asSeconds()\n )}
\n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport {\n Button, Col, Container, Row\n} from 'react-bootstrap';\nimport { connect } from 'react-redux';\nimport { RouteComponentProps } from 'react-router';\nimport {\n Bar, BarChart, Legend, ResponsiveContainer, XAxis, YAxis\n} from 'recharts';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport SlidingPanel, { PanelType } from '../../components/SlidingPanel/SlidingPanel';\nimport { deselectQuestion, fetchQuestions, selectQuestion } from '../../store/adminQuestions/adminQuestions.actions';\nimport { fetchQuiz } from '../../store/quiz/quiz.actions';\nimport { RootState } from '../../store/rootReducer';\nimport EditQuestion from './EditQuestion/EditQuestion';\nimport QuestionItem from './QuestionItem/QuestionItem';\nimport QuizRank from './QuizRank/QuizRank';\n\n\nconst mapStateToProps = ({ quiz, adminQuestions }: RootState) => {\n // Chart - sessions per question\n const chartData = [];\n\n const { selectedQuestion, questions, quizStats } = adminQuestions;\n\n if (questions && quizStats) {\n for (const question of questions) {\n if (quizStats.stats[question.uuid]) {\n chartData.push({\n name: question.order,\n sessions: quizStats.stats[question.uuid].sessions.length\n });\n }\n }\n }\n\n return {\n quiz: quiz.quiz,\n questions,\n quizStats,\n selectedQuestion,\n chartData,\n rank: quizStats?.rank ?? []\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n fetchQuiz,\n fetchQuestions,\n selectQuestion,\n deselectQuestion,\n}, dispatch);\n\ninterface AdminQuizQuestionsRouteParams {\n quizUuid: string;\n}\n\nexport interface AdminQuizQuestionsProps\n extends ReturnType,\n ReturnType,\n RouteComponentProps {\n\n}\n\nclass AdminQuizQuestions extends Component {\n constructor(props: AdminQuizQuestionsProps) {\n super(props);\n\n this.addQuestion = this.addQuestion.bind(this);\n this.reloadQuestions = this.reloadQuestions.bind(this);\n }\n\n componentDidMount() {\n const { quizUuid } = this.props.match.params;\n this.props.fetchQuiz(quizUuid);\n this.props.fetchQuestions(quizUuid);\n }\n\n addQuestion() {\n if (!this.props.quiz) return;\n\n this.props.selectQuestion({\n uuid: '',\n name: '',\n description: '',\n order: 0,\n answers: [],\n quiz: this.props.quiz.uuid,\n deletedAt: null,\n });\n }\n\n reloadQuestions() {\n const { quizUuid } = this.props.match.params;\n this.props.fetchQuestions(quizUuid);\n }\n\n render() {\n const {\n questions, selectedQuestion, quiz, chartData\n } = this.props;\n\n if (!quiz) return
;\n\n return (\n
\n { this.props.deselectQuestion(); }}\n >\n
\n \n
\n \n \n \n \n

{quiz.name}

\n
\n \n {' '}\n
\n \n \n {questions.map(question => (\n \n \n
\n ))}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AdminQuizQuestions);\n","import { hideLoading, showLoading } from 'react-redux-loading-bar';\nimport { AppThunk } from '..';\nimport { Quiz } from '../../models/quiz.model';\nimport QuizService from '../../services/quiz.service';\nimport {\n deleteQuizSuccess, editQuizFailure, editQuizLoading, editQuizSuccess, getAdminQuizSuccess, getQuizzesSuccess, setSelectedQuiz, AdminEditQuizView, setQuizView\n} from './adminQuizzes.slice';\n\n\nexport const selectQuiz = (quiz: Quiz) => setSelectedQuiz(quiz);\n\nexport const deselectQuiz = () => setSelectedQuiz(null);\n\nexport const setQuizViewAction = (view: AdminEditQuizView) => setQuizView(view);\n\nexport const fetchQuizzes = (): AppThunk => async dispatch => {\n try {\n dispatch(showLoading());\n const quizzes = await QuizService.getQuizzes();\n dispatch(getQuizzesSuccess(quizzes));\n } finally {\n dispatch(hideLoading());\n }\n};\n\n\nexport const createQuiz = (quiz: Partial, file?: File): AppThunk => async dispatch => {\n try {\n dispatch(editQuizLoading());\n const createdQuiz = await QuizService.createQuiz(quiz);\n if (file) {\n await QuizService.uploadQuizImage(createdQuiz.uuid, file);\n }\n dispatch(getAdminQuizSuccess(createdQuiz));\n dispatch(editQuizSuccess());\n dispatch(setSelectedQuiz(null));\n } catch (e) {\n dispatch(editQuizFailure());\n }\n};\n\nexport const updateQuiz = (quiz: Quiz, file?: File): AppThunk => async dispatch => {\n try {\n dispatch(editQuizLoading());\n await QuizService.updateQuiz(quiz);\n const updatedQuiz = await QuizService.getQuiz(quiz.uuid);\n if (file) {\n await QuizService.uploadQuizImage(quiz.uuid, file);\n }\n dispatch(getAdminQuizSuccess(updatedQuiz));\n dispatch(editQuizSuccess());\n dispatch(setSelectedQuiz(null));\n } catch (e) {\n dispatch(editQuizFailure());\n }\n};\n\nexport const deleteQuiz = (quizUuid: string): AppThunk => async dispatch => {\n try {\n dispatch(editQuizLoading());\n await QuizService.deleteQuiz(quizUuid);\n dispatch(deleteQuizSuccess(quizUuid));\n dispatch(editQuizSuccess());\n dispatch(setSelectedQuiz(null));\n } catch (e) {\n dispatch(editQuizFailure());\n }\n};\n","import { Form as FormikForm, Formik } from 'formik';\nimport React, { Component } from 'react';\nimport { Button, Form } from 'react-bootstrap';\nimport { connect } from 'react-redux';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport swal from 'sweetalert';\nimport * as Yup from 'yup';\nimport DatePicker from 'react-datepicker';\nimport { Loader } from '../../../components/Loader/Loader';\nimport { Quiz } from '../../../models/quiz.model';\nimport {\n createQuiz, deleteQuiz, deselectQuiz, updateQuiz\n} from '../../../store/adminQuizzes/adminQuizzes.actions';\nimport { RootState } from '../../../store/rootReducer';\nimport './EditQuiz.scss';\n\ninterface EditQuizForm {\n name: string;\n subtitle: string;\n description: string;\n visible: boolean;\n featured: boolean;\n enableStartDate: boolean;\n startDate: Date | null;\n}\n\nconst QuizSchema = Yup.object().shape({\n name: Yup.string().required('Vous devez entrer le nom du quiz.'),\n subtitle: Yup.string().required('Vous devez entrer un sous-titre.'),\n});\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n deselectQuiz,\n updateQuiz,\n createQuiz,\n deleteQuiz,\n}, dispatch);\n\nconst mapStateToProps = ({ adminQuizzes }: RootState) => {\n return {\n isLoading: adminQuizzes.editQuizLoading,\n };\n};\n\nexport interface EditQuizProps\n extends ReturnType,\n ReturnType {\n quiz: Quiz;\n}\n\nexport interface EditQuizState {\n selectedFile?: File,\n}\n\nclass EditQuiz extends Component {\n constructor(props: EditQuizProps) {\n super(props);\n\n this.state = {\n selectedFile: undefined,\n };\n\n this.onSubmit = this.onSubmit.bind(this);\n this.deleteQuiz = this.deleteQuiz.bind(this);\n this.onImageChange = this.onImageChange.bind(this);\n }\n\n async onSubmit(form: EditQuizForm) {\n const { quiz } = this.props;\n\n const editedQuiz = {\n ...quiz,\n name: form.name,\n subtitle: form.subtitle,\n description: form.description,\n visible: form.visible,\n featured: form.featured,\n startDate: (form.enableStartDate && form.startDate) ? form.startDate.toISOString() : null,\n };\n\n console.log(form);\n console.log(editedQuiz);\n\n if (quiz.uuid) {\n // Edit the quiz\n await this.props.updateQuiz(editedQuiz, this.state.selectedFile);\n } else {\n // Create the quiz\n await this.props.createQuiz(editedQuiz, this.state.selectedFile);\n }\n }\n\n onImageChange(event: any) {\n this.setState({\n selectedFile: event.target.files[0],\n });\n }\n\n deleteQuiz() {\n swal({\n dangerMode: true,\n title: 'Supprimer un quiz',\n text: 'Voulez-vous vraiment supprimer ce quiz ?',\n buttons: {\n cancel: {\n text: 'Fermer',\n value: null,\n visible: true,\n },\n confirm: {\n text: 'Supprimer',\n value: true,\n closeModal: false,\n },\n },\n }).then((rep) => {\n if (rep) {\n if (!this.props.quiz) return null;\n swal.close!();\n return this.props.deleteQuiz(this.props.quiz.uuid);\n // .then(() => {\n // swal.close!();\n // });\n }\n return null;\n });\n }\n\n render() {\n const { quiz, isLoading } = this.props;\n\n if (quiz === null) return
;\n\n return (\n
\n
\n \n
\n
\n
{ quiz.uuid ? 'Modifier un quiz' : 'Ajouter un quiz' }
\n {quiz.uuid &&
UUID: {quiz.uuid}
}\n
\n {({\n values, errors, touched, handleChange, handleBlur, setFieldValue\n }) => (\n \n \n Nom du quiz\n \n {errors.name && touched.name ? (\n {errors.name}\n ) : null}\n \n \n Sous-titre\n \n {errors.subtitle && touched.subtitle ? (\n {errors.subtitle}\n ) : null}\n \n \n Description\n \n {errors.description && touched.description ? (\n {errors.description}\n ) : null}\n \n \n \n \n {values.enableStartDate && \n setFieldValue('startDate', date)}\n showTimeSelect\n timeFormat=\"HH:mm\"\n dateFormat=\"dd/MM/yyyy HH:mm\"\n autoComplete=\"off\"\n />\n }\n \n \n \n \n \n \n \n Image\n
\n \n
\n
\n
\n
\n \n {quiz.uuid && }\n {isLoading && }\n
\n
\n )}\n
\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditQuiz);\n","import { FieldArray, Form as FormikForm, Formik } from 'formik';\nimport React, { Component } from 'react';\nimport { Button, Form } from 'react-bootstrap';\nimport { connect } from 'react-redux';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport { EndPage, Quiz } from '../../../models/quiz.model';\nimport { deselectQuiz, updateQuiz } from '../../../store/adminQuizzes/adminQuizzes.actions';\nimport { RootState } from '../../../store/rootReducer';\n\ninterface EditEndPagesForm {\n endPages: EndPage[];\n}\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n deselectQuiz,\n updateQuiz,\n}, dispatch);\n\nconst mapStateToProps = ({ adminQuizzes }: RootState) => {\n return {\n isLoading: adminQuizzes.editQuizLoading,\n };\n};\n\nexport interface EditEndPagesProps\n extends ReturnType,\n ReturnType {\n quiz: Quiz;\n}\n\nclass EditEndPages extends Component {\n constructor(props: EditEndPagesProps) {\n super(props);\n\n this.onSubmit = this.onSubmit.bind(this);\n }\n\n onSubmit(form: EditEndPagesForm) {\n const { quiz } = this.props;\n\n const editedQuiz = {\n ...quiz,\n endPages: form.endPages.map(endPage => ({\n from: endPage.from,\n to: endPage.to,\n description: endPage.description,\n })),\n };\n\n this.props.updateQuiz(editedQuiz);\n }\n\n render() {\n const { quiz, isLoading } = this.props;\n\n if (quiz === null) return
;\n\n return (\n
\n
\n \n
\n
\n
Modifier les pages de fin
\n
\n {({\n values, errors, touched, handleChange, handleBlur, setFieldValue\n }) => (\n \n \n {arrayHelpers => (\n
\n {values.endPages.map((endPage, index) => (\n
\n
\n
\n \n
\n
\n \n
\n
\n \n \n \n
\n
\n
\n \n
\n
\n ))}\n \n
\n )}\n \n
\n
\n \n
\n
\n )}\n
\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditEndPages);\n","import React, { Component } from 'react';\nimport {\n Button, Col, Container, Row\n} from 'react-bootstrap';\nimport { connect } from 'react-redux';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport {\n fetchQuizzes, selectQuiz, deselectQuiz, setQuizViewAction\n} from '../../store/adminQuizzes/adminQuizzes.actions';\nimport { RootState } from '../../store/rootReducer';\nimport './AdminQuizzes.scss';\nimport SlidingPanel, { PanelType } from '../../components/SlidingPanel/SlidingPanel';\nimport EditQuiz from './EditQuiz/EditQuiz';\nimport { Quiz } from '../../models/quiz.model';\nimport { AdminEditQuizView } from '../../store/adminQuizzes/adminQuizzes.slice';\nimport EditEndPages from './EditEndPages/EditEndPages';\n\nconst mapStateToProps = ({ adminQuizzes }: RootState) => {\n return {\n quizzes: adminQuizzes.quizzes,\n selectedQuiz: adminQuizzes.selectedQuiz,\n quizView: adminQuizzes.quizView,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n fetchQuizzes,\n selectQuiz,\n deselectQuiz,\n setQuizViewAction,\n}, dispatch);\n\nexport interface AdminQuizzesProps\n extends ReturnType,\n ReturnType {\n}\n\nclass AdminQuizzes extends Component {\n componentDidMount() {\n this.props.fetchQuizzes();\n }\n\n addQuiz() {\n this.props.selectQuiz({\n uuid: '',\n name: '',\n subtitle: '',\n description: '',\n startDate: null,\n visible: true,\n featured: true,\n features: [],\n endPages: [],\n deletedAt: null,\n imageName: null,\n });\n }\n\n editQuiz(quiz: Quiz) {\n this.props.setQuizViewAction(AdminEditQuizView.QuizView);\n this.props.selectQuiz(quiz);\n }\n\n editQuizEndPages(quiz: Quiz) {\n this.props.setQuizViewAction(AdminEditQuizView.EndPagesView);\n this.props.selectQuiz(quiz);\n }\n\n render() {\n const { quizzes, selectedQuiz } = this.props;\n\n return (\n
\n { this.props.deselectQuiz(); }}\n >\n
\n {this.props.quizView === AdminEditQuizView.QuizView && }\n {this.props.quizView === AdminEditQuizView.EndPagesView && }\n
\n \n \n \n \n

Mes quiz

\n
\n {' '}\n
\n \n {quizzes.map(quiz => (\n \n
\n
\n {quiz.name}
\n {quiz.description}\n
\n
\n \n \n {' '}\n {' '}\n \n
\n
\n \n ))}\n
\n
\n
\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AdminQuizzes);\n","import moment from 'moment';\nimport React, { Component } from 'react';\nimport { Col, Row } from 'react-bootstrap';\nimport ReactMarkdown from 'react-markdown';\nimport { connect } from 'react-redux';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport { Loader } from '../../components/Loader/Loader';\nimport { formatDuration } from '../../helpers/format-duration';\nimport { RootState } from '../../store/rootReducer';\nimport { fetchEndPage, loadGame } from '../../store/session/session.actions';\nimport './EndQuiz.scss';\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n loadGame,\n fetchEndPage,\n}, dispatch);\n\nconst mapStateToProps = ({ session }: RootState) => {\n return {\n loading: session.endPageLoading,\n endPage: session.endPage,\n session: session.session,\n };\n};\n\nexport interface EndQuizProps\n extends ReturnType,\n ReturnType {\n\n}\n\nclass EndQuiz extends Component {\n componentDidMount() {\n this.props.loadGame();\n this.loadEndPage();\n }\n\n loadEndPage() {\n this.props.fetchEndPage();\n }\n\n getEndPage() {\n const { endPage, session } = this.props;\n if (!endPage || !session) return null;\n\n return (\n
\n
\n \n
Votre classement :
\n \n {endPage.rank}\n {endPage.rank === 1 ? 'er' : 'ème'}\n \n
\n
\n Pseudo : {session.username} UUID: {session.uuid}
\n Temps : {\n formatDuration(\n moment.duration(\n moment(endPage.lastCheck).diff(endPage.createdAt)\n ).asSeconds()\n )}\n
\n {endPage.endDescription &&
\n \n
}\n
\n );\n }\n\n render() {\n const { loading } = this.props;\n\n return (\n
\n
\n \n \n

Fin du quiz

\n
Félicitations, vous avez terminé le quiz !
\n\n \n \n {loading ? : this.getEndPage()}\n \n
\n
\n
\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EndQuiz);\n","import { showLoading, hideLoading } from 'react-redux-loading-bar';\nimport { AppThunk } from '..';\nimport {\n getHomeQuizzesStart, getHomeQuizzesFailure, getHomeQuizzesSuccess\n} from './quizzes.slice';\nimport QuizService from '../../services/quiz.service';\n\nexport const fetchHomeQuizzes = (): AppThunk => async (dispatch) => {\n try {\n dispatch(showLoading());\n dispatch(getHomeQuizzesStart());\n const quizzes = await QuizService.getHomeQuizzes();\n dispatch(getHomeQuizzesSuccess(quizzes));\n } catch (e) {\n dispatch(getHomeQuizzesFailure(e.message));\n } finally {\n dispatch(hideLoading());\n }\n};\n","import React, { Component } from 'react';\nimport { Link } from 'react-router-dom';\nimport { getQuizImageUrl, Quiz } from '../../../models/quiz.model';\nimport './HomeCardQuiz.scss';\n\nexport interface HomeCardQuizProps {\n quiz: Quiz;\n}\n\nexport default class HomeCardQuiz extends Component {\n render() {\n const { quiz } = this.props;\n return (\n \n
\n
\n
\n
\n {quiz.name}\n
\n
\n {quiz.subtitle}\n
\n
\n
\n
\n \n );\n }\n}\n","import React, { Component } from 'react';\nimport { Button } from 'react-bootstrap';\nimport { Link } from 'react-router-dom';\nimport { getQuizImageUrl, Quiz } from '../../../models/quiz.model';\nimport './HomeFeaturedQuiz.scss';\n\nexport interface HomeFeaturedQuizProps {\n quiz: Quiz;\n}\n\nexport default class HomeFeaturedQuiz extends Component {\n render() {\n const { quiz } = this.props;\n return (\n \n
\n
\n
\n
\n {quiz.name}\n
\n
\n {quiz.subtitle}\n
\n
\n \n
\n
\n
\n
\n \n );\n }\n}\n","import React, { Component } from 'react';\nimport { Col, Container, Row } from 'react-bootstrap';\nimport { connect } from 'react-redux';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport { fetchHomeQuizzes } from '../../store/quizzes/quizzes.actions';\nimport { RootState } from '../../store/rootReducer';\nimport './Home.scss';\nimport HomeCardQuiz from './HomeCardQuiz/HomeCardQuiz';\nimport HomeFeaturedQuiz from './HomeFeaturedQuiz/HomeFeaturedQuiz';\n\nconst mapStateToProps = ({ quizzes }: RootState) => {\n return {\n quizzes: quizzes.homeQuizzes\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n fetchQuizzes: fetchHomeQuizzes,\n}, dispatch);\n\ninterface HomeProps\n extends ReturnType,\n ReturnType {\n\n}\n\nclass Home extends Component {\n componentDidMount() {\n this.props.fetchQuizzes();\n }\n\n render() {\n const { quizzes } = this.props;\n\n return (\n
\n \n
\n

Quiz du moment

\n
\n \n \n {quizzes.filter(quiz => quiz.featured).map(quiz => (\n \n ))}\n \n \n
\n

Liste des quiz

\n
\n \n {quizzes.filter(quiz => !quiz.featured).map(quiz => (\n \n \n ))}\n \n
\n
\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Home);\n","import { Form as FormikForm, Formik } from 'formik';\nimport React, { Component } from 'react';\nimport { Button, Col, Form } from 'react-bootstrap';\nimport { toast } from 'react-toastify';\nimport * as Yup from 'yup';\nimport { Loader } from '../../components/Loader/Loader';\nimport { getApiErrorMessage } from '../../helpers/error-message';\nimport { history } from '../../helpers/history';\nimport { AuthService } from '../../services/auth.service';\nimport QuizService from '../../services/quiz.service';\n\ninterface LoginForm {\n username: string;\n password: string;\n}\n\nconst LoginSchema = Yup.object().shape({\n username: Yup.string()\n .required('Vous devez entrer votre nom d\\'utilisateur.'),\n password: Yup.string().required('Vous devez entrer votre mot de passe.')\n});\n\nexport interface LoginProps {\n\n}\n\nexport interface LoginState {\n loading: boolean;\n}\n\nexport default class Login extends Component {\n constructor(props: LoginProps) {\n super(props);\n\n this.state = {\n loading: false,\n };\n\n this.onSubmit = this.onSubmit.bind(this);\n }\n\n onSubmit(form: LoginForm) {\n this.setState({ loading: true });\n AuthService.setCredentials(form.username, form.password);\n QuizService.getQuizzes()\n .then(rep => {\n history.push('/admin/quiz');\n })\n .catch(e => {\n toast.error(getApiErrorMessage(e));\n })\n .finally(() => {\n this.setState({ loading: false });\n });\n }\n\n render() {\n const { loading } = this.state;\n\n return (\n
\n
\n \n

Connexion

\n
\n Administration BrainQuiz\n
\n
\n \n {({\n values, errors, touched, handleChange, handleBlur\n }) => (\n \n \n Nom d'utilisateur\n \n {errors.username && touched.username ? (\n {errors.username}\n ) : null}\n \n \n Mot de passe\n \n {errors.password && touched.password ? (\n {errors.password}\n ) : null}\n \n
\n
\n \n {loading && }\n
\n
\n )}\n \n \n
\n
\n );\n }\n}\n","import { Form as FormikForm, Formik } from 'formik';\nimport React, { Component } from 'react';\nimport {\n Button, Col, Container, Form, Row\n} from 'react-bootstrap';\nimport ReactMarkdown from 'react-markdown';\nimport { connect } from 'react-redux';\nimport { RouteComponentProps } from 'react-router-dom';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport io from 'socket.io-client';\nimport * as Yup from 'yup';\nimport { toast } from 'react-toastify';\nimport { Loader } from '../../components/Loader/Loader';\nimport Config from '../../constants/config';\nimport { RootState } from '../../store/rootReducer';\nimport {\n checkAnswer, fetchSessionQuestion, loadGame, redirectToQuestion\n} from '../../store/session/session.actions';\nimport './MainQuiz.scss';\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n loadGame,\n fetchSessionQuestion,\n redirectToQuestion,\n checkAnswer,\n}, dispatch);\n\nconst mapStateToProps = ({ session }: RootState) => {\n return {\n session: session.session,\n question: session.question,\n loading: session.questionLoading,\n answerLoading: session.answerLoading,\n lastAttempt: session.lastAttempt,\n nextAllowedTry: session.nextAllowedTry,\n };\n};\n\ninterface MainQuizRouteParams {\n questionUuid: string;\n}\n\nexport interface MainQuizProps\n extends ReturnType,\n ReturnType,\n RouteComponentProps {\n\n}\n\nexport interface MainQuizState {\n buttonProgress: number;\n answerCorrect: boolean;\n}\n\ninterface MainQuizForm {\n answer: string;\n}\n\nconst AnswerSchema = Yup.object().shape({\n answer: Yup.string().required('Vous devez entrer une réponse.'),\n});\n\nclass MainQuiz extends Component {\n formikRef: any;\n\n buttonAnimationFrame: number | null = null;\n\n socket?: SocketIOClient.Socket;\n\n constructor(props: MainQuizProps) {\n super(props);\n\n this.state = {\n buttonProgress: 0,\n answerCorrect: false,\n };\n\n this.onSubmit = this.onSubmit.bind(this);\n }\n\n async componentDidMount() {\n this.props.loadGame();\n this.loadQuestion();\n\n // Socket.io\n const url = new URL(Config.apiUrl);\n let { pathname } = url;\n if (!pathname.endsWith('/')) pathname += '/';\n this.socket = io(url.host, { path: pathname + 'socket.io' });\n // this.socket = io(Config.apiUrl);\n this.socket.on('question_updated', (questionUuid: string) => {\n const currentQuestionUuid = this.props.match.params.questionUuid;\n if (questionUuid === currentQuestionUuid) {\n // Toast alert\n toast.info('Question mise à jour !', { autoClose: false });\n // Sound alert\n const audio = new Audio('/assets/sounds/alert.mp3');\n audio.play();\n // Load the question\n this.props.fetchSessionQuestion(currentQuestionUuid);\n }\n });\n }\n\n componentWillUnmount() {\n if (this.buttonAnimationFrame) {\n cancelAnimationFrame(this.buttonAnimationFrame);\n }\n\n if (this.socket) {\n this.socket.disconnect();\n }\n }\n\n\n componentDidUpdate(prevProps: MainQuizProps) {\n const { questionUuid } = this.props.match.params;\n\n if (prevProps.match.params.questionUuid !== questionUuid) {\n this.loadQuestion();\n }\n }\n\n async loadQuestion() {\n const { questionUuid } = this.props.match.params;\n // Question changed\n this.setState({ answerCorrect: false });\n // Reset answer input\n if (this.formikRef) {\n this.formikRef.resetForm();\n }\n // Load the question\n this.props.fetchSessionQuestion(questionUuid);\n }\n\n async onSubmit(form: MainQuizForm, setErrors: (err: any) => void) {\n if (!this.props.question) return;\n const isCorrect = await this.props.checkAnswer(this.props.question.uuid, form.answer);\n if (isCorrect) {\n this.onQuestionSuccess();\n } else if (isCorrect === false) {\n this.onQuestionFailure(setErrors);\n }\n }\n\n onQuestionSuccess() {\n // Correct answer\n this.setState({ answerCorrect: true });\n setTimeout(() => {\n // Go to next question\n this.props.redirectToQuestion(this.props.session!);\n }, Config.timeBeforeNextQuestion * 1000);\n }\n\n onQuestionFailure(setErrors: (err: any) => void) {\n // Display error\n setErrors({ answer: 'La réponse est incorrecte.' });\n // Set button cooldown\n const cooldownTime = this.props.nextAllowedTry - this.props.lastAttempt;\n const buttonAnimation = () => {\n const remainingTime = this.props.nextAllowedTry - Date.now();\n if (remainingTime > 0) {\n this.setState({ buttonProgress: (remainingTime / cooldownTime) * 100 });\n this.buttonAnimationFrame = requestAnimationFrame(buttonAnimation);\n } else {\n this.setState({ buttonProgress: 0 });\n this.buttonAnimationFrame = null;\n }\n };\n this.buttonAnimationFrame = requestAnimationFrame(buttonAnimation);\n }\n\n getButtonStyle(): React.CSSProperties {\n const { buttonProgress } = this.state;\n\n if (buttonProgress <= 0) return {};\n return {\n background: 'linear-gradient(to right, #3497fb ' + buttonProgress + '%, #147ee9 ' + buttonProgress + '%)',\n };\n }\n\n render() {\n const { loading, question, answerLoading } = this.props;\n const { answerCorrect, buttonProgress } = this.state;\n\n if (loading && !question) {\n return (\n \n );\n }\n\n if (!question) {\n return
;\n }\n\n return (\n
\n \n \n \n
\n
\n Question {question.order}\n
\n
\n
\n {question.name}\n
\n
\n \n
\n { this.formikRef = instance; }}\n initialValues={{\n answer: '',\n }}\n validateOnMount={true}\n validationSchema={AnswerSchema}\n onSubmit={(form, { setErrors }) => this.onSubmit(form, setErrors)}\n >{({\n values, errors, touched, handleChange, handleBlur,\n }) => (\n \n \n \n {!answerCorrect && errors.answer && touched.answer ? (\n {errors.answer}\n ) : null}\n {answerCorrect && (\n \n Bonne réponse ! Passage à la question suivante...\n )}\n \n
\n
\n 0 || answerCorrect}\n style={this.getButtonStyle()}>Envoyer\n
\n {answerLoading &&
\n \n
}\n
\n
\n )}\n \n
\n
\n
\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MainQuiz);\n","import React, { Component } from 'react';\nimport './Countdown.scss';\nimport moment from 'moment';\n\nexport interface CountdownProps {\n startDate: string | null;\n countdownEndContent?: React.ReactNode;\n countdownContent?: React.ReactNode;\n}\n\nexport interface CountdownState {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n showCountdown: boolean;\n}\n\nexport default class Countdown extends Component {\n private interval: NodeJS.Timeout | null = null;\n\n constructor(props: CountdownProps) {\n super(props);\n this.state = this.getStateFromProps();\n }\n\n getStateFromProps(): CountdownState {\n let duration = moment.duration(0);\n if (this.props.startDate) {\n duration = moment.duration(moment(this.props.startDate).diff(moment()));\n\n if (duration.asMilliseconds() <= 0) {\n duration = moment.duration(0);\n }\n }\n\n return {\n days: duration.days(),\n hours: duration.hours(),\n minutes: duration.minutes(),\n seconds: duration.seconds(),\n showCountdown: duration.asMilliseconds() > 0,\n };\n }\n\n componentDidMount() {\n this.setCountdownInterval();\n }\n\n componentWillUnmount() {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n componentDidUpdate(prevProps: CountdownProps) {\n if (prevProps.startDate !== this.props.startDate) {\n this.setState(this.getStateFromProps());\n this.clearCountdownInterval();\n this.setCountdownInterval();\n }\n }\n\n setCountdownInterval() {\n if (this.state.showCountdown) {\n this.interval = setInterval(() => {\n this.setState(this.getStateFromProps());\n if (!this.state.showCountdown) {\n this.clearCountdownInterval();\n }\n }, 500);\n }\n }\n\n clearCountdownInterval() {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n render() {\n const {\n days, hours, minutes, seconds, showCountdown\n } = this.state;\n\n if (!showCountdown) {\n return this.props.countdownEndContent ??
;\n }\n\n return (\n
\n {this.props.countdownContent ?? ''}\n
\n
\n
{Math.floor(days / 10)}
\n
{days % 10}
\n
\n
:
\n
\n
{Math.floor(hours / 10)}
\n
{hours % 10}
\n
\n
:
\n
\n
{Math.floor(minutes / 10)}
\n
{minutes % 10}
\n
\n
:
\n
\n
{Math.floor(seconds / 10)}
\n
{seconds % 10}
\n
\n
\n
\n
jour{days > 1 ? 's' : ''}
\n
heure{hours > 1 ? 's' : ''}
\n
minute{minutes > 1 ? 's' : ''}
\n
seconde{seconds > 1 ? 's' : ''}
\n
\n
\n );\n }\n}\n","import React, { Component, PropsWithChildren } from 'react';\nimport { Col, Container, Row } from 'react-bootstrap';\nimport { connect } from 'react-redux';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport { fetchQuiz } from '../../store/quiz/quiz.actions';\nimport { RootState } from '../../store/rootReducer';\nimport './QuizContainer.scss';\nimport { Quiz, getQuizImageUrl } from '../../models/quiz.model';\nimport { Loader } from '../Loader/Loader';\n\nconst mapStateToProps = ({ quiz }: RootState) => {\n return {\n quiz: quiz.quiz\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n fetchQuiz\n}, dispatch);\n\ninterface QuizProps\n extends ReturnType,\n ReturnType {\n quizUuid: string;\n builder: (quiz: Quiz) => React.ReactNode;\n}\n\nclass QuizContainer extends Component> {\n componentDidMount() {\n if (!this.props.quiz || this.props.quiz.uuid !== this.props.quizUuid) {\n this.props.fetchQuiz(this.props.quizUuid);\n }\n }\n\n render() {\n const { quiz, builder } = this.props;\n\n if (!quiz) {\n return
\n \n
;\n }\n\n return (\n
\n
\n
\n
\n \n \n \n
\n

{quiz.name}

\n
Par Samuel
\n
\n \n
\n
\n
\n
\n
\n
\n {builder(quiz)}\n
\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(QuizContainer);\n","import React, { Component } from 'react';\nimport { QuizFeatures } from '../../../models/quiz.model';\nimport './QuizFeature.scss';\n\nconst features: {[feature: string]:\n{ name: string, description: string, icon: string }} = {\n [QuizFeatures.Questions]: {\n name: 'Questions',\n description: 'Répondez aux questions posées pour avancer dans le quiz.',\n icon: 'fas fa-question-square',\n },\n [QuizFeatures.Speed]: {\n name: 'Rapidité',\n description: 'Soyez le premier à répondre aux questions.',\n icon: 'fas fa-clock',\n }\n};\n\nexport interface QuizFeatureProps {\n feature: QuizFeatures;\n}\n\nexport default class QuizFeature extends Component {\n render() {\n const feature = features[this.props.feature];\n if (!feature) return null;\n\n return (\n
\n
\n \n
\n
\n
{ feature.name }
\n
{ feature.description }
\n
\n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport {\n Button, Col, Container, Row\n} from 'react-bootstrap';\nimport ReactMarkdown from 'react-markdown';\nimport { connect } from 'react-redux';\nimport { Link, RouteComponentProps } from 'react-router-dom';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport Countdown from '../../components/Countdown/Countdown';\nimport QuizContainer from '../../components/QuizContainer/QuizContainer';\nimport { fetchQuiz } from '../../store/quiz/quiz.actions';\nimport { RootState } from '../../store/rootReducer';\nimport './Quiz.scss';\nimport QuizFeature from './QuizFeature/QuizFeature';\n\nconst mapStateToProps = ({ quiz }: RootState) => {\n return {\n quiz: quiz.quiz\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n fetchQuiz\n}, dispatch);\n\ninterface QuizRouteParams {\n quizUuid: string;\n}\n\ninterface QuizProps\n extends ReturnType,\n ReturnType,\n RouteComponentProps {\n}\n\ninterface QuizState {\n}\n\nclass Quiz extends Component {\n componentDidMount() {\n }\n\n render() {\n const { quizUuid } = this.props.match.params;\n\n return (\n (\n \n \n \n
\n

Détails

\n
\n \n
\n
\n \n \n {quiz.features.map(feature => )}\n \n
\n \n \n \n \n \n \n }\n countdownContent={
\n Le quiz démarre dans\n
}\n >\n \n \n
\n
\n )}>\n
\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Quiz);\n","import React, { Component } from 'react';\nimport {\n Button, Col, Container, Form, Row\n} from 'react-bootstrap';\nimport { connect } from 'react-redux';\nimport { RouteComponentProps } from 'react-router-dom';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport * as Yup from 'yup';\nimport { Formik, Form as FormikForm } from 'formik';\nimport { Loader } from '../../components/Loader/Loader';\nimport QuizContainer from '../../components/QuizContainer/QuizContainer';\nimport { fetchQuiz, resumeQuiz, startQuiz } from '../../store/quiz/quiz.actions';\nimport { RootState } from '../../store/rootReducer';\nimport { loadSessionFromStorage } from '../../store/session/session.actions';\nimport './QuizStart.scss';\n\nconst mapStateToProps = ({ quiz, session }: RootState) => {\n return {\n quiz: quiz.quiz,\n loading: quiz.startQuizLoading,\n session: session.session,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({\n fetchQuiz,\n startQuiz,\n resumeQuiz,\n loadSessionFromStorage,\n}, dispatch);\n\ninterface QuizStartRouteParams {\n quizUuid: string;\n}\n\ninterface QuizStartProps\n extends ReturnType,\n ReturnType,\n RouteComponentProps {\n}\n\ninterface QuizStartState {\n /** True if it should display the username input\n * even if there is a loaded session */\n createNewSession: boolean;\n}\n\ninterface QuizStartForm {\n username: string;\n}\n\nconst QuizStartSchema = Yup.object().shape({\n username: Yup\n .string()\n .trim()\n .required('Vous devez entrer votre pseudo.')\n .matches(/^[a-zA-Z0-9 _-À-ÖØ-öø-ÿÉÈ]+$/, 'Votre pseudo ne doit pas contenir de caractères spéciaux.'),\n});\n\nclass QuizStart extends Component {\n constructor(props: QuizStartProps) {\n super(props);\n\n this.state = {\n createNewSession: false,\n };\n\n this.startQuiz = this.startQuiz.bind(this);\n this.resumeQuiz = this.resumeQuiz.bind(this);\n }\n\n componentDidMount() {\n const { quizUuid } = this.props.match.params;\n\n // Load a session if one exists\n this.props.loadSessionFromStorage(quizUuid);\n }\n\n startQuiz(form: QuizStartForm) {\n if (form.username.length === 0) return;\n if (!this.props.quiz) return;\n\n this.props.startQuiz(this.props.quiz.uuid, form.username);\n }\n\n resumeQuiz() {\n if (this.props.loading) return;\n if (!this.props.session) return;\n this.props.resumeQuiz(this.props.session);\n }\n\n render() {\n const { quizUuid } = this.props.match.params;\n const { session, loading } = this.props;\n const { createNewSession } = this.state;\n\n return (\n (\n \n {createNewSession || !session\n ? \n \n {({\n values, errors, touched, handleChange, handleBlur, isValid,\n }) => (\n \n
\n

Rejoindre le quiz

\n
\n Entrez votre pseudo pour commencer le quiz.\n
\n
\n \n \n {errors.username && touched.username ? (\n {errors.username}\n ) : null}\n \n
\n
\n Rejoindre le quiz\n
\n {loading &&
\n \n
}\n
\n
\n )}\n \n \n
: \n \n
\n

Rejoindre le quiz

\n
\n Reprenez le quiz là où vous en étiez, ou commencez une nouvelle session.\n
\n
\n
\n
\n Reprendre en tant que {session.username}\n
\n {loading && }\n
\n \n
\n
\n
\n \n
\n \n
}\n
\n )}>\n
\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(QuizStart);\n","import { ConnectedRouter } from 'connected-react-router';\nimport React from 'react';\nimport { Provider } from 'react-redux';\nimport LoadingBar from 'react-redux-loading-bar';\nimport { Switch } from 'react-router-dom';\nimport { ToastContainer } from 'react-toastify';\nimport './App.scss';\nimport ReactGA from 'react-ga';\nimport Footer from './components/Footer/Footer';\nimport Header from './components/Header/Header';\nimport Page from './components/Page/Page';\nimport { history } from './helpers/history';\nimport store from './store';\nimport AdminQuizQuestions from './views/AdminQuizQuestions/AdminQuizQuestions';\nimport AdminQuizzes from './views/AdminQuizzes/AdminQuizzes';\nimport EndQuiz from './views/EndQuiz/EndQuiz';\nimport Home from './views/Home/Home';\nimport Login from './views/Login/Login';\nimport MainQuiz from './views/MainQuiz/MainQuiz';\nimport Quiz from './views/Quiz/Quiz';\nimport QuizStart from './views/QuizStart/QuizStart';\n\nReactGA.initialize('UA-88135025-4');\nReactGA.pageview(window.location.pathname + window.location.search);\n\nfunction App() {\n return (\n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n );\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost'\n // [::1] is the IPv6 localhost address.\n || window.location.hostname === '[::1]'\n // 127.0.0.0/8 are considered localhost for IPv4.\n || window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n process.env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service '\n + 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all '\n + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404\n || (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport * as serviceWorker from './serviceWorker';\nimport './assets/scss/_bootstrap.scss';\n\nconst render = () => {\n // eslint-disable-next-line global-require\n const App = require('./App').default;\n\n ReactDOM.render(\n ,\n document.getElementById('root')\n );\n};\n\nrender();\n\nif (process.env.NODE_ENV === 'development' && (module as any).hot) {\n (module as any).hot.accept('./App', render);\n}\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}