{"version":3,"sources":["services/constants/pageTypes.js","comments/apiConfig.js","comments/state/commentActions.js","services/utilities/generateActions.js","services/api/api.js","services/api/authorizationHeader.js","auth/apiConfig.js","auth/state/authActions.js","app/apiConfig.js","app/state/appActions.js","hooks/useTranslations.js","course/apiConfig.js","course/state/courseActions.js","services/utilities/storage.js","app/state/appSelectors.js","common/Loader.js","auth/state/authSelectors.js","app/state/appReducer.js","auth/state/authReducer.js","static-page/state/staticPageReducer.js","course/state/courseReducer.js","comments/state/commentReducer.js","contact/state/contactReducer.js","store.js","promiseMiddleware.js","hooks/useRedirectUrlCalculation.js","static-page/state/staticPageSelectors.js","hooks/useUrlFormValidityCheck.js","static-page/apiConfig.js","static-page/state/staticPageActions.js","contact/apiConfig.js","contact/state/contactActions.js","course/state/courseSelectors.js","services/translations/translations.js","services/translations/TranslationContext.js","assets/img/icons/avatar.png","assets/img/logos-home.png","assets/img/logos.png","services/enums/courseTypes.js","hooks/useErrorStatusCheck.js","comments/CommentLayout.js","comments/state/commentSelectors.js","comments/ConditionalWrapper.js","common/editor/JoditEditor.js","common/editor/HtmlEditor.js","comments/components/FileInput.js","comments/components/CommentInput.js","comments/Post.js","hooks/useTransformList.js","comments/components/DeleteModal.js","comments/CommentList.js","comments/helpers/validateUploadedFile.js","services/constants/roles.js","assets/img/logo.gif","assets/img/icons/FR@2x.png","assets/img/icons/GB@2x.png","assets/img/icons/IT@2x.png","app/ScrollToTop.js","common/Footer.js","navigation/PrivateRoute.js","common/header/HomePageHeader.js","common/header/InnerPageHeader.js","static-page/StaticPage.js","common/header-nav/TopBar.js","common/header-nav/NavBar.js","common/header-nav/HeaderNav.js","static-page/StaticPageLayout.js","auth/AuthLayout.js","common/header/CoursePageHeader.js","course/CourseLayout.js","contact/ContactLayout.js","navigation/routes.js","hooks/useForceUpdate.js","services/api/refreshTokenInterceptor.js","app/App.js","serviceWorker.js","index.js"],"names":["PAGE_TYPES","static","login","register","contact","courseInformative","courseStatic","courseWork","courseLecture","courseTest","courseFinalForm","getComments","data","path","staticPageLanguageId","lectureLanguageId","createComment","method","headers","onUploadProgress","get","progressEvent","loaded","total","percentage","Math","floor","store","dispatch","getFileUploadPercentage","updateComment","deleteComment","id","getFileLinkForDownload","sendEmailNotificationOnReply","GET_COMMENTS","generateActions","GET_SELECTED_COMMENT","CREATE_COMMENT","UPDATE_COMMENT","DELETE_COMMENT","GET_FILE","UPLOAD_FILE_PROGRESS","SEND_EMAIL_NOTIFICATION","RESET_COMMENT_STATE","type","ACTION","promise","callApi","getCommentsApi","resetCommentState","getFileLinkForDownloadApi","progress","payload","sendEmailNotificationOnReplyApi","createCommentAndUpdateState","pageData","createCommentApi","then","updateCommentAndUpdateState","updateCommentApi","deleteCommentAndUpdateState","deleteCommentApi","action","REQUEST","SUCCESS","ERROR","successNotificationConfig","customErrorCallback","authHeader","authState","getAuthStateFromStorage","token","Authorization","authorizationHeader","apiCallHeaders","Accept","axios","url","responseType","res","status","Promise","reject","message","errors","catch","error","verifyRegistrationQueryParams","getCoursesForRegistration","languageId","courseLanguageId","refreshToken","LOGIN","REGISTER","VERIFY_REGISTRATION_QUERY_PARAMS","GET_COURSES_FOR_REGISTRATION","REFRESH_TOKEN","LOGOUT","registerApi","logout","removeAuthStateFromStorage","verifyRegistrationQueryParamsApi","getCoursesForRegistrationApi","loginThenSaveToStorage","getState","loginApi","auth","setAuthStateToStorage","tokenExpiry","user","refreshTokenThenSaveToStorage","refreshTokenApi","getCoursesMenu","getCourseContextualMenu","getStaticPagesMenu","GET_LANGUAGES","GET_COURSES_MENU","GET_COURSE_CONTEXTUAL_MENU","GET_STATIC_PAGES_MENU","CHANGE_LANGUAGE","getLanguages","changeLanguage","lang","setLanguageToStorage","getCoursesMenuApi","getCourseContextualMenuApi","getStaticPagesMenuApi","useTranslations","context","useContext","TranslationContext","Error","getCourseDetails","getCourseLectureList","getCourseLectureDetails","getLectureTest","postLectureTest","postCourseFinalForm","GET_COURSE_DETAILS","GET_COURSE_LECTURE_LIST","GET_COURSE_LECTURE_DETAILS","GET_LECTURE_TEST","POST_LECTURE_TEST","POST_COURSE_FINAL_FORM","getCourseDetailsApi","getCourseLectureListApi","getCourseLectureDetailsApi","getLectureTestApi","postLectureTestApi","postCourseFinalFormApi","stringifiedState","localStorage","getItem","JSON","parse","authData","setItem","stringify","removeItem","getLanguageFromStorage","state","app","languages","getCurrentLanguage","currentLanguage","coursesMenu","courseContextualMenu","getStaticPageTranslationLanguage","staticPages","selectedItem","language","getCourseTranslationLanguage","courses","staticPagesMenu","getHomePageInMenu","homePageInMenu","getHomePageId","Loader","className","getIsAuthenticating","isLogging","getIsAuthenticated","isAuthenticated","getAuthErrors","getUsername","userName","hasCheckedUrlValidity","hasCheckedRegistrationUrlValidity","getIsRegistrationUrlValid","registrationUrlValid","getIsAdvancedFormFieldSetVisible","registrationAdvancedFormFieldSetVisible","getCourses","getCourseCodeLanguage","getIsRegistering","isRegistering","getIsRegistered","isRegistered","INITIAL_STATE","code","areLanguagesFetching","areLanguagesFetched","isLanguageFetchError","isCoursesMenuFetching","isCoursesMenuFetched","isCoursesMenuFetchError","isCourseContextualMenuFetching","isCourseContextualMenuFetched","isCourseContextualMenuFetchError","isStaticPagesMenuFetching","isStaticPagesMenuFetched","isStaticPagesMenuFetchError","refreshTokenId","Object","keys","length","isError","areCoursesFetching","areCoursesFetched","isCourseFetchError","isItemFetching","isItemFetched","isItemFetchError","itemFetchErrorStatus","lecturesList","isLectureListFetching","isLectureListFetched","isLectureListFetchError","selectedLecture","isLectureFetching","isLectureFetched","isLectureFetchError","lectureFetchErrorStatus","selectedTest","isTestFetching","isTestFetched","isTestFetchError","testFetchErrorStatus","isTestSubmitting","isTestSubmitted","isTestSubmitError","isFinalFormSubmitting","isFinalFormSubmitted","finalFormSubmitError","list","selectedFileUrl","isFetching","isFetched","isSaving","isSaved","isReplySending","isReplySent","uploadProgress","sending","sent","rootReducer","combineReducers","map","course","homePage","find","x","isHomePage","filter","page","valid","isAdvancedRegistrationFormFieldSet","response","GET_STATIC_PAGE_DETAILS","questions","previousLectureLanguageId","rest","canTakeTest","question","questionResults","answers","answer","answerResults","comments","fileDownloadLink","SEND_EMAIL","RESET_CONTACT_STATE","createStore","composeWithDevTools","applyMiddleware","thunk","FAILURE","useRedirectUrlCalculation","pageType","useParams","isCourseOrStaticPageIdFormValid","useUrlFormValidityCheck","useMemo","getSelectedStaticPage","getStaticPageHeaderData","title","subtitle","subTitle","getIsStaticPageLoading","getStaticPageFetchErrorStatus","courseOrStaticPageId","courseLectureId","lectureId","courseStaticPageId","pageId","pathname","useLocation","isWholeUrlFormValid","Number","isFinite","getStaticPageDetails","getStaticPageDetailsApi","sendEmail","sendEmailApi","resetContactState","getCourse","getCourseId","getCourseName","informativeTitle","getIsCourseLoading","getCourseFetchErrorStatus","getLectures","getLecture","getLectureFetchErrorStatus","getLectureHeaderData","getIsLectureLoading","getIsLectureTestLoading","getLectureTestFetchErrorStatus","getTestHeaderData","getIsLectureTestSubmitting","getIsLectureTestSubmitted","getIsFinalFormSubmitting","getIsFinalFormSubmitted","strings","LocalizedStrings","en","slogan","clientName","welcome","cancel","basic","advanced","male","female","other","startCourse","score","points","startsOn","totalScore","goToDiscussion","test","repeatTest","submitTest","previousLecture","nextLecture","backToLecture","totalPoints","scoredPoints","correct","incorrect","foundWords","finish","finalForm","coursePassedBasic","courseFailedBasic","coursePassedAdvanced","getCertificate","retakeTest","formInstructions","shareImprovementIdeas","sectionDivider","topicContent","trainingMethodology","documentsMaterial","simulationGame","trainers","coordinationAndAssistance","whatWasGood","whatCouldBeBetter","submit","thankYou","dataSubmitted","loginInstructions","registerInstructions","username","usernameHelperText","password","passwordHelperText","repeatPassword","email","courseLevel","name","lastName","gender","dateOfBirth","nationality","education","workplace","faculty","country","city","address","telephone","skype","reason","expectation","required","credentials","maxLength","minLength","uniqueUsername","uniqueEmail","confirmPassword","weakPassword","fileType","fileSize","date","form","userNotApproved","placeholder","reply","noPosts","selectFile","noFile","uploadingFile","fileUploaded","edit","delete","subject","fr","it","createContext","TranslationProvider","props","t","translations","value","Provider","module","exports","courseTypes","Basic","Advanced","useErrorStatusCheck","selectorFn","errorStatus","useSelector","useState","hasError","setHasError","useEffect","CommentLayout","children","fallback","getCommentsFromState","getFileUrl","getUploadProgressPercentage","getAuthenticatedUser","ConditionalWrapper","condition","wrapper","JoditEditor","forwardRef","ref","defaultValue","config","tabIndex","textArea","useRef","useLayoutEffect","current","element","Jodit","make","destruct","HtmlEditor","editorRef","getLanguage","autofocus","zIndex","readonly","buttons","buttonsMD","buttonsXS","removeButtons","removeButtonsMD","removeButtonsXS","toolbarButtonSize","theme","enableDragAndDropFileToEditor","saveModeInCookie","spellcheck","width","minHeight","direction","debugLanguage","editorCssClass","i18n","toolbar","enter","useSplitMode","colorPickerDefaultTab","askBeforePasteHTML","askBeforePasteFromWord","disablePlugins","events","textIcons","toolbarAdaptive","iframe","r","FileInput","inputRef","onChange","onRemove","fileName","file","hidden","e","onClick","click","href","CommentInput","avatar","defaultValues","onSubmit","validations","commentInputRef","currentId","data-role","src","alt","text","style","size","Post","comment","isChild","parent","render","onEdit","onDelete","onRemoveFile","addReply","onFileDownload","toggleReply","editing","authenticatedUser","canBeDeleted","canDeleteComment","roleId","ROLES","Administrators","moment","createdOnDate","locale","fromNow","canEditComment","modifiedOnDate","dangerouslySetInnerHTML","__html","rel","download","level","classNames","selected","useTransformList","getNestedList","useCallback","hash","nestedCommentTree","forEach","parentCommentId","push","DeleteModal","onCancel","initialState","List","useDispatch","idToDelete","selectedFile","setValidations","setToggleReply","isDeleteModalVisible","setIsDeleteModalVisible","0","values","setValues","toggleEdit","setToggleEdit","setTimeout","window","location","handleClickOutside","event","contains","target","document","addEventListener","removeEventListener","handleChange","preventDefault","files","extension","slice","lastIndexOf","includes","toLowerCase","validateFileType","prevState","handleEdit","closeModal","handlePostComment","parentOrSelf","commentText","formData","FormData","newComment","append","userId","entries","key","LanguageCode","content","replyUrl","count","renderComments","posts","post","index","handleReplyClick","handleDelete","System","Professors","StudentsAdvanced","StudentsBasic","ScrollToTop","scrollTo","Footer","logo","height","aria-label","PrivateRoute","Component","component","Layout","layout","roles","to","from","Header","StaticPage","isUrlValid","isLoading","homePageId","history","useHistory","fetchError","redirectUrl","replace","InnerPageHeader","HomePageHeader","courseTypeId","hasComments","imgToLangMapper","englishFlag","frenchFlag","italianFlag","TopBar","langMenuOpened","setLangMenuOpened","menuRef","listWrapperClasses","classnames","langSelect","openLang","getMenuItemClasses","hrefLang","NavBar","getStaticPagesMenuSelector","getCoursesMenuSelector","getCourseContextualMenuSelector","logoHome","logoForRender","setLogoForRender","some","body","classList","remove","add","getContextualMenuItemUrl","isInformativePage","isWorkingPage","isStaticPage","aria-current","menuTitle","HeaderNav","StaticPageLayout","cloneElement","AuthLayout","headerTitle","endsWith","CourseLayout","staticPageHeaderData","lectureHeaderData","testHeaderData","CoursePageHeader","informativeSubtitle","workTitle","workSubtitle","ContactLayout","Login","lazy","Register","CourseInformativePage","CourseStaticPage","CourseWorkPage","Lecture","Test","FinalFormPage","ContactForm","routes","private","exact","useForceUpdate","create","refreshTokenInterceptor","interceptors","use","initialRequest","tokens","resolve","App","forceUpdate","isChecked","isValid","courseLanguage","staticPageLanguage","courseTranslationLanguage","getLanguagesFromStore","search","isRegisterUrlFormValid","queryParams","queryString","isCourseLanguageIdValid","isRoleIdValid","authTokenState","Date","setLanguage","route","Boolean","hostname","match","ReactDOM","StrictMode","reCaptchaKey","getElementById","navigator","serviceWorker","ready","registration","unregister","console"],"mappings":"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","file":"static/js/main.a60bef8d.chunk.js","sourcesContent":["const PAGE_TYPES = {\r\n static: \"static\",\r\n login: \"login\",\r\n register: \"register\",\r\n contact: \"contact\",\r\n courseInformative: \"course:informative\",\r\n courseStatic: \"course:static\",\r\n courseWork: \"course:work\",\r\n courseLecture: \"course:lecture\",\r\n courseTest: \"course:test\",\r\n courseFinalForm: \"course:final-form\"\r\n};\r\n\r\nexport { PAGE_TYPES };\r\n","import { store } from \"../store\";\r\nimport { getFileUploadPercentage } from \"./state/commentActions\";\r\n\r\nexport function getComments(data) {\r\n return {\r\n path: `comments?staticPageLanguageId=${\r\n data.staticPageLanguageId || \"\"\r\n }&lectureLanguageId=${data.lectureLanguageId || \"\"}`\r\n };\r\n}\r\n\r\nexport function getSelectedComment(id) {\r\n return {\r\n path: `comments/${id}`\r\n };\r\n}\r\n\r\nexport function createComment(data) {\r\n return {\r\n path: `comments`,\r\n method: \"POST\",\r\n data,\r\n headers: {\r\n \"Content-Type\": \"multipart/form-data\"\r\n },\r\n onUploadProgress: data.get(\"file\")\r\n ? progressEvent => {\r\n const { loaded, total } = progressEvent;\r\n let percentage = Math.floor((loaded * 100) / total);\r\n // setTimeout(() => percentage, 1000);\r\n store.dispatch(getFileUploadPercentage(percentage));\r\n }\r\n : null\r\n };\r\n}\r\nexport function updateComment(data) {\r\n return {\r\n path: `comments/${data.get(\"id\")}`,\r\n method: \"PUT\",\r\n data,\r\n headers: {\r\n \"Content-Type\": \"multipart/form-data\"\r\n },\r\n onUploadProgress: data.get(\"file\")\r\n ? progressEvent => {\r\n const { loaded, total } = progressEvent;\r\n let percentage = Math.floor((loaded * 100) / total);\r\n store.dispatch(getFileUploadPercentage(percentage));\r\n }\r\n : null\r\n };\r\n}\r\n\r\nexport function deleteComment(id) {\r\n return {\r\n path: `comments/${id}`,\r\n method: \"DELETE\",\r\n data: id\r\n };\r\n}\r\nexport function getFileLinkForDownload(id) {\r\n return {\r\n path: `comments/${id}/files`,\r\n data: id\r\n };\r\n}\r\n\r\nexport function sendEmailNotificationOnReply(data) {\r\n return {\r\n path: \"comments/email-notification\",\r\n method: \"POST\",\r\n data\r\n };\r\n}\r\n","import { callApi } from \"../../services/api/api\";\r\n\r\nimport {\r\n getComments as getCommentsApi,\r\n getSelectedComment as getSelectedCommentApi,\r\n createComment as createCommentApi,\r\n updateComment as updateCommentApi,\r\n deleteComment as deleteCommentApi,\r\n getFileLinkForDownload as getFileLinkForDownloadApi,\r\n sendEmailNotificationOnReply as sendEmailNotificationOnReplyApi\r\n} from \"../apiConfig\";\r\nimport generateActions from \"../../services/utilities/generateActions\";\r\n\r\nexport const GET_COMMENTS = generateActions(\"GET_COMMENTS\");\r\nexport const GET_SELECTED_COMMENT = generateActions(\"GET_SELECTED_COMMENT\");\r\nexport const CREATE_COMMENT = generateActions(\"CREATE_COMMENT\");\r\nexport const UPDATE_COMMENT = generateActions(\"UPDATE_COMMENT\");\r\nexport const DELETE_COMMENT = generateActions(\"DELETE_COMMENT\");\r\nexport const GET_FILE = generateActions(\"GET_FILE\");\r\nexport const UPLOAD_FILE_PROGRESS = \"UPLOAD_FILE_PROGRESS\";\r\n\r\nexport const SEND_EMAIL_NOTIFICATION = generateActions(\r\n \"SEND_EMAIL_NOTIFICATION\"\r\n);\r\n\r\nexport const RESET_COMMENT_STATE = \"RESET_COMMENT_STATE\";\r\n\r\nexport const getComments = ({ data }) => {\r\n return {\r\n type: GET_COMMENTS.ACTION,\r\n promise: callApi(getCommentsApi(data))\r\n };\r\n};\r\nexport const getSelectedComment = ({ id }) => {\r\n return {\r\n type: GET_SELECTED_COMMENT.ACTION,\r\n promise: callApi(getSelectedCommentApi(id))\r\n };\r\n};\r\n\r\nexport const createComment = ({ data }) => {\r\n return {\r\n type: CREATE_COMMENT.ACTION,\r\n promise: callApi(createCommentApi(data))\r\n };\r\n};\r\nexport const updateComment = ({ data }) => {\r\n return {\r\n type: UPDATE_COMMENT.ACTION,\r\n promise: callApi(updateCommentApi(data))\r\n };\r\n};\r\nexport const deleteComment = id => {\r\n return {\r\n type: DELETE_COMMENT.ACTION,\r\n promise: callApi(deleteCommentApi(id))\r\n };\r\n};\r\n\r\nexport const resetCommentState = () => {\r\n return {\r\n type: RESET_COMMENT_STATE\r\n };\r\n};\r\n\r\nexport function getFileLinkForDownload(id) {\r\n return {\r\n type: GET_FILE.ACTION,\r\n promise: callApi(getFileLinkForDownloadApi(id))\r\n };\r\n}\r\nexport function getFileUploadPercentage(progress) {\r\n return {\r\n type: UPLOAD_FILE_PROGRESS,\r\n payload: progress\r\n };\r\n}\r\n\r\nexport function sendEmailNotificationOnReply({ data }) {\r\n return {\r\n type: SEND_EMAIL_NOTIFICATION.ACTION,\r\n promise: callApi(sendEmailNotificationOnReplyApi(data)),\r\n payload: data\r\n };\r\n}\r\n\r\nexport function createCommentAndUpdateState({ data, pageData }) {\r\n return dispatch => {\r\n return dispatch(createComment({ data }))\r\n .then(() => dispatch(resetCommentState()))\r\n .then(() => dispatch(getComments({ data: pageData })));\r\n };\r\n}\r\n\r\nexport function updateCommentAndUpdateState({ data, pageData }) {\r\n return dispatch => {\r\n return dispatch(updateComment({ data }))\r\n .then(() => dispatch(resetCommentState()))\r\n .then(() => dispatch(getComments({ data: pageData })));\r\n };\r\n}\r\n\r\nexport function deleteCommentAndUpdateState({ id, data }) {\r\n return dispatch => {\r\n return dispatch(deleteComment(id))\r\n .then(() => dispatch(resetCommentState()))\r\n .then(() => dispatch(getComments({ data })));\r\n };\r\n}\r\n","const generateActions = action => {\r\n return {\r\n ACTION: action,\r\n REQUEST: `${action}_REQUEST`,\r\n SUCCESS: `${action}_SUCCESS`,\r\n ERROR: `${action}_ERROR`\r\n };\r\n};\r\n\r\nexport default generateActions;\r\n","import axios from \"axios\";\r\n\r\nimport { authorizationHeader } from \"./authorizationHeader\";\r\n\r\nexport function callApi({\r\n method = \"get\",\r\n path,\r\n data,\r\n headers = {},\r\n successNotificationConfig = null,\r\n customErrorCallback = null,\r\n onUploadProgress\r\n}) {\r\n const authHeader = authorizationHeader();\r\n const apiCallHeaders = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n ...authHeader,\r\n ...headers\r\n };\r\n\r\n return axios({\r\n method,\r\n headers: apiCallHeaders,\r\n url: `/api/${path}`,\r\n data,\r\n responseType: \"json\",\r\n onUploadProgress\r\n })\r\n .then(res => {\r\n if (!res || res.status === 500) {\r\n return Promise.reject({\r\n status: 500,\r\n message: res?.data?.errors || \"\"\r\n });\r\n }\r\n\r\n if (successNotificationConfig) {\r\n // handle success\r\n }\r\n return res.data;\r\n })\r\n .catch(error => {\r\n if (customErrorCallback && typeof customErrorCallback === \"function\") {\r\n customErrorCallback(error);\r\n } else {\r\n // handle error\r\n }\r\n\r\n return Promise.reject(error);\r\n });\r\n}\r\n","import { getAuthStateFromStorage } from \"../utilities/storage\";\r\n\r\nexport function authorizationHeader() {\r\n const authState = getAuthStateFromStorage();\r\n\r\n if (!authState) {\r\n return {};\r\n }\r\n\r\n if (authState?.token) {\r\n return { Authorization: `Bearer ${authState.token}` };\r\n } else {\r\n return {};\r\n }\r\n}\r\n","export function login(data) {\r\n return {\r\n path: \"auth/login\",\r\n method: \"POST\",\r\n data\r\n };\r\n}\r\n\r\nexport function register(data) {\r\n return {\r\n path: \"auth/register\",\r\n method: \"POST\",\r\n data\r\n };\r\n}\r\n\r\nexport function verifyRegistrationQueryParams(data) {\r\n return {\r\n path: \"auth/verify-registration-url-parameters\",\r\n method: \"POST\",\r\n data\r\n };\r\n}\r\n\r\nexport function getCoursesForRegistration(data) {\r\n return {\r\n path: `courses/lookup?languageId=${data.languageId}${\r\n data.courseLanguageId ? `&courseLanguageId=${data.courseLanguageId}` : \"\"\r\n }`\r\n };\r\n}\r\n\r\nexport function refreshToken(data) {\r\n return {\r\n path: \"auth/token\",\r\n method: \"POST\",\r\n data\r\n };\r\n}\r\n","import { callApi } from \"../../services/api/api\";\r\n\r\nimport {\r\n login as loginApi,\r\n register as registerApi,\r\n verifyRegistrationQueryParams as verifyRegistrationQueryParamsApi,\r\n getCoursesForRegistration as getCoursesForRegistrationApi,\r\n refreshToken as refreshTokenApi\r\n} from \"../apiConfig\";\r\nimport {\r\n setAuthStateToStorage,\r\n removeAuthStateFromStorage\r\n} from \"../../services/utilities/storage\";\r\nimport generateActions from \"../../services/utilities/generateActions\";\r\n\r\nexport const LOGIN = generateActions(\"LOGIN\");\r\nexport const REGISTER = generateActions(\"REGISTER\");\r\nexport const VERIFY_REGISTRATION_QUERY_PARAMS = generateActions(\r\n \"VERIFY_REGISTRATION_QUERY_PARAMS\"\r\n);\r\nexport const GET_COURSES_FOR_REGISTRATION = generateActions(\r\n \"GET_COURSES_FOR_REGISTRATION\"\r\n);\r\nexport const REFRESH_TOKEN = generateActions(\"REFRESH_TOKEN\");\r\n\r\nexport const LOGOUT = \"LOGOUT\";\r\n\r\nexport function login({ data }) {\r\n return {\r\n type: LOGIN.ACTION,\r\n promise: callApi(loginApi(data))\r\n };\r\n}\r\n\r\nexport function register({ data }) {\r\n return {\r\n type: REGISTER.ACTION,\r\n promise: callApi(registerApi(data))\r\n };\r\n}\r\n\r\nexport function logout() {\r\n removeAuthStateFromStorage();\r\n\r\n return {\r\n type: LOGOUT\r\n };\r\n}\r\n\r\nexport function verifyRegistrationQueryParams({ data }) {\r\n return dispatch => {\r\n dispatch({\r\n type: VERIFY_REGISTRATION_QUERY_PARAMS.ACTION,\r\n promise: callApi(verifyRegistrationQueryParamsApi(data))\r\n });\r\n };\r\n}\r\n\r\nexport function getCoursesForRegistration({ data }) {\r\n return {\r\n type: GET_COURSES_FOR_REGISTRATION.ACTION,\r\n promise: callApi(getCoursesForRegistrationApi(data))\r\n };\r\n}\r\n\r\nexport function refreshToken({ data }) {\r\n return {\r\n type: REFRESH_TOKEN.ACTION,\r\n promise: callApi(refreshTokenApi(data))\r\n };\r\n}\r\n\r\nexport function loginThenSaveToStorage({ data }) {\r\n return (dispatch, getState) => {\r\n return dispatch(login({ data })).then(() => {\r\n const authState = getState().auth;\r\n setAuthStateToStorage({\r\n token: authState.token,\r\n refreshToken: authState.refreshToken,\r\n tokenExpiry: authState.tokenExpiry,\r\n user: { ...authState.user }\r\n });\r\n });\r\n };\r\n}\r\n\r\nexport function refreshTokenThenSaveToStorage({ data }) {\r\n return (dispatch, getState) => {\r\n return dispatch(refreshToken({ data })).then(res => {\r\n const authState = getState().auth;\r\n setAuthStateToStorage({\r\n token: authState.token,\r\n refreshToken: authState.refreshToken,\r\n tokenExpiry: authState.tokenExpiry,\r\n user: { ...authState.user }\r\n });\r\n return res;\r\n });\r\n };\r\n}\r\n","export function getLanguages() {\r\n return {\r\n path: \"languages/lookup\"\r\n };\r\n}\r\n\r\nexport function getCoursesMenu(data) {\r\n return {\r\n path: `menu/static-pages/courses?languageId=${data.languageId}`\r\n };\r\n}\r\n\r\nexport function getCourseContextualMenu(data) {\r\n return {\r\n path: `menu/course-context?courseLanguageId=${data.courseLanguageId}`\r\n };\r\n}\r\n\r\nexport function getStaticPagesMenu(data) {\r\n return {\r\n path: `menu/static-pages?languageId=${data.languageId}`\r\n };\r\n}\r\n","import { callApi } from \"../../services/api/api\";\r\n\r\nimport {\r\n getLanguages as getLanguagesApi,\r\n getCoursesMenu as getCoursesMenuApi,\r\n getCourseContextualMenu as getCourseContextualMenuApi,\r\n getStaticPagesMenu as getStaticPagesMenuApi\r\n} from \"../apiConfig\";\r\nimport generateActions from \"../../services/utilities/generateActions\";\r\nimport { setLanguageToStorage } from \"../../services/utilities/storage\";\r\n\r\nexport const GET_LANGUAGES = generateActions(\"GET_LANGUAGES\");\r\nexport const GET_COURSES_MENU = generateActions(\"GET_COURSES_MENU\");\r\nexport const GET_COURSE_CONTEXTUAL_MENU = generateActions(\r\n \"GET_COURSE_CONTEXTUAL_MENU\"\r\n);\r\nexport const GET_STATIC_PAGES_MENU = generateActions(\"GET_STATIC_PAGES_MENU\");\r\n\r\nexport const CHANGE_LANGUAGE = \"CHANGE_LANGUAGE\";\r\n\r\nexport function getLanguages() {\r\n return {\r\n type: GET_LANGUAGES.ACTION,\r\n promise: callApi(getLanguagesApi())\r\n };\r\n}\r\n\r\nexport function changeLanguage({ lang }) {\r\n setLanguageToStorage(lang);\r\n\r\n return {\r\n type: CHANGE_LANGUAGE,\r\n payload: lang\r\n };\r\n}\r\n\r\nexport function getCoursesMenu({ data }) {\r\n return {\r\n type: GET_COURSES_MENU.ACTION,\r\n promise: callApi(getCoursesMenuApi(data))\r\n };\r\n}\r\n\r\nexport function getCourseContextualMenu({ data }) {\r\n return {\r\n type: GET_COURSE_CONTEXTUAL_MENU.ACTION,\r\n promise: callApi(getCourseContextualMenuApi(data))\r\n };\r\n}\r\n\r\nexport function getStaticPagesMenu({ data }) {\r\n return {\r\n type: GET_STATIC_PAGES_MENU.ACTION,\r\n promise: callApi(getStaticPagesMenuApi(data))\r\n };\r\n}\r\n","import { useContext } from \"react\";\r\n\r\nimport TranslationContext from \"../services/translations/TranslationContext\";\r\n\r\nconst useTranslations = () => {\r\n const context = useContext(TranslationContext);\r\n\r\n if (!context) {\r\n throw new Error(\r\n \"useTranslations must be used within a TranslationProvider\"\r\n );\r\n }\r\n\r\n return context;\r\n};\r\n\r\nexport default useTranslations;\r\n","export function getCourseDetails(data) {\r\n return {\r\n path: `courses/${data.id}`\r\n };\r\n}\r\n\r\nexport function getCourseLectureList(data) {\r\n return {\r\n path: `lectures?courseLanguageId=${data.courseLanguageId}`\r\n };\r\n}\r\n\r\nexport function getCourseLectureDetails(data) {\r\n return {\r\n path: `lectures/${data.id}`\r\n };\r\n}\r\n\r\nexport function getLectureTest(data) {\r\n return {\r\n path: `tests/${data.lectureLanguageId}`\r\n };\r\n}\r\n\r\nexport function postLectureTest(data) {\r\n return {\r\n path: \"tests/submit\",\r\n method: \"POST\",\r\n data: data\r\n };\r\n}\r\n\r\nexport function postCourseFinalForm(data) {\r\n return {\r\n path: \"tests/submit-final-form\",\r\n method: \"POST\",\r\n data: data\r\n };\r\n}\r\n","import { callApi } from \"../../services/api/api\";\r\n\r\nimport {\r\n getCourseDetails as getCourseDetailsApi,\r\n getCourseLectureList as getCourseLectureListApi,\r\n getCourseLectureDetails as getCourseLectureDetailsApi,\r\n getLectureTest as getLectureTestApi,\r\n postLectureTest as postLectureTestApi,\r\n postCourseFinalForm as postCourseFinalFormApi\r\n} from \"../apiConfig\";\r\nimport generateActions from \"../../services/utilities/generateActions\";\r\n\r\nexport const GET_COURSE_DETAILS = generateActions(\"GET_COURSE_DETAILS\");\r\n\r\nexport const GET_COURSE_LECTURE_LIST = generateActions(\r\n \"GET_COURSE_LECTURE_LIST\"\r\n);\r\nexport const GET_COURSE_LECTURE_DETAILS = generateActions(\r\n \"GET_COURSE_LECTURE_DETAILS\"\r\n);\r\n\r\nexport const GET_LECTURE_TEST = generateActions(\"GET_LECTURE_TEST\");\r\n\r\nexport const POST_LECTURE_TEST = generateActions(\"POST_LECTURE_TEST\");\r\n\r\nexport const POST_COURSE_FINAL_FORM = generateActions(\"POST_COURSE_FINAL_FORM\");\r\n\r\nexport function getCourseDetails({ data }) {\r\n return {\r\n type: GET_COURSE_DETAILS.ACTION,\r\n promise: callApi(getCourseDetailsApi(data))\r\n };\r\n}\r\n\r\nexport function getCourseLectureList({ data }) {\r\n return {\r\n type: GET_COURSE_LECTURE_LIST.ACTION,\r\n promise: callApi(getCourseLectureListApi(data))\r\n };\r\n}\r\n\r\nexport function getCourseLectureDetails({ data }) {\r\n return {\r\n type: GET_COURSE_LECTURE_DETAILS.ACTION,\r\n promise: callApi(getCourseLectureDetailsApi(data))\r\n };\r\n}\r\n\r\nexport function getLectureTest({ data }) {\r\n return {\r\n type: GET_LECTURE_TEST.ACTION,\r\n promise: callApi(getLectureTestApi(data))\r\n };\r\n}\r\n\r\nexport function postLectureTest({ data }) {\r\n return {\r\n type: POST_LECTURE_TEST.ACTION,\r\n promise: callApi(postLectureTestApi(data))\r\n };\r\n}\r\n\r\nexport function postCourseFinalForm({ data }) {\r\n return {\r\n type: POST_COURSE_FINAL_FORM.ACTION,\r\n promise: callApi(postCourseFinalFormApi(data))\r\n };\r\n}\r\n","export const getAuthStateFromStorage = () => {\r\n try {\r\n const stringifiedState = localStorage.getItem(\"@paprac-web:authData\");\r\n if (stringifiedState === null) {\r\n return undefined;\r\n }\r\n return JSON.parse(stringifiedState);\r\n } catch (error) {\r\n return undefined;\r\n }\r\n};\r\n\r\nexport const setAuthStateToStorage = authData => {\r\n try {\r\n localStorage.setItem(\"@paprac-web:authData\", JSON.stringify(authData));\r\n } catch (error) {}\r\n};\r\n\r\nexport const removeAuthStateFromStorage = () => {\r\n return localStorage.removeItem(\"@paprac-web:authData\");\r\n};\r\n\r\nexport const getLanguageFromStorage = () => {\r\n try {\r\n const stringifiedState = localStorage.getItem(\"@paprac-web:lang\");\r\n if (stringifiedState === null) {\r\n return undefined;\r\n }\r\n return JSON.parse(stringifiedState);\r\n } catch (error) {\r\n return undefined;\r\n }\r\n};\r\n\r\nexport const setLanguageToStorage = lang => {\r\n try {\r\n localStorage.setItem(\"@paprac-web:lang\", JSON.stringify(lang));\r\n } catch (error) {}\r\n};\r\n","export const getLanguages = state => state.app.languages;\r\nexport const languagesFetching = state => state.app.areLanguagesFetching;\r\nexport const languagesFetched = state => state.app.areLanguagesFetched;\r\nexport const languageFetchError = state => state.app.isLanguageFetchError;\r\n\r\nexport const getCurrentLanguage = state => state.app.currentLanguage;\r\n\r\nexport const getCoursesMenu = state => state.app.coursesMenu;\r\nexport const getCourseContextualMenu = state => state.app.courseContextualMenu;\r\n\r\nexport const getStaticPageTranslationLanguage = state =>\r\n state.staticPages.selectedItem?.language;\r\nexport const getCourseTranslationLanguage = state =>\r\n state.courses.selectedItem?.language;\r\n\r\nexport const getStaticPagesMenu = state => state.app.staticPagesMenu;\r\nexport const getHomePageInMenu = state => state.app.homePageInMenu;\r\nexport const getHomePageId = state => state.app.homePageInMenu?.id;\r\n","import React from \"react\";\r\n\r\nconst Loader = () => (\r\n
\r\n
Loading...
\r\n
\r\n);\r\n\r\nexport default Loader;\r\n","export const getIsAuthenticating = state => state.auth.isLogging;\r\nexport const getIsAuthenticated = state => state.auth.isAuthenticated;\r\nexport const getAuthErrors = state => state.auth.errors;\r\nexport const getUserRole = state => state.auth.user?.role;\r\nexport const getUsername = state => state.auth.user?.userName;\r\n\r\nexport const hasCheckedUrlValidity = state =>\r\n state.auth.hasCheckedRegistrationUrlValidity;\r\nexport const getIsRegistrationUrlValid = state =>\r\n state.auth.registrationUrlValid;\r\nexport const getIsAdvancedFormFieldSetVisible = state =>\r\n state.auth.registrationAdvancedFormFieldSetVisible;\r\n\r\nexport const getCourses = state => state.auth.courses;\r\nexport const getCourseCodeLanguage = state => state.auth.courses[0]?.language;\r\n\r\nexport const getIsRegistering = state => state.auth.isRegistering;\r\nexport const getIsRegistered = state => state.auth.isRegistered;\r\n","import {\r\n GET_LANGUAGES,\r\n CHANGE_LANGUAGE,\r\n GET_COURSES_MENU,\r\n GET_COURSE_CONTEXTUAL_MENU,\r\n GET_STATIC_PAGES_MENU\r\n} from \"./appActions\";\r\nimport { LOGIN, LOGOUT } from \"../../auth/state/authActions\";\r\nimport { getLanguageFromStorage } from \"../../services/utilities/storage\";\r\n\r\nconst defaultLanguage = { id: 2, code: \"en\" };\r\nconst selectedLanguage = getLanguageFromStorage();\r\n\r\nconst INITIAL_STATE = {\r\n currentLanguage: selectedLanguage || defaultLanguage,\r\n languages: [],\r\n areLanguagesFetching: false,\r\n areLanguagesFetched: false,\r\n isLanguageFetchError: false,\r\n coursesMenu: [],\r\n isCoursesMenuFetching: false,\r\n isCoursesMenuFetched: false,\r\n isCoursesMenuFetchError: false,\r\n courseContextualMenu: [],\r\n isCourseContextualMenuFetching: false,\r\n isCourseContextualMenuFetched: false,\r\n isCourseContextualMenuFetchError: false,\r\n homePageInMenu: null,\r\n staticPagesMenu: [],\r\n isStaticPagesMenuFetching: false,\r\n isStaticPagesMenuFetched: false,\r\n isStaticPagesMenuFetchError: false\r\n};\r\n\r\nexport default function (state = INITIAL_STATE, action) {\r\n switch (action.type) {\r\n case GET_LANGUAGES.REQUEST: {\r\n return {\r\n ...state,\r\n areLanguagesFetching: true,\r\n areLanguagesFetched: false,\r\n isLanguageFetchError: false\r\n };\r\n }\r\n\r\n case GET_COURSES_MENU.REQUEST: {\r\n return {\r\n ...state,\r\n isCoursesMenuFetching: true,\r\n isCoursesMenuFetched: false,\r\n isCoursesMenuFetchError: false\r\n };\r\n }\r\n\r\n case GET_COURSE_CONTEXTUAL_MENU.REQUEST: {\r\n return {\r\n ...state,\r\n isCourseContextualMenuFetching: true,\r\n isCourseContextualMenuFetched: false,\r\n isCourseContextualMenuFetchError: false\r\n };\r\n }\r\n\r\n case GET_STATIC_PAGES_MENU.REQUEST: {\r\n return {\r\n ...state,\r\n isStaticPagesMenuFetching: true,\r\n isStaticPagesMenuFetched: false,\r\n isStaticPagesMenuFetchError: false\r\n };\r\n }\r\n\r\n case GET_LANGUAGES.SUCCESS: {\r\n return {\r\n ...state,\r\n languages: action.payload,\r\n areLanguagesFetching: false,\r\n areLanguagesFetched: true,\r\n isLanguageFetchError: false\r\n };\r\n }\r\n\r\n case GET_COURSES_MENU.SUCCESS: {\r\n return {\r\n ...state,\r\n coursesMenu: action.payload.map(course => ({\r\n ...course,\r\n languageId: state.currentLanguage.id\r\n })),\r\n isCoursesMenuFetching: false,\r\n isCoursesMenuFetched: true,\r\n isCoursesMenuFetchError: false\r\n };\r\n }\r\n\r\n case GET_COURSE_CONTEXTUAL_MENU.SUCCESS: {\r\n return {\r\n ...state,\r\n courseContextualMenu: action.payload,\r\n isCourseContextualMenuFetching: false,\r\n isCourseContextualMenuFetched: true,\r\n isCourseContextualMenuFetchError: false\r\n };\r\n }\r\n\r\n case GET_STATIC_PAGES_MENU.SUCCESS: {\r\n const homePage = action.payload.find(x => x.isHomePage);\r\n\r\n return {\r\n ...state,\r\n homePageInMenu: { ...homePage, languageId: state.currentLanguage.id },\r\n staticPagesMenu: action.payload\r\n .filter(x => !x.isHomePage)\r\n .map(page => ({\r\n ...page,\r\n languageId: state.currentLanguage.id\r\n })),\r\n isStaticPagesMenuFetching: false,\r\n isStaticPagesMenuFetched: true,\r\n isStaticPagesMenuFetchError: false\r\n };\r\n }\r\n\r\n // Reset menu data because different user roles (and users)\r\n // see different data, but we have guards in NavBar.js\r\n // for minimizing api requests for menus. This will ensure that we\r\n // send those requests.\r\n case LOGIN.SUCCESS: {\r\n return {\r\n ...state,\r\n homePageInMenu: null,\r\n staticPagesMenu: [],\r\n coursesMenu: [],\r\n courseContextualMenu: []\r\n };\r\n }\r\n\r\n case GET_LANGUAGES.ERROR: {\r\n return {\r\n ...state,\r\n areLanguagesFetching: false,\r\n areLanguagesFetched: false,\r\n isLanguageFetchError: true\r\n };\r\n }\r\n\r\n case GET_COURSES_MENU.ERROR: {\r\n return {\r\n ...state,\r\n isCoursesMenuFetching: false,\r\n isCoursesMenuFetched: false,\r\n isCoursesMenuFetchError: true\r\n };\r\n }\r\n\r\n case GET_COURSE_CONTEXTUAL_MENU.ERROR: {\r\n return {\r\n ...state,\r\n isCourseContextualMenuFetching: false,\r\n isCourseContextualMenuFetched: false,\r\n isCourseContextualMenuFetchError: true\r\n };\r\n }\r\n\r\n case GET_STATIC_PAGES_MENU.ERROR: {\r\n return {\r\n ...state,\r\n isStaticPagesMenuFetching: false,\r\n isStaticPagesMenuFetched: false,\r\n isStaticPagesMenuFetchError: true\r\n };\r\n }\r\n\r\n case CHANGE_LANGUAGE: {\r\n return {\r\n ...state,\r\n currentLanguage: action.payload\r\n };\r\n }\r\n\r\n // Reset menu data because different user roles (and users)\r\n // see different data, but we have guards in NavBar.js\r\n // for minimizing api requests for menus. This will ensure that we\r\n // send those requests.\r\n case LOGOUT: {\r\n return {\r\n ...state,\r\n homePageInMenu: null,\r\n staticPagesMenu: [],\r\n coursesMenu: [],\r\n courseContextualMenu: []\r\n };\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","import {\r\n LOGIN,\r\n REGISTER,\r\n VERIFY_REGISTRATION_QUERY_PARAMS,\r\n LOGOUT,\r\n GET_COURSES_FOR_REGISTRATION,\r\n REFRESH_TOKEN\r\n} from \"./authActions\";\r\nimport { getAuthStateFromStorage } from \"../../services/utilities/storage\";\r\n\r\nconst authState = getAuthStateFromStorage();\r\n\r\nconst INITIAL_STATE = {\r\n hasCheckedRegistrationUrlValidity: false,\r\n registrationUrlValid: false,\r\n registrationAdvancedFormFieldSetVisible: false,\r\n token: authState?.token || null,\r\n refreshTokenId: null,\r\n refreshToken: authState?.refreshToken || null,\r\n tokenExpiry: authState?.tokenExpiry || null,\r\n user: authState?.user || null,\r\n isLogging: false,\r\n isAuthenticated:\r\n authState?.user && Object.keys(authState?.user).length > 0 ? true : false,\r\n isRegistering: false,\r\n isRegistered: false,\r\n isError: false,\r\n errors: null,\r\n courses: [],\r\n areCoursesFetching: false,\r\n areCoursesFetched: false,\r\n isCourseFetchError: false\r\n};\r\n\r\nexport default function (state = INITIAL_STATE, action) {\r\n switch (action.type) {\r\n case LOGIN.REQUEST: {\r\n return {\r\n ...state,\r\n isLogging: true,\r\n isAuthenticated: false,\r\n isError: false\r\n };\r\n }\r\n\r\n case VERIFY_REGISTRATION_QUERY_PARAMS.REQUEST: {\r\n return {\r\n ...state,\r\n hasCheckedRegistrationUrlValidity: false\r\n };\r\n }\r\n\r\n case GET_COURSES_FOR_REGISTRATION.REQUEST: {\r\n return {\r\n ...state,\r\n areCoursesFetching: true,\r\n areCoursesFetched: false,\r\n isCourseFetchError: false\r\n };\r\n }\r\n\r\n case REGISTER.REQUEST: {\r\n return {\r\n ...state,\r\n isRegistering: true,\r\n isRegistered: false,\r\n isError: false\r\n };\r\n }\r\n\r\n case LOGIN.SUCCESS: {\r\n return {\r\n ...state,\r\n ...action.payload,\r\n isLogging: false,\r\n isAuthenticated: true,\r\n isError: false\r\n };\r\n }\r\n\r\n case VERIFY_REGISTRATION_QUERY_PARAMS.SUCCESS: {\r\n return {\r\n ...state,\r\n hasCheckedRegistrationUrlValidity: true,\r\n registrationUrlValid: action.payload.valid,\r\n registrationAdvancedFormFieldSetVisible:\r\n action.payload.isAdvancedRegistrationFormFieldSet\r\n };\r\n }\r\n\r\n case GET_COURSES_FOR_REGISTRATION.SUCCESS: {\r\n return {\r\n ...state,\r\n courses: action.payload,\r\n areCoursesFetching: false,\r\n areCoursesFetched: true,\r\n isCourseFetchError: false\r\n };\r\n }\r\n\r\n case REFRESH_TOKEN.SUCCESS: {\r\n return {\r\n ...state,\r\n ...action.payload,\r\n isLogging: false,\r\n isAuthenticated: true,\r\n isError: false\r\n };\r\n }\r\n\r\n case REGISTER.SUCCESS: {\r\n return {\r\n ...state,\r\n isRegistering: false,\r\n isRegistered: true,\r\n isError: false\r\n };\r\n }\r\n\r\n case LOGIN.ERROR:\r\n case REGISTER.ERROR: {\r\n return {\r\n ...state,\r\n isLogging: false,\r\n isAuthenticated: false,\r\n isRegistering: false,\r\n isRegistered: false,\r\n isError: true,\r\n errors: action.error?.response?.data?.errors || null\r\n };\r\n }\r\n\r\n case VERIFY_REGISTRATION_QUERY_PARAMS.ERROR: {\r\n return {\r\n ...state,\r\n hasCheckedRegistrationUrlValidity: true,\r\n registrationUrlValid: false,\r\n registrationAdvancedFormFieldSetVisible: false\r\n };\r\n }\r\n\r\n case GET_COURSES_FOR_REGISTRATION.ERROR: {\r\n return {\r\n ...state,\r\n areCoursesFetching: false,\r\n areCoursesFetched: false,\r\n isCourseFetchError: true\r\n };\r\n }\r\n\r\n case LOGOUT:\r\n case REFRESH_TOKEN.ERROR: {\r\n return {\r\n ...INITIAL_STATE,\r\n token: null,\r\n refreshToken: null,\r\n user: null,\r\n isAuthenticated: false\r\n };\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","import { GET_STATIC_PAGE_DETAILS } from \"./staticPageActions\";\r\n\r\nconst INITIAL_STATE = {\r\n selectedItem: null,\r\n isItemFetching: false,\r\n isItemFetched: false,\r\n isItemFetchError: false,\r\n itemFetchErrorStatus: null\r\n};\r\n\r\nexport default function (state = INITIAL_STATE, action) {\r\n switch (action.type) {\r\n case GET_STATIC_PAGE_DETAILS.REQUEST: {\r\n return {\r\n ...state,\r\n isItemFetching: true,\r\n isItemFetched: false,\r\n isItemFetchError: false,\r\n itemFetchErrorStatus: null\r\n };\r\n }\r\n\r\n case GET_STATIC_PAGE_DETAILS.SUCCESS: {\r\n return {\r\n ...state,\r\n selectedItem: action.payload,\r\n isItemFetching: false,\r\n isItemFetched: true,\r\n isItemFetchError: false\r\n };\r\n }\r\n\r\n case GET_STATIC_PAGE_DETAILS.ERROR: {\r\n return {\r\n ...state,\r\n isItemFetching: false,\r\n isItemFetched: false,\r\n isItemFetchError: true,\r\n itemFetchErrorStatus: action.error?.response?.data?.status\r\n };\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","import {\r\n GET_COURSE_DETAILS,\r\n GET_COURSE_LECTURE_LIST,\r\n GET_COURSE_LECTURE_DETAILS,\r\n GET_LECTURE_TEST,\r\n POST_LECTURE_TEST,\r\n POST_COURSE_FINAL_FORM\r\n} from \"./courseActions\";\r\n\r\nconst INITIAL_STATE = {\r\n selectedItem: null,\r\n isItemFetching: false,\r\n isItemFetched: false,\r\n isItemFetchError: false,\r\n itemFetchErrorStatus: null,\r\n lecturesList: [],\r\n isLectureListFetching: false,\r\n isLectureListFetched: false,\r\n isLectureListFetchError: false,\r\n selectedLecture: null,\r\n isLectureFetching: false,\r\n isLectureFetched: false,\r\n isLectureFetchError: false,\r\n lectureFetchErrorStatus: null,\r\n selectedTest: null,\r\n isTestFetching: false,\r\n isTestFetched: false,\r\n isTestFetchError: false,\r\n testFetchErrorStatus: null,\r\n isTestSubmitting: false,\r\n isTestSubmitted: false,\r\n isTestSubmitError: false,\r\n isFinalFormSubmitting: false,\r\n isFinalFormSubmitted: false,\r\n finalFormSubmitError: false\r\n};\r\n\r\nexport default function (state = INITIAL_STATE, action) {\r\n switch (action.type) {\r\n case GET_COURSE_DETAILS.REQUEST: {\r\n return {\r\n ...state,\r\n isItemFetching: true,\r\n isItemFetched: false,\r\n isItemFetchError: false,\r\n itemFetchErrorStatus: null\r\n };\r\n }\r\n\r\n case GET_COURSE_LECTURE_LIST.REQUEST: {\r\n return {\r\n ...state,\r\n isLectureListFetching: true,\r\n isLectureListFetched: false,\r\n isLectureListFetchError: false\r\n };\r\n }\r\n\r\n case GET_COURSE_LECTURE_DETAILS.REQUEST: {\r\n return {\r\n ...state,\r\n isLectureFetching: true,\r\n isLectureFetched: false,\r\n isLectureFetchError: false,\r\n lectureFetchErrorStatus: null,\r\n selectedTest: null,\r\n isTestFetching: false,\r\n isTestFetched: false,\r\n isTestFetchError: false,\r\n testFetchErrorStatus: null,\r\n isTestSubmitting: false,\r\n isTestSubmitted: false,\r\n isTestSubmitError: false\r\n };\r\n }\r\n\r\n case GET_LECTURE_TEST.REQUEST: {\r\n return {\r\n ...state,\r\n isTestFetching: true,\r\n isTestFetched: false,\r\n isTestFetchError: false,\r\n testFetchErrorStatus: null,\r\n isTestSubmitting: false,\r\n isTestSubmitted: false,\r\n isTestSubmitError: false\r\n };\r\n }\r\n\r\n case POST_LECTURE_TEST.REQUEST: {\r\n return {\r\n ...state,\r\n isTestSubmitting: true,\r\n isTestSubmitted: false,\r\n isTestSubmitError: false\r\n };\r\n }\r\n\r\n case POST_COURSE_FINAL_FORM.REQUEST: {\r\n return {\r\n ...state,\r\n isFinalFormSubmitting: true,\r\n isFinalFormSubmitted: false,\r\n finalFormSubmitError: false\r\n };\r\n }\r\n\r\n case GET_COURSE_DETAILS.SUCCESS: {\r\n return {\r\n ...state,\r\n selectedItem: action.payload,\r\n isItemFetching: false,\r\n isItemFetched: true,\r\n isItemFetchError: false\r\n };\r\n }\r\n\r\n case GET_COURSE_LECTURE_LIST.SUCCESS: {\r\n return {\r\n ...state,\r\n lecturesList: action.payload,\r\n isLectureListFetching: false,\r\n isLectureListFetched: true,\r\n isLectureListFetchError: false\r\n };\r\n }\r\n\r\n case GET_COURSE_LECTURE_DETAILS.SUCCESS: {\r\n return {\r\n ...state,\r\n selectedLecture: action.payload,\r\n isLectureFetching: false,\r\n isLectureFetched: true,\r\n isLectureFetchError: false,\r\n lectureFetchErrorStatus: null\r\n };\r\n }\r\n\r\n case GET_LECTURE_TEST.SUCCESS: {\r\n return {\r\n ...state,\r\n selectedTest: action.payload,\r\n isTestFetching: false,\r\n isTestFetched: true,\r\n isTestFetchError: false\r\n };\r\n }\r\n\r\n case POST_LECTURE_TEST.SUCCESS: {\r\n const {\r\n lectureLanguageId,\r\n previousLectureLanguageId,\r\n questions,\r\n ...rest\r\n } = action.payload;\r\n\r\n return {\r\n ...state,\r\n selectedLecture: {\r\n ...state.selectedLecture,\r\n canTakeTest: rest.canTakeTest\r\n },\r\n selectedTest: {\r\n ...state.selectedTest,\r\n ...rest,\r\n questions: state.selectedTest.questions.map(question => {\r\n const questionResults = questions.find(x => x.id === question.id);\r\n\r\n if (questionResults) {\r\n const { id, type, answers, ...rest } = questionResults;\r\n\r\n return {\r\n ...question,\r\n ...rest,\r\n answers: question.answers?.map(answer => {\r\n const answerResults = questionResults.answers?.find(\r\n x => x.id === answer.id\r\n );\r\n\r\n if (answerResults) {\r\n return {\r\n ...answer,\r\n ...answerResults\r\n };\r\n }\r\n\r\n return answer;\r\n })\r\n };\r\n }\r\n\r\n return question;\r\n })\r\n },\r\n isTestSubmitting: false,\r\n isTestSubmitted: true,\r\n isTestSubmitError: false\r\n };\r\n }\r\n\r\n case POST_COURSE_FINAL_FORM.SUCCESS: {\r\n return {\r\n ...state,\r\n isFinalFormSubmitting: false,\r\n isFinalFormSubmitted: true,\r\n finalFormSubmitError: false\r\n };\r\n }\r\n\r\n case GET_COURSE_DETAILS.ERROR: {\r\n return {\r\n ...state,\r\n isItemFetching: false,\r\n isItemFetched: false,\r\n isItemFetchError: true,\r\n itemFetchErrorStatus: action.error?.response?.data?.status\r\n };\r\n }\r\n\r\n case GET_COURSE_LECTURE_LIST.ERROR: {\r\n return {\r\n ...state,\r\n isLectureListFetching: false,\r\n isLectureListFetched: false,\r\n isLectureListFetchError: true\r\n };\r\n }\r\n\r\n case GET_COURSE_LECTURE_DETAILS.ERROR: {\r\n return {\r\n ...state,\r\n isLectureFetching: false,\r\n isLectureFetched: false,\r\n isLectureFetchError: true,\r\n lectureFetchErrorStatus: action.error?.response?.data?.status\r\n };\r\n }\r\n\r\n case GET_LECTURE_TEST.ERROR: {\r\n return {\r\n ...state,\r\n isTestFetching: false,\r\n isTestFetched: false,\r\n isTestFetchError: true,\r\n testFetchErrorStatus: action.error?.response?.data?.status\r\n };\r\n }\r\n\r\n case POST_LECTURE_TEST.ERROR: {\r\n return {\r\n ...state,\r\n isTestSubmitting: false,\r\n isTestSubmitted: false,\r\n isTestSubmitError: true\r\n };\r\n }\r\n\r\n case POST_COURSE_FINAL_FORM.ERROR: {\r\n return {\r\n ...state,\r\n isFinalFormSubmitting: false,\r\n isFinalFormSubmitted: false,\r\n finalFormSubmitError: true\r\n };\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","import {\r\n GET_COMMENTS,\r\n GET_SELECTED_COMMENT,\r\n CREATE_COMMENT,\r\n UPDATE_COMMENT,\r\n DELETE_COMMENT,\r\n RESET_COMMENT_STATE,\r\n GET_FILE,\r\n SEND_EMAIL_NOTIFICATION,\r\n UPLOAD_FILE_PROGRESS\r\n} from \"./commentActions\";\r\n\r\nconst INITIAL_STATE = {\r\n list: [],\r\n selectedItem: null,\r\n selectedFileUrl: null,\r\n isFetching: false,\r\n isFetched: false,\r\n isSaving: false,\r\n isSaved: false,\r\n isError: false,\r\n isReplySending: false,\r\n isReplySent: false,\r\n uploadProgress: null\r\n};\r\n\r\nexport default function (state = INITIAL_STATE, action) {\r\n switch (action.type) {\r\n case GET_COMMENTS.REQUEST: {\r\n return {\r\n ...state,\r\n isFetching: true,\r\n isFetched: false,\r\n isError: false\r\n };\r\n }\r\n case GET_SELECTED_COMMENT.REQUEST: {\r\n return {\r\n ...state,\r\n isFetching: true,\r\n isFetched: false,\r\n isError: false\r\n };\r\n }\r\n case GET_FILE.REQUEST: {\r\n return {\r\n ...state,\r\n isFetching: true,\r\n isFetched: false,\r\n isError: false\r\n };\r\n }\r\n case CREATE_COMMENT.REQUEST: {\r\n return {\r\n ...state,\r\n isSaving: true,\r\n isSaved: false,\r\n isError: false\r\n };\r\n }\r\n case UPDATE_COMMENT.REQUEST: {\r\n return {\r\n ...state,\r\n isSaving: true,\r\n isSaved: false,\r\n isError: false\r\n };\r\n }\r\n case DELETE_COMMENT.REQUEST: {\r\n return {\r\n ...state,\r\n isSaving: true,\r\n isSaved: false,\r\n isError: false\r\n };\r\n }\r\n case SEND_EMAIL_NOTIFICATION.REQUEST: {\r\n return {\r\n ...state,\r\n isReplySending: true,\r\n isReplySent: false,\r\n isError: false\r\n };\r\n }\r\n case GET_COMMENTS.SUCCESS: {\r\n return {\r\n ...state,\r\n list: action.payload,\r\n isFetching: false,\r\n isFetched: true,\r\n isError: false\r\n };\r\n }\r\n case GET_SELECTED_COMMENT.SUCCESS: {\r\n return {\r\n ...state,\r\n selectedItem: action.payload,\r\n isFetching: false,\r\n isFetched: true,\r\n isError: false\r\n };\r\n }\r\n case GET_FILE.SUCCESS: {\r\n return {\r\n ...state,\r\n selectedFileUrl: action.payload.fileDownloadLink,\r\n isFetching: true,\r\n isFetched: false,\r\n isError: false\r\n };\r\n }\r\n case CREATE_COMMENT.SUCCESS: {\r\n return {\r\n ...state,\r\n isSaving: false,\r\n isSaved: true,\r\n isError: false\r\n };\r\n }\r\n case UPDATE_COMMENT.SUCCESS: {\r\n return {\r\n ...state,\r\n isSaving: false,\r\n isSaved: true,\r\n isError: false\r\n };\r\n }\r\n case DELETE_COMMENT.SUCCESS: {\r\n return {\r\n ...state,\r\n isSaving: false,\r\n isSaved: true,\r\n isError: false\r\n };\r\n }\r\n case SEND_EMAIL_NOTIFICATION.SUCCESS: {\r\n return {\r\n ...state,\r\n isReplySending: false,\r\n isReplySent: true,\r\n isError: false\r\n };\r\n }\r\n case UPLOAD_FILE_PROGRESS: {\r\n return {\r\n ...state,\r\n uploadProgress: action.payload\r\n };\r\n }\r\n case GET_COMMENTS.ERROR:\r\n case GET_SELECTED_COMMENT.ERROR:\r\n case GET_FILE.ERROR: {\r\n return {\r\n ...state,\r\n isFetching: false,\r\n isFetched: false,\r\n isError: true\r\n };\r\n }\r\n case CREATE_COMMENT.ERROR:\r\n case UPDATE_COMMENT.ERROR:\r\n case DELETE_COMMENT.ERROR: {\r\n return {\r\n ...state,\r\n isSaving: false,\r\n isSaved: false,\r\n isError: true\r\n };\r\n }\r\n case SEND_EMAIL_NOTIFICATION.ERROR: {\r\n return {\r\n ...state,\r\n isReplySending: false,\r\n isReplySent: false,\r\n isError: true\r\n };\r\n }\r\n\r\n case RESET_COMMENT_STATE: {\r\n return {\r\n ...state,\r\n selectedItem: null,\r\n selectedFileUrl: null,\r\n isFetching: false,\r\n isFetched: false,\r\n isSaving: false,\r\n isSaved: false,\r\n isError: false,\r\n uploadProgress: null\r\n };\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","import { SEND_EMAIL, RESET_CONTACT_STATE } from \"./contactActions\";\r\n\r\nconst INITIAL_STATE = {\r\n sending: false,\r\n sent: false,\r\n errors: null,\r\n isError: false\r\n};\r\n\r\nexport default function (state = INITIAL_STATE, action) {\r\n switch (action.type) {\r\n case SEND_EMAIL.REQUEST: {\r\n return {\r\n ...state,\r\n sending: true,\r\n sent: false,\r\n isError: false\r\n };\r\n }\r\n\r\n case SEND_EMAIL.SUCCESS: {\r\n return {\r\n ...state,\r\n sending: false,\r\n sent: true,\r\n isError: false\r\n };\r\n }\r\n case SEND_EMAIL.ERROR: {\r\n return {\r\n ...state,\r\n sending: false,\r\n sent: false,\r\n errors: action.error?.response?.data?.errors || null,\r\n isError: true\r\n };\r\n }\r\n\r\n case RESET_CONTACT_STATE: {\r\n return {\r\n ...INITIAL_STATE\r\n };\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","import { applyMiddleware, createStore, combineReducers } from \"redux\";\r\nimport { composeWithDevTools } from \"redux-devtools-extension\";\r\nimport thunk from \"redux-thunk\";\r\n\r\nimport promiseMiddleware from \"./promiseMiddleware\";\r\nimport app from \"./app/state/appReducer\";\r\nimport auth from \"./auth/state/authReducer\";\r\nimport staticPages from \"./static-page/state/staticPageReducer\";\r\nimport courses from \"./course/state/courseReducer\";\r\nimport comments from \"./comments/state/commentReducer\";\r\nimport contact from \"./contact/state/contactReducer\";\r\n\r\nconst rootReducer = combineReducers({\r\n app,\r\n auth,\r\n staticPages,\r\n courses,\r\n comments,\r\n contact\r\n});\r\n\r\nexport const store = createStore(\r\n rootReducer,\r\n composeWithDevTools(applyMiddleware(thunk, promiseMiddleware))\r\n);\r\n","export default function promiseMiddleware() {\r\n return dispatch => action => {\r\n const { promise, type, ...rest } = action;\r\n\r\n if (!promise) {\r\n return dispatch(action);\r\n }\r\n\r\n const SUCCESS = `${type}_SUCCESS`;\r\n const REQUEST = `${type}_REQUEST`;\r\n const FAILURE = `${type}_ERROR`;\r\n\r\n dispatch({ ...rest, type: REQUEST });\r\n\r\n return promise\r\n .then(res => {\r\n if (typeof res === \"undefined\") {\r\n dispatch({ ...rest, res, type: FAILURE });\r\n } else {\r\n dispatch({ ...rest, payload: res, type: SUCCESS });\r\n }\r\n\r\n return true;\r\n })\r\n .catch(error => {\r\n dispatch({ ...rest, error, type: FAILURE });\r\n return false;\r\n });\r\n };\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { useParams } from \"react-router-dom\";\r\n\r\nimport useUrlFormValidityCheck from \"./useUrlFormValidityCheck\";\r\nimport { PAGE_TYPES } from \"../services/constants/pageTypes\";\r\n\r\nconst useRedirectUrlCalculation = ({ pageType }) => {\r\n const { id } = useParams();\r\n const { isCourseOrStaticPageIdFormValid } = useUrlFormValidityCheck({\r\n pageType\r\n });\r\n\r\n const redirectUrl = useMemo(() => {\r\n return pageType === PAGE_TYPES.static ||\r\n pageType === PAGE_TYPES.courseInformative\r\n ? \"/\"\r\n : pageType === PAGE_TYPES.courseWork ||\r\n pageType === PAGE_TYPES.courseStatic ||\r\n pageType === PAGE_TYPES.courseLecture ||\r\n pageType === PAGE_TYPES.courseTest ||\r\n pageType === PAGE_TYPES.courseFinalForm\r\n ? isCourseOrStaticPageIdFormValid\r\n ? `/courses/${id}`\r\n : \"/\"\r\n : \"/\";\r\n }, [id, isCourseOrStaticPageIdFormValid, pageType]);\r\n\r\n return redirectUrl;\r\n};\r\n\r\nexport default useRedirectUrlCalculation;\r\n","export const getSelectedStaticPage = state => state.staticPages.selectedItem;\r\nexport const getStaticPageHeaderData = state => ({\r\n title: state.staticPages.selectedItem?.title || \"\",\r\n subtitle: state.staticPages.selectedItem?.subTitle || \"\"\r\n});\r\nexport const getIsStaticPageLoading = state => state.staticPages.isItemFetching;\r\nexport const getStaticPageFetchErrorStatus = state =>\r\n state.staticPages.itemFetchErrorStatus;\r\n","import { useMemo } from \"react\";\r\nimport { useParams, useLocation } from \"react-router-dom\";\r\n\r\nimport { PAGE_TYPES } from \"../services/constants/pageTypes\";\r\n\r\nconst useUrlFormValidityCheck = ({ pageType }) => {\r\n const {\r\n id: courseOrStaticPageId,\r\n lectureId: courseLectureId,\r\n pageId: courseStaticPageId\r\n } = useParams();\r\n const { pathname } = useLocation();\r\n\r\n const isUrlFormValid = useMemo(() => {\r\n let isWholeUrlFormValid =\r\n (courseOrStaticPageId && Number.isFinite(+courseOrStaticPageId)) ||\r\n (!courseOrStaticPageId &&\r\n pathname === \"/\" &&\r\n pageType === PAGE_TYPES.static);\r\n const isCourseOrStaticPageIdFormValid = isWholeUrlFormValid;\r\n\r\n if (pageType === PAGE_TYPES.courseStatic) {\r\n isWholeUrlFormValid =\r\n isWholeUrlFormValid &&\r\n courseStaticPageId &&\r\n Number.isFinite(+courseStaticPageId);\r\n }\r\n\r\n if (\r\n pageType === PAGE_TYPES.courseLecture ||\r\n pageType === PAGE_TYPES.courseTest\r\n ) {\r\n isWholeUrlFormValid =\r\n isWholeUrlFormValid &&\r\n courseLectureId &&\r\n Number.isFinite(+courseLectureId);\r\n }\r\n\r\n return {\r\n isCourseOrStaticPageIdFormValid,\r\n isWholeUrlFormValid\r\n };\r\n }, [\r\n courseOrStaticPageId,\r\n courseLectureId,\r\n courseStaticPageId,\r\n pathname,\r\n pageType\r\n ]);\r\n\r\n return isUrlFormValid;\r\n};\r\n\r\nexport default useUrlFormValidityCheck;\r\n","export function getStaticPageDetails(id) {\r\n return {\r\n path: `static-pages/${id}`\r\n };\r\n}\r\n","import { callApi } from \"../../services/api/api\";\r\n\r\nimport { getStaticPageDetails as getStaticPageDetailsApi } from \"../apiConfig\";\r\nimport generateActions from \"../../services/utilities/generateActions\";\r\n\r\nexport const GET_STATIC_PAGE_DETAILS = generateActions(\r\n \"GET_STATIC_PAGE_DETAILS\"\r\n);\r\n\r\nexport function getStaticPageDetails({ id }) {\r\n return {\r\n type: GET_STATIC_PAGE_DETAILS.ACTION,\r\n promise: callApi(getStaticPageDetailsApi(id))\r\n };\r\n}\r\n","export function sendEmail(data) {\r\n return {\r\n path: \"contacts/send-email\",\r\n method: \"POST\",\r\n data\r\n };\r\n}\r\n","import { callApi } from \"../../services/api/api\";\r\n\r\nimport { sendEmail as sendEmailApi } from \"../apiConfig\";\r\nimport generateActions from \"../../services/utilities/generateActions\";\r\n\r\nexport const SEND_EMAIL = generateActions(\"SEND_EMAIL\");\r\nexport const RESET_CONTACT_STATE = \"RESET_CONTACT_STATE\";\r\n\r\nexport function sendEmail({ data }) {\r\n return {\r\n type: SEND_EMAIL.ACTION,\r\n promise: callApi(sendEmailApi(data))\r\n };\r\n}\r\n\r\nexport function resetContactState() {\r\n return {\r\n type: RESET_CONTACT_STATE\r\n };\r\n}\r\n","export const getCourse = state => state.courses.selectedItem;\r\nexport const getCourseId = state => state.courses.selectedItem?.id;\r\nexport const getCourseName = state =>\r\n state.courses.selectedItem?.informativeTitle;\r\nexport const getIsCourseLoading = state => state.courses.isItemFetching;\r\nexport const getCourseFetchErrorStatus = state =>\r\n state.courses.itemFetchErrorStatus;\r\n\r\nexport const getLectures = state => state.courses.lecturesList;\r\n\r\nexport const getLecture = state => state.courses.selectedLecture;\r\nexport const getLectureFetchErrorStatus = state =>\r\n state.courses.lectureFetchErrorStatus;\r\nexport const getLectureHeaderData = state => ({\r\n title: state.courses.selectedLecture?.title || \"\",\r\n subtitle: state.courses.selectedLecture?.subtitle || \"\"\r\n});\r\nexport const getIsLectureLoading = state => state.courses.isLectureFetching;\r\n\r\nexport const getLectureTest = state => state.courses.selectedTest;\r\nexport const getIsLectureTestLoading = state => state.courses.isTestFetching;\r\nexport const getLectureTestFetchErrorStatus = state =>\r\n state.courses.testFetchErrorStatus;\r\n\r\nexport const getTestHeaderData = state => ({\r\n title: state.courses.selectedTest?.title || \"\",\r\n subtitle: state.courses.selectedTest?.subtitle || \"\"\r\n});\r\n\r\nexport const getIsLectureTestSubmitting = state =>\r\n state.courses.isTestSubmitting;\r\nexport const getIsLectureTestSubmitted = state => state.courses.isTestSubmitted;\r\n\r\nexport const getIsFinalFormSubmitting = state =>\r\n state.courses.isFinalFormSubmitting;\r\nexport const getIsFinalFormSubmitted = state =>\r\n state.courses.isFinalFormSubmitted;\r\n","import LocalizedStrings from \"react-localization\";\r\n\r\nconst strings = new LocalizedStrings({\r\n en: {\r\n login: \"Login\",\r\n register: \"Register\",\r\n logout: \"Logout\",\r\n slogan:\r\n \"Virtual training course on coastal management in the Mediterranean\",\r\n clientName: \"Priority Actions Programme/Regional Activity Centre (PAP/RAC)\",\r\n welcome: \"Welcome to\",\r\n courses: \"Courses\",\r\n cancel: \"Cancel\",\r\n basic: \"Basic\",\r\n advanced: \"Advanced\",\r\n male: \"Male\",\r\n female: \"Female\",\r\n other: \"Other\",\r\n startCourse: \"Start course\",\r\n score: \"Score\",\r\n points: \"Points\",\r\n startsOn: \"starts on\",\r\n totalScore: \"Total score\",\r\n goToDiscussion: \"Go to discussion\",\r\n test: \"Take a test\",\r\n repeatTest: \"Repeat test\",\r\n submitTest: \"Submit test\",\r\n previousLecture: \"Previous lecture\",\r\n nextLecture: \"Next lecture\",\r\n backToLecture: \"Back to lecture\",\r\n totalPoints: \"Total points\",\r\n scoredPoints: \"You scored {0} points.\",\r\n correct: \"Correct!\",\r\n incorrect: \"Incorrect!\",\r\n foundWords: \"You found {0} words.\",\r\n finish: \"Finish\",\r\n finalForm: {\r\n coursePassedBasic: \"Congratulations, you have passed this course!\",\r\n courseFailedBasic:\r\n \"Unfortunately, you don't have enough points to pass this course!\",\r\n coursePassedAdvanced:\r\n \"Congratulations, this part of the course is finished!\",\r\n scoredPoints: \"You have {0} points of {1}.\",\r\n getCertificate: \"Get certificate\",\r\n retakeTest: \"Please retake the test!\",\r\n formInstructions:\r\n \"In order to enable us to improve the future runs, please fill in the following Post Evaluation form.\",\r\n shareImprovementIdeas:\r\n \"Share with us your ideas on how to improve {0} in the future...\",\r\n questions:\r\n \"Now, when you have gone through all the lectures, do you still have some remaining questions (or new ones!)?\",\r\n comments:\r\n \"Share with us your comments on this course! (What did you like, what did you dislike, what is missing, ideas for the next run, ...)\",\r\n sectionDivider:\r\n \"This part of the evaluation should focus on the following elements answering the following questions: What was good? What could have been better?\",\r\n topicContent: \"Topic / content\",\r\n trainingMethodology: \"Training methodology\",\r\n documentsMaterial: \"Documents / material\",\r\n simulationGame: \"Simulation Game\",\r\n trainers: \"Trainers\",\r\n coordinationAndAssistance:\r\n \"PAP/RAC Co-ordination and Technical Assistance\",\r\n whatWasGood: \"What was good?\",\r\n whatCouldBeBetter: \"What could have been better?\",\r\n submit: \"Submit\",\r\n thankYou: \"Thank you!\",\r\n dataSubmitted: \"Your data has been submitted.\"\r\n },\r\n auth: {\r\n loginInstructions: \"Please enter your username and password:\",\r\n registerInstructions: \"Sign up for your new account:\",\r\n thankYou: \"Thank you for your registration. Please, wait for approval before login.\",\r\n username: \"Username\",\r\n usernameHelperText: \"Username should only contain letters, numbers and underscores.\",\r\n password: \"Password\",\r\n passwordHelperText: \"Use at least 8 characters, at least 1 uppercase, 1 number and 1 special character.\",\r\n repeatPassword: \"Repeat password\",\r\n email: \"E-mail\",\r\n courseLevel: \"Course level\",\r\n course: \"Course\",\r\n message: \"Please enter your details:\",\r\n name: \"First name\",\r\n lastName: \"Family name\",\r\n gender: \"Gender\",\r\n dateOfBirth: \"Date of birth\",\r\n nationality: \"Nationality\",\r\n education: \"Education background\",\r\n workplace: \"Workplace function\",\r\n faculty: \"Faculty country\",\r\n country: \"Country\",\r\n city: \"City\",\r\n address: \"Address\",\r\n telephone: \"Telephone number\",\r\n skype: \"Skype name\",\r\n reason: \"Why do you want to take this course?\",\r\n expectation: \"What do you expect from this course?\"\r\n },\r\n errors: {\r\n required: \"This field is required.\",\r\n credentials: \"Login failed. Incorrect login information or user not yet approved.\",\r\n maxLength: \"Value is too long.\",\r\n minLength: \"Value is too short.\",\r\n username: \"Invalid username format.\",\r\n uniqueUsername: \"Username already exists.\",\r\n email: \"Invalid email address or format.\",\r\n uniqueEmail: \"Email already exists.\",\r\n confirmPassword: \"Passwords don't match. Use at least 8 characters, at least 1 uppercase, 1 number and 1 special character.\",\r\n weakPassword: \"Password is too weak. Use at least 8 characters, at least 1 uppercase, 1 number and 1 special character.\",\r\n fileType: \"File type is not supported.\",\r\n fileSize: \"Max allowed file size is 10MB.\",\r\n date: \"Selected date must be in the past.\",\r\n form: \"Something went wrong. Please try again later.\",\r\n userNotApproved:\r\n \"Login failed. Please wait until you are approved by our administrators.\"\r\n },\r\n comments: {\r\n comments: \"comments\",\r\n placeholder: \"Join the discussion\",\r\n reply: \"Reply\",\r\n noPosts: \"There are currently no posts.\",\r\n selectFile: \"Select file\",\r\n noFile: \"No selected file\",\r\n uploadingFile: \"Uploading file...\",\r\n fileUploaded: \"File uploaded.\",\r\n submit: \"Post\",\r\n edit: \"Edit\",\r\n delete: \"Delete\"\r\n },\r\n contact: {\r\n title: \"Contact\",\r\n subTitle: \"Contact us for more information:\",\r\n name: \"Name\",\r\n email: \"E-mail\",\r\n message: \"Enter your message\",\r\n subject: \"Subject\",\r\n submit: \"Send\",\r\n thankYou:\r\n \"Thank you for contacting us, we will reply as soon as possible.\"\r\n }\r\n },\r\n fr: {\r\n login: \"Identification\",\r\n register: \"Enregistrement\",\r\n logout: \"Déconnection\",\r\n slogan:\r\n \"Cours de formation virtuelle sur la gestion des zones côtières en Méditerranée\",\r\n clientName:\r\n \"Centre d’activités régionales/Programme d’actions prioritaires (CAR/PAP)\",\r\n welcome: \"Bienvenue dans\",\r\n courses: \"Cours\",\r\n cancel: \"Annuler\",\r\n basic: \"Cours général\",\r\n advanced: \"Cours avancé\",\r\n male: \"Homme\",\r\n female: \"Femme\",\r\n other: \"Autre\",\r\n startCourse: \"Commencer le cours\",\r\n score: \"Score\",\r\n points: \"Points\",\r\n startsOn: \"commencer\",\r\n totalScore: \"Score total\",\r\n goToDiscussion: \"Aller à la discussion\",\r\n test: \"Faire le test\",\r\n repeatTest: \"Refaire le test\",\r\n submitTest: \"Envoyer le test à la correction\",\r\n previousLecture: \"Lecture précédente\",\r\n nextLecture: \"Lecture suivante\",\r\n backToLecture: \"Retour à la lecture\",\r\n totalPoints: \"Points totaux\",\r\n scoredPoints: \"Vous avez obtenu {0} points.\",\r\n correct: \"Correct!\",\r\n incorrect: \"Incorrect!\",\r\n foundWords: \"Vous avez trouvé {0} mots.\",\r\n finish: \"Terminé\",\r\n finalForm: {\r\n coursePassedBasic: \"Félicitations, vous avez passé ce cours avec succès!\",\r\n courseFailedBasic:\r\n \"Malheureusement, vous n'avez pas assez de points pour valider ce cours!\",\r\n coursePassedAdvanced:\r\n \"Félicitations, cette partie du cours est terminée!\",\r\n scoredPoints: \"Vous avez {0} points de {1}.\",\r\n getCertificate: \"Obtenir le certificat\",\r\n retakeTest: \"Veuillez repasser test!\",\r\n formInstructions:\r\n \"Afin de nous permettre d'améliorer les futures sessions, veuillez remplir le formulaire d'évaluation suivant.\",\r\n shareImprovementIdeas:\r\n \"Partagez avec nous vos idées sur la façon d'améliorer la {0} à l'avenir...\",\r\n questions:\r\n \"Maintenant que vous avez un aperçu de toutes les leçons, est-ce que certaines questions restent en suspens (ou en avez vous de nouvelles!)?\",\r\n comments:\r\n \"Partagez avec nous vos commentaires sur ce cours ! (Ce que vous avez aimé, ce que vous n'avez pas aimé, ce qui manque, des idées pour la prochaine session, ...)\",\r\n sectionDivider:\r\n \"Pour les éléments suivants, répondez aux questions suivantes : Qu'est ce qui était bien ? Qu'est ce qui aurait pu être mieux?\",\r\n topicContent: \"Thème / contenu\",\r\n trainingMethodology: \"Méthodologie de formation\",\r\n documentsMaterial: \"Documents / matériel\",\r\n simulationGame: \"Jeu de simulation\",\r\n trainers: \"Formateurs\",\r\n coordinationAndAssistance:\r\n \"Coordination et assistance technique du CAR/PAP\",\r\n whatWasGood: \"Qu'est ce qui vous a particulièrement plu?\",\r\n whatCouldBeBetter: \"Qu'est ce qui pourrait être amélioré?\",\r\n submit: \"Envoyer\",\r\n thankYou: \"Merci!\",\r\n dataSubmitted: \"Vos données ont été soumises.\"\r\n },\r\n auth: {\r\n loginInstructions:\r\n \"Veuillez entre votre nom d'utilisateur et votre mot de passe:\",\r\n registerInstructions: \"Inscrivez-vous à votre nouveau compte:\",\r\n thankYou: \"Merci pour votre inscription. Merci de patienter jusqu’à ce qu’elle soit validée pour que vous puissiez vous connecter.\",\r\n username: \"Nom d'utilisateur\",\r\n usernameHelperText: \"Le nom d'utilisateur ne doit contenir que des lettres, des chiffres et des traits de soulignement.\",\r\n password: \"Mot de passe\",\r\n passwordHelperText: \"Utilisez au moins 8 caractères, dont au moins 1 majuscule, 1 chiffre et 1 caractère spécial.\",\r\n repeatPassword: \"Veuillez taper à nouveau votre mot de passe\",\r\n email: \"E-mail\",\r\n courseLevel: \"Niveau du cours\",\r\n course: \"Cours\",\r\n message: \"Veuillez saisir vos coordonnées:\",\r\n name: \"Prénom\",\r\n lastName: \"Nom de famille\",\r\n gender: \"Genre\",\r\n dateOfBirth: \"Date de naissance\",\r\n nationality: \"Nationalité\",\r\n education: \"Education\",\r\n workplace: \"Poste\",\r\n faculty: \"Faculté\",\r\n country: \"Pays\",\r\n city: \"Ville\",\r\n address: \"Adresse\",\r\n telephone: \"Numéro de téléphone\",\r\n skype: \"Nom d'utilisateur sur Skype\",\r\n reason: \"Pourquoi souhaitez-vous participer à ce cours?\",\r\n expectation: \"Qu'attendez-vous de ce cours?\"\r\n },\r\n errors: {\r\n required: \"Ce champ doit être rempli.\",\r\n credentials: \"Échec de la connexion. Informations de connexion incorrectes ou inscription non validée.\",\r\n maxLength: \"La valeur est trop longue.\",\r\n minLength: \"La valeur est trop courte.\",\r\n username: \"Format de nom d'utilisateur non valide.\",\r\n uniqueUsername: \"Ce nom d'utilisateur existe déjà.\",\r\n email: \"Le format de l'adresse e-mail n'est pas valide.\",\r\n uniqueEmail: \"Cet e-mail est déjà utilisé.\",\r\n confirmPassword: \"Les mots de passe ne sont pas identiques. Utilisez au moins 8 caractères, dont au moins 1 majuscule, 1 chiffre et 1 caractère spécial.\",\r\n weakPassword: \"La sécurité du mot de passe est trop faible. Utilisez au moins 8 caractères, dont au moins 1 majuscule, 1 chiffre et 1 caractère spécial.\",\r\n fileType: \"Ce type de fichier n'est pas pris en charge.\",\r\n fileSize: \"La taille maximale du fichier est de 10MB.\",\r\n date: \"La date sélectionnée doit être passée.\",\r\n form: \"Une erreur s'est produite. Merci de réessayer plus tard.\",\r\n userNotApproved:\r\n \"Vous n'avez pas réussi à vous identifier. Merci d'attendre que les administrateurs vous aient approuvés.\"\r\n },\r\n comments: {\r\n comments: \"commentaires\",\r\n placeholder: \"Rejoindre la discussion\",\r\n reply: \"Répondre\",\r\n noPosts: \"Il n'y pas de postes à pourvoir actuellement.\",\r\n selectFile: \"Sélectionner un fichier\",\r\n noFile: \"Pas de fichier sélectionné\",\r\n uploadingFile: \"Téléchargement du fichier...\",\r\n fileUploaded: \"Fichier téléchargé.\",\r\n submit: \"Poster\",\r\n edit: \"Editer\",\r\n delete: \"Supprimer\"\r\n },\r\n contact: {\r\n title: \"Contacter\",\r\n subTitle: \"Veuillez nous contacter pour obtenir plus d'informations:\",\r\n name: \"Nom\",\r\n email: \"E-mail\",\r\n message: \"Entrez votre message\",\r\n subject: \"Sujet\",\r\n submit: \"Envoyer\",\r\n thankYou:\r\n \"Merci de nous avoir contacté, nous vous répondrons dès que possible.\"\r\n }\r\n },\r\n it: {\r\n login: \"Accesso\",\r\n register: \"Registrazione\",\r\n logout: \"Disconnettersi\",\r\n slogan:\r\n \"Corso virtuale di formazione in gestione delle zone costiere del Mediterraneo\",\r\n clientName:\r\n \"Centro di attività regionale per il Programma di azioni prioritarie (PAP/RAC)\",\r\n welcome: \"Benvenuto a\",\r\n courses: \"Corsi\",\r\n cancel: \"Annulla\",\r\n basic: \"Di base\",\r\n advanced: \"Avanzato\",\r\n male: \"Maschio\",\r\n female: \"Femmina\",\r\n other: \"Altro\",\r\n startCourse: \"Inizia il corso\",\r\n score: \"Punto\",\r\n points: \"Punti\",\r\n startsOn: \"inizia\",\r\n totalScore: \"Punteggio totale\",\r\n goToDiscussion: \"Vai alla discussione\",\r\n test: \"Fai un test\",\r\n repeatTest: \"Ripeti il ​​test\",\r\n submitTest: \"Invia test\",\r\n previousLecture: \"Lezione precedente\",\r\n nextLecture: \"Prossima lezione\",\r\n backToLecture: \"Torna alla lezione\",\r\n totalPoints: \"Punti totali\",\r\n scoredPoints: \"Hai segnato {0} punti.\",\r\n correct: \"Corretto!\",\r\n incorrect: \"Scorretto!\",\r\n foundWords: \"Hai trovato {0} parole.\",\r\n finish: \"Finire\",\r\n finalForm: {\r\n coursePassedBasic: \"Congratulazioni, hai superato questo corso!\",\r\n courseFailedBasic:\r\n \"Sfortunatamente, non hai abbastanza punti per superare questo corso!\",\r\n coursePassedAdvanced: \"Complimenti, questa parte del corso è terminata!\",\r\n scoredPoints: \"Hai {0} punti di {1}.\",\r\n getCertificate: \"Ottieni il certificato\",\r\n retakeTest: \"Si prega di ripetere il test!\",\r\n formInstructions:\r\n \"Per consentirci di migliorare le esecuzioni future, compila il seguente modulo di post valutazione.\",\r\n shareImprovementIdeas:\r\n \"Condividi con noi le tue idee su come migliorare {0} in futuro...\",\r\n questions:\r\n \"Ora, quando hai passato tutte le lezioni, hai ancora alcune domande rimanenti (o nuove!)?\",\r\n comments:\r\n \"Condividi con noi i tuoi commenti su questo corso! (Cosa ti è piaciuto, cosa non ti è piaciuto, cosa manca, idee per la prossima corsa, ...)\",\r\n sectionDivider:\r\n \"Questa parte della valutazione dovrebbe concentrarsi sui seguenti elementi rispondendo alle seguenti domande: Cosa è stato buono? Cosa avrebbe potuto essere migliore?\",\r\n topicContent: \"Argomento / contenuto\",\r\n trainingMethodology: \"Metodologia di addestramento\",\r\n documentsMaterial: \"Documenti / materiale\",\r\n simulationGame: \"Gioco di simulazione\",\r\n trainers: \"Formatori\",\r\n coordinationAndAssistance:\r\n \"Coordinamento e assistenza tecnica di CAR/PAP\",\r\n whatWasGood: \"Che cosa era buono?\",\r\n whatCouldBeBetter: \"Cosa avrebbe potuto essere migliore?\",\r\n submit: \"Invia\",\r\n thankYou: \"Grazie!\",\r\n dataSubmitted: \"I tuoi dati sono stati inviati.\"\r\n },\r\n auth: {\r\n loginInstructions: \"Inserisci il tuo nome utente e la parola d'ordine:\",\r\n registerInstructions: \"Registrarsi per creare un nuovo account:\",\r\n thankYou: \"Grazie per la Sua registrazione. Si prega di attendere l'approvazione prima di effettuare il login.\",\r\n username: \"Nome utente\",\r\n usernameHelperText: \"Il nome utente deve contenere solo lettere, numeri e caratteri di sottolineatura.\",\r\n password: \"Parola d'ordine\",\r\n passwordHelperText: \"Usa almeno 8 caratteri, almeno 1 maiuscolo, 1 numero e 1 carattere speciale.\",\r\n repeatPassword: \"Ripeti la parola d'ordine\",\r\n email: \"E-mail\",\r\n courseLevel: \"Livello del corso\",\r\n course: \"Corso\",\r\n message: \"Per favore inserisci i tuoi dati:\",\r\n name: \"Nome\",\r\n lastName: \"Cognome\",\r\n gender: \"Genere\",\r\n dateOfBirth: \"Data di nascita\",\r\n nationality: \"Nazione\",\r\n education: \"Educazione\",\r\n workplace: \"Luogo di lavoro (funzione)\",\r\n faculty: \"Facoltà\",\r\n country: \"Paese\",\r\n city: \"Città\",\r\n address: \"Indirizzo\",\r\n telephone: \"Numero di telefono\",\r\n skype: \"Nome Skype\",\r\n reason: \"Perché hai scelto di seguire questo corso?\",\r\n expectation: \"Cosa sono le tue aspettative da questo corso?\"\r\n },\r\n errors: {\r\n required: \"Questo campo modulo è obbligatorio.\",\r\n credentials: \"Login fallito. Informazioni di accesso errate o utente non ancora approvato.\",\r\n maxLength: \"Il valore è troppo lungo.\",\r\n minLength: \"Il valore è troppo breve.\",\r\n username: \"Formato nome utente non valido.\",\r\n uniqueUsername: \"Il nome utente esiste già.\",\r\n email: \"Formato dell'indirizzo email non valido.\",\r\n uniqueEmail: \"Email già esistente.\",\r\n confirmPassword: \"Le parole d'ordine non corrispondono. Usa almeno 8 caratteri, almeno 1 maiuscolo, 1 numero e 1 carattere speciale.\",\r\n weakPassword: \"La parola d'ordine è troppo debole. Usa almeno 8 caratteri, almeno 1 maiuscolo, 1 numero e 1 carattere speciale.\",\r\n fileType: \"Il tipo di file non è supportato.\",\r\n fileSize: \"La dimensione massima consentita per i file è di 10 MB.\",\r\n date: \"La data selezionata deve essere nel passato.\",\r\n form: \"Qualcosa è andato storto. Per favore riprova più tardi.\",\r\n userNotApproved:\r\n \"Accesso fallito. Attendi fino a quando non sarai approvato dai nostri amministratori.\"\r\n },\r\n comments: {\r\n comments: \"commenti\",\r\n placeholder: \"Partecipa alla discussione\",\r\n reply: \"Rispondere\",\r\n noPosts: \"Al momento non ci sono messaggi.\",\r\n selectFile: \"Seleziona il file\",\r\n noFile: \"Nessun file selezionato\",\r\n uploadingFile: \"Caricamento file...\",\r\n fileUploaded: \"File caricato.\",\r\n submit: \"Inviare\",\r\n edit: \"Modificare\",\r\n delete: \"Elimina\"\r\n },\r\n contact: {\r\n title: \"Contatti\",\r\n subTitle: \"Contattateci per maggiori informazioni:\",\r\n name: \"Nome\",\r\n email: \"E-mail\",\r\n message: \"Inserisci il tuo messaggio\",\r\n subject: \"Soggetto\",\r\n submit: \"Invia\",\r\n thankYou: \"Grazie per averci contattato, ti risponderemo al più presto.\"\r\n }\r\n }\r\n});\r\n\r\nexport default strings;\r\n","import React, { createContext, useMemo } from \"react\";\r\n\r\nimport translations from \"./translations\";\r\n\r\nconst TranslationContext = createContext();\r\n\r\nconst TranslationProvider = props => {\r\n const t = translations;\r\n\r\n const value = useMemo(() => t, [t]);\r\n\r\n return ;\r\n};\r\n\r\nexport { TranslationProvider };\r\n\r\nexport default TranslationContext;\r\n","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/logos-home.2b0ff7a4.png\";","module.exports = __webpack_public_path__ + \"static/media/logos.25f77212.png\";","const courseTypes = {\r\n Basic: { id: 1, name: \"basic\" },\r\n Advanced: { id: 2, name: \"advanced\" }\r\n};\r\n\r\nexport { courseTypes };\r\n","import { useState, useEffect } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nconst useErrorStatusCheck = ({ selectorFn }) => {\r\n const errorStatus = useSelector(selectorFn);\r\n const [hasError, setHasError] = useState(false);\r\n\r\n useEffect(() => {\r\n // Error happens if the requested content doesn't exist (404)\r\n // or if the user doesn't have view access rights (403).\r\n if (errorStatus === 403 || errorStatus === 404) {\r\n setHasError(true);\r\n }\r\n\r\n if (!errorStatus) {\r\n setHasError(false);\r\n }\r\n }, [errorStatus]);\r\n\r\n return hasError;\r\n};\r\n\r\nexport default useErrorStatusCheck;\r\n","import React, { Suspense } from \"react\";\r\nimport Loader from \"../common/Loader\";\r\n\r\nconst CommentLayout = ({ children }) => {\r\n return (\r\n <>\r\n }>{children}\r\n \r\n );\r\n};\r\n\r\nexport default CommentLayout;\r\n","export const getCommentsFromState = state => state.comments.list;\r\nexport const getCommentFromState = state => state.comments.selectedItem;\r\nexport const getFileUrl = state => state.comments.selectedFileUrl;\r\nexport const getUploadProgressPercentage = state => state.comments.uploadProgress;\r\nexport const getAuthenticatedUser = state => state.auth.user;\r\n","const ConditionalWrapper = ({ condition, wrapper, children }) =>\r\n condition ? wrapper(children) : children;\r\n\r\nexport default ConditionalWrapper;\r\n","import React, { useEffect, useRef, forwardRef, useLayoutEffect } from \"react\";\r\nimport Jodit from \"jodit\";\r\nimport \"jodit/build/jodit.min.css\";\r\n\r\nconst JoditEditor = forwardRef(\r\n ({ defaultValue, config, tabIndex, name, id }, ref) => {\r\n const textArea = useRef(null);\r\n\r\n useLayoutEffect(() => {\r\n if (ref) {\r\n if (typeof ref === \"function\") {\r\n ref(textArea.current);\r\n } else {\r\n ref.current = textArea.current;\r\n }\r\n }\r\n }, [ref]);\r\n useEffect(() => {\r\n const element = textArea.current;\r\n textArea.current = Jodit.make(element, config);\r\n textArea.current.value = defaultValue;\r\n textArea.current.workplace.tabIndex = tabIndex || -1;\r\n\r\n return () => {\r\n textArea.current.destruct();\r\n textArea.current = element;\r\n };\r\n //eslint-disable-next-line\r\n }, [config]);\r\n useEffect(() => {\r\n if (textArea && textArea.current) {\r\n textArea.current.value = defaultValue;\r\n }\r\n }, [textArea, defaultValue]);\r\n\r\n return ;\r\n }\r\n);\r\n\r\nexport default JoditEditor;\r\n","import React, { useMemo } from \"react\";\r\n\r\nimport useTranslations from \"../../hooks/useTranslations\";\r\n\r\nimport JoditEditor from \"./JoditEditor\";\r\n\r\nconst HtmlEditor = ({ defaultValue, name, id, editorRef }, ...rest) => {\r\n const t = useTranslations();\r\n const currentLanguage = t.getLanguage();\r\n const config = useMemo(() => {\r\n return {\r\n autofocus: !defaultValue && id && id !== \"editor-0\" ? true : false,\r\n zIndex: 0,\r\n readonly: false,\r\n buttons: [\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"strikethrough\",\r\n \"ul\",\r\n \"ol\",\r\n \"font\",\r\n \"link\",\r\n \"cut\",\r\n \"copy\",\r\n \"paste\"\r\n ],\r\n buttonsMD: [\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"strikethrough\",\r\n \"ul\",\r\n \"ol\",\r\n \"font\",\r\n \"link\",\r\n \"cut\",\r\n \"copy\",\r\n \"paste\"\r\n ],\r\n buttonsXS: [\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"strikethrough\",\r\n \"ul\",\r\n \"ol\",\r\n \"font\",\r\n \"link\",\r\n \"cut\",\r\n \"copy\",\r\n \"paste\"\r\n ],\r\n removeButtons: [\r\n \"image\",\r\n \"paint\",\r\n \"fullsize\",\r\n \"source\",\r\n \"dots\",\r\n \"table\",\r\n \"all\"\r\n ],\r\n removeButtonsMD: [\r\n \"image\",\r\n \"paint\",\r\n \"fullsize\",\r\n \"source\",\r\n \"dots\",\r\n \"table\"\r\n ],\r\n removeButtonsXS: [\r\n \"image\",\r\n \"paint\",\r\n \"fullsize\",\r\n \"source\",\r\n \"dots\",\r\n \"table\"\r\n ],\r\n toolbarButtonSize: \"small\",\r\n theme: \"light\",\r\n enableDragAndDropFileToEditor: false,\r\n saveModeInCookie: false,\r\n spellcheck: true,\r\n width: \"100%\",\r\n minHeight: 60,\r\n direction: \"auto\",\r\n language: currentLanguage,\r\n debugLanguage: false,\r\n editorCssClass: \"textarea\",\r\n i18n: currentLanguage,\r\n tabIndex: -1,\r\n toolbar: true,\r\n enter: \"p\",\r\n useSplitMode: false,\r\n colorPickerDefaultTab: \"background\",\r\n askBeforePasteHTML: false,\r\n askBeforePasteFromWord: false,\r\n disablePlugins: [\"stat\"],\r\n events: {},\r\n textIcons: false,\r\n placeholder: t.comments.placeholder,\r\n toolbarAdaptive: false,\r\n iframe: true\r\n };\r\n }, [t, currentLanguage, id, defaultValue]);\r\n return (\r\n (editorRef.current[id] = r)}\r\n id={id}\r\n config={config}\r\n name={name}\r\n />\r\n );\r\n};\r\n\r\nexport default HtmlEditor;\r\n","import React from \"react\";\r\nimport useTranslations from \"../../hooks/useTranslations\";\r\n\r\nconst FileInput = ({\r\n inputRef,\r\n id,\r\n name,\r\n onChange = () => {},\r\n onRemove = () => {},\r\n fileName,\r\n file\r\n}) => {\r\n const t = useTranslations();\r\n return (\r\n <>\r\n (inputRef.current[`file-${id || 0}`] = r)}\r\n type=\"file\"\r\n id={`file-${id || 0}`}\r\n name={name}\r\n onChange={e => onChange(e, id)}\r\n />\r\n inputRef.current[`file-${id || 0}`].click()}\r\n >\r\n {t.comments.selectFile}\r\n \r\n  \r\n \r\n {file?.name || fileName || t.comments.noFile}\r\n \r\n {(inputRef.current[`file-${id || 0}`]?.value || fileName) && (\r\n <>\r\n  \r\n onRemove(e, id)}\r\n >\r\n {null}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default FileInput;\r\n","import React from \"react\";\r\nimport HtmlEditor from \"../../common/editor/HtmlEditor\";\r\nimport useTranslations from \"../../hooks/useTranslations\";\r\nimport FileInput from \"./FileInput\";\r\n\r\nconst CommentInput = ({\r\n avatar,\r\n defaultValues,\r\n onChange = () => {},\r\n onSubmit = () => {},\r\n onRemove = () => {},\r\n uploadProgress = 0,\r\n validations,\r\n commentInputRef,\r\n editorRef,\r\n id,\r\n currentId,\r\n inputRef\r\n}) => {\r\n const t = useTranslations();\r\n return (\r\n
\r\n
\r\n \"Avatar\"\r\n
\r\n
\r\n \r\n
\r\n \r\n {uploadProgress && id === currentId.current && (\r\n
\r\n \r\n {`${t.comments.uploadingFile} ${uploadProgress}%` ||\r\n (uploadProgress === 100 &&\r\n `${t.comments.fileUploaded} ${uploadProgress}%`)}\r\n
\r\n
\r\n )}\r\n {validations && (\r\n \r\n {!validations.type\r\n ? t.errors.fileType\r\n : !validations.size\r\n ? t.errors.fileSize\r\n : null}\r\n \r\n )}\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default CommentInput;\r\n","import React from \"react\";\r\nimport moment from \"moment\";\r\nimport classNames from \"classnames\";\r\n\r\nimport ConditionalWrapper from \"./ConditionalWrapper\";\r\nimport CommentInput from \"./components/CommentInput\";\r\nimport useTranslations from \"../hooks/useTranslations\";\r\nimport { ROLES } from \"../services/constants/roles\";\r\n\r\nconst Post = ({\r\n avatar,\r\n comment,\r\n isChild = false,\r\n parent,\r\n defaultValues,\r\n render = () => {},\r\n onChange = () => {},\r\n onEdit = () => {},\r\n onDelete = () => {},\r\n onSubmit = () => {},\r\n onRemoveFile = () => {},\r\n addReply = () => {},\r\n onFileDownload = () => {},\r\n uploadProgress,\r\n toggleReply = false,\r\n validations,\r\n editing,\r\n editorRef,\r\n inputRef,\r\n currentId,\r\n commentInputRef,\r\n authenticatedUser\r\n}) => {\r\n const t = useTranslations();\r\n const getReplyLinkClasses = () => {\r\n return classNames({\r\n reply: true,\r\n selected: toggleReply\r\n });\r\n };\r\n const canBeDeleted =\r\n (comment.canDeleteComment && !comment.children.length) ||\r\n authenticatedUser.roleId === ROLES.Administrators;\r\n\r\n return (\r\n (\r\n
\r\n
    {children}
\r\n
\r\n )}\r\n >\r\n
  • \r\n {!editing ? (\r\n <>\r\n
    \r\n \"Avatar\"\r\n
    \r\n
    \r\n {\" \"}\r\n
    \r\n {comment.userName}\r\n {isChild && (\r\n {parent.userName}\r\n )}\r\n {` - ${moment(comment.createdOnDate)\r\n .locale(t.getLanguage())\r\n .fromNow()}`}\r\n {comment.canEditComment && (\r\n <>\r\n   –  \r\n onEdit(e, comment.id)}\r\n >\r\n {t.comments.edit}\r\n \r\n \r\n )}\r\n {canBeDeleted && (\r\n <>\r\n   –  \r\n \r\n {t.comments.delete}\r\n \r\n \r\n )}\r\n {comment.modifiedOnDate && (\r\n - (edited)\r\n )}\r\n
    \r\n
    \r\n {comment.fileName && (\r\n
    \r\n Attachment: \r\n \r\n {comment.fileName}\r\n \r\n
    \r\n )}\r\n
    \r\n {comment.level < 5 && (\r\n \r\n {t.comments.reply}\r\n \r\n )}\r\n
    \r\n {toggleReply ? (\r\n \r\n ) : null}\r\n \r\n \r\n ) : (\r\n \r\n )}\r\n {comment.children.length > 0 && render(comment.children)}\r\n
  • \r\n \r\n );\r\n};\r\n\r\nexport default Post;\r\n","import { useCallback } from \"react\";\r\n\r\nconst useTransformList = ({ list = [] }) => {\r\n const getNestedList = useCallback(() => {\r\n let hash = {},\r\n nestedCommentTree = [];\r\n list.forEach(x => {\r\n hash[x.id] = x;\r\n x.children = [];\r\n });\r\n list.forEach(x => {\r\n x.parentCommentId && hash[x.parentCommentId]\r\n ? hash[x.parentCommentId].children.push(x)\r\n : nestedCommentTree.push(x);\r\n });\r\n return nestedCommentTree;\r\n }, [list]);\r\n\r\n return { getNestedList };\r\n};\r\n\r\nexport default useTransformList;\r\n","import React from \"react\";\r\n\r\nconst DeleteModal = ({ onDelete = () => {}, onCancel = () => {} }) => {\r\n return (\r\n
    \r\n
    \r\n

    Warning

    \r\n

    Are you sure that you want to delete your comment?

    \r\n \r\n Yes\r\n \r\n \r\n {null}\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default DeleteModal;\r\n","import React, { useEffect, useState, useRef } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\n\r\nimport useTranslations from \"../hooks/useTranslations\";\r\n\r\nimport {\r\n getCommentsFromState,\r\n getFileUrl,\r\n getAuthenticatedUser,\r\n getUploadProgressPercentage\r\n} from \"./state/commentSelectors\";\r\nimport {\r\n getComments,\r\n deleteCommentAndUpdateState,\r\n createCommentAndUpdateState,\r\n updateCommentAndUpdateState,\r\n getFileLinkForDownload,\r\n sendEmailNotificationOnReply,\r\n resetCommentState\r\n} from \"./state/commentActions\";\r\n\r\nimport avatar from \"../assets/img/icons/avatar.png\";\r\nimport Post from \"./Post\";\r\nimport CommentInput from \"./components/CommentInput\";\r\nimport {\r\n validateFileType,\r\n validateFileSize\r\n} from \"./helpers/validateUploadedFile\";\r\nimport useTransformList from \"../hooks/useTransformList\";\r\nimport DeleteModal from \"./components/DeleteModal\";\r\n\r\nconst initialState = {\r\n id: null,\r\n text: \"\",\r\n fileName: \"\",\r\n file: null,\r\n uploadProgress: 0\r\n};\r\n\r\nconst List = ({ staticPageLanguageId = null, lectureLanguageId = null }) => {\r\n const dispatch = useDispatch();\r\n const t = useTranslations();\r\n let commentInputRef = useRef();\r\n let editorRef = useRef([]);\r\n let inputRef = useRef([]);\r\n const currentId = useRef();\r\n const idToDelete = useRef();\r\n const comments = useSelector(getCommentsFromState);\r\n const authenticatedUser = useSelector(getAuthenticatedUser);\r\n const selectedFile = useSelector(getFileUrl);\r\n const uploadProgress = useSelector(getUploadProgressPercentage);\r\n const [validations, setValidations] = useState({});\r\n\r\n const [toggleReply, setToggleReply] = useState({});\r\n const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false);\r\n const [values, setValues] = useState({ 0: { ...initialState } });\r\n\r\n const [toggleEdit, setToggleEdit] = useState({});\r\n useEffect(() => {\r\n dispatch(\r\n getComments({\r\n data: { staticPageLanguageId, lectureLanguageId }\r\n })\r\n );\r\n }, [dispatch, staticPageLanguageId, lectureLanguageId]);\r\n\r\n useEffect(() => {\r\n if (selectedFile) {\r\n setTimeout(() => {\r\n window.location.href = selectedFile;\r\n }, 100);\r\n dispatch(resetCommentState());\r\n }\r\n }, [dispatch, selectedFile]);\r\n\r\n useEffect(() => {\r\n function handleClickOutside(event) {\r\n if (\r\n commentInputRef.current &&\r\n !commentInputRef.current.contains(event.target)\r\n ) {\r\n if (Object.keys(toggleEdit).length > 0) {\r\n setToggleEdit({});\r\n }\r\n }\r\n }\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, [commentInputRef, toggleEdit]);\r\n\r\n const { getNestedList } = useTransformList({ list: comments.list });\r\n\r\n const handleReplyClick = (e, id) => {\r\n e.preventDefault();\r\n setToggleReply(prevState => {\r\n return {\r\n ...prevState,\r\n [id]: !prevState[id]\r\n };\r\n });\r\n setValues(prevState => {\r\n return {\r\n ...prevState,\r\n [id]: initialState\r\n };\r\n });\r\n };\r\n\r\n const handleChange = (e, id) => {\r\n e.preventDefault();\r\n const { name, value, files } = e.target;\r\n if (name === \"file\") {\r\n let type = validateFileType(files[0]);\r\n let size = validateFileSize(files[0]);\r\n if (!type || !size) {\r\n setValidations(prevState => {\r\n return {\r\n ...prevState,\r\n [id || 0]: { type, size }\r\n };\r\n });\r\n e.target.value = null;\r\n setValues(prevState => {\r\n return {\r\n ...prevState,\r\n [id || 0]: {\r\n ...prevState[id || 0],\r\n file: \"\",\r\n fileName: \"\"\r\n }\r\n };\r\n });\r\n return;\r\n } else {\r\n setValidations({});\r\n }\r\n }\r\n setValues(prevState => {\r\n return {\r\n ...prevState,\r\n [id || 0]: {\r\n ...prevState[id || 0],\r\n [name]: name === \"file\" ? files[0] : value\r\n }\r\n };\r\n });\r\n };\r\n\r\n const handleEdit = (e, id) => {\r\n e.preventDefault();\r\n setToggleEdit(prevState => {\r\n return {\r\n ...prevState,\r\n [id]: !prevState[id]\r\n };\r\n });\r\n let comment = comments.list.find(x => x.id === id);\r\n setValues(prevState => {\r\n return {\r\n ...prevState,\r\n [id]: comment\r\n };\r\n });\r\n if (!toggleEdit[id] && validations[id]) {\r\n setValidations({});\r\n }\r\n };\r\n\r\n const closeModal = e => {\r\n e.preventDefault();\r\n setIsDeleteModalVisible(false);\r\n idToDelete.current = null;\r\n };\r\n const confirmDelete = e => {\r\n dispatch(\r\n deleteCommentAndUpdateState({\r\n id: idToDelete.current,\r\n data: { staticPageLanguageId, lectureLanguageId }\r\n })\r\n );\r\n\r\n closeModal(e);\r\n };\r\n\r\n const handleDelete = (e, id) => {\r\n e.preventDefault();\r\n idToDelete.current = id;\r\n setIsDeleteModalVisible(true);\r\n };\r\n\r\n const onRemoveFile = (e, id) => {\r\n e.preventDefault();\r\n setValues(prevState => {\r\n return {\r\n ...prevState,\r\n [id || 0]: {\r\n ...prevState[id || 0],\r\n file: \"\",\r\n fileName: \"\"\r\n }\r\n };\r\n });\r\n inputRef.current[`file-${id || 0}`].value = \"\";\r\n };\r\n\r\n const onFileDownload = (e, id) => {\r\n e.preventDefault();\r\n dispatch(getFileLinkForDownload(id));\r\n };\r\n\r\n const handlePostComment = parentOrSelf => {\r\n let commentText =\r\n editorRef.current[`editor-${parentOrSelf?.id || 0}`].value;\r\n\r\n if (!commentText) {\r\n return;\r\n }\r\n const formData = new FormData();\r\n\r\n let newComment = toggleReply[parentOrSelf.id] === true;\r\n // let editComment = toggleEdit[parentOrSelf.id] === true;\r\n\r\n formData.append(\"text\", commentText);\r\n if (newComment || parentOrSelf === 0) {\r\n const { fileName, uploadProgress, ...rest } = values[\r\n parentOrSelf?.id || 0\r\n ];\r\n let payload = {\r\n ...rest,\r\n parentCommentId: parentOrSelf?.id || null,\r\n level: parentOrSelf ? parentOrSelf.level + 1 : null,\r\n staticPageLanguageId,\r\n lectureLanguageId,\r\n userId: 4\r\n };\r\n Object.entries(payload).forEach(([key, value]) => {\r\n if (value !== null) {\r\n formData.append(key, value);\r\n }\r\n });\r\n dispatch(\r\n createCommentAndUpdateState({\r\n data: formData,\r\n pageData: { staticPageLanguageId, lectureLanguageId }\r\n })\r\n ).then(x => {\r\n if (parentOrSelf !== 0) {\r\n dispatch(\r\n sendEmailNotificationOnReply({\r\n data: {\r\n LanguageCode: t.getLanguage(),\r\n userName: parentOrSelf.userName,\r\n content:\r\n editorRef.current[`editor-${parentOrSelf?.id || 0}`].value,\r\n replyUrl: window.location.href\r\n }\r\n })\r\n );\r\n inputRef.current[`file-${parentOrSelf.id}`].value = \"\";\r\n editorRef.current[`editor-${parentOrSelf.id}`].value = \"\";\r\n\r\n setToggleReply(prevState => {\r\n return {\r\n ...prevState,\r\n [parentOrSelf.id]: !prevState[parentOrSelf.id]\r\n };\r\n });\r\n } else {\r\n inputRef.current[`file-${0}`].value = \"\";\r\n editorRef.current[`editor-${0}`].value = \"\";\r\n setValues(prevState => {\r\n return {\r\n ...prevState,\r\n 0: { ...initialState }\r\n };\r\n });\r\n }\r\n });\r\n } else {\r\n const { uploadProgress, parentCommentId, level, ...rest } = values[\r\n parentOrSelf?.id\r\n ];\r\n let payload = {\r\n ...rest,\r\n parentCommentId: parentCommentId,\r\n level: level,\r\n staticPageLanguageId,\r\n lectureLanguageId,\r\n userId: 1\r\n };\r\n Object.entries(payload).forEach(([key, value]) => {\r\n if (value !== null) {\r\n formData.append(key, value);\r\n }\r\n });\r\n formData.append(\"id\", values[parentOrSelf.id].id);\r\n dispatch(\r\n updateCommentAndUpdateState({\r\n data: formData,\r\n pageData: { staticPageLanguageId, lectureLanguageId }\r\n })\r\n ).then(x => {\r\n inputRef.current[`file-${parentOrSelf ? parentOrSelf.id : 0}`].value =\r\n \"\";\r\n editorRef.current[\r\n `editor-${parentOrSelf ? parentOrSelf.id : 0}`\r\n ].value = \"\";\r\n setToggleEdit(prevState => {\r\n return {\r\n ...prevState,\r\n [values[parentOrSelf.id || 0].id]: !prevState[\r\n values[parentOrSelf.id || 0].id\r\n ]\r\n };\r\n });\r\n });\r\n }\r\n currentId.current = parentOrSelf.id || 0;\r\n };\r\n const renderComments = posts => {\r\n return posts?.map((post, index) => {\r\n let parent = post.parentCommentId\r\n ? comments.list.find(x => x.id === post.parentCommentId)\r\n : null;\r\n return (\r\n handleReplyClick(e, post.id)}\r\n onChange={handleChange}\r\n onSubmit={() => handlePostComment(post)}\r\n onEdit={handleEdit}\r\n onDelete={e => handleDelete(e, post.id)}\r\n onFileDownload={e => onFileDownload(e, post.id)}\r\n onRemoveFile={onRemoveFile}\r\n toggleReply={toggleReply[post.id]}\r\n validations={validations[post.id]}\r\n uploadProgress={uploadProgress}\r\n editing={toggleEdit[post.id]}\r\n editorRef={editorRef}\r\n inputRef={inputRef}\r\n currentId={currentId}\r\n commentInputRef={commentInputRef}\r\n authenticatedUser={authenticatedUser}\r\n />\r\n );\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n {comments.count || 0} {t.comments.comments}\r\n \r\n handlePostComment(0)}\r\n onRemove={onRemoveFile}\r\n validations={validations[0]}\r\n uploadProgress={uploadProgress}\r\n id={0}\r\n currentId={currentId}\r\n commentInputRef={commentInputRef}\r\n />\r\n {comments.list && comments.list.length ? (\r\n
      {renderComments(getNestedList())}
    \r\n ) : (\r\n
    \r\n {t.comments.noPosts}\r\n
    \r\n )}\r\n
    \r\n {isDeleteModalVisible && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default List;\r\n","export const validateFileType = file => {\r\n const allowedFileExtensions = [\r\n \".jpg\",\r\n \".png\",\r\n \".jpeg\",\r\n \".gif\",\r\n \".pdf\",\r\n \".docx\",\r\n \".pptx\",\r\n \".xlsx\"\r\n ];\r\n let extension = file.name.slice(file.name.lastIndexOf(\".\"));\r\n if (!allowedFileExtensions.includes(extension.toLowerCase())) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const validateFileSize = file => {\r\n const maxAllowedFileSizeInBytes = 10485760;\r\n if (file.size > maxAllowedFileSizeInBytes) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n","const ROLES = {\r\n System: 1,\r\n Administrators: 2,\r\n Professors: 3,\r\n StudentsAdvanced: 4,\r\n StudentsBasic: 5\r\n};\r\n\r\nexport { ROLES };\r\n","module.exports = \"data:image/gif;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAAoAgMAAADWPtEWAAAAA3NCSVQICAjb4U/gAAAACVBMVEUAI5X////tKTkDtutPAAAACXBIWXMAAAsSAAALEgHS3X78AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABlJREFUKJFjYAACxlAgyFoFBAyj3FEuNbgALiiwGYJEpn0AAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAAoCAMAAACcjsm3AAAAA3NCSVQICAjb4U/gAAABdFBMVEUKF6eip93bHzXnZHP63+JNVr+5vebvmKLeMEXp6vcYJKz3zNH+9/jjS13k5fX0t77re4hkbMfdKj/gO0797/Czt+MiLq/yqrPpdoTshZHlWmtYYcOtseH2x83v8Pn519v////mJz7hRFb78/cpNbL2w8ludsvtj5r86OodKa3xoqzbNUncJjvCwufy8/ryrraord9TXMHkVWbzvsLnannmYG9dZsXrgY1pccm2uuPcJDn40NXhP1L98vTm6PYhLK/neYr86uziR1n75ej52t3/+vvfN0vsiZXwnqjrlp7jZXEkMa7vrrLv8/fzsrYtNbL98PLbIDnnaXXj5/PDxuldacL79/fq6/f74uX/9/v3yc7xpK387O7jUGH1wMbobXvhQVTlWWn3zdLgPlFNWb72xcrmYXHdLEEgKK7dKD3lXW2pruD409f339/vrrbnfYrnZnXgOk3rfYrvoq7zsrrfNkrvmqTjTWHukpz1vsXfSV3ob32+MCpJAAAACXBIWXMAAAsSAAALEgHS3X78AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAAhpJREFUSIntVmtP4lAQvRYfVVF5iijWI/FRjBY1CgStpGKXTUyMGBOMr3UxSlA/6Mbd1fjnnYuvtlyk8GGzH5yPnXPmtL0zZy4DsL/NHBEDJl8DiDmzU/vwgoV0QMu0Qsxoncuyzny/H0m0e9gtcbgbf6oDE2D6kzRCoorfHdGvbJ3MP5gAYYbku2kSDeeaE3Nhs2f+7xZqD1Ol0Irk8wKlVDNiqjQxUO3BGzQXxr0cHOdlEp8REzFzNrvcaX05v2J4pDSJ9o41Jo6Vbjar32H/HfSrkvJ6Pz1dTIiJiUWzkP15UH8AGU29LEZJdGNJRFzaKMcDRxAcOdteQKQSX6NcR5+T2NfhTRev8pRbqGsyihktf5Ut0BENdtmJXYOH55UIl5sR0FitB48CaXCElajhRvKovKenrOiYNTQYBl7igwiY5Vo1G5ShQViJomifONlmfBH/L+K/7xxHkwPeHVNADBnOJrePFVCOV1Qo9rGiKATmHGNlHWSSi9Kk1w8yTVYhO5oXDjJZB9B/RpMusg7KrcUDEYF1ZLhcuriqNjIrEo1S2mFWZI/A4TrJNbTHa/79Z5WkzR79CpeTLtXPDbkG8hjvhkwrgOTO5WTTFfCCu39dASle6RdVcrN0COqT9o45lJcZD8o7LtccoS/u5CFwl6Mat4b7xQroI9IPneEiSG/d0ioHTr/52K68d9zq5YFEQ4xuHm1cV4BnfnPpcb8wDxwAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAAoCAYAAACrUDmFAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAOKADAAQAAAABAAAAKAAAAABtt//RAAABeElEQVRoBWNkAIKWq0vNzn+6v+rO12cyb359ZgaJkQo8RI0YJmmlkaoNq/ovrf0Mvw+fwCpHSJBJkP8vs5zsE2Y1lTCRvJRTLCDPLX166PinP9+YCGnGJ8/CwsLAxcWFTwnRcj+AZv0mWjWqwn/vPzIDsfyfu/ePv5k0x5IJFHOUeg7VisHB+//lK9PfW3dWMYGS5eBwEvVd8ffRYxkmcvMc9Z1DfRNByZWifEd9J1HfxFEPUj9M6WviaAzSN7ypb9toDFI/TOlr4mgM0je8qW/baAxSP0zpa+JoDNI3vKlv22gMUj9M6WviaAzSN7ypb9toDFI/TOlr4mgM0je8qW/baAxSP0zpa+JoDNI3vKlv22gMUj9M6WviaAzSN7ypb9toDFI/TOlrIpMIG+9f+lpJP9tA8/VMKtxST+hnJX1tAi1GYDLkUwzjY+H6R1+raW8bIw/3P9BKC5Ya7ehTwJUWlpQuI/nz5w/Dt2/fqOJykFnkAvRlJACtjmawKW9D0wAAAABJRU5ErkJggg==\"","import { useEffect } from \"react\";\r\nimport { useLocation } from \"react-router-dom\";\r\n\r\nconst ScrollToTop = () => {\r\n const { pathname } = useLocation();\r\n\r\n useEffect(() => {\r\n window.scrollTo(0, 0);\r\n }, [pathname]);\r\n\r\n return null;\r\n};\r\n\r\nexport default ScrollToTop;\r\n","/* eslint-disable jsx-a11y/anchor-has-content */\r\nimport React from \"react\";\r\n\r\nimport useTranslations from \"../hooks/useTranslations\";\r\n\r\nimport logo from \"../assets/img/logo.gif\";\r\n\r\nconst Footer = () => {\r\n const t = useTranslations();\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n \"logo\"\r\n \r\n\r\n

    \r\n {t.clientName}\r\n
    \r\n Kraj Sv. Ivana 11\r\n
    \r\n HR-21000 Split\r\n
    \r\n CROATIA\r\n
    \r\n Tel: (385) 21 340 470\r\n
    \r\n Fax: (385) 21 340 490\r\n
    \r\n e-mail: medopen@paprac.org\r\n
    \r\n http://www.paprac.org\r\n

    \r\n
    \r\n\r\n
    \r\n \r\n\r\n \r\n\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default Footer;\r\n","import React from \"react\";\r\nimport { Route, Redirect, useLocation } from \"react-router-dom\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nimport { getIsAuthenticated } from \"../auth/state/authSelectors\";\r\n\r\nconst PrivateRoute = ({\r\n component: Component,\r\n layout: Layout,\r\n roles,\r\n ...rest\r\n}) => {\r\n const { pathname } = useLocation();\r\n const isLoggedIn = useSelector(getIsAuthenticated);\r\n // TODO: izvuci usera ako postoji\r\n // const currentUser = null;\r\n\r\n if (!isLoggedIn) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n // TODO: check if route is restricted by role\r\n // for example:\r\n // if (roles && roles.indexOf(currentUser.role) === -1) {\r\n // // role not authorised so redirect to home page\r\n // return ;\r\n // }\r\n\r\n return (\r\n \r\n {Layout ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default PrivateRoute;\r\n","import React from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nimport useTranslations from \"../../hooks/useTranslations\";\r\nimport { getIsAuthenticated } from \"../../auth/state/authSelectors\";\r\n\r\nconst Header = ({ title = \"\", subtitle = \"\" }) => {\r\n const t = useTranslations();\r\n const isAuthenticated = useSelector(getIsAuthenticated);\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n
    \r\n

    {t.welcome}

    \r\n

    {title}

    \r\n

    {subtitle}

    \r\n\r\n
    \r\n {isAuthenticated === false && (\r\n <>\r\n \r\n {t.login}\r\n \r\n\r\n \r\n {t.register}\r\n \r\n \r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n};\r\n\r\nexport default Header;\r\n","import React from \"react\";\r\n\r\n// TODO: mozda nam ova komponenta nece trebati jer je ista kao CoursePageHeader\r\nconst Header = ({ title = \"\", subtitle = \"\" }) => {\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    {title}

    \r\n

    {subtitle}

    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default Header;\r\n","import React, { useEffect } from \"react\";\r\nimport { useParams, useHistory } from \"react-router-dom\";\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\n\r\n// import Loader from \"../common/Loader\";\r\nimport { getStaticPageDetails } from \"./state/staticPageActions\";\r\nimport {\r\n getSelectedStaticPage,\r\n getIsStaticPageLoading,\r\n getStaticPageFetchErrorStatus\r\n} from \"./state/staticPageSelectors\";\r\nimport { getHomePageId } from \"../app/state/appSelectors\";\r\nimport HomePageHeader from \"../common/header/HomePageHeader\";\r\nimport InnerPageHeader from \"../common/header/InnerPageHeader\";\r\nimport Comments from \"../comments/CommentList\";\r\nimport CommentsLayout from \"../comments/CommentLayout\";\r\nimport useErrorStatusCheck from \"../hooks/useErrorStatusCheck\";\r\nimport useRedirectUrlCalculation from \"../hooks/useRedirectUrlCalculation\";\r\nimport { PAGE_TYPES } from \"../services/constants/pageTypes\";\r\nimport { courseTypes } from \"../services/enums/courseTypes\";\r\n\r\nconst StaticPage = ({ isUrlValid }) => {\r\n const { id } = useParams();\r\n const page = useSelector(getSelectedStaticPage);\r\n const isLoading = useSelector(getIsStaticPageLoading);\r\n const homePageId = useSelector(getHomePageId);\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n const fetchError = useErrorStatusCheck({\r\n selectorFn: getStaticPageFetchErrorStatus\r\n });\r\n const redirectUrl = useRedirectUrlCalculation({\r\n pageType: PAGE_TYPES.static\r\n });\r\n\r\n useEffect(() => {\r\n if (\r\n isUrlValid &&\r\n (id || (!id && homePageId)) &&\r\n (!page ||\r\n (page &&\r\n ((id && page.id !== +id) ||\r\n (!id && homePageId && page.id !== homePageId))))\r\n ) {\r\n dispatch(getStaticPageDetails({ id: id || homePageId }));\r\n }\r\n }, [dispatch, isUrlValid, id, homePageId, page]);\r\n\r\n useEffect(() => {\r\n if (fetchError && !isLoading) {\r\n history.replace(redirectUrl);\r\n }\r\n }, [history, fetchError, redirectUrl, isLoading]);\r\n\r\n // We don't display loader because data loads fast\r\n // so the loader would be shown only as a flicker (bad UX).\r\n // if (isLoading) {\r\n // return ;\r\n // }\r\n\r\n return (\r\n <>\r\n {!id ? (\r\n \r\n ) : (\r\n \r\n )}\r\n\r\n
    \r\n \r\n {page?.courseTypeId === courseTypes.Advanced.id &&\r\n page?.hasComments &&\r\n id && (\r\n \r\n \r\n \r\n )}\r\n
    \r\n \r\n );\r\n};\r\n\r\nexport default StaticPage;\r\n","// TODO: maknuti ovu liniju prije builda za produkciju\r\n/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useRef } from \"react\";\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\nimport { Link, useHistory } from \"react-router-dom\";\r\nimport classnames from \"classnames\";\r\n\r\nimport useTranslations from \"../../hooks/useTranslations\";\r\nimport { changeLanguage } from \"../../app/state/appActions\";\r\nimport { getLanguages, getCurrentLanguage } from \"../../app/state/appSelectors\";\r\nimport { logout } from \"../../auth/state/authActions\";\r\nimport { getUsername } from \"../../auth/state/authSelectors\";\r\n\r\nimport frenchFlag from \"../../assets/img/icons/FR@2x.png\";\r\nimport englishFlag from \"../../assets/img/icons/GB@2x.png\";\r\nimport italianFlag from \"../../assets/img/icons/IT@2x.png\";\r\n\r\nconst imgToLangMapper = {\r\n en: englishFlag,\r\n fr: frenchFlag,\r\n it: italianFlag\r\n};\r\n\r\nconst TopBar = () => {\r\n const currentLanguage = useSelector(getCurrentLanguage);\r\n const languages = useSelector(getLanguages);\r\n const username = useSelector(getUsername);\r\n const t = useTranslations();\r\n const [langMenuOpened, setLangMenuOpened] = useState(false);\r\n const menuRef = useRef();\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n /**\r\n * Check if clicked on outside of element\r\n */\r\n function handleClickOutside(event) {\r\n if (menuRef.current && !menuRef.current.contains(event.target)) {\r\n if (langMenuOpened) {\r\n setLangMenuOpened(false);\r\n }\r\n }\r\n }\r\n\r\n // Bind the event listener\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => {\r\n // Unbind the event listener on clean up\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, [menuRef, langMenuOpened]);\r\n\r\n const toggleMenu = () => {\r\n setLangMenuOpened(!langMenuOpened);\r\n };\r\n\r\n const handleLanguageClick = language => event => {\r\n event.preventDefault();\r\n\r\n if (language.id !== currentLanguage.id) {\r\n dispatch(changeLanguage({ lang: language }));\r\n history.push(\"/\");\r\n }\r\n };\r\n\r\n const listWrapperClasses = classnames({\r\n langSelect: true,\r\n openLang: langMenuOpened\r\n });\r\n\r\n const getMenuItemClasses = lang => {\r\n return classnames({\r\n \"lang-item\": true,\r\n \"current-lang\": lang === currentLanguage.code\r\n });\r\n };\r\n\r\n const handleLogout = event => {\r\n event.preventDefault();\r\n\r\n dispatch(logout());\r\n history.push(\"/\");\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n
    {t.slogan}
    \r\n\r\n
    \r\n
    \r\n {username ? (\r\n <>\r\n {username}\r\n \r\n {t.logout}\r\n \r\n \r\n ) : (\r\n <>\r\n \r\n {t.login}\r\n \r\n\r\n \r\n {t.register}\r\n \r\n \r\n )}\r\n
    \r\n\r\n
    \r\n \r\n {languages.map(lang => (\r\n
  • \r\n \r\n \r\n \r\n
  • \r\n ))}\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default TopBar;\r\n","// TODO: maknuti ovu liniju prije builda za produkciju\r\n/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { Link, useParams } from \"react-router-dom\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport classnames from \"classnames\";\r\n\r\nimport {\r\n getCurrentLanguage,\r\n getCoursesMenu as getCoursesMenuSelector,\r\n getCourseContextualMenu as getCourseContextualMenuSelector,\r\n getStaticPagesMenu as getStaticPagesMenuSelector,\r\n getHomePageInMenu\r\n} from \"../../app/state/appSelectors\";\r\nimport {\r\n getCoursesMenu,\r\n getCourseContextualMenu,\r\n getStaticPagesMenu\r\n} from \"../../app/state/appActions\";\r\nimport useTranslations from \"../../hooks/useTranslations\";\r\nimport logoHome from \"../../assets/img/logos-home.png\";\r\nimport logo from \"../../assets/img/logos.png\";\r\nimport { PAGE_TYPES } from \"../../services/constants/pageTypes\";\r\n\r\nconst NavBar = ({ pageType }) => {\r\n const currentLanguage = useSelector(getCurrentLanguage);\r\n const homePage = useSelector(getHomePageInMenu);\r\n const staticPagesMenu = useSelector(getStaticPagesMenuSelector);\r\n const coursesMenu = useSelector(getCoursesMenuSelector);\r\n const courseContextualMenu = useSelector(getCourseContextualMenuSelector);\r\n const t = useTranslations();\r\n const { id, pageId } = useParams();\r\n\r\n const dispatch = useDispatch();\r\n\r\n const [logoForRender, setLogoForRender] = useState(\r\n pageType === PAGE_TYPES.static && !id ? logoHome : logo\r\n );\r\n\r\n useEffect(() => {\r\n if (\r\n !staticPagesMenu.length ||\r\n staticPagesMenu.some(page => page.languageId !== currentLanguage.id)\r\n ) {\r\n dispatch(\r\n getStaticPagesMenu({ data: { languageId: currentLanguage.id } })\r\n );\r\n }\r\n }, [dispatch, currentLanguage.id, staticPagesMenu]);\r\n\r\n useEffect(() => {\r\n if (\r\n !coursesMenu.length ||\r\n coursesMenu.some(course => course.languageId !== currentLanguage.id)\r\n ) {\r\n dispatch(getCoursesMenu({ data: { languageId: currentLanguage.id } }));\r\n }\r\n }, [dispatch, currentLanguage.id, coursesMenu]);\r\n\r\n useEffect(() => {\r\n if (pageType === PAGE_TYPES.static && !id) {\r\n setLogoForRender(logoHome);\r\n } else {\r\n setLogoForRender(logo);\r\n }\r\n }, [pageType, id]);\r\n\r\n useEffect(() => {\r\n if (\r\n (pageType === PAGE_TYPES.courseInformative ||\r\n pageType === PAGE_TYPES.courseStatic ||\r\n pageType === PAGE_TYPES.courseWork ||\r\n pageType === PAGE_TYPES.courseLecture ||\r\n pageType === PAGE_TYPES.courseTest) &&\r\n id\r\n ) {\r\n if (\r\n !courseContextualMenu.length ||\r\n // There will always be at least one item with courseLanguageId\r\n // set (course informative page), so we can check against that\r\n // to see if the course has changed or not.\r\n courseContextualMenu.some(x => x.courseLanguageId === +id) === false\r\n ) {\r\n dispatch(getCourseContextualMenu({ data: { courseLanguageId: id } }));\r\n }\r\n }\r\n }, [dispatch, id, homePage, pageType, courseContextualMenu]);\r\n\r\n useEffect(() => {\r\n function changeClassesOnBody() {\r\n if (pageType === PAGE_TYPES.courseInformative) {\r\n document.body.classList.remove(\"home\", \"inner\");\r\n document.body.classList.add(\"course\");\r\n } else if (\r\n pageType === PAGE_TYPES.courseStatic ||\r\n pageType === PAGE_TYPES.courseWork ||\r\n pageType === PAGE_TYPES.courseLecture ||\r\n pageType === PAGE_TYPES.courseTest ||\r\n pageType === PAGE_TYPES.courseFinalForm\r\n ) {\r\n document.body.classList.remove(\"home\");\r\n document.body.classList.add(\"course\", \"inner\");\r\n } else if (\r\n pageType === PAGE_TYPES.login ||\r\n pageType === PAGE_TYPES.register ||\r\n pageType === PAGE_TYPES.contact ||\r\n (pageType === PAGE_TYPES.static && id)\r\n ) {\r\n document.body.classList.remove(\"home\", \"course\");\r\n document.body.classList.add(\"inner\");\r\n } else {\r\n document.body.classList.remove(\"course\", \"inner\");\r\n document.body.classList.add(\"home\");\r\n }\r\n }\r\n\r\n changeClassesOnBody();\r\n }, [pageType, id]);\r\n\r\n const getMenuItemClasses = pageId =>\r\n classnames({\r\n \"menu-item\": true,\r\n \"current-menu-item\":\r\n /**\r\n * Apply this class if we are on home page\r\n * (id is not defined in url, but pageId === homePage.id)\r\n * or if we are on one of the general static pages,\r\n * or if we are on contact page.\r\n */\r\n (pageType === PAGE_TYPES.static &&\r\n ((!id && pageId === homePage.id) || (+id && pageId === +id))) ||\r\n (pageType === PAGE_TYPES.contact && !id && !pageId)\r\n });\r\n\r\n const getContextualMenuItemClasses = page => {\r\n return classnames({\r\n \"menu-item\": true,\r\n \"current-menu-item\":\r\n pageType === PAGE_TYPES.courseInformative &&\r\n page.isInformativePage === true &&\r\n page.courseLanguageId === +id\r\n ? true\r\n : pageType === PAGE_TYPES.courseWork &&\r\n page.isWorkingPage === true &&\r\n page.courseLanguageId === +id\r\n ? true\r\n : pageType === PAGE_TYPES.courseStatic &&\r\n page.isStaticPage === true &&\r\n page.staticPageLanguageId === +pageId\r\n ? true\r\n : false\r\n });\r\n };\r\n const getContextualMenuItemUrl = page => {\r\n return page.isInformativePage\r\n ? `/courses/${page.courseLanguageId}`\r\n : page.isWorkingPage\r\n ? `/courses/${page.courseLanguageId}/course`\r\n : page.isStaticPage\r\n ? `/courses/${id}/page/${page.staticPageLanguageId}`\r\n : \"#\";\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n MedOpen\r\n \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n {staticPagesMenu.length > 0 ? (\r\n \r\n ) : null}\r\n\r\n \r\n
    \r\n
    \r\n\r\n {(pageType === PAGE_TYPES.courseInformative ||\r\n pageType === PAGE_TYPES.courseStatic ||\r\n pageType === PAGE_TYPES.courseWork ||\r\n pageType === PAGE_TYPES.courseLecture ||\r\n pageType === PAGE_TYPES.courseTest) && (\r\n
    \r\n
    \r\n {courseContextualMenu.length > 0 && (\r\n
      \r\n {courseContextualMenu.map((course, index) => (\r\n \r\n \r\n {course.menuTitle}\r\n \r\n \r\n ))}\r\n
    \r\n )}\r\n
    \r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default NavBar;\r\n","import React from \"react\";\r\n\r\nimport TopBar from \"./TopBar\";\r\nimport NavBar from \"./NavBar\";\r\n\r\nconst HeaderNav = ({ pageType }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default HeaderNav;\r\n","import React, { Suspense, useEffect, cloneElement } from \"react\";\r\nimport { useHistory } from \"react-router-dom\";\r\n\r\nimport HeaderNav from \"../common/header-nav/HeaderNav\";\r\nimport Loader from \"../common/Loader\";\r\nimport useUrlFormValidityCheck from \"../hooks/useUrlFormValidityCheck\";\r\nimport useRedirectUrlCalculation from \"../hooks/useRedirectUrlCalculation\";\r\nimport { PAGE_TYPES } from \"../services/constants/pageTypes\";\r\n\r\nconst StaticPageLayout = ({ children, pageType }) => {\r\n const { isWholeUrlFormValid: isUrlValid } = useUrlFormValidityCheck({\r\n pageType\r\n });\r\n const history = useHistory();\r\n const redirectUrl = useRedirectUrlCalculation({\r\n pageType: PAGE_TYPES.static\r\n });\r\n\r\n useEffect(() => {\r\n if (!isUrlValid) {\r\n history.replace(redirectUrl);\r\n }\r\n }, [history, isUrlValid, redirectUrl]);\r\n\r\n return (\r\n <>\r\n \r\n\r\n }>\r\n {cloneElement(children, { isUrlValid })}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default StaticPageLayout;\r\n","import React, { Suspense } from \"react\";\r\nimport { useLocation } from \"react-router-dom\";\r\n\r\nimport HeaderNav from \"../common/header-nav/HeaderNav\";\r\nimport Header from \"../common/header/InnerPageHeader\";\r\nimport Loader from \"../common/Loader\";\r\nimport useTranslations from \"../hooks/useTranslations\";\r\n\r\nconst AuthLayout = ({ children, pageType }) => {\r\n const { pathname } = useLocation();\r\n const t = useTranslations();\r\n\r\n const headerTitle = pathname.endsWith(\"/login\") ? t.login : t.register;\r\n\r\n return (\r\n <>\r\n \r\n\r\n
    \r\n\r\n }>{children}\r\n \r\n );\r\n};\r\n\r\nexport default AuthLayout;\r\n","import React from \"react\";\r\n\r\nconst Header = ({ title = \"\", subtitle = \"\" }) => {\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    {title}

    \r\n

    {subtitle}

    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default Header;\r\n","import React, { Suspense, useEffect, cloneElement } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { useHistory } from \"react-router-dom\";\r\n\r\nimport HeaderNav from \"../common/header-nav/HeaderNav\";\r\nimport CoursePageHeader from \"../common/header/CoursePageHeader\";\r\nimport InnerPageHeader from \"../common/header/InnerPageHeader\";\r\nimport Loader from \"../common/Loader\";\r\nimport {\r\n getCourse,\r\n getLectureHeaderData,\r\n getTestHeaderData\r\n} from \"./state/courseSelectors\";\r\nimport { getStaticPageHeaderData } from \"../static-page/state/staticPageSelectors\";\r\nimport { PAGE_TYPES } from \"../services/constants/pageTypes\";\r\nimport useUrlFormValidityCheck from \"../hooks/useUrlFormValidityCheck\";\r\nimport useRedirectUrlCalculation from \"../hooks/useRedirectUrlCalculation\";\r\n\r\nconst CourseLayout = ({ children, pageType }) => {\r\n const course = useSelector(getCourse);\r\n const staticPageHeaderData = useSelector(getStaticPageHeaderData);\r\n const lectureHeaderData = useSelector(getLectureHeaderData);\r\n const testHeaderData = useSelector(getTestHeaderData);\r\n const history = useHistory();\r\n const { isWholeUrlFormValid: isUrlValid } = useUrlFormValidityCheck({\r\n pageType\r\n });\r\n const redirectUrl = useRedirectUrlCalculation({ pageType });\r\n\r\n useEffect(() => {\r\n if (!isUrlValid) {\r\n history.replace(redirectUrl);\r\n }\r\n }, [history, isUrlValid, redirectUrl]);\r\n\r\n const renderHeader = () => {\r\n if (pageType === PAGE_TYPES.courseInformative) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n if (pageType === PAGE_TYPES.courseWork) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n if (pageType === PAGE_TYPES.courseStatic) {\r\n return ;\r\n }\r\n\r\n if (pageType === PAGE_TYPES.courseLecture) {\r\n return ;\r\n }\r\n\r\n if (pageType === PAGE_TYPES.courseTest) {\r\n return ;\r\n }\r\n\r\n if (pageType === PAGE_TYPES.courseFinalForm) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n return (\r\n <>\r\n \r\n\r\n {renderHeader()}\r\n\r\n }>\r\n {cloneElement(children, { isUrlValid })}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CourseLayout;\r\n","import React, { Suspense } from \"react\";\r\n\r\nimport HeaderNav from \"../common/header-nav/HeaderNav\";\r\nimport Header from \"../common/header/InnerPageHeader\";\r\nimport Loader from \"../common/Loader\";\r\nimport useTranslations from \"../hooks/useTranslations\";\r\n\r\nconst ContactLayout = ({ children, pageType }) => {\r\n const t = useTranslations();\r\n return (\r\n <>\r\n \r\n\r\n
    \r\n\r\n }>{children}\r\n \r\n );\r\n};\r\n\r\nexport default ContactLayout;\r\n","import { lazy } from \"react\";\r\n\r\nimport StaticPage from \"../static-page/StaticPage\";\r\nimport StaticPageLayout from \"../static-page/StaticPageLayout\";\r\nimport AuthLayout from \"../auth/AuthLayout\";\r\nimport CourseLayout from \"../course/CourseLayout\";\r\nimport { PAGE_TYPES } from \"../services/constants/pageTypes\";\r\nimport ContactLayout from \"../contact/ContactLayout\";\r\n\r\nconst Login = lazy(() => import(\"../auth/Login\"));\r\nconst Register = lazy(() => import(\"../auth/Register\"));\r\nconst CourseInformativePage = lazy(() => import(\"../course/InformativePage\"));\r\nconst CourseStaticPage = lazy(() => import(\"../course/StaticPage\"));\r\nconst CourseWorkPage = lazy(() => import(\"../course/WorkPage\"));\r\nconst Lecture = lazy(() => import(\"../course/Lecture\"));\r\nconst Test = lazy(() => import(\"../course/Test\"));\r\nconst FinalFormPage = lazy(() => import(\"../course/FinalFormPage\"));\r\nconst ContactForm = lazy(() => import(\"../contact/ContactForm\"));\r\n\r\nconst routes = [\r\n {\r\n path: \"/login\",\r\n component: Login,\r\n layout: AuthLayout,\r\n private: false,\r\n pageType: PAGE_TYPES.login\r\n },\r\n {\r\n path: \"/register\",\r\n component: Register,\r\n layout: AuthLayout,\r\n private: false,\r\n pageType: PAGE_TYPES.register\r\n },\r\n {\r\n path: \"/contact\",\r\n component: ContactForm,\r\n layout: ContactLayout,\r\n private: false,\r\n pageType: PAGE_TYPES.contact\r\n },\r\n // TODO: mozda bolje napraviti ove nestane rute\r\n {\r\n path: \"/courses/:id/course\",\r\n component: CourseWorkPage,\r\n layout: CourseLayout,\r\n private: true,\r\n exact: true,\r\n pageType: PAGE_TYPES.courseWork\r\n },\r\n {\r\n path: \"/courses/:id/page/:pageId\",\r\n component: CourseStaticPage,\r\n layout: CourseLayout,\r\n private: true,\r\n pageType: PAGE_TYPES.courseStatic\r\n },\r\n {\r\n path: \"/courses/:id/lecture/:lectureId/test\",\r\n component: Test,\r\n layout: CourseLayout,\r\n private: true,\r\n pageType: PAGE_TYPES.courseTest\r\n },\r\n {\r\n path: \"/courses/:id/lecture/:lectureId\",\r\n component: Lecture,\r\n layout: CourseLayout,\r\n private: true,\r\n pageType: PAGE_TYPES.courseLecture\r\n },\r\n {\r\n path: \"/courses/:id\",\r\n component: CourseInformativePage,\r\n layout: CourseLayout,\r\n private: false,\r\n exact: true,\r\n pageType: PAGE_TYPES.courseInformative\r\n },\r\n {\r\n path: \"/courses/:id/final-form\",\r\n component: FinalFormPage,\r\n layout: CourseLayout,\r\n private: true,\r\n exact: true,\r\n pageType: PAGE_TYPES.courseFinalForm\r\n },\r\n {\r\n path: \"/:id?\",\r\n component: StaticPage,\r\n layout: StaticPageLayout,\r\n private: false,\r\n exact: true,\r\n pageType: PAGE_TYPES.static\r\n }\r\n];\r\n\r\nexport default routes;\r\n","import { useCallback, useState } from \"react\";\r\n\r\n// Returning a new object reference guarantees that a before-and-after\r\n// equivalence check will always be false, resulting in a re-render, even\r\n// when multiple calls to forceUpdate are batched.\r\n\r\nfunction useForceUpdate() {\r\n const [, dispatch] = useState(Object.create(null));\r\n\r\n // Turn dispatch(required_parameter) into dispatch().\r\n const memoizedDispatch = useCallback(() => {\r\n dispatch(Object.create(null));\r\n }, [dispatch]);\r\n\r\n return memoizedDispatch;\r\n}\r\n\r\nexport default useForceUpdate;\r\n","import axios from \"axios\";\r\n\r\nimport {\r\n refreshTokenThenSaveToStorage,\r\n logout\r\n} from \"../../auth/state/authActions\";\r\nimport {\r\n getAuthStateFromStorage,\r\n removeAuthStateFromStorage\r\n} from \"../utilities/storage\";\r\nimport { store } from \"../../store\";\r\n\r\nconst refreshTokenInterceptor = () => {\r\n axios.interceptors.response.use(\r\n response => {\r\n return response;\r\n },\r\n error => {\r\n const initialRequest = error.config;\r\n const {\r\n // We read status from response.data.status instead of response.status\r\n // in order to differentiate between errors when the user is not logged in\r\n // vs errors when the user is not authorized to see something.\r\n // response.status is in both cases equal to 401.\r\n response: {\r\n data: { status }\r\n },\r\n config: { url }\r\n } = error;\r\n // const status = error.response.status;\r\n // const url = error.config.url;\r\n\r\n if (status !== 401) {\r\n return Promise.reject(error);\r\n }\r\n if (status === 401 && url === \"/api/auth/token\") {\r\n removeAuthStateFromStorage();\r\n store.dispatch(logout());\r\n return Promise.reject(error);\r\n }\r\n if (status === 401 && url !== \"/api/auth/token\") {\r\n const authData = getAuthStateFromStorage();\r\n const tokens = {\r\n token: authData?.token,\r\n refreshToken: authData?.refreshToken\r\n };\r\n return store\r\n .dispatch(refreshTokenThenSaveToStorage({ data: tokens }))\r\n .then(res => {\r\n if (!res) {\r\n return Promise.reject(error);\r\n }\r\n return Promise.resolve(axios(initialRequest));\r\n });\r\n }\r\n }\r\n );\r\n};\r\n\r\nexport default refreshTokenInterceptor;\r\n","import React, { useEffect, Suspense, useMemo } from \"react\";\r\nimport {\r\n Switch,\r\n Route,\r\n Redirect,\r\n useLocation,\r\n useHistory\r\n} from \"react-router-dom\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport \"moment/locale/it\";\r\nimport \"moment/locale/fr\";\r\nimport queryString from \"query-string\";\r\n\r\nimport Footer from \"../common/Footer\";\r\nimport Loader from \"../common/Loader\";\r\nimport PrivateRoute from \"../navigation/PrivateRoute\";\r\nimport routes from \"../navigation/routes\";\r\nimport { getLanguages, changeLanguage } from \"./state/appActions\";\r\nimport {\r\n getCurrentLanguage,\r\n getLanguages as getLanguagesFromStore,\r\n getStaticPageTranslationLanguage,\r\n getCourseTranslationLanguage\r\n} from \"./state/appSelectors\";\r\nimport useTranslations from \"../hooks/useTranslations\";\r\nimport useForceUpdate from \"../hooks/useForceUpdate\";\r\nimport {\r\n logout,\r\n refreshTokenThenSaveToStorage,\r\n verifyRegistrationQueryParams\r\n} from \"../auth/state/authActions\";\r\nimport {\r\n hasCheckedUrlValidity,\r\n getIsRegistrationUrlValid,\r\n getCourseCodeLanguage\r\n} from \"../auth/state/authSelectors\";\r\nimport refreshTokenInterceptor from \"../services/api/refreshTokenInterceptor\";\r\nimport { getAuthStateFromStorage } from \"../services/utilities/storage\";\r\n\r\nconst App = () => {\r\n const forceUpdate = useForceUpdate();\r\n const t = useTranslations();\r\n const history = useHistory();\r\n const currentLanguage = useSelector(getCurrentLanguage);\r\n const dispatch = useDispatch();\r\n const isChecked = useSelector(hasCheckedUrlValidity);\r\n const isValid = useSelector(getIsRegistrationUrlValid);\r\n const courseLanguage = useSelector(getCourseCodeLanguage);\r\n const staticPageLanguage = useSelector(getStaticPageTranslationLanguage);\r\n const courseTranslationLanguage = useSelector(getCourseTranslationLanguage);\r\n const languages = useSelector(getLanguagesFromStore);\r\n const { pathname, search } = useLocation();\r\n\r\n /**\r\n * Registration URL form is valid if there are no query params\r\n * or if courseLanguageId and roleId\r\n * are both specified and valid numbers.\r\n */\r\n const isRegisterUrlFormValid = useMemo(() => {\r\n if (search) {\r\n const queryParams = queryString.parse(search);\r\n\r\n const isCourseLanguageIdValid =\r\n queryParams.courseLanguageId &&\r\n Number.isFinite(+queryParams.courseLanguageId);\r\n const isRoleIdValid =\r\n queryParams.roleId && Number.isFinite(+queryParams.roleId);\r\n\r\n return isCourseLanguageIdValid && isRoleIdValid;\r\n } else {\r\n return true;\r\n }\r\n }, [search]);\r\n\r\n useEffect(() => {\r\n let authTokenState = getAuthStateFromStorage();\r\n if (authTokenState && new Date(authTokenState.tokenExpiry) < new Date()) {\r\n dispatch(refreshTokenThenSaveToStorage({ data: authTokenState })).then(\r\n res => {\r\n if (!res) {\r\n dispatch(logout());\r\n history.push(\"/login\");\r\n }\r\n }\r\n );\r\n }\r\n }, [dispatch, pathname, history]);\r\n\r\n useEffect(() => {\r\n dispatch(getLanguages());\r\n }, [dispatch]);\r\n\r\n useEffect(() => {\r\n if (currentLanguage && currentLanguage.code !== t.getLanguage()) {\r\n t.setLanguage(currentLanguage.code);\r\n\r\n forceUpdate();\r\n }\r\n }, [forceUpdate, t, currentLanguage]);\r\n useEffect(() => {\r\n if (\r\n pathname === \"/register\" &&\r\n search &&\r\n isValid &&\r\n isRegisterUrlFormValid &&\r\n courseLanguage &&\r\n courseLanguage !== currentLanguage.code\r\n ) {\r\n dispatch(\r\n changeLanguage({\r\n lang: languages.find(x => x.code === courseLanguage)\r\n })\r\n );\r\n } else if (\r\n staticPageLanguage &&\r\n staticPageLanguage !== currentLanguage.code\r\n ) {\r\n dispatch(\r\n changeLanguage({\r\n lang: languages.find(x => x.code === staticPageLanguage)\r\n })\r\n );\r\n } else if (\r\n courseTranslationLanguage &&\r\n pathname.includes(\"course\") &&\r\n courseTranslationLanguage !== currentLanguage.code\r\n ) {\r\n dispatch(\r\n changeLanguage({\r\n lang: languages.find(x => x.code === courseTranslationLanguage)\r\n })\r\n );\r\n }\r\n }, [\r\n pathname,\r\n search,\r\n isValid,\r\n isRegisterUrlFormValid,\r\n courseLanguage,\r\n staticPageLanguage,\r\n courseTranslationLanguage,\r\n currentLanguage,\r\n languages,\r\n dispatch\r\n ]);\r\n\r\n useEffect(() => {\r\n if (pathname === \"/register\" && isRegisterUrlFormValid) {\r\n const queryParams = queryString.parse(search);\r\n\r\n dispatch(\r\n verifyRegistrationQueryParams({\r\n data: {\r\n courseLanguageId: +queryParams.courseLanguageId,\r\n roleId: +queryParams.roleId\r\n }\r\n })\r\n );\r\n }\r\n }, [dispatch, pathname, search, isRegisterUrlFormValid]);\r\n\r\n const getRoutes = () => {\r\n return routes.map((route, index) => {\r\n const { component: Component, layout: Layout, ...rest } = route;\r\n\r\n /**\r\n * If we are navigating to registration route,\r\n * we allow navigation only if regisration URL form\r\n * is valid, if we got the server's validity check response\r\n * and if query params' values are valid.\r\n * Redirect to homepage if URL form is not valid or if\r\n * query params' values are not valid.\r\n * Otherwise, don't render anything.\r\n */\r\n if (route.path === \"/register\" && pathname === route.path) {\r\n if (!isRegisterUrlFormValid || (isChecked && !isValid)) {\r\n return ;\r\n } else if (isRegisterUrlFormValid && isChecked && isValid) {\r\n return (\r\n \r\n {Layout ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n if (route.private) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {Layout ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n });\r\n };\r\n\r\n refreshTokenInterceptor();\r\n\r\n if (pathname === \"/register\" && isRegisterUrlFormValid && !isChecked) {\r\n return null;\r\n }\r\n\r\n return (\r\n <>\r\n }>\r\n \r\n {getRoutes()}\r\n \r\n \r\n \r\n\r\n