2022-04-26 18:01:55 +05:00
|
|
|
import { call, fork, join, put, take } from 'redux-saga/effects';
|
2021-06-24 01:05:22 +05:00
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
import actions from '../../actions';
|
2022-08-09 18:03:21 +02:00
|
|
|
import { getAccessToken } from '../../utils/access-token-storage';
|
2021-06-24 01:05:22 +05:00
|
|
|
import ErrorCodes from '../../constants/ErrorCodes';
|
|
|
|
|
|
|
|
|
|
let lastRequestTask;
|
|
|
|
|
|
|
|
|
|
function* queueRequest(method, ...args) {
|
|
|
|
|
if (lastRequestTask) {
|
|
|
|
|
try {
|
|
|
|
|
yield join(lastRequestTask);
|
|
|
|
|
} catch {} // eslint-disable-line no-empty
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-09 18:03:21 +02:00
|
|
|
const accessToken = yield call(getAccessToken);
|
|
|
|
|
|
2021-06-24 01:05:22 +05:00
|
|
|
try {
|
2022-08-09 18:03:21 +02:00
|
|
|
return yield call(method, ...args, {
|
|
|
|
|
Authorization: `Bearer ${accessToken}`,
|
|
|
|
|
});
|
2021-06-24 01:05:22 +05:00
|
|
|
} catch (error) {
|
|
|
|
|
if (error.code === ErrorCodes.UNAUTHORIZED) {
|
2022-08-04 13:31:14 +02:00
|
|
|
yield put(actions.logout()); // TODO: next url
|
2021-06-24 01:05:22 +05:00
|
|
|
yield take();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
throw error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default function* request(method, ...args) {
|
|
|
|
|
lastRequestTask = yield fork(queueRequest, method, ...args);
|
|
|
|
|
|
|
|
|
|
return yield join(lastRequestTask);
|
|
|
|
|
}
|