{"version":3,"sources":["environments/prod.js","locales lazy /^/.*/.json$/ groupOptions: {} namespace object","shared/apps/CoreLayout/CoreLayout.jsx","shared/apps/CoreLayout/index.js","shared/apps/CoreLayout/CoreLayoutContainer.js","store/middlewares/permanent.js","store/modules/auth/authReducer.js","store/modules/localization/localizationReducer.js","shared/constants/localization.js","store/modules/index.js","store/createStore.js","store/index.js","App.js","serviceWorker.js","index.js","environments/index.js","environments/default.js","shared/constants/routes.js","store/modules/auth/authActions.js","shared/constants/auth.js","shared/utils/module.js","shared/utils/reducer.js","services/Token/Token.js","services/Token/index.js","store/modules/localization/localizationActions.js","services/Api/utils.js","services/Api/Api.js","services/Api/AdminPortalApi.js","services/Api/UserPortalApi.js","services/Api/AuthApi.js","services/Api/index.js","shared/hocs/connect.js","shared/constants/errors.js","store/modules/auth/authSelectors.js","store/modules/localization/localizationSelectors.js"],"names":["api","auth","appService","map","webpackAsyncContext","req","__webpack_require__","o","Promise","resolve","then","e","Error","code","ids","id","t","keys","Object","module","exports","EndUserModule","React","lazy","AdminModule","CoreLayout","userRole","Fragment","Suspense","fallback","USER_ROLES","superAdmin","admin","path","ROUTES","endUser","root","component","compose","connect","state","getUserRole","onLoadTexts","logout","withRouter","lifecycle","componentWillMount","apiService","init","props","history","replace","componentDidMount","console","log","ENV","version","this","storage","localStorage","loadState","JSON","parse","getItem","saveStore","_debounce","setItem","stringify","permanentMiddleware","getState","next","action","result","savedState","localization","initialState","role","tokenService","firstName","_get","getTokenPayload","getAccessToken","lastName","companyName","handlers","SET_USER","payload","CLEAN_USER","createReducer","lang","texts","SET_TEXTS","makeRootReducer","asyncReducers","combineReducers","authReducer","localizationReducer","store","middlewares","middleware","thunk","enhancers","composeEnhancers","isDebug","window","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","latency","createStore","rootReducer","applyMiddleware","injectReducer","reducersMap","replaceReducer","excludeReducer","reducerName","_omit","App","context","ReduxContext","Boolean","location","hostname","match","ReactDOM","render","document","getElementById","navigator","serviceWorker","ready","registration","unregister","config","process","sitepal","accountId","require","default","deepFreeze","obj","getOwnPropertyNames","forEach","name","prop","freeze","home","login","userPortal","avatarSelection","intro","mainIntro","moduleIntro","debrief","list","actionList","notFound","adminPortal","moduleScripts","scale","subScale","avatars","users","mainIntroduction","moduleIntroduction","dataReport","tooltip","updateToken","dispatch","setTokenData","tokenPayload","type","user","CurrentModuleIdContext","createContext","createModule","reducer","isUnique","useContext","useState","currentModuleId","setCurrentModuleId","moduleId","setModuleId","useModuleIdContext","useEffect","uuid","factory","createFactory","Provider","value","hasOwnProperty","createModuleStateSaver","key","getSavedState","getAllModuleState","saveState","newState","getInitialState","createModuleReducer","globalHandlers","moduleHandlers","entries","reduce","acc","handler","moduleSaver","moduleInitialState","allHandlers","defaultActionCreator","meta","createModuleAction","actionCreator","finalName","currentActionCreator","toString","Token","token","date","Date","setUTCSeconds","exp","getTokenData","access_token","refresh_token","tokenData","split","length","base64","decodeURIComponent","encodeURIComponent","atob","expirationDate","getExpirationDate","valueOf","getLang","catch","warn","getPath","pathname","query","resPath","queryString","queryToStringParams","handleError","response","status","statusText","body","error","formValuesToFormObjectCreator","EntityConstructor","formValues","data","append","getFormData","URLSearchParams","FormData","isRefreshingToken","waitRequests","hosts","_logout","apiAction","noAuth","_request","isTokenExpired","reject","push","headers","Authorization","url","client_id","grant_type","getRefreshToken","method","sendFormData","requestOptions","credentials","Accept","methodUpperCase","toUpperCase","requestUrl","getBlob","fetch","ok","blob","json","undefined","fetchBlob","isMock","get","includes","AdminPortalApi","apiRequest","scaleId","file","media","avatarId","size","index","sort","filters","voiceId","UserPortalApi","itemId","AuthApi","username","password","scope","adminPortalApiService","userPortalApiService","authApiService","mapStateToProps","mapDispatchToProps","reactReduxConnect","ERROR_CODES","common","notNull","notEmpty","fileFormatNotSupported","fileTooBig","videoFormatNotSupported","videoTooBig","duplicatedName","documentFormatNotSupported","documentTooBig","sitepalAuthenticationFailed","sitepalUnauthorizedIP","sitepalNoSuchAccount","sitepalInvalidParameter","sitepalRequiredParameterIsMissing","noSuchAccount","invalidParameter","requiredParameterIsMissing","noSuchScene","sitepalUnavailable","invalidCredentials","accessFailedCount","cannotEnableWithoutEmbedId","cannotEnableWithoutVoiceId","previousScalesNotCompleted","previousModuleNotCompleted","emptyFields","errorUploadFile","errorLoadFile","MESSAGE_BY_ERROR_CODE","getUserFirstName","getUserLastName","getUserCompanyName","getUserFullName","getData","getTexts","createSelector","errors"],"mappings":"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","file":"static/js/main.0fa2f63f.chunk.js","sourcesContent":["export default {\r\n api: {\r\n auth: '//cdru-prod-backend-appservice.azurewebsites.net',\r\n appService: '//cdru-prod-backend-appservice.azurewebsites.net',\r\n },\r\n}\r\n","var map = {\n\t\"./en-US.json\": [\n\t\t220,\n\t\t28\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__.t(id, 3);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 170;\nmodule.exports = webpackAsyncContext;","import React from 'react'\r\nimport { Route, Switch } from 'react-router-dom'\r\nimport { ROUTES } from 'constants/routes'\r\nimport { USER_ROLES } from 'constants/auth'\r\n\r\nconst EndUserModule = React.lazy(() => import('modules/EndUser'))\r\nconst AdminModule = React.lazy(() => import('modules/Admin'))\r\n\r\nconst CoreLayout = ({ userRole }) => (\r\n \r\n Loading...}>\r\n \r\n {(userRole !== USER_ROLES.superAdmin && userRole !== USER_ROLES.admin) && (\r\n \r\n )}\r\n {(userRole === USER_ROLES.superAdmin || userRole === USER_ROLES.admin) && (\r\n \r\n )}\r\n \r\n \r\n \r\n)\r\n\r\nexport default CoreLayout\r\n","import CoreLayout from './CoreLayoutContainer'\r\n\r\nexport default CoreLayout\r\n","import { compose, lifecycle } from 'recompose'\r\nimport { withRouter } from 'react-router-dom'\r\nimport apiService from 'services/Api'\r\nimport { ROUTES } from 'constants/routes'\r\nimport { connect } from 'hocs/connect'\r\nimport { logout } from 'store/modules/auth/authActions'\r\nimport { onLoadTexts } from 'store/modules/localization/localizationActions'\r\nimport { getUserRole } from 'store/modules/auth/authSelectors'\r\nimport ENV from 'environments'\r\nimport CoreLayout from './CoreLayout'\r\n\r\nexport default compose(\r\n connect(\r\n state => ({\r\n userRole: getUserRole(state),\r\n }),\r\n {\r\n onLoadTexts,\r\n logout,\r\n }\r\n ),\r\n withRouter,\r\n lifecycle({\r\n componentWillMount () {\r\n apiService.init({\r\n logout: () => {\r\n this.props.history.replace(ROUTES.endUser.auth.root)\r\n this.props.logout()\r\n },\r\n })\r\n },\r\n componentDidMount () {\r\n console.log(`%cFrontend version: ${ENV.version} `, 'font-size: 16px;')\r\n this.props.onLoadTexts()\r\n },\r\n }),\r\n)(CoreLayout)\r\n","import _debounce from 'lodash/debounce'\r\n\r\nconst STORE_SAVE_INTERVAL = 500\r\nconst storage = localStorage\r\nconst STORE_KEY = 'TEST_PROJECT'\r\nconst VERSION = '1.0.0'\r\n\r\nexport const loadState = () => {\r\n const { state = {} } = JSON.parse(storage.getItem(STORE_KEY)) || {}\r\n return state\r\n}\r\n\r\nconst saveStore = _debounce(\r\n state => {\r\n storage.setItem(STORE_KEY, JSON.stringify({ state, version: VERSION }))\r\n },\r\n STORE_SAVE_INTERVAL,\r\n)\r\n\r\nexport const permanentMiddleware = ({ getState }) => next => action => {\r\n const result = next(action)\r\n const state = getState()\r\n const savedState = {\r\n localization: state.localization,\r\n }\r\n saveStore(savedState)\r\n return result\r\n}\r\n","import _get from 'lodash/get'\r\nimport { createReducer } from 'utils/reducer'\r\nimport { tokenService } from 'services/Token'\r\nimport { SET_USER, CLEAN_USER } from './authActions'\r\n\r\nconst initialState = {\r\n role: tokenService.getUserRole(),\r\n firstName: _get(tokenService.getTokenPayload(tokenService.getAccessToken()), 'first_name', ''),\r\n lastName: _get(tokenService.getTokenPayload(tokenService.getAccessToken()), 'last_name', ''),\r\n companyName: _get(tokenService.getTokenPayload(tokenService.getAccessToken()), 'company_name', ''),\r\n}\r\n\r\nconst handlers = {\r\n [SET_USER]: (state, action) => ({\r\n ...state,\r\n ...action.payload,\r\n }),\r\n [CLEAN_USER]: state => ({\r\n ...state,\r\n role: null,\r\n firstName: '',\r\n lastName: '',\r\n companyName: '',\r\n }),\r\n}\r\n\r\nexport default createReducer(initialState, handlers)\r\n","import { DEFAULT_LANGUAGE } from 'constants/localization'\r\nimport { createReducer } from 'utils/reducer'\r\nimport { SET_TEXTS } from './localizationActions'\r\n\r\nconst initialState = {\r\n lang: DEFAULT_LANGUAGE,\r\n texts: {},\r\n}\r\n\r\nconst handlers = {\r\n [SET_TEXTS]: (state, { payload }) => ({\r\n ...state,\r\n texts: payload,\r\n }),\r\n}\r\n\r\nexport default createReducer(initialState, handlers)\r\n","export const DEFAULT_LANGUAGE = 'en-US'\r\n","import { combineReducers } from 'redux'\r\nimport authReducer from './auth/authReducer'\r\nimport localizationReducer from './localization/localizationReducer'\r\n\r\nconst makeRootReducer = asyncReducers => {\r\n return combineReducers({\r\n auth: authReducer,\r\n localization: localizationReducer,\r\n ...asyncReducers,\r\n })\r\n}\r\n\r\nexport default makeRootReducer\r\n","import _omit from 'lodash/omit'\r\nimport { applyMiddleware, compose, createStore } from 'redux'\r\nimport thunk from 'redux-thunk'\r\nimport ENV from 'environments'\r\nimport { permanentMiddleware, loadState } from './middlewares/permanent'\r\nimport rootReducer from './modules/index'\r\n\r\nconst create = (initialState = loadState(), middlewares = []) => {\r\n // ======================================================\r\n // Middleware Configuration\r\n // ======================================================\r\n const middleware = [\r\n permanentMiddleware,\r\n thunk,\r\n ...middlewares,\r\n ]\r\n\r\n // ======================================================\r\n // Store Enhancers\r\n // ======================================================\r\n const enhancers = []\r\n let composeEnhancers = compose\r\n\r\n if (ENV.isDebug && typeof window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ === 'function') {\r\n composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({\r\n latency: 0,\r\n })\r\n }\r\n\r\n // ======================================================\r\n // Store Instantiation and HMR Setup\r\n // ======================================================\r\n const store = createStore(\r\n rootReducer({}),\r\n initialState,\r\n composeEnhancers(\r\n applyMiddleware(...middleware),\r\n ...enhancers,\r\n ),\r\n )\r\n store.asyncReducers = {}\r\n\r\n store.injectReducer = reducersMap => {\r\n store.asyncReducers = {\r\n ...store.asyncReducers,\r\n ...reducersMap,\r\n }\r\n store.replaceReducer(rootReducer(store.asyncReducers))\r\n }\r\n\r\n store.excludeReducer = reducerName => {\r\n store.asyncReducers = _omit(store.asyncReducers, [reducerName])\r\n store.replaceReducer(rootReducer(store.asyncReducers))\r\n }\r\n\r\n // To unsubscribe, invoke `store.unsubscribeHistory()` anytime\r\n // store.unsubscribeHistory = browserHistory.listen(location(store))\r\n\r\n if (module.hot) {\r\n module.hot.accept('./modules', () => {\r\n const reducers = require('./modules/index')\r\n store.replaceReducer(reducers.makeRootReducer(store.asyncReducers))\r\n })\r\n }\r\n\r\n return store\r\n}\r\n\r\nexport default create\r\n","import createStore from './createStore'\r\n\r\nconst store = createStore()\r\n\r\nexport default store\r\n","import React from 'react'\r\nimport { Provider } from 'react-redux'\r\nimport { BrowserRouter as Router } from 'react-router-dom'\r\nimport CoreLayout from 'apps/CoreLayout'\r\nimport { ReduxContext } from 'utils/module'\r\nimport store from './store'\r\nimport './App.css'\r\n\r\nconst App = () => (\r\n \r\n \r\n \r\n \r\n \r\n)\r\n\r\nexport default App\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n)\r\n\r\nexport function register (config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href)\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets see https://github.com/facebook/create-react-app/issues/2374\r\n return\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config)\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n )\r\n })\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config)\r\n }\r\n })\r\n }\r\n}\r\n\r\nfunction registerValidSW (swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing\r\n if (installingWorker == null) {\r\n return\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n )\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration)\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.')\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error)\r\n })\r\n}\r\n\r\nfunction checkValidServiceWorker (swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type')\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload()\r\n })\r\n })\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config)\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n )\r\n })\r\n}\r\n\r\nexport function unregister () {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister()\r\n })\r\n }\r\n}\r\n","import React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport App from './App'\r\nimport * as serviceWorker from './serviceWorker'\r\n\r\nReactDOM.render(, document.getElementById('root'))\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister()\r\n","import defaultConfig from './default'\r\n\r\nconst config = {\r\n ...defaultConfig,\r\n ...require(`./${process.env.NODE_ENV === 'test' ? 'dev' : process.env.REACT_APP_ENV}`).default,\r\n}\r\n\r\nconst deepFreeze = obj => {\r\n const propNames = Object.getOwnPropertyNames(obj)\r\n\r\n propNames.forEach(name => {\r\n const prop = obj[name]\r\n\r\n if (typeof prop === 'object' && prop !== null) {\r\n deepFreeze(prop)\r\n }\r\n })\r\n\r\n return Object.freeze(obj)\r\n}\r\n\r\nexport default deepFreeze(config)\r\n","export default {\r\n version: process.env.REACT_APP_VERSION,\r\n api: {\r\n auth: '//cdru-dev-backend-appservice.azurewebsites.net',\r\n appService: '//cdru-dev-backend-appservice.azurewebsites.net',\r\n },\r\n sitepal: {\r\n accountId: 7146135,\r\n },\r\n}\r\n","export const ROUTES = {\r\n home: {\r\n root: '/',\r\n },\r\n endUser: {\r\n root: '/',\r\n auth: {\r\n root: '/',\r\n login: '/login',\r\n },\r\n userPortal: {\r\n root: '/',\r\n avatarSelection: '/avatars-list',\r\n intro: {\r\n mainIntro: '/intro',\r\n moduleIntro: '/module-intro',\r\n },\r\n debrief: {\r\n list: '/debrief-list',\r\n actionList: '/action-module-list',\r\n module: '/debrief-module',\r\n },\r\n },\r\n notFound: '/404',\r\n },\r\n admin: {\r\n root: '/',\r\n adminPortal: {\r\n moduleScripts: {\r\n root: '/scripts',\r\n module: '/scripts/:moduleId',\r\n scale: '/scripts/:moduleId/:scaleId',\r\n subScale: '/scripts/:moduleId/:scaleId/:subScaleId',\r\n },\r\n avatars: '/avatars',\r\n users: '/users',\r\n intro: {\r\n root: '/welcome-page',\r\n mainIntroduction: '/welcome-page/main-introduction',\r\n moduleIntroduction: '/welcome-page/module-introduction',\r\n },\r\n dataReport: {\r\n root: '/data-report',\r\n tooltip: '/data-report/tooltip',\r\n },\r\n },\r\n logout: '/logout',\r\n notFound: '/404',\r\n },\r\n}\r\n","import _get from 'lodash/get'\r\nimport { tokenService } from 'services/Token'\r\n\r\nconst MODULE_NAME = 'token'\r\nexport const SET_USER = `${MODULE_NAME}/SET_USER`\r\nexport const CLEAN_USER = `${MODULE_NAME}/CLEAN_USER`\r\n\r\nexport const updateToken = result => dispatch => {\r\n tokenService.setTokenData(result)\r\n\r\n const tokenPayload = tokenService.getTokenPayload(tokenService.getAccessToken())\r\n const userRole = _get(tokenPayload, 'role')\r\n const firstName = _get(tokenPayload, 'first_name', '')\r\n const lastName = _get(tokenPayload, 'last_name', '')\r\n const companyName = _get(tokenPayload, 'company_name', '')\r\n dispatch({\r\n type: SET_USER,\r\n payload: { role: userRole, firstName, lastName, companyName },\r\n })\r\n}\r\n\r\nexport const logout = () => dispatch => {\r\n tokenService.setTokenData({})\r\n dispatch({\r\n type: CLEAN_USER,\r\n })\r\n}\r\n","export const USER_ROLES = {\r\n superAdmin: 'SuperAdmin',\r\n admin: 'Admin',\r\n user: 'User',\r\n}\r\n","import React, { useState, useEffect, useContext } from 'react'\r\nimport uuid from 'uuid'\r\n\r\nexport const CurrentModuleIdContext = React.createContext('')\r\n\r\nexport const ReduxContext = React.createContext()\r\n\r\nconst useModuleIdContext = moduleId => {\r\n const [id, setModuleId] = useState(moduleId)\r\n return [\r\n id,\r\n id => {\r\n setModuleId(id)\r\n },\r\n ]\r\n}\r\n\r\nexport const createModule = ({\r\n component,\r\n reducer = () => ({}),\r\n name,\r\n isUnique,\r\n context = CurrentModuleIdContext,\r\n}) => props => {\r\n const { store } = useContext(ReduxContext)\r\n const [currentModuleId, setCurrentModuleId] = useState('')\r\n const [moduleId, setModuleId] = useModuleIdContext(useContext(context))\r\n useEffect(() => {\r\n if (!moduleId || !currentModuleId) {\r\n const moduleId = isUnique ? uuid() : `${name}Module`\r\n setCurrentModuleId(moduleId)\r\n setModuleId(moduleId)\r\n store.injectReducer({\r\n [moduleId]: reducer(moduleId),\r\n })\r\n }\r\n return () => {\r\n store.excludeReducer(currentModuleId)\r\n }\r\n }, [currentModuleId])\r\n\r\n const factory = React.createFactory(component)\r\n\r\n return (\r\n \r\n \r\n {factory(props)}\r\n \r\n \r\n )\r\n}\r\n","import _get from 'lodash/get'\r\n\r\nexport const createReducer = (initialState, handlers) => {\r\n return (state = initialState, action) => {\r\n return handlers.hasOwnProperty(action.type) ? handlers[action.type](state, action) : state\r\n }\r\n}\r\n\r\nconst createModuleStateSaver = (moduleId, key, getSavedState) => {\r\n const getAllModuleState = () => JSON.parse(localStorage.getItem(moduleId))\r\n const getReducerState = () => _get(getAllModuleState(), key)\r\n return {\r\n saveState: state => {\r\n const newState = key\r\n ? {\r\n ...getAllModuleState(),\r\n [key]: getSavedState(state),\r\n }\r\n : state\r\n localStorage.setItem(moduleId, JSON.stringify(newState))\r\n },\r\n getInitialState: (initialState) => {\r\n if (key) {\r\n return {\r\n ...initialState,\r\n ...getReducerState(),\r\n }\r\n }\r\n return {\r\n ...initialState,\r\n ...getAllModuleState(),\r\n }\r\n },\r\n }\r\n}\r\n\r\nexport const createModuleReducer = (initialState, handlers, globalHandlers = {}, getSavedState = state => state) =>\r\n (moduleId, key) => {\r\n const moduleHandlers = Object.entries(handlers).reduce((acc, [type, handler]) => ({\r\n ...acc,\r\n [`${moduleId}/${type}`]: handler,\r\n }), {})\r\n const moduleSaver = createModuleStateSaver(moduleId, key, getSavedState)\r\n const moduleInitialState = moduleSaver.getInitialState(initialState) || initialState\r\n\r\n const allHandlers = {\r\n ...moduleHandlers,\r\n ...globalHandlers,\r\n }\r\n\r\n return (state = moduleInitialState, action) => {\r\n if (allHandlers.hasOwnProperty(action.type)) {\r\n const newState = allHandlers[action.type](state, action)\r\n moduleSaver.saveState(newState)\r\n return newState\r\n }\r\n return state\r\n }\r\n }\r\n\r\nconst defaultActionCreator = type => (payload, meta) => ({ type, payload, meta })\r\n\r\nexport const createModuleAction = module => (name, actionCreator = null) => {\r\n const finalName = `${module}/${name}`\r\n let currentActionCreator = actionCreator\r\n if (!currentActionCreator) {\r\n currentActionCreator = defaultActionCreator(finalName)\r\n }\r\n const result = (...params) => {\r\n const action = currentActionCreator(...params)\r\n action.type = finalName\r\n return action\r\n }\r\n result.toString = () => finalName\r\n return result\r\n}\r\n","export default class Token {\r\n getExpirationDate (token) {\r\n const payload = this.getTokenPayload(token)\r\n const date = new Date(0)\r\n\r\n date.setUTCSeconds(payload.exp)\r\n\r\n return date\r\n }\r\n\r\n getTokenData () {\r\n return JSON.parse(localStorage.getItem('tokenData')) || {}\r\n }\r\n\r\n getAccessToken () {\r\n return this.getTokenData().access_token\r\n }\r\n\r\n getRefreshToken () {\r\n return this.getTokenData().refresh_token\r\n }\r\n\r\n setTokenData (tokenData) {\r\n localStorage.setItem('tokenData', JSON.stringify(tokenData))\r\n }\r\n\r\n getTokenPayload (token) {\r\n if (token && token.split('.').length === 3) {\r\n try {\r\n const base64Url = token.split('.')[1]\r\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/')\r\n return JSON.parse(\r\n decodeURIComponent(encodeURIComponent(window.atob(base64))),\r\n )\r\n } catch (e) {\r\n return {}\r\n }\r\n }\r\n }\r\n\r\n getUserRole () {\r\n const { role } = this.getTokenPayload(this.getAccessToken()) || {}\r\n return role\r\n }\r\n\r\n isTokenExpired (token = '') {\r\n if (!token) {\r\n return true\r\n }\r\n const expirationDate = this.getExpirationDate(token)\r\n return expirationDate.valueOf() <= new Date().valueOf()\r\n }\r\n}\r\n","import Token from './Token'\r\n\r\nexport const tokenService = new Token()\r\n","import { getLang } from './localizationSelectors'\r\n\r\nconst MODULE_NAME = 'localization'\r\n\r\nexport const SET_TEXTS = `${MODULE_NAME}/SET_TEXTS`\r\n\r\nexport const onLoadTexts = () => (dispatch, getState) => {\r\n const lang = getLang(getState())\r\n\r\n return import(`locales/${lang}.json`)\r\n .then(module => {\r\n dispatch({\r\n type: SET_TEXTS,\r\n payload: module.default,\r\n })\r\n })\r\n .catch(() => {\r\n console.warn(`No texts for ${lang}`)\r\n })\r\n}\r\n","import queryString from 'query-string'\r\n\r\nconst queryToStringParams = (query = {}) => queryString.stringify(query)\r\n\r\nconst getPath = ({ pathname = '', query, hostname }) => {\r\n const resPath = `${hostname}${pathname[0] === '/' ? '' : '/'}${pathname}`\r\n\r\n return query\r\n ? `${resPath}?${queryToStringParams(query)}`\r\n : resPath\r\n}\r\n\r\nexport const getApiUrl = params => getPath(params)\r\n\r\nexport const handleError = (response) => {\r\n const { status = 500, statusText, body } = response\r\n const error = new Error(body || statusText)\r\n error.status = status\r\n error.statusText = statusText\r\n error.result = body\r\n throw error\r\n}\r\n\r\nexport const fetchBlob = (requestUrl, requestOptions) => {\r\n return fetch(requestUrl, requestOptions)\r\n .then(response => {\r\n if (response.ok) {\r\n return response.blob()\r\n }\r\n\r\n const { status, statusText, ok } = response\r\n const bodyPromise = response.json()\r\n return bodyPromise.then(body => ({ status, statusText, ok, body }))\r\n })\r\n .then(blob => {\r\n if (blob.ok !== undefined && !blob.ok) {\r\n return handleError(blob)\r\n }\r\n\r\n return blob\r\n })\r\n}\r\n\r\nconst formValuesToFormObjectCreator = EntityConstructor => formValues => {\r\n const data = new EntityConstructor()\r\n\r\n Object.entries(formValues).forEach(([key, value]) => {\r\n data.append(key, value)\r\n })\r\n return data\r\n}\r\n\r\nexport const getURLSearchParams = formValuesToFormObjectCreator(URLSearchParams)\r\n\r\nexport const getFormData = formValuesToFormObjectCreator(FormData)\r\n","import ENV from 'environments'\r\nimport { tokenService } from '../Token'\r\nimport { getFormData, getApiUrl, fetchBlob, handleError } from './utils'\r\n\r\nclass Api {\r\n isRefreshingToken = false\r\n waitRequests = []\r\n hosts = ENV.api\r\n\r\n init ({ logout }) {\r\n this._logout = logout\r\n }\r\n\r\n apiRequest (apiAction, meta = {}) {\r\n if (meta.noAuth) {\r\n return this._request(apiAction, meta)\r\n }\r\n\r\n if (!tokenService.getAccessToken()) {\r\n this._logout()\r\n return Promise.reject(new Error('Unauthorized'))\r\n }\r\n\r\n if (!tokenService.isTokenExpired(tokenService.getAccessToken())) {\r\n return this._request(\r\n {\r\n ...apiAction, headers: { ...apiAction.headers, Authorization: `Bearer ${tokenService.getAccessToken()}` },\r\n },\r\n meta,\r\n )\r\n }\r\n\r\n if (this.isRefreshingToken) {\r\n return new Promise((resolve, reject) => {\r\n this.waitRequests.push({ resolve, reject })\r\n }).then(() => this._request(\r\n {\r\n ...apiAction, headers: { ...apiAction.headers, Authorization: `Bearer ${tokenService.getAccessToken()}` },\r\n },\r\n meta,\r\n ))\r\n }\r\n\r\n this.isRefreshingToken = true\r\n this._request({\r\n hostname: this.hosts.auth,\r\n url: '/connect/token',\r\n data: getFormData({\r\n client_id: 'cdru.web.admin',\r\n // client_secret: 'secret',\r\n grant_type: 'refresh_token',\r\n refresh_token: tokenService.getRefreshToken(),\r\n }),\r\n headers: {},\r\n method: 'POST',\r\n }, {\r\n noAuth: true,\r\n sendFormData: true,\r\n })\r\n .then(({ result }) => {\r\n this.isRefreshingToken = false\r\n tokenService.setTokenData(result)\r\n this.waitRequests.forEach(({ resolve }) => {\r\n resolve()\r\n })\r\n this.waitRequests = []\r\n })\r\n .catch(error => {\r\n this.isRefreshingToken = false\r\n this.waitRequests.forEach(({ reject }) => {\r\n reject(error)\r\n })\r\n this.waitRequests = []\r\n this._logout()\r\n })\r\n\r\n return new Promise((resolve, reject) => {\r\n this.waitRequests.push({ resolve, reject })\r\n }).then(() => this._request(\r\n {\r\n ...apiAction, headers: { ...apiAction.headers, Authorization: `Bearer ${tokenService.getAccessToken()}` },\r\n },\r\n meta,\r\n ))\r\n }\r\n\r\n _request (apiAction, meta) {\r\n const {\r\n method,\r\n url, // NOTE: must have a leading slash\r\n query,\r\n data,\r\n headers,\r\n hostname,\r\n } = apiAction\r\n\r\n const requestOptions = {\r\n method,\r\n credentials: 'same-origin',\r\n headers: {\r\n Accept: 'application/json',\r\n ...headers,\r\n },\r\n }\r\n\r\n const methodUpperCase = method.toUpperCase()\r\n if (data && (methodUpperCase === 'POST' || methodUpperCase === 'PUT' || methodUpperCase === 'PATCH')) {\r\n if (meta && meta.sendFormData) {\r\n requestOptions.body = data\r\n } else {\r\n requestOptions.headers['Content-Type'] = 'application/json'\r\n requestOptions.body = typeof data !== 'string' ? JSON.stringify(data) : data\r\n }\r\n }\r\n\r\n const requestUrl = getApiUrl({ pathname: url, query, hostname })\r\n\r\n if (meta && meta.getBlob) {\r\n return fetchBlob(requestUrl, requestOptions)\r\n }\r\n\r\n return fetch(requestUrl, requestOptions)\r\n .then(response => {\r\n const { status, statusText, ok, isMock } = response\r\n\r\n let bodyPromise\r\n\r\n if (status === 204) {\r\n // note: no content status\r\n bodyPromise = Promise.resolve(null)\r\n } else if (\r\n response.headers.get('Content-Length') !== '0' &&\r\n response.headers.get('Content-Type').includes('application/json')\r\n ) {\r\n bodyPromise = response.json()\r\n } else {\r\n bodyPromise = Promise.resolve({})\r\n }\r\n\r\n return bodyPromise.then(body => ({ status, statusText, ok, body, isMock }))\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n if (response.status === 401) {\r\n this._logout()\r\n }\r\n\r\n return handleError(response)\r\n }\r\n\r\n return response\r\n })\r\n .then(response => {\r\n const { status, body } = response\r\n\r\n return { result: body, status }\r\n })\r\n .catch((error) => {\r\n console.error(error)\r\n throw error\r\n })\r\n }\r\n}\r\n\r\nexport const apiService = new Api()\r\n","import { apiService } from './Api'\r\nimport { getFormData } from './utils'\r\n\r\nexport default class AdminPortalApi {\r\n getModuleScriptsNavigation () {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: '/navigation',\r\n headers: {},\r\n method: 'GET',\r\n }, {})\r\n }\r\n\r\n getModuleByModuleId ({ moduleId }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/modules/${moduleId}`,\r\n headers: {},\r\n method: 'GET',\r\n }, {})\r\n }\r\n\r\n updateModuleByModuleId ({ moduleId }, data) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/modules/${moduleId}`,\r\n headers: {},\r\n method: 'PUT',\r\n data,\r\n }, {})\r\n }\r\n\r\n getScaleByScaleId ({ scaleId }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/scales/${scaleId}`,\r\n headers: {},\r\n method: 'GET',\r\n }, {})\r\n }\r\n\r\n updateScaleByScaleId ({ scaleId }, data) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/scales/${scaleId}`,\r\n headers: {},\r\n method: 'PUT',\r\n data,\r\n }, {})\r\n }\r\n\r\n uploadMedia (file) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: '/media',\r\n headers: {},\r\n method: 'POST',\r\n data: getFormData({\r\n media: file,\r\n }),\r\n }, {\r\n sendFormData: true,\r\n })\r\n }\r\n\r\n getAvatars () {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: '/avatars',\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n syncAvatars () {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: '/avatars/sync',\r\n headers: {},\r\n method: 'POST',\r\n })\r\n }\r\n\r\n setAvatarStatusByAvatarId ({ avatarId, status }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/avatars/${avatarId}/status/${status}`,\r\n headers: {},\r\n method: 'PUT',\r\n })\r\n }\r\n\r\n postUsers ({ size, index, sort, filters }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: '/users',\r\n headers: {},\r\n method: 'POST',\r\n data: {\r\n size,\r\n index,\r\n sort,\r\n filters,\r\n },\r\n })\r\n }\r\n\r\n exportUsers ({ sort, filters }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: '/users/csv',\r\n headers: {},\r\n method: 'POST',\r\n data: {\r\n sort,\r\n filters,\r\n },\r\n }, {\r\n getBlob: true,\r\n })\r\n }\r\n\r\n getVoices () {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: '/avatars/voices',\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n setAvatarVoice (avatarId, voiceId) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/avatars/${avatarId}/voice/${voiceId}`,\r\n headers: {},\r\n method: 'PUT',\r\n })\r\n }\r\n\r\n getIntro (type) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/intro/${type}`,\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n getTooltip () {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/texts/dataReportTooltip`,\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n updateIntro (type, data) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/intro/${type}`,\r\n headers: {},\r\n method: 'PUT',\r\n data,\r\n }, {})\r\n }\r\n\r\n updateTooltip (data) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/texts/dataReportTooltip`,\r\n headers: {},\r\n method: 'PUT',\r\n data,\r\n }, {})\r\n }\r\n}\r\n","import { apiService } from './Api'\r\n\r\nexport default class UserPortalApi {\r\n getAvatars () {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: '/user/avatars',\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n setAvatar ({ id }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/user/avatar/${id}`,\r\n headers: {},\r\n method: 'PUT',\r\n })\r\n }\r\n\r\n getUserPreferences () {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: '/user/preferences',\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n getDebriefModules () {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: '/debrief/modules',\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n getDebriefModuleNavigation ({ moduleId }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/debrief/module/${moduleId}`,\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n completeDebriefModuleSection ({ type, itemId }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/debrief/${type}/${itemId}/complete`,\r\n headers: {},\r\n method: 'PUT',\r\n })\r\n }\r\n\r\n getModuleIntro ({ moduleId }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/debrief/module/${moduleId}/intro`,\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n getScaleInfoBlocks ({ scaleId }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/debrief/scale/${scaleId}/info-blocks`,\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n getUserScores () {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/user/scores`,\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n downloadReport ({ moduleId }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/debrief/module/${moduleId}/report`,\r\n headers: {},\r\n method: 'GET',\r\n }, {\r\n getBlob: true,\r\n })\r\n }\r\n\r\n downloadHighlights (moduleId) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/debrief/module/${moduleId}/report`,\r\n headers: {},\r\n method: 'GET',\r\n }, {\r\n getBlob: true,\r\n })\r\n }\r\n\r\n downloadDataReport () {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: '/debrief/data-report',\r\n headers: {},\r\n method: 'GET',\r\n }, {\r\n getBlob: true,\r\n })\r\n }\r\n\r\n getIntroduction (type) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/user/introduction/${type}`,\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n\r\n setIsIntroPassed (type) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/user/introduction/${type}`,\r\n headers: {},\r\n method: 'PUT',\r\n })\r\n }\r\n\r\n getForms (scaleId) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.appService,\r\n url: `/debrief/scale/${scaleId}/action-planning-form`,\r\n headers: {},\r\n method: 'GET',\r\n })\r\n }\r\n}\r\n","import { apiService } from './Api'\r\nimport { getFormData } from './utils'\r\n\r\nexport default class AuthApi {\r\n login ({ username, password }) {\r\n return apiService.apiRequest({\r\n hostname: apiService.hosts.auth,\r\n url: '/connect/token',\r\n data: getFormData({\r\n client_id: 'cdru.web.admin',\r\n // client_secret: 'secret',\r\n grant_type: 'password',\r\n scope: 'cdru.api.admin offline_access',\r\n username,\r\n password,\r\n }),\r\n headers: {},\r\n method: 'POST',\r\n }, {\r\n noAuth: true,\r\n sendFormData: true,\r\n })\r\n }\r\n}\r\n","import AdminPortalApi from './AdminPortalApi'\r\nimport UserPortalApi from './UserPortalApi'\r\nimport AuthApi from './AuthApi'\r\nimport { apiService } from './Api'\r\n\r\nexport const adminPortalApiService = new AdminPortalApi()\r\nexport const userPortalApiService = new UserPortalApi()\r\nexport const authApiService = new AuthApi()\r\n\r\nexport default apiService\r\n","import { connect as reactReduxConnect } from 'react-redux'\r\nimport { ReduxContext } from 'utils/module'\r\n\r\nexport const connect = (\r\n mapStateToProps,\r\n mapDispatchToProps,\r\n) => reactReduxConnect(mapStateToProps, mapDispatchToProps, null, {\r\n context: ReduxContext,\r\n})\r\n","export const ERROR_CODES = {\r\n common: 0,\r\n notNull: 2,\r\n notEmpty: 3,\r\n notFound: 100,\r\n fileFormatNotSupported: 101,\r\n fileTooBig: 102,\r\n videoFormatNotSupported: 103,\r\n videoTooBig: 104,\r\n duplicatedName: 105,\r\n documentFormatNotSupported: 106,\r\n documentTooBig: 107,\r\n // sitepal codes\r\n sitepalAuthenticationFailed: 200,\r\n sitepalUnauthorizedIP: 201,\r\n sitepalNoSuchAccount: 202,\r\n sitepalInvalidParameter: 203,\r\n sitepalRequiredParameterIsMissing: 204,\r\n noSuchAccount: 205,\r\n invalidParameter: 206,\r\n requiredParameterIsMissing: 207,\r\n noSuchScene: 208,\r\n sitepalUnavailable: 299,\r\n // auth errors\r\n invalidCredentials: 303,\r\n accessFailedCount: 304,\r\n // admin errors\r\n cannotEnableWithoutEmbedId: 400,\r\n cannotEnableWithoutVoiceId: 401,\r\n previousScalesNotCompleted: 500,\r\n previousModuleNotCompleted: 501,\r\n // client errors\r\n emptyFields: 'emptyFields',\r\n errorUploadFile: 'errorUploadFile',\r\n errorLoadFile: 'errorLoadFile',\r\n}\r\n\r\nexport const MESSAGE_BY_ERROR_CODE = {\r\n [ERROR_CODES.common]: 'Something went wrong.',\r\n [ERROR_CODES.notNull]: 'This field \"{{name}}\" is required.',\r\n [ERROR_CODES.notEmpty]: 'This field \"{{name}}\" is required.',\r\n [ERROR_CODES.notFound]: 'The object could not be found',\r\n [ERROR_CODES.fileFormatNotSupported]: 'The file format is not supported. Supported formats: JPG, PNG, MOV, MP4',\r\n [ERROR_CODES.fileTooBig]: 'The file is too big. Max allowed size: Image - 20Mb. Video - 300Mb.',\r\n [ERROR_CODES.videoFormatNotSupported]: 'The file format is not supported. Supported format: MOV, MP4.',\r\n [ERROR_CODES.videoTooBig]: 'The file is too big. Max allowed size is 300 Mb.',\r\n [ERROR_CODES.documentFormatNotSupported]: 'The file format is not supported. Supported formats: PDF, DOCX',\r\n [ERROR_CODES.documentTooBig]: 'The file is too big. Max allowed size is 2 Mb.',\r\n [ERROR_CODES.duplicatedName]: 'The name already exists in the system.',\r\n [ERROR_CODES.sitepalAuthenticationFailed]: 'SitePal server unavailable.',\r\n [ERROR_CODES.sitepalUnauthorizedIP]: 'SitePal server unavailable.',\r\n [ERROR_CODES.sitepalNoSuchAccount]: 'SitePal server unavailable.',\r\n [ERROR_CODES.sitepalInvalidParameter]: 'SitePal server unavailable.',\r\n [ERROR_CODES.sitepalRequiredParameterIsMissing]: 'SitePal server unavailable.',\r\n [ERROR_CODES.noSuchAccount]: 'SitePal server unavailable.',\r\n [ERROR_CODES.invalidParameter]: 'SitePal server unavailable.',\r\n [ERROR_CODES.requiredParameterIsMissing]: 'SitePal server unavailable.',\r\n [ERROR_CODES.noSuchScene]: 'SitePal server unavailable.',\r\n [ERROR_CODES.sitepalUnavailable]: 'SitePal server unavailable.',\r\n [ERROR_CODES.errorUploadFile]: 'Something went wrong. Please try to upload the file again.',\r\n [ERROR_CODES.invalidCredentials]: 'Сredentials could not be validated.',\r\n [ERROR_CODES.accessFailedCount]: 'Сredentials could not be validated. Please contact us at support@cdrassessmentgroup.com',\r\n [ERROR_CODES.cannotEnableWithoutEmbedId]: 'Try to synchronize Avatar first.',\r\n [ERROR_CODES.cannotEnableWithoutVoiceId]: \"Try to choose an Avatar's voice first.\",\r\n [ERROR_CODES.previousScalesNotCompleted]: 'Please complete the previous Module/Scale/Subscale.',\r\n [ERROR_CODES.previousModuleNotCompleted]: 'Please complete the previous Module/Scale/Subscale.',\r\n [ERROR_CODES.emptyFields]: 'Please complete required fields',\r\n [ERROR_CODES.errorLoadFile]: 'Unable to open file.',\r\n}\r\n","export const getUserRole = state => state.auth.role\r\nexport const getUserFirstName = state => state.auth.firstName\r\nexport const getUserLastName = state => state.auth.lastName\r\nexport const getUserCompanyName = state => state.auth.companyName\r\nexport const getUserFullName = state => `${getUserFirstName(state)} ${getUserLastName(state)}`\r\n","import { createSelector } from 'reselect'\r\nimport { MESSAGE_BY_ERROR_CODE } from 'constants/errors'\r\n\r\nexport const getData = state => state.localization\r\nexport const getLang = state => getData(state).lang\r\nexport const getTexts = createSelector(\r\n state => getData(state).texts,\r\n texts => ({\r\n ...texts,\r\n errors: {\r\n ...MESSAGE_BY_ERROR_CODE,\r\n ...texts.errors,\r\n },\r\n })\r\n)\r\n"],"sourceRoot":""}