{"version":3,"sources":["_platform/src/containers/LoginProvider/constants.js","_platform/src/containers/LoginProvider/actions.js","_platform/src/containers/LoginProvider/reducer.js","_platform/src/containers/LoginProvider/selectors.js","_platform/src/containers/LoginProvider/saga.js","_platform/src/containers/LoginProvider/LoginProvider.js"],"names":["LOGIN_REQUEST","LOGIN_SUCCESS","LOGIN_ERROR","loginSuccess","response","type","loginError","error","initialState","status","undefined","statusDetails","loginReducer","state","arguments","length","action","Object","objectSpread","user","selectLoginState","login","requestLogin","loginSaga","values","_values$values","username","password","rememberLogin","settingsApp","rememberMe","loginPagePath","logoutPagePath","userData","pageQueryString","defaultReturnPath","returnUrl","cleanQueryString","trimmedQueryString","oldPassword","redirectOnIncompleteProfile","redirectQS","regenerator_default","a","wrap","_context","prev","next","loginRememberMeEnabled","loginUseSessionStorage","put","title","message","abrupt","showLoading","call","api","post","JSON","stringify","sent","formatToken","data","qs","parse","history","location","search","replace","ignoreQueryPrefix","pathname","keys","isUrlAbsolute","removeProperty","apiSetAuthorizationToken","token","isProfileValid","forcePasswordChange","storeToken","setUser","push","concat","t0","apiErrorHandler","hideLoading","finish","stop","_marked","_context2","takeLatest","_marked2","LoginForm","LoadAsync","Promise","all","__webpack_require__","e","then","bind","ChangePasswordProvider","ProfileProvider","LoginProvider","props","lpRef","useRef","useEffect","hash","timer1","setTimeout","current","scrollIntoView","clearTimeout","currentUser","currentUserTemp","userOptions","_props$theme$settings","theme","userLoggedIn","initialValues","react_default","createElement","className","id","ref","disableMeta","Helmet_default","name","content","siteName","children","React","Children","map","childElement","cloneElement","assign","defaultProps","mapStateToProps","createStructuredSelector","selectCurrentUser","selectCurrentUserTemp","createSelector","localstate","selectUserOptions","withConnect","connect","dispatch","onSubmitForm","loginRequest","withReducer","injectReducer","key","reducer","withSaga","injectSaga","saga","compose","withRouter","withTheme"],"mappings":"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","file":"static/js/loginProvider.fe895ce2.chunk.js","sourcesContent":["/**\n * Login constants\n */\n\nexport const LOGIN_REQUEST = 'platform/Login/LOGIN_REQUEST';\nexport const LOGIN_SUCCESS = 'platform/Login/LOGIN_SUCCESS';\nexport const LOGIN_ERROR = 'platform/Login/LOGIN_ERROR';\n","/**\n * Login actions\n */\n\nimport { LOGIN_REQUEST, LOGIN_SUCCESS, LOGIN_ERROR } from './constants';\n\n/**\n * Login request - start the request saga\n *\n * @returns {object} An action object with a type of LOGIN_REQUEST\n */\nexport function loginRequest(values, settingsApp) {\n return {\n type: LOGIN_REQUEST,\n values,\n settingsApp,\n };\n}\n\n/**\n * Dispatched when loginRequest succeeds by the request saga\n *\n * @param {object} response The response\n * @returns {object} An action object with a type of LOGIN_SUCCESS and the response\n */\nexport function loginSuccess(response) {\n return {\n type: LOGIN_SUCCESS,\n response,\n };\n}\n\n/**\n * Dispatched when loginRequests fails\n *\n * @param {object} error The error as received from the API\n * @returns {object} An action object with a type of LOGIN_ERROR and the error\n */\nexport function loginError(error) {\n return {\n type: LOGIN_ERROR,\n error,\n };\n}\n","/**\n * Login reducer\n */\n\nimport { LOGIN_REQUEST, LOGIN_SUCCESS, LOGIN_ERROR } from './constants';\n\nexport const initialState = {\n status: undefined,\n statusDetails: {},\n};\n\nfunction loginReducer(state = initialState, action) {\n switch (action.type) {\n case LOGIN_REQUEST:\n return {\n ...state,\n status: 'loading',\n statusDetails: {},\n };\n case LOGIN_SUCCESS:\n return {\n ...state,\n status: 'success',\n // statusDetails: {\n // message: 'Login successful.',\n // },\n user: action.response,\n };\n case LOGIN_ERROR:\n return {\n ...state,\n status: 'error',\n statusDetails: action.error,\n };\n default:\n return state;\n }\n}\n\nexport default loginReducer;\n","/**\n * Login selectors\n */\nimport { createSelector } from 'reselect';\nimport { initialState } from './reducer';\n\n/**\n * Container state\n */\nconst selectLoginState = state => state.login || initialState;\n\n/**\n * Fetch state\n */\nconst selectStatus = () =>\n createSelector(selectLoginState, localstate => ({\n status: localstate.status,\n statusDetails: localstate.statusDetails,\n }));\n\nexport { selectLoginState, selectStatus };\n","/**\n * Login saga\n */\n\nimport { call, put, takeLatest } from 'redux-saga/effects';\nimport { showLoading, hideLoading } from 'react-redux-loading-bar';\nimport qs from 'qs';\nimport {\n api,\n apiErrorHandler,\n apiSetAuthorizationToken,\n} from '../../utils/request'; // _platform\nimport { formatToken, storeToken } from '../../utils/tokenUtils'; // _platform\nimport { isUrlAbsolute, removeProperty } from '../../utils/utilities'; // _platform\nimport history from '../../utils/history'; // _platform\nimport { LOGIN_REQUEST } from './constants';\nimport { loginSuccess, loginError } from './actions';\nimport { setUser } from '../../containers/App/actions'; // _platform\n\n/**\n * Request login\n */\nexport function* requestLogin(values) {\n const { username, password, rememberLogin } = values.values;\n const { settingsApp } = values;\n const rememberMe =\n !!settingsApp.loginRememberMeEnabled &&\n !settingsApp.loginUseSessionStorage && // loginUseSessionStorage must be false\n !!rememberLogin;\n const { loginPagePath, logoutPagePath } = settingsApp;\n\n if (!username || !password) {\n yield put(\n loginError({\n title: 'Login error',\n message: 'Missing username or password',\n })\n );\n return; // Terminate the request\n }\n\n try {\n yield put(showLoading());\n const response = yield call(() =>\n api.post(\n '/Authentication/v1/Login',\n JSON.stringify({ username, password, rememberMe })\n )\n );\n /*\n Expected response status codes:\n * Successful login:\n 200, data: object with token details\n * Login Failed:\n 400, message: \"An error occurred trying to login user.\" (invalid user name) or \"Login failed.\" (wrong password)\n Incorrect user or password.\n * 2FA error:\n 400, message: \"2-Factor authentication has not been implemented\"\n * User is not allowed to login:\n 403, message: \"Not allowed.\"\n Internal backend auth functionality.\n * User is locked out:\n 403, message: \"Locked out.\"\n Too many failed attempts - temporary lockout.\n * User is not Authorised:\n 403, message: \"Unauthorised.\"\n The user has been prevented from logging in by an admin\n */\n\n // Format user's token data\n const userData = formatToken(response.data);\n\n yield put(loginSuccess(userData));\n\n // Get the query string\n // Use lowercaseKeys to make the object keys predictable\n const pageQueryString = qs.parse(\n history.location.search.replace(/returnUrl/gi, 'returnUrl'),\n {\n ignoreQueryPrefix: true,\n }\n );\n\n const defaultReturnPath =\n history.location.pathname !== loginPagePath &&\n history.location.pathname !== logoutPagePath &&\n (Object.keys(pageQueryString).length === 0 ||\n (pageQueryString.returnUrl && Object.keys(pageQueryString).length > 1))\n ? history.location.pathname // Return the user to the same path they came from\n : '/';\n\n // Set the returnUrl from the query string, otherwise go to the home page\n const returnUrl =\n pageQueryString.returnUrl && !isUrlAbsolute(pageQueryString.returnUrl)\n ? pageQueryString.returnUrl // Note that the properties will be lowercase\n : defaultReturnPath;\n\n // Original queryString but sanitised\n const cleanQueryString = qs.stringify(pageQueryString);\n\n // Remove returnUrl from querystring and keep the remainder\n const trimmedQueryString = qs.stringify(\n removeProperty(pageQueryString, 'returnUrl')\n );\n\n // Set API Authorization token to be used on subsequent calls\n apiSetAuthorizationToken(userData.token);\n\n // Check if the user has a valid profile\n if (\n response.data.isProfileValid === true &&\n response.data.forcePasswordChange === false\n ) {\n // Store the authentication info\n storeToken(userData, settingsApp.loginUseSessionStorage);\n\n // Put authentication info into App state\n yield put(setUser(userData));\n\n // Redirect to home, or to returnUrl value. Pass on any remaining query string values\n yield call(history.push, {\n pathname: returnUrl,\n search: trimmedQueryString && `?${trimmedQueryString}`,\n });\n } else {\n // Save the current password in state as we're immediately asking the\n // user to reset it, and removing it from state straight after\n const oldPassword = response.data.forcePasswordChange\n ? { oldPassword: password }\n : null;\n\n // Put authentication info into App state as currentUserTemp until the profile is complete\n yield put(\n setUser(userData, {\n forcePasswordChange: response.data.forcePasswordChange,\n isProfileValid: response.data.isProfileValid,\n ...oldPassword,\n })\n );\n\n const { redirectOnIncompleteProfile } = settingsApp;\n\n // Check if we should redirect to another page if the profile is incomplete\n // Include any query strings that may be present\n if (\n redirectOnIncompleteProfile &&\n response.data.forcePasswordChange === false\n ) {\n // Remove returnUrl if it matches redirectOnIncompleteProfile path\n const redirectQS =\n pageQueryString.returnUrl === redirectOnIncompleteProfile\n ? trimmedQueryString\n : cleanQueryString;\n\n yield call(history.push, {\n pathname: redirectOnIncompleteProfile,\n search: redirectQS && `?${redirectQS}`,\n });\n }\n }\n } catch (err) {\n const error = apiErrorHandler(err);\n\n yield put(\n loginError(\n error && error.message === 'Locked out.'\n ? { ...error, message: 'Too many failed attempts - locked out.' }\n : error\n )\n );\n } finally {\n yield put(hideLoading());\n }\n}\n\n/**\n * Default saga managers the watcher lifecycle\n */\nexport default function* loginSaga() {\n // Specify the constant to watch and the saga generator function to call when one is triggered\n // It returns a task descriptor (just like a fork) so we can continue execution, and will be\n // automatically cancelled on unmount (unless the mode is set to DAEMON)\n // Specify as many yields (watchers) here as necessary\n yield takeLatest(LOGIN_REQUEST, requestLogin);\n}\n","/**\n * LoginProvider\n *\n * Usage:\n *\n * To use the default LoginForm component:\n *