{"version":3,"sources":["redux/courses/coursesSlice.js","config.js","redux/tests/testsSlice.js","components/FormInput/index.js","helpers/Api.js","redux/users/usersSlice.js","helpers/useQuery.js","redux/exercises/exercisesSlice.js","helpers/Misc.js","helpers/AuthService.js","components/PrivateRoute/index.js","components/Login/index.js","helpers/analytics.js","routes.js","containers/TheContent.js","containers/TheFooter.js","redux/sidebar/sidebarSlice.js","containers/TheHeader.js","logo_purple.png","logo_symbol_purple.png","containers/_admin_nav.js","containers/_user_nav.js","containers/TheSidebar.js","logo_white.png","logo_symbol_white.png","containers/TheLayout.js","helpers/useGoogleAnalytics.js","components/ResetPassword/index.js","components/SetPassword/index.js","App.js","app/store.js","index.js","redux/login/loginSlice.js","helpers/useForm.js"],"names":["getAllCoursesAsync","createAsyncThunk","arg","thunkAPI","a","Api","getAllCourses","data","handleReduxErrorCase","getEnrolledCourseAsync","getEnrolledCourse","getEnrollmentForCourseAsync","cid","getEnrollmentForCourse","getCourseAsync","failedCb","getCourse","response","status","addCourseAsync","course","addCourse","updateCourseAsync","successCb","updateCourse","deleteCourseAsync","deleteCourse","enrollCourseAsync","enrollCourse","unenrollCourseAsync","unenrollCourse","enrollUsersToCourseAsync","progressCb","enrollUserToCourseCSV","res","unenrollUsersFromCourseAsync","students","unenrollUserFromCourse","coursesSlice","createSlice","name","initialState","courses","loading","reducers","extraReducers","builder","addCase","pending","state","fulfilled","action","payload","convertArrayToObj","meta","_id","oldCourse","updatedCourse","Object","assign","rejected","oldStudents","updatedStudents","uid","includes","push","module","exports","SERVER_HOST","TECHNOLOGY_LIST","r","python","javascript","react","ejb","war","getTestsForExerciseAsync","eid","getTestsForExercise","addTestAsync","test","addTest","deleteTestAsync","tid","deleteTest","deleteMassTestAsync","tids","updateTestAsync","updateTest","testsSlice","tests","exercise_id","updatedTests","map","t","filter","FormInput","string","innerRef","label","smallLabel","placeholder","value","handleChange","handleChangeDate","type","rows","required","mapping","charAt","toUpperCase","slice","row","md","htmlFor","xs","id","onChange","autoComplete","className","color","checked","variant","tabIndex","shape","labelOn","labelOff","custom","keys","k","index","isMulti","options","styles","control","provided","outline","boxShadow","isFocused","theme","colors","primary","selected","showTimeSelect","dateFormat","minDate","Date","generateAuthHeaders","headers","Authorization","AuthService","getAccessToken","login","email","password","axios","post","requestresetpassword","checkhash","hash","resetpassword","get","getSubmission","sid","patch","delete","setPublishCourse","published","getExercisesForCourse","addExercise","exercise","course_id","getExercise","deleteExercise","updateExercise","getMyCourses","uploadFilesToExercise","files","progress","onUploadProgress","uploadTestscriptsToExercise","deleteFilesOfExercise","deleteTestscriptsOfExercise","testscripts","downloadTestscripts","testscript","url","method","responseType","then","window","URL","createObjectURL","Blob","link","document","createElement","href","setAttribute","body","appendChild","click","downloadSubmissionFile","filename","getMySubmissions","skip","limit","sort_column","sort_order","getSubmissions","user_id","deleteSubmission","clearstatusSubmission","getAllUsers","deleteUser","updateUser","user","addUser","getUser","uploadUsersCSV","file","makeExerciseSubmission","getExerciseSubmissionCount","getCurrentUser","updateCurrentUser","generatePasswordForUser","getCourseReportNosubmission","getCourseReport","getExercisesReportNosubmission","ids","getAllUsersAsync","filters","getUserAsync","deleteUserAsync","updateUserAsync","addUserAsync","uploadUsersCSVAsync","usersSlice","users","currentUsers","total","u","i","length","updatedUser","student","useQuery","URLSearchParams","useLocation","search","getExercisesForCourseAsync","dispatch","logout","alert","rejectWithValue","message","addExerciseAsync","deleteExerciseAsync","updateExerciseAsync","switchOrderingOfExercisesAsync","e1","e2","e1Order","order","e2Order","uploadFilesToExerciseAsync","uploadTestscriptsToExerciseAsync","deleteFilesOfExerciseAsync","deleteTestscriptsOfExerciseAsync","exercisesSlice","exercises","updatedExercises","e","updatedFiles","updatedTestscripts","thisExercise","f","array","obj","error","ACCESS_TOKEN_KEY","isLoggedIn","localStorage","getItem","getUid","parseInt","accessToken","role","setItem","removeItem","isAdmin","PrivateRoute","Component","component","authed","requireAdmin","rest","useSelector","render","props","to","pathname","from","location","Login","useState","setError","useDispatch","useForm","preventDefault","history","onSubmit","autoFocus","disabled","init","ReactGA","initialize","debug","process","sendEvent","event","sendPageview","path","set","page","pageview","UserProfile","React","lazy","Home","CourseList","routes","exact","adminOnly","TheContent","fluid","fallback","route","idx","memo","TheFooter","fixed","sidebarSlice","show","toggle","actions","withRouter","sidebar","withSubheader","inHeader","onClick","val","src","height","block","alt","prompt_change_password","closeButton","_admin_nav","_tag","icon","customClasses","_children","_user_nav","TheSidebar","navigationConfig","adminNavigation","userNavigation","onShowChange","items","components","CSidebarNavDivider","CSidebarNavDropdown","CSidebarNavItem","CSidebarNavTitle","useEffect","analytics","currentPath","useGoogleAnalytics","query","cpassword","opassword","passwordRef","useRef","setLoading","checkHash","current","focus","checkPassword","App","ResetPassword","SetPassword","TheLayout","store","configureStore","reducer","loginReducer","sidebarReducer","coursesReducer","exercisesReducer","testsReducer","usersReducer","icons","cilPencil","cilPeople","cilCloudUpload","cilUser","cilLockLocked","cilSchool","cilCode","cilGauge","cilGraph","cilChevronBottom","cilChevronTop","cilFile","cilXCircle","ReactDOM","StrictMode","getElementById","getCurrentUserAsync","updateCurrentUserAsync","loginSlice","console","log","initialValues","values","setValues","target"],"mappings":"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","file":"static/js/main.b239a499.chunk.js","sourcesContent":["import { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport Api from \"../../helpers/Api\";\nimport { convertArrayToObj, handleReduxErrorCase } from \"../../helpers/Misc\";\n\nexport const getAllCoursesAsync = createAsyncThunk(\n \"courses/getAllCourses\",\n //arg is not used\n async (arg, thunkAPI) => {\n try {\n const { data } = await Api.getAllCourses();\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const getEnrolledCourseAsync = createAsyncThunk(\n \"courses/getEnrolledCourse\",\n //arg is not used\n async (arg, thunkAPI) => {\n try {\n const { data } = await Api.getEnrolledCourse();\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const getEnrollmentForCourseAsync = createAsyncThunk(\n \"courses/getEnrollmentForCourse\",\n //arg is not used\n async (cid, thunkAPI) => {\n try {\n const { data } = await Api.getEnrollmentForCourse(cid);\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const getCourseAsync = createAsyncThunk(\n \"courses/getCourse\",\n async ({ cid, failedCb }, thunkAPI) => {\n try {\n const { data } = await Api.getCourse(cid);\n return data;\n } catch (e) {\n if (e.response.status === 404) {\n if (failedCb) failedCb();\n }\n\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const addCourseAsync = createAsyncThunk(\n \"courses/addCourse\",\n async (course, thunkAPI) => {\n try {\n const { data } = await Api.addCourse(course);\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const updateCourseAsync = createAsyncThunk(\n \"courses/updateCourse\",\n async ({ course, successCb }, thunkAPI) => {\n try {\n await Api.updateCourse(course);\n\n if (successCb) successCb();\n return course;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const deleteCourseAsync = createAsyncThunk(\n \"courses/deleteCourse\",\n async ({ cid, successCb }, thunkAPI) => {\n try {\n await Api.deleteCourse(cid);\n if (successCb) successCb();\n return cid;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\n//used to enroll current user\nexport const enrollCourseAsync = createAsyncThunk(\n \"courses/enrollCourse\",\n async ({ cid, successCb }, thunkAPI) => {\n try {\n await Api.enrollCourse(cid);\n\n if (successCb) successCb();\n return null;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\n//used to unenroll current user\nexport const unenrollCourseAsync = createAsyncThunk(\n \"courses/unenrollCourse\",\n async ({ cid, successCb }, thunkAPI) => {\n try {\n await Api.unenrollCourse(cid);\n\n if (successCb) successCb();\n return null;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const enrollUsersToCourseAsync = createAsyncThunk(\n \"courses/enrollUserToCourse\",\n async ({ cid, data, progressCb, successCb, failedCb }, thunkAPI) => {\n try {\n const res = await Api.enrollUserToCourseCSV(cid, data, progressCb);\n if (successCb) successCb();\n return res.data;\n } catch (e) {\n if (failedCb) failedCb();\n\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const unenrollUsersFromCourseAsync = createAsyncThunk(\n \"courses/unenrollUserFromCourse\",\n async ({ cid, students }, thunkAPI) => {\n try {\n await Api.unenrollUserFromCourse(cid, students);\n return null;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nconst coursesSlice = createSlice({\n name: \"courses\",\n initialState: { courses: {}, loading: false },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(getAllCoursesAsync.pending, (state) => {\n state.loading = true;\n })\n .addCase(getAllCoursesAsync.fulfilled, (state, action) => {\n if (action.payload) {\n state.courses = {\n ...state.courses,\n ...convertArrayToObj(action.payload),\n };\n }\n state.loading = false;\n })\n .addCase(getEnrolledCourseAsync.pending, (state) => {\n state.loading = true;\n })\n .addCase(getEnrolledCourseAsync.fulfilled, (state, action) => {\n if (action.payload) {\n state.courses = {\n ...state.courses,\n ...convertArrayToObj(action.payload),\n };\n }\n state.loading = false;\n })\n .addCase(getCourseAsync.pending, (state, action) => {\n const { cid } = action.meta.arg;\n if (!state.courses[cid]) {\n state.courses[cid] = { loading: true };\n } else {\n state.courses[cid].loading = true;\n }\n })\n .addCase(getCourseAsync.fulfilled, (state, action) => {\n let course = {};\n if (action.payload) {\n course = action.payload;\n const cid = course._id;\n state.courses[cid] = course;\n state.courses[cid].loading = false;\n }\n })\n .addCase(updateCourseAsync.pending, (state, action) => {\n const { course } = action.meta.arg;\n const cid = course._id;\n if (!state.courses[cid]) {\n state.courses[cid] = { loading: true };\n } else {\n state.courses[cid].loading = true;\n }\n })\n .addCase(updateCourseAsync.fulfilled, (state, action) => {\n const { course } = action.meta.arg;\n const cid = course._id;\n if (action.payload) {\n const oldCourse = state.courses[cid];\n if (oldCourse) {\n const updatedCourse = Object.assign({}, oldCourse, course);\n // cannot do this when using with immer!\n // const updatedCourse = { ...oldCourse, course };\n state.courses[cid] = updatedCourse;\n } else {\n course.students = [];\n state.courses[cid] = course;\n }\n }\n state.courses[cid].loading = false;\n })\n .addCase(updateCourseAsync.rejected, (state, action) => {\n const { course } = action.meta.arg;\n const { _id: cid } = course;\n state.courses[cid].loading = false;\n })\n .addCase(addCourseAsync.pending, (state, action) => {\n state.loading = true;\n\n const course = action.payload;\n if (action.payload) {\n const { _id: cid } = course;\n state.courses[cid] = course;\n }\n })\n .addCase(addCourseAsync.fulfilled, (state, action) => {\n if (action.payload) {\n const course = action.payload;\n const cid = course._id;\n state.courses[cid] = course;\n state.loading = false;\n }\n })\n .addCase(deleteCourseAsync.fulfilled, (state, action) => {\n const { cid } = action.meta.arg;\n delete state.courses[cid];\n })\n .addCase(unenrollUsersFromCourseAsync.fulfilled, (state, action) => {\n const { cid, students } = action.meta.arg;\n\n //remove the users from the course\n const course = state.courses[cid];\n const oldStudents = course.students;\n\n const updatedStudents = [];\n\n for (const uid of oldStudents) {\n if (!students.includes(uid)) {\n updatedStudents.push(uid);\n }\n }\n\n const updatedCourse = Object.assign({}, course, {\n students: updatedStudents,\n });\n state.courses[cid] = updatedCourse;\n })\n .addCase(enrollUsersToCourseAsync.fulfilled, (state, action) => {\n const { cid } = action.meta.arg;\n\n //add the users from the course\n if (action.payload) {\n const students = action.payload;\n\n const course = state.courses[cid];\n const oldStudents = course.students;\n\n const updatedStudents = [...oldStudents];\n\n for (const student of students) {\n const { _id: uid } = student;\n if (!updatedStudents.includes(uid)) {\n updatedStudents.push(uid);\n }\n }\n\n const updatedCourse = Object.assign({}, course, {\n students: updatedStudents,\n });\n state.courses[cid] = updatedCourse;\n }\n });\n },\n});\n\nexport default coursesSlice.reducer;\n","module.exports = {\n // SERVER_HOST: \"http://localhost:9105\",\n SERVER_HOST: \"https://apiautograder.recodefy.com\",\n TECHNOLOGY_LIST: {\n \"\": \"Please select\",\n r: \"R\",\n python: \"Python\",\n javascript: \"Javascript\",\n react: \"React\",\n ejb: \"EJB\",\n war: \"WAR\",\n },\n};\n","import { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport Api from \"../../helpers/Api\";\nimport { handleReduxErrorCase } from \"../../helpers/Misc\";\n\nexport const getTestsForExerciseAsync = createAsyncThunk(\n \"tests/getTestsForExercise\",\n //arg is not used\n async (eid, thunkAPI) => {\n try {\n const { data } = await Api.getTestsForExercise(eid);\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const addTestAsync = createAsyncThunk(\n \"tests/addTest\",\n async ({ test, successCb }, thunkAPI) => {\n try {\n const { data } = await Api.addTest(test);\n successCb();\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const deleteTestAsync = createAsyncThunk(\n \"tests/deleteTest\",\n async ({ tid, eid }, thunkAPI) => {\n try {\n await Api.deleteTest(tid);\n return eid;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const deleteMassTestAsync = createAsyncThunk(\n \"tests/deleteMassTest\",\n async ({ tids, eid }, thunkAPI) => {\n try {\n for (const tid of tids) {\n await Api.deleteTest(tid);\n }\n return eid;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const updateTestAsync = createAsyncThunk(\n \"tests/updateTest\",\n async ({ test, successCb }, thunkAPI) => {\n try {\n const { data } = await Api.updateTest(test);\n successCb();\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nconst testsSlice = createSlice({\n name: \"tests\",\n initialState: { tests: {}, loading: false },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(getTestsForExerciseAsync.pending, (state) => {\n state.loading = true;\n })\n .addCase(getTestsForExerciseAsync.fulfilled, (state, action) => {\n const eid = action.meta.arg;\n\n if (action.payload) {\n state.tests[eid] = action.payload;\n }\n state.loading = false;\n })\n .addCase(addTestAsync.fulfilled, (state, action) => {\n const test = action.payload;\n\n if (test) {\n const { exercise_id: eid } = test;\n const tests = state.tests[eid];\n const updatedTests = [...tests, test];\n state.tests[eid] = updatedTests;\n }\n })\n .addCase(updateTestAsync.fulfilled, (state, action) => {\n const { test } = action.meta.arg;\n\n if (test) {\n const { _id: tid } = test;\n const { exercise_id: eid } = test;\n const tests = state.tests[eid];\n const updatedTests = tests.map((t) => {\n if (t._id === tid) {\n const updatedTest = Object.assign({}, t, test);\n return updatedTest;\n } else {\n return t;\n }\n });\n state.tests[eid] = updatedTests;\n }\n })\n .addCase(deleteTestAsync.fulfilled, (state, action) => {\n const { tid, eid } = action.meta.arg;\n\n const tests = state.tests[eid];\n\n const updatedTests = tests.filter((t) => t._id !== tid);\n state.tests[eid] = updatedTests;\n })\n .addCase(deleteMassTestAsync.fulfilled, (state, action) => {\n const { tids, eid } = action.meta.arg;\n\n for (const tid of tids) {\n const tests = state.tests[eid];\n\n const updatedTests = tests.filter((t) => t._id !== tid);\n state.tests[eid] = updatedTests;\n } //end for\n });\n },\n});\n\nexport default testsSlice.reducer;\n","import React from \"react\";\nimport {\n CCol,\n CFormGroup,\n CLabel,\n CInput,\n CTextarea,\n CSwitch,\n CSelect,\n CRow,\n} from \"@coreui/react\";\nimport Select from \"react-select\";\nimport DatePicker from \"react-datepicker\";\n\nimport \"react-datepicker/dist/react-datepicker.css\";\nimport \"./datepicker.custom.css\";\n\nfunction capitalizeFirstLetter(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nfunction FormInput({\n innerRef,\n name,\n label,\n smallLabel,\n placeholder,\n value,\n handleChange,\n handleChangeDate,\n type = \"input\",\n rows = 3,\n required = false,\n mapping = {},\n}) {\n if (!label) {\n label = capitalizeFirstLetter(name);\n }\n\n return (\n \n \n \n {label}\n \n {smallLabel && (\n <>\n
\n ({smallLabel})\n \n )}\n
\n \n {type === \"label\" && {value}}\n {type === \"input\" && (\n \n )}\n {type === \"number\" && (\n \n )}\n {type === \"email\" && (\n \n )}\n {type === \"password\" && (\n \n )}\n {type === \"textarea\" && (\n \n )}\n {type === \"switch\" && (\n \n )}\n {type === \"select\" && (\n \n {Object.keys(mapping).map((k, index) => (\n \n ))}\n \n )}\n {type === \"multiselect\" && (\n ({\n ...provided,\n outline: 0,\n boxShadow: state.isFocused\n ? \"0 0 0 3px rgba(112, 88, 149, .25)\"\n : \"\",\n }),\n }}\n theme={(theme) => ({\n ...theme,\n colors: {\n ...theme.colors,\n primary: \"#705895\",\n },\n })}\n />\n )}\n {type === \"datetime\" && (\n \n \n \n \n \n {value && (\n \n )}\n \n \n )}\n \n
\n );\n}\n\nexport default FormInput;\n","import { SERVER_HOST } from \"../config\";\nimport axios from \"axios\";\nimport AuthService from \"./AuthService\";\n\n//used to capture the bearer token\nfunction generateAuthHeaders() {\n return {\n headers: {\n \"Content-type\": \"application/json\",\n Authorization: `Bearer ${AuthService.getAccessToken()}`,\n },\n };\n}\n\nconst Api = {\n login(email, password) {\n return axios.post(`${SERVER_HOST}/login`, {\n email,\n password,\n });\n },\n requestresetpassword(email) {\n return axios.post(`${SERVER_HOST}/requestresetpassword`, {\n email,\n });\n },\n checkhash(uid, hash) {\n return axios.post(`${SERVER_HOST}/checkhash/${uid}`, {\n hash,\n });\n },\n resetpassword(uid, hash, password) {\n return axios.post(`${SERVER_HOST}/resetpassword/${uid}`, {\n hash,\n password,\n });\n },\n getAllCourses() {\n return axios.get(`${SERVER_HOST}/courses`, generateAuthHeaders());\n },\n getEnrolledCourse() {\n return axios.get(`${SERVER_HOST}/me/courses`, generateAuthHeaders());\n },\n addCourse(course) {\n delete course._id;\n return axios.post(`${SERVER_HOST}/courses`, course, generateAuthHeaders());\n },\n getSubmission(sid) {\n return axios.get(\n `${SERVER_HOST}/submissions/${sid}`,\n generateAuthHeaders()\n );\n },\n getCourse(cid) {\n return axios.get(`${SERVER_HOST}/courses/${cid}`, generateAuthHeaders());\n },\n updateCourse(course) {\n const { _id: cid } = course;\n return axios.patch(\n `${SERVER_HOST}/courses/${cid}`,\n course,\n generateAuthHeaders()\n );\n },\n deleteCourse(cid) {\n return axios.delete(`${SERVER_HOST}/courses/${cid}`, generateAuthHeaders());\n },\n setPublishCourse(cid, published) {\n return axios.patch(\n `${SERVER_HOST}/courses/${cid}`,\n {\n _id: cid,\n published,\n },\n generateAuthHeaders()\n );\n },\n getExercisesForCourse(cid) {\n return axios.get(\n `${SERVER_HOST}/courses/${cid}/exercises`,\n generateAuthHeaders()\n );\n },\n getEnrollmentForCourse(cid) {\n return axios.get(\n `${SERVER_HOST}/courses/${cid}/students`,\n generateAuthHeaders()\n );\n },\n addExercise(exercise) {\n delete exercise._id;\n const cid = exercise.course_id;\n return axios.post(\n `${SERVER_HOST}/courses/${cid}/exercises`,\n exercise,\n generateAuthHeaders()\n );\n },\n getExercise(eid) {\n return axios.get(`${SERVER_HOST}/exercises/${eid}`, generateAuthHeaders());\n },\n deleteExercise(eid) {\n return axios.delete(\n `${SERVER_HOST}/exercises/${eid}`,\n generateAuthHeaders()\n );\n },\n updateExercise(exercise) {\n const { _id: eid } = exercise;\n return axios.patch(\n `${SERVER_HOST}/exercises/${eid}`,\n exercise,\n generateAuthHeaders()\n );\n },\n getMyCourses() {\n return axios.get(`${SERVER_HOST}/me/courses`, generateAuthHeaders());\n },\n enrollCourse(cid) {\n return axios.post(\n `${SERVER_HOST}/courses/${cid}/enroll`,\n null,\n generateAuthHeaders()\n );\n },\n unenrollCourse(cid) {\n return axios.delete(\n `${SERVER_HOST}/courses/${cid}/enroll`,\n generateAuthHeaders()\n );\n },\n //not used\n // enrollUserToCourse(cid, students) {\n // return axios.post(\n // `${SERVER_HOST}/courses/${cid}/enroll`,\n // { students },\n // generateAuthHeaders()\n // );\n // },\n unenrollUserFromCourse(cid, students) {\n return axios.delete(`${SERVER_HOST}/courses/${cid}/students`, {\n ...generateAuthHeaders(),\n data: { students },\n });\n },\n uploadFilesToExercise(eid, files, progress) {\n return axios.post(`${SERVER_HOST}/exercises/${eid}/files`, files, {\n ...generateAuthHeaders(),\n onUploadProgress: progress,\n });\n },\n uploadTestscriptsToExercise(eid, files, progress) {\n return axios.post(`${SERVER_HOST}/exercises/${eid}/testscripts`, files, {\n ...generateAuthHeaders(),\n onUploadProgress: progress,\n });\n },\n deleteFilesOfExercise(eid, files) {\n return axios.delete(`${SERVER_HOST}/exercises/${eid}/files`, {\n ...generateAuthHeaders(),\n data: files,\n });\n },\n deleteTestscriptsOfExercise(eid, testscripts) {\n return axios.delete(`${SERVER_HOST}/exercises/${eid}/testscripts`, {\n ...generateAuthHeaders(),\n data: testscripts,\n });\n },\n downloadTestscripts(eid, testscript) {\n axios({\n url: `${SERVER_HOST}/exercises/${eid}/testscripts/${testscript}`,\n method: \"GET\",\n responseType: \"blob\",\n ...generateAuthHeaders(),\n }).then((response) => {\n const url = window.URL.createObjectURL(new Blob([response.data]));\n const link = document.createElement(\"a\");\n link.href = url;\n link.setAttribute(\"download\", testscript);\n document.body.appendChild(link);\n link.click();\n });\n },\n downloadSubmissionFile(sid, filename) {\n axios({\n url: `${SERVER_HOST}/submissions/${sid}/file`,\n method: \"GET\",\n responseType: \"blob\",\n ...generateAuthHeaders(),\n }).then((response) => {\n const url = window.URL.createObjectURL(new Blob([response.data]));\n const link = document.createElement(\"a\");\n link.href = url;\n link.setAttribute(\"download\", filename);\n document.body.appendChild(link);\n link.click();\n });\n },\n getTestsForExercise(eid) {\n return axios.get(\n `${SERVER_HOST}/exercises/${eid}/tests`,\n generateAuthHeaders()\n );\n },\n addTest(test) {\n delete test._id;\n const { exercise_id: eid } = test;\n return axios.post(\n `${SERVER_HOST}/exercises/${eid}/tests`,\n test,\n generateAuthHeaders()\n );\n },\n deleteTest(tid) {\n return axios.delete(`${SERVER_HOST}/tests/${tid}`, generateAuthHeaders());\n },\n updateTest(test) {\n const { _id: tid } = test;\n return axios.patch(\n `${SERVER_HOST}/tests/${tid}`,\n test,\n generateAuthHeaders()\n );\n },\n getMySubmissions({\n skip = 0,\n limit = 10,\n sort_column,\n sort_order,\n course_id = \"\",\n exercise_id = \"\",\n }) {\n return axios.get(\n `${SERVER_HOST}/me/submissions?skip=${skip}&limit=${limit}&sort_column=${sort_column}&sort_order=${sort_order}&course_id=${course_id}&exercise_id=${exercise_id}`,\n generateAuthHeaders()\n );\n },\n getSubmissions({\n skip = 0,\n limit = 10,\n sort_column,\n sort_order,\n course_id = \"\",\n exercise_id = \"\",\n user_id = \"\",\n }) {\n return axios.get(\n `${SERVER_HOST}/submissions?skip=${skip}&limit=${limit}&sort_column=${sort_column}&sort_order=${sort_order}&course_id=${course_id}&exercise_id=${exercise_id}&user_id=${user_id}`,\n generateAuthHeaders()\n );\n },\n deleteSubmission(sid) {\n return axios.delete(\n `${SERVER_HOST}/submissions/${sid}`,\n generateAuthHeaders()\n );\n },\n clearstatusSubmission(sid) {\n return axios.post(\n `${SERVER_HOST}/submissions/${sid}/clearstatus`,\n {},\n generateAuthHeaders()\n );\n },\n getAllUsers({ skip = 0, limit = 10, sort_column, sort_order }) {\n return axios.get(\n `${SERVER_HOST}/users?skip=${skip}&limit=${limit}&sort_column=${sort_column}&sort_order=${sort_order}`,\n generateAuthHeaders()\n );\n },\n deleteUser(uid) {\n return axios.delete(`${SERVER_HOST}/users/${uid}`, generateAuthHeaders());\n },\n updateUser(user) {\n const { _id: uid } = user;\n return axios.patch(\n `${SERVER_HOST}/users/${uid}`,\n user,\n generateAuthHeaders()\n );\n },\n addUser(user) {\n delete user._id;\n return axios.post(`${SERVER_HOST}/users`, user, generateAuthHeaders());\n },\n getUser(uid) {\n return axios.get(`${SERVER_HOST}/users/${uid}`, generateAuthHeaders());\n },\n uploadUsersCSV(file, progress) {\n return axios.post(`${SERVER_HOST}/users`, file, {\n ...generateAuthHeaders(),\n onUploadProgress: progress,\n });\n },\n enrollUserToCourseCSV(cid, file, progress) {\n return axios.post(`${SERVER_HOST}/courses/${cid}/students`, file, {\n ...generateAuthHeaders(),\n onUploadProgress: progress,\n });\n },\n makeExerciseSubmission(eid, file, progress) {\n return axios.post(`${SERVER_HOST}/exercises/${eid}/submissions`, file, {\n ...generateAuthHeaders(),\n onUploadProgress: progress,\n });\n },\n getExerciseSubmissionCount(eid) {\n return axios.get(\n `${SERVER_HOST}/exercises/${eid}/submissions/count`,\n generateAuthHeaders()\n );\n },\n getCurrentUser() {\n return axios.get(`${SERVER_HOST}/me`, generateAuthHeaders());\n },\n updateCurrentUser(user) {\n return axios.patch(`${SERVER_HOST}/me`, user, generateAuthHeaders());\n },\n generatePasswordForUser(uid) {\n return axios.post(\n `${SERVER_HOST}/users/${uid}/password`,\n {},\n generateAuthHeaders()\n );\n },\n getCourseReportNosubmission(cid) {\n return axios.get(\n `${SERVER_HOST}/courses/${cid}/reports/nosubmission`,\n generateAuthHeaders()\n );\n },\n getCourseReport(cid) {\n return axios.get(\n `${SERVER_HOST}/courses/${cid}/reports`,\n generateAuthHeaders()\n );\n },\n getExercisesReportNosubmission(ids) {\n return axios.post(\n `${SERVER_HOST}/exercises/reports`,\n { ids },\n generateAuthHeaders()\n );\n },\n};\nexport default Api;\n","import { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport Api from \"../../helpers/Api\";\nimport { handleReduxErrorCase } from \"../../helpers/Misc\";\nimport {\n enrollUsersToCourseAsync,\n getEnrollmentForCourseAsync,\n} from \"../courses/coursesSlice\";\nimport { addTestAsync } from \"../tests/testsSlice\";\n\nexport const getAllUsersAsync = createAsyncThunk(\n \"users/getAllUsers\",\n //arg is not used\n async (filters, thunkAPI) => {\n try {\n const { data } = await Api.getAllUsers(filters);\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const getUserAsync = createAsyncThunk(\n \"users/getUserAsync\",\n //arg is not used\n async (uid, thunkAPI) => {\n try {\n const { data } = await Api.getUser(uid);\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const deleteUserAsync = createAsyncThunk(\n \"users/deleteCourse\",\n async ({ uid, successCb }, thunkAPI) => {\n try {\n await Api.deleteUser(uid);\n\n if (successCb) successCb();\n return uid;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const updateUserAsync = createAsyncThunk(\n \"users/updateUser\",\n async ({ user, successCb }, thunkAPI) => {\n try {\n await Api.updateUser(user);\n\n if (successCb) successCb();\n\n return user;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const addUserAsync = createAsyncThunk(\n \"users/addUser\",\n async ({ user, successCb }, thunkAPI) => {\n try {\n const { data } = await Api.addUser(user);\n\n if (successCb) successCb();\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const uploadUsersCSVAsync = createAsyncThunk(\n \"users/uploadFilesToExercise\",\n async ({ file, progress, successCb, failedCb }, thunkAPI) => {\n try {\n const { data } = await Api.uploadUsersCSV(file, progress);\n if (successCb) successCb();\n return data;\n } catch (e) {\n if (failedCb) failedCb();\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nconst usersSlice = createSlice({\n name: \"users\",\n //take note that currentUsers is an array (by index)\n //whereas users is an map (uid => user)\n initialState: { users: {}, currentUsers: [], total: 0, loading: false },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(getAllUsersAsync.pending, (state) => {\n state.loading = true;\n })\n .addCase(getAllUsersAsync.fulfilled, (state, action) => {\n if (action.payload) {\n const res = action.payload;\n state.total = res.total;\n const currentUsers = res.data;\n state.currentUsers = currentUsers;\n\n //update to the mapping of users\n for (const u of currentUsers) {\n state.users[u._id] = u;\n }\n }\n state.loading = false;\n })\n .addCase(addTestAsync.fulfilled, (state, action) => {\n if (action.payload) {\n const user = action.payload;\n state.total = state.total + 1;\n state.users[user._id] = user;\n }\n state.loading = false;\n })\n .addCase(updateUserAsync.fulfilled, (state, action) => {\n if (action.payload) {\n const user = action.payload;\n const { _id: uid } = user;\n\n for (let i = 0; i < state.currentUsers.length; i++) {\n const u = state.currentUsers[i];\n\n if (u._id === uid) {\n const updatedUser = Object.assign({}, u, user);\n state.currentUsers[i] = updatedUser;\n break;\n }\n }\n }\n state.loading = false;\n })\n .addCase(getUserAsync.pending, (state, action) => {\n const uid = action.meta.arg;\n state.users[uid] = { loading: true };\n })\n .addCase(getUserAsync.rejected, (state, action) => {\n if (action.payload) {\n const user = action.payload;\n\n delete state.users[user._id];\n }\n state.loading = false;\n })\n .addCase(getUserAsync.fulfilled, (state, action) => {\n if (action.payload) {\n const user = action.payload;\n\n state.users[user._id] = user;\n for (const u of state.currentUsers) {\n if (u._id === user._id) {\n u.name = user.name;\n u.email = user.email;\n break;\n }\n }\n }\n state.loading = false;\n })\n .addCase(getEnrollmentForCourseAsync.fulfilled, (state, action) => {\n const users = action.payload;\n if (users) {\n for (const user of users) {\n state.users[user._id] = user;\n }\n }\n state.loading = false;\n })\n .addCase(enrollUsersToCourseAsync.fulfilled, (state, action) => {\n if (action.payload) {\n const students = action.payload;\n\n for (const student of students) {\n state.users[student._id] = student;\n }\n }\n });\n },\n});\n\nexport default usersSlice.reducer;\n","import { useLocation } from \"react-router-dom\";\n\nexport const useQuery = () => {\n return new URLSearchParams(useLocation().search);\n};\n","import { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport Api from \"../../helpers/Api\";\nimport { handleReduxErrorCase } from \"../../helpers/Misc\";\nimport { logout } from \"../login/loginSlice\";\n\nexport const getExercisesForCourseAsync = createAsyncThunk(\n \"exercises/getAllExercisesForCourse\",\n //arg is not used\n async ({ cid, failedCb }, thunkAPI) => {\n try {\n const { data } = await Api.getExercisesForCourse(cid);\n return data;\n } catch (e) {\n if (e.response && e.response.status === 401) {\n thunkAPI.dispatch(logout());\n } else {\n if (failedCb) {\n failedCb();\n } else {\n alert(\"Unable to load exercises. Please try refreshing page.\");\n }\n }\n return thunkAPI.rejectWithValue(e.message);\n }\n }\n);\n\nexport const addExerciseAsync = createAsyncThunk(\n \"exercises/addExercise\",\n async (exercise, thunkAPI) => {\n try {\n const { data } = await Api.addExercise(exercise);\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const deleteExerciseAsync = createAsyncThunk(\n \"exercises/deleteExercise\",\n async ({ eid }, thunkAPI) => {\n try {\n await Api.deleteExercise(eid);\n return eid;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const updateExerciseAsync = createAsyncThunk(\n \"exercises/updateExercise\",\n async (exercise, thunkAPI) => {\n try {\n const { data } = await Api.updateExercise(exercise);\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\n//switch ordering of 2 exercises\n//will only update the order field\nexport const switchOrderingOfExercisesAsync = createAsyncThunk(\n \"exercises/switchOrderingOfExercises\",\n async ({ e1, e2 }, thunkAPI) => {\n try {\n const e1Order = e2.order;\n const e2Order = e1.order;\n\n await Api.updateExercise({ _id: e1._id, order: e1Order });\n await Api.updateExercise({ _id: e2._id, order: e2Order });\n\n return null;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const uploadFilesToExerciseAsync = createAsyncThunk(\n \"exercises/uploadFilesToExercise\",\n async ({ eid, cid, files, progress, successCb, failedCb }, thunkAPI) => {\n try {\n await Api.uploadFilesToExercise(eid, files, progress);\n if (successCb) successCb();\n\n return null;\n } catch (e) {\n if (failedCb) failedCb();\n\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const uploadTestscriptsToExerciseAsync = createAsyncThunk(\n \"exercises/uploadTestscriptsToExercise\",\n async ({ eid, cid, files, progress, successCb, failedCb }, thunkAPI) => {\n try {\n await Api.uploadTestscriptsToExercise(eid, files, progress);\n if (successCb) successCb();\n\n return null;\n } catch (e) {\n if (failedCb) failedCb();\n\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const deleteFilesOfExerciseAsync = createAsyncThunk(\n \"exercises/deleteFilesOfExercise\",\n async ({ eid, cid, filename }, thunkAPI) => {\n try {\n const { data } = await Api.deleteFilesOfExercise(eid, {\n files: [filename],\n });\n\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const deleteTestscriptsOfExerciseAsync = createAsyncThunk(\n \"exercises/deleteTestscriptsOfExercise\",\n async ({ eid, cid, filename }, thunkAPI) => {\n try {\n const { data } = await Api.deleteTestscriptsOfExercise(eid, {\n files: [filename],\n });\n\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nconst exercisesSlice = createSlice({\n name: \"exercises\",\n initialState: { exercises: {}, loading: false },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(getExercisesForCourseAsync.pending, (state) => {\n state.loading = true;\n })\n .addCase(getExercisesForCourseAsync.fulfilled, (state, action) => {\n const { cid } = action.meta.arg;\n\n if (action.payload) {\n state.exercises[cid] = action.payload;\n }\n state.loading = false;\n })\n .addCase(addExerciseAsync.pending, (state) => {\n state.loading = true;\n })\n .addCase(addExerciseAsync.fulfilled, (state, action) => {\n const exercise = action.payload;\n if (exercise) {\n const { course_id } = exercise;\n const exercises = state.exercises[course_id];\n const updatedExercises = [...exercises, exercise];\n\n state.exercises[course_id] = updatedExercises;\n }\n state.loading = false;\n })\n .addCase(addExerciseAsync.rejected, (state, action) => {\n state.loading = false;\n })\n .addCase(updateExerciseAsync.fulfilled, (state, action) => {\n const exercise = action.meta.arg;\n\n if (exercise) {\n const { course_id } = exercise;\n const exercises = state.exercises[course_id];\n const updatedExercises = exercises.map((e) => {\n if (e._id === exercise._id) {\n const updatedExercise = Object.assign({}, e, exercise);\n return updatedExercise;\n } else {\n return e;\n }\n });\n\n state.exercises[course_id] = updatedExercises;\n }\n })\n .addCase(uploadFilesToExerciseAsync.fulfilled, (state, action) => {\n const { eid, cid, files } = action.meta.arg;\n\n const exercises = state.exercises[cid];\n\n const updatedExercises = exercises.map((e) => {\n if (e._id === eid) {\n let updatedFiles = [];\n\n if (e.files) {\n updatedFiles = [...e.files];\n }\n\n for (let file of files) {\n file = file[1];\n const { name } = file;\n if (!updatedFiles.includes(name)) {\n updatedFiles.push(name);\n }\n } //end for\n\n const updatedExercise = Object.assign({}, e, {\n files: updatedFiles,\n });\n return updatedExercise;\n } else {\n return e;\n }\n });\n\n state.exercises[cid] = updatedExercises;\n })\n .addCase(uploadTestscriptsToExerciseAsync.fulfilled, (state, action) => {\n const { eid, cid, files } = action.meta.arg;\n\n const exercises = state.exercises[cid];\n\n const updatedExercises = exercises.map((e) => {\n if (e._id === eid) {\n let updatedTestscripts = [];\n\n if (e.testscripts) {\n updatedTestscripts = [...e.testscripts];\n }\n\n for (let file of files) {\n file = file[1];\n const { name } = file;\n if (!updatedTestscripts.includes(name)) {\n updatedTestscripts.push(name);\n }\n } //end for\n\n const updatedExercise = Object.assign({}, e, {\n testscripts: updatedTestscripts,\n });\n return updatedExercise;\n } else {\n return e;\n }\n });\n\n state.exercises[cid] = updatedExercises;\n })\n .addCase(switchOrderingOfExercisesAsync.fulfilled, (state, action) => {\n const { e1, e2 } = action.meta.arg;\n\n const cid = e1.course_id;\n\n const exercises = state.exercises[cid];\n\n const updatedExercises = [];\n\n const e1Order = e2.order;\n const e2Order = e1.order;\n\n for (let thisExercise of exercises) {\n if (thisExercise._id === e1._id) {\n thisExercise = Object.assign({}, e2, { order: e1Order });\n } else if (thisExercise._id === e2._id) {\n thisExercise = Object.assign({}, e1, { order: e2Order });\n }\n updatedExercises.push(thisExercise);\n } //end for\n\n state.exercises[cid] = updatedExercises;\n })\n .addCase(deleteFilesOfExerciseAsync.fulfilled, (state, action) => {\n const { eid, cid, filename } = action.meta.arg;\n\n const exercises = state.exercises[cid];\n\n const updatedExercises = exercises.map((e) => {\n if (e._id === eid) {\n const updatedFiles = e.files.filter((f) => f !== filename);\n\n const updatedExercise = Object.assign({}, e, {\n files: updatedFiles,\n });\n return updatedExercise;\n } else {\n return e;\n }\n });\n\n state.exercises[cid] = updatedExercises;\n })\n .addCase(deleteTestscriptsOfExerciseAsync.fulfilled, (state, action) => {\n const { eid, cid, filename } = action.meta.arg;\n\n const exercises = state.exercises[cid];\n\n const updatedExercises = exercises.map((e) => {\n if (e._id === eid) {\n const updatedFiles = e.testscripts.filter((f) => f !== filename);\n\n const updatedExercise = Object.assign({}, e, {\n testscripts: updatedFiles,\n });\n return updatedExercise;\n } else {\n return e;\n }\n });\n\n state.exercises[cid] = updatedExercises;\n })\n .addCase(deleteExerciseAsync.fulfilled, (state, action) => {\n const { cid, eid } = action.meta.arg;\n\n state.exercises[cid] = state.exercises[cid].filter(\n (exercise) => exercise._id !== eid\n );\n });\n },\n});\n\nexport default exercisesSlice.reducer;\n","//this function will convert an array to\n\nimport { logout } from \"../redux/login/loginSlice\";\n\n//object with the _id being the fields\nexport function convertArrayToObj(array) {\n const mapping = {};\n for (const obj of array) {\n mapping[obj._id] = obj;\n }\n\n return mapping;\n} //end convertArrayToObj\n\nexport function handleReduxErrorCase(e, thunkAPI) {\n if (e.response && e.response.status === 401) {\n if (thunkAPI) {\n thunkAPI.dispatch(logout());\n }\n } else if (e.response && e.response.data && e.response.data.error) {\n alert(e.response.data.error);\n } else {\n alert(\"Unexpected error\");\n }\n\n if (thunkAPI) {\n return thunkAPI.rejectWithValue(e.message);\n }\n\n return null;\n} //end handleReduxErrorCase\n","//this will check for whether the user is logged in\n\nexport const ACCESS_TOKEN_KEY = \"accessToken\";\nconst AuthService = {\n isLoggedIn() {\n //check local storage\n if (!localStorage.getItem(ACCESS_TOKEN_KEY)) {\n return false;\n } else {\n return true;\n }\n },\n //get the uid of the current logged in user\n getUid() {\n return parseInt(localStorage.getItem(\"uid\"));\n },\n login({ accessToken, role, _id: uid }) {\n localStorage.setItem(ACCESS_TOKEN_KEY, accessToken);\n\n if (role) {\n localStorage.setItem(\"role\", role);\n }\n\n localStorage.setItem(\"uid\", uid);\n },\n logout() {\n localStorage.removeItem(ACCESS_TOKEN_KEY);\n localStorage.removeItem(\"role\");\n localStorage.removeItem(\"uid\");\n },\n isAdmin() {\n if (\n !localStorage.getItem(ACCESS_TOKEN_KEY) ||\n !localStorage.getItem(\"role\")\n ) {\n return false;\n } else {\n if (localStorage.getItem(\"role\") === \"admin\") {\n return true;\n }\n }\n },\n getAccessToken() {\n return localStorage.getItem(ACCESS_TOKEN_KEY);\n },\n};\n\n// export default auth;\nexport default AuthService;\n","import { useSelector } from \"react-redux\";\nimport { Route, Redirect } from \"react-router-dom\";\nimport AuthService from \"../../helpers/AuthService\";\n\nfunction PrivateRoute({\n component: Component,\n authed,\n requireAdmin = false,\n ...rest\n}) {\n const { isLoggedIn } = useSelector((state) => state.login);\n\n return (\n {\n if (isLoggedIn) {\n if (requireAdmin) {\n const isAdmin = AuthService.isAdmin();\n if (isAdmin) {\n return ;\n } else {\n return (\n \n );\n }\n } else {\n return ;\n }\n } else {\n return (\n \n );\n }\n }}\n />\n );\n}\n\nexport default PrivateRoute;\n","import React, { useState } from \"react\";\nimport {\n CButton,\n CCard,\n CCardBody,\n CCardGroup,\n CCol,\n CContainer,\n CForm,\n CInput,\n CInputGroup,\n CInputGroupPrepend,\n CInputGroupText,\n CRow,\n CAlert,\n} from \"@coreui/react\";\nimport CIcon from \"@coreui/icons-react\";\n\nimport { login } from \"../../redux/login/loginSlice\";\n\nimport { useForm } from \"../../helpers/useForm\";\nimport Api from \"../../helpers/Api\";\nimport { useDispatch } from \"react-redux\";\nimport AuthService from \"../../helpers/AuthService\";\nimport { Link } from \"react-router-dom\";\n\nfunction Login(props) {\n const [error, setError] = useState(null);\n const dispatch = useDispatch();\n const [{ email, password }, handleChange] = useForm({\n email: \"\",\n password: \"\",\n });\n\n function validateForm() {\n return email.length > 0 && password.length > 0;\n }\n\n async function handleSubmit(e) {\n e.preventDefault();\n\n try {\n const { data } = await Api.login(email, password);\n AuthService.login(data);\n\n setError(null);\n dispatch(login(data));\n\n if (props.history.location.state && props.history.location.state.from) {\n //go to the last bounce off url if possible\n props.history.push(props.history.location.state.from);\n } else {\n props.history.push(\"/\");\n }\n } catch (error) {\n if (error.response.status === 401) {\n //invalid login\n setError(\"Login failed. Please try again.\");\n }\n }\n }\n\n return (\n
\n \n \n \n \n \n \n \n

Login

\n

Sign In to your account

\n {error ? {error} : \"\"}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Forgot password?\n \n \n \n \n \n Login\n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n );\n}\n\nexport default Login;\n","import ReactGA from \"react-ga\";\n\nconst TRACKING_ID = \"UA-204391785-1\";\n\nfunction init() {\n // Enable debug mode on the local development environment\n const isDev = !process.env.NODE_ENV || process.env.NODE_ENV === \"development\";\n ReactGA.initialize(TRACKING_ID, { debug: isDev });\n}\n\nfunction sendEvent(payload) {\n ReactGA.event(payload);\n}\n\nfunction sendPageview(path) {\n ReactGA.set({ page: path });\n ReactGA.pageview(path);\n}\n\n// eslint-disable-next-line import/no-anonymous-default-export\nexport default {\n init,\n sendEvent,\n sendPageview,\n};\n","import React from \"react\";\n\nconst UserProfile = React.lazy(() => import(\"./components/UserProfile\"));\nconst Home = React.lazy(() => import(\"./components/Home\"));\nconst CourseList = React.lazy(() => import(\"./components/CourseList\"));\nconst CourseDetail = React.lazy(() => import(\"./components/CourseDetail\"));\nconst UserList = React.lazy(() => import(\"./components/UserList\"));\nconst SubmissionList = React.lazy(() => import(\"./components/SubmissionList\"));\nconst MySubmissionList = React.lazy(() =>\n import(\"./components/MySubmissionList\")\n);\nconst ReportList = React.lazy(() => import(\"./components/ReportList\"));\n\nconst routes = [\n { path: \"/\", exact: true, name: \"Home\", component: Home },\n { path: \"/courses/:cid\", name: \"Course Details\", component: CourseDetail },\n { path: \"/courses\", name: \"Courses\", component: CourseList },\n { path: \"/profile\", name: \"User Profile\", component: UserProfile },\n { path: \"/users\", name: \"Users\", component: UserList, adminOnly: true },\n {\n path: \"/submissions\",\n name: \"Submissions\",\n component: SubmissionList,\n adminOnly: true,\n },\n { path: \"/mysubmissions\", name: \"Submissions\", component: MySubmissionList },\n { path: \"/reports\", name: \"Reports\", component: ReportList, adminOnly: true },\n];\n\nexport default routes;\n","import React, { Suspense } from \"react\";\nimport { Route, Switch } from \"react-router-dom\";\nimport { CContainer, CFade } from \"@coreui/react\";\n\n// routes config\nimport routes from \"../routes\";\nimport PrivateRoute from \"../components/PrivateRoute\";\n\nconst loading = (\n
\n
\n
\n);\n\nconst TheContent = () => {\n return (\n
\n \n \n \n {routes.map((route, idx) => {\n return (\n route.component &&\n (route.adminOnly ? (\n (\n \n \n \n )}\n requireAdmin={true}\n component={route.component}\n />\n ) : (\n (\n \n \n \n )}\n />\n ))\n );\n })}\n \n \n \n
\n );\n};\n\nexport default React.memo(TheContent);\n","import React from \"react\";\nimport { CFooter } from \"@coreui/react\";\n\nconst TheFooter = () => {\n return (\n \n
\n © 2021~2025 Recodefy\n
\n
\n );\n};\n\nexport default React.memo(TheFooter);\n","import { createSlice } from \"@reduxjs/toolkit\";\n\nconst initialState = {\n show: \"responsive\",\n};\n\nexport const sidebarSlice = createSlice({\n name: \"sidebar\",\n initialState: initialState,\n reducers: {\n toggle: (state, action) => {\n state.show = action.payload;\n },\n },\n});\n\nexport const { toggle } = sidebarSlice.actions;\nexport default sidebarSlice.reducer;\n","import React from \"react\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport {\n CHeader,\n CToggler,\n CHeaderBrand,\n CHeaderNav,\n CSubheader,\n CBreadcrumbRouter,\n CButton,\n CAlert,\n} from \"@coreui/react\";\n\nimport CIcon from \"@coreui/icons-react\";\nimport logo from \"../logo_purple.png\";\nimport logoSymbol from \"../logo_symbol_purple.png\";\n\nimport { toggle } from \"../redux/sidebar/sidebarSlice\";\nimport { logout } from \"../redux/login/loginSlice\";\n\n// routes config\nimport routes from \"../routes\";\nimport { Link, withRouter } from \"react-router-dom\";\n\nconst TheHeader = (props) => {\n const dispatch = useDispatch();\n const { show } = useSelector((state) => state.sidebar);\n const { user } = useSelector((state) => state.login);\n\n const toggleSidebar = () => {\n const val = [true, \"responsive\"].includes(show) ? false : \"responsive\";\n dispatch(toggle(val));\n };\n\n const toggleSidebarMobile = () => {\n const val = [false, \"responsive\"].includes(show) ? true : \"responsive\";\n dispatch(toggle(val));\n };\n\n return (\n <>\n \n \n \n \n \n \n\n \n \n \n\n \n\n \n {\n dispatch(logout());\n }}\n >\n Logout\n \n \n\n \n \n
\n \n \n  Edit Profile\n \n
\n
\n
\n {user && user.prompt_change_password && (\n \n You have not changed your generated password.{\" \"}\n \n Consider changing your password\n \n \n )}\n \n );\n};\n\nexport default withRouter(TheHeader);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAToAAAAoCAYAAABuKzZ4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKamlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuZGFiYWNiYiwgMjAyMS8wNC8xNC0wMDozOTo0NCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTA3LTA3VDIyOjAxOjQ0KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIxLTA3LTA3VDIyOjA3OjM5KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wNy0wN1QyMjowNzozOSswODowMCIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpiYjYyYWY3Yy00YWQ0LTRmY2YtYWUzOS1hOGNmMzU4YjMxY2IiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpmYmE4ZmQ2Zi1mMGE3LTY4NDYtODE1OC01NGMxOTk1ZmEwY2IiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1NDY2ZWE1NS1lZWY3LTRkMWUtOTI2Mi03NTMzNDE4NjQ4Y2MiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjcyMDAwMC8xMDAwMCIgdGlmZjpZUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOlJlc29sdXRpb25Vbml0PSIyIiBleGlmOkNvbG9yU3BhY2U9IjEiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI4NzgiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSIxMTIiPiA8cGhvdG9zaG9wOlRleHRMYXllcnM+IDxyZGY6QmFnPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IiZsdDsvJmd0OyBhdXRvZ3JhZGVyIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSImbHQ7LyZndDsgYXV0b2dyYWRlciIvPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOlRleHRMYXllcnM+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTQ2NmVhNTUtZWVmNy00ZDFlLTkyNjItNzUzMzQxODY0OGNjIiBzdEV2dDp3aGVuPSIyMDIxLTA3LTA3VDIyOjAxOjQ0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MzgyMDJhZWItNGQ0NC00OWNmLWFhMTAtYmI2ZTQ1ZDc2YTJmIiBzdEV2dDp3aGVuPSIyMDIxLTA3LTA3VDIyOjA3OjM5KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YmI2MmFmN2MtNGFkNC00ZmNmLWFlMzktYThjZjM1OGIzMWNiIiBzdEV2dDp3aGVuPSIyMDIxLTA3LTA3VDIyOjA3OjM5KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzgyMDJhZWItNGQ0NC00OWNmLWFhMTAtYmI2ZTQ1ZDc2YTJmIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU0NjZlYTU1LWVlZjctNGQxZS05MjYyLTc1MzM0MTg2NDhjYyIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjU0NjZlYTU1LWVlZjctNGQxZS05MjYyLTc1MzM0MTg2NDhjYyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAL0AAABwCAYAAABLoXFaAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKamlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuZGFiYWNiYiwgMjAyMS8wNC8xNC0wMDozOTo0NCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTA3LTA3VDIyOjAxOjQ0KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIxLTA3LTExVDIzOjQ1OjAzKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wNy0xMVQyMzo0NTowMyswODowMCIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpmZWY3MWYzZS05ZDU5LTQ4N2EtYWJlYy01MmI4YzMxYjdhZDQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpmMDZmNWI3ZS1jNzMwLWJjNGUtOThhNi1lNDNiNThlNzg0YzAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1NDY2ZWE1NS1lZWY3LTRkMWUtOTI2Mi03NTMzNDE4NjQ4Y2MiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjcyMDAwMC8xMDAwMCIgdGlmZjpZUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOlJlc29sdXRpb25Vbml0PSIyIiBleGlmOkNvbG9yU3BhY2U9IjEiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI4NzgiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSIxMTIiPiA8cGhvdG9zaG9wOlRleHRMYXllcnM+IDxyZGY6QmFnPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IiZsdDsvJmd0OyBhdXRvZ3JhZGVyIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSImbHQ7LyZndDsgYXV0b2dyYWRlciIvPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOlRleHRMYXllcnM+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTQ2NmVhNTUtZWVmNy00ZDFlLTkyNjItNzUzMzQxODY0OGNjIiBzdEV2dDp3aGVuPSIyMDIxLTA3LTA3VDIyOjAxOjQ0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YzAyMDg5ODctZjg1Mi00MTZlLWE2MGUtZWRiODQ4NjhkZWE2IiBzdEV2dDp3aGVuPSIyMDIxLTA3LTExVDIzOjQ1OjAzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZmVmNzFmM2UtOWQ1OS00ODdhLWFiZWMtNTJiOGMzMWI3YWQ0IiBzdEV2dDp3aGVuPSIyMDIxLTA3LTExVDIzOjQ1OjAzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6YzAyMDg5ODctZjg1Mi00MTZlLWE2MGUtZWRiODQ4NjhkZWE2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU0NjZlYTU1LWVlZjctNGQxZS05MjYyLTc1MzM0MTg2NDhjYyIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjU0NjZlYTU1LWVlZjctNGQxZS05MjYyLTc1MzM0MTg2NDhjYyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjGN2OkAAAVGSURBVHja7Z3bkaMwEEWdwqTgr/2fFPhwAk6BFKjNgBRIgRRIgRRIgRS89hS75aVsY2E9+nFcdX8HT+u4UbeupMPlcjkg5EkEAQE9QkCPENAjBPQIAT1CQI8Q0CME9AgBPUJAj1AK6PnI/5x+/a6vmq66LOqvqojM8w/Q6wa+vYN9rTMRAnprwFcvgP+rI5ECekvQD29A3xIpoPeU5W8aiBbQe8ryP0Ut0QJ6C8B/vwn8TQ0RA3oL0HcB0H8RMaDXDvwxAPiOiAG9BejbAOi/iRjQawf+66qZrg3Qe4K+Ccjy2BCA3lWWH4kY0FuAvg7I8jURcw79zXi1OA//zXe1vf5XLspXmiI+s3oQtxroZYNyG7RR+8JNiSy/8cxJu4PTHPTLiuVgpeDb+OHea46xGBWw4jtobYuagX4p9kJWK8W39gKMZdHeXKspzVv+Hm0WZhPQB7bz/suOwv+vIWeWD6wf1NqYVUO/FKl7B+lHwqdp2S0HH8Zz1lDsqoT+jSL1or2nHThVO0Z8bh8jrpLrJVXQL4arGIMiuqdd0li2vD1jxVdksasG+kCzleo5aGCWrxI8v4kc606SzVk89EvPeI44AKL7zFKMZcsUcooMfwP0iYtUjQtS0oxlCbL+VHpaKQ76wMUlla/XSFl+zPy9Yk8vixW7YqDfubhkatUwMKvWBb5f7EZCkcUtEdAneoWq84eUMJYVbhkXaSwUhT5BkTprPQEg0FjWCPrO6savCPTaM0WimIy5LQde39RZobcyJ0yUBFR3oDTVZFmgt1b9JwBmsHKWjYbuW3LoKVKjZvlO0f8ldp0lGfReF5d2xKmIsUx5sVuLgt7z4tLOGsfFiWWSprfRoF8G0PXiUuIsXxn5kRdvZESBniJ1d3FvYlujkJb127OBj6CXOF9TNPDuTywrVfftgp7FpShZftZgORCYAD7u8AVBvxSpfYLXkqsLwaQbywomgiw14VvQ44CMPsATWf5l9y9psbsJPYtLSfrWXJ9TpthtN6FP0G+fDs4/AVl+PnF9ziEB+FOpTF87zl5k+XKdne1Mn3hOb74X/2AgzRjLEs/ph5TNktDuDdbgPFm+cwi7rO4Nffoog2raWPZhbFqxffonnYgZJ+VmnEKMZb0j2IvwI9V7Y80z33m3HEiaKcR0WbKA9TwuLo1lT4pUGy7LDNW32mI3sOV7Ngq7qO6ftp1TrcLBdm0sk7jOk2uPrEv7sWdjmcs9shmK3VH6dMCjsaz0BhFR0N+17noPxa43Y5mmsbV0wpmozeOejGXatouWPsvS5DEhXoxlWreLWj21uGixG9iy1XiWjerOnPXz6bM7OS0by6yswUi9iUStkzPwux+VwG5qtV3ynVNJ/Bkpi8ZAY9mgBHhz20U93i44pwq6JWOZ5bNIPd8j25Hls2X39sQ9smLmlk0hUCTfY1tbNwqqgj5BF2GM+GM0YSyL1EQQvf9ZJfQx550FsnwtPKaTdTOgauhX0O0pdufMoMwKYjmdjG/zNAH9B8VuH+GZpoxlO2omdRdmmIL+rovS52obWjOWLfWS6a2c5qC/G7ytxa06wjPOFnd9bby9Ru3bGs1CvwKzX2WoKtLfNmssW5JGv2o/mtjDax76xFBwYhnQu4LetH0Y6Pk8KpY5ywboXUHPiWVA7wr4EMsBWR7oTUBfez3LBuiZ2nDVENADPVke6K1C35DlgZ5CliwP9A7Ar7hJBOg9gr8+qmT2fg2mCegR8iCCgIAeIaBHCOgRAnqEgB4hoEcI6BECeoSAHiGgRwjoEQJ6hIAeIaBHCOiRR/0Bs9rYeZ+5qDsAAAAASUVORK5CYII=\"","import React from \"react\";\nimport CIcon from \"@coreui/icons-react\";\n\nconst _admin_nav = [\n {\n _tag: \"CSidebarNavItem\",\n name: \"My Submissions\",\n to: \"/mysubmissions\",\n icon: ,\n },\n {\n _tag: \"CSidebarNavTitle\",\n _children: [\"Admin\"],\n },\n {\n _tag: \"CSidebarNavItem\",\n name: \"Courses\",\n to: \"/courses\",\n icon: ,\n },\n {\n _tag: \"CSidebarNavItem\",\n name: \"Users\",\n to: \"/users\",\n icon: ,\n },\n {\n _tag: \"CSidebarNavItem\",\n name: \"Submissions\",\n to: \"/submissions\",\n icon: ,\n },\n {\n _tag: \"CSidebarNavItem\",\n name: \"Reports\",\n to: \"/reports\",\n icon: ,\n },\n];\n\nexport default _admin_nav;\n","import React from \"react\";\nimport CIcon from \"@coreui/icons-react\";\n\nconst _user_nav = [\n {\n _tag: \"CSidebarNavItem\",\n name: \"Courses\",\n to: \"/courses\",\n icon: ,\n },\n {\n _tag: \"CSidebarNavItem\",\n name: \"My Submissions\",\n to: \"/mysubmissions\",\n icon: ,\n },\n];\n\nexport default _user_nav;\n","import React from \"react\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport {\n CCreateElement,\n CSidebar,\n CSidebarBrand,\n CSidebarNav,\n CSidebarNavDivider,\n CSidebarNavTitle,\n CSidebarMinimizer,\n CSidebarNavDropdown,\n CSidebarNavItem,\n} from \"@coreui/react\";\n\nimport CIcon from \"@coreui/icons-react\";\nimport { toggle } from \"../redux/sidebar/sidebarSlice\";\n\nimport AuthService from \"../helpers/AuthService\";\nimport logo from \"../logo_white.png\";\nimport logoSymbol from \"../logo_symbol_white.png\";\n\n// sidebar nav config\nimport adminNavigation from \"./_admin_nav\";\nimport userNavigation from \"./_user_nav\";\n\nconst TheSidebar = () => {\n const dispatch = useDispatch();\n const { show } = useSelector((state) => state.sidebar);\n\n const navigationConfig = AuthService.isAdmin()\n ? adminNavigation\n : userNavigation;\n\n return (\n dispatch(toggle(val))}>\n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default React.memo(TheSidebar);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA24AAABwCAYAAABmZSMRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKamlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuZGFiYWNiYiwgMjAyMS8wNC8xNC0wMDozOTo0NCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTA3LTA3VDIyOjAxOjQ0KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIxLTA3LTA3VDIyOjA0OjA0KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wNy0wN1QyMjowNDowNCswODowMCIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyY2I1NGU2NS0yNTBlLTQzODAtODRkYy03MDJhZTk2ZDE1MjIiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpjZDEwZDI0NS02NDE5LWIwNGUtOWRiYS04OTM3ZTBkNjQ5NzAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1NDY2ZWE1NS1lZWY3LTRkMWUtOTI2Mi03NTMzNDE4NjQ4Y2MiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjcyMDAwMC8xMDAwMCIgdGlmZjpZUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOlJlc29sdXRpb25Vbml0PSIyIiBleGlmOkNvbG9yU3BhY2U9IjEiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI4NzgiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSIxMTIiPiA8cGhvdG9zaG9wOlRleHRMYXllcnM+IDxyZGY6QmFnPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IiZsdDsvJmd0OyBhdXRvZ3JhZGVyIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSImbHQ7LyZndDsgYXV0b2dyYWRlciIvPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOlRleHRMYXllcnM+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTQ2NmVhNTUtZWVmNy00ZDFlLTkyNjItNzUzMzQxODY0OGNjIiBzdEV2dDp3aGVuPSIyMDIxLTA3LTA3VDIyOjAxOjQ0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTA5MjQ2YTYtMTRmNC00NzYxLThhODUtYjUwNzJiMjIyNzgzIiBzdEV2dDp3aGVuPSIyMDIxLTA3LTA3VDIyOjA0OjA0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MmNiNTRlNjUtMjUwZS00MzgwLTg0ZGMtNzAyYWU5NmQxNTIyIiBzdEV2dDp3aGVuPSIyMDIxLTA3LTA3VDIyOjA0OjA0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTA5MjQ2YTYtMTRmNC00NzYxLThhODUtYjUwNzJiMjIyNzgzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU0NjZlYTU1LWVlZjctNGQxZS05MjYyLTc1MzM0MTg2NDhjYyIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjU0NjZlYTU1LWVlZjctNGQxZS05MjYyLTc1MzM0MTg2NDhjYyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAL0AAABwCAYAAABLoXFaAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKamlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuZGFiYWNiYiwgMjAyMS8wNC8xNC0wMDozOTo0NCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTA3LTA3VDIyOjAxOjQ0KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIxLTA3LTExVDIzOjQ2OjU2KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wNy0xMVQyMzo0Njo1NiswODowMCIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1NzE2ZDNhNS03ZmE1LTQ3ZTgtOTI3Ny0zYzc2NjIwZjQxZGYiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpkODFjN2I4MC0yZGYwLWUzNGMtYjZiYS0wZTQ2N2NjMzM2MGUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1NDY2ZWE1NS1lZWY3LTRkMWUtOTI2Mi03NTMzNDE4NjQ4Y2MiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjcyMDAwMC8xMDAwMCIgdGlmZjpZUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOlJlc29sdXRpb25Vbml0PSIyIiBleGlmOkNvbG9yU3BhY2U9IjEiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI4NzgiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSIxMTIiPiA8cGhvdG9zaG9wOlRleHRMYXllcnM+IDxyZGY6QmFnPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IiZsdDsvJmd0OyBhdXRvZ3JhZGVyIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSImbHQ7LyZndDsgYXV0b2dyYWRlciIvPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOlRleHRMYXllcnM+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTQ2NmVhNTUtZWVmNy00ZDFlLTkyNjItNzUzMzQxODY0OGNjIiBzdEV2dDp3aGVuPSIyMDIxLTA3LTA3VDIyOjAxOjQ0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTBkM2YzZDItMjdmZi00M2M2LTllY2MtNWM2OTE5Y2UwM2ZmIiBzdEV2dDp3aGVuPSIyMDIxLTA3LTExVDIzOjQ2OjU2KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTcxNmQzYTUtN2ZhNS00N2U4LTkyNzctM2M3NjYyMGY0MWRmIiBzdEV2dDp3aGVuPSIyMDIxLTA3LTExVDIzOjQ2OjU2KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTBkM2YzZDItMjdmZi00M2M2LTllY2MtNWM2OTE5Y2UwM2ZmIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU0NjZlYTU1LWVlZjctNGQxZS05MjYyLTc1MzM0MTg2NDhjYyIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjU0NjZlYTU1LWVlZjctNGQxZS05MjYyLTc1MzM0MTg2NDhjYyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhH374oAAAVgSURBVHja7Z3bkaMwEEUnBafgFCYFUnAKpOAUnIJTIAWn4BRIgRR6f6hdLzUeEG6hfhyq7u+AW2cadetKfInIF0KZRBAQ0CME9AgBPUJAjxDQIwT0CAE9QkCPENAjBPQI1YCey/4lIr2IjPLvGkSkIzK/xgzoHQ/eTd5fFyIE9NEGrpP160ykgD7SwD02QH8jUkCfKcuLiDyIFtBnyvIiIgPRAvoIA/Yt268rEQP6CAN2L4D+RMSA3vtgnQuAvxMxoI8wWLcC6L+JGNB7H6iTiEx0bYA+00BdC7I8NgSgT5Xln0QM6CMMUl+Q5Xsilhx6EbnMzsO/811vr/+Fi/K3a1S8Z/dD3Hqgt/3DOhF5el+4aZHlV+45endwhoN+XrF8RCn4Vv5xX69JYzGqYMX34bUtGgb6udgrWa0039orMJapvbkWU5pN/h5vFuYQ0Be28/7LjsZ/1+PILF9YP7i1MbuGfi5S9w6SiOEfWWgsuyve95N4Th6KXZfQbyhSxXtPu3Cqdla876ARV8v1kivoZ8OVxqCY7mm3NJbNb0+ty2Sx6wb6QrOV6zloYZbvKtz/qhzruyWbs3no557xpDgApvvMVoxl8xRyVIb/CvSVi1SPC1LWjGUVsv7YelppDvrCxSWXr1elLP88+Lm0p5fNil0z0O9cXAq1aliYVfsGz6fdSGiyuGUC+kqvUHf+kBbGssYt4yaNhabQVyhSJ68nABQay66Gntnd+DWB3numqBSTQ41lmd/Uh0IfZU5YKQm47kB5qskOgT5a9V9hEEq6VSfjv8V896069BSpqln+7uh3mV1nqQZ91sWlHXFqYixzXuz2pqDPvLi0s8ZJcWKZpemtGvTzAKZeXKqc5bsg/+TNGxkq0FOk7i7uQ2xrNNKy3jwb+Ah6i/M1RwOf/sSyVnXfLuhZXFLJ8luTxUgC0O3wFUE/F6lDhddSqg+CWTeWNUwEh9SEm6DHAak+wCNZ/tfuX9VidxV6Fpeq9K3Trks0LnZvq9BX6LePX8mvgixvzljWKF7PCkm3SabvE2cvsny7zs56pq88pw/fi/9hIMMYyyrP6Wus6G+f0y8eCGvwMVn+nhB2W90b+vQqgxraWPZhbG4VptA6ffo3nYhJ+YEjOilLjGVDItib8GPVexPNM5/KWNayHbnx/mouSxaw3sclpbHsTZEaw2V5QPXtttgtbPlegsJuqvvnbefUzeFgpzaWWVznkYP2yKa0H2c2lknGPbIHFLtP69OBjMay1htETEH/0rrTLmSsHvyfyljmaWwl0Aln1g7+T2Ms87ZdVBqfZRnymJAsxjKv20Ul6KnFTYvdwpatx7NsXHfmJPj59Ic7OSMby6KswYjRL5G4dXIWPvvZCeyhVtvF8DenqvgzahaNhcayhxPgw20XlYRfF5xqBT2SsUwCn0Uqib8jeyfLH5bdq75hw0JfaW55bQSK5e/Y9h5rqbDQV+giPBX/GUMYy5SaCKb3P7uEXnPe2SDL98ZjOn5YL/UOuPEL/QK6PcXudDAok4NYjp6L1DTQf1DsDgr3DGUs21EzuftgRijoX7ooW+el3YGZ0YWxbK6XQm/lDAf9yw9bW9zqFe5xibjra+XtZX4fQ1roF2AOiwzVKf3tsMayOWkMi/bjJQgTsaGvDEVIY1mCsQN6sjzQA/22YpmzbIA+VdA4sQzoUwWsxHJAlgf6EAHro1gOgB7otac2I9EC+mzQk+WBPkzArmR5oKeQJcsDfYKgdTWdm1xAbzVwy6NKJkn+GcwQ0COUQQQBAT1CQI8Q0CME9AgBPUJAjxDQIwT0CAE9QkCPENAjBPQIAT1CQI8Q0KOM+gNwCi1qfHL2FQAAAABJRU5ErkJggg==\"","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { withRouter } from \"react-router-dom\";\nimport useGoogleAnalytics from \"../helpers/useGoogleAnalytics\";\nimport { TheContent, TheSidebar, TheFooter, TheHeader } from \"./index\";\n\nconst TheLayout = (props) => {\n useGoogleAnalytics();\n const { isLoggedIn } = useSelector((state) => state.login);\n\n if (!isLoggedIn) {\n props.history.push(\"/login\");\n }\n\n return (\n
\n \n
\n \n
\n \n
\n \n
\n
\n );\n};\n\nexport default withRouter(TheLayout);\n","import React from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nimport analytics from \"./analytics\";\n\nexport default function useGoogleAnalytics() {\n const location = useLocation();\n\n React.useEffect(() => {\n analytics.init();\n }, []);\n\n React.useEffect(() => {\n const currentPath = location.pathname + location.search;\n analytics.sendPageview(currentPath);\n }, [location]);\n}\n","import React, { useState } from \"react\";\nimport {\n CButton,\n CCard,\n CCardBody,\n CCardGroup,\n CCol,\n CContainer,\n CForm,\n CInput,\n CInputGroup,\n CInputGroupPrepend,\n CInputGroupText,\n CRow,\n CAlert,\n} from \"@coreui/react\";\nimport CIcon from \"@coreui/icons-react\";\n\nimport { useForm } from \"../../helpers/useForm\";\nimport Api from \"../../helpers/Api\";\nimport { withRouter } from \"react-router-dom\";\n\nfunction ResetPassword(props) {\n const [error, setError] = useState(null);\n const [{ email }, handleChange] = useForm({\n email: \"\",\n });\n\n async function handleSubmit(e) {\n e.preventDefault();\n\n try {\n await Api.requestresetpassword(email);\n setError(null);\n\n alert(\n \"Please check your email for the password reset link. Note that the email might be in the spam folder.\"\n );\n } catch (e) {\n if (e.response && e.response.data && e.response.data.error) {\n setError(e.response.data.error);\n } else {\n setError(\"Unable to reset password\");\n }\n }\n }\n\n return (\n
\n \n \n \n \n \n \n \n

Reset Password

\n

\n Note that NUS email server seems to be blocking the email\n sent from Autograder. Please contact your instructor if\n you did not receive the reset email.\n

\n

Enter your email

\n {error ? {error} : \"\"}\n \n \n \n \n \n \n \n \n \n \n {\n props.history.push(\"/login\");\n }}\n >\n Cancel\n \n \n \n \n Send Reset Link\n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n );\n}\n\nexport default withRouter(ResetPassword);\n","import React, { useState, useEffect, useRef } from \"react\";\nimport {\n CButton,\n CCard,\n CCardBody,\n CCardGroup,\n CCol,\n CContainer,\n CForm,\n CRow,\n} from \"@coreui/react\";\nimport { withRouter } from \"react-router-dom\";\nimport PulseLoader from \"react-spinners/PulseLoader\";\nimport Api from \"../../helpers/Api\";\nimport { useQuery } from \"../../helpers/useQuery\";\nimport FormInput from \"../FormInput\";\nimport { useForm } from \"../../helpers/useForm\";\n\nfunction SetPassword(props) {\n let query = useQuery();\n const hash = query.get(\"hash\");\n const uid = query.get(\"uid\");\n if (!hash || !uid) {\n props.history.push(\"/resetpassword\");\n }\n\n let [{ password, cpassword }, handleChange] = useForm({\n password: \"\",\n cpassword: \"\",\n opassword: \"\",\n });\n\n const passwordRef = useRef(null);\n\n const [loading, setLoading] = useState(true);\n\n const checkHash = async () => {\n if (!hash || !uid) {\n return;\n }\n\n try {\n await Api.checkhash(uid, hash);\n setLoading(false);\n passwordRef.current.focus();\n } catch (e) {\n if (e.response && e.response.data && e.response.data.error) {\n alert(e.response.data.error);\n } else {\n alert(\"Unexpected error, please try resetting password again.\");\n }\n props.history.push(\"/resetpassword\");\n }\n };\n\n const checkPassword = () => {\n if (!password) {\n password = \"\";\n }\n\n if (!cpassword) {\n cpassword = \"\";\n }\n\n if (password !== cpassword) {\n alert(\"Password do not match\");\n return false;\n }\n return true;\n };\n\n useEffect(() => {\n checkHash();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n async function handleSubmit(e) {\n e.preventDefault();\n\n if (!checkPassword()) {\n return;\n }\n\n try {\n await Api.resetpassword(uid, hash, password);\n\n alert(\"Password successfully changed\");\n props.history.push(\"/login\");\n } catch (e) {\n if (e.response && e.response.data && e.response.data.error) {\n alert(e.response.data.error);\n } else {\n alert(\"Unable to reset password\");\n }\n }\n }\n\n return loading ? (\n
\n \n
\n ) : (\n
\n \n \n \n \n \n \n \n

Specify Password

\n

Enter a new password

\n \n \n \n \n {\n props.history.push(\"/login\");\n }}\n >\n Cancel\n \n \n \n \n Save\n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n );\n}\n\nexport default withRouter(SetPassword);\n","import React from \"react\";\nimport { BrowserRouter, Route, Switch } from \"react-router-dom\";\nimport PrivateRoute from \"./components/PrivateRoute\";\nimport Login from \"./components/Login\";\n\nimport \"./scss/style.scss\";\n\nimport TheLayout from \"./containers/TheLayout\";\nimport ResetPassword from \"./components/ResetPassword\";\nimport SetPassword from \"./components/SetPassword\";\n\nfunction App() {\n return (\n \n \n \n \n \n \n \n \n );\n}\n\nexport default App;\n","import { configureStore } from \"@reduxjs/toolkit\";\nimport sidebarReducer from \"../redux/sidebar/sidebarSlice\";\nimport loginReducer from \"../redux/login/loginSlice\";\nimport coursesReducer from \"../redux/courses/coursesSlice\";\nimport exercisesReducer from \"../redux/exercises/exercisesSlice\";\nimport testsReducer from \"../redux/tests/testsSlice\";\nimport usersReducer from \"../redux/users/usersSlice\";\n\nexport const store = configureStore({\n reducer: {\n login: loginReducer,\n sidebar: sidebarReducer,\n courses: coursesReducer,\n exercises: exercisesReducer,\n tests: testsReducer,\n users: usersReducer,\n },\n});\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"core-js\";\nimport App from \"./App\";\nimport { store } from \"./app/store\";\nimport { Provider } from \"react-redux\";\nimport {\n cilPeople,\n cilPencil,\n cilCloudUpload,\n cilUser,\n cilLockLocked,\n cilSchool,\n cilCode,\n cilGauge,\n cilGraph,\n cilChevronBottom,\n cilChevronTop,\n cilFile,\n cilXCircle,\n} from \"@coreui/icons\";\n\nconst icons = {\n cilPencil,\n cilPeople,\n cilCloudUpload,\n cilUser,\n cilLockLocked,\n cilSchool,\n cilCode,\n cilGauge,\n cilGraph,\n cilChevronBottom,\n cilChevronTop,\n cilFile,\n cilXCircle,\n};\n\nReact.icons = icons;\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById(\"root\")\n);\n","import { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport Api from \"../../helpers/Api\";\nimport AuthService from \"../../helpers/AuthService\";\nimport { handleReduxErrorCase } from \"../../helpers/Misc\";\n\nexport const getCurrentUserAsync = createAsyncThunk(\n \"login/getCurrentUser\",\n //arg is not used\n async (arg, thunkAPI) => {\n try {\n const { data } = await Api.getCurrentUser();\n return data;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const updateCurrentUserAsync = createAsyncThunk(\n \"login/updateCurrentUser\",\n async ({ user, successCb }, thunkAPI) => {\n try {\n await Api.updateCurrentUser(user);\n\n if (successCb) successCb();\n return user;\n } catch (e) {\n return handleReduxErrorCase(e, thunkAPI);\n }\n }\n);\n\nexport const loginSlice = createSlice({\n name: \"login\",\n initialState: {\n isLoggedIn: AuthService.isLoggedIn(),\n user: null,\n },\n reducers: {\n login: (state, action) => {\n state.isLoggedIn = true;\n if (action.payload) {\n state.user = action.payload;\n }\n },\n logout: (state) => {\n state.isLoggedIn = false;\n state.user = null;\n AuthService.logout();\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(getCurrentUserAsync.fulfilled, (state, action) => {\n if (action.payload) {\n state.user = action.payload;\n }\n })\n .addCase(updateCurrentUserAsync.fulfilled, (state, action) => {\n const updatedUser = action.payload;\n if (updatedUser) {\n if (!updatedUser.password) {\n console.log(\"###in here!!!\");\n const updatedUser = Object.assign({}, state.user, action.payload);\n state.user = updatedUser;\n }\n }\n });\n },\n});\n\nexport const { login, logout } = loginSlice.actions;\nexport default loginSlice.reducer;\n","import { useState } from \"react\";\n\n//this custom hook will set the state according to the form element name\n//mainly used for textboxes input\n//returns [values, handleChange, setValues]\nexport const useForm = (initialValues) => {\n const [values, setValues] = useState(initialValues);\n\n return [\n values,\n (e) => {\n if (e.target.type === \"checkbox\") {\n setValues({\n ...values,\n [e.target.name]: e.target.checked,\n });\n } else {\n setValues({\n ...values,\n [e.target.name]: e.target.value,\n });\n }\n },\n setValues,\n ];\n};\n"],"sourceRoot":""}