You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

loginSaga.js 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { all, call, put, takeLatest } from "@redux-saga/core/effects";
  2. import jwt_decode from "jwt-decode";
  3. import {
  4. LOGIN_USER_FETCH,
  5. LOGOUT_USER,
  6. REFRESH_TOKEN,
  7. } from "../actions/login/loginActionConstants";
  8. import { attemptLogin, logoutUserRequest } from "@request/loginRequest";
  9. import {
  10. fetchUserError,
  11. fetchUserSuccess,
  12. resetLoginState,
  13. } from "../actions/login/loginActions";
  14. import { resetUserState, setUser } from "../actions/user/userActions";
  15. import { addHeaderToken, removeHeaderToken } from "../../request";
  16. import {
  17. JWT_REFRESH_TOKEN,
  18. JWT_TOKEN,
  19. } from "@constants/localStorage";
  20. import { storeData, getData, removeData } from "@service/asyncStorage";
  21. import { rejectErrorCodeHelper } from "@utils/rejectErrorMessageHelper";
  22. function* fetchUser({ payload }) {
  23. try {
  24. const { data } = yield call(attemptLogin, payload);
  25. if (data?.jwt) {
  26. const user = data?.user;
  27. yield call(storeData, JWT_TOKEN, data.jwt);
  28. yield call(storeData, JWT_REFRESH_TOKEN, data?.refreshToken);
  29. yield call(addHeaderToken, data?.jwt);
  30. yield put(setUser(user));
  31. }
  32. yield put(fetchUserSuccess(data));
  33. } catch (e) {
  34. if (e.response && e.response.data) {
  35. const errorMessage = yield call(rejectErrorCodeHelper, e);
  36. yield put(fetchUserError(errorMessage));
  37. }
  38. }
  39. }
  40. function* logoutUser() {
  41. try {
  42. const token = yield call(getData, JWT_REFRESH_TOKEN);
  43. const user = yield call(jwt_decode, token);
  44. if (user) {
  45. yield call(logoutUserRequest);
  46. }
  47. } catch (error) {
  48. console.log(error); // eslint-disable-line
  49. } finally {
  50. yield call(removeHeaderToken);
  51. yield call(removeData, JWT_REFRESH_TOKEN)
  52. yield call(removeData, JWT_TOKEN);
  53. yield put(resetLoginState());
  54. yield put(resetUserState());
  55. }
  56. }
  57. export function* refreshToken({ payload }) {
  58. try {
  59. const newTokenDecoded = jwt_decode(payload.jwt);
  60. yield call(storeData, JWT_TOKEN, payload.jwt);
  61. yield call(storeData, JWT_REFRESH_TOKEN, payload.refreshToken);
  62. addHeaderToken(payload.jwt);
  63. yield put(setUser(newTokenDecoded));
  64. yield put(fetchUserSuccess(payload));
  65. return true;
  66. } catch (error) {
  67. console.log(error); // eslint-disable-line
  68. return false;
  69. }
  70. }
  71. export default function* loginSaga() {
  72. yield all([
  73. takeLatest(LOGIN_USER_FETCH, fetchUser),
  74. takeLatest(LOGOUT_USER, logoutUser),
  75. takeLatest(REFRESH_TOKEN, refreshToken),
  76. ]);
  77. }