sagas/auth.js

import { takeEvery, put, call } from 'redux-saga/effects';

import { requestPost, requestGet } from '../utils/request';
import { PAGES, API_URLS, MODALS } from '../constants';
import { aLoginError, aLoginSuccess, aLogoutSuccess, aSetIsLoading, aSetOpenModal } from '../reducers/common';
import { aLogin, aLogout } from '../reducers/actions';

/**
 * @namespace sagas/auth
 */
/**
 * @memberof sagas/auth
 * @typedef User
 * @type {object}
 * @property {Array} permissions
 * @property {boolean} requireNewPassword
 * @property {Array} roles
 * @property {number} userId
 * @property {string} username
 */
/**
 * @memberof sagas/auth
 * @typedef login/response.data
 * @type {object}
 * @property {User} user
 * @property {string} sessionId
 */
/**
 * @memberof sagas/auth
 * @async
 * @param {object} action
 */
function* login(action) {
  let response;
  try {
    yield put(
      aSetIsLoading({
        isLoading: true,
      })
    );
    response = yield call(
      requestPost,
      API_URLS.LOGIN,
      {
        username: action.payload.username,
        password: action.payload.password,
        deviceId: action.payload.deviceId,
      },
      false
    );
    if (response.status === -1) {
      yield put(
        aLoginError({
          loginError: response.error.message,
        })
      );
    } else {
      yield put(
        aLoginSuccess({
          user: response.data.user,
        })
      );
      action.payload.navigate(PAGES.HOME);
    }
    yield put(
      aSetIsLoading({
        isLoading: false,
      })
    );
  } catch (error) {
    if (!error.modal) {
      yield put(
        aSetOpenModal({
          modal: MODALS.GENERAL_ERROR,
          errorMessage: MODALS.GENERAL_ERROR,
        })
      );
    }
  }
}

/**
 * @memberof sagas/auth
 * @async
 * @param {object} action
 * @property {object} action
 * @property {boolean} action.payload Call api or not
 */
function* logout(action) {
  try {
    if (action.payload.callAPI) {
      yield call(requestGet, API_URLS.LOGOUT, false);
    }
  } finally {
    yield put(aLogoutSuccess());
    action.payload.navigate(PAGES.LOGIN);
  }
}

/**
 * @memberof sagas/auth
 * @async
 * @returns {void}
 */
export default function* authSaga() {
  yield takeEvery(aLogin, login);
  yield takeEvery(aLogout, logout);
}