{"version":3,"sources":["store/auth/reducer.js","store/snackbar/actionTypes.js","store/loader/actionTypes.js","store/group/actions.js","components/AppBar/AppBarComponent.module.scss","store/group/reducer.js","store/workflow/reducer.js","containers/App/App.module.scss","containers/Loader/Loader.module.scss","routes.js","store/loader/actions.js","utils/history.js","containers/PrivateRoute/index.js","containers/PublicRoute/index.js","utils/loadable.js","containers/Dashboard/Loadable.js","containers/LoginPage/Loadable.js","containers/RegisterPage/Loadable.js","containers/NotFoundPage/Loadable.js","containers/ForgotPasswordPage/Loadable.js","containers/VerifyAccountPage/Loadable.js","containers/ResetPasswordPage/Loadable.js","containers/GroupListPage/Loadable.js","containers/SingleGroupPage/Loadable.js","containers/SingleWorkflowPage/Loadable.js","containers/RedirectToWorkflowPage/Loadable.js","containers/App/Routes.js","store/snackbar/reducer.js","store/snackbar/selectors.js","components/Snackbar/SnackbarComponent.js","store/loader/reducer.js","store/loader/selectors.js","containers/Loader/index.js","store/errorHandler/actionTypes.js","store/errorHandler/reducer.js","store/errorHandler/selectors.js","components/AppBar/AppBarComponent.js","containers/App/index.js","containers/ErrorBoundary/index.js","store/reducers.js","store/auth/sagas.js","services/GroupService.js","store/group/sagas.js","services/WorkflowService.js","store/workflow/sagas.js","store/sagas.js","serviceWorker.js","translations/index.js","services/ErrorHandler.js","store/errorHandler/actions.js","index.js","store/index.js","store/auth/actionTypes.js","consts/index.js","store/auth/actions.js","store/workflow/actionTypes.js","utils/localStorage.js","store/group/actionTypes.js","store/snackbar/actions.js","services/HelperService.js","services/AuthService.js","config.js","services/HttpService.js","helpers/index.js","store/auth/selectors.js","store/workflow/actions.js"],"names":["initialState","token","getItem","user","appReducer","state","action","produce","draft","type","SET_TOKEN","SET_USER","payload","SET_SNACKBAR","SET_LOADER","getGroupsSaga","GET_GROUPS_SAGA","setGroups","SET_GROUPS","getGroupSaga","groupId","GET_GROUP_SAGA","setGroup","SET_GROUP","module","exports","groups","group","groupReducer","testResultsData","workflowResultData","workflow","workflowReducer","SET_TEST_RESULTS_DATA","SET_WORKFLOW_RESULTS_DATA","SET_WORKFLOW","DASHBOARD","LOGIN","VERIFY_ACCOUNT","REGISTER","FORGOT_PASSWORD","RESET_PASSWORD","GROUP_LIST","SINGLE_GROUP","SINGLE_WORKFLOW","REDIRECT_TO_WORKFLOW","setLoader","history","createBrowserHistory","basename","process","mapStateToProps","createStructuredSelector","isAuthenticated","isAuthenticatedSelector","withConnect","connect","compose","Component","component","rest","render","props","to","match","path","loadable","importFunc","fallback","LazyComponent","lazy","Routes","exact","LoginPage","RegisterPage","VerifyAccountPage","RedirectToWorkflowPage","ForgotPasswordPage","ResetPasswordPage","Dashboard","GroupListPage","SingleGroupPage","SingleWorkflowPage","NotFoundPage","snackbar","snackbarReducer","snackbarStateSelector","SnackbarComponent","dispatch","useDispatch","Alert","forwardRef","ref","elevation","variant","useSelector","createSelector","handleClose","setSnackbar","open","Snackbar","autoHideDuration","onClose","anchorOrigin","vertical","horizontal","severity","message","loader","loaderReducer","loaderStateSelector","Loader","isLoading","className","styles","container","CircularProgress","SET_ERROR_HANDLER_INITIALIZED","errorHandlerInitialized","errorHandlerReducer","errorHandlerStateSelector","errorHandler","AppBarComponent","onLogout","useHistory","useState","anchorEl","setAnchorEl","Boolean","logo","onClick","push","Button","aria-expanded","undefined","disableElevation","event","currentTarget","endIcon","sx","fontFamily","fontSize","background","color","username","Menu","disableScrollLock","MenuItem","App","tokenSelector","userSelector","isAppBarHidden","handleLogout","useCallback","logoutSaga","useEffect","getUserSaga","ErrorBoundry","eventId","showReportDialog","Sentry","error","errorInfo","scope","setExtras","setState","this","t","fallbackUI","children","hasError","href","withTranslation","createReducer","injectedReducers","rootReducer","combineReducers","router","connectRouter","auth","authReducer","authSaga","i","loginSaga","put","call","authService","login","res","setToken","authorization","console","log","removeItem","setUser","destroySession","getUser","resetPasswordSaga","resetPassword","getErrorMessage","redirectAfterPasswordResetSaga","setAuthToken","access_token","approved","registerSaga","registerUser","takeLatest","LOGIN_SAGA","LOGOUT_SAGA","RESET_PASSWORD_SAGA","GET_USER_SAGA","REDIRECT_AFTER_PASSWORD_RESET_SAGA","REGISTER_SAGA","ROUTES","GET_GROUPS","GET_GROUP","groupService","httpService","getGroups","request","url","method","HTTP_METHODS","GET","getGroup","replace","groupSaga","GET_WORKFLOW","SUBMIT_ATTEMPT","workflowService","submitAttempt","data","POST","getWorkflow","workflowId","workflowSaga","submitAttemptSaga","test_results","lastStep","lastTestResultsData","filter","test_result","test","id","testId","setTestResultsData","setWorkflowResultData","redirectToWorkflowSaga","classesId","journeyId","setItem","getWorkflowSaga","setWorkflow","SUBMIT_ATTEMPT_SAGA","REDIRECT_TO_WORKFLOW_SAGA","GET_WORKFLOW_SAGA","rootSaga","fork","AuthSagas","GroupSagas","WorkflowSagas","window","location","hostname","resources","en","translation","de","i18n","use","initReactI18next","init","lng","localStorage","fallbackLng","debug","interpolation","escapeValue","ErrorHandler","handleError","addResponseInterceptors","response","err","Error","ArrayBuffer","JSON","parse","TextDecoder","decode","status","store","composeEnhancers","reduxSagaMonitorOptions","sagaMiddleware","createSagaMiddleware","middlewares","routerMiddleware","enhancers","applyMiddleware","createStore","run","runSaga","injectedSagas","configureStore","MOUNT_NODE","document","getElementById","ReactDOM","navigator","serviceWorker","ready","then","registration","unregister","AUTH","HTTP_STATUS_CODES","UNAUTHORIZED","FORBIDDEN","NOT_FOUND","SERVER_ERROR","VALIDATION_FAILED","PUT","DELETE","colors","white","black","grayLight","primaryColor","backgroundColor","warning","WORKFLOW_ATTEMPT_STATUS","STARTED","COMPLETED","LESSON_TYPES","PDF","VIDEO","AUDIO","HTML","WORKFLOW","keyName","value","stringify","helperService","camel2title","camelCase","toUpperCase","trim","titleCase","str","strAr","toLowerCase","split","length","charAt","slice","join","checkIsAuthenticated","array","some","item","role","hasTokenExpired","Date","now","jwtDecode","exp","s","m","getAccessToken","addRequestInterceptor","checkTokenExpiration","handleSuccessResponse","handleErrorResponse","attachHeaders","Authorization","refreshToken","prevToken","headers","newToken","accessToken","verifyAccount","logout","forgotPassword","removeHeaders","decodeJwt","Promise","reject","e","baseUrl","cdn","REACT_APP_API_CDN","HttpClient","requestConfig","client","callback","interceptors","removeRequestInterceptor","interceptorId","eject","successCallback","errorCallback","removeResponseInterceptors","Object","assign","defaults","headerKeys","forEach","key","axios","create","baseURL","config","httpClient","setUnauthorizedCallback","unauthorizedCallback","getQueryParam","search","param","URLSearchParams","get","openLink","newWindow","opener","fractionToPercentage","numerator","denominator","Math","round","authStateSelector"],"mappings":"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","file":"static/js/main.ebe044d1.chunk.js","sourcesContent":["import produce from 'immer';\nimport { getItem } from 'utils/localStorage';\nimport { SET_TOKEN, SET_USER } from './actionTypes';\n\nexport const initialState = {\n token: getItem('token') || null,\n user: null,\n};\n\n/* eslint-disable default-case */\nconst appReducer = (state = initialState, action) =>\n produce(state, (draft) => {\n switch (action.type) {\n case SET_TOKEN:\n draft.token = action.token;\n break;\n case SET_USER:\n draft.user = action.payload;\n break;\n }\n });\n\nexport default appReducer;\n","export const SNACKBAR = '[Snackbar]';\n\nexport const SET_SNACKBAR = `${SNACKBAR} SET_SNACKBAR`;\n","export const LOADER = '[Loader]';\n\nexport const SET_LOADER = `${LOADER} SET_LOADER`;\n","import {\n GET_GROUP_SAGA,\n GET_GROUPS_SAGA,\n SET_GROUP,\n SET_GROUPS,\n} from './actionTypes';\n\nexport function getGroupsSaga() {\n return {\n type: GET_GROUPS_SAGA,\n };\n}\n\nexport function setGroups(payload) {\n return {\n type: SET_GROUPS,\n payload,\n };\n}\n\nexport function getGroupSaga(groupId) {\n return {\n type: GET_GROUP_SAGA,\n groupId,\n };\n}\n\nexport function setGroup(payload) {\n return {\n type: SET_GROUP,\n payload,\n };\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"AppBarComponent_container__23Fps\",\"logo\":\"AppBarComponent_logo__sFmLF\"};","import produce from 'immer';\n\nimport { SET_GROUP, SET_GROUPS } from './actionTypes';\n\nexport const initialState = {\n groups: null,\n group: null,\n};\n\n/* eslint-disable default-case */\n\nconst groupReducer = (state = initialState, { type, payload }) =>\n produce(state, (draft) => {\n switch (type) {\n case SET_GROUPS:\n draft.groups = payload;\n break;\n case SET_GROUP:\n draft.group = payload;\n break;\n }\n });\n\nexport default groupReducer;\n","import produce from 'immer';\n\nimport {\n SET_TEST_RESULTS_DATA,\n SET_WORKFLOW,\n SET_WORKFLOW_RESULTS_DATA,\n} from './actionTypes';\n\nexport const initialState = {\n testResultsData: null,\n workflowResultData: null,\n workflow: null,\n};\n\n/* eslint-disable default-case */\n\nconst workflowReducer = (state = initialState, { type, payload }) =>\n produce(state, (draft) => {\n switch (type) {\n case SET_TEST_RESULTS_DATA:\n draft.testResultsData = payload;\n break;\n\n case SET_WORKFLOW_RESULTS_DATA:\n draft.workflowResultData = payload;\n break;\n\n case SET_WORKFLOW:\n draft.workflow = payload;\n break;\n }\n });\n\nexport default workflowReducer;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"App_container__1SIje\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"Loader_container__1XJQX\"};","export const DASHBOARD = '/home';\nexport const LOGIN = '/login';\nexport const VERIFY_ACCOUNT = '/user-verification';\nexport const REGISTER = '/register/:invite_code';\nexport const FORGOT_PASSWORD = '/forgot-password';\nexport const RESET_PASSWORD = '/reset-password';\nexport const GROUP_LIST = '/classes';\nexport const SINGLE_GROUP = '/classes/:classesId';\nexport const SINGLE_WORKFLOW = '/classes/:classesId/workflow/:workflowId';\nexport const REDIRECT_TO_WORKFLOW = '/redirect-to-journey';\n","import { SET_LOADER } from './actionTypes';\n\nexport function setLoader(payload) {\n return {\n type: SET_LOADER,\n payload,\n };\n}\n","import { createBrowserHistory } from 'history';\n\nconst history = createBrowserHistory({ basename: process.env.PUBLIC_URL });\n\nexport default history;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Route, Redirect } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport { compose } from 'redux';\nimport { createStructuredSelector } from 'reselect';\nimport {isAuthenticatedSelector} from 'store/auth/selectors';\n\nexport function PrivateRoute({component: Component, isAuthenticated, ...rest}) {\n return (\n \n isAuthenticated ? : \n }\n />\n );\n}\n\nPrivateRoute.propTypes = {\n isAuthenticated: PropTypes.bool,\n};\n\nconst mapStateToProps = createStructuredSelector({\n isAuthenticated: isAuthenticatedSelector(),\n});\n\nconst withConnect = connect(mapStateToProps);\n\nexport default compose(withConnect)(PrivateRoute);\n\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Route, Redirect } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport { compose } from 'redux';\nimport { createStructuredSelector } from 'reselect';\nimport { isAuthenticatedSelector } from 'store/auth/selectors';\nimport { REDIRECT_TO_WORKFLOW } from '../../routes';\n\nexport function PublicRoute({\n component: Component,\n isAuthenticated,\n ...rest\n}) {\n return (\n {\n return isAuthenticated && props.match.path !== REDIRECT_TO_WORKFLOW ? (\n \n ) : (\n \n );\n }}\n />\n );\n}\n\nPublicRoute.propTypes = {\n isAuthenticated: PropTypes.bool,\n};\n\nconst mapStateToProps = createStructuredSelector({\n isAuthenticated: isAuthenticatedSelector(),\n});\n\nconst withConnect = connect(mapStateToProps);\n\nexport default compose(withConnect)(PublicRoute);\n","import React, { lazy, Suspense } from \"react\";\n\nconst loadable = (importFunc, { fallback = null } = { fallback: null }) => {\n const LazyComponent = lazy(importFunc);\n\n return props => (\n \n \n \n );\n};\n\nexport default loadable;\n","import loadable from \"utils/loadable\";\n\nexport default loadable(() => import(\"./index\"));\n","import loadable from 'utils/loadable';\n\nexport default loadable(() => import('./index'));\n","import loadable from 'utils/loadable';\n\nexport default loadable(() => import('./index'));\n","import loadable from \"utils/loadable\";\n\nexport default loadable(() => import(\"./index\"));\n","import loadable from 'utils/loadable';\n\nexport default loadable(() => import('./index'));\n","import loadable from 'utils/loadable';\n\nexport default loadable(() => import('./index'));\n","import loadable from 'utils/loadable';\n\nexport default loadable(() => import('./index'));\n","import loadable from 'utils/loadable';\n\nexport default loadable(() => import('./index'));\n","import loadable from 'utils/loadable';\n\nexport default loadable(() => import('./index'));\n","import loadable from 'utils/loadable';\n\nexport default loadable(() => import('./index'));\n","import loadable from 'utils/loadable';\n\nexport default loadable(() => import('./index'));\n","import React from 'react';\nimport { Switch, Route, Redirect } from 'react-router-dom';\nimport {\n DASHBOARD,\n LOGIN,\n REGISTER,\n FORGOT_PASSWORD,\n VERIFY_ACCOUNT,\n RESET_PASSWORD,\n GROUP_LIST,\n SINGLE_GROUP,\n SINGLE_WORKFLOW,\n REDIRECT_TO_WORKFLOW,\n} from 'routes';\nimport PrivateRoute from 'containers/PrivateRoute';\nimport PublicRoute from 'containers/PublicRoute';\nimport Dashboard from 'containers/Dashboard/Loadable';\nimport LoginPage from 'containers/LoginPage/Loadable';\nimport RegisterPage from 'containers/RegisterPage/Loadable';\nimport NotFoundPage from 'containers/NotFoundPage/Loadable';\nimport ForgotPasswordPage from 'containers/ForgotPasswordPage/Loadable';\nimport VerifyAccountPage from 'containers/VerifyAccountPage/Loadable';\nimport ResetPasswordPage from 'containers/ResetPasswordPage/Loadable';\nimport GroupListPage from 'containers/GroupListPage/Loadable';\nimport SingleGroupPage from 'containers/SingleGroupPage/Loadable';\nimport SingleWorkflowPage from 'containers/SingleWorkflowPage/Loadable';\nimport RedirectToWorkflowPage from 'containers/RedirectToWorkflowPage/Loadable';\n\nexport default function Routes() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n","import produce from 'immer';\n\nimport { SET_SNACKBAR } from './actionTypes';\n\nexport const initialState = {\n snackbar: {},\n};\n\n/* eslint-disable default-case */\n\nconst snackbarReducer = (state = initialState, { type, payload }) =>\n produce(state, (draft) => {\n switch (type) {\n case SET_SNACKBAR:\n draft.snackbar = payload;\n break;\n }\n });\n\nexport default snackbarReducer;\n","import { createSelector } from 'reselect';\nimport { initialState } from './reducer';\n\nconst snackbarStateSelector = (state) => state.snackbar || initialState;\n\nconst snackbarSelector = () =>\n createSelector(snackbarStateSelector, (state) => state.snackbar);\n\nexport { snackbarSelector };\n","import React, { forwardRef } from 'react';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport MuiAlert from '@mui/material/Alert';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { snackbarSelector } from '../../store/snackbar/selectors';\nimport { setSnackbar } from '../../store/snackbar/actions';\n\nconst SnackbarComponent = () => {\n const dispatch = useDispatch();\n\n const Alert = forwardRef(function Alert(props, ref) {\n return (\n \n );\n });\n\n const snackbar = useSelector(snackbarSelector());\n\n const handleClose = () => {\n dispatch(setSnackbar({ open: false }));\n };\n\n return (\n \n \n {snackbar.message}\n \n \n );\n};\n\nexport default SnackbarComponent;\n","import produce from 'immer';\n\nimport { SET_LOADER } from './actionTypes';\n\nexport const initialState = {\n loader: false,\n};\n\n/* eslint-disable default-case */\n\nconst loaderReducer = (state = initialState, { type, payload }) =>\n produce(state, (draft) => {\n switch (type) {\n case SET_LOADER:\n draft.loader = payload;\n break;\n }\n });\n\nexport default loaderReducer;\n","import { createSelector } from 'reselect';\nimport { initialState } from './reducer';\n\nconst loaderStateSelector = (state) => state.loader || initialState;\n\nconst loaderSelector = () =>\n createSelector(loaderStateSelector, (state) => state.loader);\n\nexport { loaderSelector };\n","import React from 'react';\nimport { CircularProgress } from '@material-ui/core';\nimport { useSelector } from 'react-redux';\nimport { loaderSelector } from '../../store/loader/selectors';\nimport styles from './Loader.module.scss';\n\nconst Loader = () => {\n const isLoading = useSelector(loaderSelector());\n\n return (\n
\n {isLoading && (\n
\n \n
\n )}\n
\n );\n};\n\nexport default Loader;\n","export const ERROR_HANDLER = '[ErrorHandler]';\n\nexport const SET_ERROR_HANDLER_INITIALIZED = `${ERROR_HANDLER} SET_ERROR_HANDLER_INITIALIZED`;\n","import produce from 'immer';\n\nimport { SET_ERROR_HANDLER_INITIALIZED } from './actionTypes';\n\nexport const initialState = {\n errorHandlerInitialized: false,\n};\n\n/* eslint-disable default-case */\n\nconst errorHandlerReducer = (state = initialState, { type, payload }) =>\n produce(state, (draft) => {\n switch (type) {\n case SET_ERROR_HANDLER_INITIALIZED:\n draft.errorHandlerInitialized = payload;\n break;\n }\n });\n\nexport default errorHandlerReducer;\n","import { createSelector } from 'reselect';\nimport { initialState } from './reducer';\n\nconst errorHandlerStateSelector = (state) => state.errorHandler || initialState;\n\nconst errorHandlerInitializedSelector = () =>\n createSelector(\n errorHandlerStateSelector,\n (state) => state.errorHandlerInitialized\n );\n\nexport { errorHandlerInitializedSelector };\n","import React, { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport styles from './AppBarComponent.module.scss';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport { useHistory } from 'react-router-dom';\n\nconst AppBarComponent = ({ user, onLogout }) => {\n const history = useHistory();\n\n const [anchorEl, setAnchorEl] = useState(null);\n\n const open = Boolean(anchorEl);\n\n const handleClick = (event) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n return (\n
\n \n
\n }\n sx={{\n fontFamily: 'Bebas Neue',\n fontSize: 20,\n background: '#033e7e',\n color: 'white',\n ':hover': {\n background: '#044d9e',\n color: 'white',\n },\n }}\n >\n {user?.username}\n \n \n Logout\n \n
\n
\n );\n};\n\nexport default AppBarComponent;\n","import React, { useEffect, useCallback } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Helmet, HelmetProvider } from 'react-helmet-async';\nimport Routes from './Routes';\nimport { getUserSaga, logoutSaga } from 'store/auth/actions';\nimport { tokenSelector, userSelector } from 'store/auth/selectors';\nimport styles from '../App/App.module.scss';\nimport SnackbarComponent from '../../components/Snackbar/SnackbarComponent';\nimport Loader from '../Loader';\nimport { errorHandlerInitializedSelector } from '../../store/errorHandler/selectors';\nimport AppBarComponent from 'components/AppBar/AppBarComponent';\nimport { getItem } from '../../utils/localStorage';\n\nfunction App() {\n const dispatch = useDispatch();\n\n const token = useSelector(tokenSelector());\n const errorHandlerInitialized = useSelector(\n errorHandlerInitializedSelector()\n );\n const user = useSelector(userSelector());\n\n const isAppBarHidden = getItem('isAppBarHidden');\n\n const handleLogout = useCallback(() => dispatch(logoutSaga()), [dispatch]);\n\n useEffect(() => {\n if (errorHandlerInitialized) {\n if (token) {\n dispatch(getUserSaga());\n }\n }\n }, [token, dispatch, errorHandlerInitialized]);\n\n return (\n \n \n Finance411 User\n \n {user && !isAppBarHidden && (\n \n )}\n
\n \n
\n \n \n
\n );\n}\n\nexport default App;\n","import React, { Component } from 'react';\nimport { withTranslation } from 'react-i18next';\nimport PropTypes from 'prop-types';\nimport * as Sentry from '@sentry/browser';\n\nexport class ErrorBoundry extends Component {\n state = {\n eventId: null,\n };\n\n static getDerivedStateFromError(error) {\n return { hasError: true };\n }\n\n componentDidCatch(error, errorInfo) {\n Sentry.withScope((scope) => {\n scope.setExtras(errorInfo);\n const eventId = Sentry.captureException(error);\n this.setState({ eventId });\n });\n }\n\n showReportDialog = () => {\n Sentry.showReportDialog({ eventId: this.state.eventId });\n };\n\n render() {\n const { t, fallbackUI, children } = this.props;\n\n if (this.state.hasError) {\n // render fallback UI\n\n if (fallbackUI) {\n return fallbackUI(this.showReportDialog);\n }\n\n return (\n
\n

{t('error_page.header')}

\n \n {t('error_page.link.back')}\n
\n );\n }\n\n // when there's not an error, render children untouched\n return children;\n }\n}\n\nErrorBoundry.propTypes = {\n fallbackUI: PropTypes.func,\n};\n\nexport default withTranslation()(ErrorBoundry);\n","import { combineReducers } from 'redux';\nimport { connectRouter } from 'connected-react-router';\n\nimport history from 'utils/history';\nimport authReducer from './auth/reducer';\nimport snackbarReducer from './snackbar/reducer';\nimport loaderReducer from './loader/reducer';\nimport errorHandlerReducer from './errorHandler/reducer';\nimport groupReducer from './group/reducer';\nimport workflowReducer from './workflow/reducer';\n\nexport default function createReducer(injectedReducers = {}) {\n const rootReducer = combineReducers({\n router: connectRouter(history),\n auth: authReducer,\n snackbar: snackbarReducer,\n loader: loaderReducer,\n errorHandler: errorHandlerReducer,\n group: groupReducer,\n workflow: workflowReducer,\n ...injectedReducers,\n });\n\n return rootReducer;\n}\n","import { takeLatest, call, put } from 'redux-saga/effects';\nimport { push } from 'connected-react-router';\nimport { setToken, setUser } from './actions';\nimport {\n GET_USER_SAGA,\n LOGIN_SAGA,\n LOGOUT_SAGA,\n REDIRECT_AFTER_PASSWORD_RESET_SAGA,\n REGISTER_SAGA,\n RESET_PASSWORD_SAGA,\n} from './actionTypes';\nimport { DASHBOARD, GROUP_LIST, LOGIN } from 'routes';\nimport authService from 'services/AuthService';\nimport { removeItem } from '../../utils/localStorage';\nimport { setSnackbar } from '../snackbar/actions';\nimport { setLoader } from '../loader/actions';\nimport { getErrorMessage } from '../../helpers';\n\nexport function* loginSaga({ payload }) {\n try {\n yield put(setLoader(true));\n const res = yield call(authService.login, payload);\n yield put(setToken(res.authorization.token));\n yield put(push(DASHBOARD));\n } catch (error) {\n console.log({ error });\n } finally {\n yield put(setLoader(false));\n }\n}\n\nexport function* logoutSaga() {\n try {\n yield call(removeItem, 'token');\n yield put(setToken(null));\n yield put(setUser(null));\n yield call(authService.destroySession);\n yield put(push(LOGIN));\n } catch (error) {\n console.log({ error });\n }\n}\n\nexport function* getUserSaga() {\n try {\n yield put(setLoader(true));\n const res = yield call(authService.getUser);\n yield put(setUser(res));\n } catch (error) {\n console.log({ error });\n } finally {\n yield put(setLoader(false));\n }\n}\n\nexport function* resetPasswordSaga({ payload }) {\n try {\n yield put(setLoader(true));\n yield call(authService.resetPassword, payload);\n yield put(push(LOGIN));\n } catch (error) {\n console.log({ error });\n yield put(\n setSnackbar({\n open: true,\n severity: 'error',\n message: getErrorMessage(error),\n })\n );\n } finally {\n yield put(setLoader(false));\n }\n}\n\nexport function* redirectAfterPasswordResetSaga({ payload }) {\n try {\n yield put(setLoader(true));\n yield call(authService.setAuthToken, payload.access_token);\n yield put(setToken(payload.access_token));\n if (payload.approved) {\n yield put(push(GROUP_LIST));\n } else {\n yield put(push(DASHBOARD));\n }\n } catch (error) {\n console.log({ error });\n } finally {\n yield put(setLoader(false));\n }\n}\n\nexport function* registerSaga({ payload }) {\n try {\n yield put(setLoader(true));\n const user = yield call(authService.registerUser, payload);\n yield put(setToken(user.access_token));\n yield put(push(DASHBOARD));\n } catch (error) {\n console.log({ error });\n yield put(\n setSnackbar({\n open: true,\n severity: 'error',\n message: getErrorMessage(error),\n })\n );\n } finally {\n yield put(setLoader(false));\n }\n}\n\nexport default function* authSaga() {\n yield takeLatest(LOGIN_SAGA, loginSaga);\n yield takeLatest(LOGOUT_SAGA, logoutSaga);\n yield takeLatest(RESET_PASSWORD_SAGA, resetPasswordSaga);\n yield takeLatest(GET_USER_SAGA, getUserSaga);\n yield takeLatest(\n REDIRECT_AFTER_PASSWORD_RESET_SAGA,\n redirectAfterPasswordResetSaga\n );\n yield takeLatest(REGISTER_SAGA, registerSaga);\n}\n","import httpService from './HttpService';\nimport { HTTP_METHODS } from 'consts';\n\nconst ROUTES = {\n GET_GROUPS: '/groups',\n GET_GROUP: '/groups/:groupId',\n};\n\nclass GroupService {\n constructor(httpService) {\n this.httpService = httpService;\n }\n\n getGroups = () => {\n return this.httpService.request({\n url: ROUTES.GET_GROUPS,\n method: HTTP_METHODS.GET,\n });\n };\n\n getGroup = (groupId) => {\n return this.httpService.request({\n url: ROUTES.GET_GROUP.replace(':groupId', groupId),\n method: HTTP_METHODS.GET,\n });\n };\n}\n\nconst groupService = new GroupService(httpService);\n\nexport default groupService;\n","import { takeLatest, call, put } from 'redux-saga/effects';\nimport { GET_GROUP_SAGA, GET_GROUPS_SAGA } from './actionTypes';\nimport { setLoader } from '../loader/actions';\nimport groupService from '../../services/GroupService';\nimport { setGroup, setGroups } from './actions';\n\nexport function* getGroupsSaga() {\n try {\n yield put(setLoader(true));\n const groups = yield call(groupService.getGroups);\n yield put(setGroups(groups));\n } catch (error) {\n console.log({ error });\n } finally {\n yield put(setLoader(false));\n }\n}\n\nexport function* getGroupSaga({ groupId }) {\n try {\n yield put(setLoader(true));\n const group = yield call(groupService.getGroup, groupId);\n yield put(setGroup(group));\n } catch (error) {\n console.log({ error });\n } finally {\n yield put(setLoader(false));\n }\n}\n\nexport default function* groupSaga() {\n yield takeLatest(GET_GROUPS_SAGA, getGroupsSaga);\n yield takeLatest(GET_GROUP_SAGA, getGroupSaga);\n}\n","import httpService from './HttpService';\nimport { HTTP_METHODS } from 'consts';\n\nconst ROUTES = {\n GET_WORKFLOW: '/workflows/group/:groupId/workflow/:workflowId',\n SUBMIT_ATTEMPT: '/workflows',\n};\n\nclass WorkflowService {\n constructor(httpService) {\n this.httpService = httpService;\n }\n\n submitAttempt = (data) => {\n return this.httpService.request({\n url: ROUTES.SUBMIT_ATTEMPT,\n method: HTTP_METHODS.POST,\n data,\n });\n };\n\n getWorkflow = (groupId, workflowId) => {\n return this.httpService.request({\n url: ROUTES.GET_WORKFLOW.replace(':groupId', groupId).replace(\n ':workflowId',\n workflowId\n ),\n method: HTTP_METHODS.GET,\n });\n };\n}\n\nconst workflowService = new WorkflowService(httpService);\n\nexport default workflowService;\n","import { takeLatest, call, put } from 'redux-saga/effects';\nimport {\n GET_WORKFLOW_SAGA,\n REDIRECT_TO_WORKFLOW_SAGA,\n SUBMIT_ATTEMPT_SAGA,\n} from './actionTypes';\nimport { setLoader } from '../loader/actions';\nimport workflowService from '../../services/WorkflowService';\nimport authService from '../../services/AuthService';\nimport { setToken, setUser } from '../auth/actions';\nimport { push } from 'connected-react-router';\nimport { SINGLE_WORKFLOW } from '../../routes';\nimport { setItem } from '../../utils/localStorage';\nimport {\n setTestResultsData,\n setWorkflow,\n setWorkflowResultData,\n} from './actions';\n\nexport function* submitAttemptSaga({ payload }) {\n try {\n yield put(setLoader(true));\n const testResultsData = yield call(workflowService.submitAttempt, payload);\n if (testResultsData.test_results) {\n if (payload.lastStep) {\n const lastTestResultsData = {\n test_results: testResultsData.test_results.filter(\n (test_result) => test_result.test.id === payload.testId\n ),\n };\n yield put(setTestResultsData(lastTestResultsData));\n yield put(setWorkflowResultData(testResultsData));\n } else {\n yield put(setTestResultsData(testResultsData));\n }\n } else {\n yield put(setTestResultsData(null));\n }\n } catch (error) {\n console.log({ error });\n } finally {\n yield put(setLoader(false));\n }\n}\n\nexport function* redirectToWorkflowSaga({ classesId, journeyId, token }) {\n try {\n yield put(setLoader(true));\n yield call(authService.setAuthToken, token);\n const user = yield call(authService.getUser);\n yield put(setUser(user));\n yield put(setToken(token));\n setItem('isAppBarHidden', true);\n yield put(\n push(\n SINGLE_WORKFLOW.replace(':classesId', classesId).replace(\n ':workflowId',\n journeyId\n )\n )\n );\n } catch (error) {\n console.log({ error });\n } finally {\n yield put(setLoader(false));\n }\n}\n\nexport function* getWorkflowSaga({ groupId, workflowId }) {\n try {\n yield put(setLoader(true));\n const workflow = yield call(\n workflowService.getWorkflow,\n groupId,\n workflowId\n );\n yield put(setWorkflow(workflow));\n } catch (error) {\n console.log({ error });\n } finally {\n yield put(setLoader(false));\n }\n}\n\nexport default function* workflowSaga() {\n yield takeLatest(SUBMIT_ATTEMPT_SAGA, submitAttemptSaga);\n yield takeLatest(REDIRECT_TO_WORKFLOW_SAGA, redirectToWorkflowSaga);\n yield takeLatest(GET_WORKFLOW_SAGA, getWorkflowSaga);\n}\n","import { fork } from 'redux-saga/effects';\n\nimport AuthSagas from './auth/sagas';\nimport GroupSagas from './group/sagas';\nimport WorkflowSagas from './workflow/sagas';\n\nexport default function* rootSaga() {\n yield fork(AuthSagas);\n yield fork(GroupSagas);\n yield fork(WorkflowSagas);\n}\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\n\nimport translationEn from './locales/en.json';\nimport translationDe from './locales/de.json';\n\nconst LOCALE_ENG = 'en';\nconst LOCALE_DE = 'de';\n\nexport const LOCALES = [LOCALE_ENG, LOCALE_DE];\n\nexport const DEFAULT_LOCALE = LOCALE_ENG;\n\nconst resources = {\n en: {\n translation: translationEn,\n },\n de: {\n translation: translationDe,\n },\n};\n\ni18n.use(initReactI18next).init({\n lng: localStorage.getItem('language') || DEFAULT_LOCALE,\n fallbackLng: DEFAULT_LOCALE,\n debug:\n process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test',\n interpolation: {\n escapeValue: false,\n },\n resources,\n});\n\nexport const $t = (key, params = {}) => {\n return i18n.t(key, params);\n};\n\nexport default i18n;\n","import { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setSnackbar } from '../store/snackbar/actions';\nimport httpService from './HttpService';\nimport { logoutSaga } from '../store/auth/actions';\nimport { getErrorMessage } from '../helpers';\nimport { setErrorHandlerInitialized } from '../store/errorHandler/actions';\n\nfunction ErrorHandler(props) {\n const dispatch = useDispatch();\n\n const handleError = async () => {\n httpService.addResponseInterceptors(\n (response) => response.data,\n (err) => {\n err = err instanceof Error ? { err }?.err?.response : err;\n if (err) {\n if (err?.data instanceof ArrayBuffer) {\n err.message = JSON.parse(\n new TextDecoder().decode(err?.data)\n ).message;\n dispatch(\n setSnackbar({\n open: true,\n severity: 'error',\n message: getErrorMessage(err),\n })\n );\n } else {\n if (err.status === 401) {\n dispatch(\n setSnackbar({\n open: true,\n severity: 'error',\n message: getErrorMessage(err),\n })\n );\n dispatch(logoutSaga());\n } else if (err.status === 400 || err.status === 500) {\n dispatch(\n setSnackbar({\n open: true,\n severity: 'error',\n message: getErrorMessage(err),\n })\n );\n } else {\n throw err;\n }\n }\n } else {\n dispatch(\n setSnackbar({\n open: true,\n severity: 'error',\n message: 'Something went wrong!',\n })\n );\n }\n }\n );\n dispatch(setErrorHandlerInitialized(true));\n };\n\n useEffect(() => {\n handleError();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return props.children;\n}\n\nexport default ErrorHandler;\n","import { SET_ERROR_HANDLER_INITIALIZED } from './actionTypes';\n\nexport function setErrorHandlerInitialized(payload) {\n return {\n type: SET_ERROR_HANDLER_INITIALIZED,\n payload,\n };\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport { ConnectedRouter } from 'connected-react-router';\nimport history from 'utils/history';\nimport App from 'containers/App';\nimport ErrorBoundry from 'containers/ErrorBoundary';\nimport configureStore from 'store';\nimport * as serviceWorker from 'serviceWorker';\nimport './translations';\nimport '../src/styles/main.scss';\nimport ErrorHandler from './services/ErrorHandler';\n\nconst initialState = {};\nconst store = configureStore(initialState, history);\n\nconst MOUNT_NODE = document.getElementById('root');\n\nconst render = () => {\n ReactDOM.render(\n \n \n \n \n \n \n \n \n ,\n MOUNT_NODE\n );\n};\n\nif (module.hot) {\n module.hot.accept(['translations', 'containers/App'], () => {\n ReactDOM.unmountComponentAtNode(MOUNT_NODE);\n render();\n });\n}\n\nrender();\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","import { createStore, applyMiddleware, compose } from 'redux';\nimport { routerMiddleware } from 'connected-react-router';\nimport createSagaMiddleware from 'redux-saga';\nimport createReducer from './reducers';\nimport rootSaga from './sagas';\n\nexport default function configureStore(initialState = {}, history) {\n let composeEnhancers = compose;\n let reduxSagaMonitorOptions = {};\n\n if (process.env.NODE_ENV !== 'production' && typeof window === 'object') {\n if (window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__)\n composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({});\n\n // if (window.__SAGA_MONITOR_EXTENSION__)\n // reduxSagaMonitorOptions = {\n // sagaMonitor: window.__SAGA_MONITOR_EXTENSION__\n // };\n }\n\n const sagaMiddleware = createSagaMiddleware(reduxSagaMonitorOptions);\n\n const middlewares = [sagaMiddleware, routerMiddleware(history)];\n\n const enhancers = [applyMiddleware(...middlewares)];\n\n const store = createStore(\n createReducer(),\n initialState,\n composeEnhancers(...enhancers)\n );\n\n sagaMiddleware.run(rootSaga);\n store.runSaga = sagaMiddleware.run;\n store.injectedReducers = {};\n store.injectedSagas = {};\n\n if (module.hot) {\n module.hot.accept('./reducers', () => {\n store.replaceReducer(createReducer(store.injectedReducers));\n });\n }\n\n return store;\n}\n","export const AUTH = '[Auth]';\n\nexport const LOGIN_SAGA = `${AUTH} LOGIN_SAGA`;\nexport const LOGOUT_SAGA = `${AUTH} LOGOUT_SAGA`;\nexport const RESET_PASSWORD_SAGA = `${AUTH} RESET_PASSWORD_SAGA`;\nexport const SET_TOKEN = `${AUTH} SET_TOKEN`;\nexport const GET_USER_SAGA = `${AUTH} GET_USER_SAGA`;\nexport const SET_USER = `${AUTH} SET_USER`;\nexport const REDIRECT_AFTER_PASSWORD_RESET_SAGA = `${AUTH} REDIRECT_AFTER_PASSWORD_RESET_SAGA`;\nexport const REGISTER_SAGA = `${AUTH} REGISTER_SAGA`;\n","export const HTTP_STATUS_CODES = {\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n SERVER_ERROR: 500,\n VALIDATION_FAILED: 422,\n};\n\nexport const HTTP_METHODS = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n DELETE: 'DELETE',\n};\n\nexport const colors = {\n white: '#ffffff',\n black: '#000000',\n grayLight: '#F0F0F0',\n primaryColor: '#033e7e',\n backgroundColor: '#f7f7f7',\n warning: '#BD3547',\n};\n\nexport const WORKFLOW_ATTEMPT_STATUS = {\n STARTED: 'started',\n COMPLETED: 'completed',\n};\n\nexport const LESSON_TYPES = {\n PDF: '0',\n VIDEO: '1',\n AUDIO: '2',\n HTML: '3',\n};\n","import {\n LOGIN_SAGA,\n LOGOUT_SAGA,\n SET_TOKEN,\n RESET_PASSWORD_SAGA,\n SET_USER,\n GET_USER_SAGA,\n REDIRECT_AFTER_PASSWORD_RESET_SAGA,\n REGISTER_SAGA,\n} from './actionTypes';\n\nexport function loginSaga(payload) {\n return {\n type: LOGIN_SAGA,\n payload,\n };\n}\n\nexport function logoutSaga() {\n return {\n type: LOGOUT_SAGA,\n };\n}\n\nexport function setToken(token) {\n return {\n type: SET_TOKEN,\n token,\n };\n}\n\nexport function resetPasswordSaga(payload) {\n return {\n type: RESET_PASSWORD_SAGA,\n payload,\n };\n}\n\nexport function getUserSaga() {\n return {\n type: GET_USER_SAGA,\n };\n}\n\nexport function setUser(payload) {\n return {\n type: SET_USER,\n payload,\n };\n}\n\nexport function redirectAfterPasswordResetSaga(payload) {\n return {\n type: REDIRECT_AFTER_PASSWORD_RESET_SAGA,\n payload,\n };\n}\n\nexport function registerSaga(payload) {\n return {\n type: REGISTER_SAGA,\n payload,\n };\n}\n","export const WORKFLOW = '[Workflow]';\n\nexport const SUBMIT_ATTEMPT_SAGA = `${WORKFLOW} SUBMIT_ATTEMPT_SAGA`;\nexport const REDIRECT_TO_WORKFLOW_SAGA = `${WORKFLOW} REDIRECT_TO_WORKFLOW_SAGA`;\nexport const SET_TEST_RESULTS_DATA = `${WORKFLOW} SET_TEST_RESULTS_DATA`;\nexport const SET_WORKFLOW_RESULTS_DATA = `${WORKFLOW} SET_WORKFLOW_RESULTS_DATA`;\nexport const GET_WORKFLOW_SAGA = `${WORKFLOW} GET_WORKFLOW_SAGA`;\nexport const SET_WORKFLOW = `${WORKFLOW} SET_WORKFLOW`;\n","export function getItem(keyName) {\n try {\n return JSON.parse(localStorage.getItem(keyName));\n } catch (error) {\n console.log(error);\n return null;\n }\n}\n\nexport function setItem(keyName, value) {\n localStorage.setItem(keyName, JSON.stringify(value));\n}\n\nexport function removeItem(keyName) {\n localStorage.removeItem(keyName);\n}\n","export const GROUP = '[Group]';\n\nexport const GET_GROUPS_SAGA = `${GROUP} GET_GROUPS_SAGA`;\nexport const SET_GROUPS = `${GROUP} SET_GROUPS`;\nexport const GET_GROUP_SAGA = `${GROUP} GET_GROUP_SAGA`;\nexport const SET_GROUP = `${GROUP} SET_GROUP`;\n","import { SET_SNACKBAR } from './actionTypes';\n\nexport function setSnackbar(payload) {\n return {\n type: SET_SNACKBAR,\n payload,\n };\n}\n","/* eslint-disable no-useless-escape */\nimport jwtDecode from 'jwt-decode';\n\nclass HelperService {\n camel2title = (camelCase) =>\n camelCase\n .replace(/([A-Z])/g, (match) => ` ${match}`)\n .replace(/^./, (match) => match?.toUpperCase())\n .trim();\n\n titleCase = (str) => {\n let strAr = str.toLowerCase().split(' ');\n for (let i = 0; i < strAr.length; i++) {\n strAr[i] = strAr[i].charAt(0).toUpperCase() + strAr[i].slice(1);\n }\n return strAr.join(' ');\n };\n\n // stringToTitleCase(s) {\n // return s\n // .replace(/([^A-Z])([A-Z])/g, '$1 $2') // split cameCase\n // .replace(/[_\\-]+/g, ' ') // split snake_case and lisp-case\n // .toLowerCase()\n // .replace(/(^\\w|\\b\\w)/g, function (m) {\n // return m.toUpperCase();\n // }) // title case words\n // .replace(/\\s+/g, ' ') // collapse repeated whitespace\n // .replace(/^\\s+|\\s+$/, ''); // remove leading/trailing whitespace\n // }\n\n snakeCaseToTitleCase(s) {\n return s\n .replace(/[_\\-]+/g, ' ') // split snake_case and lisp-case\n .replace(/(^\\w|\\b\\w)/g, function (m) {\n return m.toUpperCase();\n }); // title case words\n }\n\n checkIsAuthenticated = (array, user) => {\n return array.some((item) => item === user?.role);\n };\n\n hasTokenExpired = (token) => {\n return token && Date.now() / 1000 >= jwtDecode(token).exp;\n };\n}\n\nexport const helperService = new HelperService();\n","import jwtDecode from 'jwt-decode';\n\nimport httpService from './HttpService';\nimport { HTTP_METHODS, HTTP_STATUS_CODES } from 'consts';\nimport { getItem, setItem, removeItem } from 'utils/localStorage';\nimport { helperService } from './HelperService';\n\nconst ROUTES = {\n LOGIN: '/auth/user-portal-login',\n ME: '/users/me',\n LOGOUT: '/auth/logout',\n TOKEN_REFRESH: '/auth/refresh',\n VERIFY_EMAIL: '/auth/verify-account',\n FORGOT_PASSWORD: '/auth/forgot-password',\n RESET_PASSWORD: '/auth/reset-password',\n REGISTER_USER: '/auth/register',\n};\n\nclass AuthService {\n constructor(httpService) {\n this.httpService = httpService;\n this.init();\n }\n\n init = () => {\n this.setAuthToken(this.getAccessToken());\n this.httpService.addRequestInterceptor(this.checkTokenExpiration);\n this.httpService.addResponseInterceptors(\n this.handleSuccessResponse,\n this.handleErrorResponse\n );\n };\n\n getAccessToken = () => {\n return getItem('token');\n };\n\n setAuthToken = (token) => {\n if (token) {\n setItem('token', token);\n\n this.httpService.attachHeaders({\n Authorization: `Bearer ${token}`,\n });\n }\n };\n\n refreshToken = async (prevToken) => {\n const { accessToken: newToken } = await this.httpService.request({\n url: ROUTES.TOKEN_REFRESH,\n method: HTTP_METHODS.POST,\n headers: {\n Authorization: `Bearer ${prevToken}`,\n },\n });\n\n this.setAuthToken(newToken);\n\n return newToken;\n };\n\n login = async (data) => {\n const res = await this.httpService.request({\n url: ROUTES.LOGIN,\n method: HTTP_METHODS.POST,\n data,\n });\n\n this.setAuthToken(res.authorization.token);\n\n return res;\n };\n\n registerUser = async (data) => {\n const res = await this.httpService.request({\n url: ROUTES.REGISTER_USER,\n method: HTTP_METHODS.POST,\n data,\n });\n\n this.setAuthToken(res.access_token);\n\n return res;\n };\n\n verifyAccount = async (data) => {\n const res = await this.httpService.request({\n url: ROUTES.VERIFY_EMAIL,\n method: HTTP_METHODS.PUT,\n data,\n });\n\n return res;\n };\n\n logout = async () => {\n await this.httpService.request({\n url: ROUTES.LOGOUT,\n method: HTTP_METHODS.POST,\n });\n\n this.destroySession();\n };\n\n forgotPassword = async (data) => {\n const res = await this.httpService.request({\n url: ROUTES.FORGOT_PASSWORD,\n method: HTTP_METHODS.POST,\n data,\n });\n\n return res;\n };\n\n resetPassword = async (data) => {\n const res = await this.httpService.request({\n url: ROUTES.RESET_PASSWORD,\n method: HTTP_METHODS.POST,\n data,\n });\n\n return res;\n };\n\n getUser = async () => {\n const res = await this.httpService.request({\n url: ROUTES.ME,\n method: HTTP_METHODS.GET,\n });\n\n return res;\n };\n\n destroySession = () => {\n removeItem('token');\n this.httpService.removeHeaders(['Authorization']);\n };\n\n checkTokenExpiration = async (request) => {\n if (request.url === ROUTES.TOKEN_REFRESH) {\n return request;\n }\n\n const token = this.getAccessToken();\n\n if (helperService.hasTokenExpired(token)) {\n // const newToken = await this.refreshToken(token);\n // request.headers.Authorization = `Bearer ${newToken}`;\n //\n // return request;\n await this.logout();\n }\n\n return request;\n };\n\n decodeJwt = async (token) => {\n return jwtDecode(token);\n };\n\n handleSuccessResponse = (response) => {\n return response;\n };\n\n handleErrorResponse = (error) => {\n try {\n const { status } = error.response;\n\n /* eslint-disable default-case */\n switch (status) {\n case HTTP_STATUS_CODES.UNAUTHORIZED:\n this.destroySession();\n // window.location = '/login';\n break;\n }\n\n return Promise.reject(error);\n } catch (e) {\n return Promise.reject(error);\n }\n };\n}\n\nconst authService = new AuthService(httpService);\n\nexport default authService;\n","export default {\n api: {\n baseUrl: process.env.REACT_APP_API_URL,\n cdn: process.env.REACT_APP_API_CDN,\n },\n};\n","import axios from 'axios';\n\nimport config from '../config';\n\nclass HttpClient {\n constructor() {\n this.client = axios.create({\n baseURL: config.api.baseUrl,\n });\n }\n\n request = (requestConfig) => {\n return this.client(requestConfig);\n };\n\n addRequestInterceptor = (callback) => {\n return this.client.interceptors.request.use(callback);\n };\n\n removeRequestInterceptor = (interceptorId) => {\n this.client.interceptors.request.eject(interceptorId);\n };\n\n addResponseInterceptors = (successCallback, errorCallback) => {\n return this.client.interceptors.response.use(\n successCallback,\n errorCallback\n );\n };\n\n removeResponseInterceptors = (interceptorId) => {\n this.client.interceptors.response.eject(interceptorId);\n };\n\n attachHeaders = (headers) => {\n Object.assign(this.client.defaults.headers, headers);\n };\n\n removeHeaders = (headerKeys) => {\n headerKeys.forEach((key) => delete this.client.defaults.headers[key]);\n };\n}\n\nclass HttpService {\n constructor(httpClient) {\n this.httpClient = httpClient;\n this.init();\n }\n\n init = () => {};\n\n request = (requestConfig) => {\n return this.httpClient.request(requestConfig);\n };\n\n attachHeaders = (headers) => {\n this.httpClient.attachHeaders(headers);\n };\n\n removeHeaders = (headerKeys) => {\n this.httpClient.removeHeaders(headerKeys);\n };\n\n setUnauthorizedCallback = (callback) => {\n this.unauthorizedCallback = callback;\n };\n\n addRequestInterceptor = (callback) => {\n return this.httpClient.addRequestInterceptor(callback);\n };\n\n removeRequestInterceptor = (interceptorId) => {\n this.httpClient.removeRequestInterceptor(interceptorId);\n };\n\n addResponseInterceptors = (successCallback, errorCallback) => {\n return this.httpClient.addResponseInterceptors(\n successCallback,\n errorCallback\n );\n };\n\n removeResponseInterceptors = (interceptorId) => {\n this.httpClient.removeResponseInterceptors(interceptorId);\n };\n}\n\nconst httpService = new HttpService(new HttpClient());\n\nexport default httpService;\n","export const getQueryParam = (search, param) => {\n const searchParams = new URLSearchParams(search);\n\n return searchParams.get(param);\n};\n\nexport const getErrorMessage = (error) => {\n if (error?.data?.message) {\n return error?.data?.message;\n } else if (error?.message) {\n return error?.message;\n } else if (error?.data) {\n return error?.data;\n } else {\n return 'Something went wrong!';\n }\n};\n\nexport const openLink = (url) => {\n const newWindow = window.open(url, '_blank', 'noopener,noreferrer');\n if (newWindow) newWindow.opener = null;\n};\n\nexport const fractionToPercentage = (numerator, denominator) => {\n return `${Math.round((numerator / denominator) * 100)}%`;\n};\n","import { createSelector } from 'reselect';\nimport { initialState } from './reducer';\n\nconst authStateSelector = (state) => state.auth || initialState;\n\nconst tokenSelector = () =>\n createSelector(authStateSelector, (state) => state.token);\n\nconst userSelector = () =>\n createSelector(authStateSelector, (state) => state.user);\n\nconst isAuthenticatedSelector = () =>\n createSelector(authStateSelector, (state) => !!state.token);\n\nexport { tokenSelector, userSelector, isAuthenticatedSelector };\n","import {\n GET_WORKFLOW_SAGA,\n REDIRECT_TO_WORKFLOW_SAGA,\n SET_TEST_RESULTS_DATA,\n SET_WORKFLOW,\n SET_WORKFLOW_RESULTS_DATA,\n SUBMIT_ATTEMPT_SAGA,\n} from './actionTypes';\n\nexport function submitAttemptSaga(payload) {\n return {\n type: SUBMIT_ATTEMPT_SAGA,\n payload,\n };\n}\n\nexport function redirectToWorkflowSaga(classesId, journeyId, token) {\n return {\n type: REDIRECT_TO_WORKFLOW_SAGA,\n classesId,\n journeyId,\n token,\n };\n}\n\nexport function setTestResultsData(payload) {\n return {\n type: SET_TEST_RESULTS_DATA,\n payload,\n };\n}\n\nexport function setWorkflowResultData(payload) {\n return {\n type: SET_WORKFLOW_RESULTS_DATA,\n payload,\n };\n}\n\nexport function getWorkflowSaga(groupId, workflowId) {\n return {\n type: GET_WORKFLOW_SAGA,\n groupId,\n workflowId,\n };\n}\n\nexport function setWorkflow(payload) {\n return {\n type: SET_WORKFLOW,\n payload,\n };\n}\n"],"sourceRoot":""}