| "formik": "^2.2.9", | "formik": "^2.2.9", | ||||
| "i18next": "^20.3.1", | "i18next": "^20.3.1", | ||||
| "json-server": "^0.17.0", | "json-server": "^0.17.0", | ||||
| "jsonwebtoken": "^8.5.1", | |||||
| "lodash": "^4.17.21", | "lodash": "^4.17.21", | ||||
| "lodash.isempty": "^4.4.0", | "lodash.isempty": "^4.4.0", | ||||
| "owasp-password-strength-test": "^1.3.0", | "owasp-password-strength-test": "^1.3.0", | ||||
| "react": "^17.0.2", | |||||
| "react-dom": "^17.0.2", | |||||
| "react": "^18.2.0", | |||||
| "react-dom": "^18.2.0", | |||||
| "react-helmet-async": "^1.0.9", | "react-helmet-async": "^1.0.9", | ||||
| "react-i18next": "^11.10.0", | "react-i18next": "^11.10.0", | ||||
| "react-jwt": "^1.1.7", | |||||
| "react-redux": "^7.2.4", | "react-redux": "^7.2.4", | ||||
| "react-router-dom": "^5.2.0", | "react-router-dom": "^5.2.0", | ||||
| "react-scripts": "4.0.3", | |||||
| "react-scripts": "^5.0.1", | |||||
| "react-select": "^4.3.1", | "react-select": "^4.3.1", | ||||
| "redux": "^4.1.0", | "redux": "^4.1.0", | ||||
| "redux-saga": "^1.1.3", | "redux-saga": "^1.1.3", |
| import React from 'react'; | import React from 'react'; | ||||
| import ReactDOM from 'react-dom'; | |||||
| import {createRoot} from 'react-dom/client'; | |||||
| import { Provider } from 'react-redux'; | import { Provider } from 'react-redux'; | ||||
| import { HelmetProvider } from 'react-helmet-async'; | import { HelmetProvider } from 'react-helmet-async'; | ||||
| import './i18n'; | import './i18n'; | ||||
| import ColorModeProvider from './context/ColorModeContext'; | import ColorModeProvider from './context/ColorModeContext'; | ||||
| ReactDOM.render( | |||||
| const rootElement = document.getElementById('root'); | |||||
| const root = createRoot(rootElement); | |||||
| root.render( | |||||
| <HelmetProvider> | <HelmetProvider> | ||||
| <React.StrictMode> | <React.StrictMode> | ||||
| <Provider store={store}> | <Provider store={store}> | ||||
| </ColorModeProvider> | </ColorModeProvider> | ||||
| </Provider> | </Provider> | ||||
| </React.StrictMode> | </React.StrictMode> | ||||
| </HelmetProvider>, | |||||
| document.getElementById('root'), | |||||
| </HelmetProvider> | |||||
| ); | ); |
| import React from 'react'; | import React from 'react'; | ||||
| import PropTypes from 'prop-types'; | |||||
| import { useTranslation } from 'react-i18next'; | import { useTranslation } from 'react-i18next'; | ||||
| import Button from '../../components/Button/Button'; | import Button from '../../components/Button/Button'; | ||||
| import Section from '../../components/Section/Section'; | import Section from '../../components/Section/Section'; | ||||
| import { HOME_PAGE } from '../../constants/pages'; | |||||
| const NotFoundPage = () => { | |||||
| const NotFoundPage = ({history}) => { | |||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| return ( | return ( | ||||
| <h1 className="c-error-page__title">404</h1> | <h1 className="c-error-page__title">404</h1> | ||||
| <p className="c-error-page__text">{t('notFound.text')}</p> | <p className="c-error-page__text">{t('notFound.text')}</p> | ||||
| <Button | <Button | ||||
| onClick={() => history.push({ | |||||
| pathname: HOME_PAGE, | |||||
| state: { | |||||
| from: history.location.pathname, | |||||
| }, | |||||
| })} | |||||
| className="c-error-page__button" | className="c-error-page__button" | ||||
| variant="primary-outlined" | variant="primary-outlined" | ||||
| > | > | ||||
| ); | ); | ||||
| }; | }; | ||||
| NotFoundPage.propTypes = {}; | |||||
| NotFoundPage.propTypes = { | |||||
| history: PropTypes.shape({ | |||||
| replace: PropTypes.func, | |||||
| push: PropTypes.func, | |||||
| location: PropTypes.shape({ | |||||
| pathname: PropTypes.string, | |||||
| }), | |||||
| }), | |||||
| }; | |||||
| export default NotFoundPage; | export default NotFoundPage; |
| import { all, call, put, takeLatest } from '@redux-saga/core/effects'; | import { all, call, put, takeLatest } from '@redux-saga/core/effects'; | ||||
| import jwt from 'jsonwebtoken'; | |||||
| import { decodeToken } from 'react-jwt'; | |||||
| import history from '../utils/history'; | import history from '../utils/history'; | ||||
| import { | import { | ||||
| AUTHENTICATE_USER, | AUTHENTICATE_USER, | ||||
| try { | try { | ||||
| const { data } = yield call(attemptLogin, payload); | const { data } = yield call(attemptLogin, payload); | ||||
| if (data.JwtToken) { | if (data.JwtToken) { | ||||
| const user = jwt.decode(data.JwtToken); | |||||
| const user = decodeToken(data.JwtToken); | |||||
| yield call(authScopeSetHelper, JWT_TOKEN, data.JwtToken); | yield call(authScopeSetHelper, JWT_TOKEN, data.JwtToken); | ||||
| yield call(authScopeSetHelper, JWT_REFRESH_TOKEN, data.JwtRefreshToken); | yield call(authScopeSetHelper, JWT_REFRESH_TOKEN, data.JwtRefreshToken); | ||||
| yield call(authScopeSetHelper, REFRESH_TOKEN_CONST, data.RefreshToken); | yield call(authScopeSetHelper, REFRESH_TOKEN_CONST, data.RefreshToken); | ||||
| function* logoutUser() { | function* logoutUser() { | ||||
| try { | try { | ||||
| const JwtToken = yield call(authScopeStringGetHelper, JWT_TOKEN); | const JwtToken = yield call(authScopeStringGetHelper, JWT_TOKEN); | ||||
| const user = jwt.decode(JwtToken); | |||||
| const user = decodeToken(JwtToken); | |||||
| if (user) { | if (user) { | ||||
| yield call(logoutUserRequest, user.UserUid); | yield call(logoutUserRequest, user.UserUid); | ||||
| } | } | ||||
| yield call(authScopeSetHelper, JWT_TOKEN, data.JwtToken); | yield call(authScopeSetHelper, JWT_TOKEN, data.JwtToken); | ||||
| yield call(authScopeSetHelper, JWT_REFRESH_TOKEN, data.JwtRefreshToken); | yield call(authScopeSetHelper, JWT_REFRESH_TOKEN, data.JwtRefreshToken); | ||||
| const user = jwt.decode(data.JwtToken); | |||||
| const user = decodeToken(data.JwtToken); | |||||
| addHeaderToken(data.JwtToken); | addHeaderToken(data.JwtToken); | ||||
| yield put(setUser(user)); | yield put(setUser(user)); | ||||
| yield put(updateUserToken(data.JwtToken)); | yield put(updateUserToken(data.JwtToken)); | ||||
| sessionStorage.setItem(REGISTRATION_USER_UID, payload.accountUid); | sessionStorage.setItem(REGISTRATION_USER_UID, payload.accountUid); | ||||
| } | } | ||||
| const user = jwt.decode(data.JwtToken); | |||||
| const user = decodeToken(data.JwtToken); | |||||
| addHeaderToken(data.JwtToken); | addHeaderToken(data.JwtToken); | ||||
| if (user) { | if (user) { | ||||
| yield put(setUser(user)); | yield put(setUser(user)); |