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);
}