Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

loginSaga.js 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import { all, call, put, takeLatest } from '@redux-saga/core/effects';
  2. import { decodeToken } from 'react-jwt';
  3. import history from '../utils/history';
  4. import {
  5. AUTHENTICATE_USER,
  6. LOGIN_USER_FETCH,
  7. LOGOUT_USER,
  8. REFRESH_TOKEN,
  9. GENERATE_TOKEN,
  10. } from '../actions/login/loginActionConstants';
  11. import {
  12. attemptLogin,
  13. logoutUserRequest,
  14. refreshTokenRequest,
  15. generateTokenRequest,
  16. } from '../../request/loginRequest';
  17. import {
  18. fetchUserError,
  19. fetchUserSuccess,
  20. resetLoginState,
  21. updateUserToken,
  22. } from '../actions/login/loginActions';
  23. import { LOGIN_PAGE } from '../../constants/pages';
  24. import { setUser } from '../actions/user/userActions';
  25. import {
  26. addHeaderToken,
  27. removeHeaderToken,
  28. } from '../../request';
  29. import {
  30. IMPERSONATE_USER_UID,
  31. REGISTRATION_USER_UID,
  32. } from '../../constants/sessionStorage';
  33. import {
  34. JWT_REFRESH_TOKEN,
  35. JWT_TOKEN,
  36. REFRESH_TOKEN_CONST,
  37. } from '../../constants/localStorage';
  38. import {
  39. authScopeClearHelper,
  40. authScopeStringGetHelper,
  41. authScopeRemoveHelper,
  42. authScopeSetHelper,
  43. } from '../../util/helpers/authScopeHelpers';
  44. import { rejectErrorCodeHelper } from '../../util/helpers/rejectErrorCodeHelper';
  45. function* fetchUser({ payload }) {
  46. try {
  47. const { data } = yield call(attemptLogin, payload);
  48. if (data.JwtToken) {
  49. const user = decodeToken(data.JwtToken);
  50. yield call(authScopeSetHelper, JWT_TOKEN, data.JwtToken);
  51. yield call(authScopeSetHelper, JWT_REFRESH_TOKEN, data.JwtRefreshToken);
  52. yield call(authScopeSetHelper, REFRESH_TOKEN_CONST, data.RefreshToken);
  53. yield call(addHeaderToken, data.JwtToken);
  54. yield put(setUser(user));
  55. }
  56. yield put(fetchUserSuccess(data));
  57. if (payload.handleApiResponseSuccess) {
  58. yield call(payload.handleApiResponseSuccess);
  59. }
  60. } catch (e) {
  61. if (e.response && e.response.data) {
  62. if (payload.handleApiResponseSuccess) {
  63. yield call(payload.handleApiResponseSuccess);
  64. }
  65. const errorMessage = yield call(rejectErrorCodeHelper, e);
  66. yield put(fetchUserError(errorMessage));
  67. }
  68. }
  69. }
  70. function* authenticateUser() {
  71. try {
  72. const JwtToken = yield call(authScopeStringGetHelper, JWT_TOKEN);
  73. if (!JwtToken) {
  74. yield call(history.push, LOGIN_PAGE);
  75. }
  76. return yield put(
  77. fetchUserSuccess({
  78. JwtToken,
  79. }),
  80. );
  81. } catch (error) {
  82. const errorMessage = yield call(rejectErrorCodeHelper, error);
  83. yield put(fetchUserError(errorMessage));
  84. yield call(authScopeRemoveHelper, JWT_TOKEN);
  85. yield call(authScopeRemoveHelper, JWT_REFRESH_TOKEN);
  86. yield call(authScopeRemoveHelper, REFRESH_TOKEN_CONST);
  87. }
  88. }
  89. function* logoutUser() {
  90. try {
  91. const JwtToken = yield call(authScopeStringGetHelper, JWT_TOKEN);
  92. const user = decodeToken(JwtToken);
  93. if (user) {
  94. yield call(logoutUserRequest, user.UserUid);
  95. }
  96. } catch (error) {
  97. console.log(error); // eslint-disable-line
  98. } finally {
  99. yield call(authScopeClearHelper);
  100. yield call(removeHeaderToken);
  101. yield put(resetLoginState());
  102. yield call(history.replace, LOGIN_PAGE);
  103. }
  104. }
  105. export function* refreshToken() {
  106. try {
  107. const JwtToken = yield call(authScopeStringGetHelper, JWT_TOKEN);
  108. const JwtRefreshToken = yield call(
  109. authScopeStringGetHelper,
  110. JWT_REFRESH_TOKEN,
  111. );
  112. if (JwtToken && JwtRefreshToken) {
  113. const { data } = yield call(refreshTokenRequest, {
  114. JwtRefreshToken,
  115. JwtToken,
  116. });
  117. yield call(authScopeSetHelper, JWT_TOKEN, data.JwtToken);
  118. yield call(authScopeSetHelper, JWT_REFRESH_TOKEN, data.JwtRefreshToken);
  119. const user = decodeToken(data.JwtToken);
  120. addHeaderToken(data.JwtToken);
  121. yield put(setUser(user));
  122. yield put(updateUserToken(data.JwtToken));
  123. }
  124. } catch (error) {
  125. yield call(logoutUser);
  126. console.log(error); // eslint-disable-line
  127. }
  128. }
  129. export function* generateToken({ payload }) {
  130. try {
  131. const { data } = yield call(generateTokenRequest, payload.data);
  132. const { JwtToken, JwtRefreshToken } = data;
  133. if (JwtToken && JwtRefreshToken) {
  134. yield call(authScopeSetHelper, JWT_TOKEN, data.JwtToken);
  135. yield call(authScopeSetHelper, JWT_REFRESH_TOKEN, data.JwtRefreshToken);
  136. if (payload.impersonate) {
  137. sessionStorage.setItem(IMPERSONATE_USER_UID, payload.accountUid);
  138. }
  139. if (payload.registration) {
  140. sessionStorage.setItem(REGISTRATION_USER_UID, payload.accountUid);
  141. }
  142. const user = decodeToken(data.JwtToken);
  143. addHeaderToken(data.JwtToken);
  144. if (user) {
  145. yield put(setUser(user));
  146. }
  147. yield put(updateUserToken(data.JwtToken));
  148. if (payload.onSuccess) {
  149. yield call(payload.onSuccess);
  150. }
  151. }
  152. } catch (error) {
  153. yield call(logoutUser);
  154. console.log(error); // eslint-disable-line
  155. }
  156. }
  157. export default function* loginSaga() {
  158. yield all([
  159. takeLatest(LOGIN_USER_FETCH, fetchUser),
  160. takeLatest(AUTHENTICATE_USER, authenticateUser),
  161. takeLatest(LOGOUT_USER, logoutUser),
  162. takeLatest(REFRESH_TOKEN, refreshToken),
  163. takeLatest(GENERATE_TOKEN, generateToken),
  164. ]);
  165. }